@typespec/compiler 1.10.0-dev.1 → 1.10.0-dev.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/dist/generated-defs/TypeSpec.Prototypes.ts-test.js +1 -1
  2. package/dist/generated-defs/TypeSpec.Prototypes.ts-test.js.map +1 -1
  3. package/dist/generated-defs/TypeSpec.ts-test.js +1 -1
  4. package/dist/generated-defs/TypeSpec.ts-test.js.map +1 -1
  5. package/dist/manifest.js +2 -2
  6. package/dist/src/core/binder.d.ts.map +1 -1
  7. package/dist/src/core/binder.js +33 -19
  8. package/dist/src/core/binder.js.map +1 -1
  9. package/dist/src/core/checker.d.ts.map +1 -1
  10. package/dist/src/core/checker.js +594 -67
  11. package/dist/src/core/checker.js.map +1 -1
  12. package/dist/src/core/cli/actions/info/emitter-options.d.ts +40 -0
  13. package/dist/src/core/cli/actions/info/emitter-options.d.ts.map +1 -0
  14. package/dist/src/core/cli/actions/info/emitter-options.js +345 -0
  15. package/dist/src/core/cli/actions/info/emitter-options.js.map +1 -0
  16. package/dist/src/core/cli/actions/info.d.ts +5 -2
  17. package/dist/src/core/cli/actions/info.d.ts.map +1 -1
  18. package/dist/src/core/cli/actions/info.js +6 -2
  19. package/dist/src/core/cli/actions/info.js.map +1 -1
  20. package/dist/src/core/cli/cli.js +43 -4
  21. package/dist/src/core/cli/cli.js.map +1 -1
  22. package/dist/src/core/helpers/string-template-utils.d.ts.map +1 -1
  23. package/dist/src/core/helpers/string-template-utils.js +7 -4
  24. package/dist/src/core/helpers/string-template-utils.js.map +1 -1
  25. package/dist/src/core/helpers/syntax-utils.d.ts.map +1 -1
  26. package/dist/src/core/helpers/syntax-utils.js +11 -3
  27. package/dist/src/core/helpers/syntax-utils.js.map +1 -1
  28. package/dist/src/core/helpers/type-name-utils.d.ts.map +1 -1
  29. package/dist/src/core/helpers/type-name-utils.js +13 -0
  30. package/dist/src/core/helpers/type-name-utils.js.map +1 -1
  31. package/dist/src/core/js-marshaller.d.ts +4 -2
  32. package/dist/src/core/js-marshaller.d.ts.map +1 -1
  33. package/dist/src/core/js-marshaller.js +96 -6
  34. package/dist/src/core/js-marshaller.js.map +1 -1
  35. package/dist/src/core/messages.d.ts +123 -32
  36. package/dist/src/core/messages.d.ts.map +1 -1
  37. package/dist/src/core/messages.js +29 -6
  38. package/dist/src/core/messages.js.map +1 -1
  39. package/dist/src/core/modifiers.d.ts +14 -0
  40. package/dist/src/core/modifiers.d.ts.map +1 -0
  41. package/dist/src/core/modifiers.js +166 -0
  42. package/dist/src/core/modifiers.js.map +1 -0
  43. package/dist/src/core/module-host.d.ts +5 -0
  44. package/dist/src/core/module-host.d.ts.map +1 -0
  45. package/dist/src/core/module-host.js +12 -0
  46. package/dist/src/core/module-host.js.map +1 -0
  47. package/dist/src/core/name-resolver.d.ts.map +1 -1
  48. package/dist/src/core/name-resolver.js +32 -0
  49. package/dist/src/core/name-resolver.js.map +1 -1
  50. package/dist/src/core/parser.d.ts.map +1 -1
  51. package/dist/src/core/parser.js +154 -101
  52. package/dist/src/core/parser.js.map +1 -1
  53. package/dist/src/core/program.d.ts.map +1 -1
  54. package/dist/src/core/program.js +5 -11
  55. package/dist/src/core/program.js.map +1 -1
  56. package/dist/src/core/scanner.d.ts +48 -48
  57. package/dist/src/core/scanner.d.ts.map +1 -1
  58. package/dist/src/core/scanner.js +55 -56
  59. package/dist/src/core/scanner.js.map +1 -1
  60. package/dist/src/core/semantic-walker.d.ts +3 -3
  61. package/dist/src/core/semantic-walker.d.ts.map +1 -1
  62. package/dist/src/core/semantic-walker.js +63 -44
  63. package/dist/src/core/semantic-walker.js.map +1 -1
  64. package/dist/src/core/source-loader.d.ts.map +1 -1
  65. package/dist/src/core/source-loader.js +4 -11
  66. package/dist/src/core/source-loader.js.map +1 -1
  67. package/dist/src/core/type-relation-checker.d.ts.map +1 -1
  68. package/dist/src/core/type-relation-checker.js +157 -10
  69. package/dist/src/core/type-relation-checker.js.map +1 -1
  70. package/dist/src/core/types.d.ts +215 -32
  71. package/dist/src/core/types.d.ts.map +1 -1
  72. package/dist/src/core/types.js +2 -0
  73. package/dist/src/core/types.js.map +1 -1
  74. package/dist/src/experimental/mutators.js +3 -3
  75. package/dist/src/experimental/mutators.js.map +1 -1
  76. package/dist/src/experimental/typekit/index.d.ts.map +1 -1
  77. package/dist/src/experimental/typekit/index.js.map +1 -1
  78. package/dist/src/formatter/print/printer.d.ts +2 -2
  79. package/dist/src/formatter/print/printer.d.ts.map +1 -1
  80. package/dist/src/formatter/print/printer.js +55 -5
  81. package/dist/src/formatter/print/printer.js.map +1 -1
  82. package/dist/src/index.d.ts +3 -2
  83. package/dist/src/index.d.ts.map +1 -1
  84. package/dist/src/index.js +2 -1
  85. package/dist/src/index.js.map +1 -1
  86. package/dist/src/lib/examples.d.ts +10 -3
  87. package/dist/src/lib/examples.d.ts.map +1 -1
  88. package/dist/src/lib/examples.js +22 -7
  89. package/dist/src/lib/examples.js.map +1 -1
  90. package/dist/src/server/completion.js +1 -0
  91. package/dist/src/server/completion.js.map +1 -1
  92. package/dist/src/server/server-compile-manager.js +1 -1
  93. package/dist/src/server/server-compile-manager.js.map +1 -1
  94. package/dist/src/server/tmlanguage.d.ts +1 -1
  95. package/dist/src/server/tmlanguage.d.ts.map +1 -1
  96. package/dist/src/server/tmlanguage.js +39 -29
  97. package/dist/src/server/tmlanguage.js.map +1 -1
  98. package/dist/src/server/type-signature.js +19 -0
  99. package/dist/src/server/type-signature.js.map +1 -1
  100. package/dist/src/utils/fs-utils.d.ts.map +1 -1
  101. package/dist/src/utils/fs-utils.js +1 -1
  102. package/dist/src/utils/fs-utils.js.map +1 -1
  103. package/dist/typespec.tmLanguage +103 -53
  104. package/lib/prototypes.tsp +2 -1
  105. package/package.json +13 -14
  106. package/templates/__snapshots__/emitter-ts/eslint.config.js +10 -1
  107. package/templates/__snapshots__/emitter-ts/package.json +1 -2
  108. package/templates/__snapshots__/emitter-ts/test/test-host.ts +7 -34
  109. package/templates/__snapshots__/library-ts/eslint.config.js +10 -1
  110. package/templates/__snapshots__/library-ts/package.json +1 -2
  111. package/templates/__snapshots__/library-ts/test/decorators.test.ts +18 -23
  112. package/templates/__snapshots__/library-ts/test/test-host.ts +5 -15
  113. package/templates/emitter-ts/eslint.config.js +10 -1
  114. package/templates/emitter-ts/package.json +1 -2
  115. package/templates/emitter-ts/test/test-host.ts.mu +7 -34
  116. package/templates/library-ts/eslint.config.js +10 -1
  117. package/templates/library-ts/package.json +1 -2
  118. package/templates/library-ts/test/decorators.test.ts.mu +18 -23
  119. package/templates/library-ts/test/test-host.ts.mu +5 -15
