@shivaedev/build 0.0.0 → 0.1.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 (209) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/LICENSE +21 -0
  3. package/README.md +215 -1
  4. package/dist/BuildFailure.d.ts +9 -0
  5. package/dist/BuildFailure.d.ts.map +1 -0
  6. package/dist/BuildFailure.js +4 -0
  7. package/dist/BuildFailure.js.map +1 -0
  8. package/dist/adapters/appTestConfig.d.ts +4 -0
  9. package/dist/adapters/appTestConfig.d.ts.map +1 -0
  10. package/dist/adapters/appTestConfig.js +17 -0
  11. package/dist/adapters/appTestConfig.js.map +1 -0
  12. package/dist/adapters/appViteConfig.d.ts +26 -0
  13. package/dist/adapters/appViteConfig.d.ts.map +1 -0
  14. package/dist/adapters/appViteConfig.js +18 -0
  15. package/dist/adapters/appViteConfig.js.map +1 -0
  16. package/dist/adapters/bundleCheck.d.ts +3 -0
  17. package/dist/adapters/bundleCheck.d.ts.map +1 -0
  18. package/dist/adapters/bundleCheck.js +53 -0
  19. package/dist/adapters/bundleCheck.js.map +1 -0
  20. package/dist/adapters/copiedCode.d.ts +9 -0
  21. package/dist/adapters/copiedCode.d.ts.map +1 -0
  22. package/dist/adapters/copiedCode.js +84 -0
  23. package/dist/adapters/copiedCode.js.map +1 -0
  24. package/dist/adapters/failuresOf.d.ts +5 -0
  25. package/dist/adapters/failuresOf.d.ts.map +1 -0
  26. package/dist/adapters/failuresOf.js +29 -0
  27. package/dist/adapters/failuresOf.js.map +1 -0
  28. package/dist/adapters/isReadonlyProperty.d.ts +10 -0
  29. package/dist/adapters/isReadonlyProperty.d.ts.map +1 -0
  30. package/dist/adapters/isReadonlyProperty.js +7 -0
  31. package/dist/adapters/isReadonlyProperty.js.map +1 -0
  32. package/dist/adapters/moduleCalls.d.ts +10 -0
  33. package/dist/adapters/moduleCalls.d.ts.map +1 -0
  34. package/dist/adapters/moduleCalls.js +47 -0
  35. package/dist/adapters/moduleCalls.js.map +1 -0
  36. package/dist/adapters/moduleFacts.d.ts +4 -0
  37. package/dist/adapters/moduleFacts.d.ts.map +1 -0
  38. package/dist/adapters/moduleFacts.js +63 -0
  39. package/dist/adapters/moduleFacts.js.map +1 -0
  40. package/dist/adapters/objectForm.d.ts +8 -0
  41. package/dist/adapters/objectForm.d.ts.map +1 -0
  42. package/dist/adapters/objectForm.js +66 -0
  43. package/dist/adapters/objectForm.js.map +1 -0
  44. package/dist/adapters/operationFacts.d.ts +10 -0
  45. package/dist/adapters/operationFacts.d.ts.map +1 -0
  46. package/dist/adapters/operationFacts.js +72 -0
  47. package/dist/adapters/operationFacts.js.map +1 -0
  48. package/dist/adapters/runNode.d.ts +6 -0
  49. package/dist/adapters/runNode.d.ts.map +1 -0
  50. package/dist/adapters/runNode.js +14 -0
  51. package/dist/adapters/runNode.js.map +1 -0
  52. package/dist/adapters/typeReading.d.ts +15 -0
  53. package/dist/adapters/typeReading.d.ts.map +1 -0
  54. package/dist/adapters/typeReading.js +46 -0
  55. package/dist/adapters/typeReading.js.map +1 -0
  56. package/dist/adapters/typeScript.d.ts +15 -0
  57. package/dist/adapters/typeScript.d.ts.map +1 -0
  58. package/dist/adapters/typeScript.js +81 -0
  59. package/dist/adapters/typeScript.js.map +1 -0
  60. package/dist/adapters/unionForm.d.ts +7 -0
  61. package/dist/adapters/unionForm.d.ts.map +1 -0
  62. package/dist/adapters/unionForm.js +78 -0
  63. package/dist/adapters/unionForm.js.map +1 -0
  64. package/dist/adapters/vitePlugin.d.ts +7 -0
  65. package/dist/adapters/vitePlugin.d.ts.map +1 -0
  66. package/dist/adapters/vitePlugin.js +88 -0
  67. package/dist/adapters/vitePlugin.js.map +1 -0
  68. package/dist/adapters/vitePort.d.ts +2 -0
  69. package/dist/adapters/vitePort.d.ts.map +1 -0
  70. package/dist/adapters/vitePort.js +5 -0
  71. package/dist/adapters/vitePort.js.map +1 -0
  72. package/dist/adapters/vitest/setup.d.ts +3 -0
  73. package/dist/adapters/vitest/setup.d.ts.map +1 -0
  74. package/dist/adapters/vitest/setup.js +11 -0
  75. package/dist/adapters/vitest/setup.js.map +1 -0
  76. package/dist/adapters/wireForm.d.ts +5 -0
  77. package/dist/adapters/wireForm.d.ts.map +1 -0
  78. package/dist/adapters/wireForm.js +91 -0
  79. package/dist/adapters/wireForm.js.map +1 -0
  80. package/dist/byText.d.ts +2 -0
  81. package/dist/byText.d.ts.map +1 -0
  82. package/dist/byText.js +8 -0
  83. package/dist/byText.js.map +1 -0
  84. package/dist/cache.d.ts +4 -0
  85. package/dist/cache.d.ts.map +1 -0
  86. package/dist/cache.js +19 -0
  87. package/dist/cache.js.map +1 -0
  88. package/dist/cli.d.ts +3 -0
  89. package/dist/cli.d.ts.map +1 -0
  90. package/dist/cli.js +11 -0
  91. package/dist/cli.js.map +1 -0
  92. package/dist/code.d.ts +11 -0
  93. package/dist/code.d.ts.map +1 -0
  94. package/dist/code.js +11 -0
  95. package/dist/code.js.map +1 -0
  96. package/dist/command.d.ts +6 -0
  97. package/dist/command.d.ts.map +1 -0
  98. package/dist/command.js +28 -0
  99. package/dist/command.js.map +1 -0
  100. package/dist/emit.d.ts +23 -0
  101. package/dist/emit.d.ts.map +1 -0
  102. package/dist/emit.js +69 -0
  103. package/dist/emit.js.map +1 -0
  104. package/dist/facts.d.ts +92 -0
  105. package/dist/facts.d.ts.map +1 -0
  106. package/dist/facts.js +3 -0
  107. package/dist/facts.js.map +1 -0
  108. package/dist/files.d.ts +4 -0
  109. package/dist/files.d.ts.map +1 -0
  110. package/dist/files.js +15 -0
  111. package/dist/files.js.map +1 -0
  112. package/dist/formCode.d.ts +6 -0
  113. package/dist/formCode.d.ts.map +1 -0
  114. package/dist/formCode.js +46 -0
  115. package/dist/formCode.js.map +1 -0
  116. package/dist/generate.d.ts +7 -0
  117. package/dist/generate.d.ts.map +1 -0
  118. package/dist/generate.js +69 -0
  119. package/dist/generate.js.map +1 -0
  120. package/dist/generateRound.d.ts +14 -0
  121. package/dist/generateRound.d.ts.map +1 -0
  122. package/dist/generateRound.js +44 -0
  123. package/dist/generateRound.js.map +1 -0
  124. package/dist/importNames.d.ts +7 -0
  125. package/dist/importNames.d.ts.map +1 -0
  126. package/dist/importNames.js +57 -0
  127. package/dist/importNames.js.map +1 -0
  128. package/dist/inputs.d.ts +15 -0
  129. package/dist/inputs.d.ts.map +1 -0
  130. package/dist/inputs.js +64 -0
  131. package/dist/inputs.js.map +1 -0
  132. package/dist/ownerOf.d.ts +7 -0
  133. package/dist/ownerOf.d.ts.map +1 -0
  134. package/dist/ownerOf.js +30 -0
  135. package/dist/ownerOf.js.map +1 -0
  136. package/dist/packageScope.d.ts +13 -0
  137. package/dist/packageScope.d.ts.map +1 -0
  138. package/dist/packageScope.js +28 -0
  139. package/dist/packageScope.js.map +1 -0
  140. package/dist/plan.d.ts +12 -0
  141. package/dist/plan.d.ts.map +1 -0
  142. package/dist/plan.js +115 -0
  143. package/dist/plan.js.map +1 -0
  144. package/dist/project.d.ts +11 -0
  145. package/dist/project.d.ts.map +1 -0
  146. package/dist/project.js +24 -0
  147. package/dist/project.js.map +1 -0
  148. package/dist/rejections.d.ts +11 -0
  149. package/dist/rejections.d.ts.map +1 -0
  150. package/dist/rejections.js +46 -0
  151. package/dist/rejections.js.map +1 -0
  152. package/dist/report.d.ts +22 -0
  153. package/dist/report.d.ts.map +1 -0
  154. package/dist/report.js +20 -0
  155. package/dist/report.js.map +1 -0
  156. package/dist/serverCode.d.ts +20 -0
  157. package/dist/serverCode.d.ts.map +1 -0
  158. package/dist/serverCode.js +90 -0
  159. package/dist/serverCode.js.map +1 -0
  160. package/dist/settleOrphans.d.ts +5 -0
  161. package/dist/settleOrphans.d.ts.map +1 -0
  162. package/dist/settleOrphans.js +43 -0
  163. package/dist/settleOrphans.js.map +1 -0
  164. package/dist/specifiers.d.ts +4 -0
  165. package/dist/specifiers.d.ts.map +1 -0
  166. package/dist/specifiers.js +52 -0
  167. package/dist/specifiers.js.map +1 -0
  168. package/package.json +82 -5
  169. package/src/BuildFailure.ts +5 -0
  170. package/src/adapters/appTestConfig.ts +18 -0
  171. package/src/adapters/appViteConfig.ts +31 -0
  172. package/src/adapters/bundleCheck.ts +57 -0
  173. package/src/adapters/copiedCode.ts +103 -0
  174. package/src/adapters/failuresOf.ts +31 -0
  175. package/src/adapters/isReadonlyProperty.ts +21 -0
  176. package/src/adapters/moduleCalls.ts +58 -0
  177. package/src/adapters/moduleFacts.ts +66 -0
  178. package/src/adapters/objectForm.ts +74 -0
  179. package/src/adapters/operationFacts.ts +85 -0
  180. package/src/adapters/runNode.ts +15 -0
  181. package/src/adapters/typeReading.ts +63 -0
  182. package/src/adapters/typeScript.ts +101 -0
  183. package/src/adapters/unionForm.ts +88 -0
  184. package/src/adapters/vitePlugin.ts +103 -0
  185. package/src/adapters/vitePort.ts +5 -0
  186. package/src/adapters/vitest/setup.ts +12 -0
  187. package/src/adapters/wireForm.ts +98 -0
  188. package/src/byText.ts +7 -0
  189. package/src/cache.ts +28 -0
  190. package/src/cli.ts +16 -0
  191. package/src/code.ts +23 -0
  192. package/src/command.ts +42 -0
  193. package/src/emit.ts +117 -0
  194. package/src/facts.ts +70 -0
  195. package/src/files.ts +19 -0
  196. package/src/formCode.ts +59 -0
  197. package/src/generate.ts +86 -0
  198. package/src/generateRound.ts +60 -0
  199. package/src/importNames.ts +61 -0
  200. package/src/inputs.ts +82 -0
  201. package/src/ownerOf.ts +40 -0
  202. package/src/packageScope.ts +35 -0
  203. package/src/plan.ts +138 -0
  204. package/src/project.ts +30 -0
  205. package/src/rejections.ts +57 -0
  206. package/src/report.ts +39 -0
  207. package/src/serverCode.ts +139 -0
  208. package/src/settleOrphans.ts +58 -0
  209. package/src/specifiers.ts +55 -0
