@typespec/compiler 0.41.0

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 (352) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +9 -0
  3. package/cmd/tsp-server.js +3 -0
  4. package/cmd/tsp.js +3 -0
  5. package/dist/cmd/runner.d.ts +9 -0
  6. package/dist/cmd/runner.d.ts.map +1 -0
  7. package/dist/cmd/runner.js +62 -0
  8. package/dist/cmd/runner.js.map +1 -0
  9. package/dist/config/config-interpolation.d.ts +11 -0
  10. package/dist/config/config-interpolation.d.ts.map +1 -0
  11. package/dist/config/config-interpolation.js +109 -0
  12. package/dist/config/config-interpolation.js.map +1 -0
  13. package/dist/config/config-loader.d.ts +25 -0
  14. package/dist/config/config-loader.d.ts.map +1 -0
  15. package/dist/config/config-loader.js +182 -0
  16. package/dist/config/config-loader.js.map +1 -0
  17. package/dist/config/config-schema.d.ts +4 -0
  18. package/dist/config/config-schema.d.ts.map +1 -0
  19. package/dist/config/config-schema.js +84 -0
  20. package/dist/config/config-schema.js.map +1 -0
  21. package/dist/config/index.d.ts +3 -0
  22. package/dist/config/index.d.ts.map +1 -0
  23. package/dist/config/index.js +3 -0
  24. package/dist/config/index.js.map +1 -0
  25. package/dist/config/types.d.ts +79 -0
  26. package/dist/config/types.d.ts.map +1 -0
  27. package/dist/config/types.js +2 -0
  28. package/dist/config/types.js.map +1 -0
  29. package/dist/core/binder.d.ts +29 -0
  30. package/dist/core/binder.d.ts.map +1 -0
  31. package/dist/core/binder.js +455 -0
  32. package/dist/core/binder.js.map +1 -0
  33. package/dist/core/charcode.d.ts +130 -0
  34. package/dist/core/charcode.d.ts.map +1 -0
  35. package/dist/core/charcode.js +115 -0
  36. package/dist/core/charcode.js.map +1 -0
  37. package/dist/core/checker.d.ts +138 -0
  38. package/dist/core/checker.d.ts.map +1 -0
  39. package/dist/core/checker.js +4070 -0
  40. package/dist/core/checker.js.map +1 -0
  41. package/dist/core/cli/args.d.ts +18 -0
  42. package/dist/core/cli/args.d.ts.map +1 -0
  43. package/dist/core/cli/args.js +108 -0
  44. package/dist/core/cli/args.js.map +1 -0
  45. package/dist/core/cli/cli.d.ts +2 -0
  46. package/dist/core/cli/cli.d.ts.map +1 -0
  47. package/dist/core/cli/cli.js +477 -0
  48. package/dist/core/cli/cli.js.map +1 -0
  49. package/dist/core/cli/index.d.ts +2 -0
  50. package/dist/core/cli/index.d.ts.map +1 -0
  51. package/dist/core/cli/index.js +2 -0
  52. package/dist/core/cli/index.js.map +1 -0
  53. package/dist/core/decorator-utils.d.ts +108 -0
  54. package/dist/core/decorator-utils.d.ts.map +1 -0
  55. package/dist/core/decorator-utils.js +326 -0
  56. package/dist/core/decorator-utils.js.map +1 -0
  57. package/dist/core/diagnostics.d.ts +93 -0
  58. package/dist/core/diagnostics.d.ts.map +1 -0
  59. package/dist/core/diagnostics.js +315 -0
  60. package/dist/core/diagnostics.js.map +1 -0
  61. package/dist/core/emitter-utils.d.ts +14 -0
  62. package/dist/core/emitter-utils.d.ts.map +1 -0
  63. package/dist/core/emitter-utils.js +16 -0
  64. package/dist/core/emitter-utils.js.map +1 -0
  65. package/dist/core/formatter-fs.d.ts +21 -0
  66. package/dist/core/formatter-fs.d.ts.map +1 -0
  67. package/dist/core/formatter-fs.js +79 -0
  68. package/dist/core/formatter-fs.js.map +1 -0
  69. package/dist/core/formatter.d.ts +10 -0
  70. package/dist/core/formatter.d.ts.map +1 -0
  71. package/dist/core/formatter.js +24 -0
  72. package/dist/core/formatter.js.map +1 -0
  73. package/dist/core/helpers/discriminator-utils.d.ts +14 -0
  74. package/dist/core/helpers/discriminator-utils.d.ts.map +1 -0
  75. package/dist/core/helpers/discriminator-utils.js +169 -0
  76. package/dist/core/helpers/discriminator-utils.js.map +1 -0
  77. package/dist/core/helpers/index.d.ts +6 -0
  78. package/dist/core/helpers/index.d.ts.map +1 -0
  79. package/dist/core/helpers/index.js +6 -0
  80. package/dist/core/helpers/index.js.map +1 -0
  81. package/dist/core/helpers/operation-utils.d.ts +15 -0
  82. package/dist/core/helpers/operation-utils.d.ts.map +1 -0
  83. package/dist/core/helpers/operation-utils.js +35 -0
  84. package/dist/core/helpers/operation-utils.js.map +1 -0
  85. package/dist/core/helpers/projected-names-utils.d.ts +20 -0
  86. package/dist/core/helpers/projected-names-utils.d.ts.map +1 -0
  87. package/dist/core/helpers/projected-names-utils.js +40 -0
  88. package/dist/core/helpers/projected-names-utils.js.map +1 -0
  89. package/dist/core/helpers/type-name-utils.d.ts +14 -0
  90. package/dist/core/helpers/type-name-utils.d.ts.map +1 -0
  91. package/dist/core/helpers/type-name-utils.js +122 -0
  92. package/dist/core/helpers/type-name-utils.js.map +1 -0
  93. package/dist/core/helpers/usage-resolver.d.ts +20 -0
  94. package/dist/core/helpers/usage-resolver.d.ts.map +1 -0
  95. package/dist/core/helpers/usage-resolver.js +108 -0
  96. package/dist/core/helpers/usage-resolver.js.map +1 -0
  97. package/dist/core/index.d.ts +26 -0
  98. package/dist/core/index.d.ts.map +1 -0
  99. package/dist/core/index.js +26 -0
  100. package/dist/core/index.js.map +1 -0
  101. package/dist/core/install.d.ts +2 -0
  102. package/dist/core/install.d.ts.map +1 -0
  103. package/dist/core/install.js +26 -0
  104. package/dist/core/install.js.map +1 -0
  105. package/dist/core/library.d.ts +34 -0
  106. package/dist/core/library.d.ts.map +1 -0
  107. package/dist/core/library.js +100 -0
  108. package/dist/core/library.js.map +1 -0
  109. package/dist/core/logger/console-sink.browser.d.ts +4 -0
  110. package/dist/core/logger/console-sink.browser.d.ts.map +1 -0
  111. package/dist/core/logger/console-sink.browser.js +14 -0
  112. package/dist/core/logger/console-sink.browser.js.map +1 -0
  113. package/dist/core/logger/console-sink.d.ts +9 -0
  114. package/dist/core/logger/console-sink.d.ts.map +1 -0
  115. package/dist/core/logger/console-sink.js +81 -0
  116. package/dist/core/logger/console-sink.js.map +1 -0
  117. package/dist/core/logger/index.d.ts +3 -0
  118. package/dist/core/logger/index.d.ts.map +1 -0
  119. package/dist/core/logger/index.js +3 -0
  120. package/dist/core/logger/index.js.map +1 -0
  121. package/dist/core/logger/logger.d.ts +7 -0
  122. package/dist/core/logger/logger.d.ts.map +1 -0
  123. package/dist/core/logger/logger.js +32 -0
  124. package/dist/core/logger/logger.js.map +1 -0
  125. package/dist/core/logger/tracer.d.ts +3 -0
  126. package/dist/core/logger/tracer.d.ts.map +1 -0
  127. package/dist/core/logger/tracer.js +91 -0
  128. package/dist/core/logger/tracer.js.map +1 -0
  129. package/dist/core/manifest.d.ts +21 -0
  130. package/dist/core/manifest.d.ts.map +1 -0
  131. package/dist/core/manifest.js +8 -0
  132. package/dist/core/manifest.js.map +1 -0
  133. package/dist/core/messages.d.ts +2253 -0
  134. package/dist/core/messages.d.ts.map +1 -0
  135. package/dist/core/messages.js +749 -0
  136. package/dist/core/messages.js.map +1 -0
  137. package/dist/core/module-resolver.d.ts +84 -0
  138. package/dist/core/module-resolver.d.ts.map +1 -0
  139. package/dist/core/module-resolver.js +170 -0
  140. package/dist/core/module-resolver.js.map +1 -0
  141. package/dist/core/node-host.browser.d.ts +2 -0
  142. package/dist/core/node-host.browser.d.ts.map +1 -0
  143. package/dist/core/node-host.browser.js +2 -0
  144. package/dist/core/node-host.browser.js.map +1 -0
  145. package/dist/core/node-host.d.ts +7 -0
  146. package/dist/core/node-host.d.ts.map +1 -0
  147. package/dist/core/node-host.js +43 -0
  148. package/dist/core/node-host.js.map +1 -0
  149. package/dist/core/nonascii.d.ts +2 -0
  150. package/dist/core/nonascii.d.ts.map +1 -0
  151. package/dist/core/nonascii.js +712 -0
  152. package/dist/core/nonascii.js.map +1 -0
  153. package/dist/core/options.d.ts +46 -0
  154. package/dist/core/options.d.ts.map +1 -0
  155. package/dist/core/options.js +2 -0
  156. package/dist/core/options.js.map +1 -0
  157. package/dist/core/parser.d.ts +17 -0
  158. package/dist/core/parser.d.ts.map +1 -0
  159. package/dist/core/parser.js +2561 -0
  160. package/dist/core/parser.js.map +1 -0
  161. package/dist/core/path-utils.d.ts +193 -0
  162. package/dist/core/path-utils.d.ts.map +1 -0
  163. package/dist/core/path-utils.js +427 -0
  164. package/dist/core/path-utils.js.map +1 -0
  165. package/dist/core/program.d.ts +104 -0
  166. package/dist/core/program.d.ts.map +1 -0
  167. package/dist/core/program.js +898 -0
  168. package/dist/core/program.js.map +1 -0
  169. package/dist/core/projection-members.d.ts +8 -0
  170. package/dist/core/projection-members.d.ts.map +1 -0
  171. package/dist/core/projection-members.js +387 -0
  172. package/dist/core/projection-members.js.map +1 -0
  173. package/dist/core/projector.d.ts +26 -0
  174. package/dist/core/projector.d.ts.map +1 -0
  175. package/dist/core/projector.js +523 -0
  176. package/dist/core/projector.js.map +1 -0
  177. package/dist/core/scanner.d.ts +125 -0
  178. package/dist/core/scanner.d.ts.map +1 -0
  179. package/dist/core/scanner.js +1012 -0
  180. package/dist/core/scanner.js.map +1 -0
  181. package/dist/core/schema-validator.d.ts +6 -0
  182. package/dist/core/schema-validator.d.ts.map +1 -0
  183. package/dist/core/schema-validator.js +38 -0
  184. package/dist/core/schema-validator.js.map +1 -0
  185. package/dist/core/semantic-walker.d.ts +53 -0
  186. package/dist/core/semantic-walker.d.ts.map +1 -0
  187. package/dist/core/semantic-walker.js +355 -0
  188. package/dist/core/semantic-walker.js.map +1 -0
  189. package/dist/core/type-utils.d.ts +49 -0
  190. package/dist/core/type-utils.d.ts.map +1 -0
  191. package/dist/core/type-utils.js +95 -0
  192. package/dist/core/type-utils.js.map +1 -0
  193. package/dist/core/types.d.ts +1345 -0
  194. package/dist/core/types.d.ts.map +1 -0
  195. package/dist/core/types.js +105 -0
  196. package/dist/core/types.js.map +1 -0
  197. package/dist/core/util.d.ts +150 -0
  198. package/dist/core/util.d.ts.map +1 -0
  199. package/dist/core/util.js +417 -0
  200. package/dist/core/util.js.map +1 -0
  201. package/dist/emitter-framework/asset-emitter.d.ts +5 -0
  202. package/dist/emitter-framework/asset-emitter.d.ts.map +1 -0
  203. package/dist/emitter-framework/asset-emitter.js +610 -0
  204. package/dist/emitter-framework/asset-emitter.js.map +1 -0
  205. package/dist/emitter-framework/builders/array-builder.d.ts +7 -0
  206. package/dist/emitter-framework/builders/array-builder.d.ts.map +1 -0
  207. package/dist/emitter-framework/builders/array-builder.js +45 -0
  208. package/dist/emitter-framework/builders/array-builder.js.map +1 -0
  209. package/dist/emitter-framework/builders/object-builder.d.ts +9 -0
  210. package/dist/emitter-framework/builders/object-builder.d.ts.map +1 -0
  211. package/dist/emitter-framework/builders/object-builder.js +30 -0
  212. package/dist/emitter-framework/builders/object-builder.js.map +1 -0
  213. package/dist/emitter-framework/builders/string-builder.d.ts +13 -0
  214. package/dist/emitter-framework/builders/string-builder.d.ts.map +1 -0
  215. package/dist/emitter-framework/builders/string-builder.js +98 -0
  216. package/dist/emitter-framework/builders/string-builder.js.map +1 -0
  217. package/dist/emitter-framework/custom-key-map.d.ts +29 -0
  218. package/dist/emitter-framework/custom-key-map.d.ts.map +1 -0
  219. package/dist/emitter-framework/custom-key-map.js +62 -0
  220. package/dist/emitter-framework/custom-key-map.js.map +1 -0
  221. package/dist/emitter-framework/index.d.ts +8 -0
  222. package/dist/emitter-framework/index.d.ts.map +1 -0
  223. package/dist/emitter-framework/index.js +8 -0
  224. package/dist/emitter-framework/index.js.map +1 -0
  225. package/dist/emitter-framework/placeholder.d.ts +12 -0
  226. package/dist/emitter-framework/placeholder.d.ts.map +1 -0
  227. package/dist/emitter-framework/placeholder.js +27 -0
  228. package/dist/emitter-framework/placeholder.js.map +1 -0
  229. package/dist/emitter-framework/type-emitter.d.ts +314 -0
  230. package/dist/emitter-framework/type-emitter.d.ts.map +1 -0
  231. package/dist/emitter-framework/type-emitter.js +612 -0
  232. package/dist/emitter-framework/type-emitter.js.map +1 -0
  233. package/dist/emitter-framework/types.d.ts +124 -0
  234. package/dist/emitter-framework/types.d.ts.map +1 -0
  235. package/dist/emitter-framework/types.js +39 -0
  236. package/dist/emitter-framework/types.js.map +1 -0
  237. package/dist/formatter/index.d.ts +11 -0
  238. package/dist/formatter/index.d.ts.map +1 -0
  239. package/dist/formatter/index.js +28 -0
  240. package/dist/formatter/index.js.map +1 -0
  241. package/dist/formatter/parser.d.ts +16 -0
  242. package/dist/formatter/parser.d.ts.map +1 -0
  243. package/dist/formatter/parser.js +23 -0
  244. package/dist/formatter/parser.js.map +1 -0
  245. package/dist/formatter/print/comment-handler.d.ts +7 -0
  246. package/dist/formatter/print/comment-handler.d.ts.map +1 -0
  247. package/dist/formatter/print/comment-handler.js +81 -0
  248. package/dist/formatter/print/comment-handler.js.map +1 -0
  249. package/dist/formatter/print/index.d.ts +3 -0
  250. package/dist/formatter/print/index.d.ts.map +1 -0
  251. package/dist/formatter/print/index.js +3 -0
  252. package/dist/formatter/print/index.js.map +1 -0
  253. package/dist/formatter/print/needs-parens.d.ts +10 -0
  254. package/dist/formatter/print/needs-parens.d.ts.map +1 -0
  255. package/dist/formatter/print/needs-parens.js +27 -0
  256. package/dist/formatter/print/needs-parens.js.map +1 -0
  257. package/dist/formatter/print/printer.d.ts +62 -0
  258. package/dist/formatter/print/printer.d.ts.map +1 -0
  259. package/dist/formatter/print/printer.js +1025 -0
  260. package/dist/formatter/print/printer.js.map +1 -0
  261. package/dist/formatter/print/types.d.ts +9 -0
  262. package/dist/formatter/print/types.d.ts.map +1 -0
  263. package/dist/formatter/print/types.js +2 -0
  264. package/dist/formatter/print/types.js.map +1 -0
  265. package/dist/init/index.d.ts +2 -0
  266. package/dist/init/index.d.ts.map +1 -0
  267. package/dist/init/index.js +2 -0
  268. package/dist/init/index.js.map +1 -0
  269. package/dist/init/init-template.d.ts +45 -0
  270. package/dist/init/init-template.d.ts.map +1 -0
  271. package/dist/init/init-template.js +45 -0
  272. package/dist/init/init-template.js.map +1 -0
  273. package/dist/init/init.d.ts +49 -0
  274. package/dist/init/init.d.ts.map +1 -0
  275. package/dist/init/init.js +224 -0
  276. package/dist/init/init.js.map +1 -0
  277. package/dist/lib/decorators.d.ts +222 -0
  278. package/dist/lib/decorators.d.ts.map +1 -0
  279. package/dist/lib/decorators.js +745 -0
  280. package/dist/lib/decorators.js.map +1 -0
  281. package/dist/lib/service.d.ts +38 -0
  282. package/dist/lib/service.d.ts.map +1 -0
  283. package/dist/lib/service.js +78 -0
  284. package/dist/lib/service.js.map +1 -0
  285. package/dist/manifest.js +4 -0
  286. package/dist/server/completion.d.ts +10 -0
  287. package/dist/server/completion.d.ts.map +1 -0
  288. package/dist/server/completion.js +207 -0
  289. package/dist/server/completion.js.map +1 -0
  290. package/dist/server/index.d.ts +3 -0
  291. package/dist/server/index.d.ts.map +1 -0
  292. package/dist/server/index.js +3 -0
  293. package/dist/server/index.js.map +1 -0
  294. package/dist/server/language-config.d.ts +195 -0
  295. package/dist/server/language-config.d.ts.map +1 -0
  296. package/dist/server/language-config.js +102 -0
  297. package/dist/server/language-config.js.map +1 -0
  298. package/dist/server/server.d.ts +2 -0
  299. package/dist/server/server.d.ts.map +1 -0
  300. package/dist/server/server.js +131 -0
  301. package/dist/server/server.js.map +1 -0
  302. package/dist/server/serverlib.d.ts +72 -0
  303. package/dist/server/serverlib.d.ts.map +1 -0
  304. package/dist/server/serverlib.js +1034 -0
  305. package/dist/server/serverlib.js.map +1 -0
  306. package/dist/server/symbol-structure.d.ts +4 -0
  307. package/dist/server/symbol-structure.d.ts.map +1 -0
  308. package/dist/server/symbol-structure.js +121 -0
  309. package/dist/server/symbol-structure.js.map +1 -0
  310. package/dist/server/tmlanguage.d.ts +3 -0
  311. package/dist/server/tmlanguage.d.ts.map +1 -0
  312. package/dist/server/tmlanguage.js +713 -0
  313. package/dist/server/tmlanguage.js.map +1 -0
  314. package/dist/server/type-details.d.ts +11 -0
  315. package/dist/server/type-details.d.ts.map +1 -0
  316. package/dist/server/type-details.js +72 -0
  317. package/dist/server/type-details.js.map +1 -0
  318. package/dist/server/type-signature.d.ts +2 -0
  319. package/dist/server/type-signature.d.ts.map +1 -0
  320. package/dist/server/type-signature.js +108 -0
  321. package/dist/server/type-signature.js.map +1 -0
  322. package/dist/testing/expect.d.ts +49 -0
  323. package/dist/testing/expect.d.ts.map +1 -0
  324. package/dist/testing/expect.js +83 -0
  325. package/dist/testing/expect.js.map +1 -0
  326. package/dist/testing/index.d.ts +6 -0
  327. package/dist/testing/index.d.ts.map +1 -0
  328. package/dist/testing/index.js +6 -0
  329. package/dist/testing/index.js.map +1 -0
  330. package/dist/testing/test-host.d.ts +14 -0
  331. package/dist/testing/test-host.d.ts.map +1 -0
  332. package/dist/testing/test-host.js +271 -0
  333. package/dist/testing/test-host.js.map +1 -0
  334. package/dist/testing/test-server-host.d.ts +39 -0
  335. package/dist/testing/test-server-host.d.ts.map +1 -0
  336. package/dist/testing/test-server-host.js +112 -0
  337. package/dist/testing/test-server-host.js.map +1 -0
  338. package/dist/testing/test-utils.d.ts +22 -0
  339. package/dist/testing/test-utils.d.ts.map +1 -0
  340. package/dist/testing/test-utils.js +60 -0
  341. package/dist/testing/test-utils.js.map +1 -0
  342. package/dist/testing/types.d.ts +69 -0
  343. package/dist/testing/types.d.ts.map +1 -0
  344. package/dist/testing/types.js +7 -0
  345. package/dist/testing/types.js.map +1 -0
  346. package/dist/typespec.tmLanguage +1760 -0
  347. package/lib/decorators.tsp +420 -0
  348. package/lib/lib.tsp +158 -0
  349. package/lib/main.tsp +4 -0
  350. package/lib/projected-names.tsp +94 -0
  351. package/lib/reflection.tsp +10 -0
  352. package/package.json +119 -0