@@ -1,43 +1,16 @@
1
1
  import { Diagnostic, resolvePath } from "@typespec/compiler";
2
- import {
3
- createTestHost,
4
- createTestWrapper,
5
- expectDiagnosticEmpty,
6
- } from "@typespec/compiler/testing";
7
- import { EmitterTsTestLibrary } from "../src/testing/index.js";
2
+ import { expectDiagnosticEmpty } from "@typespec/compiler/testing";
3
+ import { createTester } from "@typespec/compiler/testing";
8
4
 
9
- export async function createEmitterTsTestHost() {
10
- return createTestHost({
11
- libraries: [EmitterTsTestLibrary],
12
- });
13
- }
14
-
15
- export async function createEmitterTsTestRunner() {
16
- const host = await createEmitterTsTestHost();
17
-
18
- return createTestWrapper(host, {
19
- compilerOptions: {
20
- noEmit: false,
21
- emit: ["emitter-ts"],
22
- },
23
- });
24
- }
5
+ export const Tester = createTester(resolvePath(import.meta.dirname, "../.."), {
6
+ libraries: ["emitter-ts"],
7
+ }).emit("emitter-ts");
25
8
 
26
9
  export async function emitWithDiagnostics(
27
10
  code: string
28
11
  ): Promise<[Record<string, string>, readonly Diagnostic[]]> {
29
- const runner = await createEmitterTsTestRunner();
30
- await runner.compileAndDiagnose(code, {
31
- outputDir: "tsp-output",
32
- });
33
- const emitterOutputDir = "./tsp-output/emitter-ts";
34
- const files = await runner.program.host.readDir(emitterOutputDir);
35
-
36
- const result: Record<string, string> = {};
37
- for (const file of files) {
38
- result[file] = (await runner.program.host.readFile(resolvePath(emitterOutputDir, file))).text;
39
- }
40
- return [result, runner.program.diagnostics];
12
+ const [{ outputs }, diagnostics] = await Tester.compileAndDiagnose(code);
13
+ return [outputs, diagnostics];
41
14
  }
