Mirror: TypeScript LSP plugin that finds GraphQL documents in your code and provides diagnostics, auto-complete and hover-information.

chore(workspace): upgrade ts (#136)

* ts v5

* update fragmetn tests

* tests

* last fixes

* fixes

* add changeset

Changed files
+86 -134
.changeset
packages
example
example-external-generator
graphqlsp
test
+5
.changeset/big-paws-pump.md
···
···
+
---
+
'@0no-co/graphqlsp': patch
+
---
+
+
Upgrade TypeScript dependency, this would normally not result in a changeset but it had us remove the normal auto-complete and quick-info and only do that logic when ours ends up in no results
+1 -1
package.json
···
"lint-staged": "^15.0.0",
"prettier": "^2.8.7",
"rollup": "^3.20.2",
-
"typescript": "^5.0.0",
"vitest": "^0.34.6"
}
}
···
"lint-staged": "^15.0.0",
"prettier": "^2.8.7",
"rollup": "^3.20.2",
+
"typescript": "^5.3.3",
"vitest": "^0.34.6"
}
}
+1 -1
packages/example-external-generator/package.json
···
"@graphql-codegen/cli": "^5.0.0",
"@graphql-codegen/client-preset": "^4.1.0",
"ts-node": "^10.9.1",
-
"typescript": "^5.0.4"
}
}
···
"@graphql-codegen/cli": "^5.0.0",
"@graphql-codegen/client-preset": "^4.1.0",
"ts-node": "^10.9.1",
+
"typescript": "^5.3.3"
}
}
+1 -1
packages/example/package.json
···
"@graphql-typed-document-node/core": "^3.2.0"
},
"devDependencies": {
-
"typescript": "^5.0.0",
"@0no-co/graphqlsp": "file:../graphqlsp"
}
}
···
"@graphql-typed-document-node/core": "^3.2.0"
},
"devDependencies": {
+
"typescript": "^5.3.3",
"@0no-co/graphqlsp": "file:../graphqlsp"
}
}
+1 -1
packages/graphqlsp/package.json
···
"@types/node": "^18.15.11",
"@types/node-fetch": "^2.6.3",
"graphql": "^16.8.1",
-
"typescript": "^5.0.0"
},
"dependencies": {
"@graphql-codegen/add": "^5.0.0",
···
"@types/node": "^18.15.11",
"@types/node-fetch": "^2.6.3",
"graphql": "^16.8.1",
+
"typescript": "^5.3.3"
},
"dependencies": {
"@graphql-codegen/add": "^5.0.0",
+17 -20
packages/graphqlsp/src/index.ts
···
info
);
-
const originalCompletions = info.languageService.getCompletionsAtPosition(
-
filename,
-
cursorPosition,
-
options
-
) || {
-
isGlobalCompletion: false,
-
isMemberCompletion: false,
-
isNewIdentifierLocation: false,
-
entries: [],
-
};
-
-
if (completions) {
-
return {
-
...completions,
-
entries: [...completions.entries, ...originalCompletions.entries],
-
};
} else {
-
return originalCompletions;
}
};
···
info
);
-
const originalInfo = info.languageService.getQuickInfoAtPosition(
filename,
cursorPosition
);
-
-
return quickInfo || originalInfo;
};
logger('proxy: ' + JSON.stringify(proxy));
···
info
);
+
if (completions && completions.entries.length) {
+
return completions;
} else {
+
return (
+
info.languageService.getCompletionsAtPosition(
+
filename,
+
cursorPosition,
+
options
+
) || {
+
isGlobalCompletion: false,
+
isMemberCompletion: false,
+
isNewIdentifierLocation: false,
+
entries: [],
+
}
+
);
}
};
···
info
);
+
if (quickInfo) return quickInfo;
+
+
return info.languageService.getQuickInfoAtPosition(
filename,
cursorPosition
);
};
logger('proxy: ' + JSON.stringify(proxy));
+29 -29
pnpm-lock.yaml
···
version: 0.4.4(rollup@3.20.2)
'@rollup/plugin-typescript':
specifier: ^11.1.5
-
version: 11.1.5(rollup@3.20.2)(typescript@5.0.4)
'@types/node':
specifier: ^18.15.11
version: 18.15.11
···
specifier: ^3.20.2
version: 3.20.2
typescript:
-
specifier: ^5.0.0
-
version: 5.0.4
vitest:
specifier: ^0.34.6
version: 0.34.6
···
specifier: file:../graphqlsp
version: file:packages/graphqlsp(graphql@16.8.1)
typescript:
-
specifier: ^5.0.0
-
version: 5.0.4
packages/example-external-generator:
dependencies:
···
version: file:packages/graphqlsp(graphql@16.8.1)
'@graphql-codegen/cli':
specifier: ^5.0.0
-
version: 5.0.0(@types/node@18.15.11)(graphql@16.8.1)(typescript@5.0.4)
'@graphql-codegen/client-preset':
specifier: ^4.1.0
version: 4.1.0(graphql@16.8.1)
ts-node:
specifier: ^10.9.1
-
version: 10.9.1(@types/node@18.15.11)(typescript@5.0.4)
typescript:
-
specifier: ^5.0.4
-
version: 5.0.4
packages/graphqlsp:
dependencies:
···
specifier: ^16.8.1
version: 16.8.1
typescript:
-
specifier: ^5.0.0
-
version: 5.0.4
test/e2e/fixture-project:
dependencies:
···
version: 4.0.4(graphql@16.8.1)
devDependencies:
typescript:
-
specifier: ^5.0.4
-
version: 5.0.4
test/e2e/fixture-project-client-preset:
dependencies:
···
version: 16.8.1
devDependencies:
typescript:
-
specifier: ^5.0.4
-
version: 5.0.4
packages:
···
graphql: 16.8.1
tslib: 2.5.0
-
/@graphql-codegen/cli@5.0.0(@types/node@18.15.11)(graphql@16.8.1)(typescript@5.0.4):
resolution: {integrity: sha512-A7J7+be/a6e+/ul2KI5sfJlpoqeqwX8EzktaKCeduyVKgOLA6W5t+NUGf6QumBDXU8PEOqXk3o3F+RAwCWOiqA==}
hasBin: true
peerDependencies:
···
'@graphql-tools/utils': 10.0.1(graphql@16.8.1)
'@whatwg-node/fetch': 0.8.8
chalk: 4.1.2
-
cosmiconfig: 8.3.6(typescript@5.0.4)
debounce: 1.2.1
detect-indent: 6.1.0
graphql: 16.8.1
-
graphql-config: 5.0.3(@types/node@18.15.11)(graphql@16.8.1)(typescript@5.0.4)
inquirer: 8.2.6
is-glob: 4.0.3
jiti: 1.21.0
···
terser: 5.22.0
dev: true
-
/@rollup/plugin-typescript@11.1.5(rollup@3.20.2)(typescript@5.0.4):
resolution: {integrity: sha512-rnMHrGBB0IUEv69Q8/JGRD/n4/n6b3nfpufUu26axhUcboUzv/twfZU8fIBbTOphRAe0v8EyxzeDpKXqGHfyDA==}
engines: {node: '>=14.0.0'}
peerDependencies:
···
'@rollup/pluginutils': 5.0.2(rollup@3.20.2)
resolve: 1.22.2
rollup: 3.20.2
-
typescript: 5.0.4
dev: true
/@rollup/pluginutils@5.0.2(rollup@3.20.2):
···
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
dev: true
-
/cosmiconfig@8.3.6(typescript@5.0.4):
resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
engines: {node: '>=14'}
peerDependencies:
···
js-yaml: 4.1.0
parse-json: 5.2.0
path-type: 4.0.0
-
typescript: 5.0.4
dev: true
/create-require@1.1.1:
···
resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
dev: true
-
/graphql-config@5.0.3(@types/node@18.15.11)(graphql@16.8.1)(typescript@5.0.4):
resolution: {integrity: sha512-BNGZaoxIBkv9yy6Y7omvsaBUHOzfFcII3UN++tpH8MGOKFPFkCPZuwx09ggANMt8FgyWP1Od8SWPmrUEZca4NQ==}
engines: {node: '>= 16.0.0'}
peerDependencies:
···
'@graphql-tools/merge': 9.0.0(graphql@16.8.1)
'@graphql-tools/url-loader': 8.0.0(@types/node@18.15.11)(graphql@16.8.1)
'@graphql-tools/utils': 10.0.1(graphql@16.8.1)
-
cosmiconfig: 8.3.6(typescript@5.0.4)
graphql: 16.8.1
jiti: 1.21.0
minimatch: 4.2.3
···
resolution: {integrity: sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA==}
dev: true
-
/ts-node@10.9.1(@types/node@18.15.11)(typescript@5.0.4):
resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
hasBin: true
peerDependencies:
···
create-require: 1.1.1
diff: 4.0.2
make-error: 1.3.6
-
typescript: 5.0.4
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
dev: true
···
is-typed-array: 1.1.10
dev: true
-
/typescript@5.0.4:
-
resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==}
-
engines: {node: '>=12.20'}
hasBin: true
dev: true
···
version: 0.4.4(rollup@3.20.2)
'@rollup/plugin-typescript':
specifier: ^11.1.5
+
version: 11.1.5(rollup@3.20.2)(typescript@5.3.3)
'@types/node':
specifier: ^18.15.11
version: 18.15.11
···
specifier: ^3.20.2
version: 3.20.2
typescript:
+
specifier: ^5.3.3
+
version: 5.3.3
vitest:
specifier: ^0.34.6
version: 0.34.6
···
specifier: file:../graphqlsp
version: file:packages/graphqlsp(graphql@16.8.1)
typescript:
+
specifier: ^5.3.3
+
version: 5.3.3
packages/example-external-generator:
dependencies:
···
version: file:packages/graphqlsp(graphql@16.8.1)
'@graphql-codegen/cli':
specifier: ^5.0.0
+
version: 5.0.0(@types/node@18.15.11)(graphql@16.8.1)(typescript@5.3.3)
'@graphql-codegen/client-preset':
specifier: ^4.1.0
version: 4.1.0(graphql@16.8.1)
ts-node:
specifier: ^10.9.1
+
version: 10.9.1(@types/node@18.15.11)(typescript@5.3.3)
typescript:
+
specifier: ^5.3.3
+
version: 5.3.3
packages/graphqlsp:
dependencies:
···
specifier: ^16.8.1
version: 16.8.1
typescript:
+
specifier: ^5.3.3
+
version: 5.3.3
test/e2e/fixture-project:
dependencies:
···
version: 4.0.4(graphql@16.8.1)
devDependencies:
typescript:
+
specifier: ^5.3.3
+
version: 5.3.3
test/e2e/fixture-project-client-preset:
dependencies:
···
version: 16.8.1
devDependencies:
typescript:
+
specifier: ^5.3.3
+
version: 5.3.3
packages:
···
graphql: 16.8.1
tslib: 2.5.0
+
/@graphql-codegen/cli@5.0.0(@types/node@18.15.11)(graphql@16.8.1)(typescript@5.3.3):
resolution: {integrity: sha512-A7J7+be/a6e+/ul2KI5sfJlpoqeqwX8EzktaKCeduyVKgOLA6W5t+NUGf6QumBDXU8PEOqXk3o3F+RAwCWOiqA==}
hasBin: true
peerDependencies:
···
'@graphql-tools/utils': 10.0.1(graphql@16.8.1)
'@whatwg-node/fetch': 0.8.8
chalk: 4.1.2
+
cosmiconfig: 8.3.6(typescript@5.3.3)
debounce: 1.2.1
detect-indent: 6.1.0
graphql: 16.8.1
+
graphql-config: 5.0.3(@types/node@18.15.11)(graphql@16.8.1)(typescript@5.3.3)
inquirer: 8.2.6
is-glob: 4.0.3
jiti: 1.21.0
···
terser: 5.22.0
dev: true
+
/@rollup/plugin-typescript@11.1.5(rollup@3.20.2)(typescript@5.3.3):
resolution: {integrity: sha512-rnMHrGBB0IUEv69Q8/JGRD/n4/n6b3nfpufUu26axhUcboUzv/twfZU8fIBbTOphRAe0v8EyxzeDpKXqGHfyDA==}
engines: {node: '>=14.0.0'}
peerDependencies:
···
'@rollup/pluginutils': 5.0.2(rollup@3.20.2)
resolve: 1.22.2
rollup: 3.20.2
+
typescript: 5.3.3
dev: true
/@rollup/pluginutils@5.0.2(rollup@3.20.2):
···
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
dev: true
+
/cosmiconfig@8.3.6(typescript@5.3.3):
resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
engines: {node: '>=14'}
peerDependencies:
···
js-yaml: 4.1.0
parse-json: 5.2.0
path-type: 4.0.0
+
typescript: 5.3.3
dev: true
/create-require@1.1.1:
···
resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
dev: true
+
/graphql-config@5.0.3(@types/node@18.15.11)(graphql@16.8.1)(typescript@5.3.3):
resolution: {integrity: sha512-BNGZaoxIBkv9yy6Y7omvsaBUHOzfFcII3UN++tpH8MGOKFPFkCPZuwx09ggANMt8FgyWP1Od8SWPmrUEZca4NQ==}
engines: {node: '>= 16.0.0'}
peerDependencies:
···
'@graphql-tools/merge': 9.0.0(graphql@16.8.1)
'@graphql-tools/url-loader': 8.0.0(@types/node@18.15.11)(graphql@16.8.1)
'@graphql-tools/utils': 10.0.1(graphql@16.8.1)
+
cosmiconfig: 8.3.6(typescript@5.3.3)
graphql: 16.8.1
jiti: 1.21.0
minimatch: 4.2.3
···
resolution: {integrity: sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA==}
dev: true
+
/ts-node@10.9.1(@types/node@18.15.11)(typescript@5.3.3):
resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
hasBin: true
peerDependencies:
···
create-require: 1.1.1
diff: 4.0.2
make-error: 1.3.6
+
typescript: 5.3.3
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
dev: true
···
is-typed-array: 1.1.10
dev: true
+
/typescript@5.3.3:
+
resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==}
+
engines: {node: '>=14.17'}
hasBin: true
dev: true
-55
test/e2e/client-preset.test.ts
···
"name": "__typename",
"sortText": "14__typename",
},
-
{
-
"kind": "string",
-
"kindModifiers": "",
-
"name": "
-
fragment pokemonFields on Pokemon {
-
id
-
name
-
attacks {
-
fast {
-
damage
-
name
-
}
-
}
-
}
-
",
-
"replacementSpan": {
-
"end": {
-
"line": 10,
-
"offset": 1,
-
},
-
"start": {
-
"line": 3,
-
"offset": 39,
-
},
-
},
-
"sortText": "11",
-
},
-
{
-
"kind": "string",
-
"kindModifiers": "",
-
"name": "
-
query Pok($limit: Int!) {
-
pokemons(limit: $limit) {
-
id
-
name
-
fleeRate
-
classification
-
...pokemonFields
-
...weaknessFields
-
__typename
-
}
-
}
-
",
-
"replacementSpan": {
-
"end": {
-
"line": 10,
-
"offset": 1,
-
},
-
"start": {
-
"line": 3,
-
"offset": 39,
-
},
-
},
-
"sortText": "11",
-
},
]
`);
}, 30000);
···
"name": "__typename",
"sortText": "14__typename",
},
]
`);
}, 30000);
+1 -1
test/e2e/fixture-project-client-preset/package.json
···
"@urql/core": "^4.0.4"
},
"devDependencies": {
-
"typescript": "^5.0.4"
}
}
···
"@urql/core": "^4.0.4"
},
"devDependencies": {
+
"typescript": "^5.3.3"
}
}
+1 -1
test/e2e/fixture-project/package.json
···
"@urql/core": "^4.0.4"
},
"devDependencies": {
-
"typescript": "^5.0.4"
}
}
···
"@urql/core": "^4.0.4"
},
"devDependencies": {
+
"typescript": "^5.3.3"
}
}
+21 -16
test/e2e/fragments.test.ts
···
tmpfile: outFilePost,
} satisfies ts.server.protocol.SavetoRequestArgs);
server.sendCommand('saveto', {
file: outFilePosts,
tmpfile: outFilePosts,
···
'export const PostsListDocument = '
);
expect(generatedPostsFileContents).toContain(
-
'import * as Types from "./__generated__/baseGraphQLSP"'
-
);
-
});
-
-
await waitForExpect(() => {
-
expect(fs.readFileSync(outFilePost, 'utf-8')).toContain(
-
`as typeof import('./Post.generated').PostFieldsFragmentDoc`
-
);
-
});
-
-
await waitForExpect(() => {
-
const generatedPostFileContents = fs.readFileSync(genFilePost, 'utf-8');
-
expect(generatedPostFileContents).toContain(
-
'export const PostFieldsFragmentDoc = '
-
);
-
expect(generatedPostFileContents).toContain(
'import * as Types from "./__generated__/baseGraphQLSP"'
);
});
···
tmpfile: outFilePost,
} satisfies ts.server.protocol.SavetoRequestArgs);
+
await waitForExpect(() => {
+
expect(fs.readFileSync(outFilePost, 'utf-8')).toContain(
+
`as typeof import('./Post.generated').PostFieldsFragmentDoc`
+
);
+
});
+
+
await waitForExpect(() => {
+
const generatedPostFileContents = fs.readFileSync(genFilePost, 'utf-8');
+
expect(generatedPostFileContents).toContain(
+
'export const PostFieldsFragmentDoc = '
+
);
+
expect(generatedPostFileContents).toContain(
+
'import * as Types from "./__generated__/baseGraphQLSP"'
+
);
+
});
+
+
server.sendCommand('saveto', {
+
file: outFilePosts,
+
tmpfile: outFilePosts,
+
} satisfies ts.server.protocol.SavetoRequestArgs);
+
server.sendCommand('saveto', {
file: outFilePosts,
tmpfile: outFilePosts,
···
'export const PostsListDocument = '
);
expect(generatedPostsFileContents).toContain(
'import * as Types from "./__generated__/baseGraphQLSP"'
);
});
+6 -1
test/e2e/generate-types.test.ts
···
tmpfile: outFileComplex,
} satisfies ts.server.protocol.SavetoRequestArgs);
await waitForExpect(() => {
const contents = fs.readFileSync(outFileComplex, 'utf-8');
expect(contents).toContain(` id
···
}
\` as typeof import('./rename-complex.generated').Post2FieldsFragmentDoc`);
});
-
}, 20000);
});
···
tmpfile: outFileComplex,
} satisfies ts.server.protocol.SavetoRequestArgs);
+
server.sendCommand('saveto', {
+
file: outFileComplex,
+
tmpfile: outFileComplex,
+
} satisfies ts.server.protocol.SavetoRequestArgs);
+
await waitForExpect(() => {
const contents = fs.readFileSync(outFileComplex, 'utf-8');
expect(contents).toContain(` id
···
}
\` as typeof import('./rename-complex.generated').Post2FieldsFragmentDoc`);
});
+
}, 30000);
});
+1 -6
test/e2e/server.ts
···
public projectPath: string,
public options: { debugLog?: boolean } = {}
) {
-
const tsserverPath = path.resolve(
-
projectPath,
-
'../../../node_modules/typescript/lib/tsserver.js'
-
);
-
-
fs.lstatSync(tsserverPath);
const server = fork(tsserverPath, ['--logVerbosity', 'verbose'], {
stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
···
public projectPath: string,
public options: { debugLog?: boolean } = {}
) {
+
const tsserverPath = require.resolve('typescript/lib/tsserver');
const server = fork(tsserverPath, ['--logVerbosity', 'verbose'], {
stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
+1 -1
test/e2e/util.ts
···
export const waitForExpect = async (
expectFn: () => void,
-
{ interval = 500, timeout = 15000 }: WaitForExpectOptions = {}
) => {
// @sinonjs/fake-timers injects `clock` property into setTimeout
const usesFakeTimers = 'clock' in setTimeout;
···
export const waitForExpect = async (
expectFn: () => void,
+
{ interval = 2000, timeout = 30000 }: WaitForExpectOptions = {}
) => {
// @sinonjs/fake-timers injects `clock` property into setTimeout
const usesFakeTimers = 'clock' in setTimeout;