@tsplc/compiler 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +16 -2
  3. package/backends/codesys/config.ts +54 -0
  4. package/backends/codesys/emit.ts +1063 -0
  5. package/backends/codesys/engineering.ts +88 -0
  6. package/backends/codesys/http.ts +598 -0
  7. package/backends/codesys/index.ts +12 -0
  8. package/backends/codesys/io-paths.ts +103 -0
  9. package/backends/codesys/names.ts +76 -0
  10. package/backends/codesys/numeric.ts +356 -0
  11. package/backends/codesys/plan.ts +512 -0
  12. package/backends/codesys/publication.ts +59 -0
  13. package/backends/codesys/storage.ts +63 -0
  14. package/backends/codesys/task-access.ts +118 -0
  15. package/backends/codesys/types.ts +178 -0
  16. package/backends/codesys/vendor.ts +108 -0
  17. package/dist/cli.js +740 -0
  18. package/dist/cli.js.map +13 -0
  19. package/dist/clock.js +8 -0
  20. package/dist/clock.js.map +10 -0
  21. package/dist/codesys.js +2587 -0
  22. package/dist/codesys.js.map +22 -0
  23. package/dist/elaborate-capture.js +118 -0
  24. package/dist/elaborate-capture.js.map +10 -0
  25. package/dist/index.js +6859 -0
  26. package/dist/index.js.map +25 -0
  27. package/dist/ir.js +1888 -0
  28. package/dist/ir.js.map +22 -0
  29. package/dist/math.js +24 -0
  30. package/dist/math.js.map +10 -0
  31. package/dist/project.js +423 -0
  32. package/dist/project.js.map +11 -0
  33. package/ir/aggregates.ts +333 -0
  34. package/ir/allocation.ts +74 -0
  35. package/ir/core-model.ts +116 -0
  36. package/ir/core.ts +63 -0
  37. package/ir/declarations.ts +201 -0
  38. package/ir/diagnostics.ts +43 -0
  39. package/ir/domains.ts +96 -0
  40. package/ir/index.ts +7 -0
  41. package/ir/link.ts +176 -0
  42. package/ir/model.ts +268 -0
  43. package/ir/normalization-error.ts +10 -0
  44. package/ir/routine.ts +826 -0
  45. package/ir/scalars.ts +675 -0
  46. package/ir/types.ts +70 -0
  47. package/package.json +105 -4
  48. package/project/artifacts.ts +277 -0
  49. package/project/cli.ts +282 -0
  50. package/project/index.ts +1 -0
  51. package/project/project.ts +298 -0
  52. package/project/server.ts +83 -0
  53. package/src/frontend/async.ts +1060 -0
  54. package/src/frontend/blocks.ts +419 -0
  55. package/src/frontend/configuration.ts +167 -0
  56. package/src/frontend/const-functions.ts +153 -0
  57. package/src/frontend/cooperative.ts +75 -0
  58. package/src/frontend/elaborate/capture.ts +138 -0
  59. package/src/frontend/elaborate/graph.ts +94 -0
  60. package/src/frontend/elaborate/index.ts +302 -0
  61. package/src/frontend/elaborate/layouts.ts +390 -0
  62. package/src/frontend/elaborate/model.ts +177 -0
  63. package/src/frontend/elaborate/specialize.ts +2280 -0
  64. package/src/frontend/exposure.ts +147 -0
  65. package/src/frontend/module-graph.ts +63 -0
  66. package/src/frontend/promises.ts +751 -0
  67. package/src/frontend/services.ts +435 -0
  68. package/src/frontend/types.ts +578 -0
  69. package/src/frontend/typescript.ts +2442 -0
  70. package/src/index.ts +7 -0
  71. package/stdlib/clock.ts +2 -0
  72. package/stdlib/math.ts +19 -0
  73. package/types/async.d.ts +81 -0
  74. package/types/clock.d.ts +4 -0
  75. package/types/config.d.ts +2 -0
  76. package/types/data-types.d.ts +31 -0
  77. package/types/globals.d.ts +40 -0
  78. package/types/index.d.ts +111 -0
  79. package/types/plc.d.ts +5 -0