@@ -0,0 +1,10 @@
1
+ import ts from "typescript";
2
+ export interface ModuleCall {
3
+ readonly definition: ts.Expression | undefined;
4
+ readonly exported: boolean;
5
+ readonly variable: ts.VariableDeclaration;
6
+ }
7
+ export declare function moduleCalls(source: ts.SourceFile): readonly ModuleCall[];
8
+ export declare function propertyOf(literal: ts.ObjectLiteralExpression, name: string): ts.ObjectLiteralElementLike | undefined;
9
+ export declare function initializerOf(property: ts.ObjectLiteralElementLike | undefined): ts.Expression | undefined;
10
+ //# sourceMappingURL=moduleCalls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moduleCalls.d.ts","sourceRoot":"","sources":["../../src/adapters/moduleCalls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,mBAAmB,CAAC;CAC1C;AAkBD,wBAAgB,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,GAAG,SAAS,UAAU,EAAE,CAiBxE;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,uBAAuB,EAAE,IAAI,EAAE,MAAM,GAAG,EAAE,CAAC,wBAAwB,GAAG,SAAS,CAIrH;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,wBAAwB,GAAG,SAAS,GAAG,EAAE,CAAC,UAAU,GAAG,SAAS,CAQ1G"}
@@ -0,0 +1,47 @@
1
+ import ts from "typescript";
2
+ function importsDefineModule(source) {
3
+ const locals = new Set();
4
+ for (const statement of source.statements) {
5
+ const bindings = ts.isImportDeclaration(statement) ? statement.importClause?.namedBindings : undefined;
6
+ if (bindings !== undefined && ts.isNamedImports(bindings)) {
7
+ for (const element of bindings.elements) {
8
+ if ((element.propertyName ?? element.name).text === "defineModule") {
9
+ locals.add(element.name.text);
10
+ }
11
+ }
12
+ }
13
+ }
14
+ return locals;
15
+ }
16
+ // Found by syntax alone, so discovery and the cache need no program.
17
+ export function moduleCalls(source) {
18
+ const locals = importsDefineModule(source);
19
+ if (locals.size === 0) {
20
+ return [];
21
+ }
22
+ return source.statements.flatMap((statement) => {
23
+ if (!ts.isVariableStatement(statement)) {
24
+ return [];
25
+ }
26
+ const exported = statement.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword) === true;
27
+ return statement.declarationList.declarations.flatMap((variable) => {
28
+ const call = variable.initializer;
29
+ return call !== undefined && ts.isCallExpression(call) && ts.isIdentifier(call.expression) && locals.has(call.expression.text)
30
+ ? [{ definition: call.arguments[0], exported, variable }]
31
+ : [];
32
+ });
33
+ });
34
+ }
35
+ export function propertyOf(literal, name) {
36
+ return literal.properties.find((property) => property.name !== undefined && (ts.isIdentifier(property.name) || ts.isStringLiteral(property.name)) && property.name.text === name);
37
+ }
38
+ export function initializerOf(property) {
39
+ if (property === undefined) {
40
+ return undefined;
41
+ }
42
+ if (ts.isPropertyAssignment(property)) {
43
+ return property.initializer;
44
+ }
45
+ return ts.isShorthandPropertyAssignment(property) ? property.name : undefined;
46
+ }
47
+ //# sourceMappingURL=moduleCalls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moduleCalls.js","sourceRoot":"","sources":["../../src/adapters/moduleCalls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import ts from "typescript";
2
+ import type { ModuleFacts } from "#facts.ts";
3
+ export declare function moduleFacts(program: ts.Program, file: string): ModuleFacts;
4
+ //# sourceMappingURL=moduleFacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moduleFacts.d.ts","sourceRoot":"","sources":["../../src/adapters/moduleFacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAK5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAc7C,wBAAgB,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CA8C1E"}
@@ -0,0 +1,63 @@
1
+ import ts from "typescript";
2
+ import { copiedCode } from "#adapters/copiedCode.ts";
3
+ import { initializerOf, moduleCalls, propertyOf } from "#adapters/moduleCalls.ts";
4
+ import { operationFacts } from "#adapters/operationFacts.ts";
5
+ function readingFor(program, refuse) {
6
+ const checker = program.getTypeChecker();
7
+ return (label) => ({
8
+ checker,
9
+ program,
10
+ refuse: (type, path, instead) => {
11
+ refuse(`${label}: run returns ${checker.typeToString(type)} at ${path}, which has no exact wire form; ${instead}`);
12
+ return undefined;
13
+ },
14
+ });
15
+ }
16
+ export function moduleFacts(program, file) {
17
+ // Creating the checker binds the files, which sets the parent links that reading a node's text needs.
18
+ const checker = program.getTypeChecker();
19
+ const refusals = new Set();
20
+ function refuse(message) {
21
+ refusals.add(message);
22
+ }
23
+ const empty = { exportName: "", file, keyScope: undefined, middleware: undefined, name: "", operations: [], subject: undefined };
24
+ const source = program.getSourceFile(file);
25
+ const calls = source === undefined ? [] : moduleCalls(source);
26
+ const [call, ...others] = calls;
27
+ if (call === undefined || others.length > 0) {
28
+ return { ...empty, refusals: [`${file}: defines ${calls.length} modules; define exactly one module per file`] };
29
+ }
30
+ const definition = call.definition;
31
+ const nameValue = definition !== undefined && ts.isObjectLiteralExpression(definition) ? initializerOf(propertyOf(definition, "name")) : undefined;
32
+ if (definition === undefined || !ts.isObjectLiteralExpression(definition) || nameValue === undefined || !ts.isStringLiteral(nameValue)) {
33
+ return { ...empty, refusals: [`${file}: defineModule takes an object literal whose name is a string literal`] };
34
+ }
35
+ const name = nameValue.text;
36
+ const exportName = call.variable.name.getText();
37
+ if (!(call.exported && ts.isIdentifier(call.variable.name))) {
38
+ refuse(`${name}: export the module as a const, such as export const ${exportName} = defineModule(...)`);
39
+ }
40
+ const literal = definition;
41
+ function copy(field) {
42
+ const node = initializerOf(propertyOf(literal, field));
43
+ return node === undefined ? undefined : copiedCode({ checker, label: `${name} ${field}`, refuse }, node);
44
+ }
45
+ const list = initializerOf(propertyOf(definition, "operations"));
46
+ if (list === undefined || !ts.isArrayLiteralExpression(list)) {
47
+ refuse(`${name}: operations is an array literal of the module's operations`);
48
+ }
49
+ const reading = readingFor(program, refuse);
50
+ const elements = list !== undefined && ts.isArrayLiteralExpression(list) ? list.elements : [];
51
+ const operations = elements.flatMap((element) => operationFacts({ moduleName: name, reading, refuse }, element) ?? []);
52
+ return {
53
+ exportName,
54
+ file,
55
+ keyScope: copy("keyScope"),
56
+ middleware: copy("middleware"),
57
+ name,
58
+ operations,
59
+ refusals: [...refusals],
60
+ subject: copy("subject"),
61
+ };
62
+ }
63
+ //# sourceMappingURL=moduleFacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moduleFacts.js","sourceRoot":"","sources":["../../src/adapters/moduleFacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import ts from "typescript";
2
+ import { type TypeReading } from "#adapters/typeReading.ts";
3
+ import type { WireForm } from "#facts.ts";
4
+ type Read = (type: ts.Type, path: string) => WireForm | undefined;
5
+ export declare function classForm(reading: TypeReading, type: ts.Type, symbol: ts.Symbol, path: string): WireForm | undefined;
6
+ export declare function objectForm(reading: TypeReading, type: ts.Type, path: string, read: Read): WireForm | undefined;
7
+ export {};
8
+ //# sourceMappingURL=objectForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objectForm.d.ts","sourceRoot":"","sources":["../../src/adapters/objectForm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAgC,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE1F,OAAO,KAAK,EAAS,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEjD,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,QAAQ,GAAG,SAAS,CAAC;AAElE,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CASpH;AAgCD,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,QAAQ,GAAG,SAAS,CAwB9G"}
@@ -0,0 +1,66 @@
1
+ import ts from "typescript";
2
+ import { isReadonlyProperty } from "#adapters/isReadonlyProperty.ts";
3
+ import { declaredClass, isSchemaClass } from "#adapters/typeReading.ts";
4
+ import { unionForm } from "#adapters/unionForm.ts";
5
+ export function classForm(reading, type, symbol, path) {
6
+ if (!isSchemaClass(reading, symbol)) {
7
+ return reading.refuse(type, path, "return a plain object, or make the class a Schema class");
8
+ }
9
+ const declared = declaredClass(reading, symbol);
10
+ if (declared?.exportName === undefined) {
11
+ return reading.refuse(type, path, `export the Schema class ${symbol.name} from its module`);
12
+ }
13
+ return { declared, form: "class" };
14
+ }
15
+ // An exact optional property's only undefined member is the one optionality adds: TypeScript merges a written undefined
16
+ // into it, and the property is then not exact.
17
+ function optionalForm(reading, type, path, read) {
18
+ const members = type.isUnion() ? type.types.filter((member) => !(member.flags & ts.TypeFlags.Undefined)) : [type];
19
+ const [only] = members;
20
+ if (only === undefined) {
21
+ return reading.refuse(type, path, "give the optional property a type besides undefined, or drop it");
22
+ }
23
+ return members.length === 1 ? read(only, path) : unionForm(reading, type, members, path, read);
24
+ }
25
+ function fieldOf(reading, property, exact, path, read) {
26
+ const optional = (property.flags & ts.SymbolFlags.Optional) !== 0;
27
+ const type = reading.checker.getTypeOfSymbol(property);
28
+ if (optional && !exact.has(property)) {
29
+ return reading.refuse(type, path, `drop undefined from the optional property ${property.name}, so an absent key is the only way to leave it out`);
30
+ }
31
+ const form = optional ? optionalForm(reading, type, path, read) : read(type, path);
32
+ return form === undefined ? undefined : { form, mutable: !isReadonlyProperty(property), name: property.name, optional };
33
+ }
34
+ function recordForm(reading, type, path, read) {
35
+ const [index, ...others] = reading.checker.getIndexInfosOfType(type);
36
+ if (index === undefined || others.length > 0 || !(index.keyType.flags & ts.TypeFlags.String)) {
37
+ return reading.refuse(type, path, "use string keys only");
38
+ }
39
+ const value = read(index.type, `${path}[string]`);
40
+ return value === undefined ? undefined : { form: "record", mutable: !index.isReadonly, value };
41
+ }
42
+ export function objectForm(reading, type, path, read) {
43
+ if (type.getCallSignatures().length > 0 || type.getConstructSignatures().length > 0) {
44
+ return reading.refuse(type, path, "return data, not a function");
45
+ }
46
+ const symbol = type.getSymbol();
47
+ const builtIn = symbol !== undefined
48
+ && symbol.flags & ts.SymbolFlags.Interface
49
+ && symbol.declarations?.some((declaration) => reading.program.isSourceFileDefaultLibrary(declaration.getSourceFile()));
50
+ if (builtIn === true) {
51
+ return reading.refuse(type, path, "return a plain object, an array or a string-keyed record");
52
+ }
53
+ const properties = reading.checker.getPropertiesOfType(type);
54
+ const indexes = reading.checker.getIndexInfosOfType(type);
55
+ if (indexes.length > 0) {
56
+ return properties.length === 0 ? recordForm(reading, type, path, read) : reading.refuse(type, path, "use either fixed properties or a record");
57
+ }
58
+ const methods = properties.filter((property) => reading.checker.getTypeOfSymbol(property).getCallSignatures().length > 0);
59
+ if (methods.length > 0 || properties.some((property) => property.name.startsWith("__@"))) {
60
+ return reading.refuse(type, path, "return plain data, without methods or symbol keys");
61
+ }
62
+ const exact = new Set(reading.checker.getExactOptionalProperties(type));
63
+ const fields = properties.map((property) => fieldOf(reading, property, exact, `${path}.${property.name}`, read));
64
+ return fields.every((field) => field !== undefined) ? { fields, form: "struct" } : undefined;
65
+ }
66
+ //# sourceMappingURL=objectForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objectForm.js","sourceRoot":"","sources":["../../src/adapters/objectForm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import ts from "typescript";
2
+ import { type TypeReading } from "#adapters/typeReading.ts";
3
+ import type { OperationFacts } from "#facts.ts";
4
+ export interface OperationReading {
5
+ readonly moduleName: string;
6
+ readonly reading: (label: string) => TypeReading;
7
+ readonly refuse: (message: string) => void;
8
+ }
9
+ export declare function operationFacts(context: OperationReading, element: ts.Expression): OperationFacts | undefined;
10
+ //# sourceMappingURL=operationFacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operationFacts.d.ts","sourceRoot":"","sources":["../../src/adapters/operationFacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAI5B,OAAO,EAAE,KAAK,WAAW,EAAiB,MAAM,0BAA0B,CAAC;AAE3E,OAAO,KAAK,EAAY,cAAc,EAAE,MAAM,WAAW,CAAC;AAE1D,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,WAAW,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAqCD,wBAAgB,cAAc,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,GAAG,cAAc,GAAG,SAAS,CAmC5G"}
@@ -0,0 +1,72 @@
1
+ import ts from "typescript";
2
+ import { copiedCode } from "#adapters/copiedCode.ts";
3
+ import { failuresOf } from "#adapters/failuresOf.ts";
4
+ import { initializerOf, propertyOf } from "#adapters/moduleCalls.ts";
5
+ import { typeArguments } from "#adapters/typeReading.ts";
6
+ import { wireForm } from "#adapters/wireForm.ts";
7
+ function declarationOf(checker, element) {
8
+ const symbol = checker.getSymbolAtLocation(element);
9
+ const target = symbol !== undefined && symbol.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(symbol) : symbol;
10
+ const declaration = target?.valueDeclaration;
11
+ const call = declaration !== undefined && ts.isVariableDeclaration(declaration) ? declaration.initializer : undefined;
12
+ const literal = call !== undefined && ts.isCallExpression(call) ? call.arguments[1] : undefined;
13
+ return declaration === undefined || literal === undefined || !ts.isObjectLiteralExpression(literal) ? undefined : { declaration, literal };
14
+ }
15
+ // What an Effect-returning property of the operation succeeds and fails with.
16
+ function effectArguments(checker, owner, property, at) {
17
+ const symbol = owner.getProperty(property);
18
+ const [signature] = symbol === undefined ? [] : checker.getTypeOfSymbolAtLocation(symbol, at).getCallSignatures();
19
+ return signature === undefined ? [] : typeArguments(checker, signature.getReturnType());
20
+ }
21
+ function textOf(checker, owner, property) {
22
+ const symbol = owner.getProperty(property);
23
+ const value = symbol === undefined ? undefined : checker.getTypeOfSymbol(symbol);
24
+ return value?.isStringLiteral() === true ? value.value : undefined;
25
+ }
26
+ // Without run's types the operation did not compile; a run returning any is the common cause, and gets its own message.
27
+ function refuseUnread(context, label, literal) {
28
+ const reading = context.reading(label);
29
+ const run = propertyOf(literal, "run");
30
+ const signature = run !== undefined && ts.isMethodDeclaration(run) ? reading.checker.getSignatureFromDeclaration(run) : undefined;
31
+ const returned = signature === undefined ? undefined : typeArguments(reading.checker, signature.getReturnType())[1];
32
+ if (returned !== undefined && returned.flags & ts.TypeFlags.Any) {
33
+ reading.refuse(returned, "success", "decode the value with a schema, or give it a type");
34
+ }
35
+ else {
36
+ context.refuse(`${label}: run's result cannot be read; fix the compile errors on the operation first`);
37
+ }
38
+ }
39
+ export function operationFacts(context, element) {
40
+ const reading = context.reading(context.moduleName);
41
+ const found = declarationOf(reading.checker, element);
42
+ if (found === undefined) {
43
+ context.refuse(`${context.moduleName}: ${element.getText()} in operations is not a const built by query or command with an object literal`);
44
+ return undefined;
45
+ }
46
+ const type = reading.checker.getTypeAtLocation(found.declaration);
47
+ const name = textOf(reading.checker, type, "name") ?? element.getText();
48
+ const kind = textOf(reading.checker, type, "kind") === "command" ? "command" : "query";
49
+ const label = `${context.moduleName}.${name}`;
50
+ const [success, runError] = effectArguments(reading.checker, type, "run", found.declaration);
51
+ if (success === undefined) {
52
+ refuseUnread(context, label, found.literal);
53
+ }
54
+ const [, policyError] = kind === "query" ? effectArguments(reading.checker, type, "readPolicy", found.declaration) : [];
55
+ const literal = found.literal;
56
+ function copy(field, member) {
57
+ const property = propertyOf(literal, field);
58
+ const node = member ? property : initializerOf(property);
59
+ return node === undefined ? undefined : copiedCode({ checker: reading.checker, label: `${label} ${field}`, refuse: context.refuse }, node);
60
+ }
61
+ return {
62
+ failures: failuresOf(context.reading(label), [runError, policyError].flatMap((error) => error ?? [])),
63
+ invalidates: copy("invalidates", true),
64
+ kind,
65
+ name,
66
+ payload: copy("payload", false),
67
+ reads: copy("reads", true),
68
+ readsCollections: copy("readsCollections", true),
69
+ success: success === undefined ? undefined : wireForm(context.reading(label), success, "success"),
70
+ };
71
+ }
72
+ //# sourceMappingURL=operationFacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operationFacts.js","sourceRoot":"","sources":["../../src/adapters/operationFacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import * as NodeServices from "@effect/platform-node/NodeServices";
2
+ import { Effect, Layer } from "effect";
3
+ declare const services: Layer.Layer<import("effect/crypto/Aead").Aead | import("effect/crypto/Cipher").Cipher | import("effect/crypto/Digest").Digest | import("effect/crypto/Kdf").Kdf | import("effect/crypto/KeyAgreement").KeyAgreement | import("effect/crypto/KeyWrap").KeyWrap | import("effect/crypto/Mac").Mac | import("effect/crypto/SecureRandom").SecureRandom | import("effect/crypto/Signature").Signature | NodeServices.NodeServices, never, never>;
4
+ export declare function runNode<A, E>(effect: Effect.Effect<A, E, Layer.Success<typeof services>>): Promise<A>;
5
+ export {};
6
+ //# sourceMappingURL=runNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runNode.d.ts","sourceRoot":"","sources":["../../src/adapters/runNode.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAS,MAAM,EAAQ,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEpD,QAAA,MAAM,QAAQ,8aAAuD,CAAC;AAGtE,wBAAsB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAO3G"}
@@ -0,0 +1,14 @@
1
+ import * as NodeCrypto from "@effect/platform-node/NodeCrypto";
2
+ import * as NodeServices from "@effect/platform-node/NodeServices";
3
+ import { Cause, Effect, Exit, Layer } from "effect";
4
+ const services = Layer.mergeAll(NodeServices.layer, NodeCrypto.layer);
5
+ // Runs a generator effect for a tool that awaits a Promise, failing it with the effect's own error.
6
+ export async function runNode(effect) {
7
+ const exit = await Effect.runPromiseExit(Effect.provide(effect, services));
8
+ if (Exit.isSuccess(exit)) {
9
+ return exit.value;
10
+ }
11
+ const failure = Cause.squash(exit.cause);
12
+ throw failure instanceof Error ? failure : new Error(String(failure), { cause: failure });
13
+ }
14
+ //# sourceMappingURL=runNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runNode.js","sourceRoot":"","sources":["../../src/adapters/runNode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,kCAAkC,CAAC;AAC/D,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEpD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;AAEtE,oGAAoG;AACpG,MAAM,CAAC,KAAK,UAAU,OAAO,CAAO,MAA2D;IAC9F,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC3E,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3F,CAAC"}
@@ -0,0 +1,15 @@
1
+ import ts from "typescript";
2
+ import type { DeclaredClass, Literal } from "#facts.ts";
3
+ export interface TypeReading {
4
+ readonly checker: ts.TypeChecker;
5
+ readonly program: ts.Program;
6
+ readonly refuse: (type: ts.Type, path: string, instead: string) => undefined;
7
+ }
8
+ export declare function declaredIn(type: ts.Type, module: string): boolean;
9
+ export declare function isLibraryType(reading: TypeReading, type: ts.Type, name: string): boolean;
10
+ export declare function declaredClass(reading: TypeReading, symbol: ts.Symbol): DeclaredClass | undefined;
11
+ export declare function isSchemaClass(reading: TypeReading, symbol: ts.Symbol): boolean;
12
+ export declare function isReference(type: ts.Type): type is ts.TypeReference;
13
+ export declare function typeArguments(checker: ts.TypeChecker, type: ts.Type): readonly ts.Type[];
14
+ export declare function literalOf(checker: ts.TypeChecker, type: ts.Type): Literal | undefined;
15
+ //# sourceMappingURL=typeReading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeReading.d.ts","sourceRoot":"","sources":["../../src/adapters/typeReading.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAExD,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC;IAE7B,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,SAAS,CAAC;CAC7E;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAGjE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAMxF;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,aAAa,GAAG,SAAS,CAchG;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,OAAO,CAO9E;AAGD,wBAAgB,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,aAAa,CAEnE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,SAAS,EAAE,CAAC,IAAI,EAAE,CAExF;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,GAAG,SAAS,CAKrF"}
@@ -0,0 +1,46 @@
1
+ import ts from "typescript";
2
+ export function declaredIn(type, module) {
3
+ const pattern = new RegExp(`[/\\\\]effect[/\\\\](?:dist|src)[/\\\\]${module}\\.(?:d\\.)?ts$`, "u");
4
+ return (type.aliasSymbol ?? type.getSymbol())?.declarations?.some((declaration) => pattern.test(declaration.getSourceFile().fileName)) === true;
5
+ }
6
+ export function isLibraryType(reading, type, name) {
7
+ const symbol = type.getSymbol();
8
+ return (symbol?.name === name
9
+ && symbol.declarations?.some((declaration) => reading.program.isSourceFileDefaultLibrary(declaration.getSourceFile())) === true);
10
+ }
11
+ export function declaredClass(reading, symbol) {
12
+ const declaration = symbol.declarations?.find(ts.isClassDeclaration);
13
+ if (declaration === undefined) {
14
+ return undefined;
15
+ }
16
+ const file = declaration.getSourceFile();
17
+ const module = reading.checker.getSymbolAtLocation(file);
18
+ const exported = module === undefined
19
+ ? undefined
20
+ : reading.checker
21
+ .getExportsOfModule(module)
22
+ .find((candidate) => (candidate.flags & ts.SymbolFlags.Alias ? reading.checker.getAliasedSymbol(candidate) : candidate) === symbol);
23
+ return { className: symbol.name, exportName: exported?.name, file: file.fileName };
24
+ }
25
+ export function isSchemaClass(reading, symbol) {
26
+ const declaration = symbol.declarations?.find(ts.isClassDeclaration);
27
+ if (declaration === undefined) {
28
+ return false;
29
+ }
30
+ const staticSide = reading.checker.getTypeOfSymbolAtLocation(symbol, declaration);
31
+ return staticSide.getProperty("ast") !== undefined && staticSide.getProperty("fields") !== undefined;
32
+ }
33
+ // Array, tuple and generic interface instances, such as Effect<A, E, R>, are references that carry their type arguments.
34
+ export function isReference(type) {
35
+ return "target" in type;
36
+ }
37
+ export function typeArguments(checker, type) {
38
+ return isReference(type) ? checker.getTypeArguments(type) : [];
39
+ }
40
+ export function literalOf(checker, type) {
41
+ if (type.flags & ts.TypeFlags.BooleanLiteral) {
42
+ return checker.typeToString(type) === "true";
43
+ }
44
+ return type.isStringLiteral() || type.isNumberLiteral() ? type.value : undefined;
45
+ }
46
+ //# sourceMappingURL=typeReading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeReading.js","sourceRoot":"","sources":["../../src/adapters/typeReading.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { Effect } from "effect";
2
+ import ts from "typescript";
3
+ import { BuildFailure } from "#BuildFailure.ts";
4
+ export interface ProjectConfig {
5
+ readonly chain: readonly string[];
6
+ readonly declarations: readonly string[];
7
+ readonly files: readonly string[];
8
+ readonly options: ts.CompilerOptions;
9
+ readonly typeScriptVersion: string;
10
+ }
11
+ export declare const readConfig: (tsconfig: string) => Effect.Effect<ProjectConfig, BuildFailure, never>;
12
+ export declare function definesModule(file: string, text: string): boolean;
13
+ export declare const resolvedImports: (config: ProjectConfig, file: string, text: string) => Effect.Effect<string[], never, never>;
14
+ export declare const deriveModules: (config: ProjectConfig, modules: readonly string[]) => Effect.Effect<import("../facts.ts").ModuleFacts[], BuildFailure, never>;
15
+ //# sourceMappingURL=typeScript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeScript.d.ts","sourceRoot":"","sources":["../../src/adapters/typeScript.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,MAAM,YAAY,CAAC;AAG5B,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,WAAW,aAAa;IAE7B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC;IACrC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACnC;AAUD,eAAO,MAAM,UAAU,yEAiBrB,CAAC;AAEH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED,eAAO,MAAM,eAAe,8FAO1B,CAAC;AAqCH,eAAO,MAAM,aAAa,gIAQxB,CAAC"}
@@ -0,0 +1,81 @@
1
+ import { createHash } from "node:crypto";
2
+ import { dirname } from "node:path";
3
+ import { Effect } from "effect";
4
+ import ts from "typescript";
5
+ import { moduleCalls } from "#adapters/moduleCalls.ts";
6
+ import { moduleFacts } from "#adapters/moduleFacts.ts";
7
+ import { BuildFailure } from "#BuildFailure.ts";
8
+ function diagnosticText(diagnostics) {
9
+ return ts.formatDiagnostics(diagnostics, {
10
+ getCanonicalFileName: (name) => name,
11
+ getCurrentDirectory: ts.sys.getCurrentDirectory,
12
+ getNewLine: () => "\n",
13
+ });
14
+ }
15
+ export const readConfig = Effect.fn("Build.readConfig")(function* (tsconfig) {
16
+ const parsed = yield* Effect.sync(() => {
17
+ const source = ts.readJsonConfigFile(tsconfig, ts.sys.readFile);
18
+ const config = ts.parseJsonSourceFileConfigFileContent(source, ts.sys, dirname(tsconfig), undefined, tsconfig);
19
+ return { config, problems: config.errors, source };
20
+ });
21
+ if (parsed.problems.length > 0) {
22
+ return yield* new BuildFailure({ message: `${tsconfig} cannot be read:\n${diagnosticText(parsed.problems)}` });
23
+ }
24
+ const config = {
25
+ chain: [tsconfig, ...(parsed.source.extendedSourceFiles ?? [])],
26
+ declarations: parsed.config.fileNames.filter((file) => file.endsWith(".d.ts")),
27
+ files: parsed.config.fileNames,
28
+ options: parsed.config.options,
29
+ typeScriptVersion: ts.version,
30
+ };
31
+ return config;
32
+ });
33
+ export function definesModule(file, text) {
34
+ return text.includes("defineModule") && moduleCalls(ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true)).length > 0;
35
+ }
36
+ export const resolvedImports = Effect.fn("Build.resolvedImports")(function* (config, file, text) {
37
+ return yield* Effect.sync(() => ts.preProcessFile(text, true, true).importedFiles.flatMap(({ fileName }) => {
38
+ const resolved = ts.resolveModuleName(fileName, file, config.options, ts.sys).resolvedModule;
39
+ return resolved === undefined ? [] : [resolved.resolvedFileName];
40
+ }));
41
+ });
42
+ // Building the program is the expensive part of a run, and parsing the installed packages' declarations is most of it. They rarely
43
+ // change between the runs of one process, such as a dev server's, so the registry hands a later program each file it parsed with the same text and settings.
44
+ const parsedFiles = ts.createDocumentRegistry(ts.sys.useCaseSensitiveFileNames);
45
+ function programHost(options, rootNames) {
46
+ const texts = new Map();
47
+ function textOf(file) {
48
+ if (!texts.has(file)) {
49
+ texts.set(file, ts.sys.readFile(file));
50
+ }
51
+ return texts.get(file);
52
+ }
53
+ return {
54
+ directoryExists: ts.sys.directoryExists,
55
+ fileExists: ts.sys.fileExists,
56
+ getCompilationSettings: () => options,
57
+ getCurrentDirectory: ts.sys.getCurrentDirectory,
58
+ getDefaultLibFileName: ts.getDefaultLibFilePath,
59
+ getDirectories: ts.sys.getDirectories,
60
+ getScriptFileNames: () => [...rootNames],
61
+ getScriptSnapshot: (file) => {
62
+ const text = textOf(file);
63
+ return text === undefined ? undefined : ts.ScriptSnapshot.fromString(text);
64
+ },
65
+ getScriptVersion: (file) => createHash("sha256")
66
+ .update(textOf(file) ?? "")
67
+ .digest("hex"),
68
+ readDirectory: ts.sys.readDirectory,
69
+ readFile: textOf,
70
+ ...(ts.sys.realpath === undefined ? {} : { realpath: ts.sys.realpath }),
71
+ useCaseSensitiveFileNames: () => ts.sys.useCaseSensitiveFileNames,
72
+ };
73
+ }
74
+ export const deriveModules = Effect.fn("Build.deriveModules")(function* (config, modules) {
75
+ const program = yield* Effect.sync(() => ts.createLanguageService(programHost({ ...config.options, noEmit: true }, [...modules, ...config.declarations]), parsedFiles).getProgram());
76
+ if (program === undefined) {
77
+ return yield* new BuildFailure({ message: "TypeScript's language service built no program" });
78
+ }
79
+ return yield* Effect.sync(() => modules.map((module) => moduleFacts(program, module)));
80
+ });
81
+ //# sourceMappingURL=typeScript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeScript.js","sourceRoot":"","sources":["../../src/adapters/typeScript.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import ts from "typescript";
2
+ import { type TypeReading } from "#adapters/typeReading.ts";
3
+ import type { WireForm } from "#facts.ts";
4
+ type Read = (type: ts.Type, path: string) => WireForm | undefined;
5
+ export declare function unionForm(reading: TypeReading, type: ts.Type, members: readonly ts.Type[], path: string, read: Read): WireForm | undefined;
6
+ export {};
7
+ //# sourceMappingURL=unionForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unionForm.d.ts","sourceRoot":"","sources":["../../src/adapters/unionForm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAyB,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEnF,OAAO,KAAK,EAAW,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEnD,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,QAAQ,GAAG,SAAS,CAAC;AA0ElE,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,QAAQ,GAAG,SAAS,CAQ1I"}