@dreamboard-games/cli 0.1.30-alpha.2 → 0.1.30-alpha.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/README.md +25 -107
  2. package/dist/agent-verifier/agent-workspace-verifier.mjs +1682 -0
  3. package/dist/agent-verifier/agent-workspace-verifier.mjs.map +1 -0
  4. package/dist/agent-verifier/chunk-22U6RMWO.mjs +722 -0
  5. package/dist/agent-verifier/chunk-22U6RMWO.mjs.map +1 -0
  6. package/dist/agent-verifier/chunk-4I2WWAPK.mjs +399 -0
  7. package/dist/agent-verifier/chunk-4I2WWAPK.mjs.map +1 -0
  8. package/dist/agent-verifier/chunk-BWBN2TDJ.mjs +2811 -0
  9. package/dist/agent-verifier/chunk-BWBN2TDJ.mjs.map +1 -0
  10. package/dist/agent-verifier/chunk-DQUYBIGQ.mjs +353 -0
  11. package/dist/agent-verifier/chunk-DQUYBIGQ.mjs.map +1 -0
  12. package/dist/agent-verifier/chunk-F2DIOJJZ.mjs +302 -0
  13. package/dist/agent-verifier/chunk-F2DIOJJZ.mjs.map +1 -0
  14. package/dist/agent-verifier/chunk-GWRZRWCF.mjs +107 -0
  15. package/dist/agent-verifier/chunk-GWRZRWCF.mjs.map +1 -0
  16. package/dist/agent-verifier/chunk-H6XDQJ3N.mjs +11 -0
  17. package/dist/agent-verifier/chunk-HUBV22JQ.mjs +89 -0
  18. package/dist/agent-verifier/chunk-HUBV22JQ.mjs.map +1 -0
  19. package/dist/agent-verifier/chunk-IWB4L2HV.mjs +273 -0
  20. package/dist/agent-verifier/chunk-IWB4L2HV.mjs.map +1 -0
  21. package/dist/agent-verifier/chunk-JZTH3EMV.mjs +14523 -0
  22. package/dist/agent-verifier/chunk-JZTH3EMV.mjs.map +1 -0
  23. package/dist/agent-verifier/chunk-KDAQ4CZY.mjs +192 -0
  24. package/dist/agent-verifier/chunk-KDAQ4CZY.mjs.map +1 -0
  25. package/dist/agent-verifier/chunk-M7UVBANQ.mjs +58 -0
  26. package/dist/agent-verifier/chunk-M7UVBANQ.mjs.map +1 -0
  27. package/dist/agent-verifier/chunk-MYMVXTZT.mjs +766 -0
  28. package/dist/agent-verifier/chunk-MYMVXTZT.mjs.map +1 -0
  29. package/dist/agent-verifier/chunk-OJFZVGEL.mjs +492 -0
  30. package/dist/agent-verifier/chunk-OJFZVGEL.mjs.map +1 -0
  31. package/dist/agent-verifier/chunk-QD4SQNUP.mjs +75 -0
  32. package/dist/agent-verifier/chunk-QD4SQNUP.mjs.map +1 -0
  33. package/dist/agent-verifier/chunk-RDYXWXXC.mjs +47 -0
  34. package/dist/agent-verifier/chunk-RDYXWXXC.mjs.map +1 -0
  35. package/dist/agent-verifier/chunk-TIDX3YLW.mjs +158 -0
  36. package/dist/agent-verifier/chunk-TIDX3YLW.mjs.map +1 -0
  37. package/dist/agent-verifier/chunk-TTB7AIHZ.mjs +214 -0
  38. package/dist/agent-verifier/chunk-TTB7AIHZ.mjs.map +1 -0
  39. package/dist/agent-verifier/chunk-UXGTT25Q.mjs +59 -0
  40. package/dist/agent-verifier/chunk-UXGTT25Q.mjs.map +1 -0
  41. package/dist/agent-verifier/chunk-YE7UAO3T.mjs +129 -0
  42. package/dist/agent-verifier/chunk-YE7UAO3T.mjs.map +1 -0
  43. package/dist/agent-verifier/chunk-ZEELHSY3.mjs +20 -0
  44. package/dist/agent-verifier/chunk-ZEELHSY3.mjs.map +1 -0
  45. package/dist/agent-verifier/global-config-IXZLY4BS.mjs +19 -0
  46. package/dist/agent-verifier/keychain-backend-UF3Z26JM.mjs +140 -0
  47. package/dist/agent-verifier/keychain-backend-UF3Z26JM.mjs.map +1 -0
  48. package/dist/agent-verifier/local-files-OF4QFISU.mjs +45 -0
  49. package/dist/agent-verifier/local-files-OF4QFISU.mjs.map +1 -0
  50. package/dist/agent-verifier/local-typecheck-DHVLM37Z.mjs +150 -0
  51. package/dist/agent-verifier/local-typecheck-DHVLM37Z.mjs.map +1 -0
  52. package/dist/agent-verifier/materialize-workspace-7DFE45ZH.mjs +90 -0
  53. package/dist/agent-verifier/materialize-workspace-7DFE45ZH.mjs.map +1 -0
  54. package/dist/agent-verifier/project-state-XKUSCFSV.mjs +33 -0
  55. package/dist/agent-verifier/project-state-XKUSCFSV.mjs.map +1 -0
  56. package/dist/agent-verifier/prompt-VKHMCQT6.mjs +756 -0
  57. package/dist/agent-verifier/prompt-VKHMCQT6.mjs.map +1 -0
  58. package/dist/agent-verifier/reducer-bundle-preflight-GLUJKTWU.mjs +312 -0
  59. package/dist/agent-verifier/reducer-bundle-preflight-GLUJKTWU.mjs.map +1 -0
  60. package/dist/agent-verifier/reducer-contract-preflight-WVQQPW5F.mjs +46 -0
  61. package/dist/agent-verifier/reducer-contract-preflight-WVQQPW5F.mjs.map +1 -0
  62. package/dist/agent-verifier/reducer-native-test-harness-H6G6RBRY.mjs +3436 -0
  63. package/dist/agent-verifier/reducer-native-test-harness-H6G6RBRY.mjs.map +1 -0
  64. package/dist/agent-verifier/static-scaffold-CC4KL6K7.mjs +24 -0
  65. package/dist/agent-verifier/static-scaffold-CC4KL6K7.mjs.map +1 -0
  66. package/dist/agent-verifier/workspace-codegen-SPPVHURX.mjs +10 -0
  67. package/dist/agent-verifier/workspace-codegen-SPPVHURX.mjs.map +1 -0
  68. package/dist/agent-verifier/workspace-dependencies-5HEEKZFP.mjs +17 -0
  69. package/dist/agent-verifier/workspace-dependencies-5HEEKZFP.mjs.map +1 -0
  70. package/dist/authoring-compatibility-internal.js +12 -0
  71. package/dist/authoring-compatibility-internal.js.map +1 -0
  72. package/dist/chunk-2H7UOFLK.js +11 -0
  73. package/dist/chunk-2H7UOFLK.js.map +1 -0
  74. package/dist/{chunk-TAQKH67O.js → chunk-2Z65YI7P.js} +2702 -7338
  75. package/dist/chunk-2Z65YI7P.js.map +1 -0
  76. package/dist/chunk-EQNBQVIW.js +204 -0
  77. package/dist/chunk-EQNBQVIW.js.map +1 -0
  78. package/dist/chunk-GQ3ZEAEG.js +4281 -0
  79. package/dist/chunk-GQ3ZEAEG.js.map +1 -0
  80. package/dist/chunk-UI7NWSYA.js +334 -0
  81. package/dist/chunk-UI7NWSYA.js.map +1 -0
  82. package/dist/{global-config-S4ZIPECE.js → global-config-GK2UC2X6.js} +4 -3
  83. package/dist/global-config-GK2UC2X6.js.map +1 -0
  84. package/dist/index.js +3421 -6435
  85. package/dist/index.js.map +1 -1
  86. package/dist/internal.js +15 -9
  87. package/dist/{keychain-backend-HDF4TZDL.js → keychain-backend-GO34KGTG.js} +12 -7
  88. package/dist/keychain-backend-GO34KGTG.js.map +1 -0
  89. package/dist/{prompt-NDV3AE5L.js → prompt-GMZABCJC.js} +2 -2
  90. package/package.json +11 -20
  91. package/release/authoring-release-set.json +38 -0
  92. package/skills/dreamboard/SKILL.md +30 -28
  93. package/skills/dreamboard/references/building-your-first-game.md +15 -15
  94. package/skills/dreamboard/references/cli.md +48 -47
  95. package/skills/dreamboard/references/manifest-authoring.md +11 -3
  96. package/skills/dreamboard/references/quickstart.md +16 -13
  97. package/skills/dreamboard/references/testing.md +10 -10
  98. package/dist/chunk-N7XPNNUI.js +0 -432
  99. package/dist/chunk-N7XPNNUI.js.map +0 -1
  100. package/dist/chunk-SEGVTWSK.js +0 -44
  101. package/dist/chunk-TAQKH67O.js.map +0 -1
  102. package/dist/dev-host/components/drawer.tsx +0 -132
  103. package/dist/dev-host/components/input.tsx +0 -21
  104. package/dist/dev-host/dev-api-proxy-plugin.ts +0 -328
  105. package/dist/dev-host/dev-author-dom-warnings.ts +0 -100
  106. package/dist/dev-host/dev-diagnostics.ts +0 -62
  107. package/dist/dev-host/dev-fallback-stylesheet.ts +0 -53
  108. package/dist/dev-host/dev-hmr-guard-plugin.ts +0 -47
  109. package/dist/dev-host/dev-host-controller.ts +0 -674
  110. package/dist/dev-host/dev-host-player-query.ts +0 -17
  111. package/dist/dev-host/dev-host-session-transport.ts +0 -52
  112. package/dist/dev-host/dev-host-storage.ts +0 -56
  113. package/dist/dev-host/dev-log-relay-plugin.ts +0 -510
  114. package/dist/dev-host/dev-runtime-config.ts +0 -14
  115. package/dist/dev-host/dev-runtime-platform.ts +0 -335
  116. package/dist/dev-host/dev-virtual-modules-plugin.ts +0 -64
  117. package/dist/dev-host/host-main.css +0 -224
  118. package/dist/dev-host/host-main.tsx +0 -948
  119. package/dist/dev-host/index.html +0 -56
  120. package/dist/dev-host/lib/utils.ts +0 -6
  121. package/dist/dev-host/plugin-main.ts +0 -61
  122. package/dist/dev-host/plugin.html +0 -24
  123. package/dist/dev-host/shared-styles.css +0 -144
  124. package/dist/dev-host/start-dev-server.ts +0 -140
  125. package/dist/dev-host/virtual-modules.d.ts +0 -27
  126. package/dist/keychain-backend-HDF4TZDL.js.map +0 -1
  127. package/skills/dreamboard/scripts/events-extract.mjs +0 -218
  128. /package/dist/{chunk-SEGVTWSK.js.map → agent-verifier/chunk-H6XDQJ3N.mjs.map} +0 -0
  129. /package/dist/{global-config-S4ZIPECE.js.map → agent-verifier/global-config-IXZLY4BS.mjs.map} +0 -0
  130. /package/dist/{prompt-NDV3AE5L.js.map → prompt-GMZABCJC.js.map} +0 -0
  131. /package/{dist/scaffold → scaffold}/assets/static/app/tsconfig.framework.json +0 -0
  132. /package/{dist/scaffold → scaffold}/assets/static/app/tsconfig.json +0 -0
  133. /package/{dist/scaffold → scaffold}/assets/static/ui/index.tsx +0 -0
  134. /package/{dist/scaffold → scaffold}/assets/static/ui/style.css +0 -0
  135. /package/{dist/scaffold → scaffold}/assets/static/ui/tsconfig.framework.json +0 -0
  136. /package/{dist/scaffold → scaffold}/assets/static/ui/tsconfig.json +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/project-authoring/validation.ts","../../src/services/project-authoring/contract.ts","../../src/services/project-authoring/loader.ts","../../src/services/project/workspace-path.ts"],"sourcesContent":["import path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport {\n ProjectAuthoringError,\n type GeneratedArtifactV1,\n type ProjectAuthoringAdapterV1,\n} from \"./contract.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isValidGeneratedPath(relativePath: string): boolean {\n if (\n relativePath.length === 0 ||\n relativePath.startsWith(\"/\") ||\n relativePath.includes(\"\\\\\")\n ) {\n return false;\n }\n const normalized = path.posix.normalize(relativePath);\n if (normalized !== relativePath) {\n return false;\n }\n return !relativePath\n .split(\"/\")\n .some((segment) => segment.length === 0 || segment === \".\" || segment === \"..\");\n}\n\nconst ALLOWED_GENERATED_PREFIXES = [\n \"app/\",\n \"shared/\",\n \"test/generated/\",\n \"ui/\",\n] as const;\n\nfunction isAllowedGeneratedPath(relativePath: string): boolean {\n return ALLOWED_GENERATED_PREFIXES.some((prefix) =>\n relativePath.startsWith(prefix),\n );\n}\n\nfunction assertGeneratedPath(pathValue: unknown, label: string): string {\n if (\n typeof pathValue !== \"string\" ||\n !isValidGeneratedPath(pathValue) ||\n !isAllowedGeneratedPath(pathValue)\n ) {\n throw new ProjectAuthoringError(\n \"GENERATED_PATH_CONTRACT_INVALID\",\n `${label} must be a normalized relative workspace path.`,\n );\n }\n return pathValue;\n}\n\nfunction assertGeneratedArtifact(value: unknown): GeneratedArtifactV1 {\n if (!isRecord(value)) {\n throw new ProjectAuthoringError(\n \"GENERATED_PATH_CONTRACT_INVALID\",\n \"Generated artifact must be an object.\",\n );\n }\n const artifactPath = assertGeneratedPath(value.path, \"Generated artifact path\");\n if (\n value.ownership !== \"authoritative\" &&\n value.ownership !== \"seed\" &&\n value.ownership !== \"derived-test\"\n ) {\n throw new ProjectAuthoringError(\n \"GENERATED_PATH_CONTRACT_INVALID\",\n `Generated artifact '${artifactPath}' has invalid ownership.`,\n );\n }\n if (typeof value.content !== \"string\") {\n throw new ProjectAuthoringError(\n \"GENERATED_PATH_CONTRACT_INVALID\",\n `Generated artifact '${artifactPath}' content must be a string.`,\n );\n }\n const expectedHash = createHash(\"sha256\")\n .update(value.content)\n .digest(\"hex\");\n if (value.contentSha256 !== expectedHash) {\n throw new ProjectAuthoringError(\n \"GENERATED_PATH_CONTRACT_INVALID\",\n `Generated artifact '${artifactPath}' has a stale content hash.`,\n );\n }\n return value as GeneratedArtifactV1;\n}\n\nexport function validateProjectAuthoringAdapter(\n adapter: unknown,\n): ProjectAuthoringAdapterV1 {\n if (!isRecord(adapter)) {\n throw new ProjectAuthoringError(\n \"AUTHORING_PROTOCOL_UNSUPPORTED\",\n \"SDK authoring export did not provide an adapter object.\",\n );\n }\n if (adapter.protocolVersion !== 1) {\n throw new ProjectAuthoringError(\n \"AUTHORING_PROTOCOL_UNSUPPORTED\",\n `Unsupported SDK authoring protocol '${String(adapter.protocolVersion)}'.`,\n );\n }\n if (!isRecord(adapter.metadata)) {\n throw new ProjectAuthoringError(\n \"AUTHORING_PROTOCOL_UNSUPPORTED\",\n \"SDK authoring adapter metadata is missing.\",\n );\n }\n for (const key of [\n \"sdkVersion\",\n \"codegenVersion\",\n \"manifestSchemaVersion\",\n \"generatedArtifactSchemaVersion\",\n ] as const) {\n if (\n adapter.metadata[key] === undefined ||\n (key.endsWith(\"Version\") && typeof adapter.metadata[key] !== \"string\" && typeof adapter.metadata[key] !== \"number\")\n ) {\n throw new ProjectAuthoringError(\n \"AUTHORING_PROTOCOL_UNSUPPORTED\",\n `SDK authoring adapter metadata '${key}' is missing.`,\n );\n }\n }\n for (const method of [\n \"validateManifest\",\n \"materializeManifest\",\n \"generateWorkspaceArtifacts\",\n \"generateTestArtifacts\",\n ] as const) {\n if (typeof adapter[method] !== \"function\") {\n throw new ProjectAuthoringError(\n \"AUTHORING_PROTOCOL_UNSUPPORTED\",\n `SDK authoring adapter method '${method}' is missing.`,\n );\n }\n }\n if (!Array.isArray(adapter.generatedPaths)) {\n throw new ProjectAuthoringError(\n \"GENERATED_PATH_CONTRACT_INVALID\",\n \"SDK authoring adapter generatedPaths must be an array.\",\n );\n }\n const seen = new Set<string>();\n for (const [index, generatedPath] of adapter.generatedPaths.entries()) {\n const normalized = assertGeneratedPath(\n generatedPath,\n `generatedPaths[${index}]`,\n );\n if (seen.has(normalized)) {\n throw new ProjectAuthoringError(\n \"GENERATED_PATH_CONTRACT_INVALID\",\n `Generated path '${normalized}' is declared more than once.`,\n );\n }\n seen.add(normalized);\n }\n if (\n adapter.generatedPathPatterns !== undefined &&\n !Array.isArray(adapter.generatedPathPatterns)\n ) {\n throw new ProjectAuthoringError(\n \"GENERATED_PATH_CONTRACT_INVALID\",\n \"SDK authoring adapter generatedPathPatterns must be an array.\",\n );\n }\n for (const [index, pattern] of (\n adapter.generatedPathPatterns ?? []\n ).entries()) {\n if (\n !isRecord(pattern) ||\n typeof pattern.prefix !== \"string\" ||\n typeof pattern.suffix !== \"string\" ||\n !isValidGeneratedPath(`${pattern.prefix}placeholder${pattern.suffix}`) ||\n !isAllowedGeneratedPath(`${pattern.prefix}placeholder${pattern.suffix}`)\n ) {\n throw new ProjectAuthoringError(\n \"GENERATED_PATH_CONTRACT_INVALID\",\n `generatedPathPatterns[${index}] must describe a normalized allowlisted workspace path.`,\n );\n }\n }\n return adapter as ProjectAuthoringAdapterV1;\n}\n\nexport function validateGeneratedArtifacts(\n adapter: ProjectAuthoringAdapterV1,\n artifacts: readonly unknown[],\n): readonly GeneratedArtifactV1[] {\n const seen = new Set<string>();\n const validated = artifacts.map(assertGeneratedArtifact);\n for (const artifact of validated) {\n if (seen.has(artifact.path)) {\n throw new ProjectAuthoringError(\n \"GENERATED_PATH_CONTRACT_INVALID\",\n `Generated artifact path '${artifact.path}' was emitted more than once.`,\n );\n }\n const declared =\n adapter.generatedPaths.includes(artifact.path) ||\n (adapter.generatedPathPatterns ?? []).some(\n (pattern) =>\n artifact.path.startsWith(pattern.prefix) &&\n artifact.path.endsWith(pattern.suffix) &&\n artifact.path.length > pattern.prefix.length + pattern.suffix.length,\n );\n if (!declared) {\n throw new ProjectAuthoringError(\n \"GENERATED_PATH_CONTRACT_INVALID\",\n `Generated artifact path '${artifact.path}' is not declared by the SDK authoring adapter.`,\n );\n }\n seen.add(artifact.path);\n }\n return validated;\n}\n","export type ProjectAuthoringProblemCode =\n | \"SDK_NOT_INSTALLED\"\n | \"AUTHORING_ADAPTER_NOT_EXPORTED\"\n | \"AUTHORING_PROTOCOL_UNSUPPORTED\"\n | \"SDK_METADATA_MISMATCH\"\n | \"GENERATED_PATH_CONTRACT_INVALID\";\n\nexport class ProjectAuthoringError extends Error {\n readonly code: ProjectAuthoringProblemCode;\n\n constructor(code: ProjectAuthoringProblemCode, message: string) {\n super(message);\n this.name = \"ProjectAuthoringError\";\n this.code = code;\n }\n}\n\nexport type GeneratedAuthoringMetadataV1 = {\n sdkVersion: string;\n codegenVersion: string;\n manifestSchemaVersion: number;\n generatedArtifactSchemaVersion: number;\n};\n\nexport type AuthoringValidationResultV1 = {\n valid: boolean;\n errors: readonly string[];\n warnings: readonly string[];\n};\n\nexport type GeneratedArtifactV1 = {\n path: string;\n ownership: \"authoritative\" | \"seed\" | \"derived-test\";\n content: string;\n contentSha256: string;\n};\n\nexport type GeneratedPathPatternV1 = {\n prefix: string;\n suffix: string;\n};\n\nexport type AuthoringManifestConformanceCaseV1 = {\n id: string;\n manifest: unknown;\n expected:\n | {\n valid: true;\n transportValid: true;\n materializedSha256: string;\n }\n | {\n valid: false;\n transportValid: boolean;\n diagnosticCodes: readonly string[];\n };\n};\n\nexport type ProjectAuthoringAdapterV1 = {\n protocolVersion: 1;\n metadata: GeneratedAuthoringMetadataV1;\n generatedPaths: readonly string[];\n generatedPathPatterns?: readonly GeneratedPathPatternV1[];\n manifestConformanceCases: readonly AuthoringManifestConformanceCaseV1[];\n validateManifest(manifest: unknown): AuthoringValidationResultV1;\n materializeManifest(manifest: unknown): unknown;\n generateWorkspaceArtifacts(manifest: unknown): readonly GeneratedArtifactV1[];\n generateTestArtifacts(input: {\n manifest: unknown;\n }): readonly GeneratedArtifactV1[];\n};\n\nexport type LoadedProjectAuthoringAdapterV1 = {\n packageRoot: string;\n packageVersion: string;\n adapterPath: string;\n adapter: ProjectAuthoringAdapterV1;\n};\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { pathToFileURL } from \"node:url\";\nimport {\n ProjectAuthoringError,\n type LoadedProjectAuthoringAdapterV1,\n} from \"./contract.js\";\nimport { validateProjectAuthoringAdapter } from \"./validation.js\";\n\ntype PackageJson = {\n name?: string;\n version?: string;\n exports?: unknown;\n};\n\ntype ResolvedProjectAuthoringAdapter = {\n packageJsonPath: string;\n adapterPath: string;\n};\n\nconst PROJECT_SDK_RESOLUTION_RETRY_DELAYS_MS = [50, 150, 300] as const;\n\nfunction problemFromResolveError(error: unknown): ProjectAuthoringError {\n if (error instanceof ProjectAuthoringError) {\n return error;\n }\n const code =\n (error as NodeJS.ErrnoException | undefined)?.code ===\n \"ERR_PACKAGE_PATH_NOT_EXPORTED\"\n ? \"AUTHORING_ADAPTER_NOT_EXPORTED\"\n : \"SDK_NOT_INSTALLED\";\n return new ProjectAuthoringError(\n code,\n code === \"AUTHORING_ADAPTER_NOT_EXPORTED\"\n ? \"Installed @dreamboard-games/sdk does not export @dreamboard-games/sdk/authoring.\"\n : \"Install @dreamboard-games/sdk in this workspace before running authoring commands.\",\n );\n}\n\nfunction assertResolvedInsidePackage(options: {\n packageRoot: string;\n resolvedPath: string;\n label: string;\n}): void {\n const packageRoot = path.resolve(options.packageRoot);\n const resolvedPath = path.resolve(options.resolvedPath);\n const relative = path.relative(packageRoot, resolvedPath);\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new ProjectAuthoringError(\n \"AUTHORING_ADAPTER_NOT_EXPORTED\",\n `${options.label} resolved outside the installed @dreamboard-games/sdk package.`,\n );\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction resolveExportTarget(value: unknown): string | null {\n if (typeof value === \"string\") {\n return value;\n }\n if (!isRecord(value)) {\n return null;\n }\n for (const condition of [\"import\", \"default\"]) {\n const resolved = resolveExportTarget(value[condition]);\n if (resolved) {\n return resolved;\n }\n }\n return null;\n}\n\nasync function resolveDirectProjectAuthoringAdapter(\n projectRoot: string,\n): Promise<ResolvedProjectAuthoringAdapter | null> {\n const packageRoot = path.join(\n projectRoot,\n \"node_modules\",\n \"@dreamboard-games\",\n \"sdk\",\n );\n const packageJsonPath = path.join(packageRoot, \"package.json\");\n let packageJson: PackageJson;\n try {\n packageJson = JSON.parse(await readFile(packageJsonPath, \"utf8\")) as PackageJson;\n } catch {\n return null;\n }\n const authoringExport = isRecord(packageJson.exports)\n ? resolveExportTarget(packageJson.exports[\"./authoring\"])\n : null;\n if (!authoringExport) {\n throw new ProjectAuthoringError(\n \"AUTHORING_ADAPTER_NOT_EXPORTED\",\n \"Installed @dreamboard-games/sdk does not export @dreamboard-games/sdk/authoring.\",\n );\n }\n const adapterPath = path.resolve(packageRoot, authoringExport);\n assertResolvedInsidePackage({\n packageRoot,\n resolvedPath: adapterPath,\n label: \"@dreamboard-games/sdk/authoring\",\n });\n return { packageJsonPath, adapterPath };\n}\n\nasync function resolveProjectAuthoringAdapter(\n projectRoot: string,\n): Promise<ResolvedProjectAuthoringAdapter> {\n const requireFromProject = createRequire(path.join(projectRoot, \"package.json\"));\n let lastError: unknown;\n\n for (\n let attempt = 0;\n attempt <= PROJECT_SDK_RESOLUTION_RETRY_DELAYS_MS.length;\n attempt += 1\n ) {\n try {\n const packageJsonPath = requireFromProject.resolve(\n \"@dreamboard-games/sdk/package.json\",\n );\n const adapterPath = requireFromProject.resolve(\n \"@dreamboard-games/sdk/authoring\",\n );\n return { packageJsonPath, adapterPath };\n } catch (error) {\n lastError = error;\n if (\n (error as NodeJS.ErrnoException | undefined)?.code ===\n \"ERR_PACKAGE_PATH_NOT_EXPORTED\"\n ) {\n throw error;\n }\n const directResolved =\n await resolveDirectProjectAuthoringAdapter(projectRoot);\n if (directResolved) {\n return directResolved;\n }\n const retryDelay = PROJECT_SDK_RESOLUTION_RETRY_DELAYS_MS[attempt];\n if (retryDelay === undefined) {\n break;\n }\n await delay(retryDelay);\n }\n }\n\n throw lastError;\n}\n\nexport async function loadProjectAuthoringAdapter(\n projectRoot: string,\n): Promise<LoadedProjectAuthoringAdapterV1> {\n let packageJsonPath: string;\n let adapterPath: string;\n try {\n ({ packageJsonPath, adapterPath } =\n await resolveProjectAuthoringAdapter(projectRoot));\n } catch (error) {\n throw problemFromResolveError(error);\n }\n\n const packageRoot = path.dirname(packageJsonPath);\n assertResolvedInsidePackage({\n packageRoot,\n resolvedPath: adapterPath,\n label: \"@dreamboard-games/sdk/authoring\",\n });\n\n const packageJson = JSON.parse(\n await readFile(packageJsonPath, \"utf8\"),\n ) as PackageJson;\n if (\n packageJson.name !== \"@dreamboard-games/sdk\" ||\n typeof packageJson.version !== \"string\" ||\n packageJson.version.trim().length === 0\n ) {\n throw new ProjectAuthoringError(\n \"SDK_METADATA_MISMATCH\",\n \"Installed SDK package metadata is invalid.\",\n );\n }\n\n const moduleRecord = (await import(pathToFileURL(adapterPath).href)) as {\n projectAuthoringAdapter?: unknown;\n default?: unknown;\n };\n const adapter = validateProjectAuthoringAdapter(\n moduleRecord.projectAuthoringAdapter ?? moduleRecord.default,\n );\n if (adapter.metadata.sdkVersion !== packageJson.version) {\n throw new ProjectAuthoringError(\n \"SDK_METADATA_MISMATCH\",\n `SDK authoring adapter reports version ${adapter.metadata.sdkVersion}, but package metadata is ${packageJson.version}.`,\n );\n }\n\n return {\n packageRoot,\n packageVersion: packageJson.version,\n adapterPath,\n adapter,\n };\n}\n","import {\n mkdir,\n readFile,\n realpath,\n rm,\n stat,\n unlink,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\n\nconst CONTROL_CHARS = /[\\x00-\\x1f\\x7f]/;\nconst URL_SCHEME = /^[A-Za-z][A-Za-z0-9+.-]*:/;\nconst WINDOWS_DEVICE_NAME = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\\..*)?$/i;\nconst ENCODED_SEPARATOR = /%(?:2f|5c)/i;\n\nfunction isWindowsDeviceSegment(segment: string): boolean {\n return WINDOWS_DEVICE_NAME.test(segment.replace(/[. ]+$/g, \"\"));\n}\n\nfunction isPathInside(parent: string, candidate: string): boolean {\n const relative = path.relative(parent, candidate);\n return (\n relative === \"\" ||\n (!relative.startsWith(\"..\") && !path.isAbsolute(relative))\n );\n}\n\nfunction assertContained(\n parent: string,\n candidate: string,\n label: string,\n): void {\n if (!isPathInside(parent, candidate)) {\n throw new Error(`${label} escapes the workspace.`);\n }\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === \"ENOENT\"\n );\n}\n\nexport function normalizeOwnedProjectPath(input: string): string | null {\n if (\n input.length === 0 ||\n input.trim().length === 0 ||\n input.startsWith(\"/\") ||\n input.includes(\"\\\\\") ||\n input.includes(\":\") ||\n URL_SCHEME.test(input) ||\n CONTROL_CHARS.test(input) ||\n ENCODED_SEPARATOR.test(input) ||\n path.win32.isAbsolute(input)\n ) {\n return null;\n }\n\n const segments = input.split(\"/\");\n if (\n segments.some(\n (segment) =>\n segment.length === 0 ||\n segment.trim().length === 0 ||\n segment === \".\" ||\n segment === \"..\" ||\n isWindowsDeviceSegment(segment),\n )\n ) {\n return null;\n }\n\n return segments.join(\"/\");\n}\n\nexport function resolveWorkspacePath(\n rootDir: string,\n projectPath: string,\n): string {\n const normalized = normalizeOwnedProjectPath(projectPath);\n if (normalized === null) {\n throw new Error(`Unsafe project path: ${projectPath}`);\n }\n\n const rootPath = path.resolve(rootDir);\n const resolvedPath = path.resolve(rootPath, normalized);\n assertContained(rootPath, resolvedPath, `Project path ${projectPath}`);\n return resolvedPath;\n}\n\nasync function realpathIfExists(filePath: string): Promise<string | null> {\n try {\n return await realpath(filePath);\n } catch (error) {\n if (isMissingFileError(error)) return null;\n throw error;\n }\n}\n\nasync function nearestExistingAncestor(filePath: string): Promise<string> {\n let current = filePath;\n while (true) {\n try {\n await stat(current);\n return current;\n } catch (error) {\n if (!isMissingFileError(error)) throw error;\n const parent = path.dirname(current);\n if (parent === current) throw error;\n current = parent;\n }\n }\n}\n\nasync function assertRealpathContained(\n rootDir: string,\n filePath: string,\n label: string,\n): Promise<void> {\n const rootRealpath = await realpath(rootDir);\n const targetRealpath = await realpath(filePath);\n assertContained(rootRealpath, targetRealpath, label);\n}\n\nasync function assertNearestParentContained(\n rootDir: string,\n filePath: string,\n label: string,\n): Promise<void> {\n const rootRealpath = await realpath(rootDir);\n const nearestParent = await nearestExistingAncestor(path.dirname(filePath));\n const nearestParentRealpath = await realpath(nearestParent);\n assertContained(rootRealpath, nearestParentRealpath, label);\n}\n\nasync function assertExistingTargetContained(\n rootDir: string,\n filePath: string,\n label: string,\n): Promise<void> {\n const targetRealpath = await realpathIfExists(filePath);\n if (targetRealpath === null) return;\n const rootRealpath = await realpath(rootDir);\n assertContained(rootRealpath, targetRealpath, label);\n}\n\nasync function prepareWorkspaceWriteTarget(\n rootDir: string,\n filePath: string,\n): Promise<void> {\n await assertNearestParentContained(rootDir, filePath, \"Project path\");\n await mkdir(path.dirname(filePath), { recursive: true });\n await assertRealpathContained(\n rootDir,\n path.dirname(filePath),\n \"Project path\",\n );\n await assertExistingTargetContained(rootDir, filePath, \"Project path\");\n}\n\nexport async function readWorkspaceTextFile(\n rootDir: string,\n projectPath: string,\n): Promise<string> {\n const filePath = resolveWorkspacePath(rootDir, projectPath);\n await assertExistingTargetContained(rootDir, filePath, \"Project path\");\n return readFile(filePath, \"utf8\");\n}\n\nexport async function readWorkspaceTextFileIfExists(\n rootDir: string,\n projectPath: string,\n): Promise<string | null> {\n const filePath = resolveWorkspacePath(rootDir, projectPath);\n const targetRealpath = await realpathIfExists(filePath);\n if (targetRealpath === null) return null;\n const rootRealpath = await realpath(rootDir);\n assertContained(rootRealpath, targetRealpath, \"Project path\");\n return readFile(filePath, \"utf8\");\n}\n\nexport async function writeWorkspaceTextFile(\n rootDir: string,\n projectPath: string,\n content: string,\n): Promise<void> {\n const filePath = resolveWorkspacePath(rootDir, projectPath);\n await prepareWorkspaceWriteTarget(rootDir, filePath);\n await writeFile(filePath, content, \"utf8\");\n}\n\nexport async function writeWorkspaceJsonFile(\n rootDir: string,\n projectPath: string,\n data: unknown,\n): Promise<void> {\n await writeWorkspaceTextFile(\n rootDir,\n projectPath,\n `${JSON.stringify(data, null, 2)}\\n`,\n );\n}\n\nexport async function workspacePathExists(\n rootDir: string,\n projectPath: string,\n): Promise<boolean> {\n const filePath = resolveWorkspacePath(rootDir, projectPath);\n const targetRealpath = await realpathIfExists(filePath);\n if (targetRealpath === null) return false;\n const rootRealpath = await realpath(rootDir);\n assertContained(rootRealpath, targetRealpath, \"Project path\");\n return true;\n}\n\nexport async function unlinkWorkspaceFile(\n rootDir: string,\n projectPath: string,\n): Promise<void> {\n const filePath = resolveWorkspacePath(rootDir, projectPath);\n await assertNearestParentContained(rootDir, filePath, \"Project path\");\n await assertExistingTargetContained(rootDir, filePath, \"Project path\");\n await unlink(filePath);\n}\n\nexport async function removeWorkspacePath(\n rootDir: string,\n projectPath: string,\n options: { recursive?: boolean; force?: boolean } = {},\n): Promise<void> {\n const filePath = resolveWorkspacePath(rootDir, projectPath);\n await assertNearestParentContained(rootDir, filePath, \"Project path\");\n await assertExistingTargetContained(rootDir, filePath, \"Project path\");\n await rm(filePath, options);\n}\n"],"mappings":"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","names":["path","path","isRecord","readFile","path"]}
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ createRepoLocalPackageResolutionPlugin,
4
+ resolveCliRepoRoot
5
+ } from "./chunk-TTB7AIHZ.mjs";
6
+
7
+ // src/utils/ts-module-loader.ts
8
+ import { mkdtemp, rm, writeFile } from "fs/promises";
9
+ import { tmpdir } from "os";
10
+ import path from "path";
11
+ import { pathToFileURL } from "url";
12
+ import { build } from "esbuild";
13
+ var ESBUILD_EXTERNALS = [
14
+ "playwright",
15
+ "playwright-core",
16
+ "chromium-bidi",
17
+ "electron"
18
+ ];
19
+ function resolveSourceCheckoutBuildContext() {
20
+ try {
21
+ const repoRoot = resolveCliRepoRoot(import.meta.url);
22
+ return {
23
+ nodePaths: [
24
+ path.join(repoRoot, "apps", "dreamboard-cli", "node_modules"),
25
+ path.join(repoRoot, "node_modules")
26
+ ],
27
+ plugins: [createRepoLocalPackageResolutionPlugin({ repoRoot })]
28
+ };
29
+ } catch {
30
+ return {
31
+ nodePaths: [path.join(process.cwd(), "node_modules")],
32
+ plugins: []
33
+ };
34
+ }
35
+ }
36
+ async function bundleTypeScriptModuleText(entryPath, options = {}) {
37
+ const sourceCheckoutContext = resolveSourceCheckoutBuildContext();
38
+ const result = await build({
39
+ entryPoints: [entryPath],
40
+ bundle: true,
41
+ format: "esm",
42
+ platform: "node",
43
+ target: "node24",
44
+ sourcemap: "inline",
45
+ external: [...ESBUILD_EXTERNALS, ...options.external ?? []],
46
+ nodePaths: sourceCheckoutContext.nodePaths,
47
+ plugins: sourceCheckoutContext.plugins,
48
+ write: false
49
+ });
50
+ const output = result.outputFiles?.[0];
51
+ if (!output) {
52
+ throw new Error(`Failed to bundle TypeScript module '${entryPath}'.`);
53
+ }
54
+ return output.text;
55
+ }
56
+ async function importTypeScriptModule(entryPath) {
57
+ const tempDir = await mkdtemp(path.join(tmpdir(), "dreamboard-ts-module-"));
58
+ const outfile = path.join(
59
+ tempDir,
60
+ `${path.basename(entryPath).replace(/\.[^.]+$/u, "")}.mjs`
61
+ );
62
+ try {
63
+ const bundledText = await bundleTypeScriptModuleText(entryPath);
64
+ await writeFile(outfile, bundledText);
65
+ return await import(pathToFileURL(outfile).href);
66
+ } finally {
67
+ await rm(tempDir, { recursive: true, force: true });
68
+ }
69
+ }
70
+
71
+ export {
72
+ bundleTypeScriptModuleText,
73
+ importTypeScriptModule
74
+ };
75
+ //# sourceMappingURL=chunk-QD4SQNUP.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/ts-module-loader.ts"],"sourcesContent":["import { mkdtemp, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { build } from \"esbuild\";\nimport { resolveCliRepoRoot } from \"./repo-root.js\";\nimport { createRepoLocalPackageResolutionPlugin } from \"./repo-local-package-resolution.js\";\n\nconst ESBUILD_EXTERNALS = [\n \"playwright\",\n \"playwright-core\",\n \"chromium-bidi\",\n \"electron\",\n];\n\nfunction resolveSourceCheckoutBuildContext(): {\n nodePaths: string[];\n plugins: ReturnType<typeof createRepoLocalPackageResolutionPlugin>[];\n} {\n try {\n const repoRoot = resolveCliRepoRoot(import.meta.url);\n return {\n nodePaths: [\n path.join(repoRoot, \"apps\", \"dreamboard-cli\", \"node_modules\"),\n path.join(repoRoot, \"node_modules\"),\n ],\n plugins: [createRepoLocalPackageResolutionPlugin({ repoRoot })],\n };\n } catch {\n return {\n nodePaths: [path.join(process.cwd(), \"node_modules\")],\n plugins: [],\n };\n }\n}\n\nexport async function bundleTypeScriptModuleText(\n entryPath: string,\n options: { external?: readonly string[] } = {},\n): Promise<string> {\n const sourceCheckoutContext = resolveSourceCheckoutBuildContext();\n const result = await build({\n entryPoints: [entryPath],\n bundle: true,\n format: \"esm\",\n platform: \"node\",\n target: \"node24\",\n sourcemap: \"inline\",\n external: [...ESBUILD_EXTERNALS, ...(options.external ?? [])],\n nodePaths: sourceCheckoutContext.nodePaths,\n plugins: sourceCheckoutContext.plugins,\n write: false,\n });\n\n const output = result.outputFiles?.[0];\n if (!output) {\n throw new Error(`Failed to bundle TypeScript module '${entryPath}'.`);\n }\n return output.text;\n}\n\nexport async function importTypeScriptModule<T>(entryPath: string): Promise<T> {\n const tempDir = await mkdtemp(path.join(tmpdir(), \"dreamboard-ts-module-\"));\n const outfile = path.join(\n tempDir,\n `${path.basename(entryPath).replace(/\\.[^.]+$/u, \"\")}.mjs`,\n );\n\n try {\n const bundledText = await bundleTypeScriptModuleText(entryPath);\n await writeFile(outfile, bundledText);\n\n return (await import(pathToFileURL(outfile).href)) as T;\n } finally {\n await rm(tempDir, { recursive: true, force: true });\n }\n}\n"],"mappings":";;;;;;;AAAA,SAAS,SAAS,IAAI,iBAAiB;AACvC,SAAS,cAAc;AACvB,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAC9B,SAAS,aAAa;AAItB,IAAM,oBAAoB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,oCAGP;AACA,MAAI;AACF,UAAM,WAAW,mBAAmB,YAAY,GAAG;AACnD,WAAO;AAAA,MACL,WAAW;AAAA,QACT,KAAK,KAAK,UAAU,QAAQ,kBAAkB,cAAc;AAAA,QAC5D,KAAK,KAAK,UAAU,cAAc;AAAA,MACpC;AAAA,MACA,SAAS,CAAC,uCAAuC,EAAE,SAAS,CAAC,CAAC;AAAA,IAChE;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,WAAW,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,cAAc,CAAC;AAAA,MACpD,SAAS,CAAC;AAAA,IACZ;AAAA,EACF;AACF;AAEA,eAAsB,2BACpB,WACA,UAA4C,CAAC,GAC5B;AACjB,QAAM,wBAAwB,kCAAkC;AAChE,QAAM,SAAS,MAAM,MAAM;AAAA,IACzB,aAAa,CAAC,SAAS;AAAA,IACvB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,UAAU,CAAC,GAAG,mBAAmB,GAAI,QAAQ,YAAY,CAAC,CAAE;AAAA,IAC5D,WAAW,sBAAsB;AAAA,IACjC,SAAS,sBAAsB;AAAA,IAC/B,OAAO;AAAA,EACT,CAAC;AAED,QAAM,SAAS,OAAO,cAAc,CAAC;AACrC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,uCAAuC,SAAS,IAAI;AAAA,EACtE;AACA,SAAO,OAAO;AAChB;AAEA,eAAsB,uBAA0B,WAA+B;AAC7E,QAAM,UAAU,MAAM,QAAQ,KAAK,KAAK,OAAO,GAAG,uBAAuB,CAAC;AAC1E,QAAM,UAAU,KAAK;AAAA,IACnB;AAAA,IACA,GAAG,KAAK,SAAS,SAAS,EAAE,QAAQ,aAAa,EAAE,CAAC;AAAA,EACtD;AAEA,MAAI;AACF,UAAM,cAAc,MAAM,2BAA2B,SAAS;AAC9D,UAAM,UAAU,SAAS,WAAW;AAEpC,WAAQ,MAAM,OAAO,cAAc,OAAO,EAAE;AAAA,EAC9C,UAAE;AACA,UAAM,GAAG,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACpD;AACF;","names":[]}
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/utils/fs.ts
4
+ import { mkdir, readFile, stat, writeFile } from "fs/promises";
5
+ import path from "path";
6
+ async function ensureDir(dirPath) {
7
+ await mkdir(dirPath, { recursive: true });
8
+ }
9
+ async function exists(filePath) {
10
+ try {
11
+ await stat(filePath);
12
+ return true;
13
+ } catch {
14
+ return false;
15
+ }
16
+ }
17
+ async function readTextFile(filePath) {
18
+ return readFile(filePath, "utf8");
19
+ }
20
+ async function readTextFileIfExists(filePath) {
21
+ try {
22
+ return await readFile(filePath, "utf8");
23
+ } catch {
24
+ return null;
25
+ }
26
+ }
27
+ async function writeTextFile(filePath, content) {
28
+ await ensureDir(path.dirname(filePath));
29
+ await writeFile(filePath, content, "utf8");
30
+ }
31
+ async function readJsonFile(filePath) {
32
+ const data = await readTextFile(filePath);
33
+ return JSON.parse(data);
34
+ }
35
+ async function writeJsonFile(filePath, data) {
36
+ await writeTextFile(filePath, `${JSON.stringify(data, null, 2)}
37
+ `);
38
+ }
39
+
40
+ export {
41
+ ensureDir,
42
+ exists,
43
+ readTextFileIfExists,
44
+ readJsonFile,
45
+ writeJsonFile
46
+ };
47
+ //# sourceMappingURL=chunk-RDYXWXXC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/fs.ts"],"sourcesContent":["import { mkdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport async function ensureDir(dirPath: string): Promise<void> {\n await mkdir(dirPath, { recursive: true });\n}\n\nexport async function exists(filePath: string): Promise<boolean> {\n try {\n await stat(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readTextFile(filePath: string): Promise<string> {\n return readFile(filePath, \"utf8\");\n}\n\nexport async function readTextFileIfExists(\n filePath: string,\n): Promise<string | null> {\n try {\n return await readFile(filePath, \"utf8\");\n } catch {\n return null;\n }\n}\n\nexport async function writeTextFile(\n filePath: string,\n content: string,\n): Promise<void> {\n await ensureDir(path.dirname(filePath));\n await writeFile(filePath, content, \"utf8\");\n}\n\nexport async function readJsonFile<T>(filePath: string): Promise<T> {\n const data = await readTextFile(filePath);\n return JSON.parse(data) as T;\n}\n\nexport async function writeJsonFile(\n filePath: string,\n data: unknown,\n): Promise<void> {\n await writeTextFile(filePath, `${JSON.stringify(data, null, 2)}\\n`);\n}\n"],"mappings":";;;AAAA,SAAS,OAAO,UAAU,MAAM,iBAAiB;AACjD,OAAO,UAAU;AAEjB,eAAsB,UAAU,SAAgC;AAC9D,QAAM,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAC1C;AAEA,eAAsB,OAAO,UAAoC;AAC/D,MAAI;AACF,UAAM,KAAK,QAAQ;AACnB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,aAAa,UAAmC;AACpE,SAAO,SAAS,UAAU,MAAM;AAClC;AAEA,eAAsB,qBACpB,UACwB;AACxB,MAAI;AACF,WAAO,MAAM,SAAS,UAAU,MAAM;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,cACpB,UACA,SACe;AACf,QAAM,UAAU,KAAK,QAAQ,QAAQ,CAAC;AACtC,QAAM,UAAU,UAAU,SAAS,MAAM;AAC3C;AAEA,eAAsB,aAAgB,UAA8B;AAClE,QAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,SAAO,KAAK,MAAM,IAAI;AACxB;AAEA,eAAsB,cACpB,UACA,MACe;AACf,QAAM,cAAc,UAAU,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,CAAI;AACpE;","names":[]}
@@ -0,0 +1,158 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ atomicWriteFile
4
+ } from "./chunk-GWRZRWCF.mjs";
5
+ import {
6
+ ensureDir,
7
+ exists,
8
+ readJsonFile
9
+ } from "./chunk-RDYXWXXC.mjs";
10
+ import {
11
+ PROJECT_CONFIG_FILE,
12
+ PROJECT_DIR_NAME,
13
+ PROJECT_STATE_FILE
14
+ } from "./chunk-M7UVBANQ.mjs";
15
+
16
+ // src/config/project-config.ts
17
+ import path from "path";
18
+ var LEGACY_DEFAULT_DEPLOYMENT_ID = "legacy";
19
+ var LEGACY_DEFAULT_OWNER_SCOPE_ID = "default";
20
+ var LEGACY_DEFAULT_BINDING_KEY = `${LEGACY_DEFAULT_DEPLOYMENT_ID}:${LEGACY_DEFAULT_OWNER_SCOPE_ID}`;
21
+ function normalizeProjectManifest(config) {
22
+ return {
23
+ schemaVersion: 2,
24
+ projectId: config.projectId,
25
+ slug: config.slug
26
+ };
27
+ }
28
+ function normalizeProjectBinding(config) {
29
+ return {
30
+ deploymentId: config.deploymentId ?? LEGACY_DEFAULT_DEPLOYMENT_ID,
31
+ ownerScopeId: config.ownerScopeId ?? LEGACY_DEFAULT_OWNER_SCOPE_ID,
32
+ gameId: config.gameId,
33
+ remoteHeadDigest: config.remoteHeadDigest,
34
+ jobId: config.jobId,
35
+ agentManaged: config.agentManaged,
36
+ workspacePrepared: config.workspacePrepared,
37
+ allowCreateGame: config.allowCreateGame,
38
+ environment: config.environment,
39
+ authoring: config.authoring,
40
+ compile: config.compile,
41
+ localMaintainerRegistry: config.localMaintainerRegistry,
42
+ apiBaseUrl: config.apiBaseUrl,
43
+ webBaseUrl: config.webBaseUrl,
44
+ packageManifest: config.packageManifest,
45
+ environmentManifest: config.environmentManifest
46
+ };
47
+ }
48
+ function normalizeProjectState(config, existing) {
49
+ const binding = normalizeProjectBinding(config);
50
+ const bindingKey = config.bindingKey || `${binding.deploymentId}:${binding.ownerScopeId}`;
51
+ return {
52
+ schemaVersion: 1,
53
+ bindings: {
54
+ ...existing?.bindings ?? {},
55
+ [bindingKey]: binding
56
+ }
57
+ };
58
+ }
59
+ function mergeManifestAndBinding(manifest, binding, bindingKey) {
60
+ return {
61
+ ...manifest,
62
+ ...binding ?? {
63
+ deploymentId: LEGACY_DEFAULT_DEPLOYMENT_ID,
64
+ ownerScopeId: LEGACY_DEFAULT_OWNER_SCOPE_ID
65
+ },
66
+ gameId: binding?.gameId ?? manifest.projectId,
67
+ bindingKey: bindingKey ?? `${binding?.deploymentId ?? LEGACY_DEFAULT_DEPLOYMENT_ID}:${binding?.ownerScopeId ?? LEGACY_DEFAULT_OWNER_SCOPE_ID}`
68
+ };
69
+ }
70
+ function isProjectManifestV2(value) {
71
+ const candidate = value;
72
+ return candidate?.schemaVersion === 2 && typeof candidate.projectId === "string" && typeof candidate.slug === "string";
73
+ }
74
+ function normalizeLegacyProjectConfig(config) {
75
+ return {
76
+ schemaVersion: 2,
77
+ projectId: config.projectId ?? config.gameId,
78
+ slug: config.slug,
79
+ bindingKey: LEGACY_DEFAULT_BINDING_KEY,
80
+ deploymentId: LEGACY_DEFAULT_DEPLOYMENT_ID,
81
+ ownerScopeId: LEGACY_DEFAULT_OWNER_SCOPE_ID,
82
+ gameId: config.gameId,
83
+ jobId: config.jobId,
84
+ agentManaged: config.agentManaged,
85
+ workspacePrepared: config.workspacePrepared,
86
+ allowCreateGame: config.allowCreateGame,
87
+ environment: config.environment,
88
+ authoring: config.authoring,
89
+ compile: config.compile,
90
+ localMaintainerRegistry: config.localMaintainerRegistry,
91
+ apiBaseUrl: config.apiBaseUrl,
92
+ webBaseUrl: config.webBaseUrl,
93
+ packageManifest: config.packageManifest,
94
+ environmentManifest: config.environmentManifest
95
+ };
96
+ }
97
+ async function loadProjectEnvironmentState(rootDir) {
98
+ const filePath = path.join(rootDir, PROJECT_DIR_NAME, PROJECT_STATE_FILE);
99
+ if (!await exists(filePath)) {
100
+ return { schemaVersion: 1, bindings: {} };
101
+ }
102
+ const state = await readJsonFile(filePath);
103
+ return state.schemaVersion === 1 && state.bindings ? state : { schemaVersion: 1, bindings: {} };
104
+ }
105
+ async function loadProjectConfig(rootDir) {
106
+ const filePath = path.join(rootDir, PROJECT_DIR_NAME, PROJECT_CONFIG_FILE);
107
+ const rawConfig = await readJsonFile(
108
+ filePath
109
+ );
110
+ if (!isProjectManifestV2(rawConfig)) {
111
+ const migrated = normalizeLegacyProjectConfig(
112
+ rawConfig
113
+ );
114
+ await updateProjectState(rootDir, migrated);
115
+ return migrated;
116
+ }
117
+ const state = await loadProjectEnvironmentState(rootDir);
118
+ const entries = Object.entries(state.bindings);
119
+ const [bindingKey, binding] = entries.find(([key]) => key !== LEGACY_DEFAULT_BINDING_KEY) ?? entries.find(([key]) => key === LEGACY_DEFAULT_BINDING_KEY) ?? [];
120
+ return mergeManifestAndBinding(rawConfig, binding, bindingKey);
121
+ }
122
+ async function updateProjectState(rootDir, config) {
123
+ const dir = path.join(rootDir, PROJECT_DIR_NAME);
124
+ await ensureDir(dir);
125
+ const existingState = await loadProjectEnvironmentState(rootDir);
126
+ await atomicWriteFile(
127
+ path.join(dir, PROJECT_CONFIG_FILE),
128
+ `${JSON.stringify(normalizeProjectManifest(config), null, 2)}
129
+ `,
130
+ { mode: 420 }
131
+ );
132
+ await atomicWriteFile(
133
+ path.join(dir, PROJECT_STATE_FILE),
134
+ `${JSON.stringify(normalizeProjectState(config, existingState), null, 2)}
135
+ `,
136
+ { mode: 384 }
137
+ );
138
+ }
139
+ async function findProjectRoot(startDir) {
140
+ let current = path.resolve(startDir);
141
+ for (let i = 0; i < 25; i++) {
142
+ const candidate = path.join(current, PROJECT_DIR_NAME, PROJECT_CONFIG_FILE);
143
+ if (await exists(candidate)) {
144
+ return current;
145
+ }
146
+ const parent = path.dirname(current);
147
+ if (parent === current) break;
148
+ current = parent;
149
+ }
150
+ return null;
151
+ }
152
+
153
+ export {
154
+ loadProjectConfig,
155
+ updateProjectState,
156
+ findProjectRoot
157
+ };
158
+ //# sourceMappingURL=chunk-TIDX3YLW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/config/project-config.ts"],"sourcesContent":["import path from \"node:path\";\nimport type {\n LegacyProjectConfigV1,\n ProjectConfig,\n ProjectEnvironmentBindingV1,\n ProjectEnvironmentStateV1,\n ProjectManifestV2,\n} from \"../types.js\";\nimport {\n PROJECT_DIR_NAME,\n PROJECT_CONFIG_FILE,\n PROJECT_STATE_FILE,\n} from \"../constants.js\";\nimport { ensureDir, exists, readJsonFile } from \"../utils/fs.js\";\nimport { atomicWriteFile } from \"../utils/atomic-file.js\";\n\nconst LEGACY_DEFAULT_DEPLOYMENT_ID = \"legacy\";\nconst LEGACY_DEFAULT_OWNER_SCOPE_ID = \"default\";\nconst LEGACY_DEFAULT_BINDING_KEY = `${LEGACY_DEFAULT_DEPLOYMENT_ID}:${LEGACY_DEFAULT_OWNER_SCOPE_ID}`;\n\nfunction normalizeProjectManifest(config: ProjectConfig): ProjectManifestV2 {\n return {\n schemaVersion: 2,\n projectId: config.projectId,\n slug: config.slug,\n };\n}\n\nfunction normalizeProjectBinding(\n config: ProjectConfig,\n): ProjectEnvironmentBindingV1 {\n return {\n deploymentId: config.deploymentId ?? LEGACY_DEFAULT_DEPLOYMENT_ID,\n ownerScopeId: config.ownerScopeId ?? LEGACY_DEFAULT_OWNER_SCOPE_ID,\n gameId: config.gameId,\n remoteHeadDigest: config.remoteHeadDigest,\n jobId: config.jobId,\n agentManaged: config.agentManaged,\n workspacePrepared: config.workspacePrepared,\n allowCreateGame: config.allowCreateGame,\n environment: config.environment,\n authoring: config.authoring,\n compile: config.compile,\n localMaintainerRegistry: config.localMaintainerRegistry,\n apiBaseUrl: config.apiBaseUrl,\n webBaseUrl: config.webBaseUrl,\n packageManifest: config.packageManifest,\n environmentManifest: config.environmentManifest,\n };\n}\n\nfunction normalizeProjectState(\n config: ProjectConfig,\n existing?: ProjectEnvironmentStateV1,\n): ProjectEnvironmentStateV1 {\n const binding = normalizeProjectBinding(config);\n const bindingKey =\n config.bindingKey || `${binding.deploymentId}:${binding.ownerScopeId}`;\n return {\n schemaVersion: 1,\n bindings: {\n ...(existing?.bindings ?? {}),\n [bindingKey]: binding,\n },\n };\n}\n\nfunction mergeManifestAndBinding(\n manifest: ProjectManifestV2,\n binding: ProjectEnvironmentBindingV1 | undefined,\n bindingKey: string | undefined,\n): ProjectConfig {\n return {\n ...manifest,\n ...(binding ?? {\n deploymentId: LEGACY_DEFAULT_DEPLOYMENT_ID,\n ownerScopeId: LEGACY_DEFAULT_OWNER_SCOPE_ID,\n }),\n gameId: binding?.gameId ?? manifest.projectId,\n bindingKey:\n bindingKey ??\n `${binding?.deploymentId ?? LEGACY_DEFAULT_DEPLOYMENT_ID}:${\n binding?.ownerScopeId ?? LEGACY_DEFAULT_OWNER_SCOPE_ID\n }`,\n };\n}\n\nfunction isProjectManifestV2(value: unknown): value is ProjectManifestV2 {\n const candidate = value as Partial<ProjectManifestV2>;\n return (\n candidate?.schemaVersion === 2 &&\n typeof candidate.projectId === \"string\" &&\n typeof candidate.slug === \"string\"\n );\n}\n\nfunction normalizeLegacyProjectConfig(\n config: LegacyProjectConfigV1 & { projectId?: string },\n): ProjectConfig {\n return {\n schemaVersion: 2,\n projectId: config.projectId ?? config.gameId,\n slug: config.slug,\n bindingKey: LEGACY_DEFAULT_BINDING_KEY,\n deploymentId: LEGACY_DEFAULT_DEPLOYMENT_ID,\n ownerScopeId: LEGACY_DEFAULT_OWNER_SCOPE_ID,\n gameId: config.gameId,\n jobId: config.jobId,\n agentManaged: config.agentManaged,\n workspacePrepared: config.workspacePrepared,\n allowCreateGame: config.allowCreateGame,\n environment: config.environment,\n authoring: config.authoring,\n compile: config.compile,\n localMaintainerRegistry: config.localMaintainerRegistry,\n apiBaseUrl: config.apiBaseUrl,\n webBaseUrl: config.webBaseUrl,\n packageManifest: config.packageManifest,\n environmentManifest: config.environmentManifest,\n };\n}\n\nasync function loadProjectEnvironmentState(\n rootDir: string,\n): Promise<ProjectEnvironmentStateV1> {\n const filePath = path.join(rootDir, PROJECT_DIR_NAME, PROJECT_STATE_FILE);\n if (!(await exists(filePath))) {\n return { schemaVersion: 1, bindings: {} };\n }\n const state = await readJsonFile<ProjectEnvironmentStateV1>(filePath);\n return state.schemaVersion === 1 && state.bindings\n ? state\n : { schemaVersion: 1, bindings: {} };\n}\n\nexport async function loadProjectConfig(\n rootDir: string,\n): Promise<ProjectConfig> {\n const filePath = path.join(rootDir, PROJECT_DIR_NAME, PROJECT_CONFIG_FILE);\n const rawConfig = await readJsonFile<ProjectManifestV2 | LegacyProjectConfigV1>(\n filePath,\n );\n if (!isProjectManifestV2(rawConfig)) {\n const migrated = normalizeLegacyProjectConfig(\n rawConfig as LegacyProjectConfigV1,\n );\n await updateProjectState(rootDir, migrated);\n return migrated;\n }\n\n const state = await loadProjectEnvironmentState(rootDir);\n const entries = Object.entries(state.bindings);\n const [bindingKey, binding] =\n entries.find(([key]) => key !== LEGACY_DEFAULT_BINDING_KEY) ??\n entries.find(([key]) => key === LEGACY_DEFAULT_BINDING_KEY) ??\n [];\n return mergeManifestAndBinding(rawConfig, binding, bindingKey);\n}\n\nexport async function updateProjectState(\n rootDir: string,\n config: ProjectConfig,\n): Promise<void> {\n const dir = path.join(rootDir, PROJECT_DIR_NAME);\n await ensureDir(dir);\n const existingState = await loadProjectEnvironmentState(rootDir);\n await atomicWriteFile(\n path.join(dir, PROJECT_CONFIG_FILE),\n `${JSON.stringify(normalizeProjectManifest(config), null, 2)}\\n`,\n { mode: 0o644 },\n );\n await atomicWriteFile(\n path.join(dir, PROJECT_STATE_FILE),\n `${JSON.stringify(normalizeProjectState(config, existingState), null, 2)}\\n`,\n { mode: 0o600 },\n );\n}\n\nexport async function updateProjectEnvironmentState(\n rootDir: string,\n config: ProjectConfig,\n): Promise<void> {\n const dir = path.join(rootDir, PROJECT_DIR_NAME);\n await ensureDir(dir);\n const existingState = await loadProjectEnvironmentState(rootDir);\n await atomicWriteFile(\n path.join(dir, PROJECT_STATE_FILE),\n `${JSON.stringify(normalizeProjectState(config, existingState), null, 2)}\\n`,\n { mode: 0o600 },\n );\n}\n\nexport async function findProjectRoot(\n startDir: string,\n): Promise<string | null> {\n let current = path.resolve(startDir);\n for (let i = 0; i < 25; i++) {\n const candidate = path.join(current, PROJECT_DIR_NAME, PROJECT_CONFIG_FILE);\n if (await exists(candidate)) {\n return current;\n }\n const parent = path.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return null;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,214 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/utils/repo-root.ts
4
+ import { existsSync } from "fs";
5
+ import path from "path";
6
+ import { fileURLToPath } from "url";
7
+ function isRepoRoot(candidate) {
8
+ return existsSync(path.join(candidate, "pnpm-workspace.yaml")) && existsSync(path.join(candidate, "apps", "dreamboard-cli", "package.json"));
9
+ }
10
+ function resolveCliRepoRoot(importMetaUrl = import.meta.url) {
11
+ let current = path.dirname(fileURLToPath(importMetaUrl));
12
+ while (true) {
13
+ if (isRepoRoot(current)) {
14
+ return current;
15
+ }
16
+ const parent = path.dirname(current);
17
+ if (parent === current) {
18
+ break;
19
+ }
20
+ current = parent;
21
+ }
22
+ throw new Error(
23
+ `Could not resolve Dreamboard CLI repo root from ${importMetaUrl}.`
24
+ );
25
+ }
26
+
27
+ // src/utils/repo-local-package-resolution.ts
28
+ import { existsSync as existsSync2, readdirSync, readFileSync } from "fs";
29
+ import { createRequire } from "module";
30
+ import path2 from "path";
31
+ var PACKAGE_INFO_CACHE = /* @__PURE__ */ new Map();
32
+ function normalizeRepoRoot(options) {
33
+ return options?.repoRoot ?? resolveCliRepoRoot(import.meta.url);
34
+ }
35
+ function readPackageInfos(repoRoot) {
36
+ const cached = PACKAGE_INFO_CACHE.get(repoRoot);
37
+ if (cached) {
38
+ return cached;
39
+ }
40
+ const packageInfos = /* @__PURE__ */ new Map();
41
+ const addPackageInfo = (packageRoot) => {
42
+ const packageJsonPath = path2.join(packageRoot, "package.json");
43
+ if (!existsSync2(packageJsonPath)) {
44
+ return;
45
+ }
46
+ const parsed = JSON.parse(readFileSync(packageJsonPath, "utf8"));
47
+ if (!parsed.name || !parsed.name.startsWith("@dreamboard/") && !parsed.name.startsWith("@dreamboard-games/") || parsed.exports === void 0) {
48
+ return;
49
+ }
50
+ packageInfos.set(parsed.name, {
51
+ rootDir: packageRoot,
52
+ exports: parsed.exports
53
+ });
54
+ };
55
+ for (const workspaceDirName of ["packages", "apps"]) {
56
+ const workspaceRoot = path2.join(repoRoot, workspaceDirName);
57
+ if (!existsSync2(workspaceRoot)) {
58
+ continue;
59
+ }
60
+ for (const entry of readdirSync(workspaceRoot, { withFileTypes: true })) {
61
+ if (!entry.isDirectory()) {
62
+ continue;
63
+ }
64
+ addPackageInfo(path2.join(workspaceRoot, entry.name));
65
+ }
66
+ }
67
+ for (const nodeModulesRoot of [
68
+ path2.join(repoRoot, "node_modules"),
69
+ path2.join(repoRoot, "apps", "dreamboard-cli", "node_modules")
70
+ ]) {
71
+ for (const scopeName of ["@dreamboard", "@dreamboard-games"]) {
72
+ const scopeRoot = path2.join(nodeModulesRoot, scopeName);
73
+ if (!existsSync2(scopeRoot)) {
74
+ continue;
75
+ }
76
+ for (const entry of readdirSync(scopeRoot, { withFileTypes: true })) {
77
+ if (!entry.isDirectory() && !entry.isSymbolicLink()) {
78
+ continue;
79
+ }
80
+ addPackageInfo(path2.join(scopeRoot, entry.name));
81
+ }
82
+ }
83
+ }
84
+ PACKAGE_INFO_CACHE.set(repoRoot, packageInfos);
85
+ return packageInfos;
86
+ }
87
+ function parseDreamboardPackageSpecifier(specifier) {
88
+ if (!specifier.startsWith("@dreamboard/") && !specifier.startsWith("@dreamboard-games/")) {
89
+ return null;
90
+ }
91
+ const segments = specifier.split("/");
92
+ if (segments.length < 2) {
93
+ return null;
94
+ }
95
+ const packageName = `${segments[0]}/${segments[1]}`;
96
+ const subpath = segments.length === 2 ? "." : `./${segments.slice(2).join("/")}`;
97
+ return { packageName, subpath };
98
+ }
99
+ function resolveSourceTarget(exportEntry) {
100
+ if (typeof exportEntry === "string") {
101
+ return exportEntry;
102
+ }
103
+ if (typeof exportEntry === "object" && exportEntry !== null && "dreamboard-source" in exportEntry && typeof exportEntry["dreamboard-source"] === "string") {
104
+ return exportEntry["dreamboard-source"];
105
+ }
106
+ if (typeof exportEntry === "object" && exportEntry !== null && "bun" in exportEntry && typeof exportEntry.bun === "string") {
107
+ return exportEntry.bun;
108
+ }
109
+ if (typeof exportEntry === "object" && exportEntry !== null && "import" in exportEntry && typeof exportEntry.import === "string") {
110
+ return exportEntry.import;
111
+ }
112
+ return null;
113
+ }
114
+ function resolveSourceTargetForSubpath(options) {
115
+ if (typeof options.exportsField !== "object" || options.exportsField === null || Array.isArray(options.exportsField)) {
116
+ return options.subpath === "." ? resolveSourceTarget(options.exportsField) : null;
117
+ }
118
+ const exportsMap = options.exportsField;
119
+ if (options.subpath === ".") {
120
+ return resolveSourceTarget(exportsMap["."]) ?? resolveSourceTarget(exportsMap);
121
+ }
122
+ const exactTarget = resolveSourceTarget(exportsMap[options.subpath]);
123
+ if (exactTarget) {
124
+ return exactTarget;
125
+ }
126
+ const wildcardEntries = Object.entries(exportsMap).filter(([key]) => key.includes("*")).sort(([left], [right]) => right.length - left.length);
127
+ for (const [pattern, exportEntry] of wildcardEntries) {
128
+ const starIndex = pattern.indexOf("*");
129
+ const prefix = pattern.slice(0, starIndex);
130
+ const suffix = pattern.slice(starIndex + 1);
131
+ if (!options.subpath.startsWith(prefix) || !options.subpath.endsWith(suffix)) {
132
+ continue;
133
+ }
134
+ const wildcardValue = options.subpath.slice(
135
+ prefix.length,
136
+ options.subpath.length - suffix.length
137
+ );
138
+ const targetPattern = resolveSourceTarget(exportEntry);
139
+ if (!targetPattern) {
140
+ continue;
141
+ }
142
+ return targetPattern.replace("*", wildcardValue);
143
+ }
144
+ return null;
145
+ }
146
+ function resolveRepoLocalPackageSource(specifier, options) {
147
+ const parsedSpecifier = parseDreamboardPackageSpecifier(specifier);
148
+ if (!parsedSpecifier) {
149
+ return null;
150
+ }
151
+ let repoRoot;
152
+ try {
153
+ repoRoot = normalizeRepoRoot(options);
154
+ } catch {
155
+ return null;
156
+ }
157
+ const packageInfo = readPackageInfos(repoRoot).get(
158
+ parsedSpecifier.packageName
159
+ );
160
+ if (!packageInfo) {
161
+ return null;
162
+ }
163
+ const sourceTarget = resolveSourceTargetForSubpath({
164
+ exportsField: packageInfo.exports,
165
+ subpath: parsedSpecifier.subpath
166
+ });
167
+ if (!sourceTarget) {
168
+ return null;
169
+ }
170
+ return path2.join(packageInfo.rootDir, sourceTarget);
171
+ }
172
+ var cliPackageRequire = createRequire(import.meta.url);
173
+ function resolvableFromDirectory(specifier, directory) {
174
+ try {
175
+ createRequire(path2.join(directory, "noop.js")).resolve(specifier);
176
+ return true;
177
+ } catch {
178
+ return false;
179
+ }
180
+ }
181
+ function resolveCliBundledPackage(specifier) {
182
+ try {
183
+ return cliPackageRequire.resolve(specifier);
184
+ } catch {
185
+ return null;
186
+ }
187
+ }
188
+ function createRepoLocalPackageResolutionPlugin(options) {
189
+ return {
190
+ name: "dreamboard-repo-local-package-resolution",
191
+ setup(build) {
192
+ build.onResolve({ filter: /^@dreamboard(?:-games)?\// }, (args) => {
193
+ if (resolvableFromDirectory(args.path, args.resolveDir)) {
194
+ return null;
195
+ }
196
+ const resolvedPath = resolveRepoLocalPackageSource(args.path, options);
197
+ if (resolvedPath) {
198
+ return { path: resolvedPath };
199
+ }
200
+ const bundledPath = resolveCliBundledPackage(args.path);
201
+ if (bundledPath) {
202
+ return { path: bundledPath };
203
+ }
204
+ return null;
205
+ });
206
+ }
207
+ };
208
+ }
209
+
210
+ export {
211
+ resolveCliRepoRoot,
212
+ createRepoLocalPackageResolutionPlugin
213
+ };
214
+ //# sourceMappingURL=chunk-TTB7AIHZ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/repo-root.ts","../../src/utils/repo-local-package-resolution.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nfunction isRepoRoot(candidate: string): boolean {\n return (\n existsSync(path.join(candidate, \"pnpm-workspace.yaml\")) &&\n existsSync(path.join(candidate, \"apps\", \"dreamboard-cli\", \"package.json\"))\n );\n}\n\nexport function resolveCliRepoRoot(importMetaUrl: string = import.meta.url) {\n let current = path.dirname(fileURLToPath(importMetaUrl));\n\n while (true) {\n if (isRepoRoot(current)) {\n return current;\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n throw new Error(\n `Could not resolve Dreamboard CLI repo root from ${importMetaUrl}.`,\n );\n}\n","import { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport type { Plugin } from \"esbuild\";\nimport { resolveCliRepoRoot } from \"./repo-root.js\";\n\ntype RepoLocalPackageInfo = {\n rootDir: string;\n exports: unknown;\n};\n\ntype RepoLocalPackageResolutionOptions = {\n repoRoot?: string;\n};\n\nconst PACKAGE_INFO_CACHE = new Map<string, Map<string, RepoLocalPackageInfo>>();\n\nfunction normalizeRepoRoot(\n options?: RepoLocalPackageResolutionOptions,\n): string {\n return options?.repoRoot ?? resolveCliRepoRoot(import.meta.url);\n}\n\nfunction readPackageInfos(repoRoot: string): Map<string, RepoLocalPackageInfo> {\n const cached = PACKAGE_INFO_CACHE.get(repoRoot);\n if (cached) {\n return cached;\n }\n\n const packageInfos = new Map<string, RepoLocalPackageInfo>();\n const addPackageInfo = (packageRoot: string): void => {\n const packageJsonPath = path.join(packageRoot, \"package.json\");\n if (!existsSync(packageJsonPath)) {\n return;\n }\n\n const parsed = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\n name?: string;\n exports?: unknown;\n };\n if (\n !parsed.name ||\n (!parsed.name.startsWith(\"@dreamboard/\") &&\n !parsed.name.startsWith(\"@dreamboard-games/\")) ||\n parsed.exports === undefined\n ) {\n return;\n }\n\n packageInfos.set(parsed.name, {\n rootDir: packageRoot,\n exports: parsed.exports,\n });\n };\n\n for (const workspaceDirName of [\"packages\", \"apps\"]) {\n const workspaceRoot = path.join(repoRoot, workspaceDirName);\n if (!existsSync(workspaceRoot)) {\n continue;\n }\n\n for (const entry of readdirSync(workspaceRoot, { withFileTypes: true })) {\n if (!entry.isDirectory()) {\n continue;\n }\n addPackageInfo(path.join(workspaceRoot, entry.name));\n }\n }\n\n for (const nodeModulesRoot of [\n path.join(repoRoot, \"node_modules\"),\n path.join(repoRoot, \"apps\", \"dreamboard-cli\", \"node_modules\"),\n ]) {\n for (const scopeName of [\"@dreamboard\", \"@dreamboard-games\"]) {\n const scopeRoot = path.join(nodeModulesRoot, scopeName);\n if (!existsSync(scopeRoot)) {\n continue;\n }\n\n for (const entry of readdirSync(scopeRoot, { withFileTypes: true })) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) {\n continue;\n }\n addPackageInfo(path.join(scopeRoot, entry.name));\n }\n }\n }\n\n PACKAGE_INFO_CACHE.set(repoRoot, packageInfos);\n return packageInfos;\n}\n\nfunction parseDreamboardPackageSpecifier(specifier: string): {\n packageName: string;\n subpath: string;\n} | null {\n if (\n !specifier.startsWith(\"@dreamboard/\") &&\n !specifier.startsWith(\"@dreamboard-games/\")\n ) {\n return null;\n }\n\n const segments = specifier.split(\"/\");\n if (segments.length < 2) {\n return null;\n }\n\n const packageName = `${segments[0]}/${segments[1]}`;\n const subpath =\n segments.length === 2 ? \".\" : `./${segments.slice(2).join(\"/\")}`;\n return { packageName, subpath };\n}\n\nfunction resolveSourceTarget(exportEntry: unknown): string | null {\n if (typeof exportEntry === \"string\") {\n return exportEntry;\n }\n if (\n typeof exportEntry === \"object\" &&\n exportEntry !== null &&\n \"dreamboard-source\" in exportEntry &&\n typeof (exportEntry as { \"dreamboard-source\"?: unknown })[\n \"dreamboard-source\"\n ] === \"string\"\n ) {\n return (exportEntry as { \"dreamboard-source\": string })[\n \"dreamboard-source\"\n ];\n }\n if (\n typeof exportEntry === \"object\" &&\n exportEntry !== null &&\n \"bun\" in exportEntry &&\n typeof (exportEntry as { bun?: unknown }).bun === \"string\"\n ) {\n return (exportEntry as { bun: string }).bun;\n }\n if (\n typeof exportEntry === \"object\" &&\n exportEntry !== null &&\n \"import\" in exportEntry &&\n typeof (exportEntry as { import?: unknown }).import === \"string\"\n ) {\n return (exportEntry as { import: string }).import;\n }\n return null;\n}\n\nfunction resolveSourceTargetForSubpath(options: {\n exportsField: unknown;\n subpath: string;\n}): string | null {\n if (\n typeof options.exportsField !== \"object\" ||\n options.exportsField === null ||\n Array.isArray(options.exportsField)\n ) {\n return options.subpath === \".\"\n ? resolveSourceTarget(options.exportsField)\n : null;\n }\n\n const exportsMap = options.exportsField as Record<string, unknown>;\n if (options.subpath === \".\") {\n return (\n resolveSourceTarget(exportsMap[\".\"]) ?? resolveSourceTarget(exportsMap)\n );\n }\n const exactTarget = resolveSourceTarget(exportsMap[options.subpath]);\n if (exactTarget) {\n return exactTarget;\n }\n\n const wildcardEntries = Object.entries(exportsMap)\n .filter(([key]) => key.includes(\"*\"))\n .sort(([left], [right]) => right.length - left.length);\n for (const [pattern, exportEntry] of wildcardEntries) {\n const starIndex = pattern.indexOf(\"*\");\n const prefix = pattern.slice(0, starIndex);\n const suffix = pattern.slice(starIndex + 1);\n if (\n !options.subpath.startsWith(prefix) ||\n !options.subpath.endsWith(suffix)\n ) {\n continue;\n }\n\n const wildcardValue = options.subpath.slice(\n prefix.length,\n options.subpath.length - suffix.length,\n );\n const targetPattern = resolveSourceTarget(exportEntry);\n if (!targetPattern) {\n continue;\n }\n return targetPattern.replace(\"*\", wildcardValue);\n }\n\n return null;\n}\n\nexport function resolveRepoLocalPackageSource(\n specifier: string,\n options?: RepoLocalPackageResolutionOptions,\n): string | null {\n const parsedSpecifier = parseDreamboardPackageSpecifier(specifier);\n if (!parsedSpecifier) {\n return null;\n }\n\n let repoRoot: string;\n try {\n repoRoot = normalizeRepoRoot(options);\n } catch {\n return null;\n }\n\n const packageInfo = readPackageInfos(repoRoot).get(\n parsedSpecifier.packageName,\n );\n if (!packageInfo) {\n return null;\n }\n\n const sourceTarget = resolveSourceTargetForSubpath({\n exportsField: packageInfo.exports,\n subpath: parsedSpecifier.subpath,\n });\n if (!sourceTarget) {\n return null;\n }\n\n return path.join(packageInfo.rootDir, sourceTarget);\n}\n\nconst cliPackageRequire = createRequire(import.meta.url);\n\nfunction resolvableFromDirectory(\n specifier: string,\n directory: string,\n): boolean {\n try {\n createRequire(path.join(directory, \"noop.js\")).resolve(specifier);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Resolve a `@dreamboard-games/*` specifier against the CLI package's own\n * dependency tree. This keeps manifest evaluation working in workspaces that\n * have not installed their dependencies yet (for example right after\n * `dreamboard clone`), where the installed CLI's pinned SDK is the only\n * available copy.\n */\nfunction resolveCliBundledPackage(specifier: string): string | null {\n try {\n return cliPackageRequire.resolve(specifier);\n } catch {\n return null;\n }\n}\n\nexport function createRepoLocalPackageResolutionPlugin(\n options?: RepoLocalPackageResolutionOptions,\n): Plugin {\n return {\n name: \"dreamboard-repo-local-package-resolution\",\n setup(build) {\n build.onResolve({ filter: /^@dreamboard(?:-games)?\\// }, (args) => {\n // Prefer the workspace's own installed copy when present; returning\n // null lets esbuild perform its normal node_modules resolution.\n if (resolvableFromDirectory(args.path, args.resolveDir)) {\n return null;\n }\n const resolvedPath = resolveRepoLocalPackageSource(args.path, options);\n if (resolvedPath) {\n return { path: resolvedPath };\n }\n const bundledPath = resolveCliBundledPackage(args.path);\n if (bundledPath) {\n return { path: bundledPath };\n }\n return null;\n });\n },\n };\n}\n"],"mappings":";;;AAAA,SAAS,kBAAkB;AAC3B,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAE9B,SAAS,WAAW,WAA4B;AAC9C,SACE,WAAW,KAAK,KAAK,WAAW,qBAAqB,CAAC,KACtD,WAAW,KAAK,KAAK,WAAW,QAAQ,kBAAkB,cAAc,CAAC;AAE7E;AAEO,SAAS,mBAAmB,gBAAwB,YAAY,KAAK;AAC1E,MAAI,UAAU,KAAK,QAAQ,cAAc,aAAa,CAAC;AAEvD,SAAO,MAAM;AACX,QAAI,WAAW,OAAO,GAAG;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,KAAK,QAAQ,OAAO;AACnC,QAAI,WAAW,SAAS;AACtB;AAAA,IACF;AACA,cAAU;AAAA,EACZ;AAEA,QAAM,IAAI;AAAA,IACR,mDAAmD,aAAa;AAAA,EAClE;AACF;;;AC7BA,SAAS,cAAAA,aAAY,aAAa,oBAAoB;AACtD,SAAS,qBAAqB;AAC9B,OAAOC,WAAU;AAajB,IAAM,qBAAqB,oBAAI,IAA+C;AAE9E,SAAS,kBACP,SACQ;AACR,SAAO,SAAS,YAAY,mBAAmB,YAAY,GAAG;AAChE;AAEA,SAAS,iBAAiB,UAAqD;AAC7E,QAAM,SAAS,mBAAmB,IAAI,QAAQ;AAC9C,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,oBAAI,IAAkC;AAC3D,QAAM,iBAAiB,CAAC,gBAA8B;AACpD,UAAM,kBAAkBC,MAAK,KAAK,aAAa,cAAc;AAC7D,QAAI,CAACC,YAAW,eAAe,GAAG;AAChC;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,MAAM,aAAa,iBAAiB,MAAM,CAAC;AAI/D,QACE,CAAC,OAAO,QACP,CAAC,OAAO,KAAK,WAAW,cAAc,KACrC,CAAC,OAAO,KAAK,WAAW,oBAAoB,KAC9C,OAAO,YAAY,QACnB;AACA;AAAA,IACF;AAEA,iBAAa,IAAI,OAAO,MAAM;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS,OAAO;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,aAAW,oBAAoB,CAAC,YAAY,MAAM,GAAG;AACnD,UAAM,gBAAgBD,MAAK,KAAK,UAAU,gBAAgB;AAC1D,QAAI,CAACC,YAAW,aAAa,GAAG;AAC9B;AAAA,IACF;AAEA,eAAW,SAAS,YAAY,eAAe,EAAE,eAAe,KAAK,CAAC,GAAG;AACvE,UAAI,CAAC,MAAM,YAAY,GAAG;AACxB;AAAA,MACF;AACA,qBAAeD,MAAK,KAAK,eAAe,MAAM,IAAI,CAAC;AAAA,IACrD;AAAA,EACF;AAEA,aAAW,mBAAmB;AAAA,IAC5BA,MAAK,KAAK,UAAU,cAAc;AAAA,IAClCA,MAAK,KAAK,UAAU,QAAQ,kBAAkB,cAAc;AAAA,EAC9D,GAAG;AACD,eAAW,aAAa,CAAC,eAAe,mBAAmB,GAAG;AAC5D,YAAM,YAAYA,MAAK,KAAK,iBAAiB,SAAS;AACtD,UAAI,CAACC,YAAW,SAAS,GAAG;AAC1B;AAAA,MACF;AAEA,iBAAW,SAAS,YAAY,WAAW,EAAE,eAAe,KAAK,CAAC,GAAG;AACnE,YAAI,CAAC,MAAM,YAAY,KAAK,CAAC,MAAM,eAAe,GAAG;AACnD;AAAA,QACF;AACA,uBAAeD,MAAK,KAAK,WAAW,MAAM,IAAI,CAAC;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AAEA,qBAAmB,IAAI,UAAU,YAAY;AAC7C,SAAO;AACT;AAEA,SAAS,gCAAgC,WAGhC;AACP,MACE,CAAC,UAAU,WAAW,cAAc,KACpC,CAAC,UAAU,WAAW,oBAAoB,GAC1C;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,UAAU,MAAM,GAAG;AACpC,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,GAAG,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC;AACjD,QAAM,UACJ,SAAS,WAAW,IAAI,MAAM,KAAK,SAAS,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC;AAChE,SAAO,EAAE,aAAa,QAAQ;AAChC;AAEA,SAAS,oBAAoB,aAAqC;AAChE,MAAI,OAAO,gBAAgB,UAAU;AACnC,WAAO;AAAA,EACT;AACA,MACE,OAAO,gBAAgB,YACvB,gBAAgB,QAChB,uBAAuB,eACvB,OAAQ,YACN,mBACF,MAAM,UACN;AACA,WAAQ,YACN,mBACF;AAAA,EACF;AACA,MACE,OAAO,gBAAgB,YACvB,gBAAgB,QAChB,SAAS,eACT,OAAQ,YAAkC,QAAQ,UAClD;AACA,WAAQ,YAAgC;AAAA,EAC1C;AACA,MACE,OAAO,gBAAgB,YACvB,gBAAgB,QAChB,YAAY,eACZ,OAAQ,YAAqC,WAAW,UACxD;AACA,WAAQ,YAAmC;AAAA,EAC7C;AACA,SAAO;AACT;AAEA,SAAS,8BAA8B,SAGrB;AAChB,MACE,OAAO,QAAQ,iBAAiB,YAChC,QAAQ,iBAAiB,QACzB,MAAM,QAAQ,QAAQ,YAAY,GAClC;AACA,WAAO,QAAQ,YAAY,MACvB,oBAAoB,QAAQ,YAAY,IACxC;AAAA,EACN;AAEA,QAAM,aAAa,QAAQ;AAC3B,MAAI,QAAQ,YAAY,KAAK;AAC3B,WACE,oBAAoB,WAAW,GAAG,CAAC,KAAK,oBAAoB,UAAU;AAAA,EAE1E;AACA,QAAM,cAAc,oBAAoB,WAAW,QAAQ,OAAO,CAAC;AACnE,MAAI,aAAa;AACf,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,OAAO,QAAQ,UAAU,EAC9C,OAAO,CAAC,CAAC,GAAG,MAAM,IAAI,SAAS,GAAG,CAAC,EACnC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,MAAM,SAAS,KAAK,MAAM;AACvD,aAAW,CAAC,SAAS,WAAW,KAAK,iBAAiB;AACpD,UAAM,YAAY,QAAQ,QAAQ,GAAG;AACrC,UAAM,SAAS,QAAQ,MAAM,GAAG,SAAS;AACzC,UAAM,SAAS,QAAQ,MAAM,YAAY,CAAC;AAC1C,QACE,CAAC,QAAQ,QAAQ,WAAW,MAAM,KAClC,CAAC,QAAQ,QAAQ,SAAS,MAAM,GAChC;AACA;AAAA,IACF;AAEA,UAAM,gBAAgB,QAAQ,QAAQ;AAAA,MACpC,OAAO;AAAA,MACP,QAAQ,QAAQ,SAAS,OAAO;AAAA,IAClC;AACA,UAAM,gBAAgB,oBAAoB,WAAW;AACrD,QAAI,CAAC,eAAe;AAClB;AAAA,IACF;AACA,WAAO,cAAc,QAAQ,KAAK,aAAa;AAAA,EACjD;AAEA,SAAO;AACT;AAEO,SAAS,8BACd,WACA,SACe;AACf,QAAM,kBAAkB,gCAAgC,SAAS;AACjE,MAAI,CAAC,iBAAiB;AACpB,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,eAAW,kBAAkB,OAAO;AAAA,EACtC,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,iBAAiB,QAAQ,EAAE;AAAA,IAC7C,gBAAgB;AAAA,EAClB;AACA,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,8BAA8B;AAAA,IACjD,cAAc,YAAY;AAAA,IAC1B,SAAS,gBAAgB;AAAA,EAC3B,CAAC;AACD,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,SAAOA,MAAK,KAAK,YAAY,SAAS,YAAY;AACpD;AAEA,IAAM,oBAAoB,cAAc,YAAY,GAAG;AAEvD,SAAS,wBACP,WACA,WACS;AACT,MAAI;AACF,kBAAcA,MAAK,KAAK,WAAW,SAAS,CAAC,EAAE,QAAQ,SAAS;AAChE,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AASA,SAAS,yBAAyB,WAAkC;AAClE,MAAI;AACF,WAAO,kBAAkB,QAAQ,SAAS;AAAA,EAC5C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,uCACd,SACQ;AACR,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,OAAO;AACX,YAAM,UAAU,EAAE,QAAQ,4BAA4B,GAAG,CAAC,SAAS;AAGjE,YAAI,wBAAwB,KAAK,MAAM,KAAK,UAAU,GAAG;AACvD,iBAAO;AAAA,QACT;AACA,cAAM,eAAe,8BAA8B,KAAK,MAAM,OAAO;AACrE,YAAI,cAAc;AAChB,iBAAO,EAAE,MAAM,aAAa;AAAA,QAC9B;AACA,cAAM,cAAc,yBAAyB,KAAK,IAAI;AACtD,YAAI,aAAa;AACf,iBAAO,EAAE,MAAM,YAAY;AAAA,QAC7B;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":["existsSync","path","path","existsSync"]}