@tsplc/compiler 0.1.0 → 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.
- package/dist/cli.js +718 -62
- package/dist/cli.js.map +9 -6
- package/dist/project.js +22 -16
- package/dist/project.js.map +3 -3
- package/package.json +6 -5
- package/project/cli.ts +35 -12
- package/project/plant.ts +437 -0
- package/project/project.ts +34 -20
package/dist/project.js.map
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../project/project.ts", "../project/artifacts.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"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\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 } = {},\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 controllerConfig = checked.shared?.build\n ? codesysBuildConfig(checked.plan, bundle, {\n configFile,\n sourceDir: join(previous.output, \"st\"),\n outDir: resolve(dirname(configFile), checked.shared.build.outDir),\n controller: options.controller,\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 engineering = checked.shared?.build\n ? resolve(dirname(configFile), checked.shared.build.outDir ?? \"build\")\n : join(previous.root, \"engineering\");\n const libraries = checked.shared\n ? await installLibraries(checked.shared.dependencies, dirname(configFile), {\n frozen: options.frozenLockfile,\n })\n : undefined;\n await engineeringDirectory(engineering, configFile);\n const tree =\n checked.shared &&\n (await deviceTree(checked.shared, await loadHardware(checked.shared, dirname(configFile))));\n try {\n vendor = await buildCodesys(checked.plan, bundle, {\n configFile,\n sourceDir: join(staging, \"st\"),\n outDir: engineering,\n libraries,\n controller: options.controller,\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 } 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",
|
|
5
|
+
"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",
|
|
6
6
|
"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"
|
|
7
7
|
],
|
|
8
|
-
"mappings": "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",
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "3570534843A89AC764756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
package/package.json
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"url": "git+https://github.com/livingforjesus/tsplc.git",
|
|
18
18
|
"directory": "packages/compiler"
|
|
19
19
|
},
|
|
20
|
-
"version": "0.
|
|
20
|
+
"version": "0.2.0",
|
|
21
21
|
"type": "module",
|
|
22
22
|
"exports": {
|
|
23
23
|
".": {
|
|
@@ -90,13 +90,14 @@
|
|
|
90
90
|
"bun": ">=1.4.3"
|
|
91
91
|
},
|
|
92
92
|
"dependencies": {
|
|
93
|
-
"@tsplc/
|
|
94
|
-
"@tsplc/
|
|
95
|
-
"@tsplc/
|
|
93
|
+
"@tsplc/agent": "0.2.0",
|
|
94
|
+
"@tsplc/build": "0.2.0",
|
|
95
|
+
"@tsplc/config": "0.2.0",
|
|
96
|
+
"@tsplc/typegen": "0.2.0",
|
|
96
97
|
"typescript": "6.0.3",
|
|
97
98
|
"zod": "4.3.6",
|
|
98
99
|
"@types/bun": "1.4.2",
|
|
99
|
-
"@tsplc/server": "0.
|
|
100
|
+
"@tsplc/server": "0.2.0"
|
|
100
101
|
},
|
|
101
102
|
"bin": {
|
|
102
103
|
"tsplc": "./dist/cli.js"
|
package/project/cli.ts
CHANGED
|
@@ -25,6 +25,7 @@ import { type Diagnostic, formatDiagnostic, hasErrors } from "@tsplc/compiler/ir
|
|
|
25
25
|
import { deviceTree } from "@tsplc/typegen";
|
|
26
26
|
import { loadHardware, resolveIo } from "@tsplc/typegen/hardware";
|
|
27
27
|
import { generateProject } from "@tsplc/typegen";
|
|
28
|
+
import { plantCommands, runPlantCommand } from "./plant.ts";
|
|
28
29
|
import { buildProject, checkProject, cleanProject, projectTargets } from "./project.ts";
|
|
29
30
|
|
|
30
31
|
async function main() {
|
|
@@ -43,16 +44,34 @@ async function main() {
|
|
|
43
44
|
server: { type: "boolean" },
|
|
44
45
|
simulate: { type: "boolean" },
|
|
45
46
|
runtime: { type: "boolean" },
|
|
47
|
+
download: { type: "boolean" },
|
|
48
|
+
restore: { type: "boolean" },
|
|
49
|
+
select: { type: "boolean" },
|
|
50
|
+
yes: { type: "boolean", short: "y" },
|
|
46
51
|
},
|
|
47
52
|
});
|
|
48
53
|
const command = positionals[0],
|
|
49
54
|
file = values.config ?? "tsplc.config.ts";
|
|
50
55
|
if (!command || values.help) {
|
|
51
56
|
console.log(
|
|
52
|
-
|
|
57
|
+
`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]
|
|
58
|
+
|
|
59
|
+
Plant agent (TSPLC_AGENT_URL, TSPLC_AGENT_TOKEN):
|
|
60
|
+
tsplc deploy [--download] [--select] [--initialize-user]
|
|
61
|
+
tsplc target | status | login | logout
|
|
62
|
+
tsplc vars [path] | read <expression>... | write <expression> <value>
|
|
63
|
+
tsplc force <expression> <value> | unforce [expression]... [--restore]
|
|
64
|
+
tsplc start | stop | reset warm|cold (-y skips confirmations)`,
|
|
53
65
|
);
|
|
54
66
|
return 0;
|
|
55
67
|
}
|
|
68
|
+
if (plantCommands.has(command)) {
|
|
69
|
+
const failed = await runPlantCommand(command, positionals.slice(1), values, {
|
|
70
|
+
file,
|
|
71
|
+
load: () => loadTsplcConfig(file),
|
|
72
|
+
});
|
|
73
|
+
return failed ? report(failed, values.format) : 0;
|
|
74
|
+
}
|
|
56
75
|
if (positionals.length > 1) throw new Error("Specify one command.");
|
|
57
76
|
if (
|
|
58
77
|
![
|
|
@@ -202,6 +221,8 @@ async function main() {
|
|
|
202
221
|
if (config.compiler) {
|
|
203
222
|
const emitted = await buildProject(file, {
|
|
204
223
|
emitOnly: true,
|
|
224
|
+
forController: true,
|
|
225
|
+
frozenLockfile: values["frozen-lockfile"],
|
|
205
226
|
loaded: target,
|
|
206
227
|
buildTarget: buildTargetFor(command),
|
|
207
228
|
});
|
|
@@ -212,18 +233,20 @@ async function main() {
|
|
|
212
233
|
// this through the input schema again would reject its configFile.
|
|
213
234
|
settings = { ...emitted.controllerConfig, io: {} };
|
|
214
235
|
} else
|
|
215
|
-
settings =
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
236
|
+
settings = {
|
|
237
|
+
...resolveConfig(
|
|
238
|
+
{
|
|
239
|
+
...rawBuildConfig(config),
|
|
240
|
+
io: resolveIo(target.config, await loadHardware(target.config, root)),
|
|
241
|
+
},
|
|
242
|
+
configFile,
|
|
243
|
+
),
|
|
244
|
+
libraries: await installLibraries(config.dependencies, root, {
|
|
245
|
+
frozen: values["frozen-lockfile"],
|
|
246
|
+
}),
|
|
247
|
+
};
|
|
225
248
|
result = await updateController(
|
|
226
|
-
{ ...settings,
|
|
249
|
+
{ ...settings, controller: controllerFor(config, command) },
|
|
227
250
|
command as "download" | "online-change",
|
|
228
251
|
{
|
|
229
252
|
initializeUser: values["initialize-user"],
|