@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
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
const READONLY_CHECK_FLAG = 8;
|
|
3
|
+
export function isReadonlyProperty(property) {
|
|
4
|
+
return ((ts.getCheckFlags(property) & READONLY_CHECK_FLAG) !== 0
|
|
5
|
+
|| ((property.flags & ts.SymbolFlags.Property) !== 0 && (ts.getDeclarationModifierFlagsFromSymbol(property) & ts.ModifierFlags.Readonly) !== 0));
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=isReadonlyProperty.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isReadonlyProperty.js","sourceRoot":"","sources":["../../src/adapters/isReadonlyProperty.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAa5B,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B,MAAM,UAAU,kBAAkB,CAAC,QAAmB;IACrD,OAAO,CACN,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC;WACrD,CAAC,CAAC,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,qCAAqC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAC/I,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
export interface ModuleCall {
|
|
3
|
+
readonly definition: ts.Expression | undefined;
|
|
4
|
+
readonly exported: boolean;
|
|
5
|
+
readonly variable: ts.VariableDeclaration;
|
|
6
|
+
}
|
|
7
|
+
export declare function moduleCalls(source: ts.SourceFile): readonly ModuleCall[];
|
|
8
|
+
export declare function propertyOf(literal: ts.ObjectLiteralExpression, name: string): ts.ObjectLiteralElementLike | undefined;
|
|
9
|
+
export declare function initializerOf(property: ts.ObjectLiteralElementLike | undefined): ts.Expression | undefined;
|
|
10
|
+
//# sourceMappingURL=moduleCalls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moduleCalls.d.ts","sourceRoot":"","sources":["../../src/adapters/moduleCalls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,mBAAmB,CAAC;CAC1C;AAkBD,wBAAgB,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,GAAG,SAAS,UAAU,EAAE,CAiBxE;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,uBAAuB,EAAE,IAAI,EAAE,MAAM,GAAG,EAAE,CAAC,wBAAwB,GAAG,SAAS,CAIrH;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,wBAAwB,GAAG,SAAS,GAAG,EAAE,CAAC,UAAU,GAAG,SAAS,CAQ1G"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
function importsDefineModule(source) {
|
|
3
|
+
const locals = new Set();
|
|
4
|
+
for (const statement of source.statements) {
|
|
5
|
+
const bindings = ts.isImportDeclaration(statement) ? statement.importClause?.namedBindings : undefined;
|
|
6
|
+
if (bindings !== undefined && ts.isNamedImports(bindings)) {
|
|
7
|
+
for (const element of bindings.elements) {
|
|
8
|
+
if ((element.propertyName ?? element.name).text === "defineModule") {
|
|
9
|
+
locals.add(element.name.text);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return locals;
|
|
15
|
+
}
|
|
16
|
+
// Found by syntax alone, so discovery and the cache need no program.
|
|
17
|
+
export function moduleCalls(source) {
|
|
18
|
+
const locals = importsDefineModule(source);
|
|
19
|
+
if (locals.size === 0) {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
return source.statements.flatMap((statement) => {
|
|
23
|
+
if (!ts.isVariableStatement(statement)) {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
const exported = statement.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword) === true;
|
|
27
|
+
return statement.declarationList.declarations.flatMap((variable) => {
|
|
28
|
+
const call = variable.initializer;
|
|
29
|
+
return call !== undefined && ts.isCallExpression(call) && ts.isIdentifier(call.expression) && locals.has(call.expression.text)
|
|
30
|
+
? [{ definition: call.arguments[0], exported, variable }]
|
|
31
|
+
: [];
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export function propertyOf(literal, name) {
|
|
36
|
+
return literal.properties.find((property) => property.name !== undefined && (ts.isIdentifier(property.name) || ts.isStringLiteral(property.name)) && property.name.text === name);
|
|
37
|
+
}
|
|
38
|
+
export function initializerOf(property) {
|
|
39
|
+
if (property === undefined) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
if (ts.isPropertyAssignment(property)) {
|
|
43
|
+
return property.initializer;
|
|
44
|
+
}
|
|
45
|
+
return ts.isShorthandPropertyAssignment(property) ? property.name : undefined;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=moduleCalls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moduleCalls.js","sourceRoot":"","sources":["../../src/adapters/moduleCalls.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moduleFacts.d.ts","sourceRoot":"","sources":["../../src/adapters/moduleFacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAK5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAc7C,wBAAgB,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CA8C1E"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { copiedCode } from "#adapters/copiedCode.ts";
|
|
3
|
+
import { initializerOf, moduleCalls, propertyOf } from "#adapters/moduleCalls.ts";
|
|
4
|
+
import { operationFacts } from "#adapters/operationFacts.ts";
|
|
5
|
+
function readingFor(program, refuse) {
|
|
6
|
+
const checker = program.getTypeChecker();
|
|
7
|
+
return (label) => ({
|
|
8
|
+
checker,
|
|
9
|
+
program,
|
|
10
|
+
refuse: (type, path, instead) => {
|
|
11
|
+
refuse(`${label}: run returns ${checker.typeToString(type)} at ${path}, which has no exact wire form; ${instead}`);
|
|
12
|
+
return undefined;
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
export function moduleFacts(program, file) {
|
|
17
|
+
// Creating the checker binds the files, which sets the parent links that reading a node's text needs.
|
|
18
|
+
const checker = program.getTypeChecker();
|
|
19
|
+
const refusals = new Set();
|
|
20
|
+
function refuse(message) {
|
|
21
|
+
refusals.add(message);
|
|
22
|
+
}
|
|
23
|
+
const empty = { exportName: "", file, keyScope: undefined, middleware: undefined, name: "", operations: [], subject: undefined };
|
|
24
|
+
const source = program.getSourceFile(file);
|
|
25
|
+
const calls = source === undefined ? [] : moduleCalls(source);
|
|
26
|
+
const [call, ...others] = calls;
|
|
27
|
+
if (call === undefined || others.length > 0) {
|
|
28
|
+
return { ...empty, refusals: [`${file}: defines ${calls.length} modules; define exactly one module per file`] };
|
|
29
|
+
}
|
|
30
|
+
const definition = call.definition;
|
|
31
|
+
const nameValue = definition !== undefined && ts.isObjectLiteralExpression(definition) ? initializerOf(propertyOf(definition, "name")) : undefined;
|
|
32
|
+
if (definition === undefined || !ts.isObjectLiteralExpression(definition) || nameValue === undefined || !ts.isStringLiteral(nameValue)) {
|
|
33
|
+
return { ...empty, refusals: [`${file}: defineModule takes an object literal whose name is a string literal`] };
|
|
34
|
+
}
|
|
35
|
+
const name = nameValue.text;
|
|
36
|
+
const exportName = call.variable.name.getText();
|
|
37
|
+
if (!(call.exported && ts.isIdentifier(call.variable.name))) {
|
|
38
|
+
refuse(`${name}: export the module as a const, such as export const ${exportName} = defineModule(...)`);
|
|
39
|
+
}
|
|
40
|
+
const literal = definition;
|
|
41
|
+
function copy(field) {
|
|
42
|
+
const node = initializerOf(propertyOf(literal, field));
|
|
43
|
+
return node === undefined ? undefined : copiedCode({ checker, label: `${name} ${field}`, refuse }, node);
|
|
44
|
+
}
|
|
45
|
+
const list = initializerOf(propertyOf(definition, "operations"));
|
|
46
|
+
if (list === undefined || !ts.isArrayLiteralExpression(list)) {
|
|
47
|
+
refuse(`${name}: operations is an array literal of the module's operations`);
|
|
48
|
+
}
|
|
49
|
+
const reading = readingFor(program, refuse);
|
|
50
|
+
const elements = list !== undefined && ts.isArrayLiteralExpression(list) ? list.elements : [];
|
|
51
|
+
const operations = elements.flatMap((element) => operationFacts({ moduleName: name, reading, refuse }, element) ?? []);
|
|
52
|
+
return {
|
|
53
|
+
exportName,
|
|
54
|
+
file,
|
|
55
|
+
keyScope: copy("keyScope"),
|
|
56
|
+
middleware: copy("middleware"),
|
|
57
|
+
name,
|
|
58
|
+
operations,
|
|
59
|
+
refusals: [...refusals],
|
|
60
|
+
subject: copy("subject"),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=moduleFacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moduleFacts.js","sourceRoot":"","sources":["../../src/adapters/moduleFacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { type TypeReading } from "#adapters/typeReading.ts";
|
|
3
|
+
import type { WireForm } from "#facts.ts";
|
|
4
|
+
type Read = (type: ts.Type, path: string) => WireForm | undefined;
|
|
5
|
+
export declare function classForm(reading: TypeReading, type: ts.Type, symbol: ts.Symbol, path: string): WireForm | undefined;
|
|
6
|
+
export declare function objectForm(reading: TypeReading, type: ts.Type, path: string, read: Read): WireForm | undefined;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=objectForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"objectForm.d.ts","sourceRoot":"","sources":["../../src/adapters/objectForm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAgC,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE1F,OAAO,KAAK,EAAS,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEjD,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,QAAQ,GAAG,SAAS,CAAC;AAElE,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CASpH;AAgCD,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,QAAQ,GAAG,SAAS,CAwB9G"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { isReadonlyProperty } from "#adapters/isReadonlyProperty.ts";
|
|
3
|
+
import { declaredClass, isSchemaClass } from "#adapters/typeReading.ts";
|
|
4
|
+
import { unionForm } from "#adapters/unionForm.ts";
|
|
5
|
+
export function classForm(reading, type, symbol, path) {
|
|
6
|
+
if (!isSchemaClass(reading, symbol)) {
|
|
7
|
+
return reading.refuse(type, path, "return a plain object, or make the class a Schema class");
|
|
8
|
+
}
|
|
9
|
+
const declared = declaredClass(reading, symbol);
|
|
10
|
+
if (declared?.exportName === undefined) {
|
|
11
|
+
return reading.refuse(type, path, `export the Schema class ${symbol.name} from its module`);
|
|
12
|
+
}
|
|
13
|
+
return { declared, form: "class" };
|
|
14
|
+
}
|
|
15
|
+
// An exact optional property's only undefined member is the one optionality adds: TypeScript merges a written undefined
|
|
16
|
+
// into it, and the property is then not exact.
|
|
17
|
+
function optionalForm(reading, type, path, read) {
|
|
18
|
+
const members = type.isUnion() ? type.types.filter((member) => !(member.flags & ts.TypeFlags.Undefined)) : [type];
|
|
19
|
+
const [only] = members;
|
|
20
|
+
if (only === undefined) {
|
|
21
|
+
return reading.refuse(type, path, "give the optional property a type besides undefined, or drop it");
|
|
22
|
+
}
|
|
23
|
+
return members.length === 1 ? read(only, path) : unionForm(reading, type, members, path, read);
|
|
24
|
+
}
|
|
25
|
+
function fieldOf(reading, property, exact, path, read) {
|
|
26
|
+
const optional = (property.flags & ts.SymbolFlags.Optional) !== 0;
|
|
27
|
+
const type = reading.checker.getTypeOfSymbol(property);
|
|
28
|
+
if (optional && !exact.has(property)) {
|
|
29
|
+
return reading.refuse(type, path, `drop undefined from the optional property ${property.name}, so an absent key is the only way to leave it out`);
|
|
30
|
+
}
|
|
31
|
+
const form = optional ? optionalForm(reading, type, path, read) : read(type, path);
|
|
32
|
+
return form === undefined ? undefined : { form, mutable: !isReadonlyProperty(property), name: property.name, optional };
|
|
33
|
+
}
|
|
34
|
+
function recordForm(reading, type, path, read) {
|
|
35
|
+
const [index, ...others] = reading.checker.getIndexInfosOfType(type);
|
|
36
|
+
if (index === undefined || others.length > 0 || !(index.keyType.flags & ts.TypeFlags.String)) {
|
|
37
|
+
return reading.refuse(type, path, "use string keys only");
|
|
38
|
+
}
|
|
39
|
+
const value = read(index.type, `${path}[string]`);
|
|
40
|
+
return value === undefined ? undefined : { form: "record", mutable: !index.isReadonly, value };
|
|
41
|
+
}
|
|
42
|
+
export function objectForm(reading, type, path, read) {
|
|
43
|
+
if (type.getCallSignatures().length > 0 || type.getConstructSignatures().length > 0) {
|
|
44
|
+
return reading.refuse(type, path, "return data, not a function");
|
|
45
|
+
}
|
|
46
|
+
const symbol = type.getSymbol();
|
|
47
|
+
const builtIn = symbol !== undefined
|
|
48
|
+
&& symbol.flags & ts.SymbolFlags.Interface
|
|
49
|
+
&& symbol.declarations?.some((declaration) => reading.program.isSourceFileDefaultLibrary(declaration.getSourceFile()));
|
|
50
|
+
if (builtIn === true) {
|
|
51
|
+
return reading.refuse(type, path, "return a plain object, an array or a string-keyed record");
|
|
52
|
+
}
|
|
53
|
+
const properties = reading.checker.getPropertiesOfType(type);
|
|
54
|
+
const indexes = reading.checker.getIndexInfosOfType(type);
|
|
55
|
+
if (indexes.length > 0) {
|
|
56
|
+
return properties.length === 0 ? recordForm(reading, type, path, read) : reading.refuse(type, path, "use either fixed properties or a record");
|
|
57
|
+
}
|
|
58
|
+
const methods = properties.filter((property) => reading.checker.getTypeOfSymbol(property).getCallSignatures().length > 0);
|
|
59
|
+
if (methods.length > 0 || properties.some((property) => property.name.startsWith("__@"))) {
|
|
60
|
+
return reading.refuse(type, path, "return plain data, without methods or symbol keys");
|
|
61
|
+
}
|
|
62
|
+
const exact = new Set(reading.checker.getExactOptionalProperties(type));
|
|
63
|
+
const fields = properties.map((property) => fieldOf(reading, property, exact, `${path}.${property.name}`, read));
|
|
64
|
+
return fields.every((field) => field !== undefined) ? { fields, form: "struct" } : undefined;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=objectForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"objectForm.js","sourceRoot":"","sources":["../../src/adapters/objectForm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { type TypeReading } from "#adapters/typeReading.ts";
|
|
3
|
+
import type { OperationFacts } from "#facts.ts";
|
|
4
|
+
export interface OperationReading {
|
|
5
|
+
readonly moduleName: string;
|
|
6
|
+
readonly reading: (label: string) => TypeReading;
|
|
7
|
+
readonly refuse: (message: string) => void;
|
|
8
|
+
}
|
|
9
|
+
export declare function operationFacts(context: OperationReading, element: ts.Expression): OperationFacts | undefined;
|
|
10
|
+
//# sourceMappingURL=operationFacts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operationFacts.d.ts","sourceRoot":"","sources":["../../src/adapters/operationFacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAI5B,OAAO,EAAE,KAAK,WAAW,EAAiB,MAAM,0BAA0B,CAAC;AAE3E,OAAO,KAAK,EAAY,cAAc,EAAE,MAAM,WAAW,CAAC;AAE1D,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,WAAW,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAqCD,wBAAgB,cAAc,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,GAAG,cAAc,GAAG,SAAS,CAmC5G"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { copiedCode } from "#adapters/copiedCode.ts";
|
|
3
|
+
import { failuresOf } from "#adapters/failuresOf.ts";
|
|
4
|
+
import { initializerOf, propertyOf } from "#adapters/moduleCalls.ts";
|
|
5
|
+
import { typeArguments } from "#adapters/typeReading.ts";
|
|
6
|
+
import { wireForm } from "#adapters/wireForm.ts";
|
|
7
|
+
function declarationOf(checker, element) {
|
|
8
|
+
const symbol = checker.getSymbolAtLocation(element);
|
|
9
|
+
const target = symbol !== undefined && symbol.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(symbol) : symbol;
|
|
10
|
+
const declaration = target?.valueDeclaration;
|
|
11
|
+
const call = declaration !== undefined && ts.isVariableDeclaration(declaration) ? declaration.initializer : undefined;
|
|
12
|
+
const literal = call !== undefined && ts.isCallExpression(call) ? call.arguments[1] : undefined;
|
|
13
|
+
return declaration === undefined || literal === undefined || !ts.isObjectLiteralExpression(literal) ? undefined : { declaration, literal };
|
|
14
|
+
}
|
|
15
|
+
// What an Effect-returning property of the operation succeeds and fails with.
|
|
16
|
+
function effectArguments(checker, owner, property, at) {
|
|
17
|
+
const symbol = owner.getProperty(property);
|
|
18
|
+
const [signature] = symbol === undefined ? [] : checker.getTypeOfSymbolAtLocation(symbol, at).getCallSignatures();
|
|
19
|
+
return signature === undefined ? [] : typeArguments(checker, signature.getReturnType());
|
|
20
|
+
}
|
|
21
|
+
function textOf(checker, owner, property) {
|
|
22
|
+
const symbol = owner.getProperty(property);
|
|
23
|
+
const value = symbol === undefined ? undefined : checker.getTypeOfSymbol(symbol);
|
|
24
|
+
return value?.isStringLiteral() === true ? value.value : undefined;
|
|
25
|
+
}
|
|
26
|
+
// Without run's types the operation did not compile; a run returning any is the common cause, and gets its own message.
|
|
27
|
+
function refuseUnread(context, label, literal) {
|
|
28
|
+
const reading = context.reading(label);
|
|
29
|
+
const run = propertyOf(literal, "run");
|
|
30
|
+
const signature = run !== undefined && ts.isMethodDeclaration(run) ? reading.checker.getSignatureFromDeclaration(run) : undefined;
|
|
31
|
+
const returned = signature === undefined ? undefined : typeArguments(reading.checker, signature.getReturnType())[1];
|
|
32
|
+
if (returned !== undefined && returned.flags & ts.TypeFlags.Any) {
|
|
33
|
+
reading.refuse(returned, "success", "decode the value with a schema, or give it a type");
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
context.refuse(`${label}: run's result cannot be read; fix the compile errors on the operation first`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export function operationFacts(context, element) {
|
|
40
|
+
const reading = context.reading(context.moduleName);
|
|
41
|
+
const found = declarationOf(reading.checker, element);
|
|
42
|
+
if (found === undefined) {
|
|
43
|
+
context.refuse(`${context.moduleName}: ${element.getText()} in operations is not a const built by query or command with an object literal`);
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const type = reading.checker.getTypeAtLocation(found.declaration);
|
|
47
|
+
const name = textOf(reading.checker, type, "name") ?? element.getText();
|
|
48
|
+
const kind = textOf(reading.checker, type, "kind") === "command" ? "command" : "query";
|
|
49
|
+
const label = `${context.moduleName}.${name}`;
|
|
50
|
+
const [success, runError] = effectArguments(reading.checker, type, "run", found.declaration);
|
|
51
|
+
if (success === undefined) {
|
|
52
|
+
refuseUnread(context, label, found.literal);
|
|
53
|
+
}
|
|
54
|
+
const [, policyError] = kind === "query" ? effectArguments(reading.checker, type, "readPolicy", found.declaration) : [];
|
|
55
|
+
const literal = found.literal;
|
|
56
|
+
function copy(field, member) {
|
|
57
|
+
const property = propertyOf(literal, field);
|
|
58
|
+
const node = member ? property : initializerOf(property);
|
|
59
|
+
return node === undefined ? undefined : copiedCode({ checker: reading.checker, label: `${label} ${field}`, refuse: context.refuse }, node);
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
failures: failuresOf(context.reading(label), [runError, policyError].flatMap((error) => error ?? [])),
|
|
63
|
+
invalidates: copy("invalidates", true),
|
|
64
|
+
kind,
|
|
65
|
+
name,
|
|
66
|
+
payload: copy("payload", false),
|
|
67
|
+
reads: copy("reads", true),
|
|
68
|
+
readsCollections: copy("readsCollections", true),
|
|
69
|
+
success: success === undefined ? undefined : wireForm(context.reading(label), success, "success"),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=operationFacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operationFacts.js","sourceRoot":"","sources":["../../src/adapters/operationFacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as NodeServices from "@effect/platform-node/NodeServices";
|
|
2
|
+
import { Effect, Layer } from "effect";
|
|
3
|
+
declare const services: Layer.Layer<import("effect/crypto/Aead").Aead | import("effect/crypto/Cipher").Cipher | import("effect/crypto/Digest").Digest | import("effect/crypto/Kdf").Kdf | import("effect/crypto/KeyAgreement").KeyAgreement | import("effect/crypto/KeyWrap").KeyWrap | import("effect/crypto/Mac").Mac | import("effect/crypto/SecureRandom").SecureRandom | import("effect/crypto/Signature").Signature | NodeServices.NodeServices, never, never>;
|
|
4
|
+
export declare function runNode<A, E>(effect: Effect.Effect<A, E, Layer.Success<typeof services>>): Promise<A>;
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=runNode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runNode.d.ts","sourceRoot":"","sources":["../../src/adapters/runNode.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAS,MAAM,EAAQ,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEpD,QAAA,MAAM,QAAQ,8aAAuD,CAAC;AAGtE,wBAAsB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAO3G"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as NodeCrypto from "@effect/platform-node/NodeCrypto";
|
|
2
|
+
import * as NodeServices from "@effect/platform-node/NodeServices";
|
|
3
|
+
import { Cause, Effect, Exit, Layer } from "effect";
|
|
4
|
+
const services = Layer.mergeAll(NodeServices.layer, NodeCrypto.layer);
|
|
5
|
+
// Runs a generator effect for a tool that awaits a Promise, failing it with the effect's own error.
|
|
6
|
+
export async function runNode(effect) {
|
|
7
|
+
const exit = await Effect.runPromiseExit(Effect.provide(effect, services));
|
|
8
|
+
if (Exit.isSuccess(exit)) {
|
|
9
|
+
return exit.value;
|
|
10
|
+
}
|
|
11
|
+
const failure = Cause.squash(exit.cause);
|
|
12
|
+
throw failure instanceof Error ? failure : new Error(String(failure), { cause: failure });
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=runNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runNode.js","sourceRoot":"","sources":["../../src/adapters/runNode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,kCAAkC,CAAC;AAC/D,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEpD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;AAEtE,oGAAoG;AACpG,MAAM,CAAC,KAAK,UAAU,OAAO,CAAO,MAA2D;IAC9F,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC3E,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3F,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import type { DeclaredClass, Literal } from "#facts.ts";
|
|
3
|
+
export interface TypeReading {
|
|
4
|
+
readonly checker: ts.TypeChecker;
|
|
5
|
+
readonly program: ts.Program;
|
|
6
|
+
readonly refuse: (type: ts.Type, path: string, instead: string) => undefined;
|
|
7
|
+
}
|
|
8
|
+
export declare function declaredIn(type: ts.Type, module: string): boolean;
|
|
9
|
+
export declare function isLibraryType(reading: TypeReading, type: ts.Type, name: string): boolean;
|
|
10
|
+
export declare function declaredClass(reading: TypeReading, symbol: ts.Symbol): DeclaredClass | undefined;
|
|
11
|
+
export declare function isSchemaClass(reading: TypeReading, symbol: ts.Symbol): boolean;
|
|
12
|
+
export declare function isReference(type: ts.Type): type is ts.TypeReference;
|
|
13
|
+
export declare function typeArguments(checker: ts.TypeChecker, type: ts.Type): readonly ts.Type[];
|
|
14
|
+
export declare function literalOf(checker: ts.TypeChecker, type: ts.Type): Literal | undefined;
|
|
15
|
+
//# sourceMappingURL=typeReading.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeReading.d.ts","sourceRoot":"","sources":["../../src/adapters/typeReading.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAExD,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC;IAE7B,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,SAAS,CAAC;CAC7E;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAGjE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAMxF;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,aAAa,GAAG,SAAS,CAchG;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,OAAO,CAO9E;AAGD,wBAAgB,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,aAAa,CAEnE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,SAAS,EAAE,CAAC,IAAI,EAAE,CAExF;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,GAAG,SAAS,CAKrF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
export function declaredIn(type, module) {
|
|
3
|
+
const pattern = new RegExp(`[/\\\\]effect[/\\\\](?:dist|src)[/\\\\]${module}\\.(?:d\\.)?ts$`, "u");
|
|
4
|
+
return (type.aliasSymbol ?? type.getSymbol())?.declarations?.some((declaration) => pattern.test(declaration.getSourceFile().fileName)) === true;
|
|
5
|
+
}
|
|
6
|
+
export function isLibraryType(reading, type, name) {
|
|
7
|
+
const symbol = type.getSymbol();
|
|
8
|
+
return (symbol?.name === name
|
|
9
|
+
&& symbol.declarations?.some((declaration) => reading.program.isSourceFileDefaultLibrary(declaration.getSourceFile())) === true);
|
|
10
|
+
}
|
|
11
|
+
export function declaredClass(reading, symbol) {
|
|
12
|
+
const declaration = symbol.declarations?.find(ts.isClassDeclaration);
|
|
13
|
+
if (declaration === undefined) {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
const file = declaration.getSourceFile();
|
|
17
|
+
const module = reading.checker.getSymbolAtLocation(file);
|
|
18
|
+
const exported = module === undefined
|
|
19
|
+
? undefined
|
|
20
|
+
: reading.checker
|
|
21
|
+
.getExportsOfModule(module)
|
|
22
|
+
.find((candidate) => (candidate.flags & ts.SymbolFlags.Alias ? reading.checker.getAliasedSymbol(candidate) : candidate) === symbol);
|
|
23
|
+
return { className: symbol.name, exportName: exported?.name, file: file.fileName };
|
|
24
|
+
}
|
|
25
|
+
export function isSchemaClass(reading, symbol) {
|
|
26
|
+
const declaration = symbol.declarations?.find(ts.isClassDeclaration);
|
|
27
|
+
if (declaration === undefined) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
const staticSide = reading.checker.getTypeOfSymbolAtLocation(symbol, declaration);
|
|
31
|
+
return staticSide.getProperty("ast") !== undefined && staticSide.getProperty("fields") !== undefined;
|
|
32
|
+
}
|
|
33
|
+
// Array, tuple and generic interface instances, such as Effect<A, E, R>, are references that carry their type arguments.
|
|
34
|
+
export function isReference(type) {
|
|
35
|
+
return "target" in type;
|
|
36
|
+
}
|
|
37
|
+
export function typeArguments(checker, type) {
|
|
38
|
+
return isReference(type) ? checker.getTypeArguments(type) : [];
|
|
39
|
+
}
|
|
40
|
+
export function literalOf(checker, type) {
|
|
41
|
+
if (type.flags & ts.TypeFlags.BooleanLiteral) {
|
|
42
|
+
return checker.typeToString(type) === "true";
|
|
43
|
+
}
|
|
44
|
+
return type.isStringLiteral() || type.isNumberLiteral() ? type.value : undefined;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=typeReading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeReading.js","sourceRoot":"","sources":["../../src/adapters/typeReading.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import ts from "typescript";
|
|
3
|
+
import { BuildFailure } from "#BuildFailure.ts";
|
|
4
|
+
export interface ProjectConfig {
|
|
5
|
+
readonly chain: readonly string[];
|
|
6
|
+
readonly declarations: readonly string[];
|
|
7
|
+
readonly files: readonly string[];
|
|
8
|
+
readonly options: ts.CompilerOptions;
|
|
9
|
+
readonly typeScriptVersion: string;
|
|
10
|
+
}
|
|
11
|
+
export declare const readConfig: (tsconfig: string) => Effect.Effect<ProjectConfig, BuildFailure, never>;
|
|
12
|
+
export declare function definesModule(file: string, text: string): boolean;
|
|
13
|
+
export declare const resolvedImports: (config: ProjectConfig, file: string, text: string) => Effect.Effect<string[], never, never>;
|
|
14
|
+
export declare const deriveModules: (config: ProjectConfig, modules: readonly string[]) => Effect.Effect<import("../facts.ts").ModuleFacts[], BuildFailure, never>;
|
|
15
|
+
//# sourceMappingURL=typeScript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeScript.d.ts","sourceRoot":"","sources":["../../src/adapters/typeScript.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,MAAM,YAAY,CAAC;AAG5B,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,WAAW,aAAa;IAE7B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC;IACrC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACnC;AAUD,eAAO,MAAM,UAAU,yEAiBrB,CAAC;AAEH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED,eAAO,MAAM,eAAe,8FAO1B,CAAC;AAqCH,eAAO,MAAM,aAAa,gIAQxB,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { Effect } from "effect";
|
|
4
|
+
import ts from "typescript";
|
|
5
|
+
import { moduleCalls } from "#adapters/moduleCalls.ts";
|
|
6
|
+
import { moduleFacts } from "#adapters/moduleFacts.ts";
|
|
7
|
+
import { BuildFailure } from "#BuildFailure.ts";
|
|
8
|
+
function diagnosticText(diagnostics) {
|
|
9
|
+
return ts.formatDiagnostics(diagnostics, {
|
|
10
|
+
getCanonicalFileName: (name) => name,
|
|
11
|
+
getCurrentDirectory: ts.sys.getCurrentDirectory,
|
|
12
|
+
getNewLine: () => "\n",
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
export const readConfig = Effect.fn("Build.readConfig")(function* (tsconfig) {
|
|
16
|
+
const parsed = yield* Effect.sync(() => {
|
|
17
|
+
const source = ts.readJsonConfigFile(tsconfig, ts.sys.readFile);
|
|
18
|
+
const config = ts.parseJsonSourceFileConfigFileContent(source, ts.sys, dirname(tsconfig), undefined, tsconfig);
|
|
19
|
+
return { config, problems: config.errors, source };
|
|
20
|
+
});
|
|
21
|
+
if (parsed.problems.length > 0) {
|
|
22
|
+
return yield* new BuildFailure({ message: `${tsconfig} cannot be read:\n${diagnosticText(parsed.problems)}` });
|
|
23
|
+
}
|
|
24
|
+
const config = {
|
|
25
|
+
chain: [tsconfig, ...(parsed.source.extendedSourceFiles ?? [])],
|
|
26
|
+
declarations: parsed.config.fileNames.filter((file) => file.endsWith(".d.ts")),
|
|
27
|
+
files: parsed.config.fileNames,
|
|
28
|
+
options: parsed.config.options,
|
|
29
|
+
typeScriptVersion: ts.version,
|
|
30
|
+
};
|
|
31
|
+
return config;
|
|
32
|
+
});
|
|
33
|
+
export function definesModule(file, text) {
|
|
34
|
+
return text.includes("defineModule") && moduleCalls(ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true)).length > 0;
|
|
35
|
+
}
|
|
36
|
+
export const resolvedImports = Effect.fn("Build.resolvedImports")(function* (config, file, text) {
|
|
37
|
+
return yield* Effect.sync(() => ts.preProcessFile(text, true, true).importedFiles.flatMap(({ fileName }) => {
|
|
38
|
+
const resolved = ts.resolveModuleName(fileName, file, config.options, ts.sys).resolvedModule;
|
|
39
|
+
return resolved === undefined ? [] : [resolved.resolvedFileName];
|
|
40
|
+
}));
|
|
41
|
+
});
|
|
42
|
+
// Building the program is the expensive part of a run, and parsing the installed packages' declarations is most of it. They rarely
|
|
43
|
+
// change between the runs of one process, such as a dev server's, so the registry hands a later program each file it parsed with the same text and settings.
|
|
44
|
+
const parsedFiles = ts.createDocumentRegistry(ts.sys.useCaseSensitiveFileNames);
|
|
45
|
+
function programHost(options, rootNames) {
|
|
46
|
+
const texts = new Map();
|
|
47
|
+
function textOf(file) {
|
|
48
|
+
if (!texts.has(file)) {
|
|
49
|
+
texts.set(file, ts.sys.readFile(file));
|
|
50
|
+
}
|
|
51
|
+
return texts.get(file);
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
directoryExists: ts.sys.directoryExists,
|
|
55
|
+
fileExists: ts.sys.fileExists,
|
|
56
|
+
getCompilationSettings: () => options,
|
|
57
|
+
getCurrentDirectory: ts.sys.getCurrentDirectory,
|
|
58
|
+
getDefaultLibFileName: ts.getDefaultLibFilePath,
|
|
59
|
+
getDirectories: ts.sys.getDirectories,
|
|
60
|
+
getScriptFileNames: () => [...rootNames],
|
|
61
|
+
getScriptSnapshot: (file) => {
|
|
62
|
+
const text = textOf(file);
|
|
63
|
+
return text === undefined ? undefined : ts.ScriptSnapshot.fromString(text);
|
|
64
|
+
},
|
|
65
|
+
getScriptVersion: (file) => createHash("sha256")
|
|
66
|
+
.update(textOf(file) ?? "")
|
|
67
|
+
.digest("hex"),
|
|
68
|
+
readDirectory: ts.sys.readDirectory,
|
|
69
|
+
readFile: textOf,
|
|
70
|
+
...(ts.sys.realpath === undefined ? {} : { realpath: ts.sys.realpath }),
|
|
71
|
+
useCaseSensitiveFileNames: () => ts.sys.useCaseSensitiveFileNames,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export const deriveModules = Effect.fn("Build.deriveModules")(function* (config, modules) {
|
|
75
|
+
const program = yield* Effect.sync(() => ts.createLanguageService(programHost({ ...config.options, noEmit: true }, [...modules, ...config.declarations]), parsedFiles).getProgram());
|
|
76
|
+
if (program === undefined) {
|
|
77
|
+
return yield* new BuildFailure({ message: "TypeScript's language service built no program" });
|
|
78
|
+
}
|
|
79
|
+
return yield* Effect.sync(() => modules.map((module) => moduleFacts(program, module)));
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=typeScript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeScript.js","sourceRoot":"","sources":["../../src/adapters/typeScript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAWhD,SAAS,cAAc,CAAC,WAAqC;IAC5D,OAAO,EAAE,CAAC,iBAAiB,CAAC,WAAW,EAAE;QACxC,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI;QACpC,mBAAmB,EAAE,EAAE,CAAC,GAAG,CAAC,mBAAmB;QAC/C,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI;KACtB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAgB;IAClF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,EAAE,CAAC,kBAAkB,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,EAAE,CAAC,oCAAoC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC/G,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC,CAAC,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,QAAQ,qBAAqB,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;IAChH,CAAC;IACD,MAAM,MAAM,GAAkB;QAC7B,KAAK,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QAC/D,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC9E,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS;QAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;QAC9B,iBAAiB,EAAE,EAAE,CAAC,OAAO;KAC7B,CAAC;IACF,OAAO,MAAM,CAAC;AACf,CAAC,CAAC,CAAC;AAEH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,IAAY;IACvD,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,WAAW,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAC/H,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,QAAQ,CAAC,EAAE,MAAqB,EAAE,IAAY,EAAE,IAAY;IAC7H,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAC9B,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC1E,MAAM,QAAQ,GAAG,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC;QAC7F,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAClE,CAAC,CAAC,CACF,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,mIAAmI;AACnI,6JAA6J;AAC7J,MAAM,WAAW,GAAG,EAAE,CAAC,sBAAsB,CAAC,EAAE,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAEhF,SAAS,WAAW,CAAC,OAA2B,EAAE,SAA4B;IAC7E,MAAM,KAAK,GAAG,IAAI,GAAG,EAA8B,CAAC;IACpD,SAAS,MAAM,CAAC,IAAY;QAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IACD,OAAO;QACN,eAAe,EAAE,EAAE,CAAC,GAAG,CAAC,eAAe;QACvC,UAAU,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU;QAC7B,sBAAsB,EAAE,GAAG,EAAE,CAAC,OAAO;QACrC,mBAAmB,EAAE,EAAE,CAAC,GAAG,CAAC,mBAAmB;QAC/C,qBAAqB,EAAE,EAAE,CAAC,qBAAqB;QAC/C,cAAc,EAAE,EAAE,CAAC,GAAG,CAAC,cAAc;QACrC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC;QACxC,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE;YAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1B,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5E,CAAC;QACD,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAC1B,UAAU,CAAC,QAAQ,CAAC;aAClB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,KAAK,CAAC;QAChB,aAAa,EAAE,EAAE,CAAC,GAAG,CAAC,aAAa;QACnC,QAAQ,EAAE,MAAM;QAChB,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACvE,yBAAyB,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,yBAAyB;KACjE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC,QAAQ,CAAC,EAAE,MAAqB,EAAE,OAA0B;IACzH,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CACvC,EAAE,CAAC,qBAAqB,CAAC,WAAW,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,UAAU,EAAE,CAC1I,CAAC;IACF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,CAAC,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,gDAAgD,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AACxF,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { type TypeReading } from "#adapters/typeReading.ts";
|
|
3
|
+
import type { WireForm } from "#facts.ts";
|
|
4
|
+
type Read = (type: ts.Type, path: string) => WireForm | undefined;
|
|
5
|
+
export declare function unionForm(reading: TypeReading, type: ts.Type, members: readonly ts.Type[], path: string, read: Read): WireForm | undefined;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=unionForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unionForm.d.ts","sourceRoot":"","sources":["../../src/adapters/unionForm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAyB,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEnF,OAAO,KAAK,EAAW,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEnD,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,QAAQ,GAAG,SAAS,CAAC;AA0ElE,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,QAAQ,GAAG,SAAS,CAQ1I"}
|