@tsplc/compiler 0.0.0-stage → 0.2.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 (80) 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 +1396 -0
  18. package/dist/cli.js.map +16 -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 +429 -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 +106 -4
  48. package/project/artifacts.ts +277 -0
  49. package/project/cli.ts +305 -0
  50. package/project/index.ts +1 -0
  51. package/project/plant.ts +437 -0
  52. package/project/project.ts +312 -0
  53. package/project/server.ts +83 -0
  54. package/src/frontend/async.ts +1060 -0
  55. package/src/frontend/blocks.ts +419 -0
  56. package/src/frontend/configuration.ts +167 -0
  57. package/src/frontend/const-functions.ts +153 -0
  58. package/src/frontend/cooperative.ts +75 -0
  59. package/src/frontend/elaborate/capture.ts +138 -0
  60. package/src/frontend/elaborate/graph.ts +94 -0
  61. package/src/frontend/elaborate/index.ts +302 -0
  62. package/src/frontend/elaborate/layouts.ts +390 -0
  63. package/src/frontend/elaborate/model.ts +177 -0
  64. package/src/frontend/elaborate/specialize.ts +2280 -0
  65. package/src/frontend/exposure.ts +147 -0
  66. package/src/frontend/module-graph.ts +63 -0
  67. package/src/frontend/promises.ts +751 -0
  68. package/src/frontend/services.ts +435 -0
  69. package/src/frontend/types.ts +578 -0
  70. package/src/frontend/typescript.ts +2442 -0
  71. package/src/index.ts +7 -0
  72. package/stdlib/clock.ts +2 -0
  73. package/stdlib/math.ts +19 -0
  74. package/types/async.d.ts +81 -0
  75. package/types/clock.d.ts +4 -0
  76. package/types/config.d.ts +2 -0
  77. package/types/data-types.d.ts +31 -0
  78. package/types/globals.d.ts +40 -0
  79. package/types/index.d.ts +111 -0
  80. package/types/plc.d.ts +5 -0
