@platforma-sdk/tengo-builder 4.0.10 → 4.0.11
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.cjs +0 -1
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/build.cjs +3 -3
- package/dist/commands/build.cjs.map +1 -1
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/check.cjs +0 -1
- package/dist/commands/check.cjs.map +1 -1
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/dump/artifacts.cjs +0 -1
- package/dist/commands/dump/artifacts.cjs.map +1 -1
- package/dist/commands/dump/artifacts.js.map +1 -1
- package/dist/commands/dump/software.cjs +0 -1
- package/dist/commands/dump/software.cjs.map +1 -1
- package/dist/commands/dump/software.js.map +1 -1
- package/dist/commands/test.cjs +0 -1
- package/dist/commands/test.cjs.map +1 -1
- package/dist/commands/test.js.map +1 -1
- package/dist/compiler/artifactset.cjs +2 -0
- package/dist/compiler/artifactset.cjs.map +1 -1
- package/dist/compiler/artifactset.js +2 -1
- package/dist/compiler/artifactset.js.map +1 -1
- package/dist/compiler/compiler.cjs +1 -0
- package/dist/compiler/compiler.cjs.map +1 -1
- package/dist/compiler/compiler.js +1 -0
- package/dist/compiler/compiler.js.map +1 -1
- package/dist/compiler/compileroptions.cjs +1 -0
- package/dist/compiler/compileroptions.cjs.map +1 -1
- package/dist/compiler/compileroptions.js +1 -1
- package/dist/compiler/compileroptions.js.map +1 -1
- package/dist/compiler/main.cjs +5 -3
- package/dist/compiler/main.cjs.map +1 -1
- package/dist/compiler/main.js +1 -1
- package/dist/compiler/main.js.map +1 -1
- package/dist/compiler/pack_limits.cjs +2 -0
- package/dist/compiler/pack_limits.cjs.map +1 -1
- package/dist/compiler/pack_limits.js +1 -1
- package/dist/compiler/pack_limits.js.map +1 -1
- package/dist/compiler/package.cjs.map +1 -1
- package/dist/compiler/package.js.map +1 -1
- package/dist/compiler/source.cjs +10 -1
- package/dist/compiler/source.cjs.map +1 -1
- package/dist/compiler/source.js +8 -1
- package/dist/compiler/source.js.map +1 -1
- package/dist/compiler/template.cjs +0 -1
- package/dist/compiler/template.cjs.map +1 -1
- package/dist/compiler/template.js.map +1 -1
- package/dist/compiler/util.cjs +3 -3
- package/dist/compiler/util.cjs.map +1 -1
- package/dist/compiler/util.js.map +1 -1
- package/dist/shared/basecmd.cjs +0 -1
- package/dist/shared/basecmd.cjs.map +1 -1
- package/dist/shared/basecmd.js.map +1 -1
- package/dist/shared/dump.cjs.map +1 -1
- package/dist/shared/dump.js.map +1 -1
- package/dist/shared/proc.cjs +0 -1
- package/dist/shared/proc.cjs.map +1 -1
- package/dist/shared/proc.js.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.js","names":[],"sources":["../../src/compiler/compiler.ts"],"sourcesContent":["import type { ArtifactSource } from \"./source\";\nimport type { TemplateWithSource } from \"./template\";\nimport { newTemplateWithSource } from \"./template\";\nimport type { TypedArtifactName, FullArtifactName, CompileMode } from \"./package\";\nimport {\n fullNameToString,\n typedArtifactNameToString,\n artifactNameToString,\n formatArtefactNameAndVersion,\n typedArtifactNamesEquals,\n fullNameEquals,\n} from \"./package\";\nimport { ArtifactStore } from \"./artifactset\";\nimport { assertNever } from \"./util\";\nimport { applyLibraryCompilerOptions, applyTemplateCompilerOptions } from \"./compileroptions\";\nimport type {\n BackendCapability,\n CompiledTemplateV3,\n TemplateDataV3,\n} from \"@milaboratories/pl-model-backend\";\n\n/** Add a capability token to a template's `requiredCapabilities` list,\n * skipping duplicates. Initializes the array lazily so the field stays\n * absent for templates that need nothing. */\nfunction addRequiredCapability(template: TemplateDataV3, capability: BackendCapability): void {\n template.requiredCapabilities = template.requiredCapabilities ?? [];\n if (!template.requiredCapabilities.includes(capability)) {\n template.requiredCapabilities.push(capability);\n }\n}\n\n/** A compilation result. */\nexport interface TemplatesAndLibs {\n templates: TemplateWithSource[];\n libs: ArtifactSource[];\n software: ArtifactSource[];\n assets: ArtifactSource[];\n wasm: ArtifactSource[];\n}\n\nexport class TengoTemplateCompiler {\n private readonly libs = new ArtifactStore<ArtifactSource>((src) => src.fullName);\n private readonly software = new ArtifactStore<ArtifactSource>((src) => src.fullName);\n private readonly assets = new ArtifactStore<ArtifactSource>((src) => src.fullName);\n private readonly wasm = new ArtifactStore<ArtifactSource>((src) => src.fullName);\n private readonly templates = new ArtifactStore<TemplateWithSource>((tpl) => tpl.fullName);\n\n constructor(private readonly compileMode: CompileMode) {}\n\n /** Recursively add dependencies to the template. */\n private populateTemplateDataFromDependencies(\n fullName: FullArtifactName,\n data: CompiledTemplateV3,\n deps: TypedArtifactName[],\n trace: string[],\n ) {\n for (const dep of deps) {\n switch (dep.type) {\n case \"library\": {\n const lib = this.getLibOrError(dep);\n\n const recursionStart = trace.indexOf(artifactNameToString(dep));\n if (recursionStart >= 0) {\n const errorMessage =\n `library import recursion detected: ` +\n `${trace.slice(recursionStart).join(\" -> \")} -> ${artifactNameToString(dep)}`;\n throw new Error(errorMessage);\n }\n\n const tplLib = {\n ...formatArtefactNameAndVersion(lib.fullName),\n sourceHash: lib.sourceHash,\n };\n\n applyLibraryCompilerOptions(lib.compilerOptions, tplLib);\n data.template.libs[artifactNameToString(dep)] = tplLib;\n data.hashToSource[tplLib.sourceHash] = lib.src;\n\n // populate with transient library dependencies\n this.populateTemplateDataFromDependencies(fullName, data, lib.dependencies, [\n ...trace,\n artifactNameToString(dep),\n ]);\n\n break;\n }\n case \"software\": {\n const software = this.getSoftwareOrError(dep);\n data.template.software[artifactNameToString(dep)] = {\n ...formatArtefactNameAndVersion(software.fullName),\n sourceHash: software.sourceHash,\n };\n data.hashToSource[software.sourceHash] = software.src;\n\n break;\n }\n case \"asset\": {\n const asset = this.getAssetOrError(dep);\n // Yes, we temporarily put assets into 'software' section of template, so controller can\n // handle it the right way without updates\n data.template.software[artifactNameToString(dep)] = {\n ...formatArtefactNameAndVersion(asset.fullName),\n sourceHash: asset.sourceHash,\n };\n data.hashToSource[asset.sourceHash] = asset.src;\n break;\n }\n case \"wasm\": {\n const wasm = this.getWasmOrError(dep);\n data.template.wasm = data.template.wasm ?? {};\n data.template.wasm[artifactNameToString(dep)] = {\n ...formatArtefactNameAndVersion(wasm.fullName),\n sourceHash: wasm.sourceHash,\n };\n data.hashToSource[wasm.sourceHash] = wasm.src;\n // Embedding a wasm artifact means this template requires the\n // backend's wasm runtime to run. The token is propagated upward\n // when this template is in turn embedded as a sub-template.\n addRequiredCapability(data.template, \"wasm:v1\");\n break;\n }\n case \"template\": {\n if (typedArtifactNamesEquals(fullName, dep))\n // skipping self reference\n continue;\n\n const tpl = this.getTemplateOrError(dep);\n data.template.templates[artifactNameToString(dep)] = tpl.data.template;\n data.hashToSource[tpl.data.template.sourceHash] = tpl.source;\n\n // add all the sources of transitivedependencies to the resulted hashToSource\n for (const [hash, src] of Object.entries(tpl.data.hashToSource)) {\n data.hashToSource[hash] = src;\n }\n\n // Union the sub-template's compile-time-computed capability\n // requirements into ours, so the top template carries the full\n // transitive set without consumers having to walk the tree.\n for (const cap of tpl.data.template.requiredCapabilities ?? []) {\n addRequiredCapability(data.template, cap);\n }\n\n break;\n }\n case \"test\":\n throw new Error(\n `dependencies tree error: tests should never be part of template: ` +\n `${typedArtifactNameToString(dep)} is dependency of ${artifactNameToString(fullName)}`,\n );\n default:\n assertNever(dep.type);\n }\n }\n }\n\n /** This method assumes that all dependencies are already added to the compiler's context */\n private compileAndAddTemplate(tplSrc: ArtifactSource): CompiledTemplateV3 {\n if (tplSrc.fullName.type !== \"template\") throw new Error(\"unexpected source type\");\n\n // creating template with unpopulated dependencies\n const tplData: CompiledTemplateV3 = {\n type: \"pl.tengo-template.v3\",\n hashToSource: {\n [tplSrc.sourceHash]: tplSrc.src,\n },\n template: {\n ...formatArtefactNameAndVersion(tplSrc.fullName),\n templates: {},\n libs: {},\n software: {},\n assets: {},\n sourceHash: tplSrc.sourceHash,\n },\n };\n\n applyTemplateCompilerOptions(tplSrc.compilerOptions, tplData.template);\n\n // collecting dependencies in output format\n this.populateTemplateDataFromDependencies(tplSrc.fullName, tplData, tplSrc.dependencies, []);\n\n return tplData;\n }\n\n addLib(lib: ArtifactSource) {\n const libFromMap = this.libs.add(lib.compileMode, lib, false);\n if (libFromMap && !fullNameEquals(lib.fullName, libFromMap.fullName))\n throw new Error(\n `compiler already contain such library: adding = ${fullNameToString(lib.fullName)}, contains = ${fullNameToString(libFromMap.fullName)}`,\n );\n }\n\n allLibs(): ArtifactSource[] {\n return this.libs.array(this.compileMode);\n }\n\n getLib(name: TypedArtifactName): ArtifactSource | undefined {\n if (name.type !== \"library\")\n throw new Error(`illegal artifact type: got ${name.type} instead of 'library`);\n return this.libs.get(this.compileMode, name);\n }\n\n getLibOrError(name: TypedArtifactName): ArtifactSource {\n const lib = this.getLib(name);\n if (!lib) throw new Error(`library not found: ${artifactNameToString(name)}`);\n return lib;\n }\n\n checkLibs() {\n this.libs.forEach(this.compileMode, (lib) => {\n for (const dep of lib.dependencies) {\n if (dep.type === \"test\")\n throw new Error(\n `test should never be dependency of production code: ${typedArtifactNameToString(dep)} test is dependency of ${fullNameToString(lib.fullName)}`,\n );\n\n if (!this.getArtefact(dep))\n throw new Error(\n `unresolved dependency ${typedArtifactNameToString(dep)} for ${fullNameToString(lib.fullName)}`,\n );\n }\n });\n }\n\n addSoftware(software: ArtifactSource) {\n const swFromMap = this.software.add(software.compileMode, software, false);\n if (swFromMap && !fullNameEquals(software.fullName, swFromMap.fullName))\n throw new Error(\n `compiler already contain info for software: adding = ${fullNameToString(software.fullName)}, contains = ${fullNameToString(swFromMap.fullName)}`,\n );\n }\n\n allSoftware(): ArtifactSource[] {\n return this.software.array(this.compileMode);\n }\n\n getSoftware(name: TypedArtifactName): ArtifactSource | undefined {\n if (name.type !== \"software\")\n throw new Error(`illegal artifact type: got ${name.type} instead of 'software`);\n\n return this.software.get(this.compileMode, name);\n }\n\n getSoftwareOrError(name: TypedArtifactName): ArtifactSource {\n const software = this.getSoftware(name);\n if (!software) throw new Error(`software info not found: ${artifactNameToString(name)}`);\n return software;\n }\n\n addAsset(asset: ArtifactSource) {\n const assetFromMap = this.assets.add(asset.compileMode, asset, false);\n if (assetFromMap && !fullNameEquals(asset.fullName, assetFromMap.fullName))\n throw new Error(\n `compiler already contain info for asset: adding = ${fullNameToString(asset.fullName)}, contains = ${fullNameToString(assetFromMap.fullName)}`,\n );\n }\n\n allAssets(): ArtifactSource[] {\n return this.assets.array(this.compileMode);\n }\n\n getAsset(name: TypedArtifactName): ArtifactSource | undefined {\n if (name.type !== \"asset\")\n throw new Error(`illegal artifact type: got ${name.type} instead of 'asset`);\n\n return this.assets.get(this.compileMode, name);\n }\n\n getAssetOrError(name: TypedArtifactName): ArtifactSource {\n const asset = this.getAsset(name);\n if (!asset) throw new Error(`asset info not found: ${artifactNameToString(name)}`);\n return asset;\n }\n\n addWasm(wasm: ArtifactSource) {\n const wasmFromMap = this.wasm.add(wasm.compileMode, wasm, false);\n if (wasmFromMap && !fullNameEquals(wasm.fullName, wasmFromMap.fullName))\n throw new Error(\n `compiler already contain info for wasm: adding = ${fullNameToString(wasm.fullName)}, contains = ${fullNameToString(wasmFromMap.fullName)}`,\n );\n }\n\n allWasm(): ArtifactSource[] {\n return this.wasm.array(this.compileMode);\n }\n\n getWasm(name: TypedArtifactName): ArtifactSource | undefined {\n if (name.type !== \"wasm\")\n throw new Error(`illegal artifact type: got ${name.type} instead of 'wasm'`);\n\n return this.wasm.get(this.compileMode, name);\n }\n\n getWasmOrError(name: TypedArtifactName): ArtifactSource {\n const wasm = this.getWasm(name);\n if (!wasm) throw new Error(`wasm info not found: ${artifactNameToString(name)}`);\n return wasm;\n }\n\n addTemplate(tpl: TemplateWithSource) {\n const tplFromMap = this.templates.add(tpl.compileMode, tpl, false);\n if (tplFromMap && !fullNameEquals(tpl.fullName, tplFromMap.fullName))\n throw new Error(\n `compiler already contain such template: adding = ${fullNameToString(tpl.fullName)}, contains = ${fullNameToString(tplFromMap.fullName)}`,\n );\n }\n\n allTemplates(): TemplateWithSource[] {\n return this.templates.array(this.compileMode);\n }\n\n getTemplate(name: TypedArtifactName): TemplateWithSource | undefined {\n if (name.type !== \"template\")\n throw new Error(`illegal artifact type: got ${name.type} instead of 'template`);\n return this.templates.get(this.compileMode, name);\n }\n\n getTemplateOrError(name: TypedArtifactName): TemplateWithSource {\n const tpl = this.getTemplate(name);\n if (!tpl) throw new Error(`template not found: ${artifactNameToString(name)}`);\n return tpl;\n }\n\n getArtefact(name: TypedArtifactName): ArtifactSource | TemplateWithSource | undefined {\n switch (name.type) {\n case \"template\":\n return this.getTemplate(name);\n case \"library\":\n return this.getLib(name);\n case \"software\":\n return this.getSoftware(name);\n case \"asset\":\n return this.getAsset(name);\n case \"wasm\":\n return this.getWasm(name);\n case \"test\":\n // Tests are ignored by the complier. They should never be compiled into templates or libs and\n // should never be a dependency.\n return undefined;\n default:\n assertNever(name.type);\n }\n }\n\n compileAndAdd(sources: ArtifactSource[]): TemplatesAndLibs {\n const result: TemplatesAndLibs = {\n templates: [],\n libs: [],\n software: [],\n assets: [],\n wasm: [],\n };\n\n let current: ArtifactSource[] = [];\n\n for (const src of sources) {\n if (src.fullName.type === \"library\") {\n // add libraries 'as-is' to be able to resolve them as dependencies\n this.addLib(src);\n result.libs.push(src);\n } else if (src.fullName.type === \"software\") {\n // add software 'as-is' to be able to resolve them as dependencies\n this.addSoftware(src);\n result.software.push(src);\n } else if (src.fullName.type === \"asset\") {\n // add assets 'as-is' to be able to resolve them as dependencies\n this.addAsset(src);\n result.assets.push(src);\n } else if (src.fullName.type === \"wasm\") {\n // add wasm 'as-is' to be able to resolve them as dependencies\n this.addWasm(src);\n result.wasm.push(src);\n } else {\n current.push(src);\n }\n }\n\n while (current.length > 0) {\n const unprocessed: { src: ArtifactSource; err: Error }[] = [];\n\n for (const src of current) {\n //\n // If one of the dependencies can't be resolved with current compiler context,\n // we put aside the source until next iteration, in hope that the dependency\n // will be satisfied then.\n //\n // This is equivalent to topological sorting of input sources.\n //\n const unsatisfied = src.dependencies.filter(\n (dep) =>\n !this.getArtefact(dep) &&\n // allow self reference for templates\n !(src.fullName.type === \"template\" && typedArtifactNamesEquals(src.fullName, dep)),\n );\n if (unsatisfied.length > 0) {\n let errorMessage = `Unsatisfied dependencies in ${fullNameToString(src.fullName)}:\\n`;\n for (const dep of unsatisfied) {\n errorMessage += ` - ${typedArtifactNameToString(dep)}\\n`;\n }\n unprocessed.push({ src, err: new Error(errorMessage) });\n\n continue;\n }\n\n // type specific processing\n switch (src.fullName.type) {\n case \"library\":\n // libraries are added as is\n this.addLib(src);\n result.libs.push(src);\n break;\n case \"software\":\n // software dependencies are added as is\n this.addSoftware(src);\n result.software.push(src);\n break;\n case \"asset\":\n // software dependencies are added as is\n this.addAsset(src);\n result.assets.push(src);\n break;\n case \"wasm\":\n // wasm dependencies are added as is\n this.addWasm(src);\n result.wasm.push(src);\n break;\n case \"template\":\n // templates are compiled and then added\n try {\n const tpl = this.compileAndAddTemplate(src);\n const tplWithSrc = newTemplateWithSource(src.compileMode, src.fullName, tpl, src.src);\n this.addTemplate(tplWithSrc);\n result.templates.push(tplWithSrc);\n } catch (error: unknown) {\n const err = error as Error;\n let errorMessage = `Unsatisfied dependencies in ${fullNameToString(src.fullName)}:\\n`;\n errorMessage += ` - ${err.message}\\n`;\n\n unprocessed.push({ src, err: Error(errorMessage) }); // one or more dependencies are not resolvable yet\n }\n break;\n case \"test\":\n // Ignore tests: they never should be part of compiled code or be a dependency.\n break;\n default:\n assertNever(src.fullName.type);\n }\n }\n\n // checking that we successfully added at least one source,\n // if not all the source files in unprocessed array have unmet dependencies\n if (current.length === unprocessed.length) {\n let errorMessage = \"\";\n\n for (const u of unprocessed) {\n errorMessage += `\\n${u.err.message}`;\n }\n throw new Error(errorMessage);\n }\n\n current = unprocessed.map(({ src: ArtifactSource }) => ArtifactSource);\n }\n\n return result;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"compiler.js","names":[],"sources":["../../src/compiler/compiler.ts"],"sourcesContent":["import type { ArtifactSource } from \"./source\";\nimport type { TemplateWithSource } from \"./template\";\nimport { newTemplateWithSource } from \"./template\";\nimport type { TypedArtifactName, FullArtifactName, CompileMode } from \"./package\";\nimport {\n fullNameToString,\n typedArtifactNameToString,\n artifactNameToString,\n formatArtefactNameAndVersion,\n typedArtifactNamesEquals,\n fullNameEquals,\n} from \"./package\";\nimport { ArtifactStore } from \"./artifactset\";\nimport { assertNever } from \"./util\";\nimport { applyLibraryCompilerOptions, applyTemplateCompilerOptions } from \"./compileroptions\";\nimport type {\n BackendCapability,\n CompiledTemplateV3,\n TemplateDataV3,\n} from \"@milaboratories/pl-model-backend\";\n\n/** Add a capability token to a template's `requiredCapabilities` list,\n * skipping duplicates. Initializes the array lazily so the field stays\n * absent for templates that need nothing. */\nfunction addRequiredCapability(template: TemplateDataV3, capability: BackendCapability): void {\n template.requiredCapabilities = template.requiredCapabilities ?? [];\n if (!template.requiredCapabilities.includes(capability)) {\n template.requiredCapabilities.push(capability);\n }\n}\n\n/** A compilation result. */\nexport interface TemplatesAndLibs {\n templates: TemplateWithSource[];\n libs: ArtifactSource[];\n software: ArtifactSource[];\n assets: ArtifactSource[];\n wasm: ArtifactSource[];\n}\n\nexport class TengoTemplateCompiler {\n private readonly libs = new ArtifactStore<ArtifactSource>((src) => src.fullName);\n private readonly software = new ArtifactStore<ArtifactSource>((src) => src.fullName);\n private readonly assets = new ArtifactStore<ArtifactSource>((src) => src.fullName);\n private readonly wasm = new ArtifactStore<ArtifactSource>((src) => src.fullName);\n private readonly templates = new ArtifactStore<TemplateWithSource>((tpl) => tpl.fullName);\n\n constructor(private readonly compileMode: CompileMode) {}\n\n /** Recursively add dependencies to the template. */\n private populateTemplateDataFromDependencies(\n fullName: FullArtifactName,\n data: CompiledTemplateV3,\n deps: TypedArtifactName[],\n trace: string[],\n ) {\n for (const dep of deps) {\n switch (dep.type) {\n case \"library\": {\n const lib = this.getLibOrError(dep);\n\n const recursionStart = trace.indexOf(artifactNameToString(dep));\n if (recursionStart >= 0) {\n const errorMessage =\n `library import recursion detected: ` +\n `${trace.slice(recursionStart).join(\" -> \")} -> ${artifactNameToString(dep)}`;\n throw new Error(errorMessage);\n }\n\n const tplLib = {\n ...formatArtefactNameAndVersion(lib.fullName),\n sourceHash: lib.sourceHash,\n };\n\n applyLibraryCompilerOptions(lib.compilerOptions, tplLib);\n data.template.libs[artifactNameToString(dep)] = tplLib;\n data.hashToSource[tplLib.sourceHash] = lib.src;\n\n // populate with transient library dependencies\n this.populateTemplateDataFromDependencies(fullName, data, lib.dependencies, [\n ...trace,\n artifactNameToString(dep),\n ]);\n\n break;\n }\n case \"software\": {\n const software = this.getSoftwareOrError(dep);\n data.template.software[artifactNameToString(dep)] = {\n ...formatArtefactNameAndVersion(software.fullName),\n sourceHash: software.sourceHash,\n };\n data.hashToSource[software.sourceHash] = software.src;\n\n break;\n }\n case \"asset\": {\n const asset = this.getAssetOrError(dep);\n // Yes, we temporarily put assets into 'software' section of template, so controller can\n // handle it the right way without updates\n data.template.software[artifactNameToString(dep)] = {\n ...formatArtefactNameAndVersion(asset.fullName),\n sourceHash: asset.sourceHash,\n };\n data.hashToSource[asset.sourceHash] = asset.src;\n break;\n }\n case \"wasm\": {\n const wasm = this.getWasmOrError(dep);\n data.template.wasm = data.template.wasm ?? {};\n data.template.wasm[artifactNameToString(dep)] = {\n ...formatArtefactNameAndVersion(wasm.fullName),\n sourceHash: wasm.sourceHash,\n };\n data.hashToSource[wasm.sourceHash] = wasm.src;\n // Embedding a wasm artifact means this template requires the\n // backend's wasm runtime to run. The token is propagated upward\n // when this template is in turn embedded as a sub-template.\n addRequiredCapability(data.template, \"wasm:v1\");\n break;\n }\n case \"template\": {\n if (typedArtifactNamesEquals(fullName, dep))\n // skipping self reference\n continue;\n\n const tpl = this.getTemplateOrError(dep);\n data.template.templates[artifactNameToString(dep)] = tpl.data.template;\n data.hashToSource[tpl.data.template.sourceHash] = tpl.source;\n\n // add all the sources of transitivedependencies to the resulted hashToSource\n for (const [hash, src] of Object.entries(tpl.data.hashToSource)) {\n data.hashToSource[hash] = src;\n }\n\n // Union the sub-template's compile-time-computed capability\n // requirements into ours, so the top template carries the full\n // transitive set without consumers having to walk the tree.\n for (const cap of tpl.data.template.requiredCapabilities ?? []) {\n addRequiredCapability(data.template, cap);\n }\n\n break;\n }\n case \"test\":\n throw new Error(\n `dependencies tree error: tests should never be part of template: ` +\n `${typedArtifactNameToString(dep)} is dependency of ${artifactNameToString(fullName)}`,\n );\n default:\n assertNever(dep.type);\n }\n }\n }\n\n /** This method assumes that all dependencies are already added to the compiler's context */\n private compileAndAddTemplate(tplSrc: ArtifactSource): CompiledTemplateV3 {\n if (tplSrc.fullName.type !== \"template\") throw new Error(\"unexpected source type\");\n\n // creating template with unpopulated dependencies\n const tplData: CompiledTemplateV3 = {\n type: \"pl.tengo-template.v3\",\n hashToSource: {\n [tplSrc.sourceHash]: tplSrc.src,\n },\n template: {\n ...formatArtefactNameAndVersion(tplSrc.fullName),\n templates: {},\n libs: {},\n software: {},\n assets: {},\n sourceHash: tplSrc.sourceHash,\n },\n };\n\n applyTemplateCompilerOptions(tplSrc.compilerOptions, tplData.template);\n\n // collecting dependencies in output format\n this.populateTemplateDataFromDependencies(tplSrc.fullName, tplData, tplSrc.dependencies, []);\n\n return tplData;\n }\n\n addLib(lib: ArtifactSource) {\n const libFromMap = this.libs.add(lib.compileMode, lib, false);\n if (libFromMap && !fullNameEquals(lib.fullName, libFromMap.fullName))\n throw new Error(\n `compiler already contain such library: adding = ${fullNameToString(lib.fullName)}, contains = ${fullNameToString(libFromMap.fullName)}`,\n );\n }\n\n allLibs(): ArtifactSource[] {\n return this.libs.array(this.compileMode);\n }\n\n getLib(name: TypedArtifactName): ArtifactSource | undefined {\n if (name.type !== \"library\")\n throw new Error(`illegal artifact type: got ${name.type} instead of 'library`);\n return this.libs.get(this.compileMode, name);\n }\n\n getLibOrError(name: TypedArtifactName): ArtifactSource {\n const lib = this.getLib(name);\n if (!lib) throw new Error(`library not found: ${artifactNameToString(name)}`);\n return lib;\n }\n\n checkLibs() {\n this.libs.forEach(this.compileMode, (lib) => {\n for (const dep of lib.dependencies) {\n if (dep.type === \"test\")\n throw new Error(\n `test should never be dependency of production code: ${typedArtifactNameToString(dep)} test is dependency of ${fullNameToString(lib.fullName)}`,\n );\n\n if (!this.getArtefact(dep))\n throw new Error(\n `unresolved dependency ${typedArtifactNameToString(dep)} for ${fullNameToString(lib.fullName)}`,\n );\n }\n });\n }\n\n addSoftware(software: ArtifactSource) {\n const swFromMap = this.software.add(software.compileMode, software, false);\n if (swFromMap && !fullNameEquals(software.fullName, swFromMap.fullName))\n throw new Error(\n `compiler already contain info for software: adding = ${fullNameToString(software.fullName)}, contains = ${fullNameToString(swFromMap.fullName)}`,\n );\n }\n\n allSoftware(): ArtifactSource[] {\n return this.software.array(this.compileMode);\n }\n\n getSoftware(name: TypedArtifactName): ArtifactSource | undefined {\n if (name.type !== \"software\")\n throw new Error(`illegal artifact type: got ${name.type} instead of 'software`);\n\n return this.software.get(this.compileMode, name);\n }\n\n getSoftwareOrError(name: TypedArtifactName): ArtifactSource {\n const software = this.getSoftware(name);\n if (!software) throw new Error(`software info not found: ${artifactNameToString(name)}`);\n return software;\n }\n\n addAsset(asset: ArtifactSource) {\n const assetFromMap = this.assets.add(asset.compileMode, asset, false);\n if (assetFromMap && !fullNameEquals(asset.fullName, assetFromMap.fullName))\n throw new Error(\n `compiler already contain info for asset: adding = ${fullNameToString(asset.fullName)}, contains = ${fullNameToString(assetFromMap.fullName)}`,\n );\n }\n\n allAssets(): ArtifactSource[] {\n return this.assets.array(this.compileMode);\n }\n\n getAsset(name: TypedArtifactName): ArtifactSource | undefined {\n if (name.type !== \"asset\")\n throw new Error(`illegal artifact type: got ${name.type} instead of 'asset`);\n\n return this.assets.get(this.compileMode, name);\n }\n\n getAssetOrError(name: TypedArtifactName): ArtifactSource {\n const asset = this.getAsset(name);\n if (!asset) throw new Error(`asset info not found: ${artifactNameToString(name)}`);\n return asset;\n }\n\n addWasm(wasm: ArtifactSource) {\n const wasmFromMap = this.wasm.add(wasm.compileMode, wasm, false);\n if (wasmFromMap && !fullNameEquals(wasm.fullName, wasmFromMap.fullName))\n throw new Error(\n `compiler already contain info for wasm: adding = ${fullNameToString(wasm.fullName)}, contains = ${fullNameToString(wasmFromMap.fullName)}`,\n );\n }\n\n allWasm(): ArtifactSource[] {\n return this.wasm.array(this.compileMode);\n }\n\n getWasm(name: TypedArtifactName): ArtifactSource | undefined {\n if (name.type !== \"wasm\")\n throw new Error(`illegal artifact type: got ${name.type} instead of 'wasm'`);\n\n return this.wasm.get(this.compileMode, name);\n }\n\n getWasmOrError(name: TypedArtifactName): ArtifactSource {\n const wasm = this.getWasm(name);\n if (!wasm) throw new Error(`wasm info not found: ${artifactNameToString(name)}`);\n return wasm;\n }\n\n addTemplate(tpl: TemplateWithSource) {\n const tplFromMap = this.templates.add(tpl.compileMode, tpl, false);\n if (tplFromMap && !fullNameEquals(tpl.fullName, tplFromMap.fullName))\n throw new Error(\n `compiler already contain such template: adding = ${fullNameToString(tpl.fullName)}, contains = ${fullNameToString(tplFromMap.fullName)}`,\n );\n }\n\n allTemplates(): TemplateWithSource[] {\n return this.templates.array(this.compileMode);\n }\n\n getTemplate(name: TypedArtifactName): TemplateWithSource | undefined {\n if (name.type !== \"template\")\n throw new Error(`illegal artifact type: got ${name.type} instead of 'template`);\n return this.templates.get(this.compileMode, name);\n }\n\n getTemplateOrError(name: TypedArtifactName): TemplateWithSource {\n const tpl = this.getTemplate(name);\n if (!tpl) throw new Error(`template not found: ${artifactNameToString(name)}`);\n return tpl;\n }\n\n getArtefact(name: TypedArtifactName): ArtifactSource | TemplateWithSource | undefined {\n switch (name.type) {\n case \"template\":\n return this.getTemplate(name);\n case \"library\":\n return this.getLib(name);\n case \"software\":\n return this.getSoftware(name);\n case \"asset\":\n return this.getAsset(name);\n case \"wasm\":\n return this.getWasm(name);\n case \"test\":\n // Tests are ignored by the complier. They should never be compiled into templates or libs and\n // should never be a dependency.\n return undefined;\n default:\n assertNever(name.type);\n }\n }\n\n compileAndAdd(sources: ArtifactSource[]): TemplatesAndLibs {\n const result: TemplatesAndLibs = {\n templates: [],\n libs: [],\n software: [],\n assets: [],\n wasm: [],\n };\n\n let current: ArtifactSource[] = [];\n\n for (const src of sources) {\n if (src.fullName.type === \"library\") {\n // add libraries 'as-is' to be able to resolve them as dependencies\n this.addLib(src);\n result.libs.push(src);\n } else if (src.fullName.type === \"software\") {\n // add software 'as-is' to be able to resolve them as dependencies\n this.addSoftware(src);\n result.software.push(src);\n } else if (src.fullName.type === \"asset\") {\n // add assets 'as-is' to be able to resolve them as dependencies\n this.addAsset(src);\n result.assets.push(src);\n } else if (src.fullName.type === \"wasm\") {\n // add wasm 'as-is' to be able to resolve them as dependencies\n this.addWasm(src);\n result.wasm.push(src);\n } else {\n current.push(src);\n }\n }\n\n while (current.length > 0) {\n const unprocessed: { src: ArtifactSource; err: Error }[] = [];\n\n for (const src of current) {\n //\n // If one of the dependencies can't be resolved with current compiler context,\n // we put aside the source until next iteration, in hope that the dependency\n // will be satisfied then.\n //\n // This is equivalent to topological sorting of input sources.\n //\n const unsatisfied = src.dependencies.filter(\n (dep) =>\n !this.getArtefact(dep) &&\n // allow self reference for templates\n !(src.fullName.type === \"template\" && typedArtifactNamesEquals(src.fullName, dep)),\n );\n if (unsatisfied.length > 0) {\n let errorMessage = `Unsatisfied dependencies in ${fullNameToString(src.fullName)}:\\n`;\n for (const dep of unsatisfied) {\n errorMessage += ` - ${typedArtifactNameToString(dep)}\\n`;\n }\n unprocessed.push({ src, err: new Error(errorMessage) });\n\n continue;\n }\n\n // type specific processing\n switch (src.fullName.type) {\n case \"library\":\n // libraries are added as is\n this.addLib(src);\n result.libs.push(src);\n break;\n case \"software\":\n // software dependencies are added as is\n this.addSoftware(src);\n result.software.push(src);\n break;\n case \"asset\":\n // software dependencies are added as is\n this.addAsset(src);\n result.assets.push(src);\n break;\n case \"wasm\":\n // wasm dependencies are added as is\n this.addWasm(src);\n result.wasm.push(src);\n break;\n case \"template\":\n // templates are compiled and then added\n try {\n const tpl = this.compileAndAddTemplate(src);\n const tplWithSrc = newTemplateWithSource(src.compileMode, src.fullName, tpl, src.src);\n this.addTemplate(tplWithSrc);\n result.templates.push(tplWithSrc);\n } catch (error: unknown) {\n const err = error as Error;\n let errorMessage = `Unsatisfied dependencies in ${fullNameToString(src.fullName)}:\\n`;\n errorMessage += ` - ${err.message}\\n`;\n\n unprocessed.push({ src, err: Error(errorMessage) }); // one or more dependencies are not resolvable yet\n }\n break;\n case \"test\":\n // Ignore tests: they never should be part of compiled code or be a dependency.\n break;\n default:\n assertNever(src.fullName.type);\n }\n }\n\n // checking that we successfully added at least one source,\n // if not all the source files in unprocessed array have unmet dependencies\n if (current.length === unprocessed.length) {\n let errorMessage = \"\";\n\n for (const u of unprocessed) {\n errorMessage += `\\n${u.err.message}`;\n }\n throw new Error(errorMessage);\n }\n\n current = unprocessed.map(({ src: ArtifactSource }) => ArtifactSource);\n }\n\n return result;\n }\n}\n"],"mappings":"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"}
|
|
@@ -21,5 +21,6 @@ function hashOverride(args) {
|
|
|
21
21
|
//#endregion
|
|
22
22
|
exports.applyLibraryCompilerOptions = applyLibraryCompilerOptions;
|
|
23
23
|
exports.applyTemplateCompilerOptions = applyTemplateCompilerOptions;
|
|
24
|
+
exports.hashOverride = hashOverride;
|
|
24
25
|
|
|
25
26
|
//# sourceMappingURL=compileroptions.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compileroptions.cjs","names":[],"sources":["../../src/compiler/compileroptions.ts"],"sourcesContent":["import type { TemplateDataV3, TemplateLibDataV3 } from \"@milaboratories/pl-model-backend\";\nimport type { CompilerOption } from \"./package\";\nimport * as util from \"./util\";\n\nexport function applyTemplateCompilerOptions(opts: CompilerOption[], tpl: TemplateDataV3) {\n for (const opt of opts) {\n switch (opt.name) {\n case \"hash_override\": {\n tpl.hashOverride = hashOverride(opt.args);\n break;\n }\n }\n }\n}\n\nexport function applyLibraryCompilerOptions(opts: CompilerOption[], _lib: TemplateLibDataV3) {\n for (const opt of opts) {\n switch (opt.name) {\n case \"hash_override\": {\n throw new Error(\n `hash_override compiler option can be used ONLY on template level. Even in templates it is already dangerous enough` +\n ` to potentially break everything in Platforma Backend. In libraries with the transitive dependencies` +\n ` resolution and flattening of libraries list on template level, it becomes so unpredictibally disasterous, that` +\n ` we are doomed to never find the ends of a knot if anything goes wrong.`,\n );\n }\n }\n }\n}\n\nexport function hashOverride(args: string[]): string {\n if (args.length != 1) {\n throw new Error(\n \"hash_override compiler option expects exactly one argument: hash_override <some string>. Note, you can use only UUID as a value.\",\n );\n }\n\n const override = args[0].toLowerCase();\n\n if (!util.isUUID(override)) {\n throw new Error(\n \"hash_override must contain valid UUID as an override. As hash_override affects deduplication,\" +\n \" it becomes completely not possible to distinguish several different templates from each other on backend's side.\" +\n ' This means, if you set hash_override to a simple value (say, letter \"a\") on two completely different templates,' +\n \" they will be marked as interchangeable on backend's side with unpredictable consequences.\" +\n \" UUID looks like a safe enough tradeoff between the feature usage simplicity and duplication safety\",\n );\n }\n\n return override;\n}\n"],"mappings":";;AAIA,SAAgB,6BAA6B,MAAwB,KAAqB;
|
|
1
|
+
{"version":3,"file":"compileroptions.cjs","names":[],"sources":["../../src/compiler/compileroptions.ts"],"sourcesContent":["import type { TemplateDataV3, TemplateLibDataV3 } from \"@milaboratories/pl-model-backend\";\nimport type { CompilerOption } from \"./package\";\nimport * as util from \"./util\";\n\nexport function applyTemplateCompilerOptions(opts: CompilerOption[], tpl: TemplateDataV3) {\n for (const opt of opts) {\n switch (opt.name) {\n case \"hash_override\": {\n tpl.hashOverride = hashOverride(opt.args);\n break;\n }\n }\n }\n}\n\nexport function applyLibraryCompilerOptions(opts: CompilerOption[], _lib: TemplateLibDataV3) {\n for (const opt of opts) {\n switch (opt.name) {\n case \"hash_override\": {\n throw new Error(\n `hash_override compiler option can be used ONLY on template level. Even in templates it is already dangerous enough` +\n ` to potentially break everything in Platforma Backend. In libraries with the transitive dependencies` +\n ` resolution and flattening of libraries list on template level, it becomes so unpredictibally disasterous, that` +\n ` we are doomed to never find the ends of a knot if anything goes wrong.`,\n );\n }\n }\n }\n}\n\nexport function hashOverride(args: string[]): string {\n if (args.length != 1) {\n throw new Error(\n \"hash_override compiler option expects exactly one argument: hash_override <some string>. Note, you can use only UUID as a value.\",\n );\n }\n\n const override = args[0].toLowerCase();\n\n if (!util.isUUID(override)) {\n throw new Error(\n \"hash_override must contain valid UUID as an override. As hash_override affects deduplication,\" +\n \" it becomes completely not possible to distinguish several different templates from each other on backend's side.\" +\n ' This means, if you set hash_override to a simple value (say, letter \"a\") on two completely different templates,' +\n \" they will be marked as interchangeable on backend's side with unpredictable consequences.\" +\n \" UUID looks like a safe enough tradeoff between the feature usage simplicity and duplication safety\",\n );\n }\n\n return override;\n}\n"],"mappings":";;AAIA,SAAgB,6BAA6B,MAAwB,KAAqB;CACxF,KAAK,MAAM,OAAO,MAChB,QAAQ,IAAI,MAAZ;EACE,KAAK;GACH,IAAI,eAAe,aAAa,IAAI,IAAI;GACxC;CAEJ;AAEJ;AAEA,SAAgB,4BAA4B,MAAwB,MAAyB;CAC3F,KAAK,MAAM,OAAO,MAChB,QAAQ,IAAI,MAAZ;EACE,KAAK,iBACH,MAAM,IAAI,MACR,8YAIF;CAEJ;AAEJ;AAEA,SAAgB,aAAa,MAAwB;CACnD,IAAI,KAAK,UAAU,GACjB,MAAM,IAAI,MACR,kIACF;CAGF,MAAM,WAAW,KAAK,EAAE,CAAC,YAAY;CAErC,IAAI,CAAA,aAAA,OAAa,QAAQ,GACvB,MAAM,IAAI,MACR,+fAKF;CAGF,OAAO;AACT"}
|
|
@@ -19,6 +19,6 @@ function hashOverride(args) {
|
|
|
19
19
|
return override;
|
|
20
20
|
}
|
|
21
21
|
//#endregion
|
|
22
|
-
export { applyLibraryCompilerOptions, applyTemplateCompilerOptions };
|
|
22
|
+
export { applyLibraryCompilerOptions, applyTemplateCompilerOptions, hashOverride };
|
|
23
23
|
|
|
24
24
|
//# sourceMappingURL=compileroptions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compileroptions.js","names":["util.isUUID"],"sources":["../../src/compiler/compileroptions.ts"],"sourcesContent":["import type { TemplateDataV3, TemplateLibDataV3 } from \"@milaboratories/pl-model-backend\";\nimport type { CompilerOption } from \"./package\";\nimport * as util from \"./util\";\n\nexport function applyTemplateCompilerOptions(opts: CompilerOption[], tpl: TemplateDataV3) {\n for (const opt of opts) {\n switch (opt.name) {\n case \"hash_override\": {\n tpl.hashOverride = hashOverride(opt.args);\n break;\n }\n }\n }\n}\n\nexport function applyLibraryCompilerOptions(opts: CompilerOption[], _lib: TemplateLibDataV3) {\n for (const opt of opts) {\n switch (opt.name) {\n case \"hash_override\": {\n throw new Error(\n `hash_override compiler option can be used ONLY on template level. Even in templates it is already dangerous enough` +\n ` to potentially break everything in Platforma Backend. In libraries with the transitive dependencies` +\n ` resolution and flattening of libraries list on template level, it becomes so unpredictibally disasterous, that` +\n ` we are doomed to never find the ends of a knot if anything goes wrong.`,\n );\n }\n }\n }\n}\n\nexport function hashOverride(args: string[]): string {\n if (args.length != 1) {\n throw new Error(\n \"hash_override compiler option expects exactly one argument: hash_override <some string>. Note, you can use only UUID as a value.\",\n );\n }\n\n const override = args[0].toLowerCase();\n\n if (!util.isUUID(override)) {\n throw new Error(\n \"hash_override must contain valid UUID as an override. As hash_override affects deduplication,\" +\n \" it becomes completely not possible to distinguish several different templates from each other on backend's side.\" +\n ' This means, if you set hash_override to a simple value (say, letter \"a\") on two completely different templates,' +\n \" they will be marked as interchangeable on backend's side with unpredictable consequences.\" +\n \" UUID looks like a safe enough tradeoff between the feature usage simplicity and duplication safety\",\n );\n }\n\n return override;\n}\n"],"mappings":";;AAIA,SAAgB,6BAA6B,MAAwB,KAAqB;
|
|
1
|
+
{"version":3,"file":"compileroptions.js","names":["util.isUUID"],"sources":["../../src/compiler/compileroptions.ts"],"sourcesContent":["import type { TemplateDataV3, TemplateLibDataV3 } from \"@milaboratories/pl-model-backend\";\nimport type { CompilerOption } from \"./package\";\nimport * as util from \"./util\";\n\nexport function applyTemplateCompilerOptions(opts: CompilerOption[], tpl: TemplateDataV3) {\n for (const opt of opts) {\n switch (opt.name) {\n case \"hash_override\": {\n tpl.hashOverride = hashOverride(opt.args);\n break;\n }\n }\n }\n}\n\nexport function applyLibraryCompilerOptions(opts: CompilerOption[], _lib: TemplateLibDataV3) {\n for (const opt of opts) {\n switch (opt.name) {\n case \"hash_override\": {\n throw new Error(\n `hash_override compiler option can be used ONLY on template level. Even in templates it is already dangerous enough` +\n ` to potentially break everything in Platforma Backend. In libraries with the transitive dependencies` +\n ` resolution and flattening of libraries list on template level, it becomes so unpredictibally disasterous, that` +\n ` we are doomed to never find the ends of a knot if anything goes wrong.`,\n );\n }\n }\n }\n}\n\nexport function hashOverride(args: string[]): string {\n if (args.length != 1) {\n throw new Error(\n \"hash_override compiler option expects exactly one argument: hash_override <some string>. Note, you can use only UUID as a value.\",\n );\n }\n\n const override = args[0].toLowerCase();\n\n if (!util.isUUID(override)) {\n throw new Error(\n \"hash_override must contain valid UUID as an override. As hash_override affects deduplication,\" +\n \" it becomes completely not possible to distinguish several different templates from each other on backend's side.\" +\n ' This means, if you set hash_override to a simple value (say, letter \"a\") on two completely different templates,' +\n \" they will be marked as interchangeable on backend's side with unpredictable consequences.\" +\n \" UUID looks like a safe enough tradeoff between the feature usage simplicity and duplication safety\",\n );\n }\n\n return override;\n}\n"],"mappings":";;AAIA,SAAgB,6BAA6B,MAAwB,KAAqB;CACxF,KAAK,MAAM,OAAO,MAChB,QAAQ,IAAI,MAAZ;EACE,KAAK;GACH,IAAI,eAAe,aAAa,IAAI,IAAI;GACxC;CAEJ;AAEJ;AAEA,SAAgB,4BAA4B,MAAwB,MAAyB;CAC3F,KAAK,MAAM,OAAO,MAChB,QAAQ,IAAI,MAAZ;EACE,KAAK,iBACH,MAAM,IAAI,MACR,8YAIF;CAEJ;AAEJ;AAEA,SAAgB,aAAa,MAAwB;CACnD,IAAI,KAAK,UAAU,GACjB,MAAM,IAAI,MACR,kIACF;CAGF,MAAM,WAAW,KAAK,EAAE,CAAC,YAAY;CAErC,IAAI,CAACA,OAAY,QAAQ,GACvB,MAAM,IAAI,MACR,+fAKF;CAGF,OAAO;AACT"}
|
package/dist/compiler/main.cjs
CHANGED
|
@@ -6,11 +6,11 @@ const require_compiler = require("./compiler.cjs");
|
|
|
6
6
|
const require_source = require("./source.cjs");
|
|
7
7
|
const require_pack_limits = require("./pack_limits.cjs");
|
|
8
8
|
let node_path = require("node:path");
|
|
9
|
-
node_path = require_runtime.__toESM(node_path);
|
|
9
|
+
node_path = require_runtime.__toESM(node_path, 1);
|
|
10
10
|
let node_fs = require("node:fs");
|
|
11
|
-
node_fs = require_runtime.__toESM(node_fs);
|
|
11
|
+
node_fs = require_runtime.__toESM(node_fs, 1);
|
|
12
12
|
let node_zlib = require("node:zlib");
|
|
13
|
-
node_zlib = require_runtime.__toESM(node_zlib);
|
|
13
|
+
node_zlib = require_runtime.__toESM(node_zlib, 1);
|
|
14
14
|
let _milaboratories_pl_model_backend = require("@milaboratories/pl-model-backend");
|
|
15
15
|
let _milaboratories_resolve_helper = require("@milaboratories/resolve-helper");
|
|
16
16
|
//#region src/compiler/main.ts
|
|
@@ -430,9 +430,11 @@ function savePacks(logger, compiled, mode) {
|
|
|
430
430
|
}
|
|
431
431
|
//#endregion
|
|
432
432
|
exports.compile = compile;
|
|
433
|
+
exports.fullNameFromFileName = fullNameFromFileName;
|
|
433
434
|
exports.getPackageInfo = getPackageInfo;
|
|
434
435
|
exports.newCompiler = newCompiler;
|
|
435
436
|
exports.parseSources = parseSources;
|
|
437
|
+
exports.resolvePackageJsonRoot = resolvePackageJsonRoot;
|
|
436
438
|
exports.savePacks = savePacks;
|
|
437
439
|
|
|
438
440
|
//# sourceMappingURL=main.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.cjs","names":["path","pathType","fs","parseSourceFile","fullNameToString","typedArtifactNameToString","newTemplateFromContent","templateToSource","ArtifactSource","getSha256","zlib","TengoTemplateCompiler","collectWasmContributions"],"sources":["../../src/compiler/main.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as path from \"node:path\";\nimport * as fs from \"node:fs\";\nimport * as zlib from \"node:zlib\";\nimport { pathType } from \"./util\";\nimport type { TemplatesAndLibs } from \"./compiler\";\nimport { TengoTemplateCompiler } from \"./compiler\";\nimport { getSha256 } from \"./source\";\nimport type { CompileMode, FullArtifactName } from \"./package\";\nimport { fullNameToString, typedArtifactNameToString } from \"./package\";\nimport { ArtifactSource, parseSourceFile } from \"./source\";\nimport { newTemplateFromContent, templateToSource } from \"./template\";\nimport type winston from \"winston\";\nimport { tryResolve, tryResolveOrError } from \"@milaboratories/resolve-helper\";\nimport { serializeTemplate } from \"@milaboratories/pl-model-backend\";\nimport {\n assertTemplatePackSize,\n assertWasmFileSize,\n collectWasmContributions,\n} from \"./pack_limits\";\n\n// Convention: wasm component packages declare their wasm under a \"wasm\" condition\n// in package.json `exports`. Subpath \".\" maps to the tengo id \"main\"; subpath\n// \"./foo\" maps to id \"foo\". Other shapes of `exports` (string-valued, condition-only)\n// don't produce wasm artifacts.\nconst wasmExportCondition = \"wasm\";\nconst defaultWasmExportId = \"main\";\n\ninterface PackageId {\n /** Package name from package.json */\n readonly name: string;\n /** Package version from package.json */\n readonly version: string;\n}\n\ninterface PackageInfo extends PackageId {\n /** Package type from package.json */\n readonly type: string | undefined;\n /** Path to package root */\n readonly root: string;\n /** Context of package info */\n readonly context: PackageInfoContext;\n /** Dependencies */\n readonly dependencies: PackageInfo[];\n}\n\ninterface PackageJson {\n name: string;\n version: string;\n type: string | undefined;\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n}\n\nconst compiledTplSuffix = \".plj.gz\";\nconst compiledLibSuffix = \".lib.tengo\";\nconst compiledSoftwareSuffix = \".sw.json\";\nconst compiledAssetSuffix = \".as.json\";\nconst compiledWasmSuffix = \".wasm\";\n\n// We need to keep track of dependencies for correct tgo-test CLI utility configuraiton.\n// It is much simpler to do this here, than duplicate all tle logic regarding dependencies\n// in go code.\nconst srcTestSuffix = \".test.tengo\";\n\nconst srcTplSuffix = \".tpl.tengo\";\nconst srcLibSuffix = \".lib.tengo\";\nconst srcSoftwareSuffix = \".sw.json\";\nconst srcAssetSuffix = \".as.json\";\nconst compilableSuffixes = [srcLibSuffix, srcTplSuffix, srcSoftwareSuffix, srcAssetSuffix];\n\n/**\n * Resolves path to package.json file of the given dependency package.\n */\nfunction resolvePackageJsonPackage(root: string, depPackageName: string): string | undefined {\n if (!path.isAbsolute(root)) {\n throw new Error(`Root path must be absolute: ${root}`);\n }\n\n // First approach: resolving package's main entry point and try to find package.json\n // in dir tree upwards.\n let resolved = tryResolve(root, depPackageName);\n if (resolved) {\n let depth = 0;\n do {\n const p = path.join(resolved, \"package.json\");\n if (pathType(p) === \"file\") return p;\n depth++;\n resolved = path.dirname(resolved);\n } while (depth < 7 && path.basename(resolved) !== \"node_modules\");\n }\n\n // Second approach: trying to find package.json in the package dir.\n const resolved2 = tryResolveOrError(root, `${depPackageName}/package.json`);\n if (resolved2.result !== undefined) {\n return resolved2.result;\n }\n\n // Third approach: some packages (wasm-only components) don't expose any\n // import-resolvable entry point — neither a default export nor `./package.json`.\n // pnpm still installs them at <root>/node_modules/<depPackageName>/, so walk\n // the parent chain and check that path directly.\n if (resolved2.err === \"ERR_PACKAGE_PATH_NOT_EXPORTED\") {\n const fromNodeModules = findInNodeModules(root, depPackageName);\n if (fromNodeModules !== undefined) return fromNodeModules;\n // tolerating not-exported package.json for dev dependencies even if no\n // physical node_modules copy is found.\n return undefined;\n }\n throw new Error(\n `Can't resolve package.json for package ${depPackageName ?? \".\"} relative to ${root}`,\n );\n}\n\nfunction findInNodeModules(root: string, depPackageName: string): string | undefined {\n const candidate = path.join(root, \"node_modules\", depPackageName, \"package.json\");\n if (pathType(candidate) === \"file\") return candidate;\n const parent = path.dirname(root);\n if (parent === root) return undefined;\n return findInNodeModules(parent, depPackageName);\n}\n\nexport function resolvePackageJsonRoot(root: string): string {\n if (!path.isAbsolute(root)) {\n throw new Error(`Root path must be absolute: ${root}`);\n }\n\n const p = path.join(root, \"package.json\");\n if (pathType(p) === \"file\") return p;\n throw new Error(`Can't resolve package.json in ${root}`);\n}\n\ntype PackageInfoContext = \"root\" | \"dependency\" | \"devDependency\";\n\n/**\n * Get package info from package.json and all dependencies.\n */\nexport function getPackageInfo(\n root: string,\n logger: winston.Logger,\n context: PackageInfoContext = \"root\",\n): PackageInfo {\n const packageJsonPath = resolvePackageJsonRoot(root);\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath).toString()) as PackageJson;\n\n // resolving dependencies\n const depInfos: PackageInfo[] = [];\n\n if (packageJson.dependencies && context !== \"devDependency\") {\n for (const dep of Object.keys(packageJson.dependencies)) {\n const depPackageJson = resolvePackageJsonPackage(root, dep);\n if (depPackageJson === undefined)\n throw new Error(`Can't resolve package.json for dependency ${dep} of ${root}`);\n const depRoot = path.dirname(depPackageJson);\n depInfos.push(getPackageInfo(depRoot, logger, \"dependency\"));\n }\n }\n\n if (packageJson.devDependencies && context === \"root\") {\n for (const dep of Object.keys(packageJson.devDependencies)) {\n const depPackageJson = resolvePackageJsonPackage(root, dep);\n if (depPackageJson === undefined) {\n logger.warn(`Can't resolve package.json for dev dependency ${dep} of ${root}`);\n // tolerating not-exported package.json for dev dependencies\n continue;\n }\n const depRoot = path.dirname(depPackageJson);\n depInfos.push(getPackageInfo(depRoot, logger, \"devDependency\"));\n }\n }\n\n return {\n name: packageJson.name,\n version: packageJson.version,\n type: packageJson.type,\n dependencies: depInfos,\n root,\n context,\n };\n}\n\nfunction resolveLibsDst(mode: CompileMode, root: string) {\n return path.resolve(root, mode, \"tengo\", \"lib\");\n}\n\nfunction resolveTemplatesDst(mode: CompileMode, root: string) {\n return path.resolve(root, mode, \"tengo\", \"tpl\");\n}\n\nfunction resolveSoftwareDst(mode: CompileMode, root: string) {\n return path.resolve(root, mode, \"tengo\", \"software\");\n}\n\nfunction resolveAssetsDst(mode: CompileMode, root: string) {\n return path.resolve(root, mode, \"tengo\", \"asset\");\n}\n\nfunction resolveWasmDst(mode: CompileMode, root: string) {\n return path.resolve(root, mode, \"tengo\", \"wasm\");\n}\n\nfunction loadDependencies(\n logger: winston.Logger,\n compiler: TengoTemplateCompiler,\n packageInfo: PackageInfo,\n): void {\n for (const dep of packageInfo.dependencies) loadDependencies(logger, compiler, dep);\n\n if (packageInfo.context === \"root\")\n // we are not reading compiled files for root package\n return;\n\n // we are in package folder\n const libDistFolder = resolveLibsDst(\"dist\", packageInfo.root);\n const tplDistFolder = resolveTemplatesDst(\"dist\", packageInfo.root);\n const softwareDistFolder = resolveSoftwareDst(\"dist\", packageInfo.root);\n const assetDistFolder = resolveAssetsDst(\"dist\", packageInfo.root);\n const wasmDistFolder = resolveWasmDst(\"dist\", packageInfo.root);\n\n const libDistExists = pathType(libDistFolder) === \"dir\";\n const tplDistExists = pathType(tplDistFolder) === \"dir\";\n const softwareDistExists = pathType(softwareDistFolder) === \"dir\";\n const assetDistExists = pathType(assetDistFolder) === \"dir\";\n const wasmDistExists = pathType(wasmDistFolder) === \"dir\";\n const wasmExports = collectWasmExportPaths(packageInfo.root);\n\n if (\n !libDistExists &&\n !tplDistExists &&\n !softwareDistExists &&\n !assetDistExists &&\n !wasmDistExists &&\n wasmExports.length === 0\n )\n // if neither of tengo-specific folders detected, skipping package\n return;\n\n const packageId = { name: packageInfo.name, version: packageInfo.version };\n\n if (libDistExists) {\n loadLibsFromDir(logger, packageId, \"dist\", libDistFolder, compiler);\n }\n\n if (tplDistExists) {\n loadTemplatesFromDir(logger, packageId, \"dist\", tplDistFolder, compiler);\n }\n\n if (softwareDistExists) {\n loadSoftwareFromDir(logger, packageId, \"dist\", softwareDistFolder, compiler);\n }\n\n if (assetDistExists) {\n loadAssetsFromDir(logger, packageId, \"dist\", assetDistFolder, compiler);\n }\n\n if (wasmDistExists) {\n loadWasmFromDir(logger, packageId, \"dist\", wasmDistFolder, compiler);\n }\n\n for (const wasmExport of wasmExports) {\n loadWasmFromExport(logger, packageId, \"dist\", packageInfo.root, wasmExport, compiler);\n }\n}\n\nfunction loadLibsFromDir(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n folder: string,\n compiler: TengoTemplateCompiler,\n) {\n for (const f of fs.readdirSync(folder)) {\n const file = path.resolve(folder, f);\n if (!f.endsWith(compiledLibSuffix)) throw new Error(`unexpected file in 'lib' folder: ${file}`);\n const fullName: FullArtifactName = {\n type: \"library\",\n pkg: packageId.name,\n id: f.slice(0, f.length - compiledLibSuffix.length),\n version: packageId.version,\n };\n const src = parseSourceFile(logger, mode, file, fullName, true);\n compiler.addLib(src);\n logger.debug(`Adding dependency ${fullNameToString(fullName)} from ${file}`);\n if (src.dependencies.length > 0) {\n logger.debug(\"Dependencies:\");\n for (const dep of src.dependencies) logger.debug(` - ${typedArtifactNameToString(dep)}`);\n }\n }\n}\n\nfunction loadTemplatesFromDir(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n folder: string,\n compiler: TengoTemplateCompiler,\n) {\n // adding templates\n for (const f of fs.readdirSync(folder)) {\n const file = path.resolve(folder, f);\n if (!f.endsWith(compiledTplSuffix)) throw new Error(`unexpected file in 'tpl' folder: ${file}`);\n const fullName: FullArtifactName = {\n type: \"template\",\n pkg: packageId.name,\n id: f.slice(0, f.length - compiledTplSuffix.length),\n version: packageId.version,\n };\n const tpl = newTemplateFromContent(mode, fullName, fs.readFileSync(file));\n compiler.addTemplate(templateToSource(tpl));\n logger.debug(`Adding dependency ${fullNameToString(fullName)} from ${file}`);\n }\n}\n\nfunction loadSoftwareFromDir(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n folder: string,\n compiler: TengoTemplateCompiler,\n) {\n for (const f of fs.readdirSync(folder)) {\n const file = path.resolve(folder, f);\n if (!f.endsWith(compiledSoftwareSuffix))\n throw new Error(`unexpected file in 'software' folder: ${file}`);\n const fullName: FullArtifactName = {\n type: \"software\",\n pkg: packageId.name,\n id: f.slice(0, f.length - compiledSoftwareSuffix.length),\n version: packageId.version,\n };\n\n const source = fs.readFileSync(file).toString();\n\n const software = new ArtifactSource(mode, fullName, getSha256(source), source, file, [], []);\n\n logger.debug(`Adding dependency ${fullNameToString(fullName)} from ${file}`);\n compiler.addSoftware(software);\n }\n}\n\nfunction loadAssetsFromDir(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n folder: string,\n compiler: TengoTemplateCompiler,\n) {\n for (const f of fs.readdirSync(folder)) {\n const file = path.resolve(folder, f);\n if (!f.endsWith(compiledAssetSuffix))\n throw new Error(`unexpected file in 'asset' folder: ${file}`);\n const fullName: FullArtifactName = {\n type: \"asset\",\n pkg: packageId.name,\n id: f.slice(0, f.length - compiledAssetSuffix.length),\n version: packageId.version,\n };\n\n const source = fs.readFileSync(file).toString();\n\n const asset = new ArtifactSource(mode, fullName, getSha256(source), source, file, [], []);\n\n logger.debug(`Adding dependency ${fullNameToString(fullName)} from ${file}`);\n compiler.addAsset(asset);\n }\n}\n\nfunction loadWasmFromDir(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n folder: string,\n compiler: TengoTemplateCompiler,\n) {\n for (const f of fs.readdirSync(folder)) {\n const file = path.resolve(folder, f);\n if (!f.endsWith(compiledWasmSuffix))\n throw new Error(`unexpected file in 'wasm' folder: ${file}`);\n const fullName: FullArtifactName = {\n type: \"wasm\",\n pkg: packageId.name,\n id: f.slice(0, f.length - compiledWasmSuffix.length),\n version: packageId.version,\n };\n\n addWasmFile(logger, mode, file, fullName, compiler);\n }\n}\n\ninterface WasmExport {\n id: string;\n /** wasm file path, relative to the package root */\n relPath: string;\n}\n\nfunction loadWasmFromExport(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n packageRoot: string,\n wasmExport: WasmExport,\n compiler: TengoTemplateCompiler,\n) {\n const file = path.resolve(packageRoot, wasmExport.relPath);\n if (pathType(file) !== \"file\") {\n throw new Error(\n `wasm export \"${wasmExport.id}\" points to missing file: ${file} (package ${packageId.name})`,\n );\n }\n const fullName: FullArtifactName = {\n type: \"wasm\",\n pkg: packageId.name,\n id: wasmExport.id,\n version: packageId.version,\n };\n\n addWasmFile(logger, mode, file, fullName, compiler);\n}\n\nfunction addWasmFile(\n logger: winston.Logger,\n mode: CompileMode,\n file: string,\n fullName: FullArtifactName,\n compiler: TengoTemplateCompiler,\n) {\n // wasm bytes are binary, but hashToSource carries strings only. The file is\n // gzipped first (level 9 — block builds run rarely, so paying the slow-but-\n // tight setting is fine) and then base64-encoded. The backend's wasm package\n // sniffs the gzip header at PrecompileComponent time and gunzips before\n // handing the bytes to wasmtime. Compressing here shrinks both the per-WASM\n // resource footprint (a real wasm component compresses to ~30-40 % of its\n // raw size) and the on-wire pack, which lets pframes-rs grow past the\n // 3 MiB raw-size ceiling without hitting the backend's value-resource cap.\n const raw = fs.readFileSync(file);\n const compressed = zlib.gzipSync(raw, { level: zlib.constants.Z_BEST_COMPRESSION });\n assertWasmFileSize(file, compressed.length, fullName);\n const source = compressed.toString(\"base64\");\n const wasm = new ArtifactSource(mode, fullName, getSha256(source), source, file, [], []);\n\n logger.debug(\n `Adding dependency ${fullNameToString(fullName)} from ${file} ` +\n `(${raw.length} B raw → ${compressed.length} B gzipped)`,\n );\n compiler.addWasm(wasm);\n}\n\n/**\n * Discover wasm artifacts declared by a package's `package.json` via the\n * node `exports` conditional-exports map.\n *\n * Convention: a package that wants to ship one or more wasm components to\n * tengo-builder publishes them under a `\"wasm\"` condition keyed by an\n * `exports` subpath. The subpath becomes the wasm artifact id (`.` →\n * `main`, `./foo` → `foo`). Example shape we look for:\n *\n * {\n * \"exports\": {\n * \".\": {\n * \"wasm\": \"./dist/pframes_rs_wasip2.wasm\", // ← discovered\n * \"wit\": \"./wit/world.wit\"\n * },\n * \"./extra\": {\n * \"wasm\": \"./dist/extra.wasm\" // ← discovered as id \"extra\"\n * }\n * }\n * }\n *\n * Why raw traversal instead of Zod / a typed schema:\n * 1. `package.json#exports` is a community convention with no fixed shape\n * — any combination of strings, objects, arrays, and conditions is\n * legal node syntax. A strict schema would either reject valid\n * packages or have to admit `unknown` for half of it anyway.\n * 2. We care about exactly one condition (`wasm`) on subpath entries,\n * not the rest of the exports tree. A targeted walk reads more\n * directly than a schema that re-describes the conditional-exports\n * grammar.\n * 3. Errors here should always mean \"this package contributes no wasm\";\n * never crash the build. Every check returns `[]` or `continue`s.\n *\n * Returns the discovered wasm exports; empty when the file is missing,\n * malformed, has no `exports`, or has no subpath with a `\"wasm\"`\n * condition pointing at a string path.\n */\nfunction collectWasmExportPaths(packageRoot: string): WasmExport[] {\n const packageJsonPath = path.join(packageRoot, \"package.json\");\n if (pathType(packageJsonPath) !== \"file\") return [];\n\n let raw: unknown;\n try {\n raw = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n } catch {\n return [];\n }\n if (typeof raw !== \"object\" || raw === null) return [];\n\n const exportsField = (raw as { exports?: unknown }).exports;\n if (typeof exportsField !== \"object\" || exportsField === null) return [];\n\n const result: WasmExport[] = [];\n for (const [subpath, value] of Object.entries(exportsField as Record<string, unknown>)) {\n if (!subpath.startsWith(\".\")) continue; // skip condition-only entries\n if (typeof value !== \"object\" || value === null) continue;\n const wasmPath = (value as Record<string, unknown>)[wasmExportCondition];\n if (typeof wasmPath !== \"string\") continue;\n const id = subpath === \".\" ? defaultWasmExportId : subpath.replace(/^\\.\\/?/, \"\");\n if (!id) continue;\n result.push({ id, relPath: wasmPath });\n }\n return result;\n}\n\nexport function parseSources(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n root: string,\n subdir: string,\n): ArtifactSource[] {\n const sources: ArtifactSource[] = [];\n\n for (const f of fs.readdirSync(path.join(root, subdir))) {\n const inRootPath = path.join(subdir, f); // path to item inside given <root>\n const fullPath = path.join(root, inRootPath); // full path to item from CWD (or abs path, if <root> is abs path)\n\n if (pathType(fullPath) === \"dir\") {\n const nested = parseSources(logger, packageId, mode, root, inRootPath);\n sources.push(...nested);\n continue;\n }\n\n // Handling index.lib.tengo files: rename them to <package-name>.lib.tengo\n const artifactName =\n f === \"index.lib.tengo\" ? `${path.dirname(inRootPath)}.lib.tengo` : inRootPath;\n\n const fullName = fullNameFromFileName(packageId, artifactName.replaceAll(path.sep, \".\"));\n if (!fullName) {\n logger.info(`Skipping unknown file type: ${artifactName}`);\n continue; // skip unknown file types\n }\n\n // if (subdir != '') {\n // throw new Error(`Templates and libraries should reside only inside '${root}' dir.\n // You are free to have any file and dirs structure inside '${root}' keeping other files where you want,\n // but regarding ${compilableSuffixes.join(', ')}, the flat file structure is mandatory.`);\n // }\n\n const file = path.resolve(root, inRootPath);\n logger.debug(`Parsing ${fullNameToString(fullName)} from ${file}`);\n const newSrc = parseSourceFile(logger, mode, file, fullName, true);\n if (newSrc.dependencies.length > 0) {\n logger.debug(\"Detected dependencies:\");\n for (const dep of newSrc.dependencies) logger.debug(` - ${typedArtifactNameToString(dep)}`);\n }\n\n sources.push(newSrc);\n }\n\n return sources;\n}\n\nexport function newCompiler(\n logger: winston.Logger,\n packageInfo: PackageInfo,\n mode: CompileMode,\n): TengoTemplateCompiler {\n const compiler = new TengoTemplateCompiler(mode);\n\n // collect all data (templates, libs and software) from dependency tree\n loadDependencies(logger, compiler, packageInfo);\n\n return compiler;\n}\n\nexport function fullNameFromFileName(\n packageId: PackageId,\n artifactName: string,\n): FullArtifactName | null {\n const pkgAndVersion = { pkg: packageId.name, version: packageId.version };\n if (artifactName.endsWith(srcLibSuffix)) {\n return {\n ...pkgAndVersion,\n id: artifactName.substring(0, artifactName.length - srcLibSuffix.length),\n type: \"library\",\n };\n }\n\n if (artifactName.endsWith(srcTplSuffix)) {\n return {\n ...pkgAndVersion,\n id: artifactName.substring(0, artifactName.length - srcTplSuffix.length),\n type: \"template\",\n };\n }\n\n if (artifactName.endsWith(srcSoftwareSuffix)) {\n return {\n ...pkgAndVersion,\n id: artifactName.substring(0, artifactName.length - srcSoftwareSuffix.length),\n type: \"software\",\n };\n }\n\n if (artifactName.endsWith(srcAssetSuffix)) {\n return {\n ...pkgAndVersion,\n id: artifactName.substring(0, artifactName.length - srcAssetSuffix.length),\n type: \"asset\",\n };\n }\n\n if (artifactName.endsWith(srcTestSuffix)) {\n return {\n ...pkgAndVersion,\n id: artifactName.substring(0, artifactName.length - srcTestSuffix.length),\n type: \"test\",\n };\n }\n\n return null;\n}\n\nexport function compile(\n logger: winston.Logger,\n packageInfo: PackageInfo,\n mode: CompileMode,\n): TemplatesAndLibs {\n const compiler = newCompiler(logger, packageInfo, mode);\n const sources = parseSources(logger, packageInfo, mode, \"src\", \"\");\n\n // checking that we have something to do\n if (sources.length === 0) {\n const lookFor: string[] = [];\n for (const suffix of compilableSuffixes) {\n lookFor.push(`*${suffix}`);\n }\n\n logger.error(`Nothing to compile. Looked for ${lookFor.join(\", \")}`);\n process.exit(1);\n }\n\n // compilation\n logger.info(`Compiling '${mode}'...`);\n const compiled = compiler.compileAndAdd(sources);\n logger.debug(`Done.`);\n\n return compiled;\n}\n\nexport function savePacks(logger: winston.Logger, compiled: TemplatesAndLibs, mode: CompileMode) {\n // writing libs\n if (compiled.libs.length > 0) {\n const libOutput = resolveLibsDst(mode, \".\");\n fs.mkdirSync(libOutput, { recursive: true });\n for (const lib of compiled.libs) {\n const file = path.resolve(libOutput, lib.fullName.id + compiledLibSuffix);\n logger.info(` - writing ${file}`);\n fs.writeFileSync(file, lib.src);\n }\n }\n\n // writing templates\n if (compiled.templates.length > 0) {\n const tplOutput = resolveTemplatesDst(mode, \".\");\n fs.mkdirSync(tplOutput, { recursive: true });\n for (const tpl of compiled.templates) {\n const file = path.resolve(tplOutput, tpl.fullName.id + compiledTplSuffix);\n const packed = serializeTemplate(tpl.data);\n assertTemplatePackSize(\n fullNameToString(tpl.fullName),\n packed.byteLength,\n collectWasmContributions(tpl.data),\n );\n logger.info(` - writing ${file}`);\n fs.writeFileSync(file, packed);\n }\n }\n\n // writing software\n if (compiled.software.length > 0) {\n const swOutput = resolveSoftwareDst(mode, \".\");\n fs.mkdirSync(swOutput, { recursive: true });\n for (const sw of compiled.software) {\n const file = path.resolve(swOutput, sw.fullName.id + compiledSoftwareSuffix);\n logger.info(` - writing ${file}`);\n fs.writeFileSync(file, sw.src);\n }\n }\n\n // writing assets\n if (compiled.assets.length > 0) {\n const swOutput = resolveAssetsDst(mode, \".\");\n fs.mkdirSync(swOutput, { recursive: true });\n for (const sw of compiled.software) {\n const file = path.resolve(swOutput, sw.fullName.id + compiledAssetSuffix);\n logger.info(` - writing ${file}`);\n fs.writeFileSync(file, sw.src);\n }\n }\n\n // writing wasm\n if (compiled.wasm.length > 0) {\n const wasmOutput = resolveWasmDst(mode, \".\");\n fs.mkdirSync(wasmOutput, { recursive: true });\n for (const wasm of compiled.wasm) {\n const file = path.resolve(wasmOutput, wasm.fullName.id + compiledWasmSuffix);\n logger.info(` - writing ${file}`);\n // wasm.src holds base64-encoded bytes; decode back to raw bytes on disk\n fs.writeFileSync(file, Buffer.from(wasm.src, \"base64\"));\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"main.cjs","names":["path","pathType","fs","parseSourceFile","fullNameToString","typedArtifactNameToString","newTemplateFromContent","templateToSource","ArtifactSource","getSha256","zlib","TengoTemplateCompiler","collectWasmContributions"],"sources":["../../src/compiler/main.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as path from \"node:path\";\nimport * as fs from \"node:fs\";\nimport * as zlib from \"node:zlib\";\nimport { pathType } from \"./util\";\nimport type { TemplatesAndLibs } from \"./compiler\";\nimport { TengoTemplateCompiler } from \"./compiler\";\nimport { getSha256 } from \"./source\";\nimport type { CompileMode, FullArtifactName } from \"./package\";\nimport { fullNameToString, typedArtifactNameToString } from \"./package\";\nimport { ArtifactSource, parseSourceFile } from \"./source\";\nimport { newTemplateFromContent, templateToSource } from \"./template\";\nimport type winston from \"winston\";\nimport { tryResolve, tryResolveOrError } from \"@milaboratories/resolve-helper\";\nimport { serializeTemplate } from \"@milaboratories/pl-model-backend\";\nimport {\n assertTemplatePackSize,\n assertWasmFileSize,\n collectWasmContributions,\n} from \"./pack_limits\";\n\n// Convention: wasm component packages declare their wasm under a \"wasm\" condition\n// in package.json `exports`. Subpath \".\" maps to the tengo id \"main\"; subpath\n// \"./foo\" maps to id \"foo\". Other shapes of `exports` (string-valued, condition-only)\n// don't produce wasm artifacts.\nconst wasmExportCondition = \"wasm\";\nconst defaultWasmExportId = \"main\";\n\ninterface PackageId {\n /** Package name from package.json */\n readonly name: string;\n /** Package version from package.json */\n readonly version: string;\n}\n\ninterface PackageInfo extends PackageId {\n /** Package type from package.json */\n readonly type: string | undefined;\n /** Path to package root */\n readonly root: string;\n /** Context of package info */\n readonly context: PackageInfoContext;\n /** Dependencies */\n readonly dependencies: PackageInfo[];\n}\n\ninterface PackageJson {\n name: string;\n version: string;\n type: string | undefined;\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n}\n\nconst compiledTplSuffix = \".plj.gz\";\nconst compiledLibSuffix = \".lib.tengo\";\nconst compiledSoftwareSuffix = \".sw.json\";\nconst compiledAssetSuffix = \".as.json\";\nconst compiledWasmSuffix = \".wasm\";\n\n// We need to keep track of dependencies for correct tgo-test CLI utility configuraiton.\n// It is much simpler to do this here, than duplicate all tle logic regarding dependencies\n// in go code.\nconst srcTestSuffix = \".test.tengo\";\n\nconst srcTplSuffix = \".tpl.tengo\";\nconst srcLibSuffix = \".lib.tengo\";\nconst srcSoftwareSuffix = \".sw.json\";\nconst srcAssetSuffix = \".as.json\";\nconst compilableSuffixes = [srcLibSuffix, srcTplSuffix, srcSoftwareSuffix, srcAssetSuffix];\n\n/**\n * Resolves path to package.json file of the given dependency package.\n */\nfunction resolvePackageJsonPackage(root: string, depPackageName: string): string | undefined {\n if (!path.isAbsolute(root)) {\n throw new Error(`Root path must be absolute: ${root}`);\n }\n\n // First approach: resolving package's main entry point and try to find package.json\n // in dir tree upwards.\n let resolved = tryResolve(root, depPackageName);\n if (resolved) {\n let depth = 0;\n do {\n const p = path.join(resolved, \"package.json\");\n if (pathType(p) === \"file\") return p;\n depth++;\n resolved = path.dirname(resolved);\n } while (depth < 7 && path.basename(resolved) !== \"node_modules\");\n }\n\n // Second approach: trying to find package.json in the package dir.\n const resolved2 = tryResolveOrError(root, `${depPackageName}/package.json`);\n if (resolved2.result !== undefined) {\n return resolved2.result;\n }\n\n // Third approach: some packages (wasm-only components) don't expose any\n // import-resolvable entry point — neither a default export nor `./package.json`.\n // pnpm still installs them at <root>/node_modules/<depPackageName>/, so walk\n // the parent chain and check that path directly.\n if (resolved2.err === \"ERR_PACKAGE_PATH_NOT_EXPORTED\") {\n const fromNodeModules = findInNodeModules(root, depPackageName);\n if (fromNodeModules !== undefined) return fromNodeModules;\n // tolerating not-exported package.json for dev dependencies even if no\n // physical node_modules copy is found.\n return undefined;\n }\n throw new Error(\n `Can't resolve package.json for package ${depPackageName ?? \".\"} relative to ${root}`,\n );\n}\n\nfunction findInNodeModules(root: string, depPackageName: string): string | undefined {\n const candidate = path.join(root, \"node_modules\", depPackageName, \"package.json\");\n if (pathType(candidate) === \"file\") return candidate;\n const parent = path.dirname(root);\n if (parent === root) return undefined;\n return findInNodeModules(parent, depPackageName);\n}\n\nexport function resolvePackageJsonRoot(root: string): string {\n if (!path.isAbsolute(root)) {\n throw new Error(`Root path must be absolute: ${root}`);\n }\n\n const p = path.join(root, \"package.json\");\n if (pathType(p) === \"file\") return p;\n throw new Error(`Can't resolve package.json in ${root}`);\n}\n\ntype PackageInfoContext = \"root\" | \"dependency\" | \"devDependency\";\n\n/**\n * Get package info from package.json and all dependencies.\n */\nexport function getPackageInfo(\n root: string,\n logger: winston.Logger,\n context: PackageInfoContext = \"root\",\n): PackageInfo {\n const packageJsonPath = resolvePackageJsonRoot(root);\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath).toString()) as PackageJson;\n\n // resolving dependencies\n const depInfos: PackageInfo[] = [];\n\n if (packageJson.dependencies && context !== \"devDependency\") {\n for (const dep of Object.keys(packageJson.dependencies)) {\n const depPackageJson = resolvePackageJsonPackage(root, dep);\n if (depPackageJson === undefined)\n throw new Error(`Can't resolve package.json for dependency ${dep} of ${root}`);\n const depRoot = path.dirname(depPackageJson);\n depInfos.push(getPackageInfo(depRoot, logger, \"dependency\"));\n }\n }\n\n if (packageJson.devDependencies && context === \"root\") {\n for (const dep of Object.keys(packageJson.devDependencies)) {\n const depPackageJson = resolvePackageJsonPackage(root, dep);\n if (depPackageJson === undefined) {\n logger.warn(`Can't resolve package.json for dev dependency ${dep} of ${root}`);\n // tolerating not-exported package.json for dev dependencies\n continue;\n }\n const depRoot = path.dirname(depPackageJson);\n depInfos.push(getPackageInfo(depRoot, logger, \"devDependency\"));\n }\n }\n\n return {\n name: packageJson.name,\n version: packageJson.version,\n type: packageJson.type,\n dependencies: depInfos,\n root,\n context,\n };\n}\n\nfunction resolveLibsDst(mode: CompileMode, root: string) {\n return path.resolve(root, mode, \"tengo\", \"lib\");\n}\n\nfunction resolveTemplatesDst(mode: CompileMode, root: string) {\n return path.resolve(root, mode, \"tengo\", \"tpl\");\n}\n\nfunction resolveSoftwareDst(mode: CompileMode, root: string) {\n return path.resolve(root, mode, \"tengo\", \"software\");\n}\n\nfunction resolveAssetsDst(mode: CompileMode, root: string) {\n return path.resolve(root, mode, \"tengo\", \"asset\");\n}\n\nfunction resolveWasmDst(mode: CompileMode, root: string) {\n return path.resolve(root, mode, \"tengo\", \"wasm\");\n}\n\nfunction loadDependencies(\n logger: winston.Logger,\n compiler: TengoTemplateCompiler,\n packageInfo: PackageInfo,\n): void {\n for (const dep of packageInfo.dependencies) loadDependencies(logger, compiler, dep);\n\n if (packageInfo.context === \"root\")\n // we are not reading compiled files for root package\n return;\n\n // we are in package folder\n const libDistFolder = resolveLibsDst(\"dist\", packageInfo.root);\n const tplDistFolder = resolveTemplatesDst(\"dist\", packageInfo.root);\n const softwareDistFolder = resolveSoftwareDst(\"dist\", packageInfo.root);\n const assetDistFolder = resolveAssetsDst(\"dist\", packageInfo.root);\n const wasmDistFolder = resolveWasmDst(\"dist\", packageInfo.root);\n\n const libDistExists = pathType(libDistFolder) === \"dir\";\n const tplDistExists = pathType(tplDistFolder) === \"dir\";\n const softwareDistExists = pathType(softwareDistFolder) === \"dir\";\n const assetDistExists = pathType(assetDistFolder) === \"dir\";\n const wasmDistExists = pathType(wasmDistFolder) === \"dir\";\n const wasmExports = collectWasmExportPaths(packageInfo.root);\n\n if (\n !libDistExists &&\n !tplDistExists &&\n !softwareDistExists &&\n !assetDistExists &&\n !wasmDistExists &&\n wasmExports.length === 0\n )\n // if neither of tengo-specific folders detected, skipping package\n return;\n\n const packageId = { name: packageInfo.name, version: packageInfo.version };\n\n if (libDistExists) {\n loadLibsFromDir(logger, packageId, \"dist\", libDistFolder, compiler);\n }\n\n if (tplDistExists) {\n loadTemplatesFromDir(logger, packageId, \"dist\", tplDistFolder, compiler);\n }\n\n if (softwareDistExists) {\n loadSoftwareFromDir(logger, packageId, \"dist\", softwareDistFolder, compiler);\n }\n\n if (assetDistExists) {\n loadAssetsFromDir(logger, packageId, \"dist\", assetDistFolder, compiler);\n }\n\n if (wasmDistExists) {\n loadWasmFromDir(logger, packageId, \"dist\", wasmDistFolder, compiler);\n }\n\n for (const wasmExport of wasmExports) {\n loadWasmFromExport(logger, packageId, \"dist\", packageInfo.root, wasmExport, compiler);\n }\n}\n\nfunction loadLibsFromDir(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n folder: string,\n compiler: TengoTemplateCompiler,\n) {\n for (const f of fs.readdirSync(folder)) {\n const file = path.resolve(folder, f);\n if (!f.endsWith(compiledLibSuffix)) throw new Error(`unexpected file in 'lib' folder: ${file}`);\n const fullName: FullArtifactName = {\n type: \"library\",\n pkg: packageId.name,\n id: f.slice(0, f.length - compiledLibSuffix.length),\n version: packageId.version,\n };\n const src = parseSourceFile(logger, mode, file, fullName, true);\n compiler.addLib(src);\n logger.debug(`Adding dependency ${fullNameToString(fullName)} from ${file}`);\n if (src.dependencies.length > 0) {\n logger.debug(\"Dependencies:\");\n for (const dep of src.dependencies) logger.debug(` - ${typedArtifactNameToString(dep)}`);\n }\n }\n}\n\nfunction loadTemplatesFromDir(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n folder: string,\n compiler: TengoTemplateCompiler,\n) {\n // adding templates\n for (const f of fs.readdirSync(folder)) {\n const file = path.resolve(folder, f);\n if (!f.endsWith(compiledTplSuffix)) throw new Error(`unexpected file in 'tpl' folder: ${file}`);\n const fullName: FullArtifactName = {\n type: \"template\",\n pkg: packageId.name,\n id: f.slice(0, f.length - compiledTplSuffix.length),\n version: packageId.version,\n };\n const tpl = newTemplateFromContent(mode, fullName, fs.readFileSync(file));\n compiler.addTemplate(templateToSource(tpl));\n logger.debug(`Adding dependency ${fullNameToString(fullName)} from ${file}`);\n }\n}\n\nfunction loadSoftwareFromDir(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n folder: string,\n compiler: TengoTemplateCompiler,\n) {\n for (const f of fs.readdirSync(folder)) {\n const file = path.resolve(folder, f);\n if (!f.endsWith(compiledSoftwareSuffix))\n throw new Error(`unexpected file in 'software' folder: ${file}`);\n const fullName: FullArtifactName = {\n type: \"software\",\n pkg: packageId.name,\n id: f.slice(0, f.length - compiledSoftwareSuffix.length),\n version: packageId.version,\n };\n\n const source = fs.readFileSync(file).toString();\n\n const software = new ArtifactSource(mode, fullName, getSha256(source), source, file, [], []);\n\n logger.debug(`Adding dependency ${fullNameToString(fullName)} from ${file}`);\n compiler.addSoftware(software);\n }\n}\n\nfunction loadAssetsFromDir(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n folder: string,\n compiler: TengoTemplateCompiler,\n) {\n for (const f of fs.readdirSync(folder)) {\n const file = path.resolve(folder, f);\n if (!f.endsWith(compiledAssetSuffix))\n throw new Error(`unexpected file in 'asset' folder: ${file}`);\n const fullName: FullArtifactName = {\n type: \"asset\",\n pkg: packageId.name,\n id: f.slice(0, f.length - compiledAssetSuffix.length),\n version: packageId.version,\n };\n\n const source = fs.readFileSync(file).toString();\n\n const asset = new ArtifactSource(mode, fullName, getSha256(source), source, file, [], []);\n\n logger.debug(`Adding dependency ${fullNameToString(fullName)} from ${file}`);\n compiler.addAsset(asset);\n }\n}\n\nfunction loadWasmFromDir(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n folder: string,\n compiler: TengoTemplateCompiler,\n) {\n for (const f of fs.readdirSync(folder)) {\n const file = path.resolve(folder, f);\n if (!f.endsWith(compiledWasmSuffix))\n throw new Error(`unexpected file in 'wasm' folder: ${file}`);\n const fullName: FullArtifactName = {\n type: \"wasm\",\n pkg: packageId.name,\n id: f.slice(0, f.length - compiledWasmSuffix.length),\n version: packageId.version,\n };\n\n addWasmFile(logger, mode, file, fullName, compiler);\n }\n}\n\ninterface WasmExport {\n id: string;\n /** wasm file path, relative to the package root */\n relPath: string;\n}\n\nfunction loadWasmFromExport(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n packageRoot: string,\n wasmExport: WasmExport,\n compiler: TengoTemplateCompiler,\n) {\n const file = path.resolve(packageRoot, wasmExport.relPath);\n if (pathType(file) !== \"file\") {\n throw new Error(\n `wasm export \"${wasmExport.id}\" points to missing file: ${file} (package ${packageId.name})`,\n );\n }\n const fullName: FullArtifactName = {\n type: \"wasm\",\n pkg: packageId.name,\n id: wasmExport.id,\n version: packageId.version,\n };\n\n addWasmFile(logger, mode, file, fullName, compiler);\n}\n\nfunction addWasmFile(\n logger: winston.Logger,\n mode: CompileMode,\n file: string,\n fullName: FullArtifactName,\n compiler: TengoTemplateCompiler,\n) {\n // wasm bytes are binary, but hashToSource carries strings only. The file is\n // gzipped first (level 9 — block builds run rarely, so paying the slow-but-\n // tight setting is fine) and then base64-encoded. The backend's wasm package\n // sniffs the gzip header at PrecompileComponent time and gunzips before\n // handing the bytes to wasmtime. Compressing here shrinks both the per-WASM\n // resource footprint (a real wasm component compresses to ~30-40 % of its\n // raw size) and the on-wire pack, which lets pframes-rs grow past the\n // 3 MiB raw-size ceiling without hitting the backend's value-resource cap.\n const raw = fs.readFileSync(file);\n const compressed = zlib.gzipSync(raw, { level: zlib.constants.Z_BEST_COMPRESSION });\n assertWasmFileSize(file, compressed.length, fullName);\n const source = compressed.toString(\"base64\");\n const wasm = new ArtifactSource(mode, fullName, getSha256(source), source, file, [], []);\n\n logger.debug(\n `Adding dependency ${fullNameToString(fullName)} from ${file} ` +\n `(${raw.length} B raw → ${compressed.length} B gzipped)`,\n );\n compiler.addWasm(wasm);\n}\n\n/**\n * Discover wasm artifacts declared by a package's `package.json` via the\n * node `exports` conditional-exports map.\n *\n * Convention: a package that wants to ship one or more wasm components to\n * tengo-builder publishes them under a `\"wasm\"` condition keyed by an\n * `exports` subpath. The subpath becomes the wasm artifact id (`.` →\n * `main`, `./foo` → `foo`). Example shape we look for:\n *\n * {\n * \"exports\": {\n * \".\": {\n * \"wasm\": \"./dist/pframes_rs_wasip2.wasm\", // ← discovered\n * \"wit\": \"./wit/world.wit\"\n * },\n * \"./extra\": {\n * \"wasm\": \"./dist/extra.wasm\" // ← discovered as id \"extra\"\n * }\n * }\n * }\n *\n * Why raw traversal instead of Zod / a typed schema:\n * 1. `package.json#exports` is a community convention with no fixed shape\n * — any combination of strings, objects, arrays, and conditions is\n * legal node syntax. A strict schema would either reject valid\n * packages or have to admit `unknown` for half of it anyway.\n * 2. We care about exactly one condition (`wasm`) on subpath entries,\n * not the rest of the exports tree. A targeted walk reads more\n * directly than a schema that re-describes the conditional-exports\n * grammar.\n * 3. Errors here should always mean \"this package contributes no wasm\";\n * never crash the build. Every check returns `[]` or `continue`s.\n *\n * Returns the discovered wasm exports; empty when the file is missing,\n * malformed, has no `exports`, or has no subpath with a `\"wasm\"`\n * condition pointing at a string path.\n */\nfunction collectWasmExportPaths(packageRoot: string): WasmExport[] {\n const packageJsonPath = path.join(packageRoot, \"package.json\");\n if (pathType(packageJsonPath) !== \"file\") return [];\n\n let raw: unknown;\n try {\n raw = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n } catch {\n return [];\n }\n if (typeof raw !== \"object\" || raw === null) return [];\n\n const exportsField = (raw as { exports?: unknown }).exports;\n if (typeof exportsField !== \"object\" || exportsField === null) return [];\n\n const result: WasmExport[] = [];\n for (const [subpath, value] of Object.entries(exportsField as Record<string, unknown>)) {\n if (!subpath.startsWith(\".\")) continue; // skip condition-only entries\n if (typeof value !== \"object\" || value === null) continue;\n const wasmPath = (value as Record<string, unknown>)[wasmExportCondition];\n if (typeof wasmPath !== \"string\") continue;\n const id = subpath === \".\" ? defaultWasmExportId : subpath.replace(/^\\.\\/?/, \"\");\n if (!id) continue;\n result.push({ id, relPath: wasmPath });\n }\n return result;\n}\n\nexport function parseSources(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n root: string,\n subdir: string,\n): ArtifactSource[] {\n const sources: ArtifactSource[] = [];\n\n for (const f of fs.readdirSync(path.join(root, subdir))) {\n const inRootPath = path.join(subdir, f); // path to item inside given <root>\n const fullPath = path.join(root, inRootPath); // full path to item from CWD (or abs path, if <root> is abs path)\n\n if (pathType(fullPath) === \"dir\") {\n const nested = parseSources(logger, packageId, mode, root, inRootPath);\n sources.push(...nested);\n continue;\n }\n\n // Handling index.lib.tengo files: rename them to <package-name>.lib.tengo\n const artifactName =\n f === \"index.lib.tengo\" ? `${path.dirname(inRootPath)}.lib.tengo` : inRootPath;\n\n const fullName = fullNameFromFileName(packageId, artifactName.replaceAll(path.sep, \".\"));\n if (!fullName) {\n logger.info(`Skipping unknown file type: ${artifactName}`);\n continue; // skip unknown file types\n }\n\n // if (subdir != '') {\n // throw new Error(`Templates and libraries should reside only inside '${root}' dir.\n // You are free to have any file and dirs structure inside '${root}' keeping other files where you want,\n // but regarding ${compilableSuffixes.join(', ')}, the flat file structure is mandatory.`);\n // }\n\n const file = path.resolve(root, inRootPath);\n logger.debug(`Parsing ${fullNameToString(fullName)} from ${file}`);\n const newSrc = parseSourceFile(logger, mode, file, fullName, true);\n if (newSrc.dependencies.length > 0) {\n logger.debug(\"Detected dependencies:\");\n for (const dep of newSrc.dependencies) logger.debug(` - ${typedArtifactNameToString(dep)}`);\n }\n\n sources.push(newSrc);\n }\n\n return sources;\n}\n\nexport function newCompiler(\n logger: winston.Logger,\n packageInfo: PackageInfo,\n mode: CompileMode,\n): TengoTemplateCompiler {\n const compiler = new TengoTemplateCompiler(mode);\n\n // collect all data (templates, libs and software) from dependency tree\n loadDependencies(logger, compiler, packageInfo);\n\n return compiler;\n}\n\nexport function fullNameFromFileName(\n packageId: PackageId,\n artifactName: string,\n): FullArtifactName | null {\n const pkgAndVersion = { pkg: packageId.name, version: packageId.version };\n if (artifactName.endsWith(srcLibSuffix)) {\n return {\n ...pkgAndVersion,\n id: artifactName.substring(0, artifactName.length - srcLibSuffix.length),\n type: \"library\",\n };\n }\n\n if (artifactName.endsWith(srcTplSuffix)) {\n return {\n ...pkgAndVersion,\n id: artifactName.substring(0, artifactName.length - srcTplSuffix.length),\n type: \"template\",\n };\n }\n\n if (artifactName.endsWith(srcSoftwareSuffix)) {\n return {\n ...pkgAndVersion,\n id: artifactName.substring(0, artifactName.length - srcSoftwareSuffix.length),\n type: \"software\",\n };\n }\n\n if (artifactName.endsWith(srcAssetSuffix)) {\n return {\n ...pkgAndVersion,\n id: artifactName.substring(0, artifactName.length - srcAssetSuffix.length),\n type: \"asset\",\n };\n }\n\n if (artifactName.endsWith(srcTestSuffix)) {\n return {\n ...pkgAndVersion,\n id: artifactName.substring(0, artifactName.length - srcTestSuffix.length),\n type: \"test\",\n };\n }\n\n return null;\n}\n\nexport function compile(\n logger: winston.Logger,\n packageInfo: PackageInfo,\n mode: CompileMode,\n): TemplatesAndLibs {\n const compiler = newCompiler(logger, packageInfo, mode);\n const sources = parseSources(logger, packageInfo, mode, \"src\", \"\");\n\n // checking that we have something to do\n if (sources.length === 0) {\n const lookFor: string[] = [];\n for (const suffix of compilableSuffixes) {\n lookFor.push(`*${suffix}`);\n }\n\n logger.error(`Nothing to compile. Looked for ${lookFor.join(\", \")}`);\n process.exit(1);\n }\n\n // compilation\n logger.info(`Compiling '${mode}'...`);\n const compiled = compiler.compileAndAdd(sources);\n logger.debug(`Done.`);\n\n return compiled;\n}\n\nexport function savePacks(logger: winston.Logger, compiled: TemplatesAndLibs, mode: CompileMode) {\n // writing libs\n if (compiled.libs.length > 0) {\n const libOutput = resolveLibsDst(mode, \".\");\n fs.mkdirSync(libOutput, { recursive: true });\n for (const lib of compiled.libs) {\n const file = path.resolve(libOutput, lib.fullName.id + compiledLibSuffix);\n logger.info(` - writing ${file}`);\n fs.writeFileSync(file, lib.src);\n }\n }\n\n // writing templates\n if (compiled.templates.length > 0) {\n const tplOutput = resolveTemplatesDst(mode, \".\");\n fs.mkdirSync(tplOutput, { recursive: true });\n for (const tpl of compiled.templates) {\n const file = path.resolve(tplOutput, tpl.fullName.id + compiledTplSuffix);\n const packed = serializeTemplate(tpl.data);\n assertTemplatePackSize(\n fullNameToString(tpl.fullName),\n packed.byteLength,\n collectWasmContributions(tpl.data),\n );\n logger.info(` - writing ${file}`);\n fs.writeFileSync(file, packed);\n }\n }\n\n // writing software\n if (compiled.software.length > 0) {\n const swOutput = resolveSoftwareDst(mode, \".\");\n fs.mkdirSync(swOutput, { recursive: true });\n for (const sw of compiled.software) {\n const file = path.resolve(swOutput, sw.fullName.id + compiledSoftwareSuffix);\n logger.info(` - writing ${file}`);\n fs.writeFileSync(file, sw.src);\n }\n }\n\n // writing assets\n if (compiled.assets.length > 0) {\n const swOutput = resolveAssetsDst(mode, \".\");\n fs.mkdirSync(swOutput, { recursive: true });\n for (const sw of compiled.software) {\n const file = path.resolve(swOutput, sw.fullName.id + compiledAssetSuffix);\n logger.info(` - writing ${file}`);\n fs.writeFileSync(file, sw.src);\n }\n }\n\n // writing wasm\n if (compiled.wasm.length > 0) {\n const wasmOutput = resolveWasmDst(mode, \".\");\n fs.mkdirSync(wasmOutput, { recursive: true });\n for (const wasm of compiled.wasm) {\n const file = path.resolve(wasmOutput, wasm.fullName.id + compiledWasmSuffix);\n logger.info(` - writing ${file}`);\n // wasm.src holds base64-encoded bytes; decode back to raw bytes on disk\n fs.writeFileSync(file, Buffer.from(wasm.src, \"base64\"));\n }\n }\n}\n"],"mappings":"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"}
|
package/dist/compiler/main.js
CHANGED
|
@@ -425,6 +425,6 @@ function savePacks(logger, compiled, mode) {
|
|
|
425
425
|
}
|
|
426
426
|
}
|
|
427
427
|
//#endregion
|
|
428
|
-
export { compile, getPackageInfo, newCompiler, parseSources, savePacks };
|
|
428
|
+
export { compile, fullNameFromFileName, getPackageInfo, newCompiler, parseSources, resolvePackageJsonRoot, savePacks };
|
|
429
429
|
|
|
430
430
|
//# sourceMappingURL=main.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","names":[],"sources":["../../src/compiler/main.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as path from \"node:path\";\nimport * as fs from \"node:fs\";\nimport * as zlib from \"node:zlib\";\nimport { pathType } from \"./util\";\nimport type { TemplatesAndLibs } from \"./compiler\";\nimport { TengoTemplateCompiler } from \"./compiler\";\nimport { getSha256 } from \"./source\";\nimport type { CompileMode, FullArtifactName } from \"./package\";\nimport { fullNameToString, typedArtifactNameToString } from \"./package\";\nimport { ArtifactSource, parseSourceFile } from \"./source\";\nimport { newTemplateFromContent, templateToSource } from \"./template\";\nimport type winston from \"winston\";\nimport { tryResolve, tryResolveOrError } from \"@milaboratories/resolve-helper\";\nimport { serializeTemplate } from \"@milaboratories/pl-model-backend\";\nimport {\n assertTemplatePackSize,\n assertWasmFileSize,\n collectWasmContributions,\n} from \"./pack_limits\";\n\n// Convention: wasm component packages declare their wasm under a \"wasm\" condition\n// in package.json `exports`. Subpath \".\" maps to the tengo id \"main\"; subpath\n// \"./foo\" maps to id \"foo\". Other shapes of `exports` (string-valued, condition-only)\n// don't produce wasm artifacts.\nconst wasmExportCondition = \"wasm\";\nconst defaultWasmExportId = \"main\";\n\ninterface PackageId {\n /** Package name from package.json */\n readonly name: string;\n /** Package version from package.json */\n readonly version: string;\n}\n\ninterface PackageInfo extends PackageId {\n /** Package type from package.json */\n readonly type: string | undefined;\n /** Path to package root */\n readonly root: string;\n /** Context of package info */\n readonly context: PackageInfoContext;\n /** Dependencies */\n readonly dependencies: PackageInfo[];\n}\n\ninterface PackageJson {\n name: string;\n version: string;\n type: string | undefined;\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n}\n\nconst compiledTplSuffix = \".plj.gz\";\nconst compiledLibSuffix = \".lib.tengo\";\nconst compiledSoftwareSuffix = \".sw.json\";\nconst compiledAssetSuffix = \".as.json\";\nconst compiledWasmSuffix = \".wasm\";\n\n// We need to keep track of dependencies for correct tgo-test CLI utility configuraiton.\n// It is much simpler to do this here, than duplicate all tle logic regarding dependencies\n// in go code.\nconst srcTestSuffix = \".test.tengo\";\n\nconst srcTplSuffix = \".tpl.tengo\";\nconst srcLibSuffix = \".lib.tengo\";\nconst srcSoftwareSuffix = \".sw.json\";\nconst srcAssetSuffix = \".as.json\";\nconst compilableSuffixes = [srcLibSuffix, srcTplSuffix, srcSoftwareSuffix, srcAssetSuffix];\n\n/**\n * Resolves path to package.json file of the given dependency package.\n */\nfunction resolvePackageJsonPackage(root: string, depPackageName: string): string | undefined {\n if (!path.isAbsolute(root)) {\n throw new Error(`Root path must be absolute: ${root}`);\n }\n\n // First approach: resolving package's main entry point and try to find package.json\n // in dir tree upwards.\n let resolved = tryResolve(root, depPackageName);\n if (resolved) {\n let depth = 0;\n do {\n const p = path.join(resolved, \"package.json\");\n if (pathType(p) === \"file\") return p;\n depth++;\n resolved = path.dirname(resolved);\n } while (depth < 7 && path.basename(resolved) !== \"node_modules\");\n }\n\n // Second approach: trying to find package.json in the package dir.\n const resolved2 = tryResolveOrError(root, `${depPackageName}/package.json`);\n if (resolved2.result !== undefined) {\n return resolved2.result;\n }\n\n // Third approach: some packages (wasm-only components) don't expose any\n // import-resolvable entry point — neither a default export nor `./package.json`.\n // pnpm still installs them at <root>/node_modules/<depPackageName>/, so walk\n // the parent chain and check that path directly.\n if (resolved2.err === \"ERR_PACKAGE_PATH_NOT_EXPORTED\") {\n const fromNodeModules = findInNodeModules(root, depPackageName);\n if (fromNodeModules !== undefined) return fromNodeModules;\n // tolerating not-exported package.json for dev dependencies even if no\n // physical node_modules copy is found.\n return undefined;\n }\n throw new Error(\n `Can't resolve package.json for package ${depPackageName ?? \".\"} relative to ${root}`,\n );\n}\n\nfunction findInNodeModules(root: string, depPackageName: string): string | undefined {\n const candidate = path.join(root, \"node_modules\", depPackageName, \"package.json\");\n if (pathType(candidate) === \"file\") return candidate;\n const parent = path.dirname(root);\n if (parent === root) return undefined;\n return findInNodeModules(parent, depPackageName);\n}\n\nexport function resolvePackageJsonRoot(root: string): string {\n if (!path.isAbsolute(root)) {\n throw new Error(`Root path must be absolute: ${root}`);\n }\n\n const p = path.join(root, \"package.json\");\n if (pathType(p) === \"file\") return p;\n throw new Error(`Can't resolve package.json in ${root}`);\n}\n\ntype PackageInfoContext = \"root\" | \"dependency\" | \"devDependency\";\n\n/**\n * Get package info from package.json and all dependencies.\n */\nexport function getPackageInfo(\n root: string,\n logger: winston.Logger,\n context: PackageInfoContext = \"root\",\n): PackageInfo {\n const packageJsonPath = resolvePackageJsonRoot(root);\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath).toString()) as PackageJson;\n\n // resolving dependencies\n const depInfos: PackageInfo[] = [];\n\n if (packageJson.dependencies && context !== \"devDependency\") {\n for (const dep of Object.keys(packageJson.dependencies)) {\n const depPackageJson = resolvePackageJsonPackage(root, dep);\n if (depPackageJson === undefined)\n throw new Error(`Can't resolve package.json for dependency ${dep} of ${root}`);\n const depRoot = path.dirname(depPackageJson);\n depInfos.push(getPackageInfo(depRoot, logger, \"dependency\"));\n }\n }\n\n if (packageJson.devDependencies && context === \"root\") {\n for (const dep of Object.keys(packageJson.devDependencies)) {\n const depPackageJson = resolvePackageJsonPackage(root, dep);\n if (depPackageJson === undefined) {\n logger.warn(`Can't resolve package.json for dev dependency ${dep} of ${root}`);\n // tolerating not-exported package.json for dev dependencies\n continue;\n }\n const depRoot = path.dirname(depPackageJson);\n depInfos.push(getPackageInfo(depRoot, logger, \"devDependency\"));\n }\n }\n\n return {\n name: packageJson.name,\n version: packageJson.version,\n type: packageJson.type,\n dependencies: depInfos,\n root,\n context,\n };\n}\n\nfunction resolveLibsDst(mode: CompileMode, root: string) {\n return path.resolve(root, mode, \"tengo\", \"lib\");\n}\n\nfunction resolveTemplatesDst(mode: CompileMode, root: string) {\n return path.resolve(root, mode, \"tengo\", \"tpl\");\n}\n\nfunction resolveSoftwareDst(mode: CompileMode, root: string) {\n return path.resolve(root, mode, \"tengo\", \"software\");\n}\n\nfunction resolveAssetsDst(mode: CompileMode, root: string) {\n return path.resolve(root, mode, \"tengo\", \"asset\");\n}\n\nfunction resolveWasmDst(mode: CompileMode, root: string) {\n return path.resolve(root, mode, \"tengo\", \"wasm\");\n}\n\nfunction loadDependencies(\n logger: winston.Logger,\n compiler: TengoTemplateCompiler,\n packageInfo: PackageInfo,\n): void {\n for (const dep of packageInfo.dependencies) loadDependencies(logger, compiler, dep);\n\n if (packageInfo.context === \"root\")\n // we are not reading compiled files for root package\n return;\n\n // we are in package folder\n const libDistFolder = resolveLibsDst(\"dist\", packageInfo.root);\n const tplDistFolder = resolveTemplatesDst(\"dist\", packageInfo.root);\n const softwareDistFolder = resolveSoftwareDst(\"dist\", packageInfo.root);\n const assetDistFolder = resolveAssetsDst(\"dist\", packageInfo.root);\n const wasmDistFolder = resolveWasmDst(\"dist\", packageInfo.root);\n\n const libDistExists = pathType(libDistFolder) === \"dir\";\n const tplDistExists = pathType(tplDistFolder) === \"dir\";\n const softwareDistExists = pathType(softwareDistFolder) === \"dir\";\n const assetDistExists = pathType(assetDistFolder) === \"dir\";\n const wasmDistExists = pathType(wasmDistFolder) === \"dir\";\n const wasmExports = collectWasmExportPaths(packageInfo.root);\n\n if (\n !libDistExists &&\n !tplDistExists &&\n !softwareDistExists &&\n !assetDistExists &&\n !wasmDistExists &&\n wasmExports.length === 0\n )\n // if neither of tengo-specific folders detected, skipping package\n return;\n\n const packageId = { name: packageInfo.name, version: packageInfo.version };\n\n if (libDistExists) {\n loadLibsFromDir(logger, packageId, \"dist\", libDistFolder, compiler);\n }\n\n if (tplDistExists) {\n loadTemplatesFromDir(logger, packageId, \"dist\", tplDistFolder, compiler);\n }\n\n if (softwareDistExists) {\n loadSoftwareFromDir(logger, packageId, \"dist\", softwareDistFolder, compiler);\n }\n\n if (assetDistExists) {\n loadAssetsFromDir(logger, packageId, \"dist\", assetDistFolder, compiler);\n }\n\n if (wasmDistExists) {\n loadWasmFromDir(logger, packageId, \"dist\", wasmDistFolder, compiler);\n }\n\n for (const wasmExport of wasmExports) {\n loadWasmFromExport(logger, packageId, \"dist\", packageInfo.root, wasmExport, compiler);\n }\n}\n\nfunction loadLibsFromDir(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n folder: string,\n compiler: TengoTemplateCompiler,\n) {\n for (const f of fs.readdirSync(folder)) {\n const file = path.resolve(folder, f);\n if (!f.endsWith(compiledLibSuffix)) throw new Error(`unexpected file in 'lib' folder: ${file}`);\n const fullName: FullArtifactName = {\n type: \"library\",\n pkg: packageId.name,\n id: f.slice(0, f.length - compiledLibSuffix.length),\n version: packageId.version,\n };\n const src = parseSourceFile(logger, mode, file, fullName, true);\n compiler.addLib(src);\n logger.debug(`Adding dependency ${fullNameToString(fullName)} from ${file}`);\n if (src.dependencies.length > 0) {\n logger.debug(\"Dependencies:\");\n for (const dep of src.dependencies) logger.debug(` - ${typedArtifactNameToString(dep)}`);\n }\n }\n}\n\nfunction loadTemplatesFromDir(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n folder: string,\n compiler: TengoTemplateCompiler,\n) {\n // adding templates\n for (const f of fs.readdirSync(folder)) {\n const file = path.resolve(folder, f);\n if (!f.endsWith(compiledTplSuffix)) throw new Error(`unexpected file in 'tpl' folder: ${file}`);\n const fullName: FullArtifactName = {\n type: \"template\",\n pkg: packageId.name,\n id: f.slice(0, f.length - compiledTplSuffix.length),\n version: packageId.version,\n };\n const tpl = newTemplateFromContent(mode, fullName, fs.readFileSync(file));\n compiler.addTemplate(templateToSource(tpl));\n logger.debug(`Adding dependency ${fullNameToString(fullName)} from ${file}`);\n }\n}\n\nfunction loadSoftwareFromDir(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n folder: string,\n compiler: TengoTemplateCompiler,\n) {\n for (const f of fs.readdirSync(folder)) {\n const file = path.resolve(folder, f);\n if (!f.endsWith(compiledSoftwareSuffix))\n throw new Error(`unexpected file in 'software' folder: ${file}`);\n const fullName: FullArtifactName = {\n type: \"software\",\n pkg: packageId.name,\n id: f.slice(0, f.length - compiledSoftwareSuffix.length),\n version: packageId.version,\n };\n\n const source = fs.readFileSync(file).toString();\n\n const software = new ArtifactSource(mode, fullName, getSha256(source), source, file, [], []);\n\n logger.debug(`Adding dependency ${fullNameToString(fullName)} from ${file}`);\n compiler.addSoftware(software);\n }\n}\n\nfunction loadAssetsFromDir(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n folder: string,\n compiler: TengoTemplateCompiler,\n) {\n for (const f of fs.readdirSync(folder)) {\n const file = path.resolve(folder, f);\n if (!f.endsWith(compiledAssetSuffix))\n throw new Error(`unexpected file in 'asset' folder: ${file}`);\n const fullName: FullArtifactName = {\n type: \"asset\",\n pkg: packageId.name,\n id: f.slice(0, f.length - compiledAssetSuffix.length),\n version: packageId.version,\n };\n\n const source = fs.readFileSync(file).toString();\n\n const asset = new ArtifactSource(mode, fullName, getSha256(source), source, file, [], []);\n\n logger.debug(`Adding dependency ${fullNameToString(fullName)} from ${file}`);\n compiler.addAsset(asset);\n }\n}\n\nfunction loadWasmFromDir(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n folder: string,\n compiler: TengoTemplateCompiler,\n) {\n for (const f of fs.readdirSync(folder)) {\n const file = path.resolve(folder, f);\n if (!f.endsWith(compiledWasmSuffix))\n throw new Error(`unexpected file in 'wasm' folder: ${file}`);\n const fullName: FullArtifactName = {\n type: \"wasm\",\n pkg: packageId.name,\n id: f.slice(0, f.length - compiledWasmSuffix.length),\n version: packageId.version,\n };\n\n addWasmFile(logger, mode, file, fullName, compiler);\n }\n}\n\ninterface WasmExport {\n id: string;\n /** wasm file path, relative to the package root */\n relPath: string;\n}\n\nfunction loadWasmFromExport(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n packageRoot: string,\n wasmExport: WasmExport,\n compiler: TengoTemplateCompiler,\n) {\n const file = path.resolve(packageRoot, wasmExport.relPath);\n if (pathType(file) !== \"file\") {\n throw new Error(\n `wasm export \"${wasmExport.id}\" points to missing file: ${file} (package ${packageId.name})`,\n );\n }\n const fullName: FullArtifactName = {\n type: \"wasm\",\n pkg: packageId.name,\n id: wasmExport.id,\n version: packageId.version,\n };\n\n addWasmFile(logger, mode, file, fullName, compiler);\n}\n\nfunction addWasmFile(\n logger: winston.Logger,\n mode: CompileMode,\n file: string,\n fullName: FullArtifactName,\n compiler: TengoTemplateCompiler,\n) {\n // wasm bytes are binary, but hashToSource carries strings only. The file is\n // gzipped first (level 9 — block builds run rarely, so paying the slow-but-\n // tight setting is fine) and then base64-encoded. The backend's wasm package\n // sniffs the gzip header at PrecompileComponent time and gunzips before\n // handing the bytes to wasmtime. Compressing here shrinks both the per-WASM\n // resource footprint (a real wasm component compresses to ~30-40 % of its\n // raw size) and the on-wire pack, which lets pframes-rs grow past the\n // 3 MiB raw-size ceiling without hitting the backend's value-resource cap.\n const raw = fs.readFileSync(file);\n const compressed = zlib.gzipSync(raw, { level: zlib.constants.Z_BEST_COMPRESSION });\n assertWasmFileSize(file, compressed.length, fullName);\n const source = compressed.toString(\"base64\");\n const wasm = new ArtifactSource(mode, fullName, getSha256(source), source, file, [], []);\n\n logger.debug(\n `Adding dependency ${fullNameToString(fullName)} from ${file} ` +\n `(${raw.length} B raw → ${compressed.length} B gzipped)`,\n );\n compiler.addWasm(wasm);\n}\n\n/**\n * Discover wasm artifacts declared by a package's `package.json` via the\n * node `exports` conditional-exports map.\n *\n * Convention: a package that wants to ship one or more wasm components to\n * tengo-builder publishes them under a `\"wasm\"` condition keyed by an\n * `exports` subpath. The subpath becomes the wasm artifact id (`.` →\n * `main`, `./foo` → `foo`). Example shape we look for:\n *\n * {\n * \"exports\": {\n * \".\": {\n * \"wasm\": \"./dist/pframes_rs_wasip2.wasm\", // ← discovered\n * \"wit\": \"./wit/world.wit\"\n * },\n * \"./extra\": {\n * \"wasm\": \"./dist/extra.wasm\" // ← discovered as id \"extra\"\n * }\n * }\n * }\n *\n * Why raw traversal instead of Zod / a typed schema:\n * 1. `package.json#exports` is a community convention with no fixed shape\n * — any combination of strings, objects, arrays, and conditions is\n * legal node syntax. A strict schema would either reject valid\n * packages or have to admit `unknown` for half of it anyway.\n * 2. We care about exactly one condition (`wasm`) on subpath entries,\n * not the rest of the exports tree. A targeted walk reads more\n * directly than a schema that re-describes the conditional-exports\n * grammar.\n * 3. Errors here should always mean \"this package contributes no wasm\";\n * never crash the build. Every check returns `[]` or `continue`s.\n *\n * Returns the discovered wasm exports; empty when the file is missing,\n * malformed, has no `exports`, or has no subpath with a `\"wasm\"`\n * condition pointing at a string path.\n */\nfunction collectWasmExportPaths(packageRoot: string): WasmExport[] {\n const packageJsonPath = path.join(packageRoot, \"package.json\");\n if (pathType(packageJsonPath) !== \"file\") return [];\n\n let raw: unknown;\n try {\n raw = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n } catch {\n return [];\n }\n if (typeof raw !== \"object\" || raw === null) return [];\n\n const exportsField = (raw as { exports?: unknown }).exports;\n if (typeof exportsField !== \"object\" || exportsField === null) return [];\n\n const result: WasmExport[] = [];\n for (const [subpath, value] of Object.entries(exportsField as Record<string, unknown>)) {\n if (!subpath.startsWith(\".\")) continue; // skip condition-only entries\n if (typeof value !== \"object\" || value === null) continue;\n const wasmPath = (value as Record<string, unknown>)[wasmExportCondition];\n if (typeof wasmPath !== \"string\") continue;\n const id = subpath === \".\" ? defaultWasmExportId : subpath.replace(/^\\.\\/?/, \"\");\n if (!id) continue;\n result.push({ id, relPath: wasmPath });\n }\n return result;\n}\n\nexport function parseSources(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n root: string,\n subdir: string,\n): ArtifactSource[] {\n const sources: ArtifactSource[] = [];\n\n for (const f of fs.readdirSync(path.join(root, subdir))) {\n const inRootPath = path.join(subdir, f); // path to item inside given <root>\n const fullPath = path.join(root, inRootPath); // full path to item from CWD (or abs path, if <root> is abs path)\n\n if (pathType(fullPath) === \"dir\") {\n const nested = parseSources(logger, packageId, mode, root, inRootPath);\n sources.push(...nested);\n continue;\n }\n\n // Handling index.lib.tengo files: rename them to <package-name>.lib.tengo\n const artifactName =\n f === \"index.lib.tengo\" ? `${path.dirname(inRootPath)}.lib.tengo` : inRootPath;\n\n const fullName = fullNameFromFileName(packageId, artifactName.replaceAll(path.sep, \".\"));\n if (!fullName) {\n logger.info(`Skipping unknown file type: ${artifactName}`);\n continue; // skip unknown file types\n }\n\n // if (subdir != '') {\n // throw new Error(`Templates and libraries should reside only inside '${root}' dir.\n // You are free to have any file and dirs structure inside '${root}' keeping other files where you want,\n // but regarding ${compilableSuffixes.join(', ')}, the flat file structure is mandatory.`);\n // }\n\n const file = path.resolve(root, inRootPath);\n logger.debug(`Parsing ${fullNameToString(fullName)} from ${file}`);\n const newSrc = parseSourceFile(logger, mode, file, fullName, true);\n if (newSrc.dependencies.length > 0) {\n logger.debug(\"Detected dependencies:\");\n for (const dep of newSrc.dependencies) logger.debug(` - ${typedArtifactNameToString(dep)}`);\n }\n\n sources.push(newSrc);\n }\n\n return sources;\n}\n\nexport function newCompiler(\n logger: winston.Logger,\n packageInfo: PackageInfo,\n mode: CompileMode,\n): TengoTemplateCompiler {\n const compiler = new TengoTemplateCompiler(mode);\n\n // collect all data (templates, libs and software) from dependency tree\n loadDependencies(logger, compiler, packageInfo);\n\n return compiler;\n}\n\nexport function fullNameFromFileName(\n packageId: PackageId,\n artifactName: string,\n): FullArtifactName | null {\n const pkgAndVersion = { pkg: packageId.name, version: packageId.version };\n if (artifactName.endsWith(srcLibSuffix)) {\n return {\n ...pkgAndVersion,\n id: artifactName.substring(0, artifactName.length - srcLibSuffix.length),\n type: \"library\",\n };\n }\n\n if (artifactName.endsWith(srcTplSuffix)) {\n return {\n ...pkgAndVersion,\n id: artifactName.substring(0, artifactName.length - srcTplSuffix.length),\n type: \"template\",\n };\n }\n\n if (artifactName.endsWith(srcSoftwareSuffix)) {\n return {\n ...pkgAndVersion,\n id: artifactName.substring(0, artifactName.length - srcSoftwareSuffix.length),\n type: \"software\",\n };\n }\n\n if (artifactName.endsWith(srcAssetSuffix)) {\n return {\n ...pkgAndVersion,\n id: artifactName.substring(0, artifactName.length - srcAssetSuffix.length),\n type: \"asset\",\n };\n }\n\n if (artifactName.endsWith(srcTestSuffix)) {\n return {\n ...pkgAndVersion,\n id: artifactName.substring(0, artifactName.length - srcTestSuffix.length),\n type: \"test\",\n };\n }\n\n return null;\n}\n\nexport function compile(\n logger: winston.Logger,\n packageInfo: PackageInfo,\n mode: CompileMode,\n): TemplatesAndLibs {\n const compiler = newCompiler(logger, packageInfo, mode);\n const sources = parseSources(logger, packageInfo, mode, \"src\", \"\");\n\n // checking that we have something to do\n if (sources.length === 0) {\n const lookFor: string[] = [];\n for (const suffix of compilableSuffixes) {\n lookFor.push(`*${suffix}`);\n }\n\n logger.error(`Nothing to compile. Looked for ${lookFor.join(\", \")}`);\n process.exit(1);\n }\n\n // compilation\n logger.info(`Compiling '${mode}'...`);\n const compiled = compiler.compileAndAdd(sources);\n logger.debug(`Done.`);\n\n return compiled;\n}\n\nexport function savePacks(logger: winston.Logger, compiled: TemplatesAndLibs, mode: CompileMode) {\n // writing libs\n if (compiled.libs.length > 0) {\n const libOutput = resolveLibsDst(mode, \".\");\n fs.mkdirSync(libOutput, { recursive: true });\n for (const lib of compiled.libs) {\n const file = path.resolve(libOutput, lib.fullName.id + compiledLibSuffix);\n logger.info(` - writing ${file}`);\n fs.writeFileSync(file, lib.src);\n }\n }\n\n // writing templates\n if (compiled.templates.length > 0) {\n const tplOutput = resolveTemplatesDst(mode, \".\");\n fs.mkdirSync(tplOutput, { recursive: true });\n for (const tpl of compiled.templates) {\n const file = path.resolve(tplOutput, tpl.fullName.id + compiledTplSuffix);\n const packed = serializeTemplate(tpl.data);\n assertTemplatePackSize(\n fullNameToString(tpl.fullName),\n packed.byteLength,\n collectWasmContributions(tpl.data),\n );\n logger.info(` - writing ${file}`);\n fs.writeFileSync(file, packed);\n }\n }\n\n // writing software\n if (compiled.software.length > 0) {\n const swOutput = resolveSoftwareDst(mode, \".\");\n fs.mkdirSync(swOutput, { recursive: true });\n for (const sw of compiled.software) {\n const file = path.resolve(swOutput, sw.fullName.id + compiledSoftwareSuffix);\n logger.info(` - writing ${file}`);\n fs.writeFileSync(file, sw.src);\n }\n }\n\n // writing assets\n if (compiled.assets.length > 0) {\n const swOutput = resolveAssetsDst(mode, \".\");\n fs.mkdirSync(swOutput, { recursive: true });\n for (const sw of compiled.software) {\n const file = path.resolve(swOutput, sw.fullName.id + compiledAssetSuffix);\n logger.info(` - writing ${file}`);\n fs.writeFileSync(file, sw.src);\n }\n }\n\n // writing wasm\n if (compiled.wasm.length > 0) {\n const wasmOutput = resolveWasmDst(mode, \".\");\n fs.mkdirSync(wasmOutput, { recursive: true });\n for (const wasm of compiled.wasm) {\n const file = path.resolve(wasmOutput, wasm.fullName.id + compiledWasmSuffix);\n logger.info(` - writing ${file}`);\n // wasm.src holds base64-encoded bytes; decode back to raw bytes on disk\n fs.writeFileSync(file, Buffer.from(wasm.src, \"base64\"));\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"main.js","names":[],"sources":["../../src/compiler/main.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as path from \"node:path\";\nimport * as fs from \"node:fs\";\nimport * as zlib from \"node:zlib\";\nimport { pathType } from \"./util\";\nimport type { TemplatesAndLibs } from \"./compiler\";\nimport { TengoTemplateCompiler } from \"./compiler\";\nimport { getSha256 } from \"./source\";\nimport type { CompileMode, FullArtifactName } from \"./package\";\nimport { fullNameToString, typedArtifactNameToString } from \"./package\";\nimport { ArtifactSource, parseSourceFile } from \"./source\";\nimport { newTemplateFromContent, templateToSource } from \"./template\";\nimport type winston from \"winston\";\nimport { tryResolve, tryResolveOrError } from \"@milaboratories/resolve-helper\";\nimport { serializeTemplate } from \"@milaboratories/pl-model-backend\";\nimport {\n assertTemplatePackSize,\n assertWasmFileSize,\n collectWasmContributions,\n} from \"./pack_limits\";\n\n// Convention: wasm component packages declare their wasm under a \"wasm\" condition\n// in package.json `exports`. Subpath \".\" maps to the tengo id \"main\"; subpath\n// \"./foo\" maps to id \"foo\". Other shapes of `exports` (string-valued, condition-only)\n// don't produce wasm artifacts.\nconst wasmExportCondition = \"wasm\";\nconst defaultWasmExportId = \"main\";\n\ninterface PackageId {\n /** Package name from package.json */\n readonly name: string;\n /** Package version from package.json */\n readonly version: string;\n}\n\ninterface PackageInfo extends PackageId {\n /** Package type from package.json */\n readonly type: string | undefined;\n /** Path to package root */\n readonly root: string;\n /** Context of package info */\n readonly context: PackageInfoContext;\n /** Dependencies */\n readonly dependencies: PackageInfo[];\n}\n\ninterface PackageJson {\n name: string;\n version: string;\n type: string | undefined;\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n}\n\nconst compiledTplSuffix = \".plj.gz\";\nconst compiledLibSuffix = \".lib.tengo\";\nconst compiledSoftwareSuffix = \".sw.json\";\nconst compiledAssetSuffix = \".as.json\";\nconst compiledWasmSuffix = \".wasm\";\n\n// We need to keep track of dependencies for correct tgo-test CLI utility configuraiton.\n// It is much simpler to do this here, than duplicate all tle logic regarding dependencies\n// in go code.\nconst srcTestSuffix = \".test.tengo\";\n\nconst srcTplSuffix = \".tpl.tengo\";\nconst srcLibSuffix = \".lib.tengo\";\nconst srcSoftwareSuffix = \".sw.json\";\nconst srcAssetSuffix = \".as.json\";\nconst compilableSuffixes = [srcLibSuffix, srcTplSuffix, srcSoftwareSuffix, srcAssetSuffix];\n\n/**\n * Resolves path to package.json file of the given dependency package.\n */\nfunction resolvePackageJsonPackage(root: string, depPackageName: string): string | undefined {\n if (!path.isAbsolute(root)) {\n throw new Error(`Root path must be absolute: ${root}`);\n }\n\n // First approach: resolving package's main entry point and try to find package.json\n // in dir tree upwards.\n let resolved = tryResolve(root, depPackageName);\n if (resolved) {\n let depth = 0;\n do {\n const p = path.join(resolved, \"package.json\");\n if (pathType(p) === \"file\") return p;\n depth++;\n resolved = path.dirname(resolved);\n } while (depth < 7 && path.basename(resolved) !== \"node_modules\");\n }\n\n // Second approach: trying to find package.json in the package dir.\n const resolved2 = tryResolveOrError(root, `${depPackageName}/package.json`);\n if (resolved2.result !== undefined) {\n return resolved2.result;\n }\n\n // Third approach: some packages (wasm-only components) don't expose any\n // import-resolvable entry point — neither a default export nor `./package.json`.\n // pnpm still installs them at <root>/node_modules/<depPackageName>/, so walk\n // the parent chain and check that path directly.\n if (resolved2.err === \"ERR_PACKAGE_PATH_NOT_EXPORTED\") {\n const fromNodeModules = findInNodeModules(root, depPackageName);\n if (fromNodeModules !== undefined) return fromNodeModules;\n // tolerating not-exported package.json for dev dependencies even if no\n // physical node_modules copy is found.\n return undefined;\n }\n throw new Error(\n `Can't resolve package.json for package ${depPackageName ?? \".\"} relative to ${root}`,\n );\n}\n\nfunction findInNodeModules(root: string, depPackageName: string): string | undefined {\n const candidate = path.join(root, \"node_modules\", depPackageName, \"package.json\");\n if (pathType(candidate) === \"file\") return candidate;\n const parent = path.dirname(root);\n if (parent === root) return undefined;\n return findInNodeModules(parent, depPackageName);\n}\n\nexport function resolvePackageJsonRoot(root: string): string {\n if (!path.isAbsolute(root)) {\n throw new Error(`Root path must be absolute: ${root}`);\n }\n\n const p = path.join(root, \"package.json\");\n if (pathType(p) === \"file\") return p;\n throw new Error(`Can't resolve package.json in ${root}`);\n}\n\ntype PackageInfoContext = \"root\" | \"dependency\" | \"devDependency\";\n\n/**\n * Get package info from package.json and all dependencies.\n */\nexport function getPackageInfo(\n root: string,\n logger: winston.Logger,\n context: PackageInfoContext = \"root\",\n): PackageInfo {\n const packageJsonPath = resolvePackageJsonRoot(root);\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath).toString()) as PackageJson;\n\n // resolving dependencies\n const depInfos: PackageInfo[] = [];\n\n if (packageJson.dependencies && context !== \"devDependency\") {\n for (const dep of Object.keys(packageJson.dependencies)) {\n const depPackageJson = resolvePackageJsonPackage(root, dep);\n if (depPackageJson === undefined)\n throw new Error(`Can't resolve package.json for dependency ${dep} of ${root}`);\n const depRoot = path.dirname(depPackageJson);\n depInfos.push(getPackageInfo(depRoot, logger, \"dependency\"));\n }\n }\n\n if (packageJson.devDependencies && context === \"root\") {\n for (const dep of Object.keys(packageJson.devDependencies)) {\n const depPackageJson = resolvePackageJsonPackage(root, dep);\n if (depPackageJson === undefined) {\n logger.warn(`Can't resolve package.json for dev dependency ${dep} of ${root}`);\n // tolerating not-exported package.json for dev dependencies\n continue;\n }\n const depRoot = path.dirname(depPackageJson);\n depInfos.push(getPackageInfo(depRoot, logger, \"devDependency\"));\n }\n }\n\n return {\n name: packageJson.name,\n version: packageJson.version,\n type: packageJson.type,\n dependencies: depInfos,\n root,\n context,\n };\n}\n\nfunction resolveLibsDst(mode: CompileMode, root: string) {\n return path.resolve(root, mode, \"tengo\", \"lib\");\n}\n\nfunction resolveTemplatesDst(mode: CompileMode, root: string) {\n return path.resolve(root, mode, \"tengo\", \"tpl\");\n}\n\nfunction resolveSoftwareDst(mode: CompileMode, root: string) {\n return path.resolve(root, mode, \"tengo\", \"software\");\n}\n\nfunction resolveAssetsDst(mode: CompileMode, root: string) {\n return path.resolve(root, mode, \"tengo\", \"asset\");\n}\n\nfunction resolveWasmDst(mode: CompileMode, root: string) {\n return path.resolve(root, mode, \"tengo\", \"wasm\");\n}\n\nfunction loadDependencies(\n logger: winston.Logger,\n compiler: TengoTemplateCompiler,\n packageInfo: PackageInfo,\n): void {\n for (const dep of packageInfo.dependencies) loadDependencies(logger, compiler, dep);\n\n if (packageInfo.context === \"root\")\n // we are not reading compiled files for root package\n return;\n\n // we are in package folder\n const libDistFolder = resolveLibsDst(\"dist\", packageInfo.root);\n const tplDistFolder = resolveTemplatesDst(\"dist\", packageInfo.root);\n const softwareDistFolder = resolveSoftwareDst(\"dist\", packageInfo.root);\n const assetDistFolder = resolveAssetsDst(\"dist\", packageInfo.root);\n const wasmDistFolder = resolveWasmDst(\"dist\", packageInfo.root);\n\n const libDistExists = pathType(libDistFolder) === \"dir\";\n const tplDistExists = pathType(tplDistFolder) === \"dir\";\n const softwareDistExists = pathType(softwareDistFolder) === \"dir\";\n const assetDistExists = pathType(assetDistFolder) === \"dir\";\n const wasmDistExists = pathType(wasmDistFolder) === \"dir\";\n const wasmExports = collectWasmExportPaths(packageInfo.root);\n\n if (\n !libDistExists &&\n !tplDistExists &&\n !softwareDistExists &&\n !assetDistExists &&\n !wasmDistExists &&\n wasmExports.length === 0\n )\n // if neither of tengo-specific folders detected, skipping package\n return;\n\n const packageId = { name: packageInfo.name, version: packageInfo.version };\n\n if (libDistExists) {\n loadLibsFromDir(logger, packageId, \"dist\", libDistFolder, compiler);\n }\n\n if (tplDistExists) {\n loadTemplatesFromDir(logger, packageId, \"dist\", tplDistFolder, compiler);\n }\n\n if (softwareDistExists) {\n loadSoftwareFromDir(logger, packageId, \"dist\", softwareDistFolder, compiler);\n }\n\n if (assetDistExists) {\n loadAssetsFromDir(logger, packageId, \"dist\", assetDistFolder, compiler);\n }\n\n if (wasmDistExists) {\n loadWasmFromDir(logger, packageId, \"dist\", wasmDistFolder, compiler);\n }\n\n for (const wasmExport of wasmExports) {\n loadWasmFromExport(logger, packageId, \"dist\", packageInfo.root, wasmExport, compiler);\n }\n}\n\nfunction loadLibsFromDir(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n folder: string,\n compiler: TengoTemplateCompiler,\n) {\n for (const f of fs.readdirSync(folder)) {\n const file = path.resolve(folder, f);\n if (!f.endsWith(compiledLibSuffix)) throw new Error(`unexpected file in 'lib' folder: ${file}`);\n const fullName: FullArtifactName = {\n type: \"library\",\n pkg: packageId.name,\n id: f.slice(0, f.length - compiledLibSuffix.length),\n version: packageId.version,\n };\n const src = parseSourceFile(logger, mode, file, fullName, true);\n compiler.addLib(src);\n logger.debug(`Adding dependency ${fullNameToString(fullName)} from ${file}`);\n if (src.dependencies.length > 0) {\n logger.debug(\"Dependencies:\");\n for (const dep of src.dependencies) logger.debug(` - ${typedArtifactNameToString(dep)}`);\n }\n }\n}\n\nfunction loadTemplatesFromDir(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n folder: string,\n compiler: TengoTemplateCompiler,\n) {\n // adding templates\n for (const f of fs.readdirSync(folder)) {\n const file = path.resolve(folder, f);\n if (!f.endsWith(compiledTplSuffix)) throw new Error(`unexpected file in 'tpl' folder: ${file}`);\n const fullName: FullArtifactName = {\n type: \"template\",\n pkg: packageId.name,\n id: f.slice(0, f.length - compiledTplSuffix.length),\n version: packageId.version,\n };\n const tpl = newTemplateFromContent(mode, fullName, fs.readFileSync(file));\n compiler.addTemplate(templateToSource(tpl));\n logger.debug(`Adding dependency ${fullNameToString(fullName)} from ${file}`);\n }\n}\n\nfunction loadSoftwareFromDir(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n folder: string,\n compiler: TengoTemplateCompiler,\n) {\n for (const f of fs.readdirSync(folder)) {\n const file = path.resolve(folder, f);\n if (!f.endsWith(compiledSoftwareSuffix))\n throw new Error(`unexpected file in 'software' folder: ${file}`);\n const fullName: FullArtifactName = {\n type: \"software\",\n pkg: packageId.name,\n id: f.slice(0, f.length - compiledSoftwareSuffix.length),\n version: packageId.version,\n };\n\n const source = fs.readFileSync(file).toString();\n\n const software = new ArtifactSource(mode, fullName, getSha256(source), source, file, [], []);\n\n logger.debug(`Adding dependency ${fullNameToString(fullName)} from ${file}`);\n compiler.addSoftware(software);\n }\n}\n\nfunction loadAssetsFromDir(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n folder: string,\n compiler: TengoTemplateCompiler,\n) {\n for (const f of fs.readdirSync(folder)) {\n const file = path.resolve(folder, f);\n if (!f.endsWith(compiledAssetSuffix))\n throw new Error(`unexpected file in 'asset' folder: ${file}`);\n const fullName: FullArtifactName = {\n type: \"asset\",\n pkg: packageId.name,\n id: f.slice(0, f.length - compiledAssetSuffix.length),\n version: packageId.version,\n };\n\n const source = fs.readFileSync(file).toString();\n\n const asset = new ArtifactSource(mode, fullName, getSha256(source), source, file, [], []);\n\n logger.debug(`Adding dependency ${fullNameToString(fullName)} from ${file}`);\n compiler.addAsset(asset);\n }\n}\n\nfunction loadWasmFromDir(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n folder: string,\n compiler: TengoTemplateCompiler,\n) {\n for (const f of fs.readdirSync(folder)) {\n const file = path.resolve(folder, f);\n if (!f.endsWith(compiledWasmSuffix))\n throw new Error(`unexpected file in 'wasm' folder: ${file}`);\n const fullName: FullArtifactName = {\n type: \"wasm\",\n pkg: packageId.name,\n id: f.slice(0, f.length - compiledWasmSuffix.length),\n version: packageId.version,\n };\n\n addWasmFile(logger, mode, file, fullName, compiler);\n }\n}\n\ninterface WasmExport {\n id: string;\n /** wasm file path, relative to the package root */\n relPath: string;\n}\n\nfunction loadWasmFromExport(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n packageRoot: string,\n wasmExport: WasmExport,\n compiler: TengoTemplateCompiler,\n) {\n const file = path.resolve(packageRoot, wasmExport.relPath);\n if (pathType(file) !== \"file\") {\n throw new Error(\n `wasm export \"${wasmExport.id}\" points to missing file: ${file} (package ${packageId.name})`,\n );\n }\n const fullName: FullArtifactName = {\n type: \"wasm\",\n pkg: packageId.name,\n id: wasmExport.id,\n version: packageId.version,\n };\n\n addWasmFile(logger, mode, file, fullName, compiler);\n}\n\nfunction addWasmFile(\n logger: winston.Logger,\n mode: CompileMode,\n file: string,\n fullName: FullArtifactName,\n compiler: TengoTemplateCompiler,\n) {\n // wasm bytes are binary, but hashToSource carries strings only. The file is\n // gzipped first (level 9 — block builds run rarely, so paying the slow-but-\n // tight setting is fine) and then base64-encoded. The backend's wasm package\n // sniffs the gzip header at PrecompileComponent time and gunzips before\n // handing the bytes to wasmtime. Compressing here shrinks both the per-WASM\n // resource footprint (a real wasm component compresses to ~30-40 % of its\n // raw size) and the on-wire pack, which lets pframes-rs grow past the\n // 3 MiB raw-size ceiling without hitting the backend's value-resource cap.\n const raw = fs.readFileSync(file);\n const compressed = zlib.gzipSync(raw, { level: zlib.constants.Z_BEST_COMPRESSION });\n assertWasmFileSize(file, compressed.length, fullName);\n const source = compressed.toString(\"base64\");\n const wasm = new ArtifactSource(mode, fullName, getSha256(source), source, file, [], []);\n\n logger.debug(\n `Adding dependency ${fullNameToString(fullName)} from ${file} ` +\n `(${raw.length} B raw → ${compressed.length} B gzipped)`,\n );\n compiler.addWasm(wasm);\n}\n\n/**\n * Discover wasm artifacts declared by a package's `package.json` via the\n * node `exports` conditional-exports map.\n *\n * Convention: a package that wants to ship one or more wasm components to\n * tengo-builder publishes them under a `\"wasm\"` condition keyed by an\n * `exports` subpath. The subpath becomes the wasm artifact id (`.` →\n * `main`, `./foo` → `foo`). Example shape we look for:\n *\n * {\n * \"exports\": {\n * \".\": {\n * \"wasm\": \"./dist/pframes_rs_wasip2.wasm\", // ← discovered\n * \"wit\": \"./wit/world.wit\"\n * },\n * \"./extra\": {\n * \"wasm\": \"./dist/extra.wasm\" // ← discovered as id \"extra\"\n * }\n * }\n * }\n *\n * Why raw traversal instead of Zod / a typed schema:\n * 1. `package.json#exports` is a community convention with no fixed shape\n * — any combination of strings, objects, arrays, and conditions is\n * legal node syntax. A strict schema would either reject valid\n * packages or have to admit `unknown` for half of it anyway.\n * 2. We care about exactly one condition (`wasm`) on subpath entries,\n * not the rest of the exports tree. A targeted walk reads more\n * directly than a schema that re-describes the conditional-exports\n * grammar.\n * 3. Errors here should always mean \"this package contributes no wasm\";\n * never crash the build. Every check returns `[]` or `continue`s.\n *\n * Returns the discovered wasm exports; empty when the file is missing,\n * malformed, has no `exports`, or has no subpath with a `\"wasm\"`\n * condition pointing at a string path.\n */\nfunction collectWasmExportPaths(packageRoot: string): WasmExport[] {\n const packageJsonPath = path.join(packageRoot, \"package.json\");\n if (pathType(packageJsonPath) !== \"file\") return [];\n\n let raw: unknown;\n try {\n raw = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n } catch {\n return [];\n }\n if (typeof raw !== \"object\" || raw === null) return [];\n\n const exportsField = (raw as { exports?: unknown }).exports;\n if (typeof exportsField !== \"object\" || exportsField === null) return [];\n\n const result: WasmExport[] = [];\n for (const [subpath, value] of Object.entries(exportsField as Record<string, unknown>)) {\n if (!subpath.startsWith(\".\")) continue; // skip condition-only entries\n if (typeof value !== \"object\" || value === null) continue;\n const wasmPath = (value as Record<string, unknown>)[wasmExportCondition];\n if (typeof wasmPath !== \"string\") continue;\n const id = subpath === \".\" ? defaultWasmExportId : subpath.replace(/^\\.\\/?/, \"\");\n if (!id) continue;\n result.push({ id, relPath: wasmPath });\n }\n return result;\n}\n\nexport function parseSources(\n logger: winston.Logger,\n packageId: PackageId,\n mode: CompileMode,\n root: string,\n subdir: string,\n): ArtifactSource[] {\n const sources: ArtifactSource[] = [];\n\n for (const f of fs.readdirSync(path.join(root, subdir))) {\n const inRootPath = path.join(subdir, f); // path to item inside given <root>\n const fullPath = path.join(root, inRootPath); // full path to item from CWD (or abs path, if <root> is abs path)\n\n if (pathType(fullPath) === \"dir\") {\n const nested = parseSources(logger, packageId, mode, root, inRootPath);\n sources.push(...nested);\n continue;\n }\n\n // Handling index.lib.tengo files: rename them to <package-name>.lib.tengo\n const artifactName =\n f === \"index.lib.tengo\" ? `${path.dirname(inRootPath)}.lib.tengo` : inRootPath;\n\n const fullName = fullNameFromFileName(packageId, artifactName.replaceAll(path.sep, \".\"));\n if (!fullName) {\n logger.info(`Skipping unknown file type: ${artifactName}`);\n continue; // skip unknown file types\n }\n\n // if (subdir != '') {\n // throw new Error(`Templates and libraries should reside only inside '${root}' dir.\n // You are free to have any file and dirs structure inside '${root}' keeping other files where you want,\n // but regarding ${compilableSuffixes.join(', ')}, the flat file structure is mandatory.`);\n // }\n\n const file = path.resolve(root, inRootPath);\n logger.debug(`Parsing ${fullNameToString(fullName)} from ${file}`);\n const newSrc = parseSourceFile(logger, mode, file, fullName, true);\n if (newSrc.dependencies.length > 0) {\n logger.debug(\"Detected dependencies:\");\n for (const dep of newSrc.dependencies) logger.debug(` - ${typedArtifactNameToString(dep)}`);\n }\n\n sources.push(newSrc);\n }\n\n return sources;\n}\n\nexport function newCompiler(\n logger: winston.Logger,\n packageInfo: PackageInfo,\n mode: CompileMode,\n): TengoTemplateCompiler {\n const compiler = new TengoTemplateCompiler(mode);\n\n // collect all data (templates, libs and software) from dependency tree\n loadDependencies(logger, compiler, packageInfo);\n\n return compiler;\n}\n\nexport function fullNameFromFileName(\n packageId: PackageId,\n artifactName: string,\n): FullArtifactName | null {\n const pkgAndVersion = { pkg: packageId.name, version: packageId.version };\n if (artifactName.endsWith(srcLibSuffix)) {\n return {\n ...pkgAndVersion,\n id: artifactName.substring(0, artifactName.length - srcLibSuffix.length),\n type: \"library\",\n };\n }\n\n if (artifactName.endsWith(srcTplSuffix)) {\n return {\n ...pkgAndVersion,\n id: artifactName.substring(0, artifactName.length - srcTplSuffix.length),\n type: \"template\",\n };\n }\n\n if (artifactName.endsWith(srcSoftwareSuffix)) {\n return {\n ...pkgAndVersion,\n id: artifactName.substring(0, artifactName.length - srcSoftwareSuffix.length),\n type: \"software\",\n };\n }\n\n if (artifactName.endsWith(srcAssetSuffix)) {\n return {\n ...pkgAndVersion,\n id: artifactName.substring(0, artifactName.length - srcAssetSuffix.length),\n type: \"asset\",\n };\n }\n\n if (artifactName.endsWith(srcTestSuffix)) {\n return {\n ...pkgAndVersion,\n id: artifactName.substring(0, artifactName.length - srcTestSuffix.length),\n type: \"test\",\n };\n }\n\n return null;\n}\n\nexport function compile(\n logger: winston.Logger,\n packageInfo: PackageInfo,\n mode: CompileMode,\n): TemplatesAndLibs {\n const compiler = newCompiler(logger, packageInfo, mode);\n const sources = parseSources(logger, packageInfo, mode, \"src\", \"\");\n\n // checking that we have something to do\n if (sources.length === 0) {\n const lookFor: string[] = [];\n for (const suffix of compilableSuffixes) {\n lookFor.push(`*${suffix}`);\n }\n\n logger.error(`Nothing to compile. Looked for ${lookFor.join(\", \")}`);\n process.exit(1);\n }\n\n // compilation\n logger.info(`Compiling '${mode}'...`);\n const compiled = compiler.compileAndAdd(sources);\n logger.debug(`Done.`);\n\n return compiled;\n}\n\nexport function savePacks(logger: winston.Logger, compiled: TemplatesAndLibs, mode: CompileMode) {\n // writing libs\n if (compiled.libs.length > 0) {\n const libOutput = resolveLibsDst(mode, \".\");\n fs.mkdirSync(libOutput, { recursive: true });\n for (const lib of compiled.libs) {\n const file = path.resolve(libOutput, lib.fullName.id + compiledLibSuffix);\n logger.info(` - writing ${file}`);\n fs.writeFileSync(file, lib.src);\n }\n }\n\n // writing templates\n if (compiled.templates.length > 0) {\n const tplOutput = resolveTemplatesDst(mode, \".\");\n fs.mkdirSync(tplOutput, { recursive: true });\n for (const tpl of compiled.templates) {\n const file = path.resolve(tplOutput, tpl.fullName.id + compiledTplSuffix);\n const packed = serializeTemplate(tpl.data);\n assertTemplatePackSize(\n fullNameToString(tpl.fullName),\n packed.byteLength,\n collectWasmContributions(tpl.data),\n );\n logger.info(` - writing ${file}`);\n fs.writeFileSync(file, packed);\n }\n }\n\n // writing software\n if (compiled.software.length > 0) {\n const swOutput = resolveSoftwareDst(mode, \".\");\n fs.mkdirSync(swOutput, { recursive: true });\n for (const sw of compiled.software) {\n const file = path.resolve(swOutput, sw.fullName.id + compiledSoftwareSuffix);\n logger.info(` - writing ${file}`);\n fs.writeFileSync(file, sw.src);\n }\n }\n\n // writing assets\n if (compiled.assets.length > 0) {\n const swOutput = resolveAssetsDst(mode, \".\");\n fs.mkdirSync(swOutput, { recursive: true });\n for (const sw of compiled.software) {\n const file = path.resolve(swOutput, sw.fullName.id + compiledAssetSuffix);\n logger.info(` - writing ${file}`);\n fs.writeFileSync(file, sw.src);\n }\n }\n\n // writing wasm\n if (compiled.wasm.length > 0) {\n const wasmOutput = resolveWasmDst(mode, \".\");\n fs.mkdirSync(wasmOutput, { recursive: true });\n for (const wasm of compiled.wasm) {\n const file = path.resolve(wasmOutput, wasm.fullName.id + compiledWasmSuffix);\n logger.info(` - writing ${file}`);\n // wasm.src holds base64-encoded bytes; decode back to raw bytes on disk\n fs.writeFileSync(file, Buffer.from(wasm.src, \"base64\"));\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -42,6 +42,8 @@ function assertTemplatePackSize(templateName, gzippedByteLength, wasmContributio
|
|
|
42
42
|
throw new Error(`Template pack ${templateName} is ${formatBytes(gzippedByteLength)} gzipped, which exceeds tengo-builder's ${formatBytes(MAX_TEMPLATE_PACK_BYTES_GZIPPED)} per-pack cap. The backend caps gzipped packs at 3.5 MiB (see TemplatePackSizeLimit in pl: controllers/workflow/pkg/cfg/config.go).` + breakdown + "\nShrink WASM artefacts (wasm-opt -Oz), or split this template into smaller pieces.");
|
|
43
43
|
}
|
|
44
44
|
//#endregion
|
|
45
|
+
exports.MAX_TEMPLATE_PACK_BYTES_GZIPPED = MAX_TEMPLATE_PACK_BYTES_GZIPPED;
|
|
46
|
+
exports.MAX_WASM_FILE_BYTES = MAX_WASM_FILE_BYTES;
|
|
45
47
|
exports.assertTemplatePackSize = assertTemplatePackSize;
|
|
46
48
|
exports.assertWasmFileSize = assertWasmFileSize;
|
|
47
49
|
exports.collectWasmContributions = collectWasmContributions;
|