@dreamboard-games/cli 0.1.30-alpha.5 → 0.1.30-alpha.7

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 (60) hide show
  1. package/dist/agent-verifier/agent-workspace-verifier.mjs +13 -13
  2. package/dist/agent-verifier/{chunk-JO5AMVZU.mjs → chunk-7CNBKWWE.mjs} +4 -4
  3. package/dist/agent-verifier/{chunk-ON62IGWK.mjs → chunk-DN2JHUGM.mjs} +5 -5
  4. package/dist/agent-verifier/{chunk-IDVQXGAO.mjs → chunk-GD3FL755.mjs} +2 -2
  5. package/dist/agent-verifier/{chunk-27EEIZCI.mjs → chunk-M2MHRWSP.mjs} +3 -3
  6. package/dist/agent-verifier/{chunk-H76MT5UR.mjs → chunk-M7UVBANQ.mjs} +2 -1
  7. package/dist/agent-verifier/chunk-M7UVBANQ.mjs.map +1 -0
  8. package/dist/agent-verifier/{chunk-MW2QIWWA.mjs → chunk-NCHH5I7R.mjs} +9 -6
  9. package/dist/agent-verifier/{chunk-MW2QIWWA.mjs.map → chunk-NCHH5I7R.mjs.map} +1 -1
  10. package/dist/agent-verifier/{chunk-UIOLGH4A.mjs → chunk-POBFNXD4.mjs} +2 -2
  11. package/dist/agent-verifier/{chunk-776W3UGV.mjs → chunk-RHGGFAMQ.mjs} +2 -2
  12. package/dist/agent-verifier/{chunk-XQXDOBYB.mjs → chunk-RHI6S4SU.mjs} +2 -2
  13. package/dist/agent-verifier/{chunk-5NYBTZB4.mjs → chunk-W2MDP5ZN.mjs} +3 -3
  14. package/dist/agent-verifier/{chunk-C3VW3DTA.mjs → chunk-XIFLZGDQ.mjs} +2 -2
  15. package/dist/agent-verifier/{chunk-QZH6IEZS.mjs → chunk-ZETW43TX.mjs} +3 -3
  16. package/dist/agent-verifier/{chunk-KDBSVLCF.mjs → chunk-ZNZ4RJBK.mjs} +3 -3
  17. package/dist/agent-verifier/{compile-576O7TYP.mjs → compile-OTRAPCY6.mjs} +12 -12
  18. package/dist/agent-verifier/{global-config-NYCSCAUI.mjs → global-config-XHL7BCKN.mjs} +3 -3
  19. package/dist/agent-verifier/{local-files-QVJ2H3MH.mjs → local-files-45DUJUEH.mjs} +4 -4
  20. package/dist/agent-verifier/local-typecheck-3JXL2NMG.mjs +10 -0
  21. package/dist/agent-verifier/{materialize-workspace-OZKOQCSQ.mjs → materialize-workspace-R2QJ7HQ6.mjs} +7 -7
  22. package/dist/agent-verifier/{reducer-native-test-harness-QC7HZUK4.mjs → reducer-native-test-harness-LNZI3G73.mjs} +6 -6
  23. package/dist/agent-verifier/{static-scaffold-JBUE3ROP.mjs → static-scaffold-RO2IS34O.mjs} +5 -5
  24. package/dist/agent-verifier/{sync-C6S3OGCD.mjs → sync-PZXHAEFQ.mjs} +13 -13
  25. package/dist/agent-verifier/{test-Y5UGQV7J.mjs → test-RCFDQBEQ.mjs} +10 -10
  26. package/dist/agent-verifier/{workspace-dependencies-B6A2ZX55.mjs → workspace-dependencies-ULZZZPNX.mjs} +3 -3
  27. package/dist/{chunk-TBA3T4TX.js → chunk-4PTP2HOX.js} +2 -2
  28. package/dist/{chunk-3NRROR4P.js → chunk-GXM7RRZJ.js} +3 -2
  29. package/dist/chunk-GXM7RRZJ.js.map +1 -0
  30. package/dist/{global-config-YBFEGJQG.js → global-config-WPJRXVDO.js} +2 -2
  31. package/dist/index.js +7 -4
  32. package/dist/index.js.map +1 -1
  33. package/dist/internal.js +2 -2
  34. package/package.json +1 -1
  35. package/dist/agent-verifier/chunk-H76MT5UR.mjs.map +0 -1
  36. package/dist/agent-verifier/local-typecheck-2JWG5IGL.mjs +0 -10
  37. package/dist/chunk-3NRROR4P.js.map +0 -1
  38. /package/dist/agent-verifier/{chunk-JO5AMVZU.mjs.map → chunk-7CNBKWWE.mjs.map} +0 -0
  39. /package/dist/agent-verifier/{chunk-ON62IGWK.mjs.map → chunk-DN2JHUGM.mjs.map} +0 -0
  40. /package/dist/agent-verifier/{chunk-IDVQXGAO.mjs.map → chunk-GD3FL755.mjs.map} +0 -0
  41. /package/dist/agent-verifier/{chunk-27EEIZCI.mjs.map → chunk-M2MHRWSP.mjs.map} +0 -0
  42. /package/dist/agent-verifier/{chunk-UIOLGH4A.mjs.map → chunk-POBFNXD4.mjs.map} +0 -0
  43. /package/dist/agent-verifier/{chunk-776W3UGV.mjs.map → chunk-RHGGFAMQ.mjs.map} +0 -0
  44. /package/dist/agent-verifier/{chunk-XQXDOBYB.mjs.map → chunk-RHI6S4SU.mjs.map} +0 -0
  45. /package/dist/agent-verifier/{chunk-5NYBTZB4.mjs.map → chunk-W2MDP5ZN.mjs.map} +0 -0
  46. /package/dist/agent-verifier/{chunk-C3VW3DTA.mjs.map → chunk-XIFLZGDQ.mjs.map} +0 -0
  47. /package/dist/agent-verifier/{chunk-QZH6IEZS.mjs.map → chunk-ZETW43TX.mjs.map} +0 -0
  48. /package/dist/agent-verifier/{chunk-KDBSVLCF.mjs.map → chunk-ZNZ4RJBK.mjs.map} +0 -0
  49. /package/dist/agent-verifier/{compile-576O7TYP.mjs.map → compile-OTRAPCY6.mjs.map} +0 -0
  50. /package/dist/agent-verifier/{global-config-NYCSCAUI.mjs.map → global-config-XHL7BCKN.mjs.map} +0 -0
  51. /package/dist/agent-verifier/{local-files-QVJ2H3MH.mjs.map → local-files-45DUJUEH.mjs.map} +0 -0
  52. /package/dist/agent-verifier/{local-typecheck-2JWG5IGL.mjs.map → local-typecheck-3JXL2NMG.mjs.map} +0 -0
  53. /package/dist/agent-verifier/{materialize-workspace-OZKOQCSQ.mjs.map → materialize-workspace-R2QJ7HQ6.mjs.map} +0 -0
  54. /package/dist/agent-verifier/{reducer-native-test-harness-QC7HZUK4.mjs.map → reducer-native-test-harness-LNZI3G73.mjs.map} +0 -0
  55. /package/dist/agent-verifier/{static-scaffold-JBUE3ROP.mjs.map → static-scaffold-RO2IS34O.mjs.map} +0 -0
  56. /package/dist/agent-verifier/{sync-C6S3OGCD.mjs.map → sync-PZXHAEFQ.mjs.map} +0 -0
  57. /package/dist/agent-verifier/{test-Y5UGQV7J.mjs.map → test-RCFDQBEQ.mjs.map} +0 -0
  58. /package/dist/agent-verifier/{workspace-dependencies-B6A2ZX55.mjs.map → workspace-dependencies-ULZZZPNX.mjs.map} +0 -0
  59. /package/dist/{chunk-TBA3T4TX.js.map → chunk-4PTP2HOX.js.map} +0 -0
  60. /package/dist/{global-config-YBFEGJQG.js.map → global-config-WPJRXVDO.js.map} +0 -0
@@ -3,13 +3,13 @@ import {
3
3
  assertCompilerPortableDependencies,
4
4
  consola,
5
5
  resolveProjectContext
6
- } from "./chunk-JO5AMVZU.mjs";
7
- import "./chunk-5NYBTZB4.mjs";
8
- import "./chunk-776W3UGV.mjs";
6
+ } from "./chunk-7CNBKWWE.mjs";
7
+ import "./chunk-W2MDP5ZN.mjs";
8
+ import "./chunk-RHGGFAMQ.mjs";
9
9
  import "./chunk-NAK77WXW.mjs";
10
10
  import "./chunk-TAEQKBJB.mjs";
11
11
  import "./chunk-IAYRNVUC.mjs";
12
- import "./chunk-H76MT5UR.mjs";
12
+ import "./chunk-M7UVBANQ.mjs";
13
13
  import "./chunk-H6XDQJ3N.mjs";
14
14
 
15
15
  // src/agent-verifier/agent-workspace-verifier.ts
@@ -46,7 +46,7 @@ Usage:
46
46
  }