@@ -0,0 +1,16 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../project/server.ts", "../project/cli.ts", "../project/plant.ts", "../project/project.ts", "../project/artifacts.ts", "../project/server.ts", "../project/project.ts"],
4
+ "sourcesContent": [
5
+ "import { existsSync } from \"node:fs\";\nimport { mkdtemp, mkdir, rm, rename } from \"node:fs/promises\";\nimport { dirname, resolve, join } from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport ts from \"typescript\";\nimport type { ResolvedTsplcConfig } from \"@tsplc/config\";\nimport { typeCheckOnly } from \"@tsplc/compiler\";\n\nexport const resolveServerModule = (root: string, name: string) =>\n name.startsWith(\".\") || name.startsWith(\"/\") || existsSync(resolve(root, name))\n ? resolve(root, name)\n : createRequire(join(root, \"package.json\")).resolve(name);\n\nconst kebabCase = (name: string) =>\n name\n .replace(/([a-z0-9])([A-Z])|([A-Z])([A-Z][a-z])/g, \"$1$3-$2$4\")\n .replace(/[^A-Za-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .toLowerCase();\n\n/** Compiles the host entry, which starts its own listener, into `build/server/<name>-services`. */\nexport const buildServer = async (config: ResolvedTsplcConfig, root: string) => {\n const settings = config.server;\n if (!settings?.runtime) throw new Error(\"Configure server.runtime to build an executable.\");\n const runtime = settings.runtime;\n const entry = resolveServerModule(root, runtime.entry);\n const windows = runtime.target\n ? runtime.target.includes(\"windows\")\n : process.platform === \"win32\";\n const outFile = resolve(\n root,\n \"build/server\",\n `${kebabCase(config.name)}-services${windows ? \".exe\" : \"\"}`,\n );\n const tsconfig = ts.findConfigFile(dirname(entry), ts.sys.fileExists);\n if (!tsconfig) throw new Error(\"Server entry requires a tsconfig.json.\");\n const read = ts.readConfigFile(tsconfig, ts.sys.readFile);\n if (read.error) throw new Error(ts.flattenDiagnosticMessageText(read.error.messageText, \"\\n\"));\n const parsed = ts.parseJsonConfigFileContent(read.config, ts.sys, dirname(tsconfig));\n const program = ts.createProgram({\n rootNames: [entry, ...parsed.fileNames.filter((file) => /\\.d\\.[cm]?ts$/.test(file))],\n options: { ...parsed.options, ...typeCheckOnly },\n projectReferences: parsed.projectReferences,\n });\n const diagnostics = [...parsed.errors, ...ts.getPreEmitDiagnostics(program)];\n if (diagnostics.length)\n throw new Error(\n ts.formatDiagnosticsWithColorAndContext(diagnostics, {\n getCanonicalFileName: (path) => path,\n getCurrentDirectory: () => root,\n getNewLine: () => \"\\n\",\n }),\n );\n await mkdir(dirname(outFile), { recursive: true });\n // Compile beside the output so dependency resolution starts from the owning project.\n const staging = await mkdtemp(join(dirname(outFile), \".tsplc-server-\"));\n try {\n const binary = join(staging, \"server\");\n const result = await Bun.build({\n entrypoints: [entry],\n env: \"disable\",\n compile: {\n outfile: binary,\n ...(runtime.target ? { target: runtime.target } : {}),\n autoloadDotenv: false,\n autoloadBunfig: false,\n autoloadTsconfig: false,\n autoloadPackageJson: false,\n },\n });\n if (!result.success) throw new AggregateError(result.logs, \"Server executable build failed.\");\n // Bun names a Windows executable itself.\n await rename(windows ? `${binary}.exe` : binary, outFile);\n return {\n server: {\n executable: outFile,\n target: runtime.target ?? `bun-${process.platform}-${process.arch}`,\n },\n };\n } finally {\n await rm(staging, { recursive: true, force: true });\n }\n};\n",
6
+ "#!/usr/bin/env bun\nimport { buildServer } from \"./server.ts\";\nimport { parseArgs } from \"node:util\";\nimport { resolve } from \"node:path\";\nimport {\n buildTargetFor,\n controllerFor,\n loadTsplcConfig,\n rawBuildConfig,\n simulationConfig,\n} from \"@tsplc/config\";\nimport {\n buildProject as buildSt,\n configureDocker,\n configureRuntime,\n inspectController,\n installLibraries,\n loadSources,\n resolveConfig,\n runProject,\n updateController,\n} from \"@tsplc/build\";\nimport { checkHostConfig } from \"@tsplc/compiler\";\nimport { type Diagnostic, formatDiagnostic, hasErrors } from \"@tsplc/compiler/ir\";\nimport { deviceTree } from \"@tsplc/typegen\";\nimport { loadHardware, resolveIo } from \"@tsplc/typegen/hardware\";\nimport { generateProject } from \"@tsplc/typegen\";\nimport { plantCommands, runPlantCommand } from \"./plant.ts\";\nimport { buildProject, checkProject, cleanProject, projectTargets } from \"./project.ts\";\n\nasync function main() {\n const { values, positionals } = parseArgs({\n allowPositionals: true,\n options: {\n config: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\" },\n \"emit-only\": { type: \"boolean\" },\n format: { type: \"string\" },\n read: { type: \"string\", multiple: true },\n \"initialize-user\": { type: \"boolean\" },\n \"frozen-lockfile\": { type: \"boolean\" },\n check: { type: \"boolean\" },\n plc: { type: \"boolean\" },\n server: { type: \"boolean\" },\n simulate: { type: \"boolean\" },\n runtime: { type: \"boolean\" },\n download: { type: \"boolean\" },\n restore: { type: \"boolean\" },\n select: { type: \"boolean\" },\n yes: { type: \"boolean\", short: \"y\" },\n },\n });\n const command = positionals[0],\n file = values.config ?? \"tsplc.config.ts\";\n if (!command || values.help) {\n console.log(\n `tsplc install|typegen|check|build|run|download|online-change|inspect|clean|configure [--config tsplc.config.ts] [--plc|--server] [--simulate] [--runtime] [--emit-only] [--format json] [--read symbol]\n\nPlant agent (TSPLC_AGENT_URL, TSPLC_AGENT_TOKEN):\n tsplc deploy [--download] [--select] [--initialize-user]\n tsplc target | status | login | logout\n tsplc vars [path] | read <expression>... | write <expression> <value>\n tsplc force <expression> <value> | unforce [expression]... [--restore]\n tsplc start | stop | reset warm|cold (-y skips confirmations)`,\n );\n return 0;\n }\n if (plantCommands.has(command)) {\n const failed = await runPlantCommand(command, positionals.slice(1), values, {\n file,\n load: () => loadTsplcConfig(file),\n });\n return failed ? report(failed, values.format) : 0;\n }\n if (positionals.length > 1) throw new Error(\"Specify one command.\");\n if (\n ![\n \"install\",\n \"typegen\",\n \"check\",\n \"build\",\n \"run\",\n \"download\",\n \"online-change\",\n \"inspect\",\n \"clean\",\n \"configure\",\n ].includes(command)\n )\n throw new Error(`Unknown command ${command}.`);\n if (values.format && ![\"json\", \"text\"].includes(values.format))\n throw new Error(\"--format must be json or text.\");\n if (values[\"emit-only\"] && command !== \"build\")\n throw new Error(\"--emit-only is supported by build only.\");\n if (values.runtime && command !== \"configure\")\n throw new Error(\"--runtime applies only to configure.\");\n if ((values.plc || values.server) && command !== \"build\")\n throw new Error(\"--plc and --server apply only to build.\");\n if (values.simulate && ![\"run\", \"download\", \"online-change\"].includes(command))\n throw new Error(\"--simulate applies only to run, download and online-change.\");\n if (values.plc && values.server)\n throw new Error(\"Choose --plc or --server, or omit both for a full build.\");\n if (values.server && values[\"emit-only\"])\n throw new Error(\"--emit-only applies to PLC emission only.\");\n const log = console.log,\n previousLogTarget = process.env[\"TSPLC_LOG_STDERR\"];\n if (values.format === \"json\") {\n console.log = console.error;\n process.env[\"TSPLC_LOG_STDERR\"] = \"1\";\n }\n let result: unknown;\n try {\n if (command === \"configure\") {\n await (values.runtime ? configureRuntime() : configureDocker());\n result = { ok: true };\n } else if (command === \"clean\") {\n result = await cleanProject(file);\n } else {\n if ([\"check\", \"build\", \"run\", \"download\", \"online-change\"].includes(command)) {\n const diagnostics = checkHostConfig(resolve(file));\n if (hasErrors(diagnostics)) throw new DiagnosticFailure({ diagnostics });\n }\n const loaded = await loadTsplcConfig(file);\n const { config, configFile, root } = loaded;\n // Generated types keep describing the hardware project; only the download omits fieldbus I/O.\n const target = values.simulate ? { ...loaded, config: simulationConfig(config) } : loaded;\n if (command === \"install\")\n result = {\n libraries: await installLibraries(config.dependencies, root, {\n frozen: values[\"frozen-lockfile\"],\n }),\n };\n else if (command === \"typegen\") {\n const targets = await projectTargets(file, { loaded });\n if (config.compiler && !values.check) {\n await generateProject(file, { hardwareOnly: true, loaded, targets });\n const emitted = await buildProject(file, { emitOnly: true, loaded });\n if (hasErrors(emitted.diagnostics)) throw new DiagnosticFailure(emitted);\n }\n result = await generateProject(file, { check: values.check, loaded, targets });\n } else if (command === \"check\") {\n result = config.compiler\n ? await checkProject(file, { loaded })\n : {\n objects: (\n await loadSources(\n resolveConfig(\n {\n ...rawBuildConfig(config),\n io: resolveIo(config, await loadHardware(config, root)),\n },\n configFile,\n ),\n )\n ).objects.length,\n };\n } else if (command === \"build\" && values.server) {\n result = await buildServer(config, root);\n } else if (command === \"build\" || command === \"run\") {\n if (config.compiler) {\n const built = await buildProject(file, {\n emitOnly: values[\"emit-only\"],\n frozenLockfile: values[\"frozen-lockfile\"],\n loaded: target,\n controller: controllerFor(config, command),\n buildTarget: buildTargetFor(command),\n });\n if (hasErrors(built.diagnostics)) throw new DiagnosticFailure(built);\n await generateProject(file, {\n loaded,\n targets: await projectTargets(file, { loaded }),\n });\n result = built;\n } else {\n if (values[\"emit-only\"]) throw new Error(\"Raw Structured Text is already emitted.\");\n if (!config.build) throw new Error(\"Configure build settings.\");\n const build = rawBuildConfig(config);\n const libraries = await installLibraries(config.dependencies, root, {\n frozen: values[\"frozen-lockfile\"],\n });\n const hardware = await loadHardware(target.config, root);\n result = await buildSt(\n resolveConfig(\n {\n ...build,\n libraries,\n io: resolveIo(target.config, hardware),\n deviceTree: await deviceTree(target.config, hardware),\n controller: controllerFor(config, command),\n },\n configFile,\n ),\n );\n await generateProject(file, { hardwareOnly: !config.typegen, loaded });\n }\n if (command === \"build\" && !values.plc && !values[\"emit-only\"] && config.server?.runtime) {\n const backend = await buildServer(config, root);\n result = { ...(typeof result === \"object\" && result !== null ? result : {}), ...backend };\n }\n if (command === \"run\") {\n if (!config.build) throw new Error(\"Configure build to run this project.\");\n await runProject(\n resolveConfig(config.compiler ? config.build : rawBuildConfig(config), configFile),\n config.name,\n );\n }\n } else if (command === \"inspect\") {\n if (!config.build) throw new Error(\"Configure build settings and controller connection.\");\n // Inspection needs only the connection/baseline. It must remain usable\n // when local sources, descriptors or dependency caches are unavailable.\n result = await inspectController(\n resolveConfig(\n { ...config.build, controller: controllerFor(config, command) },\n configFile,\n ),\n values.read,\n );\n } else if ([\"download\", \"online-change\"].includes(command)) {\n if (!config.build) throw new Error(\"Configure build settings and controller connection.\");\n let settings: ReturnType<typeof resolveConfig>;\n if (config.compiler) {\n const emitted = await buildProject(file, {\n emitOnly: true,\n forController: true,\n frozenLockfile: values[\"frozen-lockfile\"],\n loaded: target,\n buildTarget: buildTargetFor(command),\n });\n if (hasErrors(emitted.diagnostics)) throw new DiagnosticFailure(emitted);\n if (!emitted.controllerConfig)\n throw new Error(\"Configure build settings for deployment.\");\n // Emission already resolves the generated entry/task paths. Passing\n // this through the input schema again would reject its configFile.\n settings = { ...emitted.controllerConfig, io: {} };\n } else\n settings = {\n ...resolveConfig(\n {\n ...rawBuildConfig(config),\n io: resolveIo(target.config, await loadHardware(target.config, root)),\n },\n configFile,\n ),\n libraries: await installLibraries(config.dependencies, root, {\n frozen: values[\"frozen-lockfile\"],\n }),\n };\n result = await updateController(\n { ...settings, controller: controllerFor(config, command) },\n command as \"download\" | \"online-change\",\n {\n initializeUser: values[\"initialize-user\"],\n read: values.read,\n },\n );\n } else throw new Error(`Unknown command ${command}.`);\n }\n } finally {\n console.log = log;\n if (previousLogTarget === undefined) delete process.env[\"TSPLC_LOG_STDERR\"];\n else process.env[\"TSPLC_LOG_STDERR\"] = previousLogTarget;\n }\n return report(result, values.format);\n}\nclass DiagnosticFailure extends Error {\n constructor(readonly result: unknown) {\n super(\"PLC validation failed.\");\n }\n}\nfunction report(result: unknown, format?: string) {\n const diagnostics =\n result && typeof result === \"object\" && \"diagnostics\" in result\n ? (result.diagnostics as Diagnostic[])\n : [];\n const ok = !hasErrors(diagnostics);\n if (format === \"json\")\n console.log(\n JSON.stringify({ ok, ...(result && typeof result === \"object\" ? result : { result }) }),\n );\n else {\n for (const diagnostic of diagnostics) console.error(formatDiagnostic(diagnostic));\n if (ok) console.log(\"tsPLC completed.\");\n }\n return ok ? 0 : 1;\n}\ntry {\n process.exitCode = await main();\n} catch (cause) {\n // main() may fail before its options parse, so detect JSON output from raw argv.\n const json = process.argv.includes(\"json\") || process.argv.includes(\"--format=json\");\n if (cause instanceof DiagnosticFailure) {\n process.exitCode = report(cause.result, json ? \"json\" : undefined);\n } else {\n const message = cause instanceof Error ? cause.message : String(cause);\n if (json)\n console.log(\n JSON.stringify({\n ok: false,\n diagnostics: [{ origin: \"config\", code: \"PLC5003\", severity: \"error\", message }],\n }),\n );\n else console.error(message);\n process.exitCode = 1;\n }\n}\n",
7
+ "import { basename, relative, resolve, sep } from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\nimport { pathToFileURL } from \"node:url\";\nimport {\n AgentOperationError,\n type AgentClient,\n createAgentClient,\n type ReleaseFile,\n} from \"@tsplc/agent/client\";\nimport type { Credentials, ReleaseManifest, Target, Variable } from \"@tsplc/agent\";\nimport type { LoginCommand, LoginResult } from \"@tsplc/build\";\nimport { controllerFor, type loadTsplcConfig } from \"@tsplc/config\";\nimport { hasErrors } from \"@tsplc/compiler/ir\";\nimport { generateProject } from \"@tsplc/typegen\";\nimport { z } from \"zod\";\nimport { buildProject, projectTargets } from \"./project.ts\";\nimport { buildServer } from \"./server.ts\";\n\nexport const plantCommands = new Set([\n \"deploy\",\n \"target\",\n \"status\",\n \"login\",\n \"logout\",\n \"vars\",\n \"read\",\n \"write\",\n \"force\",\n \"unforce\",\n \"start\",\n \"stop\",\n \"reset\",\n]);\n\nexport interface PlantFlags {\n download?: boolean;\n \"initialize-user\"?: boolean;\n restore?: boolean;\n select?: boolean;\n yes?: boolean;\n \"frozen-lockfile\"?: boolean;\n}\n\ntype LoadedConfig = Awaited<ReturnType<typeof loadTsplcConfig>>;\n\nconst ask = async (question: string) => {\n const lines = createInterface({ input: process.stdin, output: process.stdout });\n try {\n return (await lines.question(question)).trim();\n } finally {\n lines.close();\n }\n};\n\n/** Reads a line without echoing it. */\nconst askSecret = (question: string) =>\n new Promise<string>((accept, reject) => {\n if (!process.stdin.isTTY) {\n reject(new Error(\"The controller password needs an interactive terminal.\"));\n return;\n }\n // Echo goes off before the prompt appears, so nothing typed at it can show.\n process.stdin.setRawMode(true);\n process.stdin.setEncoding(\"utf8\");\n process.stdin.resume();\n process.stdout.write(question);\n let secret = \"\";\n const finish = () => {\n process.stdin.off(\"data\", read);\n process.stdin.setRawMode(false);\n process.stdin.pause();\n process.stdout.write(\"\\n\");\n };\n const read = (text: string) => {\n for (const character of text) {\n if (character === \"\\r\" || character === \"\\n\") {\n finish();\n accept(secret);\n return;\n }\n if (character === \"\\u0003\") {\n finish();\n reject(new Error(\"Cancelled.\"));\n return;\n }\n secret = character === \"\\u007f\" ? secret.slice(0, -1) : secret + character;\n }\n };\n process.stdin.on(\"data\", read);\n });\n\nconst choose = async <T>(question: string, items: readonly T[], label: (item: T) => string) => {\n items.forEach((item, index) => console.log(` ${index + 1}. ${label(item)}`));\n while (true) {\n const item = items[Number(await ask(`${question} [1-${items.length}]: `)) - 1];\n if (item !== undefined) return item;\n }\n};\n\nconst confirm = async (question: string, flags: PlantFlags) =>\n flags.yes || /^y(es)?$/i.test(await ask(`${question} [y/N]: `));\n\nconst askCredentials = async (): Promise<Credentials> => ({\n username: await ask(\"Controller username: \"),\n password: await askSecret(\"Controller password: \"),\n});\n\nconst progress = (message: string) => console.log(` ${message}`);\n\nconst connect = () => {\n const environment = z\n .object({\n TSPLC_AGENT_URL: z.url({\n error: \"Set TSPLC_AGENT_URL to the plant agent, such as http://line-pc:4850\",\n }),\n TSPLC_AGENT_TOKEN: z.string({ error: \"Set TSPLC_AGENT_TOKEN to the plant agent's token\" }),\n })\n .parse(process.env);\n return createAgentClient({\n url: environment.TSPLC_AGENT_URL,\n token: environment.TSPLC_AGENT_TOKEN,\n });\n};\n\nconst selectTarget = async (agent: AgentClient): Promise<Target> => {\n const interfaces = await agent.interfaces();\n if (!interfaces.length) throw new Error(\"The plant PC has no IPv4 network.\");\n const network =\n interfaces.length === 1 && interfaces[0]\n ? interfaces[0]\n : await choose(\n \"Which network is the controller on?\",\n interfaces,\n (item) => `${item.name} ${item.address}/${item.prefixLength}`,\n );\n console.log(`Scanning ${network.address}/${network.prefixLength} for CODESYS controllers…`);\n const found = await agent.discover(network.name);\n const manual = { address: \"\", port: 11740, hostname: null };\n const choice = await choose(\"Which controller?\", [...found, manual], (item) =>\n item === manual\n ? \"Enter an address\"\n : `${item.address}${item.hostname ? ` (${item.hostname})` : \"\"}`,\n );\n const host = choice === manual ? await ask(\"Controller address: \") : choice.address;\n return agent.setTarget({ host, port: choice.port });\n};\n\n/** Every published leaf the generated contract describes, as CODESYS expressions name it. */\nconst contractVariables = async (config: LoadedConfig[\"config\"], root: string) => {\n if (!config.typegen) return [];\n const contract = z\n .object({\n symbols: z.array(z.object({ name: z.string(), gvl: z.string(), type: z.string() })),\n typeFields: z.record(z.string(), z.array(z.object({ field: z.string(), type: z.string() }))),\n })\n .parse(await import(pathToFileURL(resolve(root, config.typegen.dir, \"plc.ts\")).href));\n return contract.symbols.flatMap(({ name, gvl, type }): Variable[] => {\n const path = `${gvl}.${name}`;\n const fields = contract.typeFields[type];\n if (!fields) return [{ path, type }];\n return fields.map((field) => ({\n path:\n field.field === \"\"\n ? path\n : `${path}${field.field.startsWith(\"[\") ? \"\" : \".\"}${field.field}`,\n type: field.type,\n }));\n });\n};\n\n/** Compiles the production program and its server into the files `tsplc deploy` uploads. */\nconst prepareRelease = async (file: string, loaded: LoadedConfig, flags: PlantFlags) => {\n const { config, root } = loaded;\n if (!config.compiler) throw new Error(\"tsplc deploy deploys tsPLC programs; configure compiler.\");\n const emitted = await buildProject(file, {\n emitOnly: true,\n forController: true,\n frozenLockfile: flags[\"frozen-lockfile\"],\n loaded,\n buildTarget: \"production\",\n controller: controllerFor(config, \"deploy\"),\n });\n if (hasErrors(emitted.diagnostics)) return { diagnostics: emitted.diagnostics };\n const settings = emitted.controllerConfig;\n if (!settings) throw new Error(\"Configure build settings for deployment.\");\n await generateProject(file, { loaded, targets: await projectTargets(file, { loaded }) });\n\n const portable = (path: string) => path.split(sep).join(\"/\");\n const libraries = (settings.libraries ?? []).map((library) => ({\n ...library,\n release: `libraries/${library.sha256}-${basename(library.path)}`,\n }));\n const files: ReleaseFile[] = [\n { path: \"template.project\", content: Bun.file(settings.template) },\n ...libraries.map((library) => ({ path: library.release, content: Bun.file(library.path) })),\n ];\n // Plain TypeScript programs emit their generated modules under `.tsplc/`.\n for await (const source of new Bun.Glob(\"**/*\").scan({ cwd: settings.sourceDir, dot: true }))\n files.push({\n path: `st/${portable(source)}`,\n content: Bun.file(resolve(settings.sourceDir, source)),\n });\n let server: string | undefined;\n if (config.server?.runtime) {\n const { executable } = (await buildServer(config, root)).server;\n server = `server/${basename(executable)}`;\n files.push({ path: server, content: Bun.file(executable) });\n }\n const manifest: ReleaseManifest = {\n // Paths are relative to the release; the agent supplies the output and controller settings.\n config: {\n io: {},\n deviceTree: settings.deviceTree,\n controller: settings.controller,\n libraryReferences: settings.libraryReferences,\n libraries: libraries.map(({ release, ...library }) => ({ ...library, path: release })),\n task: settings.task,\n tasks: settings.tasks,\n removeObjects: settings.removeObjects,\n symbols: settings.symbols,\n timeouts: settings.timeouts,\n template: \"template.project\",\n sourceDir: \"st\",\n entry: `st/${portable(relative(settings.sourceDir, settings.entry))}`,\n },\n variables: await contractVariables(config, root),\n server,\n };\n return { release: { manifest, files } };\n};\n\nconst deploy = async (\n agent: AgentClient,\n file: string,\n loaded: LoadedConfig,\n flags: PlantFlags,\n) => {\n const status = await agent.status();\n if (status.login) throw new Error(\"A login is open; log out before deploying: tsplc logout\");\n const target = !status.target || flags.select ? await selectTarget(agent) : status.target;\n console.log(`Building the release for ${target.host}…`);\n const { release, diagnostics } = await prepareRelease(file, loaded, flags);\n if (!release) return { diagnostics };\n if (\n flags.download &&\n !(await confirm(\n \"A full download stops the running application while it loads. Continue?\",\n flags,\n ))\n )\n throw new Error(\"Cancelled.\");\n const credentials = await askCredentials();\n const settings = {\n credentials,\n download: flags.download ?? false,\n initializeUser: flags[\"initialize-user\"] ?? false,\n };\n console.log(\n release.manifest.server ? \"Deploying the server and the program…\" : \"Deploying the program…\",\n );\n try {\n return await agent.deploy(release, settings, progress);\n } catch (error) {\n if (\n !(error instanceof AgentOperationError && error.downloadRequired) ||\n !(await confirm(\n `${error.message}. A full download stops the running application while it loads. Download now?`,\n flags,\n ))\n )\n throw error;\n return agent.deploy(release, { ...settings, download: true }, progress);\n }\n};\n\n/** Opens a login when none is open; it stays open across commands until `tsplc logout`. */\nconst ensureLogin = async (agent: AgentClient) => {\n if ((await agent.status()).login) return;\n const credentials = await askCredentials();\n console.log(\n \"Logging in. CODESYS takes a few minutes to start; the login stays open until tsplc logout.\",\n );\n await agent.login(credentials, progress);\n};\n\n/** The children of `prefix` in the variable tree, with array indexes folded into one range. */\nexport const variableChildren = (variables: readonly Variable[], prefix: string) => {\n const children = new Map<string, { type?: string; leaves: number }>();\n const start = prefix.toLowerCase();\n for (const { path, type } of variables) {\n const lower = path.toLowerCase();\n if (\n prefix &&\n !(lower === start || lower.startsWith(`${start}.`) || lower.startsWith(`${start}[`))\n )\n continue;\n const rest = path.slice(prefix.length).replace(/^\\./, \"\");\n if (rest === \"\") return [{ name: path, type, leaves: 1 }];\n const name = /^(\\[[^\\]]*\\]|[^.[]+)/.exec(rest)?.[0] ?? rest;\n const child = children.get(name) ?? { leaves: 0 };\n children.set(name, { type: rest === name ? type : undefined, leaves: child.leaves + 1 });\n }\n const indexes = [...children.keys()]\n .filter((name) => /^\\[\\d+\\]$/.test(name))\n .map((name) => Number(name.slice(1, -1)));\n const listed = [...children].filter(([name]) => !/^\\[\\d+\\]$/.test(name));\n if (indexes.length) {\n const first = children.get(`[${Math.min(...indexes)}]`);\n listed.unshift([`[${Math.min(...indexes)}..${Math.max(...indexes)}]`, first ?? { leaves: 0 }]);\n }\n return listed.map(([name, child]) => ({ name, ...child }));\n};\n\nconst printLogin = (result: LoginResult) => {\n if (\"values\" in result) {\n for (const [expression, value] of Object.entries(result.values))\n console.log(`${expression} = ${value}`);\n return;\n }\n console.log(`Application ${result.state}`);\n if (result.forced.length) console.log(`Forced: ${result.forced.join(\", \")}`);\n};\n\n/**\n * Runs a command against the plant agent named by TSPLC_AGENT_URL and TSPLC_AGENT_TOKEN.\n * Returns a deployment's compiler diagnostics when the program doesn't compile.\n */\nexport const runPlantCommand = async (\n command: string,\n args: string[],\n flags: PlantFlags,\n project: { file: string; load: () => Promise<LoadedConfig> },\n) => {\n const agent = connect();\n const expect = (count: number, usage: string) => {\n if (args.length !== count) throw new Error(`Usage: tsplc ${command} ${usage}`);\n };\n const send = async (loginCommand: LoginCommand) => {\n await ensureLogin(agent);\n printLogin(await agent.command(loginCommand));\n };\n switch (command) {\n case \"deploy\": {\n expect(0, \"[--download] [--select] [--initialize-user]\");\n const deployed = await deploy(agent, project.file, await project.load(), flags);\n if (\"diagnostics\" in deployed) return deployed;\n console.log(`Deployed release ${deployed.id} (${deployed.operation}).`);\n return;\n }\n case \"target\": {\n expect(0, \"\");\n const target = await selectTarget(agent);\n console.log(`Deployments now go to ${target.host}:${target.port}.`);\n return;\n }\n case \"status\": {\n expect(0, \"\");\n const status = await agent.status();\n console.log(\n `Controller ${status.target ? `${status.target.host}:${status.target.port}` : \"not selected (tsplc target)\"}`,\n );\n console.log(\n `Release ${status.release ? `${status.release.id}, ${status.release.operation} at ${status.release.deployedAt}` : \"none\"}`,\n );\n console.log(\n `Server ${status.server ? `${status.server.running ? \"running\" : \"restarting\"} (${status.server.executable})` : \"none\"}`,\n );\n console.log(\n `Login ${status.login ? `open; application ${status.login.state}${status.login.forced.length ? `; forced: ${status.login.forced.join(\", \")}` : \"\"}` : \"closed\"}`,\n );\n return;\n }\n case \"login\":\n expect(0, \"\");\n await ensureLogin(agent);\n printLogin(await agent.command({ command: \"state\" }));\n return;\n case \"logout\": {\n expect(0, \"\");\n const forced = (await agent.status()).login?.forced ?? [];\n if (\n forced.length &&\n !(await confirm(\n `Forced: ${forced.join(\", \")}. Forces stay on the controller after logout. Log out anyway?`,\n flags,\n ))\n )\n throw new Error(\"Cancelled.\");\n await agent.logout();\n console.log(\"Logged out.\");\n return;\n }\n case \"vars\": {\n if (args.length > 1) throw new Error(\"Usage: tsplc vars [path]\");\n const variables = await agent.variables();\n const children = variableChildren(variables, args[0] ?? \"\");\n if (!children.length) throw new Error(`No published variable ${args[0]}.`);\n for (const child of children)\n console.log(`${child.name.padEnd(32)} ${child.type ?? `${child.leaves} variables`}`);\n return;\n }\n case \"read\": {\n const [first, ...rest] = args;\n if (!first) throw new Error(\"Usage: tsplc read <expression>...\");\n return send({ command: \"read\", expressions: [first, ...rest] });\n }\n case \"write\":\n case \"force\": {\n const [expression, value, ...extra] = args;\n if (!expression || !value || extra.length)\n throw new Error(`Usage: tsplc ${command} <expression> <value>`);\n return send({ command, values: { [expression]: value } });\n }\n case \"unforce\":\n return send({ command: \"unforce\", expressions: args, restore: flags.restore ?? false });\n case \"start\":\n expect(0, \"\");\n return send({ command: \"start\" });\n case \"stop\":\n expect(0, \"\");\n if (!(await confirm(\"Stop the application on the controller?\", flags)))\n throw new Error(\"Cancelled.\");\n return send({ command: \"stop\" });\n case \"reset\": {\n expect(1, \"warm|cold\");\n const kind = z.enum([\"warm\", \"cold\"]).parse(args[0]);\n if (\n !(await confirm(\n `Reset the application (${kind})? It stops and reinitializes its variables.`,\n flags,\n ))\n )\n throw new Error(\"Cancelled.\");\n return send({ command: \"reset\", kind: kind === \"warm\" ? \"Warm\" : \"Cold\" });\n }\n }\n};\n",
8
+ "import { copyFile, mkdir, mkdtemp, realpath, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\nimport {\n buildCodesys,\n codesysBuildConfig,\n type CodesysPlan,\n diagnoseCodesys,\n emitCodesys,\n ioTargets,\n publicationSelectors,\n planCodesys,\n} from \"@tsplc/compiler/codesys\";\nimport { analyze, checkHostConfig } from \"@tsplc/compiler\";\nimport {\n type Controller,\n type BuildTarget,\n type NormalizedConfig,\n type ResolvedTsplcConfig,\n compilerConfig,\n loadTsplcConfig,\n} from \"@tsplc/config\";\nimport { deviceTree, type ProjectTargets, loadHardware, resolveIo } from \"@tsplc/typegen\";\nimport { installLibraries } from \"@tsplc/build\";\nimport { type Diagnostic, hasErrors, normalizeModule } from \"@tsplc/compiler/ir\";\nimport { cleanArtifacts, engineeringDirectory, owned, publishArtifacts } from \"./artifacts.ts\";\n\nconst failure = (origin: Diagnostic[\"origin\"], code: string, cause: unknown): Diagnostic => ({\n origin,\n code,\n severity: \"error\",\n message: cause instanceof Error ? cause.message : String(cause),\n});\n\ntype LoadedConfig = Awaited<ReturnType<typeof loadTsplcConfig>>;\n\nasync function loadProject(\n file: string,\n loaded?: LoadedConfig,\n buildTarget?: BuildTarget,\n): Promise<{\n config?: NormalizedConfig;\n configFile: string;\n shared?: ResolvedTsplcConfig;\n diagnostics: readonly Diagnostic[];\n}> {\n let configFile = resolve(file);\n try {\n configFile = await realpath(configFile);\n const diagnostics = checkHostConfig(configFile);\n if (hasErrors(diagnostics)) return { configFile, diagnostics };\n const shared = (loaded ?? (await loadTsplcConfig(configFile))).config;\n const root = dirname(configFile);\n\n const config = compilerConfig(\n shared,\n resolveIo(shared, await loadHardware(shared, root)),\n buildTarget,\n );\n return {\n configFile,\n shared,\n config: { ...config, ...sourceInput(config, root) },\n diagnostics,\n };\n } catch (cause) {\n return { configFile, diagnostics: [failure(\"config\", \"PLC5003\", cause)] };\n }\n}\n\n/** The analyzer's entry points, resolved against the config file's directory. */\nfunction sourceInput(\n compiler: { tsconfig: string; programs: Record<string, { module: string; export: string }> },\n root: string,\n) {\n return {\n tsconfig: resolve(root, compiler.tsconfig),\n programs: Object.fromEntries(\n Object.entries(compiler.programs).map(([name, entry]) => [\n name,\n { ...entry, module: resolve(root, entry.module) },\n ]),\n ),\n };\n}\n\n/**\n * I/O keys and publication selectors from analyzed PLC source. It ignores the\n * config's own type errors, so a typo cannot switch off the types that flag it;\n * it is undefined only while the source itself fails analysis.\n */\nexport async function projectTargets(\n file = \"tsplc.config.ts\",\n options: { loaded?: LoadedConfig } = {},\n): Promise<ProjectTargets | undefined> {\n const configFile = await realpath(resolve(file));\n const { config } = options.loaded ?? (await loadTsplcConfig(configFile));\n if (!config.compiler) return undefined;\n const source = analyze({\n ...sourceInput(config.compiler, dirname(configFile)),\n services: config.server,\n });\n const core = source.module && normalizeModule(source.module).core;\n return core ? { io: ioTargets(core), publication: publicationSelectors(core) } : undefined;\n}\n\nexport async function checkProject(\n file = \"tsplc.config.ts\",\n options: { loaded?: LoadedConfig; buildTarget?: BuildTarget } = {},\n): Promise<{\n configFile: string;\n config?: NormalizedConfig;\n shared?: ResolvedTsplcConfig;\n plan?: CodesysPlan;\n diagnostics: readonly Diagnostic[];\n}> {\n const loaded = await loadProject(file, options.loaded, options.buildTarget);\n if (!loaded.config) {\n return loaded;\n }\n\n const config = loaded.config;\n if (config.target.kind !== \"codesys\") {\n return {\n ...loaded,\n diagnostics: [failure(\"backend\", \"PLC7001\", `Unsupported target: ${config.target.kind}`)],\n };\n }\n\n const source = analyze({\n tsconfig: config.tsconfig,\n programs: config.programs,\n services: loaded.shared?.server,\n });\n if (!source.module) {\n return { ...loaded, diagnostics: source.diagnostics };\n }\n const normalized = normalizeModule(source.module);\n if (!normalized.core) {\n return { ...loaded, diagnostics: normalized.diagnostics };\n }\n\n const tasks = config.tasks.map((task) => ({\n name: task.name,\n intervalNanoseconds: task.schedule.interval.nanoseconds,\n priority: task.priority,\n programs: task.programs,\n }));\n const planned = planCodesys(normalized.core, { tasks }, config.target.options);\n return {\n ...loaded,\n ...planned,\n diagnostics: [\n ...loaded.diagnostics,\n ...source.diagnostics,\n ...normalized.diagnostics,\n ...planned.diagnostics,\n ],\n };\n}\n\n/** The installed libraries and fieldbus device tree a CODESYS project of this program needs. */\nasync function engineeringInputs(\n shared: ResolvedTsplcConfig,\n configFile: string,\n bundle: Pick<ReturnType<typeof emitCodesys>, \"ioMappings\">,\n frozen?: boolean,\n) {\n const root = dirname(configFile);\n const tree = await deviceTree(shared, await loadHardware(shared, root));\n return {\n libraries: await installLibraries(shared.dependencies, root, { frozen }),\n // The emitted names locate mapped IO; the tree maps their channels.\n deviceTree: tree && {\n ...tree,\n mappings: bundle.ioMappings.map(({ address, variable }) => ({ address, variable })),\n },\n };\n}\n\nexport async function buildProject(\n file = \"tsplc.config.ts\",\n options: {\n emitOnly?: boolean;\n frozenLockfile?: boolean;\n loaded?: LoadedConfig;\n controller?: Controller;\n buildTarget?: BuildTarget;\n /** Resolve libraries and the device tree into `controllerConfig` even when only emitting. */\n forController?: boolean;\n } = {},\n): Promise<{\n directory?: string;\n status?: \"emitted\" | \"vendor-compiled\";\n controllerConfig?: ReturnType<typeof codesysBuildConfig>;\n diagnostics: readonly Diagnostic[];\n}> {\n let staging: string | undefined;\n try {\n const configFile = await realpath(resolve(file));\n // Withdraw the previous success receipt before checking the new source.\n // Old artifacts remain owned and intact until publication succeeds.\n const previous = await owned(configFile, true);\n if (previous.unknown.length) {\n throw new Error(`Output contains unrelated files: ${previous.unknown.join(\", \")}`);\n }\n\n const checked = await checkProject(configFile, {\n loaded: options.loaded,\n buildTarget: options.buildTarget,\n });\n if (!checked.plan || !checked.config) {\n return { diagnostics: checked.diagnostics };\n }\n const bundle = emitCodesys(checked.plan);\n if (hasErrors(bundle.diagnostics)) {\n return { diagnostics: bundle.diagnostics };\n }\n const shared = checked.shared;\n const engineering =\n shared && (!options.emitOnly || options.forController)\n ? await engineeringInputs(shared, configFile, bundle, options.frozenLockfile)\n : undefined;\n const controllerConfig = shared?.build\n ? codesysBuildConfig(checked.plan, bundle, {\n configFile,\n sourceDir: join(previous.output, \"st\"),\n outDir: resolve(dirname(configFile), shared.build.outDir),\n controller: options.controller,\n ...engineering,\n })\n : undefined;\n\n await mkdir(previous.root, { recursive: true });\n staging = await mkdtemp(join(previous.root, \"stage-\"));\n const artifacts = [\n ...bundle.artifacts,\n { path: \"mappings.json\", content: `${JSON.stringify(bundle.mappings, null, 2)}\\n` },\n { path: \"io-symbols.json\", content: `${JSON.stringify(bundle.ioSymbols, null, 2)}\\n` },\n { path: \"publication.json\", content: `${JSON.stringify(bundle.publication, null, 2)}\\n` },\n { path: \"config.json\", content: `${JSON.stringify(checked.config, null, 2)}\\n` },\n ];\n for (const artifact of artifacts) {\n const path = join(staging, \"st\", artifact.path);\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, artifact.content);\n }\n\n let vendor: Awaited<ReturnType<typeof buildCodesys>> | undefined;\n if (!options.emitOnly) {\n // The engineering cache has its own ownership marker and survives clean.\n const outDir = shared?.build\n ? resolve(dirname(configFile), shared.build.outDir ?? \"build\")\n : join(previous.root, \"engineering\");\n await engineeringDirectory(outDir, configFile);\n try {\n vendor = await buildCodesys(checked.plan, bundle, {\n configFile,\n sourceDir: join(staging, \"st\"),\n outDir,\n controller: options.controller,\n ...engineering,\n });\n } catch (cause) {\n return { diagnostics: diagnoseCodesys(cause, bundle) };\n }\n\n const vendorArtifacts = [\n [\"Application.project\", vendor.project],\n [\"Application.app\", vendor.output],\n [\"Application.crc\", vendor.checksum],\n ] as const;\n for (const [name, path] of vendorArtifacts) {\n if (!path) continue;\n const destination = join(staging, \"vendor\", name);\n await mkdir(dirname(destination), { recursive: true });\n await copyFile(path, destination);\n }\n }\n\n const status = vendor ? \"vendor-compiled\" : \"emitted\";\n await publishArtifacts(staging, previous, {\n configFile,\n status,\n ...(vendor && { vendor: { application: vendor.application, tasks: vendor.tasks } }),\n });\n // Publication moved this directory into place; it is no longer staging.\n staging = undefined;\n return {\n directory: previous.output,\n status,\n ...(controllerConfig && { controllerConfig }),\n diagnostics: [...checked.diagnostics, ...bundle.diagnostics],\n };\n } catch (cause) {\n return { diagnostics: [failure(\"config\", \"PLC5004\", cause)] };\n } finally {\n if (staging) {\n await rm(staging, { recursive: true, force: true });\n }\n }\n}\n\nexport async function cleanProject(file = \"tsplc.config.ts\"): Promise<{\n diagnostics: readonly Diagnostic[];\n}> {\n try {\n await cleanArtifacts(await realpath(resolve(file)));\n return { diagnostics: [] };\n } catch (cause) {\n return { diagnostics: [failure(\"config\", \"PLC5004\", cause)] };\n }\n}\n",
9
+ "import { createHash } from \"node:crypto\";\nimport { lstat, mkdir, readdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { buildCodesys } from \"@tsplc/compiler/codesys\";\n\nconst missing = (cause: unknown): boolean =>\n cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\";\nconst digest = (value: string | Uint8Array): string =>\n createHash(\"sha256\").update(value).digest(\"hex\");\n\n// Ownership is an explicit boundary: generated files must match their manifest,\n// and engineering trees must belong to this configuration before vendor writes.\ninterface Manifest {\n kind: \"tsplc-artifacts\";\n version: 1;\n configFile: string;\n files: { path: string; sha256: string }[];\n}\n\nfunction manifest(value: unknown, configFile: string): Manifest {\n if (\n typeof value !== \"object\" ||\n value === null ||\n !(\"kind\" in value) ||\n value.kind !== \"tsplc-artifacts\" ||\n !(\"version\" in value) ||\n value.version !== 1 ||\n !(\"configFile\" in value) ||\n value.configFile !== configFile ||\n !(\"files\" in value) ||\n !Array.isArray(value.files)\n ) {\n throw new Error(\"Output directory has no matching tsPLC ownership manifest.\");\n }\n\n const files = value.files.map((item: unknown) => {\n if (\n typeof item !== \"object\" ||\n item === null ||\n !(\"path\" in item) ||\n typeof item.path !== \"string\" ||\n !/^[A-Za-z0-9_ .-]+(?:\\/[A-Za-z0-9_ .-]+)*$/.test(item.path) ||\n item.path.split(\"/\").some((part) => part === \".\" || part === \"..\") ||\n [\"manifest.json\", \"receipt.json\"].includes(item.path) ||\n !(\"sha256\" in item) ||\n typeof item.sha256 !== \"string\" ||\n !/^[0-9a-f]{64}$/.test(item.sha256)\n ) {\n throw new Error(\"Invalid generated file ownership entry.\");\n }\n return { path: item.path, sha256: item.sha256 };\n });\n if (new Set(files.map((item) => item.path)).size !== files.length) {\n throw new Error(\"Duplicate generated file ownership entry.\");\n }\n return { kind: \"tsplc-artifacts\", version: 1, configFile, files };\n}\n\nasync function directory(path: string): Promise<boolean> {\n try {\n const entry = await lstat(path);\n if (!entry.isDirectory() || entry.isSymbolicLink()) {\n throw new Error(`Generated directory must be a real directory: ${path}`);\n }\n return true;\n } catch (cause) {\n if (missing(cause)) {\n return false;\n }\n throw cause;\n }\n}\n\nasync function filesIn(path: string, prefix = \"\"): Promise<string[]> {\n const result: string[] = [];\n for (const entry of await readdir(path, { withFileTypes: true })) {\n const name = prefix + entry.name;\n if (entry.isDirectory() && !entry.isSymbolicLink()) {\n result.push(...(await filesIn(join(path, entry.name), `${name}/`)));\n } else {\n result.push(name);\n }\n }\n return result;\n}\n\nexport async function engineeringDirectory(path: string, configFile: string): Promise<void> {\n const marker = join(path, \"ownership.json\");\n const exists = await directory(path);\n if (!exists || !(await readdir(path)).length) {\n await mkdir(path, { recursive: true });\n await writeFile(\n marker,\n `${JSON.stringify({ kind: \"tsplc-engineering\", version: 1, configFile }, null, 2)}\\n`,\n { flag: \"wx\" },\n );\n } else {\n const entry = await lstat(marker).catch((cause: unknown) => {\n if (missing(cause)) {\n throw new Error(`Engineering cache has no matching tsPLC ownership marker: ${path}`);\n }\n throw cause;\n });\n if (!entry.isFile() || entry.isSymbolicLink()) {\n throw new Error(\"Engineering ownership marker must be a real file.\");\n }\n const value = JSON.parse(await readFile(marker, \"utf8\"));\n if (\n value?.kind !== \"tsplc-engineering\" ||\n value.version !== 1 ||\n value.configFile !== configFile\n ) {\n throw new Error(`Engineering cache has no matching tsPLC ownership marker: ${path}`);\n }\n }\n\n const inspect = async (directory: string): Promise<void> => {\n for (const entry of await readdir(directory, { withFileTypes: true })) {\n const child = join(directory, entry.name);\n if (entry.isSymbolicLink()) {\n throw new Error(`Engineering cache must not contain symlinks: ${child}`);\n }\n if (entry.isDirectory()) {\n await inspect(child);\n }\n }\n };\n await inspect(path);\n}\n\nexport async function owned(\n configFile: string,\n withdrawReceipt = false,\n): Promise<{ root: string; output: string; ownership?: Manifest; unknown: string[] }> {\n const root = join(dirname(configFile), \".tsplc\");\n const output = join(root, \"artifacts\");\n if (!(await directory(root)) || !(await directory(output))) {\n return { root, output, unknown: [] };\n }\n\n const manifestPath = join(output, \"manifest.json\");\n const manifestEntry = await lstat(manifestPath);\n if (!manifestEntry.isFile() || manifestEntry.isSymbolicLink()) {\n throw new Error(\"Ownership manifest must be a real file.\");\n }\n const ownership = manifest(JSON.parse(await readFile(manifestPath, \"utf8\")), configFile);\n const receipt = join(output, \"receipt.json\");\n try {\n const entry = await lstat(receipt);\n if (!entry.isFile() || entry.isSymbolicLink()) {\n throw new Error(\"Build receipt must be a real file.\");\n }\n const value = JSON.parse(await readFile(receipt, \"utf8\"));\n if (\n value?.kind !== \"tsplc-build\" ||\n value.version !== 1 ||\n value.configFile !== configFile ||\n ![\"emitted\", \"vendor-compiled\"].includes(value.status)\n ) {\n throw new Error(\"Build receipt is not owned by this configuration.\");\n }\n if (withdrawReceipt) {\n await rm(receipt);\n }\n } catch (cause) {\n if (!missing(cause)) {\n throw cause;\n }\n }\n\n const names = new Set([\n ...ownership.files.map((file) => file.path),\n \"manifest.json\",\n \"receipt.json\",\n ]);\n for (const file of ownership.files) {\n let parent = output;\n for (const part of file.path.split(\"/\").slice(0, -1)) {\n parent = join(parent, part);\n if (!(await directory(parent))) {\n throw new Error(`Missing generated directory: ${parent}`);\n }\n }\n const path = join(output, file.path);\n const entry = await lstat(path);\n if (!entry.isFile() || entry.isSymbolicLink() || digest(await readFile(path)) !== file.sha256) {\n throw new Error(\n `Generated file was replaced or edited; preserve it before rebuilding/cleaning: ${path}`,\n );\n }\n }\n return {\n root,\n output,\n ownership,\n unknown: (await filesIn(output)).filter((name) => !names.has(name)),\n };\n}\n\ninterface Receipt {\n configFile: string;\n status: \"emitted\" | \"vendor-compiled\";\n vendor?: Pick<Awaited<ReturnType<typeof buildCodesys>>, \"application\" | \"tasks\">;\n}\n\n// Compile in a separate staging tree. Recheck ownership immediately before the\n// swap, because the vendor build may have given the user time to edit old files.\nexport async function publishArtifacts(\n staging: string,\n previous: Awaited<ReturnType<typeof owned>>,\n receipt: Receipt,\n): Promise<void> {\n const configFile = receipt.configFile;\n const generated = (await filesIn(staging)).sort();\n const ownership: Manifest = { kind: \"tsplc-artifacts\", version: 1, configFile, files: [] };\n for (const path of generated) {\n ownership.files.push({ path, sha256: digest(await readFile(join(staging, path))) });\n }\n await writeFile(join(staging, \"manifest.json\"), `${JSON.stringify(ownership, null, 2)}\\n`);\n await writeFile(\n join(staging, \"receipt.json\"),\n `${JSON.stringify(\n { kind: \"tsplc-build\", version: 1, generatedAt: new Date().toISOString(), ...receipt },\n null,\n 2,\n )}\\n`,\n );\n\n const current = await owned(configFile);\n if (JSON.stringify(current.ownership) !== JSON.stringify(previous.ownership)) {\n throw new Error(\"Output ownership changed during the build; preserve it before rebuilding.\");\n }\n if (current.unknown.length) {\n throw new Error(`Output contains unrelated files: ${current.unknown.join(\", \")}`);\n }\n\n const backup = `${staging}-previous`;\n if (previous.ownership) {\n await rename(previous.output, backup);\n }\n try {\n await rename(staging, previous.output);\n } catch (cause) {\n if (previous.ownership) {\n await rename(backup, previous.output);\n }\n throw cause;\n }\n if (previous.ownership) {\n await rm(backup, { recursive: true });\n }\n}\n\nexport async function cleanArtifacts(configFile: string): Promise<void> {\n const generated = await owned(configFile);\n if (!generated.ownership) {\n return;\n }\n for (const entry of generated.ownership.files) {\n await rm(join(generated.output, entry.path));\n }\n await rm(join(generated.output, \"receipt.json\"), { force: true });\n await rm(join(generated.output, \"manifest.json\"));\n\n // Remove empty generated directories while preserving unrelated files.\n const removeEmpty = async (path: string): Promise<void> => {\n for (const entry of await readdir(path, { withFileTypes: true })) {\n if (entry.isDirectory() && !entry.isSymbolicLink()) {\n await removeEmpty(join(path, entry.name));\n }\n }\n if (!(await readdir(path)).length) {\n await rm(path, { recursive: true });\n }\n };\n await removeEmpty(generated.output);\n}\n",
10
+ "import { existsSync } from \"node:fs\";\nimport { mkdtemp, mkdir, rm, rename } from \"node:fs/promises\";\nimport { dirname, resolve, join } from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport ts from \"typescript\";\nimport type { ResolvedTsplcConfig } from \"@tsplc/config\";\nimport { typeCheckOnly } from \"@tsplc/compiler\";\n\nexport const resolveServerModule = (root: string, name: string) =>\n name.startsWith(\".\") || name.startsWith(\"/\") || existsSync(resolve(root, name))\n ? resolve(root, name)\n : createRequire(join(root, \"package.json\")).resolve(name);\n\nconst kebabCase = (name: string) =>\n name\n .replace(/([a-z0-9])([A-Z])|([A-Z])([A-Z][a-z])/g, \"$1$3-$2$4\")\n .replace(/[^A-Za-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .toLowerCase();\n\n/** Compiles the host entry, which starts its own listener, into `build/server/<name>-services`. */\nexport const buildServer = async (config: ResolvedTsplcConfig, root: string) => {\n const settings = config.server;\n if (!settings?.runtime) throw new Error(\"Configure server.runtime to build an executable.\");\n const runtime = settings.runtime;\n const entry = resolveServerModule(root, runtime.entry);\n const windows = runtime.target\n ? runtime.target.includes(\"windows\")\n : process.platform === \"win32\";\n const outFile = resolve(\n root,\n \"build/server\",\n `${kebabCase(config.name)}-services${windows ? \".exe\" : \"\"}`,\n );\n const tsconfig = ts.findConfigFile(dirname(entry), ts.sys.fileExists);\n if (!tsconfig) throw new Error(\"Server entry requires a tsconfig.json.\");\n const read = ts.readConfigFile(tsconfig, ts.sys.readFile);\n if (read.error) throw new Error(ts.flattenDiagnosticMessageText(read.error.messageText, \"\\n\"));\n const parsed = ts.parseJsonConfigFileContent(read.config, ts.sys, dirname(tsconfig));\n const program = ts.createProgram({\n rootNames: [entry, ...parsed.fileNames.filter((file) => /\\.d\\.[cm]?ts$/.test(file))],\n options: { ...parsed.options, ...typeCheckOnly },\n projectReferences: parsed.projectReferences,\n });\n const diagnostics = [...parsed.errors, ...ts.getPreEmitDiagnostics(program)];\n if (diagnostics.length)\n throw new Error(\n ts.formatDiagnosticsWithColorAndContext(diagnostics, {\n getCanonicalFileName: (path) => path,\n getCurrentDirectory: () => root,\n getNewLine: () => \"\\n\",\n }),\n );\n await mkdir(dirname(outFile), { recursive: true });\n // Compile beside the output so dependency resolution starts from the owning project.\n const staging = await mkdtemp(join(dirname(outFile), \".tsplc-server-\"));\n try {\n const binary = join(staging, \"server\");\n const result = await Bun.build({\n entrypoints: [entry],\n env: \"disable\",\n compile: {\n outfile: binary,\n ...(runtime.target ? { target: runtime.target } : {}),\n autoloadDotenv: false,\n autoloadBunfig: false,\n autoloadTsconfig: false,\n autoloadPackageJson: false,\n },\n });\n if (!result.success) throw new AggregateError(result.logs, \"Server executable build failed.\");\n // Bun names a Windows executable itself.\n await rename(windows ? `${binary}.exe` : binary, outFile);\n return {\n server: {\n executable: outFile,\n target: runtime.target ?? `bun-${process.platform}-${process.arch}`,\n },\n };\n } finally {\n await rm(staging, { recursive: true, force: true });\n }\n};\n",
11
+ "import { copyFile, mkdir, mkdtemp, realpath, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\nimport {\n buildCodesys,\n codesysBuildConfig,\n type CodesysPlan,\n diagnoseCodesys,\n emitCodesys,\n ioTargets,\n publicationSelectors,\n planCodesys,\n} from \"@tsplc/compiler/codesys\";\nimport { analyze, checkHostConfig } from \"@tsplc/compiler\";\nimport {\n type Controller,\n type BuildTarget,\n type NormalizedConfig,\n type ResolvedTsplcConfig,\n compilerConfig,\n loadTsplcConfig,\n} from \"@tsplc/config\";\nimport { deviceTree, type ProjectTargets, loadHardware, resolveIo } from \"@tsplc/typegen\";\nimport { installLibraries } from \"@tsplc/build\";\nimport { type Diagnostic, hasErrors, normalizeModule } from \"@tsplc/compiler/ir\";\nimport { cleanArtifacts, engineeringDirectory, owned, publishArtifacts } from \"./artifacts.ts\";\n\nconst failure = (origin: Diagnostic[\"origin\"], code: string, cause: unknown): Diagnostic => ({\n origin,\n code,\n severity: \"error\",\n message: cause instanceof Error ? cause.message : String(cause),\n});\n\ntype LoadedConfig = Awaited<ReturnType<typeof loadTsplcConfig>>;\n\nasync function loadProject(\n file: string,\n loaded?: LoadedConfig,\n buildTarget?: BuildTarget,\n): Promise<{\n config?: NormalizedConfig;\n configFile: string;\n shared?: ResolvedTsplcConfig;\n diagnostics: readonly Diagnostic[];\n}> {\n let configFile = resolve(file);\n try {\n configFile = await realpath(configFile);\n const diagnostics = checkHostConfig(configFile);\n if (hasErrors(diagnostics)) return { configFile, diagnostics };\n const shared = (loaded ?? (await loadTsplcConfig(configFile))).config;\n const root = dirname(configFile);\n\n const config = compilerConfig(\n shared,\n resolveIo(shared, await loadHardware(shared, root)),\n buildTarget,\n );\n return {\n configFile,\n shared,\n config: { ...config, ...sourceInput(config, root) },\n diagnostics,\n };\n } catch (cause) {\n return { configFile, diagnostics: [failure(\"config\", \"PLC5003\", cause)] };\n }\n}\n\n/** The analyzer's entry points, resolved against the config file's directory. */\nfunction sourceInput(\n compiler: { tsconfig: string; programs: Record<string, { module: string; export: string }> },\n root: string,\n) {\n return {\n tsconfig: resolve(root, compiler.tsconfig),\n programs: Object.fromEntries(\n Object.entries(compiler.programs).map(([name, entry]) => [\n name,\n { ...entry, module: resolve(root, entry.module) },\n ]),\n ),\n };\n}\n\n/**\n * I/O keys and publication selectors from analyzed PLC source. It ignores the\n * config's own type errors, so a typo cannot switch off the types that flag it;\n * it is undefined only while the source itself fails analysis.\n */\nexport async function projectTargets(\n file = \"tsplc.config.ts\",\n options: { loaded?: LoadedConfig } = {},\n): Promise<ProjectTargets | undefined> {\n const configFile = await realpath(resolve(file));\n const { config } = options.loaded ?? (await loadTsplcConfig(configFile));\n if (!config.compiler) return undefined;\n const source = analyze({\n ...sourceInput(config.compiler, dirname(configFile)),\n services: config.server,\n });\n const core = source.module && normalizeModule(source.module).core;\n return core ? { io: ioTargets(core), publication: publicationSelectors(core) } : undefined;\n}\n\nexport async function checkProject(\n file = \"tsplc.config.ts\",\n options: { loaded?: LoadedConfig; buildTarget?: BuildTarget } = {},\n): Promise<{\n configFile: string;\n config?: NormalizedConfig;\n shared?: ResolvedTsplcConfig;\n plan?: CodesysPlan;\n diagnostics: readonly Diagnostic[];\n}> {\n const loaded = await loadProject(file, options.loaded, options.buildTarget);\n if (!loaded.config) {\n return loaded;\n }\n\n const config = loaded.config;\n if (config.target.kind !== \"codesys\") {\n return {\n ...loaded,\n diagnostics: [failure(\"backend\", \"PLC7001\", `Unsupported target: ${config.target.kind}`)],\n };\n }\n\n const source = analyze({\n tsconfig: config.tsconfig,\n programs: config.programs,\n services: loaded.shared?.server,\n });\n if (!source.module) {\n return { ...loaded, diagnostics: source.diagnostics };\n }\n const normalized = normalizeModule(source.module);\n if (!normalized.core) {\n return { ...loaded, diagnostics: normalized.diagnostics };\n }\n\n const tasks = config.tasks.map((task) => ({\n name: task.name,\n intervalNanoseconds: task.schedule.interval.nanoseconds,\n priority: task.priority,\n programs: task.programs,\n }));\n const planned = planCodesys(normalized.core, { tasks }, config.target.options);\n return {\n ...loaded,\n ...planned,\n diagnostics: [\n ...loaded.diagnostics,\n ...source.diagnostics,\n ...normalized.diagnostics,\n ...planned.diagnostics,\n ],\n };\n}\n\n/** The installed libraries and fieldbus device tree a CODESYS project of this program needs. */\nasync function engineeringInputs(\n shared: ResolvedTsplcConfig,\n configFile: string,\n bundle: Pick<ReturnType<typeof emitCodesys>, \"ioMappings\">,\n frozen?: boolean,\n) {\n const root = dirname(configFile);\n const tree = await deviceTree(shared, await loadHardware(shared, root));\n return {\n libraries: await installLibraries(shared.dependencies, root, { frozen }),\n // The emitted names locate mapped IO; the tree maps their channels.\n deviceTree: tree && {\n ...tree,\n mappings: bundle.ioMappings.map(({ address, variable }) => ({ address, variable })),\n },\n };\n}\n\nexport async function buildProject(\n file = \"tsplc.config.ts\",\n options: {\n emitOnly?: boolean;\n frozenLockfile?: boolean;\n loaded?: LoadedConfig;\n controller?: Controller;\n buildTarget?: BuildTarget;\n /** Resolve libraries and the device tree into `controllerConfig` even when only emitting. */\n forController?: boolean;\n } = {},\n): Promise<{\n directory?: string;\n status?: \"emitted\" | \"vendor-compiled\";\n controllerConfig?: ReturnType<typeof codesysBuildConfig>;\n diagnostics: readonly Diagnostic[];\n}> {\n let staging: string | undefined;\n try {\n const configFile = await realpath(resolve(file));\n // Withdraw the previous success receipt before checking the new source.\n // Old artifacts remain owned and intact until publication succeeds.\n const previous = await owned(configFile, true);\n if (previous.unknown.length) {\n throw new Error(`Output contains unrelated files: ${previous.unknown.join(\", \")}`);\n }\n\n const checked = await checkProject(configFile, {\n loaded: options.loaded,\n buildTarget: options.buildTarget,\n });\n if (!checked.plan || !checked.config) {\n return { diagnostics: checked.diagnostics };\n }\n const bundle = emitCodesys(checked.plan);\n if (hasErrors(bundle.diagnostics)) {\n return { diagnostics: bundle.diagnostics };\n }\n const shared = checked.shared;\n const engineering =\n shared && (!options.emitOnly || options.forController)\n ? await engineeringInputs(shared, configFile, bundle, options.frozenLockfile)\n : undefined;\n const controllerConfig = shared?.build\n ? codesysBuildConfig(checked.plan, bundle, {\n configFile,\n sourceDir: join(previous.output, \"st\"),\n outDir: resolve(dirname(configFile), shared.build.outDir),\n controller: options.controller,\n ...engineering,\n })\n : undefined;\n\n await mkdir(previous.root, { recursive: true });\n staging = await mkdtemp(join(previous.root, \"stage-\"));\n const artifacts = [\n ...bundle.artifacts,\n { path: \"mappings.json\", content: `${JSON.stringify(bundle.mappings, null, 2)}\\n` },\n { path: \"io-symbols.json\", content: `${JSON.stringify(bundle.ioSymbols, null, 2)}\\n` },\n { path: \"publication.json\", content: `${JSON.stringify(bundle.publication, null, 2)}\\n` },\n { path: \"config.json\", content: `${JSON.stringify(checked.config, null, 2)}\\n` },\n ];\n for (const artifact of artifacts) {\n const path = join(staging, \"st\", artifact.path);\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, artifact.content);\n }\n\n let vendor: Awaited<ReturnType<typeof buildCodesys>> | undefined;\n if (!options.emitOnly) {\n // The engineering cache has its own ownership marker and survives clean.\n const outDir = shared?.build\n ? resolve(dirname(configFile), shared.build.outDir ?? \"build\")\n : join(previous.root, \"engineering\");\n await engineeringDirectory(outDir, configFile);\n try {\n vendor = await buildCodesys(checked.plan, bundle, {\n configFile,\n sourceDir: join(staging, \"st\"),\n outDir,\n controller: options.controller,\n ...engineering,\n });\n } catch (cause) {\n return { diagnostics: diagnoseCodesys(cause, bundle) };\n }\n\n const vendorArtifacts = [\n [\"Application.project\", vendor.project],\n [\"Application.app\", vendor.output],\n [\"Application.crc\", vendor.checksum],\n ] as const;\n for (const [name, path] of vendorArtifacts) {\n if (!path) continue;\n const destination = join(staging, \"vendor\", name);\n await mkdir(dirname(destination), { recursive: true });\n await copyFile(path, destination);\n }\n }\n\n const status = vendor ? \"vendor-compiled\" : \"emitted\";\n await publishArtifacts(staging, previous, {\n configFile,\n status,\n ...(vendor && { vendor: { application: vendor.application, tasks: vendor.tasks } }),\n });\n // Publication moved this directory into place; it is no longer staging.\n staging = undefined;\n return {\n directory: previous.output,\n status,\n ...(controllerConfig && { controllerConfig }),\n diagnostics: [...checked.diagnostics, ...bundle.diagnostics],\n };\n } catch (cause) {\n return { diagnostics: [failure(\"config\", \"PLC5004\", cause)] };\n } finally {\n if (staging) {\n await rm(staging, { recursive: true, force: true });\n }\n }\n}\n\nexport async function cleanProject(file = \"tsplc.config.ts\"): Promise<{\n diagnostics: readonly Diagnostic[];\n}> {\n try {\n await cleanArtifacts(await realpath(resolve(file)));\n return { diagnostics: [] };\n } catch (cause) {\n return { diagnostics: [failure(\"config\", \"PLC5004\", cause)] };\n }\n}\n"
12
+ ],
13
+ "mappings": "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",
14
+ "debugId": "2A9AAF31224302AE64756E2164756E21",
15
+ "names": []
16
+ }
package/dist/clock.js ADDED
@@ -0,0 +1,8 @@
1
+ // packages/compiler/stdlib/clock.ts
2
+ var now = () => Math.floor(performance.now());
3
+ export {
4
+ now
5
+ };
6
+
7
+ //# debugId=9360C2AC9515E36B64756E2164756E21
8
+ //# sourceMappingURL=clock.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../stdlib/clock.ts"],
4
+ "sourcesContent": [
5
+ "/** Milliseconds since the process started, as the PLC's `now()` counts them; used when a program runs under Bun. */\nexport const now = (): number => Math.floor(performance.now());\n"
6
+ ],
7
+ "mappings": ";AACO,IAAM,MAAM,MAAc,KAAK,MAAM,YAAY,IAAI,CAAC;",
8
+ "debugId": "9360C2AC9515E36B64756E2164756E21",
9
+ "names": []
10
+ }