@dreamboard-games/cli 0.1.30-alpha.2 → 0.1.30-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-verifier/agent-workspace-verifier.mjs +227 -0
- package/dist/agent-verifier/agent-workspace-verifier.mjs.map +1 -0
- package/dist/agent-verifier/chunk-27EEIZCI.mjs +185 -0
- package/dist/agent-verifier/chunk-27EEIZCI.mjs.map +1 -0
- package/dist/agent-verifier/chunk-5NYBTZB4.mjs +226 -0
- package/dist/agent-verifier/chunk-5NYBTZB4.mjs.map +1 -0
- package/dist/agent-verifier/chunk-776W3UGV.mjs +167 -0
- package/dist/agent-verifier/chunk-776W3UGV.mjs.map +1 -0
- package/dist/agent-verifier/chunk-C3VW3DTA.mjs +2909 -0
- package/dist/agent-verifier/chunk-C3VW3DTA.mjs.map +1 -0
- package/dist/agent-verifier/chunk-F2DIOJJZ.mjs +302 -0
- package/dist/agent-verifier/chunk-F2DIOJJZ.mjs.map +1 -0
- package/dist/agent-verifier/chunk-G42BGGG2.mjs +70 -0
- package/dist/agent-verifier/chunk-G42BGGG2.mjs.map +1 -0
- package/dist/agent-verifier/chunk-H6XDQJ3N.mjs +11 -0
- package/dist/agent-verifier/chunk-H76MT5UR.mjs +57 -0
- package/dist/agent-verifier/chunk-H76MT5UR.mjs.map +1 -0
- package/dist/agent-verifier/chunk-IAYRNVUC.mjs +49 -0
- package/dist/agent-verifier/chunk-IAYRNVUC.mjs.map +1 -0
- package/dist/agent-verifier/chunk-IDVQXGAO.mjs +222 -0
- package/dist/agent-verifier/chunk-IDVQXGAO.mjs.map +1 -0
- package/dist/agent-verifier/chunk-JO5AMVZU.mjs +1744 -0
- package/dist/agent-verifier/chunk-JO5AMVZU.mjs.map +1 -0
- package/dist/agent-verifier/chunk-JZTH3EMV.mjs +14523 -0
- package/dist/agent-verifier/chunk-JZTH3EMV.mjs.map +1 -0
- package/dist/agent-verifier/chunk-KDBSVLCF.mjs +624 -0
- package/dist/agent-verifier/chunk-KDBSVLCF.mjs.map +1 -0
- package/dist/agent-verifier/chunk-MW2QIWWA.mjs +729 -0
- package/dist/agent-verifier/chunk-MW2QIWWA.mjs.map +1 -0
- package/dist/agent-verifier/chunk-NAK77WXW.mjs +767 -0
- package/dist/agent-verifier/chunk-NAK77WXW.mjs.map +1 -0
- package/dist/agent-verifier/chunk-ON62IGWK.mjs +3137 -0
- package/dist/agent-verifier/chunk-ON62IGWK.mjs.map +1 -0
- package/dist/agent-verifier/chunk-QBAF7EYR.mjs +214 -0
- package/dist/agent-verifier/chunk-QBAF7EYR.mjs.map +1 -0
- package/dist/agent-verifier/chunk-QZH6IEZS.mjs +39 -0
- package/dist/agent-verifier/chunk-QZH6IEZS.mjs.map +1 -0
- package/dist/agent-verifier/chunk-TAEQKBJB.mjs +107 -0
- package/dist/agent-verifier/chunk-TAEQKBJB.mjs.map +1 -0
- package/dist/agent-verifier/chunk-UIOLGH4A.mjs +150 -0
- package/dist/agent-verifier/chunk-UIOLGH4A.mjs.map +1 -0
- package/dist/agent-verifier/chunk-XKCJBIRY.mjs +75 -0
- package/dist/agent-verifier/chunk-XKCJBIRY.mjs.map +1 -0
- package/dist/agent-verifier/chunk-XQXDOBYB.mjs +382 -0
- package/dist/agent-verifier/chunk-XQXDOBYB.mjs.map +1 -0
- package/dist/agent-verifier/chunk-YDIOW2BO.mjs +45 -0
- package/dist/agent-verifier/chunk-YDIOW2BO.mjs.map +1 -0
- package/dist/agent-verifier/chunk-YE7UAO3T.mjs +129 -0
- package/dist/agent-verifier/chunk-YE7UAO3T.mjs.map +1 -0
- package/dist/agent-verifier/chunk-Z6OZWUIZ.mjs +261 -0
- package/dist/agent-verifier/chunk-Z6OZWUIZ.mjs.map +1 -0
- package/dist/agent-verifier/chunk-ZEELHSY3.mjs +20 -0
- package/dist/agent-verifier/chunk-ZEELHSY3.mjs.map +1 -0
- package/dist/agent-verifier/compile-576O7TYP.mjs +312 -0
- package/dist/agent-verifier/compile-576O7TYP.mjs.map +1 -0
- package/dist/agent-verifier/global-config-NYCSCAUI.mjs +18 -0
- package/dist/agent-verifier/keychain-backend-A3MRWLPF.mjs +135 -0
- package/dist/agent-verifier/keychain-backend-A3MRWLPF.mjs.map +1 -0
- package/dist/agent-verifier/local-files-QVJ2H3MH.mjs +45 -0
- package/dist/agent-verifier/local-files-QVJ2H3MH.mjs.map +1 -0
- package/dist/agent-verifier/local-typecheck-2JWG5IGL.mjs +10 -0
- package/dist/agent-verifier/local-typecheck-2JWG5IGL.mjs.map +1 -0
- package/dist/agent-verifier/materialize-workspace-OZKOQCSQ.mjs +89 -0
- package/dist/agent-verifier/materialize-workspace-OZKOQCSQ.mjs.map +1 -0
- package/dist/agent-verifier/project-state-XKUSCFSV.mjs +33 -0
- package/dist/agent-verifier/project-state-XKUSCFSV.mjs.map +1 -0
- package/dist/agent-verifier/prompt-VKHMCQT6.mjs +756 -0
- package/dist/agent-verifier/prompt-VKHMCQT6.mjs.map +1 -0
- package/dist/agent-verifier/reducer-bundle-preflight-7NYZF5ZT.mjs +20 -0
- package/dist/agent-verifier/reducer-bundle-preflight-7NYZF5ZT.mjs.map +1 -0
- package/dist/agent-verifier/reducer-contract-preflight-COD2CO22.mjs +11 -0
- package/dist/agent-verifier/reducer-contract-preflight-COD2CO22.mjs.map +1 -0
- package/dist/agent-verifier/reducer-native-test-harness-QC7HZUK4.mjs +50 -0
- package/dist/agent-verifier/reducer-native-test-harness-QC7HZUK4.mjs.map +1 -0
- package/dist/agent-verifier/static-scaffold-JBUE3ROP.mjs +27 -0
- package/dist/agent-verifier/static-scaffold-JBUE3ROP.mjs.map +1 -0
- package/dist/agent-verifier/sync-C6S3OGCD.mjs +588 -0
- package/dist/agent-verifier/sync-C6S3OGCD.mjs.map +1 -0
- package/dist/agent-verifier/test-Y5UGQV7J.mjs +353 -0
- package/dist/agent-verifier/test-Y5UGQV7J.mjs.map +1 -0
- package/dist/agent-verifier/workspace-codegen-WPZHMATU.mjs +10 -0
- package/dist/agent-verifier/workspace-codegen-WPZHMATU.mjs.map +1 -0
- package/dist/agent-verifier/workspace-dependencies-B6A2ZX55.mjs +15 -0
- package/dist/agent-verifier/workspace-dependencies-B6A2ZX55.mjs.map +1 -0
- package/dist/chunk-2H7UOFLK.js +11 -0
- package/dist/chunk-2H7UOFLK.js.map +1 -0
- package/dist/{chunk-N7XPNNUI.js → chunk-3NRROR4P.js} +3 -3
- package/dist/{chunk-TAQKH67O.js → chunk-M4SCKH5M.js} +8 -2224
- package/dist/chunk-M4SCKH5M.js.map +1 -0
- package/dist/{global-config-S4ZIPECE.js → global-config-YBFEGJQG.js} +3 -3
- package/dist/global-config-YBFEGJQG.js.map +1 -0
- package/dist/index.js +4 -4
- package/dist/internal.js +3 -3
- package/dist/{keychain-backend-HDF4TZDL.js → keychain-backend-JHTXAKWC.js} +2 -2
- package/dist/{prompt-NDV3AE5L.js → prompt-GMZABCJC.js} +2 -2
- package/package.json +3 -2
- package/dist/chunk-SEGVTWSK.js +0 -44
- package/dist/chunk-TAQKH67O.js.map +0 -1
- /package/dist/{chunk-SEGVTWSK.js.map → agent-verifier/chunk-H6XDQJ3N.mjs.map} +0 -0
- /package/dist/{global-config-S4ZIPECE.js.map → agent-verifier/global-config-NYCSCAUI.mjs.map} +0 -0
- /package/dist/{chunk-N7XPNNUI.js.map → chunk-3NRROR4P.js.map} +0 -0
- /package/dist/{keychain-backend-HDF4TZDL.js.map → keychain-backend-JHTXAKWC.js.map} +0 -0
- /package/dist/{prompt-NDV3AE5L.js.map → prompt-GMZABCJC.js.map} +0 -0
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
FRAMEWORK_PNPM_OVERRIDES
|
|
4
|
+
} from "./chunk-ZEELHSY3.mjs";
|
|
5
|
+
import {
|
|
6
|
+
DEFAULT_WEB_BASE_URL
|
|
7
|
+
} from "./chunk-H76MT5UR.mjs";
|
|
8
|
+
|
|
9
|
+
// src/services/project/workspace-dependencies.ts
|
|
10
|
+
import crypto from "crypto";
|
|
11
|
+
import { spawn } from "child_process";
|
|
12
|
+
import "events";
|
|
13
|
+
import { existsSync } from "fs";
|
|
14
|
+
import { mkdir, lstat, readFile, rm, writeFile } from "fs/promises";
|
|
15
|
+
import path from "path";
|
|
16
|
+
import { fileURLToPath } from "url";
|
|
17
|
+
|
|
18
|
+
// src/services/project/dependency-tooling-messages.ts
|
|
19
|
+
var DEPENDENCY_SETUP_DOCS_PATH = "/docs/reference/dependency-setup";
|
|
20
|
+
var DEPENDENCY_SETUP_DOCS_URL = `${DEFAULT_WEB_BASE_URL}${DEPENDENCY_SETUP_DOCS_PATH}`;
|
|
21
|
+
function buildMissingDependencyToolingMessage() {
|
|
22
|
+
return [
|
|
23
|
+
"Dreamboard needs dependency tooling to finish `dreamboard sync`.",
|
|
24
|
+
"Use Node 24+ with Corepack enabled, then run `dreamboard sync` again.",
|
|
25
|
+
"If Corepack is unavailable on this machine, install pnpm globally with `npm install -g pnpm`.",
|
|
26
|
+
`Help: ${DEPENDENCY_SETUP_DOCS_URL}`
|
|
27
|
+
].join("\n");
|
|
28
|
+
}
|
|
29
|
+
function buildPackageLockConflictMessage() {
|
|
30
|
+
return [
|
|
31
|
+
"Dreamboard manages workspace dependencies during `dreamboard sync`.",
|
|
32
|
+
"This workspace has an npm lockfile that conflicts with Dreamboard-managed dependencies.",
|
|
33
|
+
"Remove `package-lock.json` and run `dreamboard sync` again.",
|
|
34
|
+
`Help: ${DEPENDENCY_SETUP_DOCS_URL}`
|
|
35
|
+
].join("\n");
|
|
36
|
+
}
|
|
37
|
+
function buildMissingGeneratedLockfileMessage() {
|
|
38
|
+
return [
|
|
39
|
+
"Dreamboard could not finish preparing workspace dependencies during `dreamboard sync`.",
|
|
40
|
+
"Diagnostic: `pnpm-lock.yaml` was not created.",
|
|
41
|
+
`Help: ${DEPENDENCY_SETUP_DOCS_URL}`
|
|
42
|
+
].join("\n");
|
|
43
|
+
}
|
|
44
|
+
function buildDependencyPreparationFailureMessage(options) {
|
|
45
|
+
const details = options.output?.trim();
|
|
46
|
+
return [
|
|
47
|
+
`Dreamboard could not finish preparing workspace dependencies during \`dreamboard sync\`${options.exitCode != null ? ` (exit code ${options.exitCode})` : ""}.`,
|
|
48
|
+
details ? `Diagnostic output:
|
|
49
|
+
${details}` : null,
|
|
50
|
+
`Help: ${DEPENDENCY_SETUP_DOCS_URL}`
|
|
51
|
+
].filter(Boolean).join("\n");
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// src/services/project/workspace-dependencies.ts
|
|
55
|
+
var MODULE_DIR = path.dirname(fileURLToPath(import.meta.url));
|
|
56
|
+
var CLI_ROOT = path.resolve(MODULE_DIR, "../../..");
|
|
57
|
+
var REPO_ROOT = path.resolve(CLI_ROOT, "../..");
|
|
58
|
+
var REPO_PACKAGE_JSON_PATH = path.join(REPO_ROOT, "package.json");
|
|
59
|
+
var DEFAULT_PACKAGE_MANAGER = "pnpm@10.4.1";
|
|
60
|
+
var SDK_PACKAGE_NAME = "@dreamboard-games/sdk";
|
|
61
|
+
var SDK_REQUIRED_DIST_FILES = [
|
|
62
|
+
"dist/index.d.ts",
|
|
63
|
+
"dist/index.js",
|
|
64
|
+
"dist/types.d.ts",
|
|
65
|
+
"dist/types.js",
|
|
66
|
+
"dist/ui.d.ts",
|
|
67
|
+
"dist/ui.js",
|
|
68
|
+
"dist/runtime.d.ts",
|
|
69
|
+
"dist/runtime.js"
|
|
70
|
+
];
|
|
71
|
+
var DEPENDENCY_INSTALL_METADATA_PATH_SEGMENTS = [
|
|
72
|
+
".dreamboard",
|
|
73
|
+
"dependency-install.json"
|
|
74
|
+
];
|
|
75
|
+
var LockfileGenerationError = class extends Error {
|
|
76
|
+
constructor(binary, details) {
|
|
77
|
+
super(buildLockfileGenerationErrorMessage(binary, details), {
|
|
78
|
+
cause: details.cause
|
|
79
|
+
});
|
|
80
|
+
this.binary = binary;
|
|
81
|
+
this.details = details;
|
|
82
|
+
this.name = "LockfileGenerationError";
|
|
83
|
+
}
|
|
84
|
+
binary;
|
|
85
|
+
details;
|
|
86
|
+
};
|
|
87
|
+
async function generatePnpmLockfile(projectRoot, _options = {}) {
|
|
88
|
+
await ensurePackageManagerNormalized(projectRoot);
|
|
89
|
+
await assertNoNpmLockfileConflict(projectRoot);
|
|
90
|
+
await runPackageManagerCommand(projectRoot, {
|
|
91
|
+
args: [
|
|
92
|
+
"install",
|
|
93
|
+
"--ignore-workspace",
|
|
94
|
+
"--lockfile-only",
|
|
95
|
+
"--config.shared-workspace-lockfile=false"
|
|
96
|
+
]
|
|
97
|
+
});
|
|
98
|
+
await assertPnpmLockfilePresent(projectRoot);
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
async function installWorkspaceDependencies(projectRoot, _options = {}) {
|
|
102
|
+
const result = await reconcileWorkspaceDependencies(projectRoot);
|
|
103
|
+
return result.required;
|
|
104
|
+
}
|
|
105
|
+
async function reconcileWorkspaceDependencies(projectRoot) {
|
|
106
|
+
const packageJsonPath = path.join(projectRoot, "package.json");
|
|
107
|
+
if (!await pathExists(packageJsonPath)) {
|
|
108
|
+
return {
|
|
109
|
+
required: false,
|
|
110
|
+
installed: false,
|
|
111
|
+
lockfileGenerated: false,
|
|
112
|
+
packageManagerNormalized: false,
|
|
113
|
+
fingerprint: null
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
await assertNoNpmLockfileConflict(projectRoot);
|
|
117
|
+
const packageManagerNormalized = await ensurePackageManagerNormalized(projectRoot);
|
|
118
|
+
const pnpmLockfilePath = path.join(projectRoot, "pnpm-lock.yaml");
|
|
119
|
+
const nodeModulesPath = path.join(projectRoot, "node_modules");
|
|
120
|
+
const metadataPath = path.join(
|
|
121
|
+
projectRoot,
|
|
122
|
+
...DEPENDENCY_INSTALL_METADATA_PATH_SEGMENTS
|
|
123
|
+
);
|
|
124
|
+
let lockfileGenerated = false;
|
|
125
|
+
let installed = false;
|
|
126
|
+
const metadata = await readJsonFile(metadataPath);
|
|
127
|
+
const lockfileExists = await pathExists(pnpmLockfilePath);
|
|
128
|
+
if (!lockfileExists) {
|
|
129
|
+
await runPackageManagerCommand(projectRoot, {
|
|
130
|
+
args: [
|
|
131
|
+
"install",
|
|
132
|
+
"--ignore-workspace",
|
|
133
|
+
"--config.shared-workspace-lockfile=false"
|
|
134
|
+
]
|
|
135
|
+
});
|
|
136
|
+
lockfileGenerated = true;
|
|
137
|
+
installed = true;
|
|
138
|
+
}
|
|
139
|
+
await assertPnpmLockfilePresent(projectRoot);
|
|
140
|
+
let fingerprint = await fingerprintInstallManifest({
|
|
141
|
+
packageJsonPath,
|
|
142
|
+
lockfilePath: pnpmLockfilePath
|
|
143
|
+
});
|
|
144
|
+
const hasValidInstalledDeps = await pathExists(nodeModulesPath) && await hasValidInstalledDependencies({
|
|
145
|
+
packageJsonPath,
|
|
146
|
+
nodeModulesPath
|
|
147
|
+
});
|
|
148
|
+
const shouldInstall = !installed && (metadata?.dependencyFingerprint !== fingerprint || !hasValidInstalledDeps);
|
|
149
|
+
if (shouldInstall) {
|
|
150
|
+
await rm(nodeModulesPath, { recursive: true, force: true });
|
|
151
|
+
await runPackageManagerCommand(projectRoot, {
|
|
152
|
+
args: [
|
|
153
|
+
"install",
|
|
154
|
+
"--ignore-workspace",
|
|
155
|
+
"--config.shared-workspace-lockfile=false"
|
|
156
|
+
]
|
|
157
|
+
});
|
|
158
|
+
installed = true;
|
|
159
|
+
fingerprint = await fingerprintInstallManifest({
|
|
160
|
+
packageJsonPath,
|
|
161
|
+
lockfilePath: pnpmLockfilePath
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
if (installed || packageManagerNormalized || !metadata) {
|
|
165
|
+
await mkdir(path.dirname(metadataPath), { recursive: true });
|
|
166
|
+
await writeJsonFile(metadataPath, {
|
|
167
|
+
dependencyFingerprint: fingerprint,
|
|
168
|
+
installedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
169
|
+
packageManager: await readRepoPackageManager()
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
required: true,
|
|
174
|
+
installed,
|
|
175
|
+
lockfileGenerated,
|
|
176
|
+
packageManagerNormalized,
|
|
177
|
+
fingerprint
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
async function assertNoNpmLockfileConflict(projectRoot) {
|
|
181
|
+
const packageLockPath = path.join(projectRoot, "package-lock.json");
|
|
182
|
+
const pnpmLockPath = path.join(projectRoot, "pnpm-lock.yaml");
|
|
183
|
+
if (await pathExists(packageLockPath) && !await pathExists(pnpmLockPath)) {
|
|
184
|
+
throw new Error(buildPackageLockConflictMessage());
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
async function assertPnpmLockfilePresent(projectRoot) {
|
|
188
|
+
const pnpmLockfilePath = path.join(projectRoot, "pnpm-lock.yaml");
|
|
189
|
+
if (!await pathExists(pnpmLockfilePath)) {
|
|
190
|
+
throw new Error(buildMissingGeneratedLockfileMessage());
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
async function ensurePackageManagerNormalized(projectRoot) {
|
|
194
|
+
const packageJsonPath = path.join(projectRoot, "package.json");
|
|
195
|
+
const packageJsonContent = await readFile(packageJsonPath, "utf8");
|
|
196
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
197
|
+
const packageManager = await readRepoPackageManager();
|
|
198
|
+
const nextPackageJson = {
|
|
199
|
+
...packageJson,
|
|
200
|
+
packageManager,
|
|
201
|
+
pnpm: mergePnpmConfig(packageJson.pnpm)
|
|
202
|
+
};
|
|
203
|
+
const normalizedPackageJson = `${JSON.stringify(nextPackageJson, null, 2)}
|
|
204
|
+
`;
|
|
205
|
+
if (normalizedPackageJson === packageJsonContent) {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
await writeFile(packageJsonPath, normalizedPackageJson, "utf8");
|
|
209
|
+
return true;
|
|
210
|
+
}
|
|
211
|
+
function mergePnpmConfig(existingPnpm) {
|
|
212
|
+
const existingOverrides = existingPnpm?.overrides && typeof existingPnpm.overrides === "object" && !Array.isArray(existingPnpm.overrides) ? existingPnpm.overrides : {};
|
|
213
|
+
return {
|
|
214
|
+
...existingPnpm ?? {},
|
|
215
|
+
overrides: {
|
|
216
|
+
...existingOverrides,
|
|
217
|
+
...FRAMEWORK_PNPM_OVERRIDES
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
async function fingerprintInstallManifest(options) {
|
|
222
|
+
const packageJson = await readFile(options.packageJsonPath, "utf8");
|
|
223
|
+
const lockfile = await readFile(options.lockfilePath, "utf8");
|
|
224
|
+
const packageManager = await readRepoPackageManager();
|
|
225
|
+
return fingerprintContent([
|
|
226
|
+
packageJson,
|
|
227
|
+
lockfile,
|
|
228
|
+
`packageManager:${packageManager}`
|
|
229
|
+
]);
|
|
230
|
+
}
|
|
231
|
+
async function hasValidInstalledDependencies(options) {
|
|
232
|
+
const packageJson = await readJsonFile(
|
|
233
|
+
options.packageJsonPath
|
|
234
|
+
);
|
|
235
|
+
if (!packageJson) {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
const directDependencyNames = /* @__PURE__ */ new Set();
|
|
239
|
+
for (const field of [
|
|
240
|
+
"dependencies",
|
|
241
|
+
"devDependencies",
|
|
242
|
+
"optionalDependencies"
|
|
243
|
+
]) {
|
|
244
|
+
for (const packageName of Object.keys(packageJson[field] ?? {})) {
|
|
245
|
+
directDependencyNames.add(packageName);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
if (directDependencyNames.size === 0) {
|
|
249
|
+
return true;
|
|
250
|
+
}
|
|
251
|
+
for (const packageName of directDependencyNames) {
|
|
252
|
+
const packageRoot = path.join(
|
|
253
|
+
options.nodeModulesPath,
|
|
254
|
+
...packageName.split("/")
|
|
255
|
+
);
|
|
256
|
+
if (!await pathExists(path.join(packageRoot, "package.json"))) {
|
|
257
|
+
return false;
|
|
258
|
+
}
|
|
259
|
+
if (packageName === SDK_PACKAGE_NAME && !await hasInstalledSdkDistFiles(packageRoot)) {
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return true;
|
|
264
|
+
}
|
|
265
|
+
async function hasInstalledSdkDistFiles(packageRoot) {
|
|
266
|
+
for (const relativePath of SDK_REQUIRED_DIST_FILES) {
|
|
267
|
+
if (!await pathExists(path.join(packageRoot, relativePath))) {
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return true;
|
|
272
|
+
}
|
|
273
|
+
function hasExactPnpmVersion(value) {
|
|
274
|
+
return /^pnpm@\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/.test(value ?? "");
|
|
275
|
+
}
|
|
276
|
+
async function readRepoPackageManager() {
|
|
277
|
+
const packageJson = await readJsonFile(
|
|
278
|
+
REPO_PACKAGE_JSON_PATH
|
|
279
|
+
);
|
|
280
|
+
const packageManager = packageJson?.packageManager?.trim();
|
|
281
|
+
return hasExactPnpmVersion(packageManager) ? packageManager : DEFAULT_PACKAGE_MANAGER;
|
|
282
|
+
}
|
|
283
|
+
function fingerprintContent(parts) {
|
|
284
|
+
return crypto.createHash("sha256").update(parts.join("\n---\n")).digest("hex");
|
|
285
|
+
}
|
|
286
|
+
function resolvePnpmInstallInvocation(installArgs) {
|
|
287
|
+
const corepackPath = path.join(path.dirname(process.execPath), "corepack");
|
|
288
|
+
if (existsSync(corepackPath)) {
|
|
289
|
+
return { command: corepackPath, args: ["pnpm", ...installArgs] };
|
|
290
|
+
}
|
|
291
|
+
return { command: "pnpm", args: [...installArgs] };
|
|
292
|
+
}
|
|
293
|
+
async function runPackageManagerCommand(projectRoot, command) {
|
|
294
|
+
const invocation = resolvePnpmInstallInvocation(command.args);
|
|
295
|
+
await runLockfileCommand(projectRoot, {
|
|
296
|
+
binary: invocation.command,
|
|
297
|
+
args: invocation.args
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
async function runLockfileCommand(projectRoot, command) {
|
|
301
|
+
await new Promise((resolve, reject) => {
|
|
302
|
+
const child = spawn(command.binary, command.args, {
|
|
303
|
+
cwd: projectRoot,
|
|
304
|
+
env: process.env,
|
|
305
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
306
|
+
});
|
|
307
|
+
let stdout = "";
|
|
308
|
+
let stderr = "";
|
|
309
|
+
bindStream(child.stdout, (chunk) => {
|
|
310
|
+
stdout += chunk.toString();
|
|
311
|
+
});
|
|
312
|
+
bindStream(child.stderr, (chunk) => {
|
|
313
|
+
stderr += chunk.toString();
|
|
314
|
+
});
|
|
315
|
+
child.on("error", (cause) => {
|
|
316
|
+
reject(
|
|
317
|
+
new LockfileGenerationError(command.binary, {
|
|
318
|
+
stdout,
|
|
319
|
+
stderr,
|
|
320
|
+
cause
|
|
321
|
+
})
|
|
322
|
+
);
|
|
323
|
+
});
|
|
324
|
+
child.on("close", (code) => {
|
|
325
|
+
if (code === 0) {
|
|
326
|
+
resolve();
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
reject(
|
|
330
|
+
new LockfileGenerationError(command.binary, {
|
|
331
|
+
code,
|
|
332
|
+
stdout,
|
|
333
|
+
stderr
|
|
334
|
+
})
|
|
335
|
+
);
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
function buildLockfileGenerationErrorMessage(binary, details) {
|
|
340
|
+
if (details.cause) {
|
|
341
|
+
const errnoError = details.cause;
|
|
342
|
+
const binaryName = path.basename(binary).toLowerCase();
|
|
343
|
+
if (errnoError.code === "ENOENT" && (binaryName === "pnpm" || binaryName === "pnpm.cmd" || binaryName === "corepack" || binaryName === "corepack.exe")) {
|
|
344
|
+
return buildMissingDependencyToolingMessage();
|
|
345
|
+
}
|
|
346
|
+
return `Failed to start ${binary} for Dreamboard dependency reconciliation. ${details.cause.message}`;
|
|
347
|
+
}
|
|
348
|
+
const output = [details.stdout.trim(), details.stderr.trim()].filter((chunk) => chunk.length > 0).join("\n");
|
|
349
|
+
return buildDependencyPreparationFailureMessage({
|
|
350
|
+
exitCode: details.code,
|
|
351
|
+
output
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
async function pathExists(targetPath) {
|
|
355
|
+
try {
|
|
356
|
+
await lstat(targetPath);
|
|
357
|
+
return true;
|
|
358
|
+
} catch {
|
|
359
|
+
return false;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
async function readJsonFile(filePath) {
|
|
363
|
+
try {
|
|
364
|
+
return JSON.parse(await readFile(filePath, "utf8"));
|
|
365
|
+
} catch {
|
|
366
|
+
return null;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
async function writeJsonFile(filePath, value) {
|
|
370
|
+
await writeFile(filePath, `${JSON.stringify(value, null, 2)}
|
|
371
|
+
`, "utf8");
|
|
372
|
+
}
|
|
373
|
+
function bindStream(stream, onData) {
|
|
374
|
+
stream?.on("data", onData);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
export {
|
|
378
|
+
generatePnpmLockfile,
|
|
379
|
+
installWorkspaceDependencies,
|
|
380
|
+
reconcileWorkspaceDependencies
|
|
381
|
+
};
|
|
382
|
+
//# sourceMappingURL=chunk-XQXDOBYB.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/services/project/workspace-dependencies.ts","../../src/services/project/dependency-tooling-messages.ts"],"sourcesContent":["import crypto from \"node:crypto\";\nimport { spawn } from \"node:child_process\";\nimport { EventEmitter } from \"node:events\";\nimport { existsSync } from \"node:fs\";\nimport { mkdir, lstat, readFile, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n buildDependencyPreparationFailureMessage,\n buildMissingDependencyToolingMessage,\n buildMissingGeneratedLockfileMessage,\n buildPackageLockConflictMessage,\n} from \"./dependency-tooling-messages.js\";\nimport { FRAMEWORK_PNPM_OVERRIDES } from \"./framework-dependencies.js\";\n\ntype LockfileGenerationOptions = Record<string, never>;\n\ntype PackageJsonShape = {\n packageManager?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n pnpm?: Record<string, unknown>;\n};\n\ntype DependencyInstallMetadata = {\n dependencyFingerprint: string;\n installedAt: string;\n packageManager: string;\n};\n\ntype LockfileCommand = {\n binary: string;\n args: string[];\n};\n\nexport type WorkspaceDependencyReconciliationResult = {\n required: boolean;\n installed: boolean;\n lockfileGenerated: boolean;\n packageManagerNormalized: boolean;\n fingerprint: string | null;\n};\n\nconst MODULE_DIR = path.dirname(fileURLToPath(import.meta.url));\nconst CLI_ROOT = path.resolve(MODULE_DIR, \"../../..\");\nconst REPO_ROOT = path.resolve(CLI_ROOT, \"../..\");\nconst REPO_PACKAGE_JSON_PATH = path.join(REPO_ROOT, \"package.json\");\nconst DEFAULT_PACKAGE_MANAGER = \"pnpm@10.4.1\";\nconst SDK_PACKAGE_NAME = \"@dreamboard-games/sdk\";\nconst SDK_REQUIRED_DIST_FILES = [\n \"dist/index.d.ts\",\n \"dist/index.js\",\n \"dist/types.d.ts\",\n \"dist/types.js\",\n \"dist/ui.d.ts\",\n \"dist/ui.js\",\n \"dist/runtime.d.ts\",\n \"dist/runtime.js\",\n] as const;\nconst DEPENDENCY_INSTALL_METADATA_PATH_SEGMENTS = [\n \".dreamboard\",\n \"dependency-install.json\",\n] as const;\n\nclass LockfileGenerationError extends Error {\n constructor(\n readonly binary: string,\n readonly details: {\n code?: number | null;\n stdout: string;\n stderr: string;\n cause?: Error;\n },\n ) {\n super(buildLockfileGenerationErrorMessage(binary, details), {\n cause: details.cause,\n });\n this.name = \"LockfileGenerationError\";\n }\n}\n\nexport async function generatePnpmLockfile(\n projectRoot: string,\n _options: LockfileGenerationOptions = {},\n): Promise<boolean> {\n await ensurePackageManagerNormalized(projectRoot);\n await assertNoNpmLockfileConflict(projectRoot);\n await runPackageManagerCommand(projectRoot, {\n args: [\n \"install\",\n \"--ignore-workspace\",\n \"--lockfile-only\",\n \"--config.shared-workspace-lockfile=false\",\n ],\n });\n await assertPnpmLockfilePresent(projectRoot);\n return true;\n}\n\nexport async function installWorkspaceDependencies(\n projectRoot: string,\n _options: LockfileGenerationOptions = {},\n): Promise<boolean> {\n const result = await reconcileWorkspaceDependencies(projectRoot);\n return result.required;\n}\n\nexport async function reconcileWorkspaceDependencies(\n projectRoot: string,\n): Promise<WorkspaceDependencyReconciliationResult> {\n const packageJsonPath = path.join(projectRoot, \"package.json\");\n if (!(await pathExists(packageJsonPath))) {\n return {\n required: false,\n installed: false,\n lockfileGenerated: false,\n packageManagerNormalized: false,\n fingerprint: null,\n };\n }\n\n await assertNoNpmLockfileConflict(projectRoot);\n const packageManagerNormalized =\n await ensurePackageManagerNormalized(projectRoot);\n const pnpmLockfilePath = path.join(projectRoot, \"pnpm-lock.yaml\");\n const nodeModulesPath = path.join(projectRoot, \"node_modules\");\n const metadataPath = path.join(\n projectRoot,\n ...DEPENDENCY_INSTALL_METADATA_PATH_SEGMENTS,\n );\n\n let lockfileGenerated = false;\n let installed = false;\n const metadata = await readJsonFile<DependencyInstallMetadata>(metadataPath);\n const lockfileExists = await pathExists(pnpmLockfilePath);\n\n if (!lockfileExists) {\n await runPackageManagerCommand(projectRoot, {\n args: [\n \"install\",\n \"--ignore-workspace\",\n \"--config.shared-workspace-lockfile=false\",\n ],\n });\n lockfileGenerated = true;\n installed = true;\n }\n\n await assertPnpmLockfilePresent(projectRoot);\n let fingerprint = await fingerprintInstallManifest({\n packageJsonPath,\n lockfilePath: pnpmLockfilePath,\n });\n const hasValidInstalledDeps =\n (await pathExists(nodeModulesPath)) &&\n (await hasValidInstalledDependencies({\n packageJsonPath,\n nodeModulesPath,\n }));\n const shouldInstall =\n !installed &&\n (metadata?.dependencyFingerprint !== fingerprint || !hasValidInstalledDeps);\n\n if (shouldInstall) {\n await rm(nodeModulesPath, { recursive: true, force: true });\n await runPackageManagerCommand(projectRoot, {\n args: [\n \"install\",\n \"--ignore-workspace\",\n \"--config.shared-workspace-lockfile=false\",\n ],\n });\n installed = true;\n fingerprint = await fingerprintInstallManifest({\n packageJsonPath,\n lockfilePath: pnpmLockfilePath,\n });\n }\n\n if (installed || packageManagerNormalized || !metadata) {\n await mkdir(path.dirname(metadataPath), { recursive: true });\n await writeJsonFile(metadataPath, {\n dependencyFingerprint: fingerprint,\n installedAt: new Date().toISOString(),\n packageManager: await readRepoPackageManager(),\n } satisfies DependencyInstallMetadata);\n }\n\n return {\n required: true,\n installed,\n lockfileGenerated,\n packageManagerNormalized,\n fingerprint,\n };\n}\n\nasync function assertNoNpmLockfileConflict(projectRoot: string): Promise<void> {\n const packageLockPath = path.join(projectRoot, \"package-lock.json\");\n const pnpmLockPath = path.join(projectRoot, \"pnpm-lock.yaml\");\n if (\n (await pathExists(packageLockPath)) &&\n !(await pathExists(pnpmLockPath))\n ) {\n throw new Error(buildPackageLockConflictMessage());\n }\n}\n\nasync function assertPnpmLockfilePresent(projectRoot: string): Promise<void> {\n const pnpmLockfilePath = path.join(projectRoot, \"pnpm-lock.yaml\");\n if (!(await pathExists(pnpmLockfilePath))) {\n throw new Error(buildMissingGeneratedLockfileMessage());\n }\n}\n\nasync function ensurePackageManagerNormalized(\n projectRoot: string,\n): Promise<boolean> {\n const packageJsonPath = path.join(projectRoot, \"package.json\");\n const packageJsonContent = await readFile(packageJsonPath, \"utf8\");\n const packageJson = JSON.parse(packageJsonContent) as PackageJsonShape;\n const packageManager = await readRepoPackageManager();\n const nextPackageJson: PackageJsonShape = {\n ...packageJson,\n packageManager,\n pnpm: mergePnpmConfig(packageJson.pnpm),\n };\n const normalizedPackageJson = `${JSON.stringify(nextPackageJson, null, 2)}\\n`;\n if (normalizedPackageJson === packageJsonContent) {\n return false;\n }\n await writeFile(packageJsonPath, normalizedPackageJson, \"utf8\");\n return true;\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\nasync function fingerprintInstallManifest(options: {\n packageJsonPath: string;\n lockfilePath: string;\n}): Promise<string> {\n const packageJson = await readFile(options.packageJsonPath, \"utf8\");\n const lockfile = await readFile(options.lockfilePath, \"utf8\");\n const packageManager = await readRepoPackageManager();\n return fingerprintContent([\n packageJson,\n lockfile,\n `packageManager:${packageManager}`,\n ]);\n}\n\nasync function hasValidInstalledDependencies(options: {\n packageJsonPath: string;\n nodeModulesPath: string;\n}): Promise<boolean> {\n const packageJson = await readJsonFile<PackageJsonShape>(\n options.packageJsonPath,\n );\n if (!packageJson) {\n return false;\n }\n\n const directDependencyNames = new Set<string>();\n for (const field of [\n \"dependencies\",\n \"devDependencies\",\n \"optionalDependencies\",\n ] as const) {\n for (const packageName of Object.keys(packageJson[field] ?? {})) {\n directDependencyNames.add(packageName);\n }\n }\n\n if (directDependencyNames.size === 0) {\n return true;\n }\n\n for (const packageName of directDependencyNames) {\n const packageRoot = path.join(\n options.nodeModulesPath,\n ...packageName.split(\"/\"),\n );\n if (!(await pathExists(path.join(packageRoot, \"package.json\")))) {\n return false;\n }\n if (\n packageName === SDK_PACKAGE_NAME &&\n !(await hasInstalledSdkDistFiles(packageRoot))\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nasync function hasInstalledSdkDistFiles(packageRoot: string): Promise<boolean> {\n for (const relativePath of SDK_REQUIRED_DIST_FILES) {\n if (!(await pathExists(path.join(packageRoot, relativePath)))) {\n return false;\n }\n }\n return true;\n}\n\nfunction hasExactPnpmVersion(value?: string): boolean {\n return /^pnpm@\\d+\\.\\d+\\.\\d+(?:[-+][0-9A-Za-z.-]+)?$/.test(value ?? \"\");\n}\n\nasync function readRepoPackageManager(): Promise<string> {\n const packageJson = await readJsonFile<PackageJsonShape>(\n REPO_PACKAGE_JSON_PATH,\n );\n const packageManager = packageJson?.packageManager?.trim();\n return hasExactPnpmVersion(packageManager)\n ? packageManager!\n : DEFAULT_PACKAGE_MANAGER;\n}\n\nfunction fingerprintContent(parts: string[]): string {\n return crypto\n .createHash(\"sha256\")\n .update(parts.join(\"\\n---\\n\"))\n .digest(\"hex\");\n}\n\nfunction resolvePnpmInstallInvocation(installArgs: readonly string[]): {\n command: string;\n args: string[];\n} {\n const corepackPath = path.join(path.dirname(process.execPath), \"corepack\");\n if (existsSync(corepackPath)) {\n return { command: corepackPath, args: [\"pnpm\", ...installArgs] };\n }\n return { command: \"pnpm\", args: [...installArgs] };\n}\n\nasync function runPackageManagerCommand(\n projectRoot: string,\n command: { args: string[] },\n): Promise<void> {\n const invocation = resolvePnpmInstallInvocation(command.args);\n await runLockfileCommand(projectRoot, {\n binary: invocation.command,\n args: invocation.args,\n });\n}\n\nasync function runLockfileCommand(\n projectRoot: string,\n command: LockfileCommand,\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(command.binary, command.args, {\n cwd: projectRoot,\n env: process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n bindStream(child.stdout, (chunk) => {\n stdout += chunk.toString();\n });\n bindStream(child.stderr, (chunk) => {\n stderr += chunk.toString();\n });\n\n child.on(\"error\", (cause) => {\n reject(\n new LockfileGenerationError(command.binary, {\n stdout,\n stderr,\n cause,\n }),\n );\n });\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n reject(\n new LockfileGenerationError(command.binary, {\n code,\n stdout,\n stderr,\n }),\n );\n });\n });\n}\n\nfunction buildLockfileGenerationErrorMessage(\n binary: string,\n details: {\n code?: number | null;\n stdout: string;\n stderr: string;\n cause?: Error;\n },\n): string {\n if (details.cause) {\n const errnoError = details.cause as NodeJS.ErrnoException;\n const binaryName = path.basename(binary).toLowerCase();\n if (\n errnoError.code === \"ENOENT\" &&\n (binaryName === \"pnpm\" ||\n binaryName === \"pnpm.cmd\" ||\n binaryName === \"corepack\" ||\n binaryName === \"corepack.exe\")\n ) {\n return buildMissingDependencyToolingMessage();\n }\n return `Failed to start ${binary} for Dreamboard dependency reconciliation. ${details.cause.message}`;\n }\n\n const output = [details.stdout.trim(), details.stderr.trim()]\n .filter((chunk) => chunk.length > 0)\n .join(\"\\n\");\n\n return buildDependencyPreparationFailureMessage({\n exitCode: details.code,\n output,\n });\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await lstat(targetPath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readJsonFile<T>(filePath: string): Promise<T | null> {\n try {\n return JSON.parse(await readFile(filePath, \"utf8\")) as T;\n } catch {\n return null;\n }\n}\n\nasync function writeJsonFile(filePath: string, value: unknown): Promise<void> {\n await writeFile(filePath, `${JSON.stringify(value, null, 2)}\\n`, \"utf8\");\n}\n\nfunction bindStream(\n stream: Readable | EventEmitter | null | undefined,\n onData: (chunk: Buffer | string) => void,\n): void {\n stream?.on(\"data\", onData);\n}\n","import { DEFAULT_WEB_BASE_URL } from \"../../constants.js\";\n\nexport const DEPENDENCY_SETUP_DOCS_PATH = \"/docs/reference/dependency-setup\";\nexport const DEPENDENCY_SETUP_DOCS_URL = `${DEFAULT_WEB_BASE_URL}${DEPENDENCY_SETUP_DOCS_PATH}`;\n\nexport function buildMissingDependencyToolingMessage(): string {\n return [\n \"Dreamboard needs dependency tooling to finish `dreamboard sync`.\",\n \"Use Node 24+ with Corepack enabled, then run `dreamboard sync` again.\",\n \"If Corepack is unavailable on this machine, install pnpm globally with `npm install -g pnpm`.\",\n `Help: ${DEPENDENCY_SETUP_DOCS_URL}`,\n ].join(\"\\n\");\n}\n\nexport function buildPackageLockConflictMessage(): string {\n return [\n \"Dreamboard manages workspace dependencies during `dreamboard sync`.\",\n \"This workspace has an npm lockfile that conflicts with Dreamboard-managed dependencies.\",\n \"Remove `package-lock.json` and run `dreamboard sync` again.\",\n `Help: ${DEPENDENCY_SETUP_DOCS_URL}`,\n ].join(\"\\n\");\n}\n\nexport function buildMissingGeneratedLockfileMessage(): string {\n return [\n \"Dreamboard could not finish preparing workspace dependencies during `dreamboard sync`.\",\n \"Diagnostic: `pnpm-lock.yaml` was not created.\",\n `Help: ${DEPENDENCY_SETUP_DOCS_URL}`,\n ].join(\"\\n\");\n}\n\nexport function buildDependencyPreparationFailureMessage(options: {\n output?: string;\n exitCode?: number | null;\n}): string {\n const details = options.output?.trim();\n return [\n `Dreamboard could not finish preparing workspace dependencies during \\`dreamboard sync\\`${options.exitCode != null ? ` (exit code ${options.exitCode})` : \"\"}.`,\n details ? `Diagnostic output:\\n${details}` : null,\n `Help: ${DEPENDENCY_SETUP_DOCS_URL}`,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n}\n"],"mappings":";;;;;;;;;AAAA,OAAO,YAAY;AACnB,SAAS,aAAa;AACtB,OAA6B;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,OAAO,OAAO,UAAU,IAAI,iBAAiB;AACtD,OAAO,UAAU;AAEjB,SAAS,qBAAqB;;;ACLvB,IAAM,6BAA6B;AACnC,IAAM,4BAA4B,GAAG,oBAAoB,GAAG,0BAA0B;AAEtF,SAAS,uCAA+C;AAC7D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,yBAAyB;AAAA,EACpC,EAAE,KAAK,IAAI;AACb;AAEO,SAAS,kCAA0C;AACxD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,yBAAyB;AAAA,EACpC,EAAE,KAAK,IAAI;AACb;AAEO,SAAS,uCAA+C;AAC7D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS,yBAAyB;AAAA,EACpC,EAAE,KAAK,IAAI;AACb;AAEO,SAAS,yCAAyC,SAG9C;AACT,QAAM,UAAU,QAAQ,QAAQ,KAAK;AACrC,SAAO;AAAA,IACL,0FAA0F,QAAQ,YAAY,OAAO,eAAe,QAAQ,QAAQ,MAAM,EAAE;AAAA,IAC5J,UAAU;AAAA,EAAuB,OAAO,KAAK;AAAA,IAC7C,SAAS,yBAAyB;AAAA,EACpC,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AACd;;;ADGA,IAAM,aAAa,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAC9D,IAAM,WAAW,KAAK,QAAQ,YAAY,UAAU;AACpD,IAAM,YAAY,KAAK,QAAQ,UAAU,OAAO;AAChD,IAAM,yBAAyB,KAAK,KAAK,WAAW,cAAc;AAClE,IAAM,0BAA0B;AAChC,IAAM,mBAAmB;AACzB,IAAM,0BAA0B;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,4CAA4C;AAAA,EAChD;AAAA,EACA;AACF;AAEA,IAAM,0BAAN,cAAsC,MAAM;AAAA,EAC1C,YACW,QACA,SAMT;AACA,UAAM,oCAAoC,QAAQ,OAAO,GAAG;AAAA,MAC1D,OAAO,QAAQ;AAAA,IACjB,CAAC;AAVQ;AACA;AAUT,SAAK,OAAO;AAAA,EACd;AAAA,EAZW;AAAA,EACA;AAYb;AAEA,eAAsB,qBACpB,aACA,WAAsC,CAAC,GACrB;AAClB,QAAM,+BAA+B,WAAW;AAChD,QAAM,4BAA4B,WAAW;AAC7C,QAAM,yBAAyB,aAAa;AAAA,IAC1C,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AACD,QAAM,0BAA0B,WAAW;AAC3C,SAAO;AACT;AAEA,eAAsB,6BACpB,aACA,WAAsC,CAAC,GACrB;AAClB,QAAM,SAAS,MAAM,+BAA+B,WAAW;AAC/D,SAAO,OAAO;AAChB;AAEA,eAAsB,+BACpB,aACkD;AAClD,QAAM,kBAAkB,KAAK,KAAK,aAAa,cAAc;AAC7D,MAAI,CAAE,MAAM,WAAW,eAAe,GAAI;AACxC,WAAO;AAAA,MACL,UAAU;AAAA,MACV,WAAW;AAAA,MACX,mBAAmB;AAAA,MACnB,0BAA0B;AAAA,MAC1B,aAAa;AAAA,IACf;AAAA,EACF;AAEA,QAAM,4BAA4B,WAAW;AAC7C,QAAM,2BACJ,MAAM,+BAA+B,WAAW;AAClD,QAAM,mBAAmB,KAAK,KAAK,aAAa,gBAAgB;AAChE,QAAM,kBAAkB,KAAK,KAAK,aAAa,cAAc;AAC7D,QAAM,eAAe,KAAK;AAAA,IACxB;AAAA,IACA,GAAG;AAAA,EACL;AAEA,MAAI,oBAAoB;AACxB,MAAI,YAAY;AAChB,QAAM,WAAW,MAAM,aAAwC,YAAY;AAC3E,QAAM,iBAAiB,MAAM,WAAW,gBAAgB;AAExD,MAAI,CAAC,gBAAgB;AACnB,UAAM,yBAAyB,aAAa;AAAA,MAC1C,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AACD,wBAAoB;AACpB,gBAAY;AAAA,EACd;AAEA,QAAM,0BAA0B,WAAW;AAC3C,MAAI,cAAc,MAAM,2BAA2B;AAAA,IACjD;AAAA,IACA,cAAc;AAAA,EAChB,CAAC;AACD,QAAM,wBACH,MAAM,WAAW,eAAe,KAChC,MAAM,8BAA8B;AAAA,IACnC;AAAA,IACA;AAAA,EACF,CAAC;AACH,QAAM,gBACJ,CAAC,cACA,UAAU,0BAA0B,eAAe,CAAC;AAEvD,MAAI,eAAe;AACjB,UAAM,GAAG,iBAAiB,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC1D,UAAM,yBAAyB,aAAa;AAAA,MAC1C,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AACD,gBAAY;AACZ,kBAAc,MAAM,2BAA2B;AAAA,MAC7C;AAAA,MACA,cAAc;AAAA,IAChB,CAAC;AAAA,EACH;AAEA,MAAI,aAAa,4BAA4B,CAAC,UAAU;AACtD,UAAM,MAAM,KAAK,QAAQ,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AAC3D,UAAM,cAAc,cAAc;AAAA,MAChC,uBAAuB;AAAA,MACvB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,gBAAgB,MAAM,uBAAuB;AAAA,IAC/C,CAAqC;AAAA,EACvC;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,4BAA4B,aAAoC;AAC7E,QAAM,kBAAkB,KAAK,KAAK,aAAa,mBAAmB;AAClE,QAAM,eAAe,KAAK,KAAK,aAAa,gBAAgB;AAC5D,MACG,MAAM,WAAW,eAAe,KACjC,CAAE,MAAM,WAAW,YAAY,GAC/B;AACA,UAAM,IAAI,MAAM,gCAAgC,CAAC;AAAA,EACnD;AACF;AAEA,eAAe,0BAA0B,aAAoC;AAC3E,QAAM,mBAAmB,KAAK,KAAK,aAAa,gBAAgB;AAChE,MAAI,CAAE,MAAM,WAAW,gBAAgB,GAAI;AACzC,UAAM,IAAI,MAAM,qCAAqC,CAAC;AAAA,EACxD;AACF;AAEA,eAAe,+BACb,aACkB;AAClB,QAAM,kBAAkB,KAAK,KAAK,aAAa,cAAc;AAC7D,QAAM,qBAAqB,MAAM,SAAS,iBAAiB,MAAM;AACjE,QAAM,cAAc,KAAK,MAAM,kBAAkB;AACjD,QAAM,iBAAiB,MAAM,uBAAuB;AACpD,QAAM,kBAAoC;AAAA,IACxC,GAAG;AAAA,IACH;AAAA,IACA,MAAM,gBAAgB,YAAY,IAAI;AAAA,EACxC;AACA,QAAM,wBAAwB,GAAG,KAAK,UAAU,iBAAiB,MAAM,CAAC,CAAC;AAAA;AACzE,MAAI,0BAA0B,oBAAoB;AAChD,WAAO;AAAA,EACT;AACA,QAAM,UAAU,iBAAiB,uBAAuB,MAAM;AAC9D,SAAO;AACT;AAEA,SAAS,gBACP,cACyB;AACzB,QAAM,oBACJ,cAAc,aACd,OAAO,aAAa,cAAc,YAClC,CAAC,MAAM,QAAQ,aAAa,SAAS,IAChC,aAAa,YACd,CAAC;AACP,SAAO;AAAA,IACL,GAAI,gBAAgB,CAAC;AAAA,IACrB,WAAW;AAAA,MACT,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA,EACF;AACF;AAEA,eAAe,2BAA2B,SAGtB;AAClB,QAAM,cAAc,MAAM,SAAS,QAAQ,iBAAiB,MAAM;AAClE,QAAM,WAAW,MAAM,SAAS,QAAQ,cAAc,MAAM;AAC5D,QAAM,iBAAiB,MAAM,uBAAuB;AACpD,SAAO,mBAAmB;AAAA,IACxB;AAAA,IACA;AAAA,IACA,kBAAkB,cAAc;AAAA,EAClC,CAAC;AACH;AAEA,eAAe,8BAA8B,SAGxB;AACnB,QAAM,cAAc,MAAM;AAAA,IACxB,QAAQ;AAAA,EACV;AACA,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,wBAAwB,oBAAI,IAAY;AAC9C,aAAW,SAAS;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAY;AACV,eAAW,eAAe,OAAO,KAAK,YAAY,KAAK,KAAK,CAAC,CAAC,GAAG;AAC/D,4BAAsB,IAAI,WAAW;AAAA,IACvC;AAAA,EACF;AAEA,MAAI,sBAAsB,SAAS,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,aAAW,eAAe,uBAAuB;AAC/C,UAAM,cAAc,KAAK;AAAA,MACvB,QAAQ;AAAA,MACR,GAAG,YAAY,MAAM,GAAG;AAAA,IAC1B;AACA,QAAI,CAAE,MAAM,WAAW,KAAK,KAAK,aAAa,cAAc,CAAC,GAAI;AAC/D,aAAO;AAAA,IACT;AACA,QACE,gBAAgB,oBAChB,CAAE,MAAM,yBAAyB,WAAW,GAC5C;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,yBAAyB,aAAuC;AAC7E,aAAW,gBAAgB,yBAAyB;AAClD,QAAI,CAAE,MAAM,WAAW,KAAK,KAAK,aAAa,YAAY,CAAC,GAAI;AAC7D,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAAyB;AACpD,SAAO,8CAA8C,KAAK,SAAS,EAAE;AACvE;AAEA,eAAe,yBAA0C;AACvD,QAAM,cAAc,MAAM;AAAA,IACxB;AAAA,EACF;AACA,QAAM,iBAAiB,aAAa,gBAAgB,KAAK;AACzD,SAAO,oBAAoB,cAAc,IACrC,iBACA;AACN;AAEA,SAAS,mBAAmB,OAAyB;AACnD,SAAO,OACJ,WAAW,QAAQ,EACnB,OAAO,MAAM,KAAK,SAAS,CAAC,EAC5B,OAAO,KAAK;AACjB;AAEA,SAAS,6BAA6B,aAGpC;AACA,QAAM,eAAe,KAAK,KAAK,KAAK,QAAQ,QAAQ,QAAQ,GAAG,UAAU;AACzE,MAAI,WAAW,YAAY,GAAG;AAC5B,WAAO,EAAE,SAAS,cAAc,MAAM,CAAC,QAAQ,GAAG,WAAW,EAAE;AAAA,EACjE;AACA,SAAO,EAAE,SAAS,QAAQ,MAAM,CAAC,GAAG,WAAW,EAAE;AACnD;AAEA,eAAe,yBACb,aACA,SACe;AACf,QAAM,aAAa,6BAA6B,QAAQ,IAAI;AAC5D,QAAM,mBAAmB,aAAa;AAAA,IACpC,QAAQ,WAAW;AAAA,IACnB,MAAM,WAAW;AAAA,EACnB,CAAC;AACH;AAEA,eAAe,mBACb,aACA,SACe;AACf,QAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,UAAM,QAAQ,MAAM,QAAQ,QAAQ,QAAQ,MAAM;AAAA,MAChD,KAAK;AAAA,MACL,KAAK,QAAQ;AAAA,MACb,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAClC,CAAC;AAED,QAAI,SAAS;AACb,QAAI,SAAS;AAEb,eAAW,MAAM,QAAQ,CAAC,UAAU;AAClC,gBAAU,MAAM,SAAS;AAAA,IAC3B,CAAC;AACD,eAAW,MAAM,QAAQ,CAAC,UAAU;AAClC,gBAAU,MAAM,SAAS;AAAA,IAC3B,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,UAAU;AAC3B;AAAA,QACE,IAAI,wBAAwB,QAAQ,QAAQ;AAAA,UAC1C;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,UAAI,SAAS,GAAG;AACd,gBAAQ;AACR;AAAA,MACF;AACA;AAAA,QACE,IAAI,wBAAwB,QAAQ,QAAQ;AAAA,UAC1C;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,oCACP,QACA,SAMQ;AACR,MAAI,QAAQ,OAAO;AACjB,UAAM,aAAa,QAAQ;AAC3B,UAAM,aAAa,KAAK,SAAS,MAAM,EAAE,YAAY;AACrD,QACE,WAAW,SAAS,aACnB,eAAe,UACd,eAAe,cACf,eAAe,cACf,eAAe,iBACjB;AACA,aAAO,qCAAqC;AAAA,IAC9C;AACA,WAAO,mBAAmB,MAAM,8CAA8C,QAAQ,MAAM,OAAO;AAAA,EACrG;AAEA,QAAM,SAAS,CAAC,QAAQ,OAAO,KAAK,GAAG,QAAQ,OAAO,KAAK,CAAC,EACzD,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC,EAClC,KAAK,IAAI;AAEZ,SAAO,yCAAyC;AAAA,IAC9C,UAAU,QAAQ;AAAA,IAClB;AAAA,EACF,CAAC;AACH;AAEA,eAAe,WAAW,YAAsC;AAC9D,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,aAAgB,UAAqC;AAClE,MAAI;AACF,WAAO,KAAK,MAAM,MAAM,SAAS,UAAU,MAAM,CAAC;AAAA,EACpD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,cAAc,UAAkB,OAA+B;AAC5E,QAAM,UAAU,UAAU,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACzE;AAEA,SAAS,WACP,QACA,QACM;AACN,UAAQ,GAAG,QAAQ,MAAM;AAC3B;","names":[]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
importTypeScriptModule
|
|
4
|
+
} from "./chunk-XKCJBIRY.mjs";
|
|
5
|
+
|
|
6
|
+
// src/services/project/reducer-contract-preflight.ts
|
|
7
|
+
import path from "path";
|
|
8
|
+
var GAME_CONTRACT_ENTRY_PATH = path.join("app", "game-contract.ts");
|
|
9
|
+
function normalizeErrorMessage(error) {
|
|
10
|
+
const rawMessage = error instanceof Error ? error.message : String(error ?? "Unknown error");
|
|
11
|
+
return rawMessage.split("\n").map((line) => line.trim()).find(Boolean)?.replace(/^Error:\s*/u, "") ?? "Unknown error";
|
|
12
|
+
}
|
|
13
|
+
function isManifestScopedIdBrandingError(message) {
|
|
14
|
+
return message.includes("defineGameContract:") && message.includes("manifest-scoped") && (message.includes("uses a raw z.string()") || message.includes("uses z.array(z.string())"));
|
|
15
|
+
}
|
|
16
|
+
async function assertReducerContractPreflight(projectRoot) {
|
|
17
|
+
const entryPath = path.join(projectRoot, GAME_CONTRACT_ENTRY_PATH);
|
|
18
|
+
try {
|
|
19
|
+
await importTypeScriptModule(entryPath);
|
|
20
|
+
} catch (error) {
|
|
21
|
+
const message = normalizeErrorMessage(error);
|
|
22
|
+
if (isManifestScopedIdBrandingError(message)) {
|
|
23
|
+
throw new Error(
|
|
24
|
+
[
|
|
25
|
+
`Dreamboard could not validate \`${GAME_CONTRACT_ENTRY_PATH}\` during \`dreamboard sync\`.`,
|
|
26
|
+
"This happens because a state field name looks like a manifest-scoped id, but the schema uses a plain string instead of the manifest-backed id schema.",
|
|
27
|
+
"Workaround: use `gameContract.schemas.<id>` (or `manifest.ids.<id>`) for manifest ids. If the field is intentionally free-form text, rename it so it does not look like a manifest id field.",
|
|
28
|
+
`Original error: ${message}`
|
|
29
|
+
].join(" ")
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
throw new Error(
|
|
33
|
+
[
|
|
34
|
+
`Dreamboard could not validate \`${GAME_CONTRACT_ENTRY_PATH}\` during \`dreamboard sync\`.`,
|
|
35
|
+
"Fix the authored reducer contract module so it can be imported locally, then run `dreamboard sync` again.",
|
|
36
|
+
`Original error: ${message}`
|
|
37
|
+
].join(" ")
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export {
|
|
43
|
+
assertReducerContractPreflight
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=chunk-YDIOW2BO.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/services/project/reducer-contract-preflight.ts"],"sourcesContent":["import path from \"node:path\";\nimport { importTypeScriptModule } from \"../../utils/ts-module-loader.js\";\n\nconst GAME_CONTRACT_ENTRY_PATH = path.join(\"app\", \"game-contract.ts\");\n\nfunction normalizeErrorMessage(error: unknown): string {\n const rawMessage =\n error instanceof Error ? error.message : String(error ?? \"Unknown error\");\n return (\n rawMessage\n .split(\"\\n\")\n .map((line) => line.trim())\n .find(Boolean)\n ?.replace(/^Error:\\s*/u, \"\") ?? \"Unknown error\"\n );\n}\n\nfunction isManifestScopedIdBrandingError(message: string): boolean {\n return (\n message.includes(\"defineGameContract:\") &&\n message.includes(\"manifest-scoped\") &&\n (message.includes(\"uses a raw z.string()\") ||\n message.includes(\"uses z.array(z.string())\"))\n );\n}\n\nexport async function assertReducerContractPreflight(\n projectRoot: string,\n): Promise<void> {\n const entryPath = path.join(projectRoot, GAME_CONTRACT_ENTRY_PATH);\n\n try {\n await importTypeScriptModule(entryPath);\n } catch (error) {\n const message = normalizeErrorMessage(error);\n if (isManifestScopedIdBrandingError(message)) {\n throw new Error(\n [\n `Dreamboard could not validate \\`${GAME_CONTRACT_ENTRY_PATH}\\` during \\`dreamboard sync\\`.`,\n \"This happens because a state field name looks like a manifest-scoped id, but the schema uses a plain string instead of the manifest-backed id schema.\",\n \"Workaround: use `gameContract.schemas.<id>` (or `manifest.ids.<id>`) for manifest ids. If the field is intentionally free-form text, rename it so it does not look like a manifest id field.\",\n `Original error: ${message}`,\n ].join(\" \"),\n );\n }\n\n throw new Error(\n [\n `Dreamboard could not validate \\`${GAME_CONTRACT_ENTRY_PATH}\\` during \\`dreamboard sync\\`.`,\n \"Fix the authored reducer contract module so it can be imported locally, then run `dreamboard sync` again.\",\n `Original error: ${message}`,\n ].join(\" \"),\n );\n }\n}\n"],"mappings":";;;;;;AAAA,OAAO,UAAU;AAGjB,IAAM,2BAA2B,KAAK,KAAK,OAAO,kBAAkB;AAEpE,SAAS,sBAAsB,OAAwB;AACrD,QAAM,aACJ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,SAAS,eAAe;AAC1E,SACE,WACG,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,KAAK,OAAO,GACX,QAAQ,eAAe,EAAE,KAAK;AAEtC;AAEA,SAAS,gCAAgC,SAA0B;AACjE,SACE,QAAQ,SAAS,qBAAqB,KACtC,QAAQ,SAAS,iBAAiB,MACjC,QAAQ,SAAS,uBAAuB,KACvC,QAAQ,SAAS,0BAA0B;AAEjD;AAEA,eAAsB,+BACpB,aACe;AACf,QAAM,YAAY,KAAK,KAAK,aAAa,wBAAwB;AAEjE,MAAI;AACF,UAAM,uBAAuB,SAAS;AAAA,EACxC,SAAS,OAAO;AACd,UAAM,UAAU,sBAAsB,KAAK;AAC3C,QAAI,gCAAgC,OAAO,GAAG;AAC5C,YAAM,IAAI;AAAA,QACR;AAAA,UACE,mCAAmC,wBAAwB;AAAA,UAC3D;AAAA,UACA;AAAA,UACA,mBAAmB,OAAO;AAAA,QAC5B,EAAE,KAAK,GAAG;AAAA,MACZ;AAAA,IACF;AAEA,UAAM,IAAI;AAAA,MACR;AAAA,QACE,mCAAmC,wBAAwB;AAAA,QAC3D;AAAA,QACA,mBAAmB,OAAO;AAAA,MAC5B,EAAE,KAAK,GAAG;AAAA,IACZ;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/services/project/project-state.ts
|
|
4
|
+
var LOCAL_MAINTAINER_SDK_PACKAGE_NAMES = [
|
|
5
|
+
"@dreamboard-games/api-client",
|
|
6
|
+
"@dreamboard-games/sdk"
|
|
7
|
+
];
|
|
8
|
+
function getProjectAuthoringState(projectConfig) {
|
|
9
|
+
return projectConfig.authoring ?? {};
|
|
10
|
+
}
|
|
11
|
+
function getProjectPendingAuthoringSync(projectConfig) {
|
|
12
|
+
return getProjectAuthoringState(projectConfig).pendingSync;
|
|
13
|
+
}
|
|
14
|
+
function getProjectCompileState(projectConfig) {
|
|
15
|
+
return projectConfig.compile ?? {};
|
|
16
|
+
}
|
|
17
|
+
function getProjectLocalMaintainerRegistry(projectConfig) {
|
|
18
|
+
return projectConfig.localMaintainerRegistry;
|
|
19
|
+
}
|
|
20
|
+
function updateProjectAuthoringState(projectConfig, authoring) {
|
|
21
|
+
return {
|
|
22
|
+
...projectConfig,
|
|
23
|
+
authoring: {
|
|
24
|
+
...getProjectAuthoringState(projectConfig),
|
|
25
|
+
...authoring
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function setProjectPendingAuthoringSync(projectConfig, pendingSync) {
|
|
30
|
+
return updateProjectAuthoringState(projectConfig, {
|
|
31
|
+
pendingSync
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function clearProjectPendingAuthoringSync(projectConfig) {
|
|
35
|
+
const authoring = getProjectAuthoringState(projectConfig);
|
|
36
|
+
if (!authoring.pendingSync) {
|
|
37
|
+
return projectConfig;
|
|
38
|
+
}
|
|
39
|
+
const { pendingSync: _pendingSync, ...rest } = authoring;
|
|
40
|
+
return {
|
|
41
|
+
...projectConfig,
|
|
42
|
+
authoring: rest
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function finalizeProjectPendingAuthoringSync(projectConfig) {
|
|
46
|
+
const authoring = getProjectAuthoringState(projectConfig);
|
|
47
|
+
const pendingSync = authoring.pendingSync;
|
|
48
|
+
if (!pendingSync) {
|
|
49
|
+
return projectConfig;
|
|
50
|
+
}
|
|
51
|
+
return updateProjectAuthoringState(
|
|
52
|
+
clearProjectPendingAuthoringSync(projectConfig),
|
|
53
|
+
{
|
|
54
|
+
authoringStateId: pendingSync.phase === "authoring_state_created" ? pendingSync.authoringStateId : authoring.authoringStateId,
|
|
55
|
+
revisionDigest: pendingSync.revisionDigest ?? authoring.revisionDigest,
|
|
56
|
+
sourceRevisionId: pendingSync.sourceRevisionId,
|
|
57
|
+
sourceTreeHash: pendingSync.sourceTreeHash,
|
|
58
|
+
manifestId: pendingSync.manifestId,
|
|
59
|
+
manifestContentHash: pendingSync.manifestContentHash,
|
|
60
|
+
localManifestContentHash: pendingSync.localManifestContentHash,
|
|
61
|
+
ruleId: pendingSync.ruleId
|
|
62
|
+
}
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
function updateProjectCompileState(projectConfig, compile) {
|
|
66
|
+
return {
|
|
67
|
+
...projectConfig,
|
|
68
|
+
compile: {
|
|
69
|
+
...getProjectCompileState(projectConfig),
|
|
70
|
+
...compile
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function setLatestCompileAttempt(projectConfig, attempt) {
|
|
75
|
+
return updateProjectCompileState(projectConfig, {
|
|
76
|
+
...getProjectCompileState(projectConfig),
|
|
77
|
+
latestAttempt: attempt,
|
|
78
|
+
latestSuccessful: attempt.status === "successful" && attempt.resultId ? {
|
|
79
|
+
resultId: attempt.resultId,
|
|
80
|
+
authoringStateId: attempt.authoringStateId,
|
|
81
|
+
revisionDigest: attempt.revisionDigest
|
|
82
|
+
} : getProjectCompileState(projectConfig).latestSuccessful
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function clearProjectCompileState(projectConfig) {
|
|
86
|
+
return {
|
|
87
|
+
...projectConfig,
|
|
88
|
+
compile: {}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function updateProjectLocalMaintainerRegistry(projectConfig, localMaintainerRegistry) {
|
|
92
|
+
return {
|
|
93
|
+
...projectConfig,
|
|
94
|
+
localMaintainerRegistry: sanitizeProjectLocalMaintainerRegistry(
|
|
95
|
+
localMaintainerRegistry
|
|
96
|
+
)
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function sanitizeProjectLocalMaintainerRegistry(localMaintainerRegistry) {
|
|
100
|
+
if (!localMaintainerRegistry) return void 0;
|
|
101
|
+
const packages = {};
|
|
102
|
+
for (const packageName of LOCAL_MAINTAINER_SDK_PACKAGE_NAMES) {
|
|
103
|
+
const version = localMaintainerRegistry.packages[packageName];
|
|
104
|
+
if (version) {
|
|
105
|
+
packages[packageName] = version;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
...localMaintainerRegistry,
|
|
110
|
+
packages
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export {
|
|
115
|
+
getProjectAuthoringState,
|
|
116
|
+
getProjectPendingAuthoringSync,
|
|
117
|
+
getProjectCompileState,
|
|
118
|
+
getProjectLocalMaintainerRegistry,
|
|
119
|
+
updateProjectAuthoringState,
|
|
120
|
+
setProjectPendingAuthoringSync,
|
|
121
|
+
clearProjectPendingAuthoringSync,
|
|
122
|
+
finalizeProjectPendingAuthoringSync,
|
|
123
|
+
updateProjectCompileState,
|
|
124
|
+
setLatestCompileAttempt,
|
|
125
|
+
clearProjectCompileState,
|
|
126
|
+
updateProjectLocalMaintainerRegistry,
|
|
127
|
+
sanitizeProjectLocalMaintainerRegistry
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=chunk-YE7UAO3T.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/services/project/project-state.ts"],"sourcesContent":["import type {\n LocalMaintainerRegistryConfig,\n LocalMaintainerRegistryPackages,\n LocalMaintainerSdkPackageName,\n ProjectAuthoringState,\n ProjectCompileAttempt,\n ProjectCompileState,\n ProjectConfig,\n ProjectPendingAuthoringSync,\n} from \"../../types.js\";\n\nconst LOCAL_MAINTAINER_SDK_PACKAGE_NAMES = [\n \"@dreamboard-games/api-client\",\n \"@dreamboard-games/sdk\",\n] as const satisfies readonly LocalMaintainerSdkPackageName[];\n\nexport function getProjectAuthoringState(\n projectConfig: ProjectConfig,\n): ProjectAuthoringState {\n return projectConfig.authoring ?? {};\n}\n\nexport function getProjectPendingAuthoringSync(\n projectConfig: ProjectConfig,\n): ProjectPendingAuthoringSync | undefined {\n return getProjectAuthoringState(projectConfig).pendingSync;\n}\n\nexport function getProjectCompileState(\n projectConfig: ProjectConfig,\n): ProjectCompileState {\n return projectConfig.compile ?? {};\n}\n\nexport function getProjectLocalMaintainerRegistry(\n projectConfig: ProjectConfig,\n): LocalMaintainerRegistryConfig | undefined {\n return projectConfig.localMaintainerRegistry;\n}\n\nexport function updateProjectAuthoringState(\n projectConfig: ProjectConfig,\n authoring: ProjectAuthoringState,\n): ProjectConfig {\n return {\n ...projectConfig,\n authoring: {\n ...getProjectAuthoringState(projectConfig),\n ...authoring,\n },\n };\n}\n\nexport function setProjectPendingAuthoringSync(\n projectConfig: ProjectConfig,\n pendingSync: ProjectPendingAuthoringSync,\n): ProjectConfig {\n return updateProjectAuthoringState(projectConfig, {\n pendingSync,\n });\n}\n\nexport function clearProjectPendingAuthoringSync(\n projectConfig: ProjectConfig,\n): ProjectConfig {\n const authoring = getProjectAuthoringState(projectConfig);\n if (!authoring.pendingSync) {\n return projectConfig;\n }\n\n const { pendingSync: _pendingSync, ...rest } = authoring;\n return {\n ...projectConfig,\n authoring: rest,\n };\n}\n\nexport function finalizeProjectPendingAuthoringSync(\n projectConfig: ProjectConfig,\n): ProjectConfig {\n const authoring = getProjectAuthoringState(projectConfig);\n const pendingSync = authoring.pendingSync;\n if (!pendingSync) {\n return projectConfig;\n }\n\n return updateProjectAuthoringState(\n clearProjectPendingAuthoringSync(projectConfig),\n {\n authoringStateId:\n pendingSync.phase === \"authoring_state_created\"\n ? pendingSync.authoringStateId\n : authoring.authoringStateId,\n revisionDigest: pendingSync.revisionDigest ?? authoring.revisionDigest,\n sourceRevisionId: pendingSync.sourceRevisionId,\n sourceTreeHash: pendingSync.sourceTreeHash,\n manifestId: pendingSync.manifestId,\n manifestContentHash: pendingSync.manifestContentHash,\n localManifestContentHash: pendingSync.localManifestContentHash,\n ruleId: pendingSync.ruleId,\n },\n );\n}\n\nexport function updateProjectCompileState(\n projectConfig: ProjectConfig,\n compile: ProjectCompileState,\n): ProjectConfig {\n return {\n ...projectConfig,\n compile: {\n ...getProjectCompileState(projectConfig),\n ...compile,\n },\n };\n}\n\nexport function setLatestCompileAttempt(\n projectConfig: ProjectConfig,\n attempt: ProjectCompileAttempt,\n): ProjectConfig {\n return updateProjectCompileState(projectConfig, {\n ...getProjectCompileState(projectConfig),\n latestAttempt: attempt,\n latestSuccessful:\n attempt.status === \"successful\" && attempt.resultId\n ? {\n resultId: attempt.resultId,\n authoringStateId: attempt.authoringStateId,\n revisionDigest: attempt.revisionDigest,\n }\n : getProjectCompileState(projectConfig).latestSuccessful,\n });\n}\n\nexport function clearProjectCompileState(\n projectConfig: ProjectConfig,\n): ProjectConfig {\n return {\n ...projectConfig,\n compile: {},\n };\n}\n\nexport function updateProjectLocalMaintainerRegistry(\n projectConfig: ProjectConfig,\n localMaintainerRegistry: LocalMaintainerRegistryConfig | undefined,\n): ProjectConfig {\n return {\n ...projectConfig,\n localMaintainerRegistry: sanitizeProjectLocalMaintainerRegistry(\n localMaintainerRegistry,\n ),\n };\n}\n\nexport function sanitizeProjectLocalMaintainerRegistry(\n localMaintainerRegistry: LocalMaintainerRegistryConfig | undefined,\n): LocalMaintainerRegistryConfig | undefined {\n if (!localMaintainerRegistry) return undefined;\n\n const packages: Partial<LocalMaintainerRegistryPackages> = {};\n for (const packageName of LOCAL_MAINTAINER_SDK_PACKAGE_NAMES) {\n const version = localMaintainerRegistry.packages[packageName];\n if (version) {\n packages[packageName] = version;\n }\n }\n\n return {\n ...localMaintainerRegistry,\n packages: packages as LocalMaintainerRegistryPackages,\n };\n}\n"],"mappings":";;;AAWA,IAAM,qCAAqC;AAAA,EACzC;AAAA,EACA;AACF;AAEO,SAAS,yBACd,eACuB;AACvB,SAAO,cAAc,aAAa,CAAC;AACrC;AAEO,SAAS,+BACd,eACyC;AACzC,SAAO,yBAAyB,aAAa,EAAE;AACjD;AAEO,SAAS,uBACd,eACqB;AACrB,SAAO,cAAc,WAAW,CAAC;AACnC;AAEO,SAAS,kCACd,eAC2C;AAC3C,SAAO,cAAc;AACvB;AAEO,SAAS,4BACd,eACA,WACe;AACf,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW;AAAA,MACT,GAAG,yBAAyB,aAAa;AAAA,MACzC,GAAG;AAAA,IACL;AAAA,EACF;AACF;AAEO,SAAS,+BACd,eACA,aACe;AACf,SAAO,4BAA4B,eAAe;AAAA,IAChD;AAAA,EACF,CAAC;AACH;AAEO,SAAS,iCACd,eACe;AACf,QAAM,YAAY,yBAAyB,aAAa;AACxD,MAAI,CAAC,UAAU,aAAa;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,aAAa,cAAc,GAAG,KAAK,IAAI;AAC/C,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW;AAAA,EACb;AACF;AAEO,SAAS,oCACd,eACe;AACf,QAAM,YAAY,yBAAyB,aAAa;AACxD,QAAM,cAAc,UAAU;AAC9B,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,iCAAiC,aAAa;AAAA,IAC9C;AAAA,MACE,kBACE,YAAY,UAAU,4BAClB,YAAY,mBACZ,UAAU;AAAA,MAChB,gBAAgB,YAAY,kBAAkB,UAAU;AAAA,MACxD,kBAAkB,YAAY;AAAA,MAC9B,gBAAgB,YAAY;AAAA,MAC5B,YAAY,YAAY;AAAA,MACxB,qBAAqB,YAAY;AAAA,MACjC,0BAA0B,YAAY;AAAA,MACtC,QAAQ,YAAY;AAAA,IACtB;AAAA,EACF;AACF;AAEO,SAAS,0BACd,eACA,SACe;AACf,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS;AAAA,MACP,GAAG,uBAAuB,aAAa;AAAA,MACvC,GAAG;AAAA,IACL;AAAA,EACF;AACF;AAEO,SAAS,wBACd,eACA,SACe;AACf,SAAO,0BAA0B,eAAe;AAAA,IAC9C,GAAG,uBAAuB,aAAa;AAAA,IACvC,eAAe;AAAA,IACf,kBACE,QAAQ,WAAW,gBAAgB,QAAQ,WACvC;AAAA,MACE,UAAU,QAAQ;AAAA,MAClB,kBAAkB,QAAQ;AAAA,MAC1B,gBAAgB,QAAQ;AAAA,IAC1B,IACA,uBAAuB,aAAa,EAAE;AAAA,EAC9C,CAAC;AACH;AAEO,SAAS,yBACd,eACe;AACf,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS,CAAC;AAAA,EACZ;AACF;AAEO,SAAS,qCACd,eACA,yBACe;AACf,SAAO;AAAA,IACL,GAAG;AAAA,IACH,yBAAyB;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,uCACd,yBAC2C;AAC3C,MAAI,CAAC,wBAAyB,QAAO;AAErC,QAAM,WAAqD,CAAC;AAC5D,aAAW,eAAe,oCAAoC;AAC5D,UAAM,UAAU,wBAAwB,SAAS,WAAW;AAC5D,QAAI,SAAS;AACX,eAAS,WAAW,IAAI;AAAA,IAC1B;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
|