47
47
  async function materializePreparedWorkspace(args) {
48
48
  const inputPath = readRequiredOption(args, "--input");
49
- const { materializeWorkspaceProject } = await import("./materialize-workspace-OZKOQCSQ.mjs");
49
+ const { materializeWorkspaceProject } = await import("./materialize-workspace-R2QJ7HQ6.mjs");
50
50
  const input = JSON.parse(
51
51
  await readFile(inputPath, "utf8")
52
52
  );
@@ -82,9 +82,9 @@ async function verifyAgentWorkspace(rawMode, args) {
82
82
  }
83
83
  async function runFullBackendConnectedVerification(parsedFlags) {
84
84
  const [{ default: cmdSync }, { default: cmdCompile }, { default: cmdTest }] = await Promise.all([
85
- import("./sync-C6S3OGCD.mjs"),
86
- import("./compile-576O7TYP.mjs"),
87
- import("./test-Y5UGQV7J.mjs")
85
+ import("./sync-PZXHAEFQ.mjs"),
86
+ import("./compile-OTRAPCY6.mjs"),
87
+ import("./test-RCFDQBEQ.mjs")
88
88
  ]);
89
89
  await runCommandDefinition(cmdSync, { ...parsedFlags, force: true });
90
90
  await runCommandDefinition(cmdCompile, parsedFlags);
@@ -148,10 +148,10 @@ async function runCloudLocalVerification(projectRoot, projectConfig, config) {
148
148
  { assertReducerContractPreflight },
149
149
  { getProjectLocalMaintainerRegistry }
150
150
  ] = await Promise.all([
151
- import("./static-scaffold-JBUE3ROP.mjs"),
152
- import("./local-files-QVJ2H3MH.mjs"),
151
+ import("./static-scaffold-RO2IS34O.mjs"),
152
+ import("./local-files-45DUJUEH.mjs"),
153
153
  import("./workspace-codegen-WPZHMATU.mjs"),
154
- import("./workspace-dependencies-B6A2ZX55.mjs"),
154
+ import("./workspace-dependencies-ULZZZPNX.mjs"),
155
155
  import("./reducer-contract-preflight-COD2CO22.mjs"),
156
156
  import("./project-state-XKUSCFSV.mjs")
157
157
  ]);
@@ -167,7 +167,7 @@ async function runCloudLocalVerification(projectRoot, projectConfig, config) {
167
167
  consola.start("Validating reducer contract...");
168
168
  await assertReducerContractPreflight(projectRoot);
169
169
  const [{ runLocalTypecheck }, { assertReducerBundleSmoke }] = await Promise.all([
170
- import("./local-typecheck-2JWG5IGL.mjs"),
170
+ import("./local-typecheck-3JXL2NMG.mjs"),
171
171
  import("./reducer-bundle-preflight-7NYZF5ZT.mjs")
172
172
  ]);
173
173
  consola.start("Running local typecheck...");
@@ -186,7 +186,7 @@ async function runCloudLocalVerification(projectRoot, projectConfig, config) {
186
186
  generateReducerNativeArtifacts,
187
187
  isReducerNativeTestingWorkspace,
188
188
  runReducerNativeScenarios
189
- } = await import("./reducer-native-test-harness-QC7HZUK4.mjs");
189
+ } = await import("./reducer-native-test-harness-LNZI3G73.mjs");
190
190
  if (await isReducerNativeTestingWorkspace(projectRoot)) {
191
191
  const { bases } = await generateReducerNativeArtifacts({
192
192
  projectRoot,
@@ -3,13 +3,13 @@ import {
3
3
  getStoredSession,
4
4
  loadGlobalConfig,
5
5
  setCredentials
6
- } from "./chunk-5NYBTZB4.mjs";
6
+ } from "./chunk-W2MDP5ZN.mjs";
7
7
  import {
8
8
  IS_PUBLISHED_BUILD,
9
9
  PUBLISHED_ENVIRONMENT,
10
10
  findProjectRoot,
11
11
  loadProjectConfig
12
- } from "./chunk-776W3UGV.mjs";
12
+ } from "./chunk-RHGGFAMQ.mjs";
13
13
  import {
14
14
  client
15
15
  } from "./chunk-NAK77WXW.mjs";
@@ -21,7 +21,7 @@ import {
21
21
  DEFAULT_API_BASE_URL,
22
22
  DEFAULT_WEB_BASE_URL,
23
23
  ENVIRONMENT_CONFIGS
24
- } from "./chunk-H76MT5UR.mjs";
24
+ } from "./chunk-M7UVBANQ.mjs";
25
25
 
26
26
  // ../../node_modules/.pnpm/consola@3.4.2/node_modules/consola/dist/core.mjs
27
27
  var LogLevels = {
@@ -1741,4 +1741,4 @@ export {
1741
1741
  assertCompilerPortableDependencies,
1742
1742
  assertReleaseEnvironmentPortableDependencies
1743
1743
  };
1744
- //# sourceMappingURL=chunk-JO5AMVZU.mjs.map
1744
+ //# sourceMappingURL=chunk-7CNBKWWE.mjs.map
@@ -7,10 +7,10 @@ import {
7
7
  STALE_CONTRACT_ARTIFACT_CODE,
8
8
  isStaleContractArtifactError,
9
9
  toDreamboardApiError
10
- } from "./chunk-IDVQXGAO.mjs";
10
+ } from "./chunk-GD3FL755.mjs";
11
11
  import {
12
12
  loadManifest
13
- } from "./chunk-27EEIZCI.mjs";
13
+ } from "./chunk-M2MHRWSP.mjs";
14
14
  import {
15
15
  REDUCER_TESTING_TYPES_WRAPPER_CONTENT,
16
16
  buildReducerTestingContractContent
@@ -22,7 +22,7 @@ import {
22
22
  getSessionSnapshot,
23
23
  hashContent,
24
24
  startGame
25
- } from "./chunk-C3VW3DTA.mjs";
25
+ } from "./chunk-XIFLZGDQ.mjs";
26
26
  import {
27
27
  external_exports
28
28
  } from "./chunk-JZTH3EMV.mjs";
@@ -35,7 +35,7 @@ import {
35
35
  } from "./chunk-IAYRNVUC.mjs";
36
36
  import {
37
37
  PROJECT_DIR_NAME
38
- } from "./chunk-H76MT5UR.mjs";
38
+ } from "./chunk-M7UVBANQ.mjs";
39
39
 
40
40
  // src/services/testing/reducer-native-test-harness.ts
41
41
  import path2 from "path";
@@ -3134,4 +3134,4 @@ export {
3134
3134
  generateReducerNativeArtifacts,
3135
3135
  runReducerNativeScenarios
3136
3136
  };
3137
- //# sourceMappingURL=chunk-ON62IGWK.mjs.map
3137
+ //# sourceMappingURL=chunk-DN2JHUGM.mjs.map
@@ -3,7 +3,7 @@ import {
3
3
  CLIENT_PROBLEM_TYPES,
4
4
  SERVER_PROBLEM_TYPES,
5
5
  zProblemDetails
6
- } from "./chunk-C3VW3DTA.mjs";
6
+ } from "./chunk-XIFLZGDQ.mjs";
7
7
 
8
8
  // src/utils/problem-types.ts
9
9
  var CLI_PROBLEM_TYPES = {
@@ -219,4 +219,4 @@ export {
219
219
  isStaleContractArtifactError,
220
220
  formatCliError
221
221
  };
222
- //# sourceMappingURL=chunk-IDVQXGAO.mjs.map
222
+ //# sourceMappingURL=chunk-GD3FL755.mjs.map
@@ -6,7 +6,7 @@ import {
6
6
  isLibraryPath,
7
7
  materializeManifest,
8
8
  writeManifestSource
9
- } from "./chunk-C3VW3DTA.mjs";
9
+ } from "./chunk-XIFLZGDQ.mjs";
10
10
  import {
11
11
  atomicWriteFile
12
12
  } from "./chunk-TAEQKBJB.mjs";
@@ -22,7 +22,7 @@ import {
22
22
  PROJECT_DIR_NAME,
23
23
  RULE_FILE,
24
24
  SNAPSHOT_FILE
25
- } from "./chunk-H76MT5UR.mjs";
25
+ } from "./chunk-M7UVBANQ.mjs";
26
26
 
27
27
  // src/services/project/local-files.ts
28
28
  import { readdir, unlink } from "fs/promises";
@@ -182,4 +182,4 @@ export {
182
182
  writeSnapshotFromFiles,
183
183
  getLocalDiff
184
184
  };
185
- //# sourceMappingURL=chunk-27EEIZCI.mjs.map
185
+ //# sourceMappingURL=chunk-M2MHRWSP.mjs.map
@@ -15,6 +15,7 @@ var ENVIRONMENT_CONFIGS = {
15
15
  apiBaseUrl: "https://api-staging.dreamboard.games",
16
16
  webBaseUrl: "https://staging.dreamboard.games",
17
17
  clerkOAuthIssuer: "https://happy-caribou-19.clerk.accounts.dev",
18
+ clerkOAuthClientId: "wkjMF92OFsKbSaGI",
18
19
  clerkOAuthTokenUrl: "https://happy-caribou-19.clerk.accounts.dev/oauth/token",
19
20
  clerkOAuthScope: DEFAULT_CLERK_OAUTH_SCOPE
20
21
  },
@@ -54,4 +55,4 @@ export {
54
55
  RULE_FILE,
55
56
  LOCAL_IGNORE_DIRS
56
57
  };
57
- //# sourceMappingURL=chunk-H76MT5UR.mjs.map
58
+ //# sourceMappingURL=chunk-M7UVBANQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/constants.ts"],"sourcesContent":["import type { EnvironmentConfig } from \"./types.js\";\n\nexport const DEFAULT_API_BASE_URL = \"https://api.dreamboard.games\";\nexport const DEFAULT_WEB_BASE_URL = \"https://dreamboard.games\";\n\nexport const PROJECT_DIR_NAME = \".dreamboard\";\nexport const DEFAULT_CLERK_OAUTH_SCOPE =\n \"openid profile email offline_access\";\n\n// Predefined environment configurations. These are intentionally static:\n// process/env overrides are applied in config resolution so the CLI does not\n// depend on a shell-sourced env file just to know first-party environments.\nexport const ENVIRONMENT_CONFIGS: Record<string, EnvironmentConfig> = {\n local: {\n apiBaseUrl: \"http://localhost:8080\",\n webBaseUrl: \"http://localhost:5173\",\n clerkOAuthScope: DEFAULT_CLERK_OAUTH_SCOPE,\n },\n staging: {\n apiBaseUrl: \"https://api-staging.dreamboard.games\",\n webBaseUrl: \"https://staging.dreamboard.games\",\n clerkOAuthIssuer: \"https://happy-caribou-19.clerk.accounts.dev\",\n clerkOAuthClientId: \"wkjMF92OFsKbSaGI\",\n clerkOAuthTokenUrl:\n \"https://happy-caribou-19.clerk.accounts.dev/oauth/token\",\n clerkOAuthScope: DEFAULT_CLERK_OAUTH_SCOPE,\n },\n prod: {\n apiBaseUrl: \"https://api.dreamboard.games\",\n webBaseUrl: \"https://dreamboard.games\",\n clerkOAuthScope: DEFAULT_CLERK_OAUTH_SCOPE,\n },\n};\nexport const PROJECT_CONFIG_FILE = \"project.json\";\nexport const PROJECT_STATE_FILE = \"state.json\";\nexport const SNAPSHOT_FILE = \"snapshot.json\";\nexport const MANIFEST_FILE = \"manifest.ts\";\nexport const GENERATED_DIR_NAME = \"generated\";\nexport const MATERIALIZED_MANIFEST_FILE = `${PROJECT_DIR_NAME}/${GENERATED_DIR_NAME}/manifest.json`;\nexport const MANIFEST_TYPECHECK_CONFIG_FILE = \"manifest.tsconfig.json\";\nexport const RULE_FILE = \"rule.md\";\nexport const DEFAULT_LOGIN_TIMEOUT_MS = 5 * 60 * 1000;\nexport const DEFAULT_TURN_DELAY_MS = 250;\n\nexport const LOCAL_IGNORE_DIRS = new Set([\n \".dreamboard\",\n \".git\",\n \"node_modules\",\n \"dist\",\n]);\n"],"mappings":";;;AAEO,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAE7B,IAAM,mBAAmB;AACzB,IAAM,4BACX;AAKK,IAAM,sBAAyD;AAAA,EACpE,OAAO;AAAA,IACL,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,iBAAiB;AAAA,EACnB;AAAA,EACA,SAAS;AAAA,IACP,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBACE;AAAA,IACF,iBAAiB;AAAA,EACnB;AAAA,EACA,MAAM;AAAA,IACJ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,iBAAiB;AAAA,EACnB;AACF;AACO,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAC3B,IAAM,gBAAgB;AACtB,IAAM,gBAAgB;AACtB,IAAM,qBAAqB;AAC3B,IAAM,6BAA6B,GAAG,gBAAgB,IAAI,kBAAkB;AAC5E,IAAM,iCAAiC;AACvC,IAAM,YAAY;AAClB,IAAM,2BAA2B,IAAI,KAAK;AAG1C,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;","names":[]}
@@ -5,11 +5,11 @@ import {
5
5
  import {
6
6
  IS_PUBLISHED_BUILD,
7
7
  loadProjectConfig
8
- } from "./chunk-776W3UGV.mjs";
8
+ } from "./chunk-RHGGFAMQ.mjs";
9
9
  import {
10
10
  isDynamicSeedPath,
11
11
  materializeManifest
12
- } from "./chunk-C3VW3DTA.mjs";
12
+ } from "./chunk-XIFLZGDQ.mjs";
13
13
  import {
14
14
  resolveCliRepoRoot
15
15
  } from "./chunk-QBAF7EYR.mjs";
@@ -30,7 +30,7 @@ import {
30
30
  MANIFEST_TYPECHECK_CONFIG_FILE,
31
31
  PROJECT_CONFIG_FILE,
32
32
  PROJECT_DIR_NAME
33
- } from "./chunk-H76MT5UR.mjs";
33
+ } from "./chunk-M7UVBANQ.mjs";
34
34
 
35
35
  // src/services/project/static-scaffold.ts
36
36
  import { existsSync, readFileSync } from "fs";
@@ -539,10 +539,13 @@ async function readProjectLocalMaintainerRegistry(projectRoot) {
539
539
  return projectConfig.localMaintainerRegistry ?? null;
540
540
  }
