@highstate/cli 0.9.16 → 0.9.18
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/chunk-CMECLVT7.js +11 -0
- package/dist/chunk-CMECLVT7.js.map +1 -0
- package/dist/highstate.manifest.json +1 -1
- package/dist/{library-loader-CGEPTS4L.js → library-loader-ZABUULFB.js} +28 -23
- package/dist/library-loader-ZABUULFB.js.map +1 -0
- package/dist/main.js +189 -88
- package/dist/main.js.map +1 -1
- package/package.json +7 -10
- package/src/commands/build.ts +1 -0
- package/src/shared/library-loader.ts +30 -14
- package/src/shared/schema-transformer.spec.ts +280 -0
- package/src/shared/schema-transformer.ts +225 -14
- package/src/shared/source-hash-calculator.ts +1 -1
- package/src/shared/utils.ts +6 -0
- package/dist/library-loader-CGEPTS4L.js.map +0 -1
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/main.ts","../package.json","../src/commands/designer.ts","../src/shared/logger.ts","../src/shared/services.ts","../src/shared/schema-transformer.ts","../src/shared/source-hash-calculator.ts","../src/shared/schemas.ts","../src/shared/bin-transformer.ts","../src/commands/build.ts","../src/commands/backend/identity.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Builtins, Cli } from \"clipanion\"\nimport { version } from \"../package.json\"\nimport { DesignerCommand } from \"./commands/designer\"\nimport { BuildCommand } from \"./commands/build\"\nimport { BackendIdentityCommand } from \"./commands/backend/identity\"\n\nconst cli = new Cli({\n binaryName: \"highstate\",\n binaryLabel: \"Highstate\",\n binaryVersion: version,\n})\n\ncli.register(BuildCommand)\ncli.register(DesignerCommand)\ncli.register(BackendIdentityCommand)\ncli.register(Builtins.HelpCommand)\ncli.register(Builtins.VersionCommand)\n\nawait cli.runExit(process.argv.slice(2))\n","{\n \"name\": \"@highstate/cli\",\n \"version\": \"0.9.15\",\n \"description\": \"The CLI for the Highstate project.\",\n \"type\": \"module\",\n \"files\": [\n \"assets\",\n \"dist\",\n \"src\"\n ],\n \"bin\": {\n \"highstate\": \"./dist/main.js\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"highstate build\",\n \"test\": \"vitest run\"\n },\n \"dependencies\": {\n \"@aws-crypto/crc32\": \"^5.2.0\",\n \"@highstate/backend\": \"workspace:^0.9.15\",\n \"@highstate/contract\": \"workspace:^\",\n \"@msgpack/msgpack\": \"^3.1.2\",\n \"age-encryption\": \"^0.2.4\",\n \"ajv\": \"^8.17.1\",\n \"clipanion\": \"^4.0.0-rc.4\",\n \"consola\": \"^3.4.0\",\n \"crypto-hash\": \"^3.1.0\",\n \"get-port-please\": \"^3.1.2\",\n \"import-meta-resolve\": \"^4.1.0\",\n \"magic-string\": \"^0.30.17\",\n \"nypm\": \"^0.6.0\",\n \"oxc-parser\": \"^0.63.0\",\n \"oxc-walker\": \"^0.2.4\",\n \"pino\": \"^9.6.0\",\n \"pkg-types\": \"^1.2.1\",\n \"remeda\": \"^2.21.2\",\n \"tsup\": \"^8.4.0\",\n \"zod\": \"^4.0.5\"\n },\n \"peerDependencies\": {\n \"@pulumi/pulumi\": \"^3.163.0\",\n \"classic-level\": \"^2.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@pulumi/pulumi\": {\n \"optional\": true\n },\n \"classic-level\": {\n \"optional\": true\n }\n },\n \"devDependencies\": {\n \"highstate-cli-bootstrap\": \"npm:@highstate/cli@0.7.6\",\n \"vitest\": \"^2.1.8\"\n }\n}\n","import { Command, UsageError } from \"clipanion\"\nimport { readPackageJSON } from \"pkg-types\"\nimport { addDevDependency } from \"nypm\"\nimport { consola } from \"consola\"\nimport { colorize } from \"consola/utils\"\nimport { getPort } from \"get-port-please\"\nimport { getBackendServices, logger } from \"../shared\"\n\nexport class DesignerCommand extends Command {\n static paths = [[\"designer\"]]\n\n static usage = Command.Usage({\n category: \"Designer\",\n description: \"Starts the Highstate designer in the current project.\",\n })\n\n async execute(): Promise<void> {\n const packageJson = await readPackageJSON()\n if (!packageJson.devDependencies?.[\"@highstate/cli\"]) {\n throw new UsageError(\n \"This project is not a Highstate project.\\n@highstate/cli must be installed as a devDependency.\",\n )\n }\n\n if (!packageJson.devDependencies?.[\"@highstate/designer\"]) {\n logger.info(\"Installing @highstate/designer...\")\n\n await addDevDependency([\"@highstate/designer\", \"classic-level\"])\n }\n\n logger.info(\"starting highstate designer...\")\n\n await getBackendServices()\n\n const oldConsoleLog = console.log\n\n const port = await getPort()\n\n process.env.NITRO_PORT = port.toString()\n process.env.NITRO_HOST = \"0.0.0.0\"\n\n await new Promise<void>(resolve => {\n console.log = (message: string) => {\n if (message.startsWith(\"Listening on\")) {\n resolve()\n }\n }\n\n const path = \"@highstate/designer/.output/server/index.mjs\"\n void import(path)\n })\n\n console.log = oldConsoleLog\n\n consola.log(\n [\n \"\\n \",\n colorize(\"bold\", colorize(\"cyanBright\", \"Highstate Designer\")),\n \"\\n \",\n colorize(\"greenBright\", \"➜ Local: \"),\n colorize(\"underline\", colorize(\"cyanBright\", `http://localhost:${port}`)),\n \"\\n\",\n ].join(\"\"),\n )\n\n process.on(\"SIGINT\", () => {\n process.stdout.write(\"\\r\")\n consola.info(\"shutting down highstate designer...\")\n\n setTimeout(() => process.exit(0), 1000)\n })\n }\n}\n","import { PassThrough } from \"node:stream\"\nimport pino, { levels } from \"pino\"\nimport { consola, LogLevels } from \"consola\"\n\nexport const logger = pino(\n {\n name: \"highstate-cli\",\n level: process.env.LOG_LEVEL ?? \"info\",\n },\n createConsolaStream(),\n)\n\nconsola.level = LogLevels[(process.env.LOG_LEVEL as keyof typeof LogLevels) ?? \"info\"]\n\nfunction createConsolaStream() {\n const stream = new PassThrough()\n\n stream.on(\"data\", data => {\n const { level, msg, error } = JSON.parse(String(data)) as {\n msg: string\n level: number\n error?: unknown\n }\n\n const levelLabel = levels.labels[level]\n\n switch (levelLabel) {\n case \"info\":\n consola.info(msg)\n break\n case \"warn\":\n consola.warn(msg)\n break\n case \"error\":\n if (error) {\n consola.error(msg, error)\n } else {\n consola.error(msg)\n }\n break\n case \"debug\":\n consola.debug(msg)\n break\n case \"fatal\":\n consola.fatal(msg)\n break\n case \"trace\":\n consola.trace(msg)\n break\n }\n })\n\n return stream\n}\n","import type { Services } from \"@highstate/backend\"\nimport { logger } from \"./logger\"\n\nlet services: Promise<Services> | undefined\n\nexport function getBackendServices() {\n if (services) {\n return services\n }\n\n services = import(\"@highstate/backend\").then(({ getSharedServices }) => {\n return getSharedServices({\n services: {\n logger: logger.child({}, { msgPrefix: \"[backend] \" }),\n },\n })\n })\n\n return services\n}\n","import type { Plugin } from \"esbuild\"\nimport { readFile } from \"node:fs/promises\"\nimport { parseAsync, type Comment } from \"oxc-parser\"\nimport { walk, type Node } from \"oxc-walker\"\nimport MagicString from \"magic-string\"\n\nexport const schemaTransformerPlugin: Plugin = {\n name: \"schema-transformer\",\n setup(build) {\n build.onLoad({ filter: /src\\/.*\\.ts$/ }, async args => {\n const content = await readFile(args.path, \"utf-8\")\n\n return {\n contents: await applySchemaTransformations(content),\n loader: \"ts\",\n }\n })\n },\n}\n\nexport async function applySchemaTransformations(content: string): Promise<string> {\n const magicString = new MagicString(content)\n const { program, comments } = await parseAsync(\"file.ts\", content)\n\n const parentStack: Node[] = []\n\n walk(program, {\n enter(node) {\n parentStack.push(node)\n\n if (node.type !== \"Property\" || node.key.type !== \"Identifier\") {\n return\n }\n\n const parentKey = getParentObjectKey(parentStack) || getMarkerFunctionName(parentStack)\n if (!parentKey || ![\"inputs\", \"outputs\", \"args\", \"secrets\"].includes(parentKey)) {\n return\n }\n\n const jsdoc = comments.find(comment => isLeadingComment(content, node, comment))\n if (!jsdoc) {\n return\n }\n\n const description = cleanJsdoc(jsdoc.value)\n const originalValue = content.substring(node.value.start, node.value.end)\n\n const entityField = [\"inputs\", \"outputs\"].includes(parentKey) ? \"entity\" : \"schema\"\n\n // Check if the value already has entity/schema structure\n const isAlreadyStructured = isStructuredValue(originalValue, entityField)\n\n if (isAlreadyStructured) {\n // For already structured values, inject description directly into the object\n const modifiedValue = injectDescriptionIntoObject(originalValue, description)\n magicString.update(node.value.start, node.value.end, modifiedValue)\n } else {\n // Transform to new structure\n magicString.update(\n node.value.start,\n node.value.end,\n `{\n ${entityField}: ${originalValue},\n meta: {\n description: \\`${description}\\`,\n },\n}`,\n )\n }\n },\n leave() {\n parentStack.pop()\n },\n })\n\n return magicString.toString()\n}\n\nfunction injectDescriptionIntoObject(objectString: string, description: string): string {\n const trimmed = objectString.trim()\n\n // Check if the object already has a meta field\n const metaRegex = /meta\\s*:\\s*\\{/\n\n if (metaRegex.test(trimmed)) {\n // Find the meta field and inject description into it\n return trimmed.replace(\n /meta\\s*:\\s*\\{/,\n `meta: {\n description: \\`${description}\\`,`,\n )\n } else {\n // Add meta field at the end of the object (before the closing brace)\n const lastBraceIndex = trimmed.lastIndexOf(\"}\")\n if (lastBraceIndex === -1) {\n // Invalid object structure, return as is\n return trimmed\n }\n\n const beforeBrace = trimmed.substring(0, lastBraceIndex)\n const afterBrace = trimmed.substring(lastBraceIndex)\n\n // Check if we need a comma before adding meta\n const needsComma = beforeBrace.trim().length > 1 && !beforeBrace.trim().endsWith(\",\")\n const comma = needsComma ? \",\" : \"\"\n\n return `${beforeBrace}${comma}\n meta: {\n description: \\`${description}\\`,\n },\n${afterBrace}`\n }\n}\n\nfunction isStructuredValue(value: string, expectedField: string): boolean {\n const trimmed = value.trim()\n if (!trimmed.startsWith(\"{\")) {\n return false\n }\n\n // Check if it contains the expected field (entity or schema) at the top level\n const fieldPattern = new RegExp(`^\\\\s*{[^}]*\\\\b${expectedField}\\\\s*:`, \"s\")\n return fieldPattern.test(trimmed)\n}\n\nfunction getMarkerFunctionName(parentStack: Node[]): string | null {\n // Look for marker functions like $args, $inputs, $outputs, $secrets\n for (let i = parentStack.length - 1; i >= 0; i--) {\n const node = parentStack[i]\n if (node.type === \"CallExpression\" && node.callee.type === \"Identifier\") {\n const functionName = node.callee.name\n if (\n functionName.startsWith(\"$\") &&\n [\"$args\", \"$inputs\", \"$outputs\", \"$secrets\"].includes(functionName)\n ) {\n return functionName.substring(1) // Remove the $ prefix\n }\n }\n }\n return null\n}\n\nfunction getParentObjectKey(parentStack: Node[]): string | null {\n // Walk up the parent stack to find the parent object property\n for (let i = parentStack.length - 2; i >= 0; i--) {\n const node = parentStack[i]\n if (node.type === \"Property\" && node.key.type === \"Identifier\") {\n return node.key.name\n }\n }\n return null\n}\n\nfunction isLeadingComment(content: string, node: Node, comment: Comment) {\n if (comment.end > node.start) {\n return false\n }\n\n const contentRange = content.substring(comment.end, node.start)\n\n return contentRange.trim().length === 0\n}\n\nfunction cleanJsdoc(str: string) {\n return (\n str\n // remove leading asterisks\n .replace(/^\\s*\\*/gm, \"\")\n\n // escape backticks and dollar signs\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/`/g, \"\\\\`\")\n .replace(/\\${/g, \"\\\\${\")\n .trim()\n )\n}\n","import type { Logger } from \"pino\"\nimport { dirname, relative, resolve } from \"node:path\"\nimport { readFile, writeFile } from \"node:fs/promises\"\nimport { fileURLToPath, pathToFileURL } from \"node:url\"\nimport { readPackageJSON, resolvePackageJSON, type PackageJson } from \"pkg-types\"\nimport { crc32 } from \"@aws-crypto/crc32\"\nimport { resolve as importMetaResolve } from \"import-meta-resolve\"\nimport { z } from \"zod\"\nimport { int32ToBytes } from \"@highstate/backend/shared\"\nimport {\n type HighstateManifest,\n type HighstateConfig,\n type SourceHashConfig,\n highstateConfigSchema,\n highstateManifestSchema,\n sourceHashConfigSchema,\n} from \"./schemas\"\n\ntype FileDependency =\n | {\n type: \"relative\"\n id: string\n fullPath: string\n }\n | {\n type: \"npm\"\n id: string\n package: string\n }\n\nexport class SourceHashCalculator {\n private readonly dependencyHashes = new Map<string, Promise<number>>()\n private readonly fileHashes = new Map<string, Promise<number>>()\n\n constructor(\n private readonly packageJsonPath: string,\n private readonly packageJson: PackageJson,\n private readonly logger: Logger,\n ) {}\n\n /**\n * Calculates CRC32 hash of a string.\n */\n private hashString(input: string): number {\n return crc32(Buffer.from(input))\n }\n\n /**\n * Gets the highstate configuration from package.json with defaults.\n */\n private getHighstateConfig(packageJson: PackageJson): HighstateConfig {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const rawConfig = packageJson.highstate\n if (!rawConfig) {\n return { type: \"source\" }\n }\n\n try {\n return highstateConfigSchema.parse(rawConfig)\n } catch (error) {\n this.logger.warn(\n { error, packageName: packageJson.name },\n \"invalid highstate configuration, using defaults\",\n )\n return { type: \"source\" }\n }\n }\n\n /**\n * Gets the effective source hash configuration with defaults for a specific output.\n */\n private getSourceHashConfig(\n highstateConfig: HighstateConfig,\n exportKey?: string,\n ): SourceHashConfig {\n if (highstateConfig.sourceHash) {\n // Try to parse as a single config first\n const singleConfigResult = sourceHashConfigSchema.safeParse(highstateConfig.sourceHash)\n if (singleConfigResult.success) {\n return singleConfigResult.data\n }\n\n // Try to parse as a record of configs\n const recordConfigResult = z\n .record(z.string(), sourceHashConfigSchema)\n .safeParse(highstateConfig.sourceHash)\n if (recordConfigResult.success && exportKey) {\n const perOutputConfig = recordConfigResult.data[exportKey]\n if (perOutputConfig) {\n return perOutputConfig\n }\n }\n }\n\n if (highstateConfig.type === \"library\") {\n return { mode: \"none\" }\n }\n\n return { mode: \"auto\" }\n }\n\n async writeHighstateManifest(\n distBasePath: string,\n distPathToExportKey: Map<string, string>,\n ): Promise<void> {\n const highstateConfig = this.getHighstateConfig(this.packageJson)\n\n const promises: Promise<{ distPath: string; hash: number }>[] = []\n\n for (const [distPath, exportKey] of distPathToExportKey) {\n const fullPath = resolve(distPath)\n const sourceHashConfig = this.getSourceHashConfig(highstateConfig, exportKey)\n\n switch (sourceHashConfig.mode) {\n case \"manual\":\n promises.push(\n Promise.resolve({\n distPath,\n hash: this.hashString(sourceHashConfig.version),\n }),\n )\n break\n case \"version\":\n promises.push(\n Promise.resolve({\n distPath,\n hash: this.hashString(this.packageJson.version ?? \"\"),\n }),\n )\n break\n case \"none\":\n promises.push(\n Promise.resolve({\n distPath,\n hash: 0,\n }),\n )\n break\n case \"auto\":\n default:\n promises.push(\n this.getFileHash(fullPath).then(hash => ({\n distPath,\n hash,\n })),\n )\n break\n }\n }\n\n const manifest: HighstateManifest = {\n sourceHashes: {},\n }\n\n const hashes = await Promise.all(promises)\n for (const { distPath, hash } of hashes) {\n manifest.sourceHashes![distPath] = hash\n }\n\n const manifestPath = resolve(distBasePath, \"highstate.manifest.json\")\n await writeFile(manifestPath, JSON.stringify(manifest, null, 2), \"utf8\")\n }\n\n private async getFileHash(fullPath: string): Promise<number> {\n const existingHash = this.fileHashes.get(fullPath)\n if (existingHash) {\n return existingHash\n }\n\n const hash = this.calculateFileHash(fullPath)\n this.fileHashes.set(fullPath, hash)\n\n return hash\n }\n\n private async calculateFileHash(fullPath: string): Promise<number> {\n const content = await readFile(fullPath, \"utf8\")\n const fileDeps = this.parseDependencies(fullPath, content)\n\n const hashes = await Promise.all([\n this.hashString(content),\n ...fileDeps.map(dep => this.getDependencyHash(dep)),\n ])\n\n return crc32(Buffer.concat(hashes.map(int32ToBytes)))\n }\n\n getDependencyHash(dependency: FileDependency): Promise<number> {\n const existingHash = this.dependencyHashes.get(dependency.id)\n if (existingHash) {\n return existingHash\n }\n\n const hash = this.calculateDependencyHash(dependency)\n this.dependencyHashes.set(dependency.id, hash)\n\n return hash\n }\n\n private async calculateDependencyHash(dependency: FileDependency): Promise<number> {\n switch (dependency.type) {\n case \"relative\": {\n return await this.getFileHash(dependency.fullPath)\n }\n case \"npm\": {\n let resolvedUrl\n try {\n const baseUrl = pathToFileURL(dirname(this.packageJsonPath))\n\n resolvedUrl = importMetaResolve(dependency.package, baseUrl.toString())\n } catch (error) {\n this.logger.error(`failed to resolve package \"%s\"`, dependency.package)\n throw error\n }\n\n if (resolvedUrl.startsWith(\"node:\")) {\n throw new Error(`\"${dependency.package}\" imported without \"node:\" prefix`)\n }\n\n const resolvedPath = fileURLToPath(resolvedUrl)\n\n const [depPackageJsonPath, depPackageJson] = await this.getPackageJson(resolvedPath)\n const packageName = depPackageJson.name!\n\n this.logger.debug(\n `resolved package.json for \"%s\": \"%s\"`,\n dependency.package,\n depPackageJsonPath,\n )\n\n if (\n !this.packageJson.dependencies?.[packageName] &&\n !this.packageJson.peerDependencies?.[packageName]\n ) {\n this.logger.warn(`package \"%s\" is not listed in package.json dependencies`, packageName)\n }\n\n // try to get source hash from manifest first\n let relativePath = relative(dirname(depPackageJsonPath), resolvedPath)\n relativePath = relativePath.startsWith(\".\") ? relativePath : `./${relativePath}`\n\n const highstateManifestPath = resolve(\n dirname(depPackageJsonPath),\n \"dist\",\n \"highstate.manifest.json\",\n )\n\n let manifest: HighstateManifest | undefined\n try {\n const manifestContent = await readFile(highstateManifestPath, \"utf8\")\n manifest = highstateManifestSchema.parse(JSON.parse(manifestContent))\n } catch (error) {\n this.logger.debug(\n { error },\n `failed to read highstate manifest for package \"%s\"`,\n packageName,\n )\n }\n\n const sourceHash = manifest?.sourceHashes?.[relativePath]\n\n if (sourceHash) {\n this.logger.debug(`resolved source hash for package \"%s\"`, packageName)\n return sourceHash\n }\n\n // use the package version as a fallback hash\n // this case will be applied for most npm packages\n this.logger.debug(`using package version as a fallback hash for \"%s\"`, packageName)\n return this.hashString(depPackageJson.version ?? \"0.0.0\")\n }\n }\n }\n\n private async getPackageJson(basePath: string): Promise<[string, PackageJson]> {\n while (true) {\n const packageJson = await readPackageJSON(basePath)\n if (packageJson.name) {\n const packageJsonPath = await resolvePackageJSON(basePath)\n\n return [packageJsonPath, packageJson]\n }\n\n basePath = resolve(dirname(basePath), \"..\")\n }\n }\n\n private parseDependencies(filePath: string, content: string): FileDependency[] {\n type DependencyMatch = {\n relativePath?: string\n nodeBuiltin?: string\n npmPackage?: string\n }\n\n const dependencyRegex =\n /^[ \\t]*import[\\s\\S]*?\\bfrom\\s*[\"']((?<relativePath>\\.\\.?\\/[^\"']+)|(?<nodeBuiltin>node:[^\"']+)|(?<npmPackage>[^\"']+))[\"']/gm\n\n const matches = content.matchAll(dependencyRegex)\n const dependencies: FileDependency[] = []\n\n for (const match of matches) {\n const { nodeBuiltin, npmPackage, relativePath } = match.groups as DependencyMatch\n\n if (relativePath) {\n const fullPath = resolve(dirname(filePath), relativePath)\n\n dependencies.push({\n type: \"relative\",\n id: `relative:${fullPath}`,\n fullPath,\n })\n } else if (npmPackage) {\n dependencies.push({\n type: \"npm\",\n id: `npm:${npmPackage}`,\n package: npmPackage,\n })\n } else if (nodeBuiltin) {\n // ignore node built-in modules\n }\n }\n\n return dependencies\n }\n}\n","import { z } from \"zod\"\n\n/**\n * Schema for the sourceHash configuration in package.json\n */\nexport const sourceHashConfigSchema = z.discriminatedUnion(\"mode\", [\n z.object({\n mode: z.literal(\"manual\"),\n version: z.string(),\n }),\n z.object({\n mode: z.literal(\"auto\"),\n }),\n z.object({\n mode: z.literal(\"version\"),\n }),\n z.object({\n mode: z.literal(\"none\"),\n }),\n])\n\n/**\n * Schema for the highstate configuration in package.json\n */\nexport const highstateConfigSchema = z.object({\n type: z.enum([\"source\", \"library\", \"worker\"]).default(\"source\"),\n sourceHash: z\n .union([sourceHashConfigSchema, z.record(z.string(), sourceHashConfigSchema)])\n .optional(),\n})\n\n/**\n * Schema for the highstate manifest file\n */\nexport const highstateManifestSchema = z.object({\n sourceHashes: z.record(z.string(), z.number()).optional(),\n})\n\nexport type SourceHashConfig = z.infer<typeof sourceHashConfigSchema>\nexport type HighstateConfig = z.infer<typeof highstateConfigSchema>\nexport type HighstateManifest = z.infer<typeof highstateManifestSchema>\n","import type { Plugin } from \"esbuild\"\nimport { readFile } from \"node:fs/promises\"\nimport { logger } from \"./logger\"\n\nexport function createBinTransformerPlugin(sourceFilePaths: string[]): Plugin {\n const filter = new RegExp(`(${sourceFilePaths.join(\"|\")})$`)\n\n logger.debug(\"created bin transformer plugin with filter: %s\", filter)\n\n return {\n name: \"bin-transformer\",\n setup(build) {\n build.onLoad({ filter }, async args => {\n const content = await readFile(args.path, \"utf-8\")\n\n return {\n contents: `#!/usr/bin/env node\\n\\n${content}`,\n loader: \"ts\",\n }\n })\n },\n }\n}\n","import type { Plugin } from \"esbuild\"\nimport { resolve } from \"node:path\"\nimport { writeFile } from \"node:fs/promises\"\nimport { Command, Option } from \"clipanion\"\nimport { readPackageJSON, resolvePackageJSON } from \"pkg-types\"\nimport { mapKeys, mapValues, pipe } from \"remeda\"\nimport { build } from \"tsup\"\nimport { encode } from \"@msgpack/msgpack\"\nimport {\n createBinTransformerPlugin,\n logger,\n schemaTransformerPlugin,\n SourceHashCalculator,\n highstateConfigSchema,\n} from \"../shared\"\n\nexport class BuildCommand extends Command {\n static paths = [[\"build\"]]\n\n static usage = Command.Usage({\n category: \"Builder\",\n description: \"Builds the Highstate library or unit package.\",\n })\n\n watch = Option.Boolean(\"--watch\", false)\n library = Option.Boolean(\"--library\", false)\n silent = Option.Boolean(\"--silent\", true)\n noSourceHash = Option.Boolean(\"--no-source-hash\", false)\n\n async execute(): Promise<void> {\n const packageJson = await readPackageJSON()\n\n const highstateConfig = highstateConfigSchema.parse(packageJson.highstate ?? {})\n if (highstateConfig.type === \"library\") {\n this.library = true\n }\n\n if (highstateConfig.type === \"worker\") {\n this.noSourceHash = true\n }\n\n const exports = packageJson.exports\n let bin = packageJson.bin\n\n if (!packageJson.name) {\n throw new Error(\"package.json must have a name field\")\n }\n\n if (!exports && !bin) {\n logger.warn(\"no exports or bin found in package.json\")\n return\n }\n\n if (exports !== undefined && (typeof exports !== \"object\" || Array.isArray(exports))) {\n throw new Error(\"Exports field in package.json must be an object\")\n }\n\n if (bin !== undefined && typeof bin !== \"object\") {\n bin = { [packageJson.name]: bin }\n }\n\n const entry = pipe(\n {\n ...mapValues(exports ?? {}, value => ({ value, isBin: false })),\n ...mapValues(bin ?? {}, value => ({ value, isBin: true })),\n },\n mapValues(({ value, isBin }, key) => {\n let distPath\n\n if (typeof value === \"string\") {\n distPath = value\n } else if (typeof value === \"object\" && !Array.isArray(value)) {\n if (!value.default) {\n throw new Error(`Export \"${key}\" must have a default field in package.json`)\n }\n\n if (typeof value.default !== \"string\") {\n throw new Error(`Export \"${key}\" default field must be a string in package.json`)\n }\n\n distPath = value.default\n } else {\n throw new Error(`Export \"${key}\" must be a string or an object in package.json`)\n }\n\n if (!distPath.startsWith(\"./dist/\")) {\n throw new Error(\n `The default value of export \"${key}\" must start with \"./dist/\" in package.json, got \"${distPath}\"`,\n )\n }\n\n if (!distPath.endsWith(\".js\")) {\n throw new Error(\n `The default value of export \"${key}\" must end with \".js\" in package.json, got \"${distPath}\"`,\n )\n }\n\n const targetName = distPath.slice(7).slice(0, -3)\n\n return {\n entryPoint: `./src/${targetName}.ts`,\n targetName,\n distPath,\n isBin,\n key,\n }\n }),\n mapKeys((_, value) => value.targetName),\n )\n\n const esbuildPlugins: Plugin[] = []\n\n const binSourceFilePaths = Object.values(entry)\n .filter(value => value.isBin)\n .map(value => value.entryPoint.slice(2)) // remove \"./\"\n\n if (this.library) {\n esbuildPlugins.push(schemaTransformerPlugin)\n }\n\n if (binSourceFilePaths.length > 0) {\n esbuildPlugins.push(createBinTransformerPlugin(binSourceFilePaths))\n }\n\n await build({\n entry: mapValues(entry, value => value.entryPoint),\n outDir: \"dist\",\n watch: this.watch,\n sourcemap: true,\n clean: true,\n format: \"esm\",\n target: \"es2024\",\n platform: \"node\",\n external: [\"@pulumi/pulumi\"],\n esbuildPlugins,\n treeshake: true,\n silent: this.silent || [\"warn\", \"error\", \"fatal\"].includes(logger.level),\n })\n\n const packageJsonPath = await resolvePackageJSON()\n const upToDatePackageJson = await readPackageJSON()\n\n if (!this.noSourceHash) {\n const sourceHashCalculator = new SourceHashCalculator(\n packageJsonPath,\n upToDatePackageJson,\n logger,\n )\n\n const distPathToExportKey = new Map<string, string>()\n for (const value of Object.values(entry)) {\n distPathToExportKey.set(value.distPath, value.key)\n }\n\n await sourceHashCalculator.writeHighstateManifest(\"./dist\", distPathToExportKey)\n }\n\n // write the \"highstate.library.json\" file if the library flag is set\n if (this.library) {\n const { loadLibrary } = await import(\"../shared/library-loader.js\")\n const fullModulePaths = Object.values(entry).map(value => resolve(value.distPath))\n\n logger.info(\"evaluating library components from modules: %s\", fullModulePaths.join(\", \"))\n\n const library = await loadLibrary(logger, fullModulePaths)\n const libraryPath = resolve(\"./dist\", \"highstate.library.msgpack\")\n\n await writeFile(libraryPath, encode(library), \"utf8\")\n }\n\n logger.info(\"build completed successfully\")\n }\n}\n","import { Command } from \"clipanion\"\nimport { identityToRecipient } from \"age-encryption\"\nimport { logger } from \"../../shared\"\n\nexport class BackendIdentityCommand extends Command {\n static paths = [[\"backend\", \"identity\"]]\n\n static usage = Command.Usage({\n category: \"Backend\",\n description: \"Ensures the backend identity is set up and returns the recipient.\",\n })\n\n async execute(): Promise<void> {\n // do not initialize the backend services here, because the state might not be available yet\n const backendLogger = logger.child({}, { msgPrefix: \"[backend] \" })\n const { getOrCreateBackendIdentity } = await import(\"@highstate/backend\")\n\n const backendIdentity = await getOrCreateBackendIdentity(backendLogger)\n const recipient = await identityToRecipient(backendIdentity)\n\n logger.info(`stored backend identity is: ${recipient}`)\n logger.info(`run \"highstate backend unlock-method add ${recipient}\" on other authorized device`)\n }\n}\n"],"mappings":"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","names":["readPackageJSON","consola","build","readFile","z","logger","z","readFile","readFile","build","readFile","readPackageJSON","resolve","consola","resolve","writeFile","Command","readPackageJSON","resolvePackageJSON","Command","readPackageJSON","resolvePackageJSON","resolve","writeFile","Command","Command"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/shared/logger.ts","../src/shared/services.ts","../src/shared/schema-transformer.ts","../src/shared/schemas.ts","../src/shared/source-hash-calculator.ts","../src/shared/bin-transformer.ts","../src/commands/designer.ts","../src/commands/build.ts","../src/commands/backend/identity.ts","../src/main.ts"],"names":["build","jsdoc","description","originalValue","logger","z","readFile","importMetaResolve","readPackageJSON","resolve","consola","Command","resolvePackageJSON","writeFile"],"mappings":"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","file":"main.js","sourcesContent":["{\n \"name\": \"@highstate/cli\",\n \"version\": \"0.9.17\",\n \"description\": \"The CLI for the Highstate project.\",\n \"type\": \"module\",\n \"files\": [\n \"assets\",\n \"dist\",\n \"src\"\n ],\n \"bin\": {\n \"highstate\": \"./dist/main.js\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"highstate build\",\n \"test\": \"vitest run\"\n },\n \"dependencies\": {\n \"@aws-crypto/crc32\": \"^5.2.0\",\n \"@highstate/backend\": \"workspace:^0.9.16\",\n \"@highstate/contract\": \"workspace:^0.9.16\",\n \"@msgpack/msgpack\": \"^3.1.2\",\n \"@pulumi/pulumi\": \"^3.184.0\",\n \"age-encryption\": \"^0.2.4\",\n \"ajv\": \"^8.17.1\",\n \"clipanion\": \"^4.0.0-rc.4\",\n \"consola\": \"^3.4.0\",\n \"crypto-hash\": \"^3.1.0\",\n \"get-port-please\": \"^3.1.2\",\n \"import-meta-resolve\": \"^4.1.0\",\n \"magic-string\": \"^0.30.17\",\n \"nypm\": \"^0.6.0\",\n \"oxc-parser\": \"^0.63.0\",\n \"oxc-walker\": \"^0.2.4\",\n \"pino\": \"^9.6.0\",\n \"pkg-types\": \"^1.2.1\",\n \"remeda\": \"^2.21.2\",\n \"tsup\": \"^8.4.0\",\n \"zod\": \"^4.0.5\"\n },\n \"peerDependenciesMeta\": {\n \"@pulumi/pulumi\": {\n \"optional\": true\n },\n \"classic-level\": {\n \"optional\": true\n }\n },\n \"devDependencies\": {\n \"highstate-cli-bootstrap\": \"patch:@highstate/cli@npm%3A0.9.16#~/.yarn/patches/@highstate-cli-npm-0.9.16-e03b564691.patch\",\n \"vitest\": \"^3.2.4\"\n }\n}\n","import { PassThrough } from \"node:stream\"\nimport pino, { levels } from \"pino\"\nimport { consola, LogLevels } from \"consola\"\n\nexport const logger = pino(\n {\n name: \"highstate-cli\",\n level: process.env.LOG_LEVEL ?? \"info\",\n },\n createConsolaStream(),\n)\n\nconsola.level = LogLevels[(process.env.LOG_LEVEL as keyof typeof LogLevels) ?? \"info\"]\n\nfunction createConsolaStream() {\n const stream = new PassThrough()\n\n stream.on(\"data\", data => {\n const { level, msg, error } = JSON.parse(String(data)) as {\n msg: string\n level: number\n error?: unknown\n }\n\n const levelLabel = levels.labels[level]\n\n switch (levelLabel) {\n case \"info\":\n consola.info(msg)\n break\n case \"warn\":\n consola.warn(msg)\n break\n case \"error\":\n if (error) {\n consola.error(msg, error)\n } else {\n consola.error(msg)\n }\n break\n case \"debug\":\n consola.debug(msg)\n break\n case \"fatal\":\n consola.fatal(msg)\n break\n case \"trace\":\n consola.trace(msg)\n break\n }\n })\n\n return stream\n}\n","import type { Services } from \"@highstate/backend\"\nimport { logger } from \"./logger\"\n\nlet services: Promise<Services> | undefined\n\nexport function getBackendServices() {\n if (services) {\n return services\n }\n\n services = import(\"@highstate/backend\").then(({ getSharedServices }) => {\n return getSharedServices({\n services: {\n logger: logger.child({}, { msgPrefix: \"[backend] \" }),\n },\n })\n })\n\n return services\n}\n","import type { Plugin } from \"esbuild\"\nimport { readFile } from \"node:fs/promises\"\nimport { parseAsync, type Comment } from \"oxc-parser\"\nimport { walk, type Node } from \"oxc-walker\"\nimport MagicString from \"magic-string\"\n\nexport const schemaTransformerPlugin: Plugin = {\n name: \"schema-transformer\",\n setup(build) {\n build.onLoad({ filter: /src\\/.*\\.ts$/ }, async args => {\n const content = await readFile(args.path, \"utf-8\")\n\n return {\n contents: await applySchemaTransformations(content),\n loader: \"ts\",\n }\n })\n },\n}\n\ntype Transformation = {\n start: number\n end: number\n newValue: string\n type: \"zod-meta\" | \"schema-structure\" | \"import\"\n}\n\nexport async function applySchemaTransformations(content: string): Promise<string> {\n const { program, comments } = await parseAsync(\"file.ts\", content)\n\n const transformations: Transformation[] = []\n const parentStack: Node[] = []\n\n walk(program, {\n enter(node) {\n parentStack.push(node) // Handle z.object() patterns\n if (\n node.type === \"Property\" &&\n node.key.type === \"Identifier\" &&\n isInsideZodObject(parentStack)\n ) {\n const jsdoc = comments.find(comment => isLeadingComment(content, node, comment))\n if (jsdoc) {\n const description = cleanJsdoc(jsdoc.value)\n const fieldName = node.key.name\n const originalValue = content.substring(node.value.start, node.value.end)\n\n // Check if the field already has .meta() call\n if (!originalValue.includes(\".meta(\")) {\n transformations.push({\n start: node.value.start,\n end: node.value.end,\n newValue: `${originalValue}.meta({ title: __camelCaseToHumanReadable(\"${fieldName}\"), description: \\`${description}\\` })`,\n type: \"zod-meta\",\n })\n }\n }\n return\n }\n\n if (node.type !== \"Property\" || node.key.type !== \"Identifier\") {\n return\n }\n\n const parentKey = getParentObjectKey(parentStack) || getMarkerFunctionName(parentStack)\n if (!parentKey || ![\"inputs\", \"outputs\", \"args\", \"secrets\"].includes(parentKey)) {\n return\n }\n\n const jsdoc = comments.find(comment => isLeadingComment(content, node, comment))\n if (!jsdoc) {\n return\n }\n\n const description = cleanJsdoc(jsdoc.value)\n const originalValue = content.substring(node.value.start, node.value.end)\n\n const entityField = [\"inputs\", \"outputs\"].includes(parentKey) ? \"entity\" : \"schema\"\n\n // Check if the value already has entity/schema structure\n const isAlreadyStructured = isStructuredValue(originalValue, entityField)\n\n if (isAlreadyStructured) {\n // For already structured values, inject description directly into the object\n const modifiedValue = injectDescriptionIntoObject(originalValue, description)\n transformations.push({\n start: node.value.start,\n end: node.value.end,\n newValue: modifiedValue,\n type: \"schema-structure\",\n })\n } else {\n // Transform to new structure\n transformations.push({\n start: node.value.start,\n end: node.value.end,\n newValue: `{\n ${entityField}: ${originalValue},\n meta: {\n description: \\`${description}\\`,\n },\n}`,\n type: \"schema-structure\",\n })\n }\n },\n leave() {\n parentStack.pop()\n },\n }) // Handle overlapping transformations by merging them\n const zodMetaTransformations = transformations.filter(t => t.type === \"zod-meta\")\n const schemaTransformations = transformations.filter(t => t.type === \"schema-structure\")\n\n // For each schema transformation, check if it contains zod-meta transformations\n const processedSchemaTransformations = schemaTransformations.map(schemaTransform => {\n const containedZodMetas = zodMetaTransformations.filter(zodTransform => {\n return schemaTransform.start <= zodTransform.start && schemaTransform.end >= zodTransform.end\n })\n\n if (containedZodMetas.length > 0) {\n // Apply the zod-meta transformations to the original content first\n const originalContent = content.substring(schemaTransform.start, schemaTransform.end)\n const tempMagicString = new MagicString(originalContent)\n\n // Adjust positions relative to the schema transformation start\n containedZodMetas\n .sort((a, b) => b.start - a.start)\n .forEach(zodTransform => {\n const relativeStart = zodTransform.start - schemaTransform.start\n const relativeEnd = zodTransform.end - schemaTransform.start\n tempMagicString.update(relativeStart, relativeEnd, zodTransform.newValue)\n })\n\n const modifiedContent = tempMagicString.toString()\n\n // Now create the schema transformation with the modified content\n const entityField = schemaTransform.newValue.includes(\"entity:\") ? \"entity\" : \"schema\"\n const descriptionMatch = schemaTransform.newValue.match(/description: `([^`]+)`/)\n\n if (descriptionMatch) {\n const description = descriptionMatch[1]\n\n // Check if the original content is already structured\n const isAlreadyStructured = isStructuredValue(\n content.substring(schemaTransform.start, schemaTransform.end),\n entityField,\n )\n\n if (isAlreadyStructured) {\n // Just inject the description into the existing structure with modified content\n return {\n ...schemaTransform,\n newValue: injectDescriptionIntoObject(modifiedContent, description),\n containsZodMeta: true,\n }\n } else {\n // Create new structure with modified content\n return {\n ...schemaTransform,\n newValue: `{\n ${entityField}: ${modifiedContent},\n meta: {\n description: \\`${description}\\`,\n },\n}`,\n containsZodMeta: true,\n }\n }\n }\n }\n\n return { ...schemaTransform, containsZodMeta: false }\n })\n\n // Filter out zod-meta transformations that are already included in schema transformations\n const independentZodMetas = zodMetaTransformations.filter(zodTransform => {\n return !schemaTransformations.some(schemaTransform => {\n return schemaTransform.start <= zodTransform.start && schemaTransform.end >= zodTransform.end\n })\n })\n\n // Combine the transformations\n const finalTransformations = [\n ...independentZodMetas,\n ...processedSchemaTransformations.map(({ containsZodMeta, ...rest }) => rest), // eslint-disable-line @typescript-eslint/no-unused-vars\n ]\n\n // Check if we need to add the import for camelCaseToHumanReadable\n const hasZodMetaTransformations = zodMetaTransformations.length > 0\n const needsImport = hasZodMetaTransformations && !content.includes(\"__camelCaseToHumanReadable\")\n\n let result = content\n const magicString = new MagicString(result)\n\n // Apply all transformations\n finalTransformations\n .sort((a, b) => b.start - a.start) // Sort in reverse order by start position\n .forEach(transformation => {\n magicString.update(transformation.start, transformation.end, transformation.newValue)\n })\n\n result = magicString.toString()\n\n // Add import at the beginning if needed\n if (needsImport) {\n result =\n 'import { camelCaseToHumanReadable as __camelCaseToHumanReadable } from \"@highstate/contract\"\\n' +\n result\n }\n\n return result\n}\n\nfunction injectDescriptionIntoObject(objectString: string, description: string): string {\n const trimmed = objectString.trim()\n\n // Check if the object already has a meta field\n const metaRegex = /meta\\s*:\\s*\\{/\n\n if (metaRegex.test(trimmed)) {\n // Check if the meta field already has a description\n const hasDescription = /meta\\s*:\\s*\\{[^}]*description\\s*:/.test(trimmed)\n\n if (hasDescription) {\n // Replace existing description\n return trimmed.replace(/description\\s*:\\s*`[^`]*`/, `description: \\`${description}\\``)\n } else {\n // Add description at the beginning of the meta object\n return trimmed.replace(\n /meta\\s*:\\s*\\{/,\n `meta: {\n description: \\`${description}\\`,`,\n )\n }\n } else {\n // Add meta field at the end of the object (before the closing brace)\n const lastBraceIndex = trimmed.lastIndexOf(\"}\")\n if (lastBraceIndex === -1) {\n // Invalid object structure, return as is\n return trimmed\n }\n\n const beforeBrace = trimmed.substring(0, lastBraceIndex)\n const afterBrace = trimmed.substring(lastBraceIndex)\n\n // Check if we need a comma before adding meta\n const needsComma = beforeBrace.trim().length > 1 && !beforeBrace.trim().endsWith(\",\")\n const comma = needsComma ? \",\" : \"\"\n\n return `${beforeBrace}${comma}\n meta: {\n description: \\`${description}\\`,\n },\n${afterBrace}`\n }\n}\n\nfunction isStructuredValue(value: string, expectedField: string): boolean {\n const trimmed = value.trim()\n if (!trimmed.startsWith(\"{\")) {\n return false\n }\n\n // Check if it contains the expected field (entity or schema) at the top level\n const fieldPattern = new RegExp(`^\\\\s*{[^}]*\\\\b${expectedField}\\\\s*:`, \"s\")\n return fieldPattern.test(trimmed)\n}\n\nfunction getMarkerFunctionName(parentStack: Node[]): string | null {\n // Look for marker functions like $args, $inputs, $outputs, $secrets\n for (let i = parentStack.length - 1; i >= 0; i--) {\n const node = parentStack[i]\n if (node.type === \"CallExpression\" && node.callee.type === \"Identifier\") {\n const functionName = node.callee.name\n if (\n functionName.startsWith(\"$\") &&\n [\"$args\", \"$inputs\", \"$outputs\", \"$secrets\"].includes(functionName)\n ) {\n return functionName.substring(1) // Remove the $ prefix\n }\n }\n }\n return null\n}\n\nfunction getParentObjectKey(parentStack: Node[]): string | null {\n // Walk up the parent stack to find the parent object property\n for (let i = parentStack.length - 2; i >= 0; i--) {\n const node = parentStack[i]\n if (node.type === \"Property\" && node.key.type === \"Identifier\") {\n return node.key.name\n }\n }\n return null\n}\n\nfunction isLeadingComment(content: string, node: Node, comment: Comment) {\n if (comment.end > node.start) {\n return false\n }\n\n const contentRange = content.substring(comment.end, node.start)\n\n return contentRange.trim().length === 0\n}\n\nfunction cleanJsdoc(str: string) {\n return (\n str\n // remove leading asterisks\n .replace(/^\\s*\\*/gm, \"\")\n\n // escape backticks and dollar signs\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/`/g, \"\\\\`\")\n .replace(/\\${/g, \"\\\\${\")\n .trim()\n )\n}\n\nfunction isInsideZodObject(parentStack: Node[]): boolean {\n // Look for z.object() call expression in the parent stack\n for (let i = parentStack.length - 1; i >= 0; i--) {\n const node = parentStack[i]\n if (\n node.type === \"CallExpression\" &&\n node.callee.type === \"MemberExpression\" &&\n isZodObjectCall(node.callee)\n ) {\n return true\n }\n }\n return false\n}\n\nfunction isZodObjectCall(memberExpression: Node): boolean {\n if (memberExpression.type !== \"MemberExpression\") {\n return false\n }\n\n // Handle direct z.object() calls\n if (\n memberExpression.object.type === \"Identifier\" &&\n memberExpression.object.name === \"z\" &&\n memberExpression.property.type === \"Identifier\" &&\n memberExpression.property.name === \"object\"\n ) {\n return true\n }\n\n // Handle chained calls like z.discriminatedUnion().default().object()\n // or any other chained Zod methods that end with .object()\n if (\n memberExpression.property.type === \"Identifier\" &&\n memberExpression.property.name === \"object\" &&\n memberExpression.object.type === \"CallExpression\" &&\n memberExpression.object.callee.type === \"MemberExpression\"\n ) {\n // Recursively check if this is part of a z.* chain\n return startsWithZodCall(memberExpression.object)\n }\n\n return false\n}\n\nfunction startsWithZodCall(callExpression: Node): boolean {\n if (!callExpression || callExpression.type !== \"CallExpression\") {\n return false\n }\n\n if (callExpression.callee.type === \"MemberExpression\") {\n // Check if this is a direct z.* call\n if (\n callExpression.callee.object.type === \"Identifier\" &&\n callExpression.callee.object.name === \"z\"\n ) {\n return true\n }\n\n // Recursively check nested calls\n if (callExpression.callee.object.type === \"CallExpression\") {\n return startsWithZodCall(callExpression.callee.object)\n }\n }\n\n return false\n}\n","import { z } from \"zod\"\n\n/**\n * Schema for the sourceHash configuration in package.json\n */\nexport const sourceHashConfigSchema = z.discriminatedUnion(\"mode\", [\n z.object({\n mode: z.literal(\"manual\"),\n version: z.string(),\n }),\n z.object({\n mode: z.literal(\"auto\"),\n }),\n z.object({\n mode: z.literal(\"version\"),\n }),\n z.object({\n mode: z.literal(\"none\"),\n }),\n])\n\n/**\n * Schema for the highstate configuration in package.json\n */\nexport const highstateConfigSchema = z.object({\n type: z.enum([\"source\", \"library\", \"worker\"]).default(\"source\"),\n sourceHash: z\n .union([sourceHashConfigSchema, z.record(z.string(), sourceHashConfigSchema)])\n .optional(),\n})\n\n/**\n * Schema for the highstate manifest file\n */\nexport const highstateManifestSchema = z.object({\n sourceHashes: z.record(z.string(), z.number()).optional(),\n})\n\nexport type SourceHashConfig = z.infer<typeof sourceHashConfigSchema>\nexport type HighstateConfig = z.infer<typeof highstateConfigSchema>\nexport type HighstateManifest = z.infer<typeof highstateManifestSchema>\n","import type { Logger } from \"pino\"\nimport { dirname, relative, resolve } from \"node:path\"\nimport { readFile, writeFile } from \"node:fs/promises\"\nimport { fileURLToPath, pathToFileURL } from \"node:url\"\nimport { readPackageJSON, resolvePackageJSON, type PackageJson } from \"pkg-types\"\nimport { crc32 } from \"@aws-crypto/crc32\"\nimport { resolve as importMetaResolve } from \"import-meta-resolve\"\nimport { z } from \"zod\"\nimport {\n type HighstateManifest,\n type HighstateConfig,\n type SourceHashConfig,\n highstateConfigSchema,\n highstateManifestSchema,\n sourceHashConfigSchema,\n} from \"./schemas\"\nimport { int32ToBytes } from \"./utils\"\n\ntype FileDependency =\n | {\n type: \"relative\"\n id: string\n fullPath: string\n }\n | {\n type: \"npm\"\n id: string\n package: string\n }\n\nexport class SourceHashCalculator {\n private readonly dependencyHashes = new Map<string, Promise<number>>()\n private readonly fileHashes = new Map<string, Promise<number>>()\n\n constructor(\n private readonly packageJsonPath: string,\n private readonly packageJson: PackageJson,\n private readonly logger: Logger,\n ) {}\n\n /**\n * Calculates CRC32 hash of a string.\n */\n private hashString(input: string): number {\n return crc32(Buffer.from(input))\n }\n\n /**\n * Gets the highstate configuration from package.json with defaults.\n */\n private getHighstateConfig(packageJson: PackageJson): HighstateConfig {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const rawConfig = packageJson.highstate\n if (!rawConfig) {\n return { type: \"source\" }\n }\n\n try {\n return highstateConfigSchema.parse(rawConfig)\n } catch (error) {\n this.logger.warn(\n { error, packageName: packageJson.name },\n \"invalid highstate configuration, using defaults\",\n )\n return { type: \"source\" }\n }\n }\n\n /**\n * Gets the effective source hash configuration with defaults for a specific output.\n */\n private getSourceHashConfig(\n highstateConfig: HighstateConfig,\n exportKey?: string,\n ): SourceHashConfig {\n if (highstateConfig.sourceHash) {\n // Try to parse as a single config first\n const singleConfigResult = sourceHashConfigSchema.safeParse(highstateConfig.sourceHash)\n if (singleConfigResult.success) {\n return singleConfigResult.data\n }\n\n // Try to parse as a record of configs\n const recordConfigResult = z\n .record(z.string(), sourceHashConfigSchema)\n .safeParse(highstateConfig.sourceHash)\n if (recordConfigResult.success && exportKey) {\n const perOutputConfig = recordConfigResult.data[exportKey]\n if (perOutputConfig) {\n return perOutputConfig\n }\n }\n }\n\n if (highstateConfig.type === \"library\") {\n return { mode: \"none\" }\n }\n\n return { mode: \"auto\" }\n }\n\n async writeHighstateManifest(\n distBasePath: string,\n distPathToExportKey: Map<string, string>,\n ): Promise<void> {\n const highstateConfig = this.getHighstateConfig(this.packageJson)\n\n const promises: Promise<{ distPath: string; hash: number }>[] = []\n\n for (const [distPath, exportKey] of distPathToExportKey) {\n const fullPath = resolve(distPath)\n const sourceHashConfig = this.getSourceHashConfig(highstateConfig, exportKey)\n\n switch (sourceHashConfig.mode) {\n case \"manual\":\n promises.push(\n Promise.resolve({\n distPath,\n hash: this.hashString(sourceHashConfig.version),\n }),\n )\n break\n case \"version\":\n promises.push(\n Promise.resolve({\n distPath,\n hash: this.hashString(this.packageJson.version ?? \"\"),\n }),\n )\n break\n case \"none\":\n promises.push(\n Promise.resolve({\n distPath,\n hash: 0,\n }),\n )\n break\n case \"auto\":\n default:\n promises.push(\n this.getFileHash(fullPath).then(hash => ({\n distPath,\n hash,\n })),\n )\n break\n }\n }\n\n const manifest: HighstateManifest = {\n sourceHashes: {},\n }\n\n const hashes = await Promise.all(promises)\n for (const { distPath, hash } of hashes) {\n manifest.sourceHashes![distPath] = hash\n }\n\n const manifestPath = resolve(distBasePath, \"highstate.manifest.json\")\n await writeFile(manifestPath, JSON.stringify(manifest, null, 2), \"utf8\")\n }\n\n private async getFileHash(fullPath: string): Promise<number> {\n const existingHash = this.fileHashes.get(fullPath)\n if (existingHash) {\n return existingHash\n }\n\n const hash = this.calculateFileHash(fullPath)\n this.fileHashes.set(fullPath, hash)\n\n return hash\n }\n\n private async calculateFileHash(fullPath: string): Promise<number> {\n const content = await readFile(fullPath, \"utf8\")\n const fileDeps = this.parseDependencies(fullPath, content)\n\n const hashes = await Promise.all([\n this.hashString(content),\n ...fileDeps.map(dep => this.getDependencyHash(dep)),\n ])\n\n return crc32(Buffer.concat(hashes.map(int32ToBytes)))\n }\n\n getDependencyHash(dependency: FileDependency): Promise<number> {\n const existingHash = this.dependencyHashes.get(dependency.id)\n if (existingHash) {\n return existingHash\n }\n\n const hash = this.calculateDependencyHash(dependency)\n this.dependencyHashes.set(dependency.id, hash)\n\n return hash\n }\n\n private async calculateDependencyHash(dependency: FileDependency): Promise<number> {\n switch (dependency.type) {\n case \"relative\": {\n return await this.getFileHash(dependency.fullPath)\n }\n case \"npm\": {\n let resolvedUrl\n try {\n const baseUrl = pathToFileURL(dirname(this.packageJsonPath))\n\n resolvedUrl = importMetaResolve(dependency.package, baseUrl.toString())\n } catch (error) {\n this.logger.error(`failed to resolve package \"%s\"`, dependency.package)\n throw error\n }\n\n if (resolvedUrl.startsWith(\"node:\")) {\n throw new Error(`\"${dependency.package}\" imported without \"node:\" prefix`)\n }\n\n const resolvedPath = fileURLToPath(resolvedUrl)\n\n const [depPackageJsonPath, depPackageJson] = await this.getPackageJson(resolvedPath)\n const packageName = depPackageJson.name!\n\n this.logger.debug(\n `resolved package.json for \"%s\": \"%s\"`,\n dependency.package,\n depPackageJsonPath,\n )\n\n if (\n !this.packageJson.dependencies?.[packageName] &&\n !this.packageJson.peerDependencies?.[packageName]\n ) {\n this.logger.warn(`package \"%s\" is not listed in package.json dependencies`, packageName)\n }\n\n // try to get source hash from manifest first\n let relativePath = relative(dirname(depPackageJsonPath), resolvedPath)\n relativePath = relativePath.startsWith(\".\") ? relativePath : `./${relativePath}`\n\n const highstateManifestPath = resolve(\n dirname(depPackageJsonPath),\n \"dist\",\n \"highstate.manifest.json\",\n )\n\n let manifest: HighstateManifest | undefined\n try {\n const manifestContent = await readFile(highstateManifestPath, \"utf8\")\n manifest = highstateManifestSchema.parse(JSON.parse(manifestContent))\n } catch (error) {\n this.logger.debug(\n { error },\n `failed to read highstate manifest for package \"%s\"`,\n packageName,\n )\n }\n\n const sourceHash = manifest?.sourceHashes?.[relativePath]\n\n if (sourceHash) {\n this.logger.debug(`resolved source hash for package \"%s\"`, packageName)\n return sourceHash\n }\n\n // use the package version as a fallback hash\n // this case will be applied for most npm packages\n this.logger.debug(`using package version as a fallback hash for \"%s\"`, packageName)\n return this.hashString(depPackageJson.version ?? \"0.0.0\")\n }\n }\n }\n\n private async getPackageJson(basePath: string): Promise<[string, PackageJson]> {\n while (true) {\n const packageJson = await readPackageJSON(basePath)\n if (packageJson.name) {\n const packageJsonPath = await resolvePackageJSON(basePath)\n\n return [packageJsonPath, packageJson]\n }\n\n basePath = resolve(dirname(basePath), \"..\")\n }\n }\n\n private parseDependencies(filePath: string, content: string): FileDependency[] {\n type DependencyMatch = {\n relativePath?: string\n nodeBuiltin?: string\n npmPackage?: string\n }\n\n const dependencyRegex =\n /^[ \\t]*import[\\s\\S]*?\\bfrom\\s*[\"']((?<relativePath>\\.\\.?\\/[^\"']+)|(?<nodeBuiltin>node:[^\"']+)|(?<npmPackage>[^\"']+))[\"']/gm\n\n const matches = content.matchAll(dependencyRegex)\n const dependencies: FileDependency[] = []\n\n for (const match of matches) {\n const { nodeBuiltin, npmPackage, relativePath } = match.groups as DependencyMatch\n\n if (relativePath) {\n const fullPath = resolve(dirname(filePath), relativePath)\n\n dependencies.push({\n type: \"relative\",\n id: `relative:${fullPath}`,\n fullPath,\n })\n } else if (npmPackage) {\n dependencies.push({\n type: \"npm\",\n id: `npm:${npmPackage}`,\n package: npmPackage,\n })\n } else if (nodeBuiltin) {\n // ignore node built-in modules\n }\n }\n\n return dependencies\n }\n}\n","import type { Plugin } from \"esbuild\"\nimport { readFile } from \"node:fs/promises\"\nimport { logger } from \"./logger\"\n\nexport function createBinTransformerPlugin(sourceFilePaths: string[]): Plugin {\n const filter = new RegExp(`(${sourceFilePaths.join(\"|\")})$`)\n\n logger.debug(\"created bin transformer plugin with filter: %s\", filter)\n\n return {\n name: \"bin-transformer\",\n setup(build) {\n build.onLoad({ filter }, async args => {\n const content = await readFile(args.path, \"utf-8\")\n\n return {\n contents: `#!/usr/bin/env node\\n\\n${content}`,\n loader: \"ts\",\n }\n })\n },\n }\n}\n","import { Command, UsageError } from \"clipanion\"\nimport { readPackageJSON } from \"pkg-types\"\nimport { addDevDependency } from \"nypm\"\nimport { consola } from \"consola\"\nimport { colorize } from \"consola/utils\"\nimport { getPort } from \"get-port-please\"\nimport { getBackendServices, logger } from \"../shared\"\n\nexport class DesignerCommand extends Command {\n static paths = [[\"designer\"]]\n\n static usage = Command.Usage({\n category: \"Designer\",\n description: \"Starts the Highstate designer in the current project.\",\n })\n\n async execute(): Promise<void> {\n const packageJson = await readPackageJSON()\n if (!packageJson.devDependencies?.[\"@highstate/cli\"]) {\n throw new UsageError(\n \"This project is not a Highstate project.\\n@highstate/cli must be installed as a devDependency.\",\n )\n }\n\n if (!packageJson.devDependencies?.[\"@highstate/designer\"]) {\n logger.info(\"Installing @highstate/designer...\")\n\n await addDevDependency([\"@highstate/designer\", \"classic-level\"])\n }\n\n logger.info(\"starting highstate designer...\")\n\n await getBackendServices()\n\n const oldConsoleLog = console.log\n\n const port = await getPort()\n\n process.env.NITRO_PORT = port.toString()\n process.env.NITRO_HOST = \"0.0.0.0\"\n\n await new Promise<void>(resolve => {\n console.log = (message: string) => {\n if (message.startsWith(\"Listening on\")) {\n resolve()\n }\n }\n\n const path = \"@highstate/designer/.output/server/index.mjs\"\n void import(path)\n })\n\n console.log = oldConsoleLog\n\n consola.log(\n [\n \"\\n \",\n colorize(\"bold\", colorize(\"cyanBright\", \"Highstate Designer\")),\n \"\\n \",\n colorize(\"greenBright\", \"➜ Local: \"),\n colorize(\"underline\", colorize(\"cyanBright\", `http://localhost:${port}`)),\n \"\\n\",\n ].join(\"\"),\n )\n\n process.on(\"SIGINT\", () => {\n process.stdout.write(\"\\r\")\n consola.info(\"shutting down highstate designer...\")\n\n setTimeout(() => process.exit(0), 1000)\n })\n }\n}\n","import type { Plugin } from \"esbuild\"\nimport { resolve } from \"node:path\"\nimport { writeFile } from \"node:fs/promises\"\nimport { Command, Option } from \"clipanion\"\nimport { readPackageJSON, resolvePackageJSON } from \"pkg-types\"\nimport { mapKeys, mapValues, pipe } from \"remeda\"\nimport { build } from \"tsup\"\nimport { encode } from \"@msgpack/msgpack\"\nimport {\n createBinTransformerPlugin,\n logger,\n schemaTransformerPlugin,\n SourceHashCalculator,\n highstateConfigSchema,\n} from \"../shared\"\n\nexport class BuildCommand extends Command {\n static paths = [[\"build\"]]\n\n static usage = Command.Usage({\n category: \"Builder\",\n description: \"Builds the Highstate library or unit package.\",\n })\n\n watch = Option.Boolean(\"--watch\", false)\n library = Option.Boolean(\"--library\", false)\n silent = Option.Boolean(\"--silent\", true)\n noSourceHash = Option.Boolean(\"--no-source-hash\", false)\n\n async execute(): Promise<void> {\n const packageJson = await readPackageJSON()\n\n const highstateConfig = highstateConfigSchema.parse(packageJson.highstate ?? {})\n if (highstateConfig.type === \"library\") {\n this.library = true\n }\n\n if (highstateConfig.type === \"worker\") {\n this.noSourceHash = true\n }\n\n const exports = packageJson.exports\n let bin = packageJson.bin\n\n if (!packageJson.name) {\n throw new Error(\"package.json must have a name field\")\n }\n\n if (!exports && !bin) {\n logger.warn(\"no exports or bin found in package.json\")\n return\n }\n\n if (exports !== undefined && (typeof exports !== \"object\" || Array.isArray(exports))) {\n throw new Error(\"Exports field in package.json must be an object\")\n }\n\n if (bin !== undefined && typeof bin !== \"object\") {\n bin = { [packageJson.name]: bin }\n }\n\n const entry = pipe(\n {\n ...mapValues(exports ?? {}, value => ({ value, isBin: false })),\n ...mapValues(bin ?? {}, value => ({ value, isBin: true })),\n },\n mapValues(({ value, isBin }, key) => {\n let distPath\n\n if (typeof value === \"string\") {\n distPath = value\n } else if (typeof value === \"object\" && !Array.isArray(value)) {\n if (!value.default) {\n throw new Error(`Export \"${key}\" must have a default field in package.json`)\n }\n\n if (typeof value.default !== \"string\") {\n throw new Error(`Export \"${key}\" default field must be a string in package.json`)\n }\n\n distPath = value.default\n } else {\n throw new Error(`Export \"${key}\" must be a string or an object in package.json`)\n }\n\n if (!distPath.startsWith(\"./dist/\")) {\n throw new Error(\n `The default value of export \"${key}\" must start with \"./dist/\" in package.json, got \"${distPath}\"`,\n )\n }\n\n if (!distPath.endsWith(\".js\")) {\n throw new Error(\n `The default value of export \"${key}\" must end with \".js\" in package.json, got \"${distPath}\"`,\n )\n }\n\n const targetName = distPath.slice(7).slice(0, -3)\n\n return {\n entryPoint: `./src/${targetName}.ts`,\n targetName,\n distPath,\n isBin,\n key,\n }\n }),\n mapKeys((_, value) => value.targetName),\n )\n\n const esbuildPlugins: Plugin[] = []\n\n const binSourceFilePaths = Object.values(entry)\n .filter(value => value.isBin)\n .map(value => value.entryPoint.slice(2)) // remove \"./\"\n\n if (this.library) {\n esbuildPlugins.push(schemaTransformerPlugin)\n }\n\n if (binSourceFilePaths.length > 0) {\n esbuildPlugins.push(createBinTransformerPlugin(binSourceFilePaths))\n }\n\n await build({\n entry: mapValues(entry, value => value.entryPoint),\n outDir: \"dist\",\n watch: this.watch,\n sourcemap: true,\n clean: true,\n format: \"esm\",\n target: \"es2024\",\n platform: \"node\",\n external: [\"@pulumi/pulumi\"],\n esbuildPlugins,\n treeshake: true,\n removeNodeProtocol: false,\n silent: this.silent || [\"warn\", \"error\", \"fatal\"].includes(logger.level),\n })\n\n const packageJsonPath = await resolvePackageJSON()\n const upToDatePackageJson = await readPackageJSON()\n\n if (!this.noSourceHash) {\n const sourceHashCalculator = new SourceHashCalculator(\n packageJsonPath,\n upToDatePackageJson,\n logger,\n )\n\n const distPathToExportKey = new Map<string, string>()\n for (const value of Object.values(entry)) {\n distPathToExportKey.set(value.distPath, value.key)\n }\n\n await sourceHashCalculator.writeHighstateManifest(\"./dist\", distPathToExportKey)\n }\n\n // write the \"highstate.library.json\" file if the library flag is set\n if (this.library) {\n const { loadLibrary } = await import(\"../shared/library-loader.js\")\n const fullModulePaths = Object.values(entry).map(value => resolve(value.distPath))\n\n logger.info(\"evaluating library components from modules: %s\", fullModulePaths.join(\", \"))\n\n const library = await loadLibrary(logger, fullModulePaths)\n const libraryPath = resolve(\"./dist\", \"highstate.library.msgpack\")\n\n await writeFile(libraryPath, encode(library), \"utf8\")\n }\n\n logger.info(\"build completed successfully\")\n }\n}\n","import { Command } from \"clipanion\"\nimport { identityToRecipient } from \"age-encryption\"\nimport { logger } from \"../../shared\"\n\nexport class BackendIdentityCommand extends Command {\n static paths = [[\"backend\", \"identity\"]]\n\n static usage = Command.Usage({\n category: \"Backend\",\n description: \"Ensures the backend identity is set up and returns the recipient.\",\n })\n\n async execute(): Promise<void> {\n // do not initialize the backend services here, because the state might not be available yet\n const backendLogger = logger.child({}, { msgPrefix: \"[backend] \" })\n const { getOrCreateBackendIdentity } = await import(\"@highstate/backend\")\n\n const backendIdentity = await getOrCreateBackendIdentity(backendLogger)\n const recipient = await identityToRecipient(backendIdentity)\n\n logger.info(`stored backend identity is: ${recipient}`)\n logger.info(`run \"highstate backend unlock-method add ${recipient}\" on other authorized device`)\n }\n}\n","#!/usr/bin/env node\n\nimport { Builtins, Cli } from \"clipanion\"\nimport { version } from \"../package.json\"\nimport { DesignerCommand } from \"./commands/designer\"\nimport { BuildCommand } from \"./commands/build\"\nimport { BackendIdentityCommand } from \"./commands/backend/identity\"\n\nconst cli = new Cli({\n binaryName: \"highstate\",\n binaryLabel: \"Highstate\",\n binaryVersion: version,\n})\n\ncli.register(BuildCommand)\ncli.register(DesignerCommand)\ncli.register(BackendIdentityCommand)\ncli.register(Builtins.HelpCommand)\ncli.register(Builtins.VersionCommand)\n\nawait cli.runExit(process.argv.slice(2))\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@highstate/cli",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.18",
|
|
4
4
|
"description": "The CLI for the Highstate project.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -20,9 +20,10 @@
|
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@aws-crypto/crc32": "^5.2.0",
|
|
23
|
-
"@highstate/backend": "^0.9.
|
|
24
|
-
"@highstate/contract": "^0.9.
|
|
23
|
+
"@highstate/backend": "^0.9.18",
|
|
24
|
+
"@highstate/contract": "^0.9.18",
|
|
25
25
|
"@msgpack/msgpack": "^3.1.2",
|
|
26
|
+
"@pulumi/pulumi": "^3.184.0",
|
|
26
27
|
"age-encryption": "^0.2.4",
|
|
27
28
|
"ajv": "^8.17.1",
|
|
28
29
|
"clipanion": "^4.0.0-rc.4",
|
|
@@ -40,10 +41,6 @@
|
|
|
40
41
|
"tsup": "^8.4.0",
|
|
41
42
|
"zod": "^4.0.5"
|
|
42
43
|
},
|
|
43
|
-
"peerDependencies": {
|
|
44
|
-
"@pulumi/pulumi": "^3.163.0",
|
|
45
|
-
"classic-level": "^2.0.0"
|
|
46
|
-
},
|
|
47
44
|
"peerDependenciesMeta": {
|
|
48
45
|
"@pulumi/pulumi": {
|
|
49
46
|
"optional": true
|
|
@@ -53,8 +50,8 @@
|
|
|
53
50
|
}
|
|
54
51
|
},
|
|
55
52
|
"devDependencies": {
|
|
56
|
-
"highstate-cli-bootstrap": "
|
|
57
|
-
"vitest": "^2.
|
|
53
|
+
"highstate-cli-bootstrap": "patch:@highstate/cli@npm%3A0.9.16#~/.yarn/patches/@highstate-cli-npm-0.9.16-e03b564691.patch",
|
|
54
|
+
"vitest": "^3.2.4"
|
|
58
55
|
},
|
|
59
|
-
"gitHead": "
|
|
56
|
+
"gitHead": "9ebcd7da56b00b8ca08bf52cc8438f527338cd64"
|
|
60
57
|
}
|
package/src/commands/build.ts
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import type { Logger } from "pino"
|
|
2
|
+
import console from "console"
|
|
2
3
|
import {
|
|
3
4
|
type Component,
|
|
4
5
|
type ComponentModel,
|
|
5
6
|
type Entity,
|
|
7
|
+
type EntityModel,
|
|
6
8
|
isComponent,
|
|
7
9
|
isEntity,
|
|
8
10
|
isUnitModel,
|
|
9
|
-
originalCreate,
|
|
10
11
|
} from "@highstate/contract"
|
|
11
|
-
import { serializeFunction } from "@pulumi/pulumi/runtime/index.js"
|
|
12
12
|
import { Crc32, crc32 } from "@aws-crypto/crc32"
|
|
13
13
|
import { encode } from "@msgpack/msgpack"
|
|
14
|
-
import { int32ToBytes } from "
|
|
14
|
+
import { int32ToBytes } from "./utils"
|
|
15
15
|
|
|
16
16
|
export type Library = Readonly<{
|
|
17
17
|
components: Readonly<Record<string, ComponentModel>>
|
|
18
|
-
entities: Readonly<Record<string,
|
|
18
|
+
entities: Readonly<Record<string, EntityModel>>
|
|
19
19
|
}>
|
|
20
20
|
|
|
21
21
|
export async function loadLibrary(logger: Logger, modulePaths: string[]): Promise<Library> {
|
|
@@ -26,13 +26,15 @@ export async function loadLibrary(logger: Logger, modulePaths: string[]): Promis
|
|
|
26
26
|
modules[modulePath] = await import(modulePath)
|
|
27
27
|
|
|
28
28
|
logger.debug({ modulePath }, "module loaded")
|
|
29
|
-
} catch (
|
|
30
|
-
|
|
29
|
+
} catch (error) {
|
|
30
|
+
console.error(error)
|
|
31
|
+
|
|
32
|
+
throw new Error(`Failed to load module "${modulePath}"`, { cause: error })
|
|
31
33
|
}
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
const components: Record<string, ComponentModel> = {}
|
|
35
|
-
const entities: Record<string,
|
|
37
|
+
const entities: Record<string, EntityModel> = {}
|
|
36
38
|
|
|
37
39
|
await _loadLibrary(modules, components, entities)
|
|
38
40
|
|
|
@@ -52,13 +54,13 @@ export async function loadLibrary(logger: Logger, modulePaths: string[]): Promis
|
|
|
52
54
|
async function _loadLibrary(
|
|
53
55
|
value: unknown,
|
|
54
56
|
components: Record<string, ComponentModel>,
|
|
55
|
-
entities: Record<string,
|
|
57
|
+
entities: Record<string, EntityModel>,
|
|
56
58
|
): Promise<void> {
|
|
57
59
|
if (isComponent(value)) {
|
|
58
60
|
const entityHashes: number[] = []
|
|
59
61
|
for (const entity of value.entities.values()) {
|
|
60
|
-
entity.definitionHash ??= calculateEntityDefinitionHash(entity)
|
|
61
|
-
entityHashes.push(entity.definitionHash)
|
|
62
|
+
entity.model.definitionHash ??= calculateEntityDefinitionHash(entity)
|
|
63
|
+
entityHashes.push(entity.model.definitionHash)
|
|
62
64
|
}
|
|
63
65
|
|
|
64
66
|
components[value.model.type] = value.model
|
|
@@ -68,11 +70,11 @@ async function _loadLibrary(
|
|
|
68
70
|
}
|
|
69
71
|
|
|
70
72
|
if (isEntity(value)) {
|
|
71
|
-
entities[value.type] = value
|
|
73
|
+
entities[value.type] = value.model
|
|
72
74
|
entities[value.type].definitionHash ??= calculateEntityDefinitionHash(value)
|
|
73
75
|
|
|
74
76
|
// @ts-expect-error remove the schema since it's not needed in the designer
|
|
75
|
-
delete value.schema
|
|
77
|
+
delete value.model.schema
|
|
76
78
|
return
|
|
77
79
|
}
|
|
78
80
|
|
|
@@ -80,6 +82,19 @@ async function _loadLibrary(
|
|
|
80
82
|
return
|
|
81
83
|
}
|
|
82
84
|
|
|
85
|
+
if ("_zod" in value) {
|
|
86
|
+
// this is a zod schema, we can skip it
|
|
87
|
+
return
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (Array.isArray(value)) {
|
|
91
|
+
for (const item of value) {
|
|
92
|
+
await _loadLibrary(item, components, entities)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return
|
|
96
|
+
}
|
|
97
|
+
|
|
83
98
|
for (const key in value) {
|
|
84
99
|
await _loadLibrary((value as Record<string, unknown>)[key], components, entities)
|
|
85
100
|
}
|
|
@@ -96,7 +111,8 @@ async function calculateComponentDefinitionHash(
|
|
|
96
111
|
|
|
97
112
|
if (!isUnitModel(component.model)) {
|
|
98
113
|
// 2. for composite components, include the content of the serialized create function
|
|
99
|
-
const serializedCreate = await serializeFunction(component[originalCreate])
|
|
114
|
+
// const serializedCreate = await serializeFunction(component[originalCreate])
|
|
115
|
+
const serializedCreate = { text: "TODO: investigate why serializeFunction hangs" }
|
|
100
116
|
result.update(Buffer.from(serializedCreate.text))
|
|
101
117
|
}
|
|
102
118
|
|
|
@@ -109,5 +125,5 @@ async function calculateComponentDefinitionHash(
|
|
|
109
125
|
}
|
|
110
126
|
|
|
111
127
|
function calculateEntityDefinitionHash(entity: Entity): number {
|
|
112
|
-
return crc32(encode(entity))
|
|
128
|
+
return crc32(encode(entity.model))
|
|
113
129
|
}
|