@shivaedev/build 0.0.0-stage → 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 +216 -2
  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 +89 -3
  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,78 @@
1
+ import ts from "typescript";
2
+ import { declaredIn, literalOf } from "#adapters/typeReading.ts";
3
+ import { byText } from "#byText.ts";
4
+ function discriminant(reading, members) {
5
+ const [first] = members;
6
+ const candidates = first === undefined ? [] : reading.checker.getPropertiesOfType(first).map((property) => property.name);
7
+ return candidates.sort().find((name) => {
8
+ const values = members.map((member) => {
9
+ const property = member.getProperty(name);
10
+ return property === undefined || property.flags & ts.SymbolFlags.Optional
11
+ ? undefined
12
+ : literalOf(reading.checker, reading.checker.getTypeOfSymbol(property));
13
+ });
14
+ return values.every((value) => value !== undefined) && new Set(values).size === values.length;
15
+ });
16
+ }
17
+ function byValue(left, right) {
18
+ return byText(String(left), String(right));
19
+ }
20
+ function discriminated(reading, members, tag, path, read) {
21
+ function tagOf(member) {
22
+ const property = member.getProperty(tag);
23
+ return (property === undefined ? undefined : literalOf(reading.checker, reading.checker.getTypeOfSymbol(property))) ?? "";
24
+ }
25
+ const forms = [...members]
26
+ .sort((left, right) => byValue(tagOf(left), tagOf(right)))
27
+ .map((member) => read(member, `${path}<${tag}: ${tagOf(member)}>`));
28
+ return forms.every((form) => form !== undefined) ? { form: "union", members: forms } : undefined;
29
+ }
30
+ function optionValue(reading, members) {
31
+ const some = members.find((member) => member.getSymbol()?.name === "Some" && declaredIn(member, "Option"));
32
+ const none = members.find((member) => member.getSymbol()?.name === "None" && declaredIn(member, "Option"));
33
+ const value = some?.getProperty("value");
34
+ return none === undefined || value === undefined ? undefined : reading.checker.getTypeOfSymbol(value);
35
+ }
36
+ function withoutNull(reading, type, all, path, read) {
37
+ const members = all.filter((member) => !(member.flags & ts.TypeFlags.Null));
38
+ const [only] = members;
39
+ if (members.length === 1 && only !== undefined && only.flags & (ts.TypeFlags.Undefined | ts.TypeFlags.Void)) {
40
+ return reading.refuse(type, path, "return either null or undefined, since the wire carries both as one");
41
+ }
42
+ const booleans = members.filter((member) => member.flags & ts.TypeFlags.BooleanLiteral);
43
+ const optionInner = optionValue(reading, members);
44
+ if (optionInner !== undefined && members.length === 2) {
45
+ const inner = read(optionInner, `${path}<Some>`);
46
+ return inner === undefined ? undefined : { form: "option", inner };
47
+ }
48
+ if (booleans.length === 2 && members.length === 2) {
49
+ return { form: "primitive", primitive: "Boolean" };
50
+ }
51
+ if (members.length === 1 && only !== undefined) {
52
+ return read(only, path);
53
+ }
54
+ if (members.some((member) => member.flags & ts.TypeFlags.Undefined)) {
55
+ return reading.refuse(type, path, "return null instead of undefined, or make the property optional");
56
+ }
57
+ const values = members.map((member) => literalOf(reading.checker, member));
58
+ if (values.every((value) => value !== undefined)) {
59
+ return { form: "literals", values: values.sort(byValue) };
60
+ }
61
+ const objects = members.every((member) => member.flags & ts.TypeFlags.Object && !reading.checker.isArrayType(member) && !reading.checker.isTupleType(member));
62
+ const tag = objects ? discriminant(reading, members) : undefined;
63
+ if (tag !== undefined) {
64
+ return discriminated(reading, members, tag, path, read);
65
+ }
66
+ return reading.refuse(type, path, "return string, number or boolean literals, or objects told apart by one literal field such as _tag");
67
+ }
68
+ // The members are the union's own, or an optional property's without the undefined its optionality adds.
69
+ export function unionForm(reading, type, members, path, read) {
70
+ if (type.aliasSymbol?.name === "Option" && declaredIn(type, "Option") && type.aliasTypeArguments?.[0] !== undefined) {
71
+ const inner = read(type.aliasTypeArguments[0], `${path}<Some>`);
72
+ return inner === undefined ? undefined : { form: "option", inner };
73
+ }
74
+ const inner = withoutNull(reading, type, members, path, read);
75
+ const nullable = members.some((member) => member.flags & ts.TypeFlags.Null);
76
+ return inner === undefined || !nullable ? inner : { form: "nullOr", inner };
77
+ }
78
+ //# sourceMappingURL=unionForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unionForm.js","sourceRoot":"","sources":["../../src/adapters/unionForm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Plugin } from "vite";
2
+ export interface BuildPluginOptions {
3
+ readonly bundleCheck?: boolean;
4
+ readonly serverOnly?: readonly string[];
5
+ }
6
+ export declare function buildPlugin({ bundleCheck: checked, serverOnly }?: BuildPluginOptions): Plugin[];
7
+ //# sourceMappingURL=vitePlugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitePlugin.d.ts","sourceRoot":"","sources":["../../src/adapters/vitePlugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAsC,MAAM,EAAyC,MAAM,MAAM,CAAC;AAK9G,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AA2FD,wBAAgB,WAAW,CAAC,EAAE,WAAW,EAAE,OAAc,EAAE,UAAe,EAAE,GAAE,kBAAuB,GAAG,MAAM,EAAE,CAE/G"}
@@ -0,0 +1,88 @@
1
+ import { Option } from "effect";
2
+ import { bundleCheck } from "#adapters/bundleCheck.ts";
3
+ import { runNode } from "#adapters/runNode.ts";
4
+ import { watchedGeneration } from "#generateRound.ts";
5
+ function tellTheBrowser(environment, devServer, refusal, file) {
6
+ if (Option.isSome(refusal)) {
7
+ devServer.config.logger.error(refusal.value, { timestamp: true });
8
+ environment.hot.send({ err: { message: refusal.value, plugin: "shivaedev:build", stack: "" }, type: "error" });
9
+ return;
10
+ }
11
+ environment.hot.send({ path: "*", triggeredBy: file, type: "full-reload" });
12
+ }
13
+ function generateFiles() {
14
+ let config;
15
+ let server;
16
+ let generation;
17
+ let started;
18
+ let outputs = new Set();
19
+ // One change reaches hotUpdate once per environment; they share one run.
20
+ const shared = new Map();
21
+ function remember(round) {
22
+ outputs = new Set([...outputs, ...round.outputs]);
23
+ if (server !== undefined) {
24
+ const root = server.config.root;
25
+ server.watcher.add(round.inputs.filter((file) => !file.startsWith(root)));
26
+ }
27
+ return round;
28
+ }
29
+ function sharedRound(changed, file, timestamp, environments) {
30
+ const key = `${timestamp}\u0000${file}`;
31
+ const entry = shared.get(key) ?? { round: runNode(changed(file)), seenBy: 0 };
32
+ entry.seenBy += 1;
33
+ shared.set(key, entry);
34
+ if (entry.seenBy === environments) {
35
+ shared.delete(key);
36
+ }
37
+ return entry.round;
38
+ }
39
+ return {
40
+ async buildStart() {
41
+ generation ??= runNode(watchedGeneration(config?.root ?? "."));
42
+ const { run } = await generation;
43
+ started ??= runNode(run);
44
+ const round = remember(await started);
45
+ if (Option.isSome(round.refusal)) {
46
+ this.error(round.refusal.value);
47
+ }
48
+ },
49
+ configResolved(resolved) {
50
+ config = resolved;
51
+ },
52
+ configureServer(devServer) {
53
+ server = devServer;
54
+ },
55
+ enforce: "pre",
56
+ async hotUpdate({ file, modules, server: devServer, timestamp }) {
57
+ // A run hands Vite the modules of each file it rewrites and reloads the page when it creates one, since a page may have failed
58
+ // to resolve it, so the watcher's own event for that write would reload twice.
59
+ if (outputs.has(file)) {
60
+ return [];
61
+ }
62
+ if (generation === undefined) {
63
+ return;
64
+ }
65
+ const known = outputs;
66
+ const { changed } = await generation;
67
+ const round = Option.map(await sharedRound(changed, file, timestamp, Object.keys(devServer.environments).length), remember);
68
+ if (Option.isNone(round)) {
69
+ return;
70
+ }
71
+ if (Option.isSome(round.value.refusal) || round.value.changed.some((output) => !known.has(output))) {
72
+ if (this.environment.config.consumer === "client") {
73
+ tellTheBrowser(this.environment, devServer, round.value.refusal, file);
74
+ }
75
+ return [];
76
+ }
77
+ const regenerated = round.value.changed.flatMap((output) => [
78
+ ...(this.environment.moduleGraph.getModulesByFile(output) ?? []),
79
+ ]);
80
+ return [...modules, ...regenerated];
81
+ },
82
+ name: "shivaedev:build-generate",
83
+ };
84
+ }
85
+ export function buildPlugin({ bundleCheck: checked = true, serverOnly = [] } = {}) {
86
+ return checked ? [generateFiles(), bundleCheck(serverOnly)] : [generateFiles()];
87
+ }
88
+ //# sourceMappingURL=vitePlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitePlugin.js","sourceRoot":"","sources":["../../src/adapters/vitePlugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function vitePort(name: string, fallback: number): number;
2
+ //# sourceMappingURL=vitePort.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitePort.d.ts","sourceRoot":"","sources":["../../src/adapters/vitePort.ts"],"names":[],"mappings":"AAEA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE/D"}
@@ -0,0 +1,5 @@
1
+ import { Config, ConfigProvider, Effect } from "effect";
2
+ export function vitePort(name, fallback) {
3
+ return Effect.runSync(Config.Int(name).pipe(Config.withDefault(fallback)).parse(ConfigProvider.fromEnv()));
4
+ }
5
+ //# sourceMappingURL=vitePort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitePort.js","sourceRoot":"","sources":["../../src/adapters/vitePort.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAExD,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,QAAgB;IACtD,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAC5G,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TestProject } from "vitest/node";
2
+ export declare function setup(project: TestProject): Promise<void>;
3
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/adapters/vitest/setup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C,wBAAsB,KAAK,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAK/D"}
@@ -0,0 +1,11 @@
1
+ import { Option } from "effect";
2
+ import { runNode } from "#adapters/runNode.ts";
3
+ import { generateRound } from "#generateRound.ts";
4
+ // A Vitest global setup: every module's files are written before the first test file loads, and a refusal stops the run.
5
+ export async function setup(project) {
6
+ const round = await runNode(generateRound(project.config.root));
7
+ if (Option.isSome(round.refusal)) {
8
+ throw new Error(round.refusal.value);
9
+ }
10
+ }
11
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/adapters/vitest/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,yHAAyH;AACzH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,OAAoB;IAC/C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;AACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ import ts from "typescript";
2
+ import { type TypeReading } from "#adapters/typeReading.ts";
3
+ import type { WireForm } from "#facts.ts";
4
+ export declare function wireForm(reading: TypeReading, type: ts.Type, path: string, seen?: ReadonlySet<ts.Type>): WireForm | undefined;
5
+ //# sourceMappingURL=wireForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wireForm.d.ts","sourceRoot":"","sources":["../../src/adapters/wireForm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAqD,KAAK,WAAW,EAAiB,MAAM,0BAA0B,CAAC;AAE9H,OAAO,KAAK,EAAa,QAAQ,EAAE,MAAM,WAAW,CAAC;AAkErD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAW,CAAC,EAAE,CAAC,IAAI,CAAa,GAAG,QAAQ,GAAG,SAAS,CA2BxI"}
@@ -0,0 +1,91 @@
1
+ import ts from "typescript";
2
+ import { classForm, objectForm } from "#adapters/objectForm.ts";
3
+ import { declaredIn, isLibraryType, isReference, literalOf, typeArguments } from "#adapters/typeReading.ts";
4
+ import { unionForm } from "#adapters/unionForm.ts";
5
+ const PRIMITIVES = [
6
+ [ts.TypeFlags.String, "String"],
7
+ [ts.TypeFlags.Number, "Number"],
8
+ [ts.TypeFlags.Boolean, "Boolean"],
9
+ [ts.TypeFlags.BigInt, "BigInt"],
10
+ [ts.TypeFlags.Null, "Null"],
11
+ [ts.TypeFlags.Void, "Void"],
12
+ [ts.TypeFlags.Undefined, "Undefined"],
13
+ ];
14
+ const UNMAPPED = [
15
+ [ts.TypeFlags.Any, "decode the value with a schema, or give it a type"],
16
+ [ts.TypeFlags.Unknown, "decode the value with a schema, or give it a type"],
17
+ [ts.TypeFlags.Never, "return a value, or nothing"],
18
+ [ts.TypeFlags.EnumLike, "return string or number literals instead of an enum"],
19
+ [ts.TypeFlags.TemplateLiteral | ts.TypeFlags.StringMapping, "return string"],
20
+ [ts.TypeFlags.ESSymbolLike, "return a string instead of a symbol"],
21
+ [ts.TypeFlags.TypeParameter | ts.TypeFlags.Index | ts.TypeFlags.IndexedAccess | ts.TypeFlags.Conditional, "give run's return a concrete type"],
22
+ [ts.TypeFlags.NonPrimitive, "return a type with known properties"],
23
+ ];
24
+ function arrayForm(reading, type, path, seen) {
25
+ const [element] = typeArguments(reading.checker, type);
26
+ const item = element === undefined ? undefined : wireForm(reading, element, `${path}[number]`, seen);
27
+ return item === undefined ? undefined : { form: "array", item, mutable: type.getSymbol()?.name === "Array" };
28
+ }
29
+ function isTuple(target) {
30
+ return "elementFlags" in target;
31
+ }
32
+ function tupleForm(reading, type, path, seen) {
33
+ const target = type.target;
34
+ if (!isTuple(target) || target.elementFlags.some((flags) => flags !== ts.ElementFlags.Required)) {
35
+ return reading.refuse(type, path, "use an array, or a tuple of required elements");
36
+ }
37
+ const elements = reading.checker
38
+ .getTypeArguments(type)
39
+ .slice(0, target.elementFlags.length)
40
+ .map((element, index) => wireForm(reading, element, `${path}[${index}]`, seen));
41
+ return elements.every((element) => element !== undefined) ? { elements, form: "tuple", mutable: !target.readonly } : undefined;
42
+ }
43
+ function objectTypeForm(reading, type, path, seen) {
44
+ if (isLibraryType(reading, type, "Date")) {
45
+ return { form: "primitive", primitive: "Date" };
46
+ }
47
+ if (declaredIn(type, "DateTime") && type.getSymbol()?.name === "Utc") {
48
+ return { form: "primitive", primitive: "DateTimeUtc" };
49
+ }
50
+ if (reading.checker.isTupleType(type) && isReference(type)) {
51
+ return tupleForm(reading, type, path, seen);
52
+ }
53
+ if (reading.checker.isArrayType(type)) {
54
+ return arrayForm(reading, type, path, seen);
55
+ }
56
+ const symbol = type.getSymbol();
57
+ if (symbol !== undefined && symbol.flags & ts.SymbolFlags.Class) {
58
+ return classForm(reading, type, symbol, path);
59
+ }
60
+ return objectForm(reading, type, path, (property, propertyPath) => wireForm(reading, property, propertyPath, seen));
61
+ }
62
+ // The schema whose Type is exactly this type, or undefined after refusing it: the wire never carries a looser form.
63
+ export function wireForm(reading, type, path, seen = new Set()) {
64
+ if (seen.has(type)) {
65
+ return reading.refuse(type, path, "return a type that does not contain itself");
66
+ }
67
+ const within = new Set([...seen, type]);
68
+ const primitive = PRIMITIVES.find(([flags]) => type.flags & flags);
69
+ if (primitive !== undefined) {
70
+ return { form: "primitive", primitive: primitive[1] };
71
+ }
72
+ const unmapped = UNMAPPED.find(([flags]) => type.flags & flags);
73
+ if (unmapped !== undefined) {
74
+ return reading.refuse(type, path, unmapped[1]);
75
+ }
76
+ const literal = literalOf(reading.checker, type);
77
+ if (literal !== undefined) {
78
+ return { form: "literals", values: [literal] };
79
+ }
80
+ if (type.isUnion()) {
81
+ return unionForm(reading, type, type.types, path, (member, memberPath) => wireForm(reading, member, memberPath, within));
82
+ }
83
+ if (type.isIntersection() && type.types.some((member) => !(member.flags & ts.TypeFlags.Object))) {
84
+ return reading.refuse(type, path, "return the unbranded type, or wrap the value in an exported Schema class");
85
+ }
86
+ if (type.flags & ts.TypeFlags.Object || type.isIntersection()) {
87
+ return objectTypeForm(reading, type, path, within);
88
+ }
89
+ return reading.refuse(type, path, "return plain data");
90
+ }
91
+ //# sourceMappingURL=wireForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wireForm.js","sourceRoot":"","sources":["../../src/adapters/wireForm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAoB,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9H,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,MAAM,UAAU,GAAoD;IACnE,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC/B,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC/B,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC;IACjC,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC/B,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC;IAC3B,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC;IAC3B,CAAC,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,WAAW,CAAC;CACrC,CAAC;AAEF,MAAM,QAAQ,GAAiD;IAC9D,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,mDAAmD,CAAC;IACvE,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,mDAAmD,CAAC;IAC3E,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,4BAA4B,CAAC;IAClD,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,qDAAqD,CAAC;IAC9E,CAAC,EAAE,CAAC,SAAS,CAAC,eAAe,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,eAAe,CAAC;IAC5E,CAAC,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,qCAAqC,CAAC;IAClE,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,GAAG,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,mCAAmC,CAAC;IAC9I,CAAC,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,qCAAqC,CAAC;CAClE,CAAC;AAEF,SAAS,SAAS,CAAC,OAAoB,EAAE,IAAa,EAAE,IAAY,EAAE,IAA0B;IAC/F,MAAM,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,CAAC;IACrG,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;AAC9G,CAAC;AAED,SAAS,OAAO,CAAC,MAAsB;IACtC,OAAO,cAAc,IAAI,MAAM,CAAC;AACjC,CAAC;AAED,SAAS,SAAS,CAAC,OAAoB,EAAE,IAAsB,EAAE,IAAY,EAAE,IAA0B;IACxG,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjG,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,+CAA+C,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO;SAC9B,gBAAgB,CAAC,IAAI,CAAC;SACtB,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;SACpC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IACjF,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAChI,CAAC;AAED,SAAS,cAAc,CAAC,OAAoB,EAAE,IAAa,EAAE,IAAY,EAAE,IAA0B;IACpG,IAAI,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IACjD,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,KAAK,KAAK,EAAE,CAAC;QACtE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;IACxD,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,OAAO,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,OAAO,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAChC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACjE,OAAO,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;AACrH,CAAC;AAED,oHAAoH;AACpH,MAAM,UAAU,QAAQ,CAAC,OAAoB,EAAE,IAAa,EAAE,IAAY,EAAE,IAAI,GAAyB,IAAI,GAAG,EAAE;IACjH,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,4CAA4C,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;IACnE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;IAChE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACjD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAChD,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1H,CAAC;IACD,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACjG,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,0EAA0E,CAAC,CAAC;IAC/G,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QAC/D,OAAO,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function byText(left: string, right: string): number;
2
+ //# sourceMappingURL=byText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"byText.d.ts","sourceRoot":"","sources":["../src/byText.ts"],"names":[],"mappings":"AACA,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK1D"}
package/dist/byText.js ADDED
@@ -0,0 +1,8 @@
1
+ // Code-unit order, so output is the same on every machine, unlike localeCompare.
2
+ export function byText(left, right) {
3
+ if (left < right) {
4
+ return -1;
5
+ }
6
+ return left > right ? 1 : 0;
7
+ }
8
+ //# sourceMappingURL=byText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"byText.js","sourceRoot":"","sources":["../src/byText.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,KAAa;IACjD,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,CAAC,CAAC;IACX,CAAC;IACD,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Effect, Option, Path, Schema } from "effect";
2
+ export declare const cachedOutput: (root: string, module: string, key: string) => Effect.Effect<Option.Option<string>, import("effect/PlatformError").PlatformError, import("effect/FileSystem").FileSystem | Path.Path>;
3
+ export declare const recordOutput: (root: string, module: string, key: string, content: string) => Effect.Effect<void, import("effect/PlatformError").PlatformError | Schema.SchemaError, import("effect/FileSystem").FileSystem | Path.Path>;
4
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAiBtD,eAAO,MAAM,YAAY,uLAMvB,CAAC;AAEH,eAAO,MAAM,YAAY,4MAEvB,CAAC"}
package/dist/cache.js ADDED
@@ -0,0 +1,19 @@
1
+ import { Effect, Option, Path, Schema } from "effect";
2
+ import { readIfPresent, writeAtomically } from "#files.ts";
3
+ const CacheRecord = Schema.Struct({ content: Schema.String, key: Schema.String });
4
+ const CacheJson = Schema.fromJsonString(CacheRecord);
5
+ const decodeRecord = Schema.decodeUnknownOption(CacheJson);
6
+ const encodeRecord = Schema.encodeEffect(CacheJson);
7
+ const recordPath = Effect.fn("Build.recordPath")(function* (root, module) {
8
+ const path = yield* Path.Path;
9
+ return path.join(root, "node_modules", ".cache", "@shivaedev", "build", `${path.relative(root, module)}.json`);
10
+ });
11
+ // The output of the last run whose inputs had this key; another key, or an unreadable record, means the module must be derived.
12
+ export const cachedOutput = Effect.fn("Build.cachedOutput")(function* (root, module, key) {
13
+ const text = yield* readIfPresent(yield* recordPath(root, module));
14
+ return Option.filter(Option.flatMap(text, (json) => decodeRecord(json)), (record) => record.key === key).pipe(Option.map((record) => record.content));
15
+ });
16
+ export const recordOutput = Effect.fn("Build.recordOutput")(function* (root, module, key, content) {
17
+ yield* writeAtomically(yield* recordPath(root, module), yield* encodeRecord({ content, key }));
18
+ });
19
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE3D,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAElF,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;AAErD,MAAM,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;AAE3D,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;AAEpD,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAY,EAAE,MAAc;IACvF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;AAChH,CAAC,CAAC,CAAC;AAEH,gIAAgI;AAChI,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAY,EAAE,MAAc,EAAE,GAAW;IAC/G,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACnE,OAAO,MAAM,CAAC,MAAM,CACnB,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAClD,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,GAAG,CAC9B,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAY,EAAE,MAAc,EAAE,GAAW,EAAE,OAAe;IAChI,KAAK,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AAChG,CAAC,CAAC,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import * as NodeCrypto from "@effect/platform-node/NodeCrypto";
3
+ import * as NodeRuntime from "@effect/platform-node/NodeRuntime";
4
+ import * as NodeServices from "@effect/platform-node/NodeServices";
5
+ import { Cause, Console, Effect } from "effect";
6
+ import { CliError, Command } from "effect/cli";
7
+ import { buildCommand } from "#command.ts";
8
+ import packageInfo from "#package.json" with { type: "json" };
9
+ const main = Command.run(buildCommand, { version: packageInfo.version }).pipe(Effect.tapError((error) => (CliError.isCliError(error) || error._tag === "GenerateFailed" ? Effect.void : Console.error(error.message))), Effect.tapCause((cause) => (Cause.hasDies(cause) ? Console.error(Cause.pretty(cause)) : Effect.void)), Effect.provide([NodeServices.layer, NodeCrypto.layer]));
10
+ NodeRuntime.runMain(main, { disableErrorReporting: true });
11
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,UAAU,MAAM,kCAAkC,CAAC;AAC/D,OAAO,KAAK,WAAW,MAAM,mCAAmC,CAAC;AACjE,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,WAAW,MAAM,eAAe,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAE9D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAC5E,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EACxI,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EACrG,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CACtD,CAAC;AAEF,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC"}
package/dist/code.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ export interface ImportRef {
2
+ readonly name: string;
3
+ readonly preferred: string;
4
+ readonly specifier: string;
5
+ readonly typeOnly: boolean;
6
+ }
7
+ export type Code = readonly (string | ImportRef)[];
8
+ export declare const SCHEMA: ImportRef;
9
+ export declare function code(...parts: readonly (string | ImportRef | Code)[]): Code;
10
+ export declare function joined(items: readonly Code[], separator: string): Code;
11
+ //# sourceMappingURL=code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code.d.ts","sourceRoot":"","sources":["../src/code.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;AAEnD,eAAO,MAAM,MAAM,EAAE,SAAyF,CAAC;AAM/G,wBAAgB,IAAI,CAAC,GAAG,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAE3E;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAEtE"}
package/dist/code.js ADDED
@@ -0,0 +1,11 @@
1
+ export const SCHEMA = { name: "Schema", preferred: "Schema", specifier: "effect", typeOnly: false };
2
+ function isCode(part) {
3
+ return Array.isArray(part);
4
+ }
5
+ export function code(...parts) {
6
+ return parts.flatMap((part) => (isCode(part) ? part : [part]));
7
+ }
8
+ export function joined(items, separator) {
9
+ return items.flatMap((item, index) => (index === 0 ? item : [separator, ...item]));
10
+ }
11
+ //# sourceMappingURL=code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code.js","sourceRoot":"","sources":["../src/code.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,MAAM,GAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAE/G,SAAS,MAAM,CAAC,IAA+B;IAC9C,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAG,KAA6C;IACpE,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAsB,EAAE,SAAiB;IAC/D,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACpF,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Command } from "effect/cli";
2
+ export declare const generateCommand: Command.Command<"generate", {
3
+ readonly check: boolean;
4
+ }, {}, import("effect/PlatformError").BadArgument | import("./BuildFailure.ts").BuildFailure | import("#report.ts").GenerateFailed | import("@shivaedev/heavy-lock/error.ts").HeavyLockError | import("effect/PlatformError").PlatformError | import("effect/Schema").SchemaError, import("effect/crypto/Digest").Digest | import("@shivaedev/heavy-lock/acquire.ts").HeavyLockServices>;
5
+ export declare const buildCommand: Command.Command<"shivaedev-build", {}, {}, import("effect/PlatformError").BadArgument | import("./BuildFailure.ts").BuildFailure | import("#report.ts").GenerateFailed | import("@shivaedev/heavy-lock/error.ts").HeavyLockError | import("effect/PlatformError").PlatformError | import("effect/Schema").SchemaError, import("effect/crypto/Digest").Digest | import("@shivaedev/heavy-lock/acquire.ts").HeavyLockServices>;
6
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAQ,MAAM,YAAY,CAAC;AAwB3C,eAAO,MAAM,eAAe;;wXAc3B,CAAC;AAEF,eAAO,MAAM,YAAY,8ZAAmF,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { Console, Effect, Path } from "effect";
2
+ import { Command, Flag } from "effect/cli";
3
+ import { generate } from "#generate.ts";
4
+ const WORDS = {
5
+ current: "current",
6
+ missing: "missing",
7
+ orphaned: "orphaned, its module is gone",
8
+ refused: "refused",
9
+ removed: "removed, its module is gone",
10
+ stale: "stale",
11
+ unchanged: "unchanged, from the cache",
12
+ written: "written",
13
+ };
14
+ const printReport = Effect.fn("Build.printReport")(function* (report) {
15
+ for (const { output, status } of report.modules) {
16
+ yield* Console.log(`${output}: ${WORDS[status]}`);
17
+ }
18
+ if (report.modules.length === 0) {
19
+ yield* Console.log("No file of the project calls defineModule.");
20
+ }
21
+ });
22
+ export const generateCommand = Command.make("generate", { check: Flag.Boolean("check").pipe(Flag.withDefault(false)) }, ({ check }) => Effect.gen(function* () {
23
+ const path = yield* Path.Path;
24
+ const report = yield* generate(path.resolve(), { check }).pipe(Effect.tapErrorTag("GenerateFailed", (failed) => printReport(failed.report).pipe(Effect.andThen(Effect.forEach(failed.problems, (problem) => Console.error(problem))))));
25
+ yield* printReport(report);
26
+ })).pipe(Command.withDescription("Write src/generated/<module>.ts for every defineModule call of the project in the current directory and remove each generated file whose module is gone; --check writes nothing and fails on a missing, stale or orphaned file"));
27
+ export const buildCommand = Command.make("shivaedev-build").pipe(Command.withSubcommands([generateCommand]));
28
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAGxC,MAAM,KAAK,GAA2C;IACrD,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,8BAA8B;IACxC,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,6BAA6B;IACtC,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,2BAA2B;IACtC,OAAO,EAAE,SAAS;CAClB,CAAC;AAEF,MAAM,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,EAAE,MAAsB;IACnF,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACjD,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAClE,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CACrI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACnB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAC7D,MAAM,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,EAAE,CAC/C,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CACrH,CACD,CAAC;IACF,KAAK,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC,CAAC,CACF,CAAC,IAAI,CACL,OAAO,CAAC,eAAe,CACtB,gOAAgO,CAChO,CACD,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC"}
package/dist/emit.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ import { type Code, type ImportRef } from "#code.ts";
2
+ export interface PlannedOperation {
3
+ readonly kind: "command" | "query";
4
+ readonly members: readonly Code[];
5
+ readonly name: string;
6
+ readonly payload: Code | undefined;
7
+ readonly rejections: readonly (readonly [string, ImportRef])[];
8
+ readonly success: Code;
9
+ }
10
+ export interface PlannedModule {
11
+ readonly exportName: string;
12
+ readonly keyScope: Code | undefined;
13
+ readonly middleware: Code | undefined;
14
+ readonly module: ImportRef;
15
+ readonly name: string;
16
+ readonly operations: readonly PlannedOperation[];
17
+ readonly source: string;
18
+ readonly subject: Code | undefined;
19
+ }
20
+ export declare function generatedFrom(text: string): string | undefined;
21
+ export declare function identifierOf(name: string): string;
22
+ export declare function emit(planned: PlannedModule): string;
23
+ //# sourceMappingURL=emit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../src/emit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAQ,KAAK,SAAS,EAAU,MAAM,UAAU,CAAC;AAGnE,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,IAAI,EAAE,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,IAAI,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;IAC/D,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,IAAI,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,IAAI,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,IAAI,GAAG,SAAS,CAAC;CACnC;AAsBD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE9D;AAMD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIjD;AAUD,wBAAgB,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAmDnD"}