diff --git a/package.json b/package.json index 50c70aace..1f9cc452e 100644 --- a/package.json +++ b/package.json @@ -3,17 +3,6 @@ "version": "1.4.0", "private": true, "repository": "https://github.com/typed-ember/glint", - "workspaces": { - "packages": [ - "packages/*", - "test-packages/*" - ], - "nohoist:comment": "When running extension host in test-packages/ts-plugin-test-app, we need 1. to be able to use workspace TypeScript, and 2. to use a TS Plugin specified as an npm dependency, both which require typescript and the plugin to be present within the same folder's `node_modules` directory.", - "nohoist": [ - "ts-plugin-test-app/typescript", - "ts-plugin-test-app/@glint/tsserver-plugin" - ] - }, "scripts": { "build": "tsc --build", "build:watch": "tsc --build --watch", diff --git a/packages/core/src/transform/template/rewrite-module.ts b/packages/core/src/transform/template/rewrite-module.ts index bd9f8b149..ca01a874a 100644 --- a/packages/core/src/transform/template/rewrite-module.ts +++ b/packages/core/src/transform/template/rewrite-module.ts @@ -67,7 +67,28 @@ function calculateCorrelatedSpans( ): CorrelatedSpansResult { let directives: Array = []; let errors: Array = []; - let partialSpans: Array = []; + let partialSpans: Array = [ + // HACK: We prefix every transformed TS file with these non-existent imports + // because it causes TypeScript to consider `.gts` and `.gjs` as possible + // implied extensions when extensions are omitted from import module specifiers, + // i.e. it causes `import FooComponent from './foo';` to work given a `foo.gts` file. + // + // Origin of this hack: + // https://github.com/typed-ember/glint/issues/806#issuecomment-2758616327 + // + // Note that these imports WILL generate diagnostic errors, but because they're + // mapped to zero-length source code spans, they're essentially mapped to nothing, + // and when Volar reverse-transforms the diagnostics back to the original source + // code, they'll be discarded. + { + originalFile: script, + originalStart: 0, + originalLength: 0, + insertionPoint: 0, + transformedSource: + "import __GLINT_GTS_EXTENSION_HACK__ from './__glint-non-existent.gts';\n import __GLINT_GJS_EXTENSION_HACK__ from './__glint-non-existent.gjs';\n", + }, + ]; let { ast, emitMetadata, error } = parseScript(ts, script, environment); diff --git a/packages/vscode/.vscodeignore b/packages/vscode/.vscodeignore index ceebbc989..1a23fc621 100644 --- a/packages/vscode/.vscodeignore +++ b/packages/vscode/.vscodeignore @@ -17,7 +17,7 @@ tsconfig.json tsconfig.tsbuildinfo node_modules/**/ -!node_modules/glint-tsserver-plugin-pack.js -!node_modules/glint-core-pack.js +!node_modules/glint-tsserver-plugin-pack/index.js +!node_modules/glint-core-pack/index.js scripts/ diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/Other.gts b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/Other.gts index adabdd17f..70adfd66c 100644 --- a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/Other.gts +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/Other.gts @@ -1,5 +1,7 @@ import Component from '@glimmer/component'; -import Greeting from './Greeting.gts'; +import Greeting from './Greeting'; +import Colocated from './colocated-folder'; + export interface OtherSignature { Args: { target: string }; } @@ -9,5 +11,6 @@ export default class Other extends Component { } diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/colocated-folder/index.gts b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/colocated-folder/index.gts new file mode 100644 index 000000000..da2ed4f21 --- /dev/null +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/colocated-folder/index.gts @@ -0,0 +1,13 @@ +import Component from '@glimmer/component'; + +export interface ColocatedIndexSignature { + Args: { target: string }; +} + +export default class ColocatedIndex extends Component { + private message = 'Hello'; + + +} diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/pod-layout/component.ts b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/pod-layout/component.ts deleted file mode 100644 index f7f7ed7db..000000000 --- a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/pod-layout/component.ts +++ /dev/null @@ -1,5 +0,0 @@ -import Component from '@glimmer/component'; - -export default class PodLayoutComponent extends Component { - private message = 'hello'; -} diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/pod-layout/template.hbs b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/pod-layout/template.hbs deleted file mode 100644 index 07e73bb0b..000000000 --- a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/pod-layout/template.hbs +++ /dev/null @@ -1 +0,0 @@ -{{this.message}} diff --git a/packages/vscode/package.json b/packages/vscode/package.json index 28bb0dedb..aa50ee319 100644 --- a/packages/vscode/package.json +++ b/packages/vscode/package.json @@ -2,7 +2,7 @@ "name": "glint-vscode", "displayName": "Glint", "description": "Glint language server integration for VS Code", - "version": "1.4.3", + "version": "1.4.5", "publisher": "typed-ember", "private": true, "author": "James C. Davis (https://github.com/jamescdavis)", @@ -257,6 +257,7 @@ "glob": "^10.2.4", "mocha": "^10.2.0", "reactive-vscode": "0.2.7-beta.1", + "semver": "^7.5.2", "typescript": "^5.8.2", "vscode-ext-gen": "^0.5.0" }, diff --git a/packages/vscode/scripts/build.mjs b/packages/vscode/scripts/build.mjs index b6f45c0bd..c7c9bc2a9 100644 --- a/packages/vscode/scripts/build.mjs +++ b/packages/vscode/scripts/build.mjs @@ -14,15 +14,16 @@ const ctx = await context({ bundle: true, entryPoints: { 'dist/extension': require.resolve('../lib/src/extension.js'), - 'node_modules/glint-tsserver-plugin-pack': '../tsserver-plugin/lib/typescript-server-plugin.js', - 'node_modules/glint-core-pack': '../core/lib/index.js', + 'node_modules/glint-tsserver-plugin-pack/index': + '../tsserver-plugin/lib/typescript-server-plugin.js', + 'node_modules/glint-core-pack/index': '../core/lib/index.js', }, external: ['vscode'], logLevel: 'info', minify: !debug, outdir: fileURLToPath(new URL('../', import.meta.url)), platform: 'node', - sourcemap: debug, + sourcemap: false, target: 'node16', // Since we're generating CJS, we need to replace any ESM import.meta.url with `__filename` @@ -30,7 +31,7 @@ const ctx = await context({ inject: [require.resolve('./import-meta-url.js')], define: { 'import.meta.url': 'import_meta_url', - GLINT_CORE_PATH: '"glint-core-pack.js"', + GLINT_CORE_PATH: '"glint-core-pack/index.js"', }, plugins: [ diff --git a/packages/vscode/src/generated-meta.ts b/packages/vscode/src/generated-meta.ts index b7b681882..0b6a0a2fe 100644 --- a/packages/vscode/src/generated-meta.ts +++ b/packages/vscode/src/generated-meta.ts @@ -4,7 +4,7 @@ // Meta info export const publisher = "typed-ember" export const name = "glint-vscode" -export const version = "1.4.3" +export const version = "1.4.5" export const displayName = "Glint" export const description = "Glint language server integration for VS Code" export const extensionId = `${publisher}.${name}` diff --git a/test-packages/package-test-core/__tests__/language-server/imports.test.ts b/test-packages/package-test-core/__tests__/language-server/imports.test.ts new file mode 100644 index 000000000..3a3b43475 --- /dev/null +++ b/test-packages/package-test-core/__tests__/language-server/imports.test.ts @@ -0,0 +1,44 @@ +import { + teardownSharedTestWorkspaceAfterEach, + requestDiagnostics, +} from 'glint-monorepo-test-utils'; +import { describe, afterEach, test, expect } from 'vitest'; +import { stripIndent } from 'common-tags'; + +describe('Language Server: Imports', () => { + afterEach(teardownSharedTestWorkspaceAfterEach); + + test('support moduleResolution=bundler index.gts resolution from gts file with