42
15
 
43
16
  export async function emit(code: string): Promise<Record<string, string>> {
@@ -1,11 +1,20 @@
1
1
  // @ts-check
2
2
  import eslint from "@eslint/js";
3
+ import { defineConfig } from "eslint/config";
3
4
  import tsEslint from "typescript-eslint";
4
5
 
5
- export default tsEslint.config(
6
+ export default defineConfig(
6
7
  {
7
8
  ignores: ["**/dist/**/*", "**/.temp/**/*"],
8
9
  },
9
10
  eslint.configs.recommended,
10
11
  ...tsEslint.configs.recommended,
12
+ {
13
+ rules: {
14
+ "@typescript-eslint/no-unused-vars": [
15
+ "warn",
16
+ { varsIgnorePattern: "^_", argsIgnorePattern: "^_" },
17
+ ],
18
+ },
19
+ },
11
20
  );
@@ -19,8 +19,7 @@
19
19
  },
20
20
  "devDependencies": {
21
21
  "@types/node": "latest",
22
- "@typescript-eslint/eslint-plugin": "^8.15.0",
23
- "@typescript-eslint/parser": "^8.15.0",
22
+ "typescript-eslint": "^8.49.0",
24
23
  "@typespec/compiler": "latest",
25
24
  "@typespec/library-linter": "latest",
26
25
  "eslint": "^9.15.0",
@@ -1,29 +1,25 @@
1
1
  import { strictEqual } from "node:assert";
2
- import { describe, it, beforeEach } from "node:test";
3
- import type { Operation } from "@typespec/compiler";
4
- import { BasicTestRunner, expectDiagnostics, extractCursor } from "@typespec/compiler/testing";
2
+ import { describe, it } from "node:test";
3
+ import type { Operation, Program } from "@typespec/compiler";
4
+ import { expectDiagnostics } from "@typespec/compiler/testing";
5
5
  import { getAlternateName } from "../src/decorators.js";
6
- import { createLibraryTsTestRunner } from "./test-host.js";
6
+ import { Tester } from "./test-host.js";
7
7
 
8
8
  describe("decorators", () => {
9
- let runner: BasicTestRunner;
10
-
11
- beforeEach(async () => {
12
- runner = await createLibraryTsTestRunner();
13
- })
14
-
15
9
  describe("@alternateName", () => {
16
10
  it("set alternate name on operation", async () => {
17
- const { test } = (await runner.compile(
18
- `@alternateName("bar") @test op test(): void;`
19
- )) as { test: Operation };
20
- strictEqual(getAlternateName(runner.program, test), "bar");
11
+ const { test, program } = (await Tester.compile(`
12
+ using LibraryTs;
13
+ @alternateName("bar") @test op test(): void;
14
+ `)) as unknown as { test: Operation; program: Program };
15
+ strictEqual(getAlternateName(program, test), "bar");
21
16
  });
22
17
 
23
18
  it("emit diagnostic if not used on an operation", async () => {
24
- const diagnostics = await runner.diagnose(
25
- `@alternateName("bar") model Test {}`
26
- );
19
+ const diagnostics = await Tester.diagnose(`
20
+ using LibraryTs;
21
+ @alternateName("bar") model Test {}
22
+ `);
27
23
  expectDiagnostics(diagnostics, {
28
24
  severity: "error",
29
25
  code: "decorator-wrong-target",
@@ -33,15 +29,14 @@ describe("decorators", () => {
33
29
 
34
30
 
35
31
  it("emit diagnostic if using banned name", async () => {
36
- const {pos, source} = extractCursor(`@alternateName(┆"banned") op test(): void;`)
37
- const diagnostics = await runner.diagnose(
38
- source
39
- );
32
+ const diagnostics = await Tester.diagnose(`
33
+ using LibraryTs;
34
+ @alternateName("banned") op test(): void;
35
+ `);
40
36
  expectDiagnostics(diagnostics, {
41
37
  severity: "error",
42
38
  code: "library-ts/banned-alternate-name",
43
- message: `Banned alternate name "banned".`,
44
- pos: pos + runner.autoCodeOffset
39
+ message: `Banned alternate name "banned".`
45
40
  })
46
41
  });
47
42
  });
@@ -1,17 +1,7 @@
1
- import { createTestHost, createTestWrapper } from "@typespec/compiler/testing";
2
- import { LibraryTsTestLibrary } from "../src/testing/index.js";
1
+ import { resolvePath } from "@typespec/compiler";
2
+ import { createTester } from "@typespec/compiler/testing";
3
3
 
4
- export async function createLibraryTsTestHost() {
5
- return createTestHost({
6
- libraries: [LibraryTsTestLibrary],
7
- });
8
- }
9
-
10
- export async function createLibraryTsTestRunner() {
11
- const host = await createLibraryTsTestHost();
12
-
13
- return createTestWrapper(host, {
14
- autoUsings: ["LibraryTs"]
15
- });
16
- }
4
+ export const Tester = createTester(resolvePath(import.meta.dirname, "../.."), {
5
+ libraries: ["library-ts"],
6
+ }).import("library-ts");
17
7
 
@@ -1,11 +1,20 @@
1
1
  // @ts-check
2
2
  import eslint from "@eslint/js";
3
+ import { defineConfig } from "eslint/config";
3
4
  import tsEslint from "typescript-eslint";
4
5
 
5
- export default tsEslint.config(
6
+ export default defineConfig(
6
7
  {
7
8
  ignores: ["**/dist/**/*", "**/.temp/**/*"],
8
9
  },
9
10
  eslint.configs.recommended,
10
11
  ...tsEslint.configs.recommended,
12
+ {
13
+ rules: {
14
+ "@typescript-eslint/no-unused-vars": [
15
+ "warn",
16
+ { varsIgnorePattern: "^_", argsIgnorePattern: "^_" },
17
+ ],
18
+ },
19
+ },
11
20
  );
@@ -18,8 +18,7 @@
18
18
  },
19
19
  "devDependencies": {
20
20
  "@types/node": "latest",
21
- "@typescript-eslint/eslint-plugin": "^8.15.0",
22
- "@typescript-eslint/parser": "^8.15.0",
21
+ "typescript-eslint": "^8.49.0",
23
22
  "eslint": "^9.15.0",
24
23
  "@typespec/compiler": "latest",
25
24
  "typescript": "^5.3.3",
@@ -1,43 +1,16 @@
1
1
  import { Diagnostic, resolvePath } from "@typespec/compiler";
2
- import {
3
- createTestHost,
4
- createTestWrapper,
5
- expectDiagnosticEmpty,
6
- } from "@typespec/compiler/testing";
7
- import { {{#casing.pascalCase}}{{name}}{{/casing.pascalCase}}TestLibrary } from "../src/testing/index.js";
2
+ import { expectDiagnosticEmpty } from "@typespec/compiler/testing";
3
+ import { createTester } from "@typespec/compiler/testing";
8
4
 
9
- export async function create{{#casing.pascalCase}}{{name}}{{/casing.pascalCase}}TestHost() {
10
- return createTestHost({
11
- libraries: [{{#casing.pascalCase}}{{name}}{{/casing.pascalCase}}TestLibrary],
12
- });
13
- }
14
-
15
- export async function create{{#casing.pascalCase}}{{name}}{{/casing.pascalCase}}TestRunner() {
16
- const host = await create{{#casing.pascalCase}}{{name}}{{/casing.pascalCase}}TestHost();
17
-
18
- return createTestWrapper(host, {
19
- compilerOptions: {
20
- noEmit: false,
21
- emit: ["{{name}}"],
22
- },
23
- });
24
- }
5
+ export const Tester = createTester(resolvePath(import.meta.dirname, "../.."), {
6
+ libraries: ["{{name}}"],
7
+ }).emit("{{name}}");
25
8
 
26
9
  export async function emitWithDiagnostics(
27
10
  code: string
28
11
  ): Promise<[Record<string, string>, readonly Diagnostic[]]> {
29
- const runner = await create{{#casing.pascalCase}}{{name}}{{/casing.pascalCase}}TestRunner();
30
- await runner.compileAndDiagnose(code, {
31
- outputDir: "tsp-output",
32
- });
33
- const emitterOutputDir = "./tsp-output/{{name}}";
34
- const files = await runner.program.host.readDir(emitterOutputDir);
35
-
36
- const result: Record<string, string> = {};
37
- for (const file of files) {
38
- result[file] = (await runner.program.host.readFile(resolvePath(emitterOutputDir, file))).text;
39
- }
40
- return [result, runner.program.diagnostics];
12
+ const [{ outputs }, diagnostics] = await Tester.compileAndDiagnose(code);
13
+ return [outputs, diagnostics];
41
14
  }
42
15
 
43
16
  export async function emit(code: string): Promise<Record<string, string>> {
@@ -1,11 +1,20 @@
1
1
  // @ts-check
2
2
  import eslint from "@eslint/js";
3
+ import { defineConfig } from "eslint/config";
3
4
  import tsEslint from "typescript-eslint";
4
5
 
5
- export default tsEslint.config(
6
+ export default defineConfig(
6
7
  {
7
8
  ignores: ["**/dist/**/*", "**/.temp/**/*"],
8
9
  },
9
10
  eslint.configs.recommended,
10
11
  ...tsEslint.configs.recommended,
12
+ {
13
+ rules: {
14
+ "@typescript-eslint/no-unused-vars": [
15
+ "warn",
16
+ { varsIgnorePattern: "^_", argsIgnorePattern: "^_" },
17
+ ],
18
+ },
19
+ },
11
20
  );
@@ -19,8 +19,7 @@
19
19
  },
20
20
  "devDependencies": {
21
21
  "@types/node": "latest",
22
- "@typescript-eslint/eslint-plugin": "^8.15.0",
23
- "@typescript-eslint/parser": "^8.15.0",
22
+ "typescript-eslint": "^8.49.0",
24
23
  "@typespec/compiler": "latest",
25
24
  "@typespec/library-linter": "latest",
26
25
  "eslint": "^9.15.0",
@@ -1,29 +1,25 @@
1
1
  import { strictEqual } from "node:assert";
2
- import { describe, it, beforeEach } from "node:test";
3
- import type { Operation } from "@typespec/compiler";
4
- import { BasicTestRunner, expectDiagnostics, extractCursor } from "@typespec/compiler/testing";
2
+ import { describe, it } from "node:test";
3
+ import type { Operation, Program } from "@typespec/compiler";
4
+ import { expectDiagnostics } from "@typespec/compiler/testing";
5
5
  import { getAlternateName } from "../src/decorators.js";
6
- import { create{{#casing.pascalCase}}{{name}}{{/casing.pascalCase}}TestRunner } from "./test-host.js";
6
+ import { Tester } from "./test-host.js";
7
7
 
8
8
  describe("decorators", () => {
9
- let runner: BasicTestRunner;
10
-
11
- beforeEach(async () => {
12
- runner = await create{{#casing.pascalCase}}{{name}}{{/casing.pascalCase}}TestRunner();
13
- })
14
-
15
9
  describe("@alternateName", () => {
16
10
  it("set alternate name on operation", async () => {
17
- const { test } = (await runner.compile(
18
- `@alternateName("bar") @test op test(): void;`
19
- )) as { test: Operation };
20
- strictEqual(getAlternateName(runner.program, test), "bar");
11
+ const { test, program } = (await Tester.compile(`
12
+ using {{#casing.pascalCase}}{{name}}{{/casing.pascalCase}};
13
+ @alternateName("bar") @test op test(): void;
14
+ `)) as unknown as { test: Operation; program: Program };
15
+ strictEqual(getAlternateName(program, test), "bar");
21
16
  });
22
17
 
23
18
  it("emit diagnostic if not used on an operation", async () => {
24
- const diagnostics = await runner.diagnose(
25
- `@alternateName("bar") model Test {}`
26
- );
19
+ const diagnostics = await Tester.diagnose(`
20
+ using {{#casing.pascalCase}}{{name}}{{/casing.pascalCase}};
21
+ @alternateName("bar") model Test {}
22
+ `);
27
23
  expectDiagnostics(diagnostics, {
28
24
  severity: "error",
29
25
  code: "decorator-wrong-target",
@@ -33,15 +29,14 @@ describe("decorators", () => {
33
29
 
34
30
 
35
31
  it("emit diagnostic if using banned name", async () => {
36
- const {pos, source} = extractCursor(`@alternateName(┆"banned") op test(): void;`)
37
- const diagnostics = await runner.diagnose(
38
- source
39
- );
32
+ const diagnostics = await Tester.diagnose(`
33
+ using {{#casing.pascalCase}}{{name}}{{/casing.pascalCase}};
34
+ @alternateName("banned") op test(): void;
35
+ `);
40
36
  expectDiagnostics(diagnostics, {
41
37
  severity: "error",
42
38
  code: "{{name}}/banned-alternate-name",
43
- message: `Banned alternate name "banned".`,
44
- pos: pos + runner.autoCodeOffset
39
+ message: `Banned alternate name "banned".`
45
40
  })
46
41
  });
47
42
  });
@@ -1,17 +1,7 @@
1
- import { createTestHost, createTestWrapper } from "@typespec/compiler/testing";
2
- import { {{#casing.pascalCase}}{{name}}{{/casing.pascalCase}}TestLibrary } from "../src/testing/index.js";
1
+ import { resolvePath } from "@typespec/compiler";
2
+ import { createTester } from "@typespec/compiler/testing";
3
3
 
4
- export async function create{{#casing.pascalCase}}{{name}}{{/casing.pascalCase}}TestHost() {
5
- return createTestHost({
6
- libraries: [{{#casing.pascalCase}}{{name}}{{/casing.pascalCase}}TestLibrary],
7
- });
8
- }
9
-
10
- export async function create{{#casing.pascalCase}}{{name}}{{/casing.pascalCase}}TestRunner() {
11
- const host = await create{{#casing.pascalCase}}{{name}}{{/casing.pascalCase}}TestHost();
12
-
13
- return createTestWrapper(host, {
14
- autoUsings: ["{{#casing.pascalCase}}{{name}}{{/casing.pascalCase}}"]
15
- });
16
- }
4
+ export const Tester = createTester(resolvePath(import.meta.dirname, "../.."), {
5
+ libraries: ["{{name}}"],
6
+ }).import("{{name}}");
17
7