541
541
  async function getExpectedStaticEntries(projectRoot) {
542
+ const localMaintainerRegistry = await readProjectLocalMaintainerRegistry(projectRoot);
542
543
  const entries = [
543
- ...await getStaticAssetEntries(),
544
+ ...(await getStaticAssetEntries()).filter(
545
+ (entry) => entry.targetPath !== ".npmrc"
546
+ ),
544
547
  ...await getDynamicStaticEntries(projectRoot, "update", {
545
- localMaintainerRegistry: await readProjectLocalMaintainerRegistry(projectRoot)
548
+ localMaintainerRegistry
546
549
  })
547
550
  ];
548
551
  entries.sort(
@@ -726,4 +729,4 @@ export {
726
729
  resolveStaticAssetRoot,
727
730
  resolveSdkDependencyRange
728
731
  };
729
- //# sourceMappingURL=chunk-MW2QIWWA.mjs.map
732
+ //# sourceMappingURL=chunk-NCHH5I7R.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/services/project/static-scaffold.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { readdir, readFile, rm, rmdir, unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { GameTopologyManifest } from \"@dreamboard-games/sdk/types\";\nimport { IS_PUBLISHED_BUILD } from \"../../build-target.js\";\nimport { REDUCER_TESTING_TYPES_WRAPPER_CONTENT } from \"../../templates/testing-types-content.js\";\nimport {\n MANIFEST_TYPECHECK_CONFIG_FILE,\n PROJECT_CONFIG_FILE,\n PROJECT_DIR_NAME,\n} from \"../../constants.js\";\nimport type { LocalMaintainerRegistryConfig } from \"../../types.js\";\nimport {\n ensureDir,\n exists,\n readJsonFile,\n readTextFile,\n readTextFileIfExists,\n writeTextFile,\n} from \"../../utils/fs.js\";\nimport { resolveCliRepoRoot } from \"../../utils/repo-root.js\";\nimport { loadProjectConfig } from \"../../config/project-config.js\";\nimport { materializeManifest } from \"./manifest-authoring.js\";\nimport { isDynamicSeedPath } from \"./scaffold-ownership.js\";\nimport {\n FRAMEWORK_PNPM_OVERRIDES,\n FRAMEWORK_REACT_DEPENDENCIES,\n FRAMEWORK_ZOD_VERSION,\n} from \"./framework-dependencies.js\";\n\ntype StaticScaffoldMode = \"new\" | \"update\";\ntype StaticAssetEntry = {\n targetPath: string;\n content: string;\n};\ntype StaticScaffoldOptions = {\n localMaintainerRegistry?: LocalMaintainerRegistryConfig | null;\n};\ntype RootPackageJsonShape = {\n private?: boolean;\n packageManager?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n overrides?: Record<string, unknown>;\n pnpm?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\nconst DREAMBOARD_SYNC_COMMAND = \"dreamboard sync\";\nconst DREAMBOARD_GITIGNORE_BLOCK = [\n \"# Dreamboard local state\",\n \".dreamboard/state.json\",\n \".dreamboard/snapshot.json\",\n \".dreamboard/dev/\",\n \".dreamboard/generated/\",\n \"\",\n].join(\"\\n\");\nconst TESTING_TYPES_STUB =\n \"export function defineScenario(scenario) { return scenario; }\\n\";\nconst GENERATED_TESTING_TYPES_PREFIX = \"// Generated by dreamboard\";\nconst GENERATED_SCENARIO_PREFIX = \"// Generated by dreamboard scaffold.\";\nconst LEGACY_DREAMBOARD_COMPONENT_INDEX_CONTENT = `export {\n ErrorBoundary,\n type ErrorBoundaryProps,\n} from \"@dreamboard-games/sdk/ui\";\nexport { PluginRuntime, type PluginRuntimeProps } from \"@dreamboard-games/sdk/runtime\";\n`;\nconst OLD_LEGACY_DREAMBOARD_COMPONENT_INDEX_CONTENT = [\n \"export {\",\n \" ErrorBoundary,\",\n \" PluginRuntime,\",\n \" type ErrorBoundaryProps,\",\n \" type PluginRuntimeProps,\",\n `} from \"@dreamboard/ui-${\"sdk\"}\";`,\n \"\",\n].join(\"\\n\");\nconst OLD_PUBLIC_DREAMBOARD_COMPONENT_INDEX_CONTENT = [\n \"export {\",\n \" ErrorBoundary,\",\n \" PluginRuntime,\",\n \" type ErrorBoundaryProps,\",\n \" type PluginRuntimeProps,\",\n `} from \"@dreamboard-games/ui-${\"sdk\"}\";`,\n \"\",\n].join(\"\\n\");\nconst INITIAL_SCENARIO_CONTENT = `${GENERATED_SCENARIO_PREFIX}\nimport { defineScenario } from \"../testing-types\";\n\nexport default defineScenario({\n id: \"smoke-initial-turn\",\n description:\n \"Sanity check that the scaffolded workspace boots into its initial phase.\",\n from: \"initial-turn\",\n when: async () => undefined,\n then: ({ expect, interactions, players, state }) => {\n const playerIds = players();\n expect(playerIds).toHaveLength(playerIds.length);\n expect(playerIds.length).toBeGreaterThanOrEqual(1);\n expect(state()).toBe(\"setup\");\n for (const playerId of playerIds) {\n expect(interactions(playerId)).toEqual([]);\n }\n },\n});\n`;\nconst STATIC_ASSET_ROOT = resolveStaticAssetRoot();\nconst SDK_PACKAGE_PATHS = {\n \"@dreamboard-games/sdk\": [\"packages\", \"sdk\", \"package.json\"],\n} as const;\nconst DEFAULT_SDK_DEPENDENCY_RANGES = {\n \"@dreamboard-games/sdk\": \"0.4.0-alpha.0\",\n} as const;\nconst SDK_DEPENDENCY_RANGES = {\n \"@dreamboard-games/sdk\": resolveSdkDependencyRange(\"@dreamboard-games/sdk\"),\n} as const;\n\nconst FRAMEWORK_SCRIPTS = {\n dev: \"dreamboard dev\",\n \"test:ui\":\n \"tsx --tsconfig test/tsconfig.tsx-runtime.json --test test/ui/**/*.test.tsx\",\n typecheck: `tsc --noEmit -p ${MANIFEST_TYPECHECK_CONFIG_FILE} && tsc --noEmit -p app/tsconfig.json && tsc --noEmit -p ui/tsconfig.json`,\n \"typecheck:manifest\": `tsc --noEmit -p ${MANIFEST_TYPECHECK_CONFIG_FILE}`,\n \"typecheck:app\": \"tsc --noEmit -p app/tsconfig.json\",\n \"typecheck:ui\": \"tsc --noEmit -p ui/tsconfig.json\",\n} as const;\nconst SHARED_DEPENDENCIES = {\n ...FRAMEWORK_REACT_DEPENDENCIES,\n} as const;\nconst ROOT_APP_DEPENDENCIES = {\n zod: FRAMEWORK_ZOD_VERSION,\n} as const;\nconst SHARED_DEV_DEPENDENCIES = {\n typescript: \"^5.9.2\",\n \"@types/node\": \"^24.5.2\",\n \"@types/react\": \"^19.0.0\",\n \"@types/react-dom\": \"^19.0.0\",\n csstype: \"^3.1.3\",\n tsx: \"^4.20.5\",\n} as const;\n\nexport async function scaffoldStaticWorkspace(\n projectRoot: string,\n mode: StaticScaffoldMode,\n options: StaticScaffoldOptions = {},\n): Promise<void> {\n await writeFrameworkStaticFiles(projectRoot, mode, options);\n await ensureDreamboardGitignore(projectRoot);\n await writeManifestTypecheckTsconfig(\n path.join(projectRoot, MANIFEST_TYPECHECK_CONFIG_FILE),\n );\n await removeLegacyVendoredSdkPaths(projectRoot);\n await removeLegacyDreamboardComponentPath(projectRoot);\n\n const testDir = path.join(projectRoot, \"test\");\n const basesDir = path.join(testDir, \"bases\");\n const scenariosDir = path.join(testDir, \"scenarios\");\n const generatedDir = path.join(testDir, \"generated\");\n\n await ensureDir(basesDir);\n await ensureDir(scenariosDir);\n await ensureDir(generatedDir);\n\n await writeTestReadme(path.join(testDir, \"README.md\"));\n await writeGeneratedTestingStubs(generatedDir, mode);\n const initialTestPlayerCount = await inferInitialTestPlayerCount(projectRoot);\n await writeInitialBase(\n path.join(basesDir, \"initial-turn.base.ts\"),\n mode,\n initialTestPlayerCount,\n );\n await writeInitialScenario(\n path.join(scenariosDir, \"smoke-initial-turn.scenario.ts\"),\n mode,\n );\n await writeTestingTypes(path.join(testDir, \"testing-types.ts\"), mode);\n await writeTestTsconfig(path.join(testDir, \"tsconfig.json\"));\n\n const staleDtsPath = path.join(testDir, \"testing-types.d.ts\");\n if (await exists(staleDtsPath)) {\n await unlink(staleDtsPath);\n }\n const staleBaseScenariosPath = path.join(testDir, \"base-scenarios.json\");\n if (await exists(staleBaseScenariosPath)) {\n await unlink(staleBaseScenariosPath);\n }\n\n await migrateLegacyScenarioImports(projectRoot);\n}\n\nasync function ensureDreamboardGitignore(projectRoot: string): Promise<void> {\n const gitignorePath = path.join(projectRoot, \".gitignore\");\n const existing = await readTextFileIfExists(gitignorePath);\n if (existing?.includes(\".dreamboard/state.json\")) {\n return;\n }\n await writeTextFile(\n gitignorePath,\n `${existing ? `${existing.trimEnd()}\\n\\n` : \"\"}${DREAMBOARD_GITIGNORE_BLOCK}`,\n );\n}\n\nexport async function assertCliStaticScaffoldComplete(\n projectRoot: string,\n deletedPaths: readonly string[] = [],\n): Promise<void> {\n const expectedEntries = await getExpectedStaticEntries(projectRoot);\n const missingOrBlankPaths: string[] = [];\n\n for (const entry of expectedEntries) {\n const fullPath = path.join(projectRoot, entry.targetPath);\n const content = await readTextFileIfExists(fullPath);\n\n if (content === null || content.trim().length === 0) {\n missingOrBlankPaths.push(entry.targetPath);\n }\n }\n\n const staticPaths = new Set(expectedEntries.map((entry) => entry.targetPath));\n const deletedStaticPaths = deletedPaths\n .map(normalizeProjectPath)\n .filter((filePath) => staticPaths.has(filePath))\n .sort();\n\n if (missingOrBlankPaths.length === 0 && deletedStaticPaths.length === 0) {\n return;\n }\n\n const problems: string[] = [];\n if (missingOrBlankPaths.length > 0) {\n problems.push(\n `missing or blank: ${summarizePaths(missingOrBlankPaths.sort())}`,\n );\n }\n if (deletedStaticPaths.length > 0) {\n problems.push(`deleted: ${summarizePaths(deletedStaticPaths)}`);\n }\n\n throw new Error(\n `CLI static scaffold is incomplete (${problems.join(\"; \")}). Run \\`${DREAMBOARD_SYNC_COMMAND}\\` to refresh the scaffold before compiling.`,\n );\n}\n\nasync function writeFrameworkStaticFiles(\n projectRoot: string,\n mode: StaticScaffoldMode,\n options: StaticScaffoldOptions,\n): Promise<void> {\n const assetEntries = await getStaticAssetEntries();\n\n for (const entry of assetEntries) {\n const fullPath = path.join(projectRoot, entry.targetPath);\n // Dynamic seed files are user-customizable: only write them on first\n // scaffold; preserve existing content on subsequent updates.\n if (mode === \"update\" && isDynamicSeedPath(entry.targetPath)) {\n const existing = await readTextFileIfExists(fullPath);\n if (existing !== null && existing.trim().length > 0) {\n continue;\n }\n }\n await writeTextFile(fullPath, entry.content);\n }\n\n for (const entry of await getDynamicStaticEntries(\n projectRoot,\n mode,\n options,\n )) {\n await writeTextFile(\n path.join(projectRoot, entry.targetPath),\n entry.content,\n );\n }\n\n if (!options.localMaintainerRegistry) {\n await rm(path.join(projectRoot, \".npmrc\"), { force: true });\n }\n}\n\nasync function removeLegacyVendoredSdkPaths(\n projectRoot: string,\n): Promise<void> {\n await rm(path.join(projectRoot, \"app\", \"sdk\"), {\n recursive: true,\n force: true,\n });\n await rm(path.join(projectRoot, \"ui\", \"sdk\"), {\n recursive: true,\n force: true,\n });\n}\n\nasync function removeLegacyDreamboardComponentPath(\n projectRoot: string,\n): Promise<void> {\n const legacyDirPath = path.join(\n projectRoot,\n \"ui\",\n \"components\",\n \"dreamboard\",\n );\n const legacyIndexPath = path.join(legacyDirPath, \"index.ts\");\n const existing = await readTextFileIfExists(legacyIndexPath);\n\n const removableLegacyContents = new Set([\n LEGACY_DREAMBOARD_COMPONENT_INDEX_CONTENT.trim(),\n OLD_LEGACY_DREAMBOARD_COMPONENT_INDEX_CONTENT.trim(),\n OLD_PUBLIC_DREAMBOARD_COMPONENT_INDEX_CONTENT.trim(),\n ]);\n\n if (existing === null || !removableLegacyContents.has(existing.trim())) {\n return;\n }\n\n await unlink(legacyIndexPath);\n const remainingEntries = await readdir(legacyDirPath).catch(() => []);\n if (remainingEntries.length === 0) {\n await rmdir(legacyDirPath);\n }\n}\n\nasync function writeTestReadme(filePath: string): Promise<void> {\n await writeTextFile(\n filePath,\n \"# Dreamboard Test Workspace\\n\\nTypeScript bases live in `test/bases/*.base.ts` and scenarios live in `test/scenarios/*.scenario.ts`.\\n\\n1. Define reusable seeded bases with `defineBase({ id, seed, players, setupProfileId?, setup })`.\\n2. Define scenarios with `defineScenario({ id, from, when, then })`.\\n3. Scenario assertions can read `players()`, `state()`, `view(playerId)`, and `interactions(playerId)`.\\n4. Generate deterministic base snapshots: `dreamboard test generate`.\\n5. Run tests: `dreamboard test run`.\\n\\nImport test helpers from `../testing-types`.\\n\\nGenerated artifacts are written to `test/generated/*` and should not be edited manually.\\n\",\n );\n}\n\nasync function writeInitialBase(\n filePath: string,\n mode: StaticScaffoldMode,\n players: number,\n): Promise<void> {\n if (mode === \"update\") {\n return;\n }\n\n await writeTextFile(\n filePath,\n `import { defineBase } from \"../testing-types\";\n\nexport default defineBase({\n id: \"initial-turn\",\n seed: 1337,\n players: ${players},\n setup: async () => undefined,\n});\n`,\n );\n}\n\nasync function writeInitialScenario(\n filePath: string,\n mode: StaticScaffoldMode,\n): Promise<void> {\n if (mode === \"new\") {\n await writeTextFile(filePath, INITIAL_SCENARIO_CONTENT);\n return;\n }\n\n const existing = await readTextFileIfExists(filePath);\n if (\n existing === null ||\n existing.trim().length === 0 ||\n existing === INITIAL_SCENARIO_CONTENT\n ) {\n await writeTextFile(filePath, INITIAL_SCENARIO_CONTENT);\n }\n}\n\nasync function writeTestingTypes(\n filePath: string,\n mode: StaticScaffoldMode,\n): Promise<void> {\n if (mode === \"new\") {\n await writeTextFile(filePath, REDUCER_TESTING_TYPES_WRAPPER_CONTENT);\n return;\n }\n\n const existing = await readTextFileIfExists(filePath);\n if (shouldRefreshGeneratedTestingTypes(existing)) {\n await writeTextFile(filePath, REDUCER_TESTING_TYPES_WRAPPER_CONTENT);\n }\n}\n\nasync function writeGeneratedTestingStubs(\n generatedDir: string,\n mode: StaticScaffoldMode,\n): Promise<void> {\n const header = \"// Generated by dreamboard scaffold. Do not edit by hand.\\n\";\n await writeGeneratedTestingStubFile(\n path.join(generatedDir, \"base-states.generated.ts\"),\n `${header}export const BASE_STATES = {} as const;\\nexport const BASE_STATES_CONTRACT_FINGERPRINT = undefined;\\n`,\n mode,\n );\n await writeGeneratedTestingStubFile(\n path.join(generatedDir, \"base-states.generated.d.ts\"),\n `${header}export declare const BASE_STATES: Record<string, unknown>;\\nexport declare const BASE_STATES_CONTRACT_FINGERPRINT: string | undefined;\\n`,\n mode,\n );\n await writeGeneratedTestingStubFile(\n path.join(generatedDir, \"testing-contract.ts\"),\n `${header}export type BaseId = string;\\nexport type GameView = unknown;\\nexport type InteractionId = string;\\nexport type InteractionParamsOf<_Id extends string> = Record<string, unknown>;\\nexport type PhaseName = string;\\nexport type PlayerId = string;\\nexport type RejectionCode = string;\\nexport type StateName = string;\\nexport type TestRunner = \"reducer\" | \"remote\" | \"browser\";\\nexport type ViewByPhase = Record<string, GameView>;\\nexport type WorkspaceStageName<_Phase extends string = string> = string;\\nexport type Expectation = { [matcher: string]: (...args: unknown[]) => unknown; not: Expectation };\\nexport type ExpectFn = (actual: unknown) => Expectation;\\nexport type InteractionExplanation = { interactionId: string; phase: string; step: string | null; availability: \"available\" | \"notYourTurn\" | \"wrongPhase\" | \"wrongStep\" | \"blocked\"; rules: readonly { ruleId: string; outcome: \"passed\" | \"failed\" | \"notEvaluated\"; errorCode?: string; message?: string; }[]; actor: { required: readonly string[]; playerIsActor: boolean }; inputs: readonly { key: string; kind: string; eligibleCount: number | \"lazy\"; }[]; };\\nexport interface InteractionDescriptorFor<Id extends string = string> { interactionId: Id; [key: string]: unknown; }\\nexport interface ScenarioGameApi { start(): Promise<void>; submit<Id extends InteractionId>(playerId: PlayerId, interactionId: Id, params?: InteractionParamsOf<Id>): Promise<void>; }\\nexport interface BaseContext { game: ScenarioGameApi; players(): readonly PlayerId[]; seat(index: number): PlayerId; }\\nexport interface SharedScenarioContext { game: ScenarioGameApi; players(): readonly PlayerId[]; seat(index: number): PlayerId; state(): StateName; view(playerId: PlayerId): GameView; interactions(playerId: PlayerId): readonly InteractionDescriptorFor[]; explain(playerId: PlayerId, interactionId: InteractionId): InteractionExplanation; expect: ExpectFn; }\\nexport type ScenarioContext<Phase extends PhaseName | undefined = undefined> = Omit<SharedScenarioContext, \"state\" | \"view\"> & { state(): Phase extends PhaseName ? Phase : StateName; view(playerId: PlayerId): Phase extends PhaseName ? ViewByPhase[Phase] : GameView; };\\nexport type ScenarioThenContext<_Runners extends readonly TestRunner[] = readonly [\"reducer\"], Phase extends PhaseName | undefined = undefined> = ScenarioContext<Phase>;\\nexport interface BaseDefinition { id: string; seed?: number; players?: number; setupProfileId?: string; extends?: BaseId | string; setup: (ctx: BaseContext) => void | Promise<void>; }\\nexport interface ScenarioDefinition<Runners extends readonly TestRunner[] = readonly [\"reducer\"], Phase extends PhaseName | undefined = undefined> { id: string; description?: string; from: BaseId | string; runners?: Runners; phase?: Phase; stage?: Phase extends PhaseName ? WorkspaceStageName<Phase> : never; when: (ctx: ScenarioContext<Phase>) => void | Promise<void>; then: (ctx: ScenarioThenContext<Runners, Phase>) => void | Promise<void>; }\\n`,\n mode,\n );\n await writeGeneratedTestingStubFile(\n path.join(generatedDir, \"scenario-manifest.generated.ts\"),\n `${header}export const SCENARIO_MANIFEST = [] as const;\\n`,\n mode,\n );\n}\n\nasync function writeGeneratedTestingStubFile(\n filePath: string,\n content: string,\n mode: StaticScaffoldMode,\n): Promise<void> {\n if (mode === \"new\") {\n await writeTextFile(filePath, content);\n return;\n }\n\n const existing = await readTextFileIfExists(filePath);\n if (\n existing === null ||\n existing.trim().length === 0 ||\n existing.startsWith(GENERATED_SCENARIO_PREFIX)\n ) {\n await writeTextFile(filePath, content);\n }\n}\n\nasync function writeTestTsconfig(filePath: string): Promise<void> {\n await writeTextFile(\n filePath,\n `${JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2022\",\n module: \"ESNext\",\n moduleResolution: \"bundler\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n noEmit: true,\n },\n include: [\n \"./**/*.ts\",\n \"./**/*.d.ts\",\n \"../shared/**/*.ts\",\n \"../shared/**/*.d.ts\",\n ],\n },\n null,\n 2,\n )}\\n`,\n );\n}\n\nasync function writeManifestTypecheckTsconfig(filePath: string): Promise<void> {\n await writeTextFile(\n filePath,\n `${JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2022\",\n module: \"ESNext\",\n moduleResolution: \"bundler\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n noEmit: true,\n allowImportingTsExtensions: true,\n },\n include: [\"./manifest.ts\"],\n },\n null,\n 2,\n )}\\n`,\n );\n}\n\nexport async function migrateLegacyScenarioImports(\n projectRoot: string,\n): Promise<void> {\n const scenariosRoot = path.join(projectRoot, \"test\", \"scenarios\");\n if (!(await exists(scenariosRoot))) return;\n\n const scenarioFiles = await collectScenarioFiles(scenariosRoot);\n for (const filePath of scenarioFiles) {\n const content = await readTextFile(filePath);\n if (!content.includes(\"@dreamboard/cli/testing\")) continue;\n\n const relativeToTestingTypes = normalizeImportPath(\n path.relative(\n path.dirname(filePath),\n path.join(projectRoot, \"test\", \"testing-types\"),\n ),\n );\n\n const migrated = content\n .replaceAll('\"@dreamboard/cli/testing\"', `\"${relativeToTestingTypes}\"`)\n .replaceAll(\"'@dreamboard/cli/testing'\", `'${relativeToTestingTypes}'`);\n\n if (migrated !== content) {\n await writeTextFile(filePath, migrated);\n }\n }\n}\n\nfunction shouldRefreshGeneratedTestingTypes(\n existingContent: string | null,\n): boolean {\n if (existingContent === null || existingContent.trim().length === 0) {\n return true;\n }\n if (existingContent === TESTING_TYPES_STUB) {\n return true;\n }\n return existingContent.startsWith(GENERATED_TESTING_TYPES_PREFIX);\n}\n\nasync function inferInitialTestPlayerCount(\n projectRoot: string,\n): Promise<number> {\n const manifestPath = path.join(projectRoot, \"manifest.ts\");\n if (!(await exists(manifestPath))) {\n return 4;\n }\n\n try {\n const manifest = await materializeManifest(projectRoot);\n return manifest.players.optimalPlayers ?? manifest.players.minPlayers ?? 4;\n } catch {\n return 4;\n }\n}\n\nasync function collectScenarioFiles(rootDir: string): Promise<string[]> {\n const files: string[] = [];\n const stack = [rootDir];\n\n while (stack.length > 0) {\n const dir = stack.pop();\n if (!dir) continue;\n\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n stack.push(fullPath);\n } else if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n files.push(fullPath);\n }\n }\n }\n\n return files;\n}\n\nexport function resolveStaticAssetRoot(\n importUrl: string = import.meta.url,\n): string {\n const candidates = [\n fileURLToPath(new URL(\"../../scaffold/assets/static/\", importUrl)),\n fileURLToPath(new URL(\"./scaffold/assets/static/\", importUrl)),\n fileURLToPath(new URL(\"../scaffold/assets/static/\", importUrl)),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(\n `Unable to locate CLI static scaffold assets. Checked: ${candidates.join(\", \")}`,\n );\n}\n\nasync function getStaticAssetEntries(): Promise<StaticAssetEntry[]> {\n const files = await walkFiles(STATIC_ASSET_ROOT);\n const entries: StaticAssetEntry[] = [];\n\n for (const filePath of files) {\n const targetPath = normalizeProjectPath(\n path.relative(STATIC_ASSET_ROOT, filePath),\n );\n entries.push({\n targetPath,\n content: await readFile(filePath, \"utf8\"),\n });\n }\n\n entries.sort((left, right) =>\n left.targetPath.localeCompare(right.targetPath),\n );\n return entries;\n}\n\nasync function getDynamicStaticEntries(\n projectRoot: string,\n mode: StaticScaffoldMode,\n options: StaticScaffoldOptions = {},\n): Promise<StaticAssetEntry[]> {\n const entries: StaticAssetEntry[] = [\n {\n targetPath: \"package.json\",\n content: await buildRootPackageJson(projectRoot, mode, options),\n },\n {\n targetPath: \"ui/package.json\",\n content: buildUiPackageJson(),\n },\n ];\n\n if (options.localMaintainerRegistry) {\n entries.push({\n targetPath: \".npmrc\",\n content: buildWorkspaceNpmrc(options.localMaintainerRegistry.registryUrl),\n });\n }\n\n return entries;\n}\n\nasync function readProjectLocalMaintainerRegistry(\n projectRoot: string,\n): Promise<LocalMaintainerRegistryConfig | null> {\n const projectConfigPath = path.join(\n projectRoot,\n PROJECT_DIR_NAME,\n PROJECT_CONFIG_FILE,\n );\n if (!(await exists(projectConfigPath))) {\n return null;\n }\n\n const projectConfig = await loadProjectConfig(projectRoot);\n return projectConfig.localMaintainerRegistry ?? null;\n}\n\nasync function getExpectedStaticEntries(\n projectRoot: string,\n): Promise<StaticAssetEntry[]> {\n const entries = [\n ...(await getStaticAssetEntries()),\n ...(await getDynamicStaticEntries(projectRoot, \"update\", {\n localMaintainerRegistry:\n await readProjectLocalMaintainerRegistry(projectRoot),\n })),\n ];\n entries.sort((left, right) =>\n left.targetPath.localeCompare(right.targetPath),\n );\n return entries;\n}\n\nasync function walkFiles(rootDir: string): Promise<string[]> {\n const files: string[] = [];\n const stack = [rootDir];\n\n while (stack.length > 0) {\n const currentDir = stack.pop();\n if (!currentDir) continue;\n\n const entries = await readdir(currentDir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(currentDir, entry.name);\n if (entry.isDirectory()) {\n stack.push(fullPath);\n } else if (entry.isFile()) {\n files.push(fullPath);\n }\n }\n }\n\n files.sort((left, right) => left.localeCompare(right));\n return files;\n}\n\nasync function buildRootPackageJson(\n projectRoot: string,\n mode: StaticScaffoldMode,\n options: StaticScaffoldOptions,\n): Promise<string> {\n const sdkPackageRanges = {\n ...SDK_DEPENDENCY_RANGES,\n ...(options.localMaintainerRegistry?.packages ?? {}),\n };\n const packageJsonPath = path.join(projectRoot, \"package.json\");\n const existingPackageJson =\n mode === \"update\" && (await exists(packageJsonPath))\n ? await readJsonFile<RootPackageJsonShape>(packageJsonPath)\n : null;\n const {\n dreamboardFrameworkVersion: _legacyFrameworkVersion,\n ...existingPackageJsonWithoutLegacyVersion\n } = existingPackageJson ?? {};\n const frameworkDependencies = {\n \"@dreamboard-games/sdk\":\n sdkPackageRanges[\"@dreamboard-games/sdk\"] ??\n SDK_DEPENDENCY_RANGES[\"@dreamboard-games/sdk\"],\n ...SHARED_DEPENDENCIES,\n ...ROOT_APP_DEPENDENCIES,\n };\n const frameworkDevDependencies = {\n ...SHARED_DEV_DEPENDENCIES,\n };\n const nextPackageJson: RootPackageJsonShape = {\n ...existingPackageJsonWithoutLegacyVersion,\n private: true,\n scripts: {\n ...(existingPackageJson?.scripts ?? {}),\n ...FRAMEWORK_SCRIPTS,\n },\n dependencies: {\n ...(existingPackageJson?.dependencies ?? {}),\n ...frameworkDependencies,\n },\n devDependencies: {\n ...(existingPackageJson?.devDependencies ?? {}),\n ...frameworkDevDependencies,\n },\n pnpm: mergePnpmConfig(existingPackageJson?.pnpm),\n };\n return `${JSON.stringify(nextPackageJson, null, 2)}\\n`;\n}\n\nfunction mergePnpmConfig(\n existingPnpm: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n const existingOverrides =\n existingPnpm?.overrides &&\n typeof existingPnpm.overrides === \"object\" &&\n !Array.isArray(existingPnpm.overrides)\n ? (existingPnpm.overrides as Record<string, unknown>)\n : {};\n return {\n ...(existingPnpm ?? {}),\n overrides: {\n ...existingOverrides,\n ...FRAMEWORK_PNPM_OVERRIDES,\n },\n };\n}\n\nfunction buildWorkspaceNpmrc(registryUrl: string): string {\n return `@dreamboard-games:registry=${registryUrl}\\n`;\n}\n\nfunction buildUiPackageJson(): string {\n return `${JSON.stringify(\n {\n private: true,\n dependencies: SHARED_DEPENDENCIES,\n devDependencies: SHARED_DEV_DEPENDENCIES,\n },\n null,\n 2,\n )}\\n`;\n}\n\nfunction readPackageVersion(\n packageJsonPath: string,\n packageName: string,\n): string | null {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\n version?: unknown;\n };\n\n if (\n typeof packageJson.version !== \"string\" ||\n packageJson.version.trim().length === 0\n ) {\n return null;\n }\n\n return `^${packageJson.version.trim()}`;\n}\n\nfunction findNearestPackageJsonPath(\n importMetaUrl: string = import.meta.url,\n): string | null {\n let current = path.dirname(fileURLToPath(importMetaUrl));\n\n while (true) {\n const candidate = path.join(current, \"package.json\");\n if (existsSync(candidate)) {\n return candidate;\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n return null;\n }\n current = parent;\n }\n}\n\nfunction isSourceCheckoutCliPackageJsonPath(\n packageJsonPath: string,\n importMetaUrl: string = import.meta.url,\n): boolean {\n try {\n return (\n path.resolve(packageJsonPath) ===\n path.join(\n resolveCliRepoRoot(importMetaUrl),\n \"apps\",\n \"dreamboard-cli\",\n \"package.json\",\n )\n );\n } catch {\n return false;\n }\n}\n\nfunction readPackagedSdkDependencyRange(\n packageName: keyof typeof SDK_PACKAGE_PATHS,\n importMetaUrl: string = import.meta.url,\n): string | null {\n const packageJsonPath = findNearestPackageJsonPath(importMetaUrl);\n if (!packageJsonPath) {\n return null;\n }\n\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\n dependencies?: Record<string, unknown>;\n };\n\n const packagedRange = packageJson.dependencies?.[packageName];\n if (\n typeof packagedRange !== \"string\" ||\n packagedRange.trim().length === 0 ||\n packagedRange.startsWith(\"workspace:\") ||\n packagedRange.startsWith(\"link:\") ||\n (packagedRange.startsWith(\"file:\") &&\n !IS_PUBLISHED_BUILD &&\n isSourceCheckoutCliPackageJsonPath(packageJsonPath, importMetaUrl))\n ) {\n return null;\n }\n\n return packagedRange.trim();\n}\n\n/**\n * Local Verdaccio snapshot pins (`x.y.z-local.<timestamp>.<fingerprint>`) are\n * only resolvable on the maintainer machine that published them. Scaffolded\n * workspaces must always start from a registry-publishable version, so\n * normalize any inherited snapshot pin to its public base version.\n */\nfunction stripLocalSnapshotSuffix(range: string): string {\n return range.replace(/-local\\..*$/, \"\");\n}\n\nexport function resolveSdkDependencyRange(\n packageName: keyof typeof SDK_PACKAGE_PATHS,\n importMetaUrl: string = import.meta.url,\n): string {\n const packagedRange = readPackagedSdkDependencyRange(\n packageName,\n importMetaUrl,\n );\n if (packagedRange) {\n return stripLocalSnapshotSuffix(packagedRange);\n }\n\n try {\n const repoRoot = resolveCliRepoRoot(importMetaUrl);\n const packageJsonPath = path.join(\n repoRoot,\n ...SDK_PACKAGE_PATHS[packageName],\n );\n const repoRange = readPackageVersion(packageJsonPath, packageName);\n if (repoRange) {\n return stripLocalSnapshotSuffix(repoRange);\n }\n } catch {\n // Published installs do not include the monorepo layout.\n }\n\n return DEFAULT_SDK_DEPENDENCY_RANGES[packageName];\n}\n\nfunction normalizeImportPath(relativePath: string): string {\n const normalized = relativePath.replaceAll(\"\\\\\", \"/\");\n if (normalized.startsWith(\".\")) return normalized;\n return `./${normalized}`;\n}\n\nfunction normalizeProjectPath(filePath: string): string {\n return filePath.replace(/^\\.\\//, \"\").replace(/^\\/+/, \"\").replace(/\\\\/g, \"/\");\n}\n\nfunction summarizePaths(paths: readonly string[]): string {\n const maxShown = 5;\n const shown = paths.slice(0, maxShown).join(\", \");\n if (paths.length <= maxShown) return shown;\n return `${shown}, and ${paths.length - maxShown} more`;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/services/project/static-scaffold.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { readdir, readFile, rm, rmdir, unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { GameTopologyManifest } from \"@dreamboard-games/sdk/types\";\nimport { IS_PUBLISHED_BUILD } from \"../../build-target.js\";\nimport { REDUCER_TESTING_TYPES_WRAPPER_CONTENT } from \"../../templates/testing-types-content.js\";\nimport {\n MANIFEST_TYPECHECK_CONFIG_FILE,\n PROJECT_CONFIG_FILE,\n PROJECT_DIR_NAME,\n} from \"../../constants.js\";\nimport type { LocalMaintainerRegistryConfig } from \"../../types.js\";\nimport {\n ensureDir,\n exists,\n readJsonFile,\n readTextFile,\n readTextFileIfExists,\n writeTextFile,\n} from \"../../utils/fs.js\";\nimport { resolveCliRepoRoot } from \"../../utils/repo-root.js\";\nimport { loadProjectConfig } from \"../../config/project-config.js\";\nimport { materializeManifest } from \"./manifest-authoring.js\";\nimport { isDynamicSeedPath } from \"./scaffold-ownership.js\";\nimport {\n FRAMEWORK_PNPM_OVERRIDES,\n FRAMEWORK_REACT_DEPENDENCIES,\n FRAMEWORK_ZOD_VERSION,\n} from \"./framework-dependencies.js\";\n\ntype StaticScaffoldMode = \"new\" | \"update\";\ntype StaticAssetEntry = {\n targetPath: string;\n content: string;\n};\ntype StaticScaffoldOptions = {\n localMaintainerRegistry?: LocalMaintainerRegistryConfig | null;\n};\ntype RootPackageJsonShape = {\n private?: boolean;\n packageManager?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n overrides?: Record<string, unknown>;\n pnpm?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\nconst DREAMBOARD_SYNC_COMMAND = \"dreamboard sync\";\nconst DREAMBOARD_GITIGNORE_BLOCK = [\n \"# Dreamboard local state\",\n \".dreamboard/state.json\",\n \".dreamboard/snapshot.json\",\n \".dreamboard/dev/\",\n \".dreamboard/generated/\",\n \"\",\n].join(\"\\n\");\nconst TESTING_TYPES_STUB =\n \"export function defineScenario(scenario) { return scenario; }\\n\";\nconst GENERATED_TESTING_TYPES_PREFIX = \"// Generated by dreamboard\";\nconst GENERATED_SCENARIO_PREFIX = \"// Generated by dreamboard scaffold.\";\nconst LEGACY_DREAMBOARD_COMPONENT_INDEX_CONTENT = `export {\n ErrorBoundary,\n type ErrorBoundaryProps,\n} from \"@dreamboard-games/sdk/ui\";\nexport { PluginRuntime, type PluginRuntimeProps } from \"@dreamboard-games/sdk/runtime\";\n`;\nconst OLD_LEGACY_DREAMBOARD_COMPONENT_INDEX_CONTENT = [\n \"export {\",\n \" ErrorBoundary,\",\n \" PluginRuntime,\",\n \" type ErrorBoundaryProps,\",\n \" type PluginRuntimeProps,\",\n `} from \"@dreamboard/ui-${\"sdk\"}\";`,\n \"\",\n].join(\"\\n\");\nconst OLD_PUBLIC_DREAMBOARD_COMPONENT_INDEX_CONTENT = [\n \"export {\",\n \" ErrorBoundary,\",\n \" PluginRuntime,\",\n \" type ErrorBoundaryProps,\",\n \" type PluginRuntimeProps,\",\n `} from \"@dreamboard-games/ui-${\"sdk\"}\";`,\n \"\",\n].join(\"\\n\");\nconst INITIAL_SCENARIO_CONTENT = `${GENERATED_SCENARIO_PREFIX}\nimport { defineScenario } from \"../testing-types\";\n\nexport default defineScenario({\n id: \"smoke-initial-turn\",\n description:\n \"Sanity check that the scaffolded workspace boots into its initial phase.\",\n from: \"initial-turn\",\n when: async () => undefined,\n then: ({ expect, interactions, players, state }) => {\n const playerIds = players();\n expect(playerIds).toHaveLength(playerIds.length);\n expect(playerIds.length).toBeGreaterThanOrEqual(1);\n expect(state()).toBe(\"setup\");\n for (const playerId of playerIds) {\n expect(interactions(playerId)).toEqual([]);\n }\n },\n});\n`;\nconst STATIC_ASSET_ROOT = resolveStaticAssetRoot();\nconst SDK_PACKAGE_PATHS = {\n \"@dreamboard-games/sdk\": [\"packages\", \"sdk\", \"package.json\"],\n} as const;\nconst DEFAULT_SDK_DEPENDENCY_RANGES = {\n \"@dreamboard-games/sdk\": \"0.4.0-alpha.0\",\n} as const;\nconst SDK_DEPENDENCY_RANGES = {\n \"@dreamboard-games/sdk\": resolveSdkDependencyRange(\"@dreamboard-games/sdk\"),\n} as const;\n\nconst FRAMEWORK_SCRIPTS = {\n dev: \"dreamboard dev\",\n \"test:ui\":\n \"tsx --tsconfig test/tsconfig.tsx-runtime.json --test test/ui/**/*.test.tsx\",\n typecheck: `tsc --noEmit -p ${MANIFEST_TYPECHECK_CONFIG_FILE} && tsc --noEmit -p app/tsconfig.json && tsc --noEmit -p ui/tsconfig.json`,\n \"typecheck:manifest\": `tsc --noEmit -p ${MANIFEST_TYPECHECK_CONFIG_FILE}`,\n \"typecheck:app\": \"tsc --noEmit -p app/tsconfig.json\",\n \"typecheck:ui\": \"tsc --noEmit -p ui/tsconfig.json\",\n} as const;\nconst SHARED_DEPENDENCIES = {\n ...FRAMEWORK_REACT_DEPENDENCIES,\n} as const;\nconst ROOT_APP_DEPENDENCIES = {\n zod: FRAMEWORK_ZOD_VERSION,\n} as const;\nconst SHARED_DEV_DEPENDENCIES = {\n typescript: \"^5.9.2\",\n \"@types/node\": \"^24.5.2\",\n \"@types/react\": \"^19.0.0\",\n \"@types/react-dom\": \"^19.0.0\",\n csstype: \"^3.1.3\",\n tsx: \"^4.20.5\",\n} as const;\n\nexport async function scaffoldStaticWorkspace(\n projectRoot: string,\n mode: StaticScaffoldMode,\n options: StaticScaffoldOptions = {},\n): Promise<void> {\n await writeFrameworkStaticFiles(projectRoot, mode, options);\n await ensureDreamboardGitignore(projectRoot);\n await writeManifestTypecheckTsconfig(\n path.join(projectRoot, MANIFEST_TYPECHECK_CONFIG_FILE),\n );\n await removeLegacyVendoredSdkPaths(projectRoot);\n await removeLegacyDreamboardComponentPath(projectRoot);\n\n const testDir = path.join(projectRoot, \"test\");\n const basesDir = path.join(testDir, \"bases\");\n const scenariosDir = path.join(testDir, \"scenarios\");\n const generatedDir = path.join(testDir, \"generated\");\n\n await ensureDir(basesDir);\n await ensureDir(scenariosDir);\n await ensureDir(generatedDir);\n\n await writeTestReadme(path.join(testDir, \"README.md\"));\n await writeGeneratedTestingStubs(generatedDir, mode);\n const initialTestPlayerCount = await inferInitialTestPlayerCount(projectRoot);\n await writeInitialBase(\n path.join(basesDir, \"initial-turn.base.ts\"),\n mode,\n initialTestPlayerCount,\n );\n await writeInitialScenario(\n path.join(scenariosDir, \"smoke-initial-turn.scenario.ts\"),\n mode,\n );\n await writeTestingTypes(path.join(testDir, \"testing-types.ts\"), mode);\n await writeTestTsconfig(path.join(testDir, \"tsconfig.json\"));\n\n const staleDtsPath = path.join(testDir, \"testing-types.d.ts\");\n if (await exists(staleDtsPath)) {\n await unlink(staleDtsPath);\n }\n const staleBaseScenariosPath = path.join(testDir, \"base-scenarios.json\");\n if (await exists(staleBaseScenariosPath)) {\n await unlink(staleBaseScenariosPath);\n }\n\n await migrateLegacyScenarioImports(projectRoot);\n}\n\nasync function ensureDreamboardGitignore(projectRoot: string): Promise<void> {\n const gitignorePath = path.join(projectRoot, \".gitignore\");\n const existing = await readTextFileIfExists(gitignorePath);\n if (existing?.includes(\".dreamboard/state.json\")) {\n return;\n }\n await writeTextFile(\n gitignorePath,\n `${existing ? `${existing.trimEnd()}\\n\\n` : \"\"}${DREAMBOARD_GITIGNORE_BLOCK}`,\n );\n}\n\nexport async function assertCliStaticScaffoldComplete(\n projectRoot: string,\n deletedPaths: readonly string[] = [],\n): Promise<void> {\n const expectedEntries = await getExpectedStaticEntries(projectRoot);\n const missingOrBlankPaths: string[] = [];\n\n for (const entry of expectedEntries) {\n const fullPath = path.join(projectRoot, entry.targetPath);\n const content = await readTextFileIfExists(fullPath);\n\n if (content === null || content.trim().length === 0) {\n missingOrBlankPaths.push(entry.targetPath);\n }\n }\n\n const staticPaths = new Set(expectedEntries.map((entry) => entry.targetPath));\n const deletedStaticPaths = deletedPaths\n .map(normalizeProjectPath)\n .filter((filePath) => staticPaths.has(filePath))\n .sort();\n\n if (missingOrBlankPaths.length === 0 && deletedStaticPaths.length === 0) {\n return;\n }\n\n const problems: string[] = [];\n if (missingOrBlankPaths.length > 0) {\n problems.push(\n `missing or blank: ${summarizePaths(missingOrBlankPaths.sort())}`,\n );\n }\n if (deletedStaticPaths.length > 0) {\n problems.push(`deleted: ${summarizePaths(deletedStaticPaths)}`);\n }\n\n throw new Error(\n `CLI static scaffold is incomplete (${problems.join(\"; \")}). Run \\`${DREAMBOARD_SYNC_COMMAND}\\` to refresh the scaffold before compiling.`,\n );\n}\n\nasync function writeFrameworkStaticFiles(\n projectRoot: string,\n mode: StaticScaffoldMode,\n options: StaticScaffoldOptions,\n): Promise<void> {\n const assetEntries = await getStaticAssetEntries();\n\n for (const entry of assetEntries) {\n const fullPath = path.join(projectRoot, entry.targetPath);\n // Dynamic seed files are user-customizable: only write them on first\n // scaffold; preserve existing content on subsequent updates.\n if (mode === \"update\" && isDynamicSeedPath(entry.targetPath)) {\n const existing = await readTextFileIfExists(fullPath);\n if (existing !== null && existing.trim().length > 0) {\n continue;\n }\n }\n await writeTextFile(fullPath, entry.content);\n }\n\n for (const entry of await getDynamicStaticEntries(\n projectRoot,\n mode,\n options,\n )) {\n await writeTextFile(\n path.join(projectRoot, entry.targetPath),\n entry.content,\n );\n }\n\n if (!options.localMaintainerRegistry) {\n await rm(path.join(projectRoot, \".npmrc\"), { force: true });\n }\n}\n\nasync function removeLegacyVendoredSdkPaths(\n projectRoot: string,\n): Promise<void> {\n await rm(path.join(projectRoot, \"app\", \"sdk\"), {\n recursive: true,\n force: true,\n });\n await rm(path.join(projectRoot, \"ui\", \"sdk\"), {\n recursive: true,\n force: true,\n });\n}\n\nasync function removeLegacyDreamboardComponentPath(\n projectRoot: string,\n): Promise<void> {\n const legacyDirPath = path.join(\n projectRoot,\n \"ui\",\n \"components\",\n \"dreamboard\",\n );\n const legacyIndexPath = path.join(legacyDirPath, \"index.ts\");\n const existing = await readTextFileIfExists(legacyIndexPath);\n\n const removableLegacyContents = new Set([\n LEGACY_DREAMBOARD_COMPONENT_INDEX_CONTENT.trim(),\n OLD_LEGACY_DREAMBOARD_COMPONENT_INDEX_CONTENT.trim(),\n OLD_PUBLIC_DREAMBOARD_COMPONENT_INDEX_CONTENT.trim(),\n ]);\n\n if (existing === null || !removableLegacyContents.has(existing.trim())) {\n return;\n }\n\n await unlink(legacyIndexPath);\n const remainingEntries = await readdir(legacyDirPath).catch(() => []);\n if (remainingEntries.length === 0) {\n await rmdir(legacyDirPath);\n }\n}\n\nasync function writeTestReadme(filePath: string): Promise<void> {\n await writeTextFile(\n filePath,\n \"# Dreamboard Test Workspace\\n\\nTypeScript bases live in `test/bases/*.base.ts` and scenarios live in `test/scenarios/*.scenario.ts`.\\n\\n1. Define reusable seeded bases with `defineBase({ id, seed, players, setupProfileId?, setup })`.\\n2. Define scenarios with `defineScenario({ id, from, when, then })`.\\n3. Scenario assertions can read `players()`, `state()`, `view(playerId)`, and `interactions(playerId)`.\\n4. Generate deterministic base snapshots: `dreamboard test generate`.\\n5. Run tests: `dreamboard test run`.\\n\\nImport test helpers from `../testing-types`.\\n\\nGenerated artifacts are written to `test/generated/*` and should not be edited manually.\\n\",\n );\n}\n\nasync function writeInitialBase(\n filePath: string,\n mode: StaticScaffoldMode,\n players: number,\n): Promise<void> {\n if (mode === \"update\") {\n return;\n }\n\n await writeTextFile(\n filePath,\n `import { defineBase } from \"../testing-types\";\n\nexport default defineBase({\n id: \"initial-turn\",\n seed: 1337,\n players: ${players},\n setup: async () => undefined,\n});\n`,\n );\n}\n\nasync function writeInitialScenario(\n filePath: string,\n mode: StaticScaffoldMode,\n): Promise<void> {\n if (mode === \"new\") {\n await writeTextFile(filePath, INITIAL_SCENARIO_CONTENT);\n return;\n }\n\n const existing = await readTextFileIfExists(filePath);\n if (\n existing === null ||\n existing.trim().length === 0 ||\n existing === INITIAL_SCENARIO_CONTENT\n ) {\n await writeTextFile(filePath, INITIAL_SCENARIO_CONTENT);\n }\n}\n\nasync function writeTestingTypes(\n filePath: string,\n mode: StaticScaffoldMode,\n): Promise<void> {\n if (mode === \"new\") {\n await writeTextFile(filePath, REDUCER_TESTING_TYPES_WRAPPER_CONTENT);\n return;\n }\n\n const existing = await readTextFileIfExists(filePath);\n if (shouldRefreshGeneratedTestingTypes(existing)) {\n await writeTextFile(filePath, REDUCER_TESTING_TYPES_WRAPPER_CONTENT);\n }\n}\n\nasync function writeGeneratedTestingStubs(\n generatedDir: string,\n mode: StaticScaffoldMode,\n): Promise<void> {\n const header = \"// Generated by dreamboard scaffold. Do not edit by hand.\\n\";\n await writeGeneratedTestingStubFile(\n path.join(generatedDir, \"base-states.generated.ts\"),\n `${header}export const BASE_STATES = {} as const;\\nexport const BASE_STATES_CONTRACT_FINGERPRINT = undefined;\\n`,\n mode,\n );\n await writeGeneratedTestingStubFile(\n path.join(generatedDir, \"base-states.generated.d.ts\"),\n `${header}export declare const BASE_STATES: Record<string, unknown>;\\nexport declare const BASE_STATES_CONTRACT_FINGERPRINT: string | undefined;\\n`,\n mode,\n );\n await writeGeneratedTestingStubFile(\n path.join(generatedDir, \"testing-contract.ts\"),\n `${header}export type BaseId = string;\\nexport type GameView = unknown;\\nexport type InteractionId = string;\\nexport type InteractionParamsOf<_Id extends string> = Record<string, unknown>;\\nexport type PhaseName = string;\\nexport type PlayerId = string;\\nexport type RejectionCode = string;\\nexport type StateName = string;\\nexport type TestRunner = \"reducer\" | \"remote\" | \"browser\";\\nexport type ViewByPhase = Record<string, GameView>;\\nexport type WorkspaceStageName<_Phase extends string = string> = string;\\nexport type Expectation = { [matcher: string]: (...args: unknown[]) => unknown; not: Expectation };\\nexport type ExpectFn = (actual: unknown) => Expectation;\\nexport type InteractionExplanation = { interactionId: string; phase: string; step: string | null; availability: \"available\" | \"notYourTurn\" | \"wrongPhase\" | \"wrongStep\" | \"blocked\"; rules: readonly { ruleId: string; outcome: \"passed\" | \"failed\" | \"notEvaluated\"; errorCode?: string; message?: string; }[]; actor: { required: readonly string[]; playerIsActor: boolean }; inputs: readonly { key: string; kind: string; eligibleCount: number | \"lazy\"; }[]; };\\nexport interface InteractionDescriptorFor<Id extends string = string> { interactionId: Id; [key: string]: unknown; }\\nexport interface ScenarioGameApi { start(): Promise<void>; submit<Id extends InteractionId>(playerId: PlayerId, interactionId: Id, params?: InteractionParamsOf<Id>): Promise<void>; }\\nexport interface BaseContext { game: ScenarioGameApi; players(): readonly PlayerId[]; seat(index: number): PlayerId; }\\nexport interface SharedScenarioContext { game: ScenarioGameApi; players(): readonly PlayerId[]; seat(index: number): PlayerId; state(): StateName; view(playerId: PlayerId): GameView; interactions(playerId: PlayerId): readonly InteractionDescriptorFor[]; explain(playerId: PlayerId, interactionId: InteractionId): InteractionExplanation; expect: ExpectFn; }\\nexport type ScenarioContext<Phase extends PhaseName | undefined = undefined> = Omit<SharedScenarioContext, \"state\" | \"view\"> & { state(): Phase extends PhaseName ? Phase : StateName; view(playerId: PlayerId): Phase extends PhaseName ? ViewByPhase[Phase] : GameView; };\\nexport type ScenarioThenContext<_Runners extends readonly TestRunner[] = readonly [\"reducer\"], Phase extends PhaseName | undefined = undefined> = ScenarioContext<Phase>;\\nexport interface BaseDefinition { id: string; seed?: number; players?: number; setupProfileId?: string; extends?: BaseId | string; setup: (ctx: BaseContext) => void | Promise<void>; }\\nexport interface ScenarioDefinition<Runners extends readonly TestRunner[] = readonly [\"reducer\"], Phase extends PhaseName | undefined = undefined> { id: string; description?: string; from: BaseId | string; runners?: Runners; phase?: Phase; stage?: Phase extends PhaseName ? WorkspaceStageName<Phase> : never; when: (ctx: ScenarioContext<Phase>) => void | Promise<void>; then: (ctx: ScenarioThenContext<Runners, Phase>) => void | Promise<void>; }\\n`,\n mode,\n );\n await writeGeneratedTestingStubFile(\n path.join(generatedDir, \"scenario-manifest.generated.ts\"),\n `${header}export const SCENARIO_MANIFEST = [] as const;\\n`,\n mode,\n );\n}\n\nasync function writeGeneratedTestingStubFile(\n filePath: string,\n content: string,\n mode: StaticScaffoldMode,\n): Promise<void> {\n if (mode === \"new\") {\n await writeTextFile(filePath, content);\n return;\n }\n\n const existing = await readTextFileIfExists(filePath);\n if (\n existing === null ||\n existing.trim().length === 0 ||\n existing.startsWith(GENERATED_SCENARIO_PREFIX)\n ) {\n await writeTextFile(filePath, content);\n }\n}\n\nasync function writeTestTsconfig(filePath: string): Promise<void> {\n await writeTextFile(\n filePath,\n `${JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2022\",\n module: \"ESNext\",\n moduleResolution: \"bundler\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n noEmit: true,\n },\n include: [\n \"./**/*.ts\",\n \"./**/*.d.ts\",\n \"../shared/**/*.ts\",\n \"../shared/**/*.d.ts\",\n ],\n },\n null,\n 2,\n )}\\n`,\n );\n}\n\nasync function writeManifestTypecheckTsconfig(filePath: string): Promise<void> {\n await writeTextFile(\n filePath,\n `${JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2022\",\n module: \"ESNext\",\n moduleResolution: \"bundler\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n noEmit: true,\n allowImportingTsExtensions: true,\n },\n include: [\"./manifest.ts\"],\n },\n null,\n 2,\n )}\\n`,\n );\n}\n\nexport async function migrateLegacyScenarioImports(\n projectRoot: string,\n): Promise<void> {\n const scenariosRoot = path.join(projectRoot, \"test\", \"scenarios\");\n if (!(await exists(scenariosRoot))) return;\n\n const scenarioFiles = await collectScenarioFiles(scenariosRoot);\n for (const filePath of scenarioFiles) {\n const content = await readTextFile(filePath);\n if (!content.includes(\"@dreamboard/cli/testing\")) continue;\n\n const relativeToTestingTypes = normalizeImportPath(\n path.relative(\n path.dirname(filePath),\n path.join(projectRoot, \"test\", \"testing-types\"),\n ),\n );\n\n const migrated = content\n .replaceAll('\"@dreamboard/cli/testing\"', `\"${relativeToTestingTypes}\"`)\n .replaceAll(\"'@dreamboard/cli/testing'\", `'${relativeToTestingTypes}'`);\n\n if (migrated !== content) {\n await writeTextFile(filePath, migrated);\n }\n }\n}\n\nfunction shouldRefreshGeneratedTestingTypes(\n existingContent: string | null,\n): boolean {\n if (existingContent === null || existingContent.trim().length === 0) {\n return true;\n }\n if (existingContent === TESTING_TYPES_STUB) {\n return true;\n }\n return existingContent.startsWith(GENERATED_TESTING_TYPES_PREFIX);\n}\n\nasync function inferInitialTestPlayerCount(\n projectRoot: string,\n): Promise<number> {\n const manifestPath = path.join(projectRoot, \"manifest.ts\");\n if (!(await exists(manifestPath))) {\n return 4;\n }\n\n try {\n const manifest = await materializeManifest(projectRoot);\n return manifest.players.optimalPlayers ?? manifest.players.minPlayers ?? 4;\n } catch {\n return 4;\n }\n}\n\nasync function collectScenarioFiles(rootDir: string): Promise<string[]> {\n const files: string[] = [];\n const stack = [rootDir];\n\n while (stack.length > 0) {\n const dir = stack.pop();\n if (!dir) continue;\n\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n stack.push(fullPath);\n } else if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n files.push(fullPath);\n }\n }\n }\n\n return files;\n}\n\nexport function resolveStaticAssetRoot(\n importUrl: string = import.meta.url,\n): string {\n const candidates = [\n fileURLToPath(new URL(\"../../scaffold/assets/static/\", importUrl)),\n fileURLToPath(new URL(\"./scaffold/assets/static/\", importUrl)),\n fileURLToPath(new URL(\"../scaffold/assets/static/\", importUrl)),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(\n `Unable to locate CLI static scaffold assets. Checked: ${candidates.join(\", \")}`,\n );\n}\n\nasync function getStaticAssetEntries(): Promise<StaticAssetEntry[]> {\n const files = await walkFiles(STATIC_ASSET_ROOT);\n const entries: StaticAssetEntry[] = [];\n\n for (const filePath of files) {\n const targetPath = normalizeProjectPath(\n path.relative(STATIC_ASSET_ROOT, filePath),\n );\n entries.push({\n targetPath,\n content: await readFile(filePath, \"utf8\"),\n });\n }\n\n entries.sort((left, right) =>\n left.targetPath.localeCompare(right.targetPath),\n );\n return entries;\n}\n\nasync function getDynamicStaticEntries(\n projectRoot: string,\n mode: StaticScaffoldMode,\n options: StaticScaffoldOptions = {},\n): Promise<StaticAssetEntry[]> {\n const entries: StaticAssetEntry[] = [\n {\n targetPath: \"package.json\",\n content: await buildRootPackageJson(projectRoot, mode, options),\n },\n {\n targetPath: \"ui/package.json\",\n content: buildUiPackageJson(),\n },\n ];\n\n if (options.localMaintainerRegistry) {\n entries.push({\n targetPath: \".npmrc\",\n content: buildWorkspaceNpmrc(options.localMaintainerRegistry.registryUrl),\n });\n }\n\n return entries;\n}\n\nasync function readProjectLocalMaintainerRegistry(\n projectRoot: string,\n): Promise<LocalMaintainerRegistryConfig | null> {\n const projectConfigPath = path.join(\n projectRoot,\n PROJECT_DIR_NAME,\n PROJECT_CONFIG_FILE,\n );\n if (!(await exists(projectConfigPath))) {\n return null;\n }\n\n const projectConfig = await loadProjectConfig(projectRoot);\n return projectConfig.localMaintainerRegistry ?? null;\n}\n\nasync function getExpectedStaticEntries(\n projectRoot: string,\n): Promise<StaticAssetEntry[]> {\n const localMaintainerRegistry =\n await readProjectLocalMaintainerRegistry(projectRoot);\n const entries = [\n ...(await getStaticAssetEntries()).filter(\n (entry) => entry.targetPath !== \".npmrc\",\n ),\n ...(await getDynamicStaticEntries(projectRoot, \"update\", {\n localMaintainerRegistry,\n })),\n ];\n entries.sort((left, right) =>\n left.targetPath.localeCompare(right.targetPath),\n );\n return entries;\n}\n\nasync function walkFiles(rootDir: string): Promise<string[]> {\n const files: string[] = [];\n const stack = [rootDir];\n\n while (stack.length > 0) {\n const currentDir = stack.pop();\n if (!currentDir) continue;\n\n const entries = await readdir(currentDir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(currentDir, entry.name);\n if (entry.isDirectory()) {\n stack.push(fullPath);\n } else if (entry.isFile()) {\n files.push(fullPath);\n }\n }\n }\n\n files.sort((left, right) => left.localeCompare(right));\n return files;\n}\n\nasync function buildRootPackageJson(\n projectRoot: string,\n mode: StaticScaffoldMode,\n options: StaticScaffoldOptions,\n): Promise<string> {\n const sdkPackageRanges = {\n ...SDK_DEPENDENCY_RANGES,\n ...(options.localMaintainerRegistry?.packages ?? {}),\n };\n const packageJsonPath = path.join(projectRoot, \"package.json\");\n const existingPackageJson =\n mode === \"update\" && (await exists(packageJsonPath))\n ? await readJsonFile<RootPackageJsonShape>(packageJsonPath)\n : null;\n const {\n dreamboardFrameworkVersion: _legacyFrameworkVersion,\n ...existingPackageJsonWithoutLegacyVersion\n } = existingPackageJson ?? {};\n const frameworkDependencies = {\n \"@dreamboard-games/sdk\":\n sdkPackageRanges[\"@dreamboard-games/sdk\"] ??\n SDK_DEPENDENCY_RANGES[\"@dreamboard-games/sdk\"],\n ...SHARED_DEPENDENCIES,\n ...ROOT_APP_DEPENDENCIES,\n };\n const frameworkDevDependencies = {\n ...SHARED_DEV_DEPENDENCIES,\n };\n const nextPackageJson: RootPackageJsonShape = {\n ...existingPackageJsonWithoutLegacyVersion,\n private: true,\n scripts: {\n ...(existingPackageJson?.scripts ?? {}),\n ...FRAMEWORK_SCRIPTS,\n },\n dependencies: {\n ...(existingPackageJson?.dependencies ?? {}),\n ...frameworkDependencies,\n },\n devDependencies: {\n ...(existingPackageJson?.devDependencies ?? {}),\n ...frameworkDevDependencies,\n },\n pnpm: mergePnpmConfig(existingPackageJson?.pnpm),\n };\n return `${JSON.stringify(nextPackageJson, null, 2)}\\n`;\n}\n\nfunction mergePnpmConfig(\n existingPnpm: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n const existingOverrides =\n existingPnpm?.overrides &&\n typeof existingPnpm.overrides === \"object\" &&\n !Array.isArray(existingPnpm.overrides)\n ? (existingPnpm.overrides as Record<string, unknown>)\n : {};\n return {\n ...(existingPnpm ?? {}),\n overrides: {\n ...existingOverrides,\n ...FRAMEWORK_PNPM_OVERRIDES,\n },\n };\n}\n\nfunction buildWorkspaceNpmrc(registryUrl: string): string {\n return `@dreamboard-games:registry=${registryUrl}\\n`;\n}\n\nfunction buildUiPackageJson(): string {\n return `${JSON.stringify(\n {\n private: true,\n dependencies: SHARED_DEPENDENCIES,\n devDependencies: SHARED_DEV_DEPENDENCIES,\n },\n null,\n 2,\n )}\\n`;\n}\n\nfunction readPackageVersion(\n packageJsonPath: string,\n packageName: string,\n): string | null {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\n version?: unknown;\n };\n\n if (\n typeof packageJson.version !== \"string\" ||\n packageJson.version.trim().length === 0\n ) {\n return null;\n }\n\n return `^${packageJson.version.trim()}`;\n}\n\nfunction findNearestPackageJsonPath(\n importMetaUrl: string = import.meta.url,\n): string | null {\n let current = path.dirname(fileURLToPath(importMetaUrl));\n\n while (true) {\n const candidate = path.join(current, \"package.json\");\n if (existsSync(candidate)) {\n return candidate;\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n return null;\n }\n current = parent;\n }\n}\n\nfunction isSourceCheckoutCliPackageJsonPath(\n packageJsonPath: string,\n importMetaUrl: string = import.meta.url,\n): boolean {\n try {\n return (\n path.resolve(packageJsonPath) ===\n path.join(\n resolveCliRepoRoot(importMetaUrl),\n \"apps\",\n \"dreamboard-cli\",\n \"package.json\",\n )\n );\n } catch {\n return false;\n }\n}\n\nfunction readPackagedSdkDependencyRange(\n packageName: keyof typeof SDK_PACKAGE_PATHS,\n importMetaUrl: string = import.meta.url,\n): string | null {\n const packageJsonPath = findNearestPackageJsonPath(importMetaUrl);\n if (!packageJsonPath) {\n return null;\n }\n\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\n dependencies?: Record<string, unknown>;\n };\n\n const packagedRange = packageJson.dependencies?.[packageName];\n if (\n typeof packagedRange !== \"string\" ||\n packagedRange.trim().length === 0 ||\n packagedRange.startsWith(\"workspace:\") ||\n packagedRange.startsWith(\"link:\") ||\n (packagedRange.startsWith(\"file:\") &&\n !IS_PUBLISHED_BUILD &&\n isSourceCheckoutCliPackageJsonPath(packageJsonPath, importMetaUrl))\n ) {\n return null;\n }\n\n return packagedRange.trim();\n}\n\n/**\n * Local Verdaccio snapshot pins (`x.y.z-local.<timestamp>.<fingerprint>`) are\n * only resolvable on the maintainer machine that published them. Scaffolded\n * workspaces must always start from a registry-publishable version, so\n * normalize any inherited snapshot pin to its public base version.\n */\nfunction stripLocalSnapshotSuffix(range: string): string {\n return range.replace(/-local\\..*$/, \"\");\n}\n\nexport function resolveSdkDependencyRange(\n packageName: keyof typeof SDK_PACKAGE_PATHS,\n importMetaUrl: string = import.meta.url,\n): string {\n const packagedRange = readPackagedSdkDependencyRange(\n packageName,\n importMetaUrl,\n );\n if (packagedRange) {\n return stripLocalSnapshotSuffix(packagedRange);\n }\n\n try {\n const repoRoot = resolveCliRepoRoot(importMetaUrl);\n const packageJsonPath = path.join(\n repoRoot,\n ...SDK_PACKAGE_PATHS[packageName],\n );\n const repoRange = readPackageVersion(packageJsonPath, packageName);\n if (repoRange) {\n return stripLocalSnapshotSuffix(repoRange);\n }\n } catch {\n // Published installs do not include the monorepo layout.\n }\n\n return DEFAULT_SDK_DEPENDENCY_RANGES[packageName];\n}\n\nfunction normalizeImportPath(relativePath: string): string {\n const normalized = relativePath.replaceAll(\"\\\\\", \"/\");\n if (normalized.startsWith(\".\")) return normalized;\n return `./${normalized}`;\n}\n\nfunction normalizeProjectPath(filePath: string): string {\n return filePath.replace(/^\\.\\//, \"\").replace(/^\\/+/, \"\").replace(/\\\\/g, \"/\");\n}\n\nfunction summarizePaths(paths: readonly string[]): string {\n const maxShown = 5;\n const shown = paths.slice(0, maxShown).join(\", \");\n if (paths.length <= maxShown) return shown;\n return `${shown}, and ${paths.length - maxShown} more`;\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  MANIFEST_TYPECHECK_CONFIG_FILE
4
- } from "./chunk-H76MT5UR.mjs";
4
+ } from "./chunk-M7UVBANQ.mjs";
5
5
 