@@ -0,0 +1,118 @@
1
+ // @bun
2
+ // packages/compiler/src/frontend/elaborate/capture.ts
3
+ var {plugin } = globalThis.Bun;
4
+ import { readFileSync, realpathSync } from "fs";
5
+ var request = JSON.parse(readFileSync(process.argv[2], "utf8"));
6
+ var real = new Map(request.files.map((file) => [realpathSync(file), file]));
7
+ var runtime = new Set(real.keys());
8
+ var exportName = "__tsplcCapture";
9
+ var bindings = (source, names) => `${source}
10
+ ;export const ${exportName} = { values: { ${names.values.map((name) => `${JSON.stringify(name)}: () => ${name}`).join(", ")} }, classes: { ${names.classes.map((name) => `${JSON.stringify(name)}: ${name}`).join(", ")} }, functions: { ${names.functions.map((name) => `${JSON.stringify(name)}: ${name}`).join(", ")} } };
11
+ `;
12
+ var servicePath = Symbol("tsplc service path");
13
+ var service = (path) => new Proxy(function serviceProcedure() {}, {
14
+ get: (_, key) => key === servicePath ? path.join(".") : service([...path, String(key)]),
15
+ apply: () => {
16
+ throw new Error(`Setup code called the PLC service ${path.join(".")}.`);
17
+ }
18
+ });
19
+ plugin({
20
+ name: "tsplc-capture",
21
+ setup(build) {
22
+ build.onLoad({
23
+ filter: new RegExp(`^(${[...runtime].map((file) => file.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|")})$`)
24
+ }, ({ path }) => ({
25
+ contents: bindings(readFileSync(path, "utf8"), request.bindings[real.get(path)]),
26
+ loader: "ts"
27
+ }));
28
+ build.module("@tsplc/compiler/clock", () => ({
29
+ contents: "export const now = () => 0;",
30
+ loader: "js"
31
+ }));
32
+ build.module("@tsplc/compiler/async", () => ({
33
+ contents: `export const createServiceClient = () => globalThis.__tsplcService([]);
34
+ const unsupported = (name) => () => { throw new Error(name + " cannot run during PLC setup."); };
35
+ export const sleep = unsupported("sleep"), fetch = unsupported("fetch"), cancelAsync = unsupported("cancelAsync");`,
36
+ loader: "js"
37
+ }));
38
+ }
39
+ });
40
+ globalThis.__tsplcService = service;
41
+ var modules = new Map;
42
+ for (const file of [request.entry, ...request.files.filter((file) => file !== request.entry)]) {
43
+ const loaded = await import(realpathSync(file));
44
+ modules.set(file, loaded[exportName]);
45
+ }
46
+ var classes = new Map;
47
+ var functions = new Map;
48
+ for (const [file, registry] of modules) {
49
+ for (const [name, value] of Object.entries(registry.classes))
50
+ classes.set(value, { file, name });
51
+ for (const [name, value] of Object.entries(registry.functions))
52
+ functions.set(value, { file, name });
53
+ }
54
+ var nodes = [];
55
+ var ids = new Map;
56
+ var capture = (value, where) => {
57
+ if (value === undefined)
58
+ return { kind: "undefined" };
59
+ if (value === null)
60
+ throw new Error(`${where}: null has no PLC value; use undefined.`);
61
+ if (typeof value === "number" || typeof value === "boolean" || typeof value === "string")
62
+ return { kind: typeof value, value };
63
+ if (typeof value === "bigint")
64
+ return { kind: "bigint", value: String(value) };
65
+ if (typeof value !== "object" && typeof value !== "function")
66
+ throw new Error(`${where}: a ${typeof value} has no PLC value.`);
67
+ const known = ids.get(value);
68
+ if (known !== undefined)
69
+ return { kind: "node", id: known };
70
+ const id = nodes.length;
71
+ ids.set(value, id);
72
+ nodes.push({ kind: "object", fields: {} });
73
+ if (typeof value === "function") {
74
+ const path = value[servicePath];
75
+ const named = functions.get(value) ?? classes.get(value);
76
+ if (path !== undefined)
77
+ nodes[id] = { kind: "service", path };
78
+ else if (named)
79
+ nodes[id] = { kind: "function", ...named };
80
+ else
81
+ throw new Error(`${where}: setup stored a function that is not a module-level function, so the PLC can't call it.`);
82
+ return { kind: "node", id };
83
+ }
84
+ if (Array.isArray(value)) {
85
+ nodes[id] = {
86
+ kind: "array",
87
+ items: value.map((item, index) => capture(item, `${where}[${index}]`))
88
+ };
89
+ return { kind: "node", id };
90
+ }
91
+ const prototype = Object.getPrototypeOf(value);
92
+ const owner = prototype === Object.prototype || prototype === null ? undefined : prototype.constructor;
93
+ const registered = owner && classes.get(owner);
94
+ if (owner && !registered)
95
+ throw new Error(`${where}: a ${owner.name} has no PLC layout; use a class from the program.`);
96
+ const fields = {};
97
+ for (const [key, field] of Object.entries(value))
98
+ fields[key] = capture(field, `${where}.${key}`);
99
+ nodes[id] = registered ? { kind: "instance", ...registered, fields } : { kind: "object", fields };
100
+ return { kind: "node", id };
101
+ };
102
+ var graph = { nodes, bindings: [] };
103
+ for (const [file, registry] of modules)
104
+ for (const [name, read] of Object.entries(registry.values)) {
105
+ let value;
106
+ try {
107
+ value = read();
108
+ } catch {
109
+ continue;
110
+ }
111
+ if (typeof value === "function" && (functions.has(value) || classes.has(value)))
112
+ continue;
113
+ graph.bindings.push({ file, name, value: capture(value, name) });
114
+ }
115
+ process.stdout.write(JSON.stringify(graph));
116
+
117
+ //# debugId=BE55A01896BF8C3764756E2164756E21
118
+ //# sourceMappingURL=elaborate-capture.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/frontend/elaborate/capture.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Runs a program's setup code in Bun and prints the object graph it builds: every module binding,\n * and every object, array, class instance and function reachable from them. The compiler runs\n * this in a subprocess (graph.ts), so setup code never shares the compiler's process.\n *\n * Usage: bun capture.ts <request.json>\n */\nimport { plugin } from \"bun\";\nimport { readFileSync, realpathSync } from \"node:fs\";\nimport type { CaptureRequest, CapturedGraph, CapturedValue, CapturedNode } from \"./graph.ts\";\n\nconst request: CaptureRequest = JSON.parse(readFileSync(process.argv[2]!, \"utf8\"));\n// Bun loads modules by their real path; the compiler may name them through a symlink.\nconst real = new Map(request.files.map((file) => [realpathSync(file), file]));\nconst runtime = new Set(real.keys());\nconst exportName = \"__tsplcCapture\";\n\n/** Top-level bindings a module declares, so captured state can be traced back to its source. */\nconst bindings = (source: string, names: CaptureRequest[\"bindings\"][string]) =>\n `${source}\\n;export const ${exportName} = { values: { ${names.values\n .map((name) => `${JSON.stringify(name)}: () => ${name}`)\n .join(\", \")} }, classes: { ${names.classes\n .map((name) => `${JSON.stringify(name)}: ${name}`)\n .join(\", \")} }, functions: { ${names.functions\n .map((name) => `${JSON.stringify(name)}: ${name}`)\n .join(\", \")} } };\\n`;\n\nconst servicePath = Symbol(\"tsplc service path\");\n/** A service client: any property is a deeper procedure path, and its identity names that path. */\nconst service = (path: readonly string[]): unknown =>\n new Proxy(function serviceProcedure() {}, {\n get: (_, key) => (key === servicePath ? path.join(\".\") : service([...path, String(key)])),\n apply: () => {\n throw new Error(`Setup code called the PLC service ${path.join(\".\")}.`);\n },\n });\n\nplugin({\n name: \"tsplc-capture\",\n setup(build) {\n build.onLoad(\n {\n filter: new RegExp(\n `^(${[...runtime].map((file) => file.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")).join(\"|\")})$`,\n ),\n },\n ({ path }) => ({\n contents: bindings(readFileSync(path, \"utf8\"), request.bindings[real.get(path)!]!),\n loader: \"ts\",\n }),\n );\n // Setup runs before the first scan, so the clock reads 0 there.\n build.module(\"@tsplc/compiler/clock\", () => ({\n contents: \"export const now = () => 0;\",\n loader: \"js\",\n }));\n build.module(\"@tsplc/compiler/async\", () => ({\n contents: `export const createServiceClient = () => globalThis.__tsplcService([]);\n const unsupported = (name) => () => { throw new Error(name + \" cannot run during PLC setup.\"); };\n export const sleep = unsupported(\"sleep\"), fetch = unsupported(\"fetch\"), cancelAsync = unsupported(\"cancelAsync\");`,\n loader: \"js\",\n }));\n },\n});\n(globalThis as { __tsplcService?: unknown }).__tsplcService = service;\n\nconst modules = new Map<string, Record<string, Record<string, unknown>>>();\nfor (const file of [request.entry, ...request.files.filter((file) => file !== request.entry)]) {\n const loaded = (await import(realpathSync(file))) as Record<string, unknown>;\n modules.set(file, loaded[exportName] as Record<string, Record<string, unknown>>);\n}\n\nconst classes = new Map<unknown, { file: string; name: string }>();\nconst functions = new Map<unknown, { file: string; name: string }>();\nfor (const [file, registry] of modules) {\n for (const [name, value] of Object.entries(registry.classes!)) classes.set(value, { file, name });\n for (const [name, value] of Object.entries(registry.functions!))\n functions.set(value, { file, name });\n}\n\nconst nodes: CapturedNode[] = [];\nconst ids = new Map<object, number>();\nconst capture = (value: unknown, where: string): CapturedValue => {\n if (value === undefined) return { kind: \"undefined\" };\n if (value === null) throw new Error(`${where}: null has no PLC value; use undefined.`);\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"string\")\n return { kind: typeof value, value } as CapturedValue;\n if (typeof value === \"bigint\") return { kind: \"bigint\", value: String(value) };\n if (typeof value !== \"object\" && typeof value !== \"function\")\n throw new Error(`${where}: a ${typeof value} has no PLC value.`);\n const known = ids.get(value);\n if (known !== undefined) return { kind: \"node\", id: known };\n const id = nodes.length;\n ids.set(value, id);\n nodes.push({ kind: \"object\", fields: {} });\n if (typeof value === \"function\") {\n const path = (value as { [servicePath]?: string })[servicePath];\n const named = functions.get(value) ?? classes.get(value);\n if (path !== undefined) nodes[id] = { kind: \"service\", path };\n else if (named) nodes[id] = { kind: \"function\", ...named };\n else\n throw new Error(\n `${where}: setup stored a function that is not a module-level function, so the PLC can't call it.`,\n );\n return { kind: \"node\", id };\n }\n if (Array.isArray(value)) {\n nodes[id] = {\n kind: \"array\",\n items: value.map((item, index) => capture(item, `${where}[${index}]`)),\n };\n return { kind: \"node\", id };\n }\n const prototype = Object.getPrototypeOf(value);\n const owner =\n prototype === Object.prototype || prototype === null ? undefined : prototype.constructor;\n const registered = owner && classes.get(owner);\n if (owner && !registered)\n throw new Error(`${where}: a ${owner.name} has no PLC layout; use a class from the program.`);\n const fields: Record<string, CapturedValue> = {};\n for (const [key, field] of Object.entries(value)) fields[key] = capture(field, `${where}.${key}`);\n nodes[id] = registered ? { kind: \"instance\", ...registered, fields } : { kind: \"object\", fields };\n return { kind: \"node\", id };\n};\n\nconst graph: CapturedGraph = { nodes, bindings: [] };\nfor (const [file, registry] of modules)\n for (const [name, read] of Object.entries(registry.values!)) {\n let value: unknown;\n try {\n value = (read as () => unknown)();\n } catch {\n continue; // A binding the module never initialized.\n }\n if (typeof value === \"function\" && (functions.has(value) || classes.has(value))) continue;\n graph.bindings.push({ file, name, value: capture(value, name) });\n }\nprocess.stdout.write(JSON.stringify(graph));\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "BE55A01896BF8C3764756E2164756E21",
9
+ "names": []
10
+ }