@shivaedev/build 0.0.0 → 0.1.1
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.
- package/CHANGELOG.md +19 -0
- package/LICENSE +21 -0
- package/README.md +215 -1
- package/dist/BuildFailure.d.ts +9 -0
- package/dist/BuildFailure.d.ts.map +1 -0
- package/dist/BuildFailure.js +4 -0
- package/dist/BuildFailure.js.map +1 -0
- package/dist/adapters/appTestConfig.d.ts +4 -0
- package/dist/adapters/appTestConfig.d.ts.map +1 -0
- package/dist/adapters/appTestConfig.js +17 -0
- package/dist/adapters/appTestConfig.js.map +1 -0
- package/dist/adapters/appViteConfig.d.ts +26 -0
- package/dist/adapters/appViteConfig.d.ts.map +1 -0
- package/dist/adapters/appViteConfig.js +18 -0
- package/dist/adapters/appViteConfig.js.map +1 -0
- package/dist/adapters/bundleCheck.d.ts +3 -0
- package/dist/adapters/bundleCheck.d.ts.map +1 -0
- package/dist/adapters/bundleCheck.js +53 -0
- package/dist/adapters/bundleCheck.js.map +1 -0
- package/dist/adapters/copiedCode.d.ts +9 -0
- package/dist/adapters/copiedCode.d.ts.map +1 -0
- package/dist/adapters/copiedCode.js +84 -0
- package/dist/adapters/copiedCode.js.map +1 -0
- package/dist/adapters/failuresOf.d.ts +5 -0
- package/dist/adapters/failuresOf.d.ts.map +1 -0
- package/dist/adapters/failuresOf.js +29 -0
- package/dist/adapters/failuresOf.js.map +1 -0
- package/dist/adapters/isReadonlyProperty.d.ts +10 -0
- package/dist/adapters/isReadonlyProperty.d.ts.map +1 -0
- package/dist/adapters/isReadonlyProperty.js +7 -0
- package/dist/adapters/isReadonlyProperty.js.map +1 -0
- package/dist/adapters/moduleCalls.d.ts +10 -0
- package/dist/adapters/moduleCalls.d.ts.map +1 -0
- package/dist/adapters/moduleCalls.js +47 -0
- package/dist/adapters/moduleCalls.js.map +1 -0
- package/dist/adapters/moduleFacts.d.ts +4 -0
- package/dist/adapters/moduleFacts.d.ts.map +1 -0
- package/dist/adapters/moduleFacts.js +63 -0
- package/dist/adapters/moduleFacts.js.map +1 -0
- package/dist/adapters/objectForm.d.ts +8 -0
- package/dist/adapters/objectForm.d.ts.map +1 -0
- package/dist/adapters/objectForm.js +66 -0
- package/dist/adapters/objectForm.js.map +1 -0
- package/dist/adapters/operationFacts.d.ts +10 -0
- package/dist/adapters/operationFacts.d.ts.map +1 -0
- package/dist/adapters/operationFacts.js +72 -0
- package/dist/adapters/operationFacts.js.map +1 -0
- package/dist/adapters/runNode.d.ts +6 -0
- package/dist/adapters/runNode.d.ts.map +1 -0
- package/dist/adapters/runNode.js +14 -0
- package/dist/adapters/runNode.js.map +1 -0
- package/dist/adapters/typeReading.d.ts +15 -0
- package/dist/adapters/typeReading.d.ts.map +1 -0
- package/dist/adapters/typeReading.js +46 -0
- package/dist/adapters/typeReading.js.map +1 -0
- package/dist/adapters/typeScript.d.ts +15 -0
- package/dist/adapters/typeScript.d.ts.map +1 -0
- package/dist/adapters/typeScript.js +81 -0
- package/dist/adapters/typeScript.js.map +1 -0
- package/dist/adapters/unionForm.d.ts +7 -0
- package/dist/adapters/unionForm.d.ts.map +1 -0
- package/dist/adapters/unionForm.js +78 -0
- package/dist/adapters/unionForm.js.map +1 -0
- package/dist/adapters/vitePlugin.d.ts +7 -0
- package/dist/adapters/vitePlugin.d.ts.map +1 -0
- package/dist/adapters/vitePlugin.js +88 -0
- package/dist/adapters/vitePlugin.js.map +1 -0
- package/dist/adapters/vitePort.d.ts +2 -0
- package/dist/adapters/vitePort.d.ts.map +1 -0
- package/dist/adapters/vitePort.js +5 -0
- package/dist/adapters/vitePort.js.map +1 -0
- package/dist/adapters/vitest/setup.d.ts +3 -0
- package/dist/adapters/vitest/setup.d.ts.map +1 -0
- package/dist/adapters/vitest/setup.js +11 -0
- package/dist/adapters/vitest/setup.js.map +1 -0
- package/dist/adapters/wireForm.d.ts +5 -0
- package/dist/adapters/wireForm.d.ts.map +1 -0
- package/dist/adapters/wireForm.js +91 -0
- package/dist/adapters/wireForm.js.map +1 -0
- package/dist/byText.d.ts +2 -0
- package/dist/byText.d.ts.map +1 -0
- package/dist/byText.js +8 -0
- package/dist/byText.js.map +1 -0
- package/dist/cache.d.ts +4 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +19 -0
- package/dist/cache.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +11 -0
- package/dist/cli.js.map +1 -0
- package/dist/code.d.ts +11 -0
- package/dist/code.d.ts.map +1 -0
- package/dist/code.js +11 -0
- package/dist/code.js.map +1 -0
- package/dist/command.d.ts +6 -0
- package/dist/command.d.ts.map +1 -0
- package/dist/command.js +28 -0
- package/dist/command.js.map +1 -0
- package/dist/emit.d.ts +23 -0
- package/dist/emit.d.ts.map +1 -0
- package/dist/emit.js +69 -0
- package/dist/emit.js.map +1 -0
- package/dist/facts.d.ts +92 -0
- package/dist/facts.d.ts.map +1 -0
- package/dist/facts.js +3 -0
- package/dist/facts.js.map +1 -0
- package/dist/files.d.ts +4 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +18 -0
- package/dist/files.js.map +1 -0
- package/dist/formCode.d.ts +6 -0
- package/dist/formCode.d.ts.map +1 -0
- package/dist/formCode.js +46 -0
- package/dist/formCode.js.map +1 -0
- package/dist/generate.d.ts +7 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +69 -0
- package/dist/generate.js.map +1 -0
- package/dist/generateRound.d.ts +14 -0
- package/dist/generateRound.d.ts.map +1 -0
- package/dist/generateRound.js +44 -0
- package/dist/generateRound.js.map +1 -0
- package/dist/importNames.d.ts +7 -0
- package/dist/importNames.d.ts.map +1 -0
- package/dist/importNames.js +57 -0
- package/dist/importNames.js.map +1 -0
- package/dist/inputs.d.ts +15 -0
- package/dist/inputs.d.ts.map +1 -0
- package/dist/inputs.js +64 -0
- package/dist/inputs.js.map +1 -0
- package/dist/ownerOf.d.ts +7 -0
- package/dist/ownerOf.d.ts.map +1 -0
- package/dist/ownerOf.js +30 -0
- package/dist/ownerOf.js.map +1 -0
- package/dist/packageScope.d.ts +13 -0
- package/dist/packageScope.d.ts.map +1 -0
- package/dist/packageScope.js +28 -0
- package/dist/packageScope.js.map +1 -0
- package/dist/plan.d.ts +12 -0
- package/dist/plan.d.ts.map +1 -0
- package/dist/plan.js +115 -0
- package/dist/plan.js.map +1 -0
- package/dist/project.d.ts +11 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +24 -0
- package/dist/project.js.map +1 -0
- package/dist/rejections.d.ts +11 -0
- package/dist/rejections.d.ts.map +1 -0
- package/dist/rejections.js +46 -0
- package/dist/rejections.js.map +1 -0
- package/dist/report.d.ts +22 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +20 -0
- package/dist/report.js.map +1 -0
- package/dist/serverCode.d.ts +20 -0
- package/dist/serverCode.d.ts.map +1 -0
- package/dist/serverCode.js +90 -0
- package/dist/serverCode.js.map +1 -0
- package/dist/settleOrphans.d.ts +5 -0
- package/dist/settleOrphans.d.ts.map +1 -0
- package/dist/settleOrphans.js +43 -0
- package/dist/settleOrphans.js.map +1 -0
- package/dist/specifiers.d.ts +4 -0
- package/dist/specifiers.d.ts.map +1 -0
- package/dist/specifiers.js +52 -0
- package/dist/specifiers.js.map +1 -0
- package/package.json +82 -5
- package/src/BuildFailure.ts +5 -0
- package/src/adapters/appTestConfig.ts +18 -0
- package/src/adapters/appViteConfig.ts +31 -0
- package/src/adapters/bundleCheck.ts +57 -0
- package/src/adapters/copiedCode.ts +103 -0
- package/src/adapters/failuresOf.ts +31 -0
- package/src/adapters/isReadonlyProperty.ts +21 -0
- package/src/adapters/moduleCalls.ts +58 -0
- package/src/adapters/moduleFacts.ts +66 -0
- package/src/adapters/objectForm.ts +74 -0
- package/src/adapters/operationFacts.ts +85 -0
- package/src/adapters/runNode.ts +15 -0
- package/src/adapters/typeReading.ts +63 -0
- package/src/adapters/typeScript.ts +101 -0
- package/src/adapters/unionForm.ts +88 -0
- package/src/adapters/vitePlugin.ts +103 -0
- package/src/adapters/vitePort.ts +5 -0
- package/src/adapters/vitest/setup.ts +12 -0
- package/src/adapters/wireForm.ts +98 -0
- package/src/byText.ts +7 -0
- package/src/cache.ts +28 -0
- package/src/cli.ts +16 -0
- package/src/code.ts +23 -0
- package/src/command.ts +42 -0
- package/src/emit.ts +117 -0
- package/src/facts.ts +70 -0
- package/src/files.ts +24 -0
- package/src/formCode.ts +59 -0
- package/src/generate.ts +86 -0
- package/src/generateRound.ts +60 -0
- package/src/importNames.ts +61 -0
- package/src/inputs.ts +82 -0
- package/src/ownerOf.ts +40 -0
- package/src/packageScope.ts +35 -0
- package/src/plan.ts +138 -0
- package/src/project.ts +30 -0
- package/src/rejections.ts +57 -0
- package/src/report.ts +39 -0
- package/src/serverCode.ts +139 -0
- package/src/settleOrphans.ts +58 -0
- package/src/specifiers.ts +55 -0
package/dist/inputs.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Effect, FileSystem, Option, Path } from "effect";
|
|
2
|
+
import { Digest } from "effect/crypto";
|
|
3
|
+
import { resolvedImports } from "#adapters/typeScript.ts";
|
|
4
|
+
import { byText } from "#byText.ts";
|
|
5
|
+
import packageInfo from "#package.json" with { type: "json" };
|
|
6
|
+
const LOCKFILES = ["pnpm-lock.yaml", "package-lock.json", "yarn.lock", "bun.lock"];
|
|
7
|
+
const lockfileOf = Effect.fn("Build.lockfileOf")(function* (root) {
|
|
8
|
+
const fs = yield* FileSystem.FileSystem;
|
|
9
|
+
const path = yield* Path.Path;
|
|
10
|
+
for (let directory = root;; directory = path.dirname(directory)) {
|
|
11
|
+
for (const name of LOCKFILES) {
|
|
12
|
+
if (yield* fs.exists(path.join(directory, name))) {
|
|
13
|
+
return Option.some(path.join(directory, name));
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
if (path.dirname(directory) === directory) {
|
|
17
|
+
return Option.none();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
// The generator's own code, so a changed generator rewrites every file even before its version changes.
|
|
22
|
+
export const generatorFingerprint = Effect.fn("Build.generatorFingerprint")(function* () {
|
|
23
|
+
const fs = yield* FileSystem.FileSystem;
|
|
24
|
+
const path = yield* Path.Path;
|
|
25
|
+
const digest = yield* Digest.Digest;
|
|
26
|
+
const directory = yield* path.fromFileUrl(new URL(".", import.meta.url));
|
|
27
|
+
const files = (yield* fs.readDirectory(directory, { recursive: true })).sort();
|
|
28
|
+
const texts = yield* Effect.forEach(files, (file) => Effect.gen(function* () {
|
|
29
|
+
const full = path.join(directory, file);
|
|
30
|
+
const info = yield* fs.stat(full);
|
|
31
|
+
return info.type === "File" ? `${file}\u0000${yield* fs.readFileString(full)}` : "";
|
|
32
|
+
}));
|
|
33
|
+
const version = `@shivaedev/build ${packageInfo.version}`;
|
|
34
|
+
return yield* digest.digestHex(Digest.sha256, new TextEncoder().encode([version, ...texts].join("\u0001")));
|
|
35
|
+
});
|
|
36
|
+
// Installed packages are covered by the lockfile and the generator's output by its own inputs, so the walk stops at both.
|
|
37
|
+
const importGraph = Effect.fn("Build.importGraph")(function* (project, module) {
|
|
38
|
+
const fs = yield* FileSystem.FileSystem;
|
|
39
|
+
const seen = new Map();
|
|
40
|
+
const pending = [module];
|
|
41
|
+
for (let file = pending.pop(); file !== undefined; file = pending.pop()) {
|
|
42
|
+
if (!seen.has(file)) {
|
|
43
|
+
const text = yield* fs.readFileString(file);
|
|
44
|
+
seen.set(file, text);
|
|
45
|
+
const imports = yield* resolvedImports(project.config, file, text);
|
|
46
|
+
pending.push(...imports.filter((imported) => !(imported.includes("/node_modules/") || imported.startsWith(project.generated))));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return seen;
|
|
50
|
+
});
|
|
51
|
+
export const inputKey = Effect.fn("Build.inputKey")(function* (project, module) {
|
|
52
|
+
const fs = yield* FileSystem.FileSystem;
|
|
53
|
+
const path = yield* Path.Path;
|
|
54
|
+
const digest = yield* Digest.Digest;
|
|
55
|
+
const graph = yield* importGraph(project, module);
|
|
56
|
+
const lockfile = yield* lockfileOf(project.root);
|
|
57
|
+
const chain = yield* Effect.forEach([...project.config.chain, ...project.config.declarations], (file) => Effect.map(fs.readFileString(file), (text) => [file, text]));
|
|
58
|
+
const lock = Option.isSome(lockfile) ? [[lockfile.value, yield* fs.readFileString(lockfile.value)]] : [];
|
|
59
|
+
const inputs = [...graph, ...chain, ...lock];
|
|
60
|
+
const entries = inputs.map(([file, text]) => `${path.relative(project.root, file)}\u0000${text}`).sort(byText);
|
|
61
|
+
const key = yield* digest.digestHex(Digest.sha256, new TextEncoder().encode([project.generator, `typescript ${project.config.typeScriptVersion}`, ...entries].join("\u0001")));
|
|
62
|
+
return { files: inputs.map(([file]) => file), key };
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=inputs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputs.js","sourceRoot":"","sources":["../src/inputs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Effect, Option, Path } from "effect";
|
|
2
|
+
export interface Owner {
|
|
3
|
+
readonly directory: string;
|
|
4
|
+
readonly name: string;
|
|
5
|
+
}
|
|
6
|
+
export declare const ownerOf: (id: string, owners: Map<string, Option.Option<Owner>>) => Effect.Effect<Option.Option<Owner>, import("effect/PlatformError").PlatformError, import("effect/FileSystem").FileSystem | Path.Path>;
|
|
7
|
+
//# sourceMappingURL=ownerOf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ownerOf.d.ts","sourceRoot":"","sources":["../src/ownerOf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAU,MAAM,QAAQ,CAAC;AAItD,MAAM,WAAW,KAAK;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAMD,eAAO,MAAM,OAAO,kMA0BlB,CAAC"}
|
package/dist/ownerOf.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Effect, Option, Path, Schema } from "effect";
|
|
2
|
+
import { readIfPresent } from "#files.ts";
|
|
3
|
+
const Manifest = Schema.fromJsonString(Schema.Struct({ name: Schema.optionalKey(Schema.String) }));
|
|
4
|
+
const decodeManifest = Schema.decodeUnknownOption(Manifest);
|
|
5
|
+
export const ownerOf = Effect.fn("Build.ownerOf")(function* (id, owners) {
|
|
6
|
+
const path = yield* Path.Path;
|
|
7
|
+
if (!path.isAbsolute(id)) {
|
|
8
|
+
return Option.none();
|
|
9
|
+
}
|
|
10
|
+
const visited = [];
|
|
11
|
+
for (let directory = path.dirname(id);; directory = path.dirname(directory)) {
|
|
12
|
+
const known = owners.get(directory);
|
|
13
|
+
if (known !== undefined) {
|
|
14
|
+
for (const each of visited) {
|
|
15
|
+
owners.set(each, known);
|
|
16
|
+
}
|
|
17
|
+
return known;
|
|
18
|
+
}
|
|
19
|
+
visited.push(directory);
|
|
20
|
+
const name = Option.flatMap(yield* readIfPresent(path.join(directory, "package.json")), (text) => Option.flatMap(decodeManifest(text), (manifest) => Option.fromUndefinedOr(manifest.name)));
|
|
21
|
+
if (Option.isSome(name) || path.dirname(directory) === directory) {
|
|
22
|
+
const found = Option.map(name, (each) => ({ directory, name: each }));
|
|
23
|
+
for (const each of visited) {
|
|
24
|
+
owners.set(each, found);
|
|
25
|
+
}
|
|
26
|
+
return found;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=ownerOf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ownerOf.js","sourceRoot":"","sources":["../src/ownerOf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAQ1C,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAEnG,MAAM,cAAc,GAAG,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;AAE5D,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAU,EAAE,MAAyC;IACjH,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,IAAI,EAAS,CAAC;IAC7B,CAAC;IACD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,IAAI,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAI,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9E,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACzB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACzB,CAAC;YACD,OAAO,KAAK,CAAC;QACd,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAChG,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CACzF,CAAC;QACF,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;YAClE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAS,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC7E,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACzB,CAAC;YACD,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;AACF,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Effect, FileSystem, Option, Path, Schema } from "effect";
|
|
2
|
+
declare const Manifest: Schema.Struct<{
|
|
3
|
+
readonly exports: Schema.optionalKey<Schema.Unknown>;
|
|
4
|
+
readonly imports: Schema.optionalKey<Schema.$Record<Schema.String, Schema.Unknown>>;
|
|
5
|
+
readonly name: Schema.optionalKey<Schema.String>;
|
|
6
|
+
}>;
|
|
7
|
+
export interface PackageScope {
|
|
8
|
+
readonly directory: string;
|
|
9
|
+
readonly manifest: typeof Manifest.Type;
|
|
10
|
+
}
|
|
11
|
+
export declare const packageScopeOf: (file: string) => Effect.Effect<Option.Option<PackageScope>, import("effect/PlatformError").PlatformError | Schema.SchemaError, FileSystem.FileSystem | Path.Path>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=packageScope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packageScope.d.ts","sourceRoot":"","sources":["../src/packageScope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAElE,QAAA,MAAM,QAAQ;;;;EAIZ,CAAC;AAEH,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,QAAQ,CAAC,IAAI,CAAC;CACxC;AAKD,eAAO,MAAM,cAAc,oKAkBzB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Effect, FileSystem, Option, Path, Schema } from "effect";
|
|
2
|
+
const Manifest = Schema.Struct({
|
|
3
|
+
exports: Schema.optionalKey(Schema.Unknown),
|
|
4
|
+
imports: Schema.optionalKey(Schema.Record(Schema.String, Schema.Unknown)),
|
|
5
|
+
name: Schema.optionalKey(Schema.String),
|
|
6
|
+
});
|
|
7
|
+
const decodeManifest = Schema.decodeUnknownEffect(Schema.fromJsonString(Manifest));
|
|
8
|
+
// The nearest named package.json above a file decides how the file is imported; a nameless one only sets a folder's module type.
|
|
9
|
+
export const packageScopeOf = Effect.fn("Build.packageScopeOf")(function* (file) {
|
|
10
|
+
const fs = yield* FileSystem.FileSystem;
|
|
11
|
+
const path = yield* Path.Path;
|
|
12
|
+
let directory = path.dirname(file);
|
|
13
|
+
for (;;) {
|
|
14
|
+
const manifestPath = path.join(directory, "package.json");
|
|
15
|
+
if (yield* fs.exists(manifestPath)) {
|
|
16
|
+
const manifest = yield* decodeManifest(yield* fs.readFileString(manifestPath));
|
|
17
|
+
if (manifest.name !== undefined) {
|
|
18
|
+
return Option.some({ directory, manifest });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const parent = path.dirname(directory);
|
|
22
|
+
if (parent === directory) {
|
|
23
|
+
return Option.none();
|
|
24
|
+
}
|
|
25
|
+
directory = parent;
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=packageScope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packageScope.js","sourceRoot":"","sources":["../src/packageScope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAElE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACzE,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;CACvC,CAAC,CAAC;AAOH,MAAM,cAAc,GAAG,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;AAEnF,iIAAiI;AACjI,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAY;IACtF,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;IACxC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B,IAAI,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,SAAS,CAAC;QACT,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAC1D,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC;YAC/E,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACjC,OAAO,MAAM,CAAC,IAAI,CAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC3D,CAAC;QACF,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC,IAAI,EAAgB,CAAC;QACpC,CAAC;QACD,SAAS,GAAG,MAAM,CAAC;IACpB,CAAC;AACF,CAAC,CAAC,CAAC"}
|
package/dist/plan.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Effect, Path } from "effect";
|
|
2
|
+
import type { PlannedModule } from "#emit.ts";
|
|
3
|
+
import type { ModuleFacts } from "#facts.ts";
|
|
4
|
+
export interface Placement {
|
|
5
|
+
readonly output: string;
|
|
6
|
+
readonly root: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const plan: (placement: Placement, facts: ModuleFacts) => Effect.Effect<{
|
|
9
|
+
planned: PlannedModule;
|
|
10
|
+
refusals: string[];
|
|
11
|
+
}, import("effect/PlatformError").PlatformError | import("effect/Schema").SchemaError, import("effect/FileSystem").FileSystem | Path.Path>;
|
|
12
|
+
//# sourceMappingURL=plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,IAAI,EAAE,MAAM,QAAQ,CAAC;AAG9C,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,UAAU,CAAC;AAChE,OAAO,KAAK,EAA2B,WAAW,EAA4B,MAAM,WAAW,CAAC;AAMhG,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAwGD,eAAO,MAAM,IAAI;;;0IAoBf,CAAC"}
|
package/dist/plan.js
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { Effect, Option, Path } from "effect";
|
|
2
|
+
import { byText } from "#byText.ts";
|
|
3
|
+
import { code } from "#code.ts";
|
|
4
|
+
import { formCode } from "#formCode.ts";
|
|
5
|
+
import { packageScopeOf } from "#packageScope.ts";
|
|
6
|
+
import { rejectionsOf } from "#rejections.ts";
|
|
7
|
+
import { specifierFor } from "#specifiers.ts";
|
|
8
|
+
function classesIn(form) {
|
|
9
|
+
if (form === undefined) {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
switch (form.form) {
|
|
13
|
+
case "class":
|
|
14
|
+
return [form.declared];
|
|
15
|
+
case "array":
|
|
16
|
+
return classesIn(form.item);
|
|
17
|
+
case "tuple":
|
|
18
|
+
return form.elements.flatMap(classesIn);
|
|
19
|
+
case "struct":
|
|
20
|
+
return form.fields.flatMap((field) => classesIn(field.form));
|
|
21
|
+
case "record":
|
|
22
|
+
return classesIn(form.value);
|
|
23
|
+
case "union":
|
|
24
|
+
return form.members.flatMap(classesIn);
|
|
25
|
+
case "nullOr":
|
|
26
|
+
case "option":
|
|
27
|
+
return classesIn(form.inner);
|
|
28
|
+
default:
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const classRef = Effect.fn("Build.classRef")(function* (placement, declared) {
|
|
33
|
+
const specifier = yield* specifierFor(placement.root, placement.output, declared.file);
|
|
34
|
+
const name = declared.exportName ?? declared.className;
|
|
35
|
+
return specifier === undefined ? undefined : { name, preferred: name, specifier, typeOnly: false };
|
|
36
|
+
});
|
|
37
|
+
const codeOf = Effect.fn("Build.codeOf")(function* (placement, parts) {
|
|
38
|
+
const path = yield* Path.Path;
|
|
39
|
+
return yield* Effect.forEach(parts, (part) => Effect.gen(function* () {
|
|
40
|
+
if (typeof part === "string") {
|
|
41
|
+
return part;
|
|
42
|
+
}
|
|
43
|
+
const own = !path.relative(placement.root, part.writtenIn).startsWith("..");
|
|
44
|
+
const specifier = own || !part.specifier.startsWith("#") || part.target === undefined
|
|
45
|
+
? part.specifier
|
|
46
|
+
: yield* specifierFor(placement.root, placement.output, part.target);
|
|
47
|
+
return { name: part.name, preferred: part.local, specifier: specifier ?? part.specifier, typeOnly: part.typeOnly };
|
|
48
|
+
}));
|
|
49
|
+
});
|
|
50
|
+
function copiedOf(placement, parts) {
|
|
51
|
+
return parts === undefined ? Effect.succeed(undefined) : codeOf(placement, parts);
|
|
52
|
+
}
|
|
53
|
+
const operationPlan = Effect.fn("Build.operationPlan")(function* (placement, label, operation, refuse) {
|
|
54
|
+
const packages = new Map();
|
|
55
|
+
for (const failure of operation.failures) {
|
|
56
|
+
if (failure.kind === "class" && !packages.has(failure.declared.file)) {
|
|
57
|
+
const scope = yield* packageScopeOf(failure.declared.file);
|
|
58
|
+
packages.set(failure.declared.file, Option.getOrUndefined(Option.map(scope, ({ manifest }) => manifest.name)));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const { refusals, rejections } = rejectionsOf(label, operation.failures, (file) => packages.get(file));
|
|
62
|
+
refusals.forEach(refuse);
|
|
63
|
+
const refs = new Map();
|
|
64
|
+
for (const declared of [...classesIn(operation.success), ...rejections.map((rejection) => rejection.declared)]) {
|
|
65
|
+
const ref = yield* classRef(placement, declared);
|
|
66
|
+
if (ref === undefined) {
|
|
67
|
+
refuse(`${label}: ${declared.className} in ${declared.file} cannot be imported by the generated file; export it from a module its package exports`);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
refs.set(`${declared.file}\u0000${declared.className}`, ref);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function refOf(declared) {
|
|
74
|
+
return (refs.get(`${declared.file}\u0000${declared.className}`) ?? {
|
|
75
|
+
name: declared.className,
|
|
76
|
+
preferred: declared.className,
|
|
77
|
+
specifier: declared.file,
|
|
78
|
+
typeOnly: false,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
const members = yield* Effect.forEach([operation.reads, operation.readsCollections, operation.invalidates], (parts) => copiedOf(placement, parts));
|
|
82
|
+
// A browser contract's query always carries reads, so a query that declares no keys gets none, as query() gives it.
|
|
83
|
+
const reads = operation.kind === "query" && operation.reads === undefined ? [code("reads: () => []")] : [];
|
|
84
|
+
const planned = {
|
|
85
|
+
kind: operation.kind,
|
|
86
|
+
members: [...reads, ...members.filter((member) => member !== undefined)],
|
|
87
|
+
name: operation.name,
|
|
88
|
+
payload: yield* copiedOf(placement, operation.payload),
|
|
89
|
+
rejections: rejections.map(({ declared, tag }) => [tag, refOf(declared)]),
|
|
90
|
+
success: operation.success === undefined ? code() : formCode(operation.success, (form) => refOf(form.declared)),
|
|
91
|
+
};
|
|
92
|
+
return planned;
|
|
93
|
+
});
|
|
94
|
+
export const plan = Effect.fn("Build.plan")(function* (placement, facts) {
|
|
95
|
+
const path = yield* Path.Path;
|
|
96
|
+
const refusals = [...facts.refusals];
|
|
97
|
+
function refuse(message) {
|
|
98
|
+
refusals.push(message);
|
|
99
|
+
}
|
|
100
|
+
const sorted = [...facts.operations].sort((left, right) => byText(left.name, right.name));
|
|
101
|
+
const operations = yield* Effect.forEach(sorted, (operation) => operationPlan(placement, `${facts.name}.${operation.name}`, operation, refuse));
|
|
102
|
+
const moduleSpecifier = (yield* specifierFor(placement.root, placement.output, facts.file)) ?? facts.file;
|
|
103
|
+
const planned = {
|
|
104
|
+
exportName: facts.exportName,
|
|
105
|
+
keyScope: yield* copiedOf(placement, facts.keyScope),
|
|
106
|
+
middleware: yield* copiedOf(placement, facts.middleware),
|
|
107
|
+
module: { name: facts.exportName, preferred: facts.exportName, specifier: moduleSpecifier, typeOnly: true },
|
|
108
|
+
name: facts.name,
|
|
109
|
+
operations,
|
|
110
|
+
source: path.relative(placement.root, facts.file),
|
|
111
|
+
subject: yield* copiedOf(placement, facts.subject),
|
|
112
|
+
};
|
|
113
|
+
return { planned, refusals: [...new Set(refusals)] };
|
|
114
|
+
});
|
|
115
|
+
//# sourceMappingURL=plan.js.map
|
package/dist/plan.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Effect, FileSystem, Path } from "effect";
|
|
2
|
+
import { type Project } from "#inputs.ts";
|
|
3
|
+
export interface ModuleFile {
|
|
4
|
+
readonly module: string;
|
|
5
|
+
readonly output: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const openProject: (directory: string) => Effect.Effect<Project, import("effect/PlatformError").BadArgument | import("./BuildFailure.ts").BuildFailure | import("effect/PlatformError").PlatformError, import("effect/crypto/Digest").Digest | FileSystem.FileSystem | Path.Path>;
|
|
8
|
+
export declare const moduleFiles: (project: Project) => Effect.Effect<(ModuleFile & {
|
|
9
|
+
readonly underSource: boolean;
|
|
10
|
+
})[], import("effect/PlatformError").PlatformError, FileSystem.FileSystem | Path.Path>;
|
|
11
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAElD,OAAO,EAAwB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,WAAW,gQAOtB,CAAC;AAGH,eAAO,MAAM,WAAW;0BAM2C,OAAO;sFAIxE,CAAC"}
|
package/dist/project.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Effect, FileSystem, Path } from "effect";
|
|
2
|
+
import { definesModule, readConfig } from "#adapters/typeScript.ts";
|
|
3
|
+
import { generatorFingerprint } from "#inputs.ts";
|
|
4
|
+
export const openProject = Effect.fn("Build.openProject")(function* (directory) {
|
|
5
|
+
const fs = yield* FileSystem.FileSystem;
|
|
6
|
+
const path = yield* Path.Path;
|
|
7
|
+
const root = yield* fs.realPath(directory);
|
|
8
|
+
const config = yield* readConfig(path.join(root, "tsconfig.json"));
|
|
9
|
+
const project = { config, generated: `${path.join(root, "src", "generated")}${path.sep}`, generator: yield* generatorFingerprint(), root };
|
|
10
|
+
return project;
|
|
11
|
+
});
|
|
12
|
+
// Every file of the tsconfig that calls defineModule, so no list of modules needs keeping; each writes src/generated/<its path under src>.
|
|
13
|
+
export const moduleFiles = Effect.fn("Build.moduleFiles")(function* (project) {
|
|
14
|
+
const fs = yield* FileSystem.FileSystem;
|
|
15
|
+
const path = yield* Path.Path;
|
|
16
|
+
const sources = project.config.files.filter((file) => !(file.startsWith(project.generated) || file.endsWith(".d.ts"))).sort();
|
|
17
|
+
const modules = yield* Effect.filter(sources, (file) => Effect.map(fs.readFileString(file), (text) => definesModule(file, text)));
|
|
18
|
+
const source = path.join(project.root, "src");
|
|
19
|
+
return modules.map((module) => {
|
|
20
|
+
const underSource = path.relative(source, module);
|
|
21
|
+
return { module, output: path.join(project.generated, underSource), underSource: !underSource.startsWith("..") };
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAgB,MAAM,YAAY,CAAC;AAOhE,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,EAAE,SAAiB;IACrF,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;IACxC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;IACnE,MAAM,OAAO,GAAY,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,CAAC;IACpJ,OAAO,OAAO,CAAC;AAChB,CAAC,CAAC,CAAC;AAEH,2IAA2I;AAC3I,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,EAAE,OAAgB;IACpF,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;IACxC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9H,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAClI,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAkD,EAAE;QAC7E,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;IAClH,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { DeclaredClass, Failure } from "#facts.ts";
|
|
2
|
+
export interface Rejection {
|
|
3
|
+
readonly declared: DeclaredClass;
|
|
4
|
+
readonly tag: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function isRejection(packageName: string | undefined, declared: DeclaredClass): boolean;
|
|
7
|
+
export declare function rejectionsOf(label: string, failures: readonly Failure[], packageOf: (file: string) => string | undefined): {
|
|
8
|
+
refusals: string[];
|
|
9
|
+
rejections: Rejection[];
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=rejections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rejections.d.ts","sourceRoot":"","sources":["../src/rejections.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUxD,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAE7F;AAiBD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS;;;EAqBxH"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { byText } from "#byText.ts";
|
|
2
|
+
// Never rejections: the wire adds the automatic two to every operation, and the others are infrastructure or policy outcomes.
|
|
3
|
+
const NOT_REJECTIONS = new Set([
|
|
4
|
+
"@shivaedev/contract QueryReadDenied",
|
|
5
|
+
"@shivaedev/errors InternalServerError",
|
|
6
|
+
"@shivaedev/errors ServiceUnavailable",
|
|
7
|
+
"effect SchemaError",
|
|
8
|
+
]);
|
|
9
|
+
export function isRejection(packageName, declared) {
|
|
10
|
+
return !NOT_REJECTIONS.has(`${packageName ?? ""} ${declared.className}`);
|
|
11
|
+
}
|
|
12
|
+
function refusalOf(label, failure) {
|
|
13
|
+
switch (failure.kind) {
|
|
14
|
+
case "untagged":
|
|
15
|
+
return `${label}: run fails with ${failure.text}, which has no _tag; fail with an exported tagged error class instead`;
|
|
16
|
+
case "unexported":
|
|
17
|
+
return `${label}: run fails with ${failure.text} (${failure.tag}), which is not an exported class; export its class so the browser can decode it`;
|
|
18
|
+
case "class":
|
|
19
|
+
return failure.schema
|
|
20
|
+
? undefined
|
|
21
|
+
: `${label}: run fails with ${failure.declared.className} (${failure.tag}), which is not a Schema class, so the browser cannot decode it; declare it as a Schema tagged error, such as class ${failure.declared.className} extends Schema.TaggedError<${failure.declared.className}>()("${failure.tag}", { ... })`;
|
|
22
|
+
case "retryable":
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function rejectionsOf(label, failures, packageOf) {
|
|
27
|
+
const refusals = [];
|
|
28
|
+
const byTag = new Map();
|
|
29
|
+
for (const failure of failures) {
|
|
30
|
+
const rejection = failure.kind !== "class" || isRejection(packageOf(failure.declared.file), failure.declared);
|
|
31
|
+
const refusal = rejection ? refusalOf(label, failure) : undefined;
|
|
32
|
+
if (refusal !== undefined) {
|
|
33
|
+
refusals.push(refusal);
|
|
34
|
+
}
|
|
35
|
+
if (failure.kind === "class" && rejection) {
|
|
36
|
+
const known = byTag.get(failure.tag);
|
|
37
|
+
if (known !== undefined && (known.declared.file !== failure.declared.file || known.declared.className !== failure.declared.className)) {
|
|
38
|
+
refusals.push(`${label}: run fails with two classes tagged ${failure.tag}, from ${known.declared.file} and ${failure.declared.file}; raise one of them`);
|
|
39
|
+
}
|
|
40
|
+
byTag.set(failure.tag, failure);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const rejections = [...byTag.values()].sort((left, right) => byText(left.tag, right.tag));
|
|
44
|
+
return { refusals, rejections };
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=rejections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rejections.js","sourceRoot":"","sources":["../src/rejections.ts"],"names":[],"mappings":"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"}
|
package/dist/report.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type ModuleStatus = "current" | "missing" | "orphaned" | "refused" | "removed" | "stale" | "unchanged" | "written";
|
|
2
|
+
export interface ModuleOutcome {
|
|
3
|
+
readonly module: string;
|
|
4
|
+
readonly output: string;
|
|
5
|
+
readonly status: ModuleStatus;
|
|
6
|
+
}
|
|
7
|
+
export interface GenerateReport {
|
|
8
|
+
readonly inputs: readonly string[];
|
|
9
|
+
readonly modules: readonly ModuleOutcome[];
|
|
10
|
+
readonly programBuilt: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function problemOf({ module, output, status }: ModuleOutcome): string | undefined;
|
|
13
|
+
declare const GenerateFailed_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
14
|
+
readonly _tag: "GenerateFailed";
|
|
15
|
+
} & Readonly<A>;
|
|
16
|
+
export declare class GenerateFailed extends GenerateFailed_base<{
|
|
17
|
+
readonly problems: readonly string[];
|
|
18
|
+
readonly report: GenerateReport;
|
|
19
|
+
}> {
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;AAE1H,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAcvF;;;;AAGD,qBAAa,cAAe,SAAQ,oBAAmC;IACtE,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CAChC,CAAC;CAAG"}
|
package/dist/report.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Data } from "effect";
|
|
2
|
+
export function problemOf({ module, output, status }) {
|
|
3
|
+
switch (status) {
|
|
4
|
+
case "missing":
|
|
5
|
+
case "stale":
|
|
6
|
+
return `${output} is ${status}; run \`pnpm generate\``;
|
|
7
|
+
case "orphaned":
|
|
8
|
+
return `${output} is left from ${module}, which defines no module any more; run \`pnpm generate\``;
|
|
9
|
+
case "current":
|
|
10
|
+
case "refused":
|
|
11
|
+
case "removed":
|
|
12
|
+
case "unchanged":
|
|
13
|
+
case "written":
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
// A refused module, or under --check a missing, stale or orphaned file: the command prints each problem and exits 1.
|
|
18
|
+
export class GenerateFailed extends Data.TaggedError("GenerateFailed") {
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAkB9B,MAAM,UAAU,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAiB;IAClE,QAAQ,MAAM,EAAE,CAAC;QAChB,KAAK,SAAS,CAAC;QACf,KAAK,OAAO;YACX,OAAO,GAAG,MAAM,OAAO,MAAM,yBAAyB,CAAC;QACxD,KAAK,UAAU;YACd,OAAO,GAAG,MAAM,iBAAiB,MAAM,2DAA2D,CAAC;QACpG,KAAK,SAAS,CAAC;QACf,KAAK,SAAS,CAAC;QACf,KAAK,SAAS,CAAC;QACf,KAAK,WAAW,CAAC;QACjB,KAAK,SAAS;YACb,OAAO,SAAS,CAAC;IACnB,CAAC;AACF,CAAC;AAED,qHAAqH;AACrH,MAAM,OAAO,cAAe,SAAQ,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAGnE;CAAG"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Effect, Option, Path } from "effect";
|
|
2
|
+
export interface BundleModule {
|
|
3
|
+
readonly builtin: boolean;
|
|
4
|
+
readonly imports: readonly string[];
|
|
5
|
+
}
|
|
6
|
+
export interface BundleGraph {
|
|
7
|
+
readonly entries: readonly string[];
|
|
8
|
+
readonly modules: ReadonlyMap<string, BundleModule>;
|
|
9
|
+
}
|
|
10
|
+
export interface ServerMarkers {
|
|
11
|
+
readonly defineModule: Option.Option<string>;
|
|
12
|
+
readonly operation: Option.Option<string>;
|
|
13
|
+
readonly sql: Option.Option<string>;
|
|
14
|
+
}
|
|
15
|
+
export interface ServerCodeOptions {
|
|
16
|
+
readonly root: string;
|
|
17
|
+
readonly serverOnly: readonly string[];
|
|
18
|
+
}
|
|
19
|
+
export declare const serverCodeIn: (graph: BundleGraph, markers: ServerMarkers, options: ServerCodeOptions) => Effect.Effect<Option.Option<string>, import("effect/PlatformError").PlatformError, import("effect/FileSystem").FileSystem | Path.Path>;
|
|
20
|
+
//# sourceMappingURL=serverCode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverCode.d.ts","sourceRoot":"","sources":["../src/serverCode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAG9C,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AA0GD,eAAO,MAAM,YAAY,oNAUvB,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { Effect, Option, Path } from "effect";
|
|
2
|
+
import { ownerOf } from "#ownerOf.ts";
|
|
3
|
+
const displayed = Effect.fn("Build.displayed")(function* (id, options, owners) {
|
|
4
|
+
const path = yield* Path.Path;
|
|
5
|
+
const relative = path.relative(options.root, id);
|
|
6
|
+
if (path.isAbsolute(id) && !relative.startsWith("..") && !relative.split(path.sep).includes("node_modules")) {
|
|
7
|
+
return relative;
|
|
8
|
+
}
|
|
9
|
+
const owner = yield* ownerOf(id, owners);
|
|
10
|
+
return Option.match(owner, {
|
|
11
|
+
onNone: () => id.replace(/^__vite-browser-external:/u, ""),
|
|
12
|
+
onSome: ({ directory, name }) => `${name}/${path.relative(directory, id)}`,
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
const reasonOf = Effect.fn("Build.reasonOf")(function* (id, module, markers, options, owners) {
|
|
16
|
+
const path = yield* Path.Path;
|
|
17
|
+
if (module.builtin) {
|
|
18
|
+
return Option.some("a Node builtin");
|
|
19
|
+
}
|
|
20
|
+
if (Option.exists(markers.defineModule, (marker) => module.imports.includes(marker))) {
|
|
21
|
+
return Option.some("a module file: it calls defineModule");
|
|
22
|
+
}
|
|
23
|
+
if (Option.exists(markers.operation, (marker) => module.imports.includes(marker))) {
|
|
24
|
+
return Option.some("an operation file: it defines a query or a command");
|
|
25
|
+
}
|
|
26
|
+
const owner = yield* ownerOf(id, owners);
|
|
27
|
+
if (Option.isSome(owner) && options.serverOnly.includes(owner.value.name)) {
|
|
28
|
+
return Option.some(`part of ${owner.value.name}, which is listed as server-only`);
|
|
29
|
+
}
|
|
30
|
+
const folders = Option.match(owner, { onNone: () => "", onSome: ({ directory }) => path.dirname(path.relative(directory, id)) });
|
|
31
|
+
if (folders.split(path.sep).includes("server")) {
|
|
32
|
+
return Option.some("under a server/ folder");
|
|
33
|
+
}
|
|
34
|
+
return Option.none();
|
|
35
|
+
});
|
|
36
|
+
// Effect's own index re-exports modules that import effect/sql, which tree shaking drops, so the import edge decides: every
|
|
37
|
+
// importer of effect/sql outside Effect counts, however many paths inside Effect reach the same module sooner.
|
|
38
|
+
const importsSqlFromOutside = Effect.fn("Build.importsSqlFromOutside")(function* (importer, imported, markers, owners) {
|
|
39
|
+
const path = yield* Path.Path;
|
|
40
|
+
if (!Option.exists(markers.sql, (directory) => imported.startsWith(`${directory}${path.sep}`))) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
const sqlOwner = yield* ownerOf(imported, owners);
|
|
44
|
+
const importerOwner = yield* ownerOf(importer, owners);
|
|
45
|
+
return !Option.exists(importerOwner, (each) => Option.exists(sqlOwner, ({ directory }) => each.directory === directory));
|
|
46
|
+
});
|
|
47
|
+
const failure = Effect.fn("Build.failure")(function* (chain, reason, options, owners) {
|
|
48
|
+
const shown = yield* Effect.forEach(chain, (each) => displayed(each, options, owners));
|
|
49
|
+
return [
|
|
50
|
+
`Server code reached the browser bundle: ${shown.at(-1)} is ${reason}. The import chain from the client entry:`,
|
|
51
|
+
...shown.map((each, index) => (index === 0 ? ` ${each}` : ` → ${each}`)),
|
|
52
|
+
"The browser reaches a defined module through its generated client in src/generated and imports no server code.",
|
|
53
|
+
].join("\n");
|
|
54
|
+
});
|
|
55
|
+
function chainTo(id, parents) {
|
|
56
|
+
const chain = [];
|
|
57
|
+
for (let each = id; each !== undefined; each = parents.get(each)) {
|
|
58
|
+
chain.unshift(each);
|
|
59
|
+
}
|
|
60
|
+
return chain;
|
|
61
|
+
}
|
|
62
|
+
const visit = Effect.fn("Build.visit")(function* (id, module, walk, markers, options) {
|
|
63
|
+
const reason = yield* reasonOf(id, module, markers, options, walk.owners);
|
|
64
|
+
if (Option.isSome(reason)) {
|
|
65
|
+
return Option.some(yield* failure(chainTo(id, walk.parents), reason.value, options, walk.owners));
|
|
66
|
+
}
|
|
67
|
+
for (const imported of module.imports) {
|
|
68
|
+
if (yield* importsSqlFromOutside(id, imported, markers, walk.owners)) {
|
|
69
|
+
return Option.some(yield* failure([...chainTo(id, walk.parents), imported], "Effect's SQL client, effect/sql", options, walk.owners));
|
|
70
|
+
}
|
|
71
|
+
if (!walk.parents.has(imported)) {
|
|
72
|
+
walk.parents.set(imported, id);
|
|
73
|
+
walk.pending.push(imported);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return Option.none();
|
|
77
|
+
});
|
|
78
|
+
// Breadth first from the entries, so the chain printed is a shortest one to the nearest server module.
|
|
79
|
+
export const serverCodeIn = Effect.fn("Build.serverCodeIn")(function* (graph, markers, options) {
|
|
80
|
+
const walk = { owners: new Map(), parents: new Map(graph.entries.map((entry) => [entry, undefined])), pending: [...graph.entries] };
|
|
81
|
+
for (let id = walk.pending.shift(); id !== undefined; id = walk.pending.shift()) {
|
|
82
|
+
const module = graph.modules.get(id);
|
|
83
|
+
const found = module === undefined ? Option.none() : yield* visit(id, module, walk, markers, options);
|
|
84
|
+
if (Option.isSome(found)) {
|
|
85
|
+
return found;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return Option.none();
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=serverCode.js.map
|