6
6
  // src/services/project/local-typecheck.ts
7
7
  import { spawn } from "child_process";
@@ -147,4 +147,4 @@ async function runLocalTypecheck(projectRoot) {
147
147
  export {
148
148
  runLocalTypecheck
149
149
  };
150
- //# sourceMappingURL=chunk-UIOLGH4A.mjs.map
150
+ //# sourceMappingURL=chunk-POBFNXD4.mjs.map
@@ -11,7 +11,7 @@ import {
11
11
  PROJECT_CONFIG_FILE,
12
12
  PROJECT_DIR_NAME,
13
13
  PROJECT_STATE_FILE
14
- } from "./chunk-H76MT5UR.mjs";
14
+ } from "./chunk-M7UVBANQ.mjs";
15
15
 
16
16
  // src/build-target.ts
17
17
  var injectedBuildChannel = true ? "development" : void 0;
@@ -164,4 +164,4 @@ export {
164
164
  updateProjectState,
165
165
  findProjectRoot
166
166
  };
167
- //# sourceMappingURL=chunk-776W3UGV.mjs.map
167
+ //# sourceMappingURL=chunk-RHGGFAMQ.mjs.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-ZEELHSY3.mjs";
5
5
  import {
6
6
  DEFAULT_WEB_BASE_URL
7
- } from "./chunk-H76MT5UR.mjs";
7
+ } from "./chunk-M7UVBANQ.mjs";
8
8
 
9
9
  // src/services/project/workspace-dependencies.ts
10
10
  import crypto from "crypto";
@@ -379,4 +379,4 @@ export {
379
379
  installWorkspaceDependencies,
380
380
  reconcileWorkspaceDependencies
381
381
  };
382
- //# sourceMappingURL=chunk-XQXDOBYB.mjs.map
382
+ //# sourceMappingURL=chunk-RHI6S4SU.mjs.map
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-IAYRNVUC.mjs";
10
10
  import {
11
11
  PROJECT_DIR_NAME
12
- } from "./chunk-H76MT5UR.mjs";
12
+ } from "./chunk-M7UVBANQ.mjs";
13
13
 
14
14
  // src/config/global-config.ts
15
15
  import os2 from "os";
@@ -127,7 +127,7 @@ async function defaultBackendResolver() {
127
127
  }
128
128
  async function readCredentialBackendPreference() {
129
129
  try {
130
- const { loadGlobalConfig: loadGlobalConfig2 } = await import("./global-config-NYCSCAUI.mjs");
130
+ const { loadGlobalConfig: loadGlobalConfig2 } = await import("./global-config-XHL7BCKN.mjs");
131
131
  const config = await loadGlobalConfig2();
132
132
  return config.credentialBackend === "keychain";
133
133
  } catch {
@@ -223,4 +223,4 @@ export {
223
223
  loadGlobalConfig,
224
224
  saveGlobalConfig
225
225
  };
226
- //# sourceMappingURL=chunk-5NYBTZB4.mjs.map
226
+ //# sourceMappingURL=chunk-W2MDP5ZN.mjs.map
@@ -16,7 +16,7 @@ import {
16
16
  import {
17
17
  MANIFEST_FILE,
18
18
  MATERIALIZED_MANIFEST_FILE
19
- } from "./chunk-H76MT5UR.mjs";
19
+ } from "./chunk-M7UVBANQ.mjs";
20
20
 
21
21
  // src/utils/crypto.ts
22
22
  import crypto from "crypto";
@@ -2906,4 +2906,4 @@ export {
2906
2906
  isDynamicSeedPath,
2907
2907
  isLibraryPath
2908
2908
  };
2909
- //# sourceMappingURL=chunk-C3VW3DTA.mjs.map
2909
+ //# sourceMappingURL=chunk-XIFLZGDQ.mjs.map
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  ensureProjectSdk,
4
4
  loadRemoteProjectIdentity
5
- } from "./chunk-KDBSVLCF.mjs";
5
+ } from "./chunk-ZNZ4RJBK.mjs";
6
6
  import {
7
7
  updateProjectState
8
- } from "./chunk-776W3UGV.mjs";
8
+ } from "./chunk-RHGGFAMQ.mjs";
9
9
 
10
10
  // src/services/project/remote-project.ts
11
11
  async function resolveRemoteProject(options) {
@@ -36,4 +36,4 @@ async function resolveRemoteProject(options) {
36
36
  export {
37
37
  resolveRemoteProject
38
38
  };
39
- //# sourceMappingURL=chunk-QZH6IEZS.mjs.map
39
+ //# sourceMappingURL=chunk-ZETW43TX.mjs.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  toDreamboardApiError
4
- } from "./chunk-IDVQXGAO.mjs";
4
+ } from "./chunk-GD3FL755.mjs";
5
5
  import {
6
6
  createGameRevision,
7
7
  createProjectSourceBlobUploadSession,
@@ -15,7 +15,7 @@ import {
15
15
  listProjectCompiledResults,
16
16
  queueProjectRevisionCompile,
17
17
  uploadInitialProjection
18
- } from "./chunk-C3VW3DTA.mjs";
18
+ } from "./chunk-XIFLZGDQ.mjs";
19
19
  import {
20
20
  external_exports
21
21
  } from "./chunk-JZTH3EMV.mjs";
@@ -621,4 +621,4 @@ export {
621
621
  uploadInitialProjectionSdk,
622
622
  uploadProjectSourceBlobsSdk
623
623
  };
624
- //# sourceMappingURL=chunk-KDBSVLCF.mjs.map
624
+ //# sourceMappingURL=chunk-ZNZ4RJBK.mjs.map