diff --git a/.vscode/launch.json b/.vscode/launch.json index 606b31feb..d79ade88e 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -59,7 +59,7 @@ { // For this to work, make sure you're runninc `tsc --build --watch` at the root, AND // `yarn bundle:watch` from within vscode directory. - "name": "Debug Extension (TS Plugin Only)", + "name": "Debug Extension (TS Plugin, .gts)", "type": "extensionHost", "request": "launch", // "preLaunchTask": "npm: build", @@ -71,10 +71,29 @@ ], "args": [ "--extensionDevelopmentPath=${workspaceFolder}/packages/vscode", - "--disable-extensions", // uncomment to activate your local extensions + "--disable-extensions", // comment to activate your local extensions "${workspaceFolder}/test-packages/ts-plugin-test-app" ] }, + { + // For this to work, make sure you're runninc `tsc --build --watch` at the root, AND + // `yarn bundle:watch` from within vscode directory. + "name": "Debug Extension (TS Plugin, ember-app-loose-and-gts)", + "type": "extensionHost", + "request": "launch", + // "preLaunchTask": "npm: build", + "autoAttachChildProcesses": true, + "runtimeExecutable": "${execPath}", + "outFiles": [ + "${workspaceFolder}/**/*.js", + "!**/node_modules/**" + ], + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}/packages/vscode", + "--disable-extensions", // comment to activate your local extensions + "${workspaceFolder}/packages/vscode/__fixtures__/ember-app-loose-and-gts/" + ] + }, { "name": "Attach to TS Server", "type": "node", diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/app.ts b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/app.ts new file mode 100644 index 000000000..2c531e29a --- /dev/null +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/app.ts @@ -0,0 +1 @@ +import '@glint/environment-ember-loose'; diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/Greeting.gts b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/Greeting.gts new file mode 100644 index 000000000..c919c8dac --- /dev/null +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/Greeting.gts @@ -0,0 +1,13 @@ +import Component from '@glimmer/component'; + +export interface GreetingSignature { + Args: { target: string }; +} + +export default class Greeting extends Component { + private message = 'Hello'; + + +} diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/colocated-layout-with-errors.hbs b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/colocated-layout-with-errors.hbs new file mode 100644 index 000000000..abe770add --- /dev/null +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/colocated-layout-with-errors.hbs @@ -0,0 +1,13 @@ +{{! This reference is correct; no errors }} +{{this.message}} + +{{! This reference has a typo. Error expected }} +{{this.messageeee}} + +{{! + If I reload VSCode via `Developer: Reload Window` (or fully restart the debugging session), + then the error diagnostics will be correctly calculated, but do not update/go away when I + fix the errors (and newly introduced errors do not show up). + + Perhaps there is some TS Plugin caching issue with associated files? +}} diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/colocated-layout-with-errors.ts b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/colocated-layout-with-errors.ts new file mode 100644 index 000000000..7b01b7fc1 --- /dev/null +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/colocated-layout-with-errors.ts @@ -0,0 +1,5 @@ +import Component from '@glimmer/component'; + +export default class ColocatedLayoutComponent extends Component { + private message = 'hello'; +} diff --git a/packages/vscode/__fixtures__/ember-app/app/templates/components/classic-layout.hbs b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/colocated-layout.hbs similarity index 100% rename from packages/vscode/__fixtures__/ember-app/app/templates/components/classic-layout.hbs rename to packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/colocated-layout.hbs diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/colocated-layout.ts b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/colocated-layout.ts new file mode 100644 index 000000000..7b01b7fc1 --- /dev/null +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/colocated-layout.ts @@ -0,0 +1,5 @@ +import Component from '@glimmer/component'; + +export default class ColocatedLayoutComponent extends Component { + private message = 'hello'; +} diff --git a/packages/vscode/__fixtures__/ember-app/app/components/classic-layout.ts b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/pod-layout/component.ts similarity index 54% rename from packages/vscode/__fixtures__/ember-app/app/components/classic-layout.ts rename to packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/pod-layout/component.ts index 54088fe40..f7f7ed7db 100644 --- a/packages/vscode/__fixtures__/ember-app/app/components/classic-layout.ts +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/pod-layout/component.ts @@ -1,5 +1,5 @@ import Component from '@glimmer/component'; -export default class ClassicLayoutComponent extends 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 new file mode 100644 index 000000000..07e73bb0b --- /dev/null +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/pod-layout/template.hbs @@ -0,0 +1 @@ +{{this.message}} diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/template-only.hbs b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/template-only.hbs new file mode 100644 index 000000000..0710d87e4 --- /dev/null +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/components/template-only.hbs @@ -0,0 +1 @@ +{{@foo}} diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/controllers/classic-controller-route.ts b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/controllers/classic-controller-route.ts new file mode 100644 index 000000000..24b533d83 --- /dev/null +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/controllers/classic-controller-route.ts @@ -0,0 +1,5 @@ +import Controller from '@ember/controller'; + +export default class PodController extends Controller { + declare model: { message: string }; +} diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/pods/pod-controller-route/controller.ts b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/pods/pod-controller-route/controller.ts new file mode 100644 index 000000000..f1db7b31c --- /dev/null +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/pods/pod-controller-route/controller.ts @@ -0,0 +1,5 @@ +import Controller from '@ember/controller'; + +export default class ClassicController extends Controller { + declare model: { message: string }; +} diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/pods/pod-controller-route/route.ts b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/pods/pod-controller-route/route.ts new file mode 100644 index 000000000..5e12710ba --- /dev/null +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/pods/pod-controller-route/route.ts @@ -0,0 +1,7 @@ +import Route from '@ember/routing/route'; + +export default class PodControllerRoute extends Route { + async model(): Promise<{ message: string }> { + return { message: 'hello' }; + } +} diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/pods/pod-controller-route/template.hbs b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/pods/pod-controller-route/template.hbs new file mode 100644 index 000000000..6bc86217b --- /dev/null +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/pods/pod-controller-route/template.hbs @@ -0,0 +1 @@ +{{@model.message}} diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/pods/pod-lone-route/route.ts b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/pods/pod-lone-route/route.ts new file mode 100644 index 000000000..6b674d221 --- /dev/null +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/pods/pod-lone-route/route.ts @@ -0,0 +1,7 @@ +import Route from '@ember/routing/route'; + +export default class PodLoneRoute extends Route { + async model(): Promise<{ message: string }> { + return { message: 'hello' }; + } +} diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/pods/pod-lone-route/template.hbs b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/pods/pod-lone-route/template.hbs new file mode 100644 index 000000000..6bc86217b --- /dev/null +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/pods/pod-lone-route/template.hbs @@ -0,0 +1 @@ +{{@model.message}} diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/routes/classic-controller-route.ts b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/routes/classic-controller-route.ts new file mode 100644 index 000000000..6c47d2f49 --- /dev/null +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/routes/classic-controller-route.ts @@ -0,0 +1,3 @@ +import Route from '@ember/routing/route'; + +export default class ClassicControllerRoute extends Route {} diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/routes/classic-lone-route.ts b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/routes/classic-lone-route.ts new file mode 100644 index 000000000..390efbda9 --- /dev/null +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/routes/classic-lone-route.ts @@ -0,0 +1,7 @@ +import Route from '@ember/routing/route'; + +export default class ClassicLoneRoute extends Route { + async model(): Promise<{ message: string }> { + return { message: 'hello' }; + } +} diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/templates/classic-controller-route.hbs b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/templates/classic-controller-route.hbs new file mode 100644 index 000000000..6bc86217b --- /dev/null +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/templates/classic-controller-route.hbs @@ -0,0 +1 @@ +{{@model.message}} diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/templates/classic-lone-route.hbs b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/templates/classic-lone-route.hbs new file mode 100644 index 000000000..6bc86217b --- /dev/null +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/app/templates/classic-lone-route.hbs @@ -0,0 +1 @@ +{{@model.message}} diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/package.json b/packages/vscode/__fixtures__/ember-app-loose-and-gts/package.json new file mode 100644 index 000000000..85f1051db --- /dev/null +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/package.json @@ -0,0 +1,4 @@ +{ + "name": "test-ember-app-loose-and-gts", + "private": true +} diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/tests/integration/component-test.ts b/packages/vscode/__fixtures__/ember-app-loose-and-gts/tests/integration/component-test.ts new file mode 100644 index 000000000..d30865b3f --- /dev/null +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/tests/integration/component-test.ts @@ -0,0 +1,23 @@ +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render } from '@ember/test-helpers'; +import { hbs } from 'ember-cli-htmlbars'; +import 'qunit-dom'; + +module('Integration | component test', function (hooks) { + setupRenderingTest(hooks); + + interface MyTestContext { + message: string; + } + + test('typechecking', async function (this: MyTestContext, assert) { + this.message = 'hi'; + + await render(hbs` + {{this.message}} + `); + + assert.dom().hasText('message'); + }); +}); diff --git a/packages/vscode/__fixtures__/ember-app-loose-and-gts/tsconfig.json b/packages/vscode/__fixtures__/ember-app-loose-and-gts/tsconfig.json new file mode 100644 index 000000000..787fc5937 --- /dev/null +++ b/packages/vscode/__fixtures__/ember-app-loose-and-gts/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "strict": true, + "target": "es2019", + "module": "es2015", + "moduleResolution": "bundler", + "skipLibCheck": true + }, + "glint": { + "environment": ["ember-loose", "ember-template-imports"], + "enableTsPlugin": true + } +} diff --git a/packages/vscode/__tests__/language-server-tests/smoketest-ember.test.ts b/packages/vscode/__tests__/language-server-tests/smoketest-ember.test.ts index 7e22c6080..cc5f57e1e 100644 --- a/packages/vscode/__tests__/language-server-tests/smoketest-ember.test.ts +++ b/packages/vscode/__tests__/language-server-tests/smoketest-ember.test.ts @@ -86,25 +86,6 @@ describe.skip('Smoke test: Ember', () => { }); describe('component layout', () => { - test('classic', async () => { - let scriptURI = Uri.file(`${rootDir}/app/components/classic-layout.ts`); - let templateURI = Uri.file(`${rootDir}/app/templates/components/classic-layout.hbs`); - - await window.showTextDocument(templateURI); - - await waitUntil(() => extensions.getExtension('typed-ember.glint-vscode')?.isActive); - - let positions = (await commands.executeCommand( - 'vscode.executeDefinitionProvider', - templateURI, - new Position(0, 11), - )) as Array; - - expect(positions.length).toBe(1); - expect(positions[0].uri.fsPath).toEqual(scriptURI.fsPath); - expect(positions[0].range).toEqual(new Range(3, 10, 3, 17)); - }); - test('colocated', async () => { let scriptURI = Uri.file(`${rootDir}/app/components/colocated-layout.ts`); let templateURI = Uri.file(`${rootDir}/app/components/colocated-layout.hbs`);