@@ -0,0 +1,271 @@
1
+ import assert from "assert";
2
+ import { readFile } from "fs/promises";
3
+ import { globby } from "globby";
4
+ import { fileURLToPath, pathToFileURL } from "url";
5
+ import { createSourceFile, logDiagnostics, logVerboseTestOutput } from "../core/diagnostics.js";
6
+ import { createLogger } from "../core/logger/logger.js";
7
+ import { NodeHost } from "../core/node-host.js";
8
+ import { getAnyExtensionFromPath, resolvePath } from "../core/path-utils.js";
9
+ import { compile as compileProgram } from "../core/program.js";
10
+ import { createStringMap, getSourceFileKindFromExt } from "../core/util.js";
11
+ import { expectDiagnosticEmpty } from "./expect.js";
12
+ import { createTestWrapper } from "./test-utils.js";
13
+ import { TestHostError, } from "./types.js";
14
+ export function resolveVirtualPath(path, ...paths) {
15
+ // NB: We should always resolve an absolute path, and there is no absolute
16
+ // path that works across OSes. This ensures that we can still rely on API
17
+ // like pathToFileURL in tests.
18
+ const rootDir = process.platform === "win32" ? "Z:/test" : "/test";
19
+ return resolvePath(rootDir, path, ...paths);
20
+ }
21
+ function createTestCompilerHost(virtualFs, jsImports, options) {
22
+ const libDirs = [resolveVirtualPath(".tsp/lib")];
23
+ if (!(options === null || options === void 0 ? void 0 : options.excludeTestLib)) {
24
+ libDirs.push(resolveVirtualPath(".tsp/test-lib"));
25
+ }
26
+ return {
27
+ async readUrl(url) {
28
+ const contents = virtualFs.get(url);
29
+ if (contents === undefined) {
30
+ throw new TestHostError(`File ${url} not found.`, "ENOENT");
31
+ }
32
+ return createSourceFile(contents, url);
33
+ },
34
+ async readFile(path) {
35
+ path = resolveVirtualPath(path);
36
+ const contents = virtualFs.get(path);
37
+ if (contents === undefined) {
38
+ throw new TestHostError(`File ${path} not found.`, "ENOENT");
39
+ }
40
+ return createSourceFile(contents, path);
41
+ },
42
+ async writeFile(path, content) {
43
+ path = resolveVirtualPath(path);
44
+ virtualFs.set(path, content);
45
+ },
46
+ async readDir(path) {
47
+ path = resolveVirtualPath(path);
48
+ const fileFolder = [...virtualFs.keys()]
49
+ .filter((x) => x.startsWith(`${path}/`))
50
+ .map((x) => x.replace(`${path}/`, ""))
51
+ .map((x) => {
52
+ const index = x.indexOf("/");
53
+ return index !== -1 ? x.substring(0, index) : x;
54
+ });
55
+ return [...new Set(fileFolder)];
56
+ },
57
+ async rm(path, options) {
58
+ path = resolveVirtualPath(path);
59
+ if (options.recursive && !virtualFs.has(path)) {
60
+ for (const key of virtualFs.keys()) {
61
+ if (key.startsWith(`${path}/`)) {
62
+ virtualFs.delete(key);
63
+ }
64
+ }
65
+ }
66
+ else {
67
+ virtualFs.delete(path);
68
+ }
69
+ },
70
+ getLibDirs() {
71
+ return libDirs;
72
+ },
73
+ getExecutionRoot() {
74
+ return resolveVirtualPath(".tsp");
75
+ },
76
+ async getJsImport(path) {
77
+ path = resolveVirtualPath(path);
78
+ const module = jsImports.get(path);
79
+ if (module === undefined) {
80
+ throw new TestHostError(`Module ${path} not found`, "ERR_MODULE_NOT_FOUND");
81
+ }
82
+ return module;
83
+ },
84
+ async stat(path) {
85
+ path = resolveVirtualPath(path);
86
+ if (virtualFs.has(path)) {
87
+ return {
88
+ isDirectory() {
89
+ return false;
90
+ },
91
+ isFile() {
92
+ return true;
93
+ },
94
+ };
95
+ }
96
+ for (const fsPath of virtualFs.keys()) {
97
+ if (fsPath.startsWith(path) && fsPath !== path) {
98
+ return {
99
+ isDirectory() {
100
+ return true;
101
+ },
102
+ isFile() {
103
+ return false;
104
+ },
105
+ };
106
+ }
107
+ }
108
+ throw new TestHostError(`File ${path} not found`, "ENOENT");
109
+ },
110
+ // symlinks not supported in test-host
111
+ async realpath(path) {
112
+ return path;
113
+ },
114
+ getSourceFileKind: getSourceFileKindFromExt,
115
+ logSink: NodeHost.logSink,
116
+ mkdirp: async (path) => path,
117
+ fileURLToPath,
118
+ pathToFileURL(path) {
119
+ return pathToFileURL(path).href;
120
+ },
121
+ ...options === null || options === void 0 ? void 0 : options.compilerHostOverrides,
122
+ };
123
+ }
124
+ export async function createTestFileSystem(options) {
125
+ const virtualFs = createStringMap(!!(options === null || options === void 0 ? void 0 : options.caseInsensitiveFileSystem));
126
+ const jsImports = createStringMap(!!(options === null || options === void 0 ? void 0 : options.caseInsensitiveFileSystem));
127
+ const compilerHost = createTestCompilerHost(virtualFs, jsImports, options);
128
+ return {
129
+ addTypeSpecFile,
130
+ addJsFile,
131
+ addRealTypeSpecFile,
132
+ addRealJsFile,
133
+ addTypeSpecLibrary,
134
+ compilerHost,
135
+ fs: virtualFs,
136
+ };
137
+ function addTypeSpecFile(path, contents) {
138
+ virtualFs.set(resolveVirtualPath(path), contents);
139
+ }
140
+ function addJsFile(path, contents) {
141
+ const key = resolveVirtualPath(path);
142
+ virtualFs.set(key, ""); // don't need contents
143
+ jsImports.set(key, new Promise((r) => r(contents)));
144
+ }
145
+ async function addRealTypeSpecFile(path, existingPath) {
146
+ virtualFs.set(resolveVirtualPath(path), await readFile(existingPath, "utf8"));
147
+ }
148
+ async function addRealJsFile(path, existingPath) {
149
+ const key = resolveVirtualPath(path);
150
+ const exports = await import(pathToFileURL(existingPath).href);
151
+ virtualFs.set(key, "");
152
+ jsImports.set(key, exports);
153
+ }
154
+ async function addTypeSpecLibrary(testLibrary) {
155
+ for (const { realDir, pattern, virtualPath } of testLibrary.files) {
156
+ const lookupDir = resolvePath(testLibrary.packageRoot, realDir);
157
+ const entries = await findFilesFromPattern(lookupDir, pattern);
158
+ for (const entry of entries) {
159
+ const fileRealPath = resolvePath(lookupDir, entry);
160
+ const fileVirtualPath = resolveVirtualPath(virtualPath, entry);
161
+ switch (getAnyExtensionFromPath(fileRealPath)) {
162
+ case ".tsp":
163
+ case ".json":
164
+ const contents = await readFile(fileRealPath, "utf-8");
165
+ addTypeSpecFile(fileVirtualPath, contents);
166
+ break;
167
+ case ".js":
168
+ case ".mjs":
169
+ await addRealJsFile(fileVirtualPath, fileRealPath);
170
+ break;
171
+ }
172
+ }
173
+ }
174
+ }
175
+ }
176
+ export const StandardTestLibrary = {
177
+ name: "@typespec/compiler",
178
+ packageRoot: resolvePath(fileURLToPath(import.meta.url), "../../../"),
179
+ files: [
180
+ { virtualPath: "./.tsp/dist/lib", realDir: "./dist/lib", pattern: "*" },
181
+ { virtualPath: "./.tsp/lib", realDir: "./lib", pattern: "*" },
182
+ ],
183
+ };
184
+ export async function createTestHost(config = {}) {
185
+ const testHost = await createTestHostInternal();
186
+ await testHost.addTypeSpecLibrary(StandardTestLibrary);
187
+ if (config.libraries) {
188
+ for (const library of config.libraries) {
189
+ await testHost.addTypeSpecLibrary(library);
190
+ }
191
+ }
192
+ return testHost;
193
+ }
194
+ export async function createTestRunner(host) {
195
+ const testHost = host !== null && host !== void 0 ? host : (await createTestHost());
196
+ return createTestWrapper(testHost);
197
+ }
198
+ async function createTestHostInternal() {
199
+ let program;
200
+ const libraries = [];
201
+ const testTypes = {};
202
+ const fileSystem = await createTestFileSystem();
203
+ // add test decorators
204
+ fileSystem.addTypeSpecFile(".tsp/test-lib/main.tsp", 'import "./test.js";');
205
+ fileSystem.addJsFile(".tsp/test-lib/test.js", {
206
+ namespace: "TypeSpec",
207
+ $test(_, target, name) {
208
+ if (!name) {
209
+ if (target.kind === "Model" ||
210
+ target.kind === "Scalar" ||
211
+ target.kind === "Namespace" ||
212
+ target.kind === "Enum" ||
213
+ target.kind === "Operation" ||
214
+ target.kind === "ModelProperty" ||
215
+ target.kind === "EnumMember" ||
216
+ target.kind === "Interface" ||
217
+ (target.kind === "Union" && !target.expression)) {
218
+ name = target.name;
219
+ }
220
+ else {
221
+ throw new Error("Need to specify a name for test type");
222
+ }
223
+ }
224
+ testTypes[name] = target;
225
+ },
226
+ });
227
+ return {
228
+ ...fileSystem,
229
+ addTypeSpecLibrary: async (lib) => {
230
+ if (lib !== StandardTestLibrary) {
231
+ libraries.push(lib);
232
+ }
233
+ await fileSystem.addTypeSpecLibrary(lib);
234
+ },
235
+ compile,
236
+ diagnose,
237
+ compileAndDiagnose,
238
+ testTypes,
239
+ libraries,
240
+ get program() {
241
+ assert(program, "Program cannot be accessed without calling compile, diagnose, or compileAndDiagnose.");
242
+ return program;
243
+ },
244
+ };
245
+ async function compile(main, options = {}) {
246
+ const [testTypes, diagnostics] = await compileAndDiagnose(main, options);
247
+ expectDiagnosticEmpty(diagnostics);
248
+ return testTypes;
249
+ }
250
+ async function diagnose(main, options = {}) {
251
+ const [, diagnostics] = await compileAndDiagnose(main, options);
252
+ return diagnostics;
253
+ }
254
+ async function compileAndDiagnose(mainFile, options = {}) {
255
+ if (options.noEmit === undefined) {
256
+ // default for tests is noEmit
257
+ options = { ...options, noEmit: true };
258
+ }
259
+ const p = await compileProgram(fileSystem.compilerHost, mainFile, options);
260
+ program = p;
261
+ logVerboseTestOutput((log) => logDiagnostics(p.diagnostics, createLogger({ sink: fileSystem.compilerHost.logSink })));
262
+ return [testTypes, p.diagnostics];
263
+ }
264
+ }
265
+ export async function findFilesFromPattern(directory, pattern) {
266
+ return globby(pattern, {
267
+ cwd: directory,
268
+ onlyFiles: true,
269
+ });
270
+ }
271
+ //# sourceMappingURL=test-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-host.js","sourceRoot":"","sources":["../../testing/test-host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { TextDocument } from "vscode-languageserver-textdocument";
2
+ import { Diagnostic } from "vscode-languageserver/node.js";
3
+ import { IdentifierNode } from "../core/types.js";
4
+ import { Server, ServerHost } from "../server/index.js";
5
+ import { TestHostOptions } from "./test-host.js";
6
+ import { TestFileSystem } from "./types.js";
7
+ export interface TestServerHost extends ServerHost, TestFileSystem {
8
+ server: Server;
9
+ logMessages: readonly string[];
10
+ getOpenDocument(path: string): TextDocument | undefined;
11
+ addOrUpdateDocument(path: string, content: string): TextDocument;
12
+ getDiagnostics(path: string): readonly Diagnostic[];
13
+ getURL(path: string): string;
14
+ }
15
+ export declare function createTestServerHost(options?: TestHostOptions): Promise<TestServerHost>;
16
+ /**
17
+ * Takes source code with a cursor position indicated by the given marker
18
+ * ("┆" by default), and returns the source without the marker along with
19
+ * the cursor position.
20
+ */
21
+ export declare function extractCursor(sourceWithCursor: string, marker?: string): {
22
+ source: string;
23
+ pos: number;
24
+ };
25
+ /**
26
+ * Takes source code with start and end positions indicated by given marker
27
+ * ("~~~" by default) and returns the source without the markers along with
28
+ * the start and end positions.
29
+ */
30
+ export declare function extractSquiggles(sourceWithSquiggles: string, marker?: string): {
31
+ source: string;
32
+ pos: number;
33
+ end: number;
34
+ };
35
+ /**
36
+ * Extracts all identifiers marked with trailing empty comments from source
37
+ */
38
+ export declare function getTestIdentifiers(source: string): IdentifierNode[];
39
+ //# sourceMappingURL=test-server-host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-server-host.d.ts","sourceRoot":"","sources":["../../testing/test-server-host.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAc,MAAM,kBAAkB,CAAC;AAE9D,OAAO,EAAgB,MAAM,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAIL,eAAe,EAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,cAAe,SAAQ,UAAU,EAAE,cAAc;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAAC;IACxD,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,CAAC;IACjE,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,UAAU,EAAE,CAAC;IACpD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAC9B;AAED,wBAAsB,oBAAoB,CAAC,OAAO,CAAC,EAAE,eAAe,2BAkEnE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,gBAAgB,EAAE,MAAM,EACxB,MAAM,SAAM,GACX;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAKjC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,mBAAmB,EAAE,MAAM,EAC3B,MAAM,SAAQ,GACb;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAI9C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,EAAE,CAanE"}
@@ -0,0 +1,112 @@
1
+ import { ok } from "assert";
2
+ import { pathToFileURL } from "url";
3
+ import { TextDocument } from "vscode-languageserver-textdocument";
4
+ import { parse, visitChildren } from "../core/parser.js";
5
+ import { SyntaxKind } from "../core/types.js";
6
+ import { createStringMap } from "../core/util.js";
7
+ import { createServer } from "../server/index.js";
8
+ import { createTestFileSystem, resolveVirtualPath, StandardTestLibrary, } from "./test-host.js";
9
+ export async function createTestServerHost(options) {
10
+ const logMessages = [];
11
+ const documents = createStringMap(!!(options === null || options === void 0 ? void 0 : options.caseInsensitiveFileSystem));
12
+ const diagnostics = createStringMap(!!(options === null || options === void 0 ? void 0 : options.caseInsensitiveFileSystem));
13
+ const fileSystem = await createTestFileSystem({ ...options, excludeTestLib: true });
14
+ await fileSystem.addTypeSpecLibrary(StandardTestLibrary);
15
+ const serverHost = {
16
+ ...fileSystem,
17
+ throwInternalErrors: true,
18
+ server: undefined,
19
+ logMessages,
20
+ getOpenDocumentByURL(url) {
21
+ return documents.get(url);
22
+ },
23
+ getOpenDocument(path) {
24
+ return this.getOpenDocumentByURL(this.getURL(path));
25
+ },
26
+ addOrUpdateDocument(path, content) {
27
+ const url = this.getURL(path);
28
+ let version = 1;
29
+ const oldDocument = documents.get(url);
30
+ if (oldDocument) {
31
+ version = oldDocument.version;
32
+ if (oldDocument.getText() !== content) {
33
+ version++;
34
+ }
35
+ }
36
+ const document = TextDocument.create(url, "typespec", version, content);
37
+ documents.set(url, document);
38
+ fileSystem.addTypeSpecFile(path, ""); // force virtual file system to create directory where document lives.
39
+ return document;
40
+ },
41
+ getDiagnostics(path) {
42
+ var _a;
43
+ return (_a = diagnostics.get(this.getURL(path))) !== null && _a !== void 0 ? _a : [];
44
+ },
45
+ sendDiagnostics(params) {
46
+ var _a;
47
+ if (params.version && ((_a = documents.get(params.uri)) === null || _a === void 0 ? void 0 : _a.version) !== params.version) {
48
+ return;
49
+ }
50
+ diagnostics.set(params.uri, params.diagnostics);
51
+ },
52
+ log(message) {
53
+ logMessages.push(message);
54
+ },
55
+ getURL(path) {
56
+ if (path.startsWith("untitled:")) {
57
+ return path;
58
+ }
59
+ return pathToFileURL(resolveVirtualPath(path)).href;
60
+ },
61
+ };
62
+ const rootUri = serverHost.getURL("./");
63
+ const server = createServer(serverHost);
64
+ await server.initialize({
65
+ rootUri: (options === null || options === void 0 ? void 0 : options.caseInsensitiveFileSystem) ? rootUri.toUpperCase() : rootUri,
66
+ capabilities: {},
67
+ processId: null,
68
+ workspaceFolders: null,
69
+ });
70
+ server.initialized({});
71
+ serverHost.server = server;
72
+ return serverHost;
73
+ }
74
+ /**
75
+ * Takes source code with a cursor position indicated by the given marker
76
+ * ("┆" by default), and returns the source without the marker along with
77
+ * the cursor position.
78
+ */
79
+ export function extractCursor(sourceWithCursor, marker = "┆") {
80
+ const pos = sourceWithCursor.indexOf(marker);
81
+ ok(pos >= 0, "marker not found");
82
+ const source = sourceWithCursor.replace(marker, "");
83
+ return { source, pos };
84
+ }
85
+ /**
86
+ * Takes source code with start and end positions indicated by given marker
87
+ * ("~~~" by default) and returns the source without the markers along with
88
+ * the start and end positions.
89
+ */
90
+ export function extractSquiggles(sourceWithSquiggles, marker = "~~~") {
91
+ const { source: sourceWithoutFistSquiggle, pos } = extractCursor(sourceWithSquiggles, marker);
92
+ const { source, pos: end } = extractCursor(sourceWithoutFistSquiggle, marker);
93
+ return { source, pos, end };
94
+ }
95
+ /**
96
+ * Extracts all identifiers marked with trailing empty comments from source
97
+ */
98
+ export function getTestIdentifiers(source) {
99
+ const identifiers = [];
100
+ const ast = parse(source);
101
+ visitChildren(ast, function visit(node) {
102
+ if (node.kind === SyntaxKind.Identifier) {
103
+ if (source.substring(node.end, node.end + "/**/".length) === "/**/") {
104
+ identifiers.push(node);
105
+ }
106
+ }
107
+ visitChildren(node, visit);
108
+ });
109
+ identifiers.sort((x, y) => x.pos - y.pos);
110
+ return identifiers;
111
+ }
112
+ //# sourceMappingURL=test-server-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-server-host.js","sourceRoot":"","sources":["../../testing/test-server-host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { CompilerOptions } from "../core/options.js";
2
+ import { BasicTestRunner, TestHost, TypeSpecTestLibrary, TypeSpecTestLibraryInit } from "./types.js";
3
+ /**
4
+ * Define a test library defaulting to the most common library structure.
5
+ * @param init Library configuration.
6
+ * @returns TypeSpec Test library.
7
+ */
8
+ export declare function createTestLibrary(init: TypeSpecTestLibraryInit): TypeSpecTestLibrary;
9
+ export interface TestWrapperOptions {
10
+ wrapper?: (code: string) => string;
11
+ /**
12
+ * List of imports to include automatically.
13
+ */
14
+ autoImports?: string[];
15
+ /**
16
+ * List of usings to include automatically.
17
+ */
18
+ autoUsings?: string[];
19
+ compilerOptions?: CompilerOptions;
20
+ }
21
+ export declare function createTestWrapper(host: TestHost, testWrapperOptions?: TestWrapperOptions): BasicTestRunner;
22
+ //# sourceMappingURL=test-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../testing/test-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EACL,eAAe,EACf,QAAQ,EACR,mBAAmB,EACnB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,uBAAuB,GAAG,mBAAmB,CAqBpF;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAEnC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAEvB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAEtB,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AACD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,QAAQ,EACd,kBAAkB,GAAE,kBAAuB,GAC1C,eAAe,CAsCjB"}
@@ -0,0 +1,60 @@
1
+ import { resolvePath } from "../core/index.js";
2
+ import { StandardTestLibrary } from "./test-host.js";
3
+ /**
4
+ * Define a test library defaulting to the most common library structure.
5
+ * @param init Library configuration.
6
+ * @returns TypeSpec Test library.
7
+ */
8
+ export function createTestLibrary(init) {
9
+ var _a, _b;
10
+ const { name } = init;
11
+ const typespecFileFolder = (_a = init.typespecFileFolder) !== null && _a !== void 0 ? _a : "lib";
12
+ const jsFileFolder = (_b = init.jsFileFolder) !== null && _b !== void 0 ? _b : "dist/src";
13
+ return {
14
+ name,
15
+ packageRoot: init.packageRoot,
16
+ files: [
17
+ { realDir: "", pattern: "package.json", virtualPath: `./node_modules/${name}` },
18
+ {
19
+ realDir: typespecFileFolder,
20
+ pattern: "*.tsp",
21
+ virtualPath: resolvePath(`./node_modules/${name}`, typespecFileFolder),
22
+ },
23
+ {
24
+ realDir: jsFileFolder,
25
+ pattern: "**/*.js",
26
+ virtualPath: resolvePath(`./node_modules/${name}`, jsFileFolder),
27
+ },
28
+ ],
29
+ };
30
+ }
31
+ export function createTestWrapper(host, testWrapperOptions = {}) {
32
+ const { autoImports, autoUsings, wrapper, compilerOptions: defaultCompilerOptions, } = testWrapperOptions;
33
+ const autoCode = [
34
+ ...(autoImports !== null && autoImports !== void 0 ? autoImports : host.libraries.filter((x) => x !== StandardTestLibrary).map((x) => x.name)).map((x) => `import "${x}";`),
35
+ ...(autoUsings !== null && autoUsings !== void 0 ? autoUsings : []).map((x) => `using ${x};`),
36
+ ].join("\n");
37
+ const wrap = (code) => {
38
+ return `${autoCode}${wrapper ? wrapper(code) : code}`;
39
+ };
40
+ return {
41
+ get program() {
42
+ return host.program;
43
+ },
44
+ fs: host.fs,
45
+ autoCodeOffset: autoCode.length,
46
+ compile: (code, options) => {
47
+ host.addTypeSpecFile("./main.tsp", wrap(code));
48
+ return host.compile("./main.tsp", { ...defaultCompilerOptions, ...options });
49
+ },
50
+ diagnose: (code, options) => {
51
+ host.addTypeSpecFile("./main.tsp", wrap(code));
52
+ return host.diagnose("./main.tsp", { ...defaultCompilerOptions, ...options });
53
+ },
54
+ compileAndDiagnose: (code, options) => {
55
+ host.addTypeSpecFile("./main.tsp", wrap(code));
56
+ return host.compileAndDiagnose("./main.tsp", { ...defaultCompilerOptions, ...options });
57
+ },
58
+ };
59
+ }
60
+ //# sourceMappingURL=test-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../../testing/test-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import { CompilerHost, Diagnostic, Program, Type } from "../core/index.js";
2
+ import { CompilerOptions } from "../core/options.js";
3
+ export interface TestFileSystem {
4
+ compilerHost: CompilerHost;
5
+ fs: Map<string, string>;
6
+ addTypeSpecFile(path: string, contents: string): void;
7
+ addJsFile(path: string, contents: Record<string, any>): void;
8
+ addRealTypeSpecFile(path: string, realPath: string): Promise<void>;
9
+ addRealJsFile(path: string, realPath: string): Promise<void>;
10
+ addTypeSpecLibrary(testLibrary: TypeSpecTestLibrary): Promise<void>;
11
+ }
12
+ export interface TestHost extends TestFileSystem {
13
+ program: Program;
14
+ libraries: TypeSpecTestLibrary[];
15
+ testTypes: Record<string, Type>;
16
+ compile(main: string, options?: CompilerOptions): Promise<Record<string, Type>>;
17
+ diagnose(main: string, options?: CompilerOptions): Promise<readonly Diagnostic[]>;
18
+ compileAndDiagnose(main: string, options?: CompilerOptions): Promise<[Record<string, Type>, readonly Diagnostic[]]>;
19
+ }
20
+ export interface TestFiles {
21
+ realDir: string;
22
+ pattern: string;
23
+ virtualPath: string;
24
+ }
25
+ export interface TypeSpecTestLibraryInit {
26
+ name: string;
27
+ packageRoot: string;
28
+ /**
29
+ * Folder @default "lib"
30
+ */
31
+ typespecFileFolder?: string;
32
+ /**
33
+ * JS files folder. @default "dist"
34
+ */
35
+ jsFileFolder?: string;
36
+ }
37
+ export interface TypeSpecTestLibrary {
38
+ name: string;
39
+ packageRoot: string;
40
+ files: TestFiles[];
41
+ }
42
+ export interface TestHostConfig {
43
+ libraries?: TypeSpecTestLibrary[];
44
+ }
45
+ export declare class TestHostError extends Error {
46
+ code: "ENOENT" | "ERR_MODULE_NOT_FOUND";
47
+ constructor(message: string, code: "ENOENT" | "ERR_MODULE_NOT_FOUND");
48
+ }
49
+ export interface BasicTestRunner {
50
+ readonly program: Program;
51
+ readonly fs: Map<string, string>;
52
+ /**
53
+ * Position to offset the automatically added code.
54
+ */
55
+ readonly autoCodeOffset: number;
56
+ /**
57
+ * Compile the given code and assert no diagnostics are present.
58
+ */
59
+ compile(code: string, options?: CompilerOptions): Promise<Record<string, Type>>;
60
+ /**
61
+ * Compile the code and return the list of diagnostics.
62
+ */
63
+ diagnose(code: string, options?: CompilerOptions): Promise<readonly Diagnostic[]>;
64
+ /**
65
+ * Compile the code and return the test types as well as the list of diagnostics.
66
+ */
67
+ compileAndDiagnose(code: string, options?: CompilerOptions): Promise<[Record<string, Type>, readonly Diagnostic[]]>;
68
+ }
69
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../testing/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export class TestHostError extends Error {
2
+ constructor(message, code) {
3
+ super(message);
4
+ this.code = code;
5
+ }
6
+ }
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../testing/types.ts"],"names":[],"mappings":"AAyDA,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAe,EAAS,IAAuC;QACzE,KAAK,CAAC,OAAO,CAAC,CAAC;QADmB,SAAI,GAAJ,IAAI,CAAmC;IAE3E,CAAC;CACF"}