@bitmagic/cli 0.1.51-dev.0 → 0.1.51
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/README.md +79 -23
- package/dist/commands/init.js +17 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.js +6 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/upgrade.js +35 -2
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/config/environments.d.ts +24 -19
- package/dist/config/environments.js +58 -30
- package/dist/config/environments.js.map +1 -1
- package/dist/config/folder-environment.d.ts +31 -0
- package/dist/config/folder-environment.js +83 -0
- package/dist/config/folder-environment.js.map +1 -0
- package/dist/editor/asset-viewer.js.map +1 -1
- package/dist/editor/shell-page.js +7 -5
- package/dist/editor/shell-page.js.map +1 -1
- package/dist/forge/apply-modifications.js +3 -24
- package/dist/forge/apply-modifications.js.map +1 -1
- package/dist/generate/apply-patches.js +4 -27
- package/dist/generate/apply-patches.js.map +1 -1
- package/dist/project/context.d.ts +12 -0
- package/dist/project/context.js +19 -5
- package/dist/project/context.js.map +1 -1
- package/dist/project/world-json.d.ts +25 -0
- package/dist/project/world-json.js +59 -0
- package/dist/project/world-json.js.map +1 -0
- package/dist/scaffold/legacy-default-assets.d.ts +79 -0
- package/dist/scaffold/legacy-default-assets.js +124 -0
- package/dist/scaffold/legacy-default-assets.js.map +1 -0
- package/dist/scaffold/upgrade-project.d.ts +22 -3
- package/dist/scaffold/upgrade-project.js +19 -3
- package/dist/scaffold/upgrade-project.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readProjectEnvironment } from '../project/context.js';
|
|
2
2
|
import { CliError } from '../errors.js';
|
|
3
3
|
import { readDefaultEnvironment } from './credentials.js';
|
|
4
|
-
import {
|
|
4
|
+
import { FOLDER_ENVIRONMENT_MARKER, readFolderEnvironment } from './folder-environment.js';
|
|
5
5
|
const DEV_AUTH0_DOMAIN = 'bitmagic-v3-staging.us.auth0.com';
|
|
6
6
|
const DEV_AUTH0_AUDIENCE = 'https://api.bitmagic.cloud';
|
|
7
7
|
// Public identifier of the "Bitmagic CLI APP" Auth0 Native application, not a secret — native
|
|
@@ -43,29 +43,38 @@ export function isEnvironmentName(value) {
|
|
|
43
43
|
return Object.prototype.hasOwnProperty.call(ENVIRONMENTS, value);
|
|
44
44
|
}
|
|
45
45
|
/**
|
|
46
|
-
* The environment a CLI points at when nothing else says
|
|
47
|
-
* for. `@bitmagic/cli` from `latest` is the release a creator installs to make a real game, so it
|
|
48
|
-
* targets prod; `@bitmagic/cli@dev` carries `-dev.N` and exists to exercise endpoints that land on
|
|
49
|
-
* the dev api-server first, so it targets dev. Requiring `--env prod` on the release line made the
|
|
50
|
-
* common case the one that needed a flag.
|
|
46
|
+
* The environment a CLI points at when nothing else says at all: prod, always.
|
|
51
47
|
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
48
|
+
* This used to ask the CLI about its own release line — `-dev.N` meant dev, a plain version meant
|
|
49
|
+
* prod — so that a dev build needed no `--env` to reach the dev api-server. That answer is now
|
|
50
|
+
* carried by `.bitmagic-env` instead, which states it per folder rather than inferring it from an
|
|
51
|
+
* install, and states it for the release line too. Once the intent has somewhere honest to live,
|
|
52
|
+
* inferring it is worse than not: the lane rule made the same command mean different things on two
|
|
53
|
+
* machines, and the difference was a version string nobody was looking at.
|
|
54
|
+
*
|
|
55
|
+
* Prod because this is the bottom of the chain, and the bottom should be the environment a creator
|
|
56
|
+
* who has expressed no preference actually wants: the one their games live on. Everything else is
|
|
57
|
+
* reachable, and now has to be asked for — a marker, a project pin, BITMAGIC_ENV, or --env.
|
|
58
|
+
*
|
|
59
|
+
* The cost is real and worth naming: aiming at prod by accident is the more expensive mistake, as a
|
|
60
|
+
* command that lands there can touch a published game, whereas one aimed at dev usually fails
|
|
61
|
+
* visibly at the first authenticated call. That is the trade of making the default predictable
|
|
62
|
+
* rather than inferred, and it is why every non-prod tree should carry a marker.
|
|
56
63
|
*/
|
|
57
|
-
export
|
|
58
|
-
if (!cliVersion)
|
|
59
|
-
return 'dev';
|
|
60
|
-
return cliVersion.includes('-') ? 'dev' : 'prod';
|
|
61
|
-
}
|
|
64
|
+
export const DEFAULT_ENVIRONMENT = 'prod';
|
|
62
65
|
/** Where the bad value came from, and therefore how to tell the user to fix it. */
|
|
63
|
-
function unknownEnvironmentMessage(candidate, source) {
|
|
66
|
+
function unknownEnvironmentMessage(candidate, source, markerPath) {
|
|
64
67
|
const valid = `Valid environments: ${ENVIRONMENT_NAMES.join(', ')}.`;
|
|
65
68
|
if (source === 'project') {
|
|
66
69
|
return (`Unknown environment "${candidate}" in this project's bitmagic.json. ${valid} ` +
|
|
67
70
|
'Fix the "environment" field, or override it with --env / BITMAGIC_ENV.');
|
|
68
71
|
}
|
|
72
|
+
if (source === 'folder') {
|
|
73
|
+
// Named by path, not by filename: the marker is a dotfile and may sit several directories up,
|
|
74
|
+
// so "check your .bitmagic-env" would leave someone hunting for which one.
|
|
75
|
+
return (`Unknown environment "${candidate}" in ${markerPath ?? FOLDER_ENVIRONMENT_MARKER}. ` +
|
|
76
|
+
`${valid} Fix the "env" line, or override it with --env / BITMAGIC_ENV.`);
|
|
77
|
+
}
|
|
69
78
|
return `Unknown environment "${candidate}". ${valid}`;
|
|
70
79
|
}
|
|
71
80
|
/**
|
|
@@ -79,10 +88,11 @@ export function selectEnvironment(options = {}) {
|
|
|
79
88
|
const env = options.env ?? process.env;
|
|
80
89
|
// A stored default is written by an older or corrupted CLI, not typed by the user, so an
|
|
81
90
|
// unrecognised value (e.g. a stale "staging") must not wedge every command with a CliError —
|
|
82
|
-
// treat it as absent and fall through to
|
|
83
|
-
// the user right now (--env, BITMAGIC_ENV) or sitting in a
|
|
84
|
-
// (bitmagic.json), and those get direct feedback instead of a silent wrong
|
|
85
|
-
//
|
|
91
|
+
// treat it as absent and fall through to the default below. Everything else in the chain is
|
|
92
|
+
// either typed by the user right now (--env, BITMAGIC_ENV) or sitting in a file they can see and
|
|
93
|
+
// edit (bitmagic.json, .bitmagic-env), and those get direct feedback instead of a silent wrong
|
|
94
|
+
// answer: resolving somewhere else because a file says "production" is the wrong-env hazard this
|
|
95
|
+
// chain exists to end.
|
|
86
96
|
const validStoredDefault = options.storedDefault !== undefined && isEnvironmentName(options.storedDefault)
|
|
87
97
|
? options.storedDefault
|
|
88
98
|
: undefined;
|
|
@@ -90,20 +100,33 @@ export function selectEnvironment(options = {}) {
|
|
|
90
100
|
// machine-global sticky state — whatever was last logged into, anywhere — while bitmagic.json
|
|
91
101
|
// records which api-server minted THIS checkout's gameId and served the engine pinned in it.
|
|
92
102
|
// Both lose to a value typed for this one command.
|
|
103
|
+
//
|
|
104
|
+
// The folder marker sits BETWEEN them, and the ranking is the whole point of it. Below the
|
|
105
|
+
// project: a checkout that already declares its environment must never be re-aimed by where it
|
|
106
|
+
// happens to sit on disk, so a prod project dropped into dev-games/ stays prod — the opposite of
|
|
107
|
+
// what BITMAGIC_ENV does, and deliberately so. Above the stored default: a brand-new project has
|
|
108
|
+
// no pin yet, so at `bitmagic init` the folder is the only thing that knows what the creator
|
|
109
|
+
// meant, and without it the answer came from whatever they last logged in to.
|
|
93
110
|
const candidates = [
|
|
94
111
|
[options.explicit, 'flag'],
|
|
95
112
|
[env.BITMAGIC_ENV, 'BITMAGIC_ENV'],
|
|
96
113
|
[options.projectDefault, 'project'],
|
|
114
|
+
[options.folderDefault, 'folder'],
|
|
97
115
|
[validStoredDefault, 'stored'],
|
|
98
116
|
];
|
|
99
117
|
const chosen = candidates.find(([value]) => value !== undefined);
|
|
100
|
-
const candidate = chosen?.[0] ??
|
|
118
|
+
const candidate = chosen?.[0] ?? DEFAULT_ENVIRONMENT;
|
|
101
119
|
const source = chosen?.[1] ?? 'default';
|
|
102
120
|
if (!isEnvironmentName(candidate)) {
|
|
103
|
-
throw new CliError(unknownEnvironmentMessage(candidate, source));
|
|
121
|
+
throw new CliError(unknownEnvironmentMessage(candidate, source, options.folderMarkerPath));
|
|
104
122
|
}
|
|
105
123
|
const resolved = ENVIRONMENTS[candidate];
|
|
106
|
-
|
|
124
|
+
// A marker's apiUrl applies only when that marker also chose the environment. Otherwise a
|
|
125
|
+
// local-games/ folder holding one prod-pinned project would aim PROD at localhost — the pin wins
|
|
126
|
+
// the name, so it must win the address that goes with it.
|
|
127
|
+
const folderApiUrl = source === 'folder' ? options.folderApiUrl : undefined;
|
|
128
|
+
// BITMAGIC_API_URL last, so an override typed for this one command still outranks the file.
|
|
129
|
+
const apiUrlOverride = env.BITMAGIC_API_URL ?? folderApiUrl;
|
|
107
130
|
return {
|
|
108
131
|
environment: apiUrlOverride ? { ...resolved, apiUrl: apiUrlOverride } : resolved,
|
|
109
132
|
source,
|
|
@@ -121,23 +144,28 @@ export function describeEnvironmentSource(source) {
|
|
|
121
144
|
return 'from BITMAGIC_ENV';
|
|
122
145
|
case 'project':
|
|
123
146
|
return 'from bitmagic.json';
|
|
147
|
+
case 'folder':
|
|
148
|
+
return `from ${FOLDER_ENVIRONMENT_MARKER} in this folder or a parent`;
|
|
124
149
|
case 'stored':
|
|
125
150
|
return 'from your last login';
|
|
126
151
|
case 'default':
|
|
127
|
-
// Named
|
|
128
|
-
//
|
|
129
|
-
//
|
|
130
|
-
return 'the default
|
|
152
|
+
// Named so it reads as a rule rather than a decision the CLI made on its own — and so that
|
|
153
|
+
// someone seeing "prod" they did not expect knows nothing chose it, which points them at the
|
|
154
|
+
// fix: put a .bitmagic-env in the tree, or pin the project.
|
|
155
|
+
return 'the default when nothing else says';
|
|
131
156
|
}
|
|
132
157
|
}
|
|
133
158
|
export function selectEnvironmentForCommand(options = {}) {
|
|
159
|
+
// Read once: the marker carries three of the inputs below, and walking the tree twice would let
|
|
160
|
+
// them disagree if a file changed mid-command.
|
|
161
|
+
const folder = readFolderEnvironment(options.cwd);
|
|
134
162
|
return selectEnvironment({
|
|
135
163
|
explicit: options.explicit,
|
|
136
164
|
projectDefault: readProjectEnvironment(options.cwd),
|
|
165
|
+
folderDefault: folder?.environment,
|
|
166
|
+
folderMarkerPath: folder?.file,
|
|
167
|
+
folderApiUrl: folder?.apiUrl,
|
|
137
168
|
storedDefault: readDefaultEnvironment(options.baseDir),
|
|
138
|
-
// Read here rather than in selectEnvironment: this is the wiring half, and currentCliVersion
|
|
139
|
-
// touches the filesystem. `cliVersion` stays overridable so a test can pin a lane.
|
|
140
|
-
cliVersion: options.cliVersion ?? currentCliVersion(),
|
|
141
169
|
env: options.env,
|
|
142
170
|
});
|
|
143
171
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environments.js","sourceRoot":"","sources":["../../src/config/environments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"environments.js","sourceRoot":"","sources":["../../src/config/environments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export declare const FOLDER_ENVIRONMENT_MARKER = ".bitmagic-env";
|
|
2
|
+
export interface FolderEnvironment {
|
|
3
|
+
/** The raw `env` value. Checking it against the environment table happens in environments.ts. */
|
|
4
|
+
environment: string;
|
|
5
|
+
/** An optional api-server URL for that environment — see the note on `apiUrl` below. */
|
|
6
|
+
apiUrl?: string;
|
|
7
|
+
/** Absolute path of the marker, so an error and `whoami` can both name the file that decided. */
|
|
8
|
+
file: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Reads the nearest `.bitmagic-env`, walking up from `startDir`.
|
|
12
|
+
*
|
|
13
|
+
* Format is `key=value`, one per line, with `#` comments and blank lines skipped:
|
|
14
|
+
*
|
|
15
|
+
* # local-games/.bitmagic-env
|
|
16
|
+
* env=local
|
|
17
|
+
* apiUrl=http://localhost:3102
|
|
18
|
+
*
|
|
19
|
+
* `apiUrl` is here rather than left to BITMAGIC_API_URL for the same reason the whole file exists:
|
|
20
|
+
* an environment variable is invisible to an agent's shell. It matters most for `local`, whose
|
|
21
|
+
* built-in URL assumes the default ports and is therefore wrong for any shifted clone.
|
|
22
|
+
*
|
|
23
|
+
* Every malformed case throws instead of falling through to the next input in the chain. The line
|
|
24
|
+
* config/environments.ts draws is machine-written state versus a file a human typed: a bad STORED
|
|
25
|
+
* default is treated as absent because it would otherwise wedge every command everywhere including
|
|
26
|
+
* the recovery, but this file was typed deliberately, is visible, wedges only commands run beneath
|
|
27
|
+
* its own folder, and `cd ..` or `--env` recovers in place. Falling through silently is exactly the
|
|
28
|
+
* failure this feature was built to end — a folder that said `production` would quietly resolve to
|
|
29
|
+
* whatever the last login happened to be.
|
|
30
|
+
*/
|
|
31
|
+
export declare function readFolderEnvironment(startDir?: string): FolderEnvironment | undefined;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// The folder-level environment marker: one file at the root of a tree of projects, naming the
|
|
2
|
+
// environment everything beneath it belongs to.
|
|
3
|
+
//
|
|
4
|
+
// It exists because the alternative — a shell doing the job, via direnv exporting BITMAGIC_ENV —
|
|
5
|
+
// only works in an INTERACTIVE shell. A coding agent runs its commands through a non-interactive
|
|
6
|
+
// `zsh -c`, which sources neither ~/.zshrc nor any direnv hook, so a creator who sorted their
|
|
7
|
+
// projects into prod/ and dev/ folders got the right answer by hand and the wrong one from their
|
|
8
|
+
// agent. Resolving it here, from the filesystem, is the only way the answer is the same for both.
|
|
9
|
+
//
|
|
10
|
+
// This module reads a file and returns strings. Deciding whether those strings NAME anything is
|
|
11
|
+
// config/environments.ts's job — the same split project/context.ts documents for `environment` in
|
|
12
|
+
// bitmagic.json, and the reason neither module validates on the other's behalf.
|
|
13
|
+
import * as fs from 'fs';
|
|
14
|
+
import * as path from 'path';
|
|
15
|
+
import { CliError } from '../errors.js';
|
|
16
|
+
import { findDirWithFileUpwards } from '../project/context.js';
|
|
17
|
+
export const FOLDER_ENVIRONMENT_MARKER = '.bitmagic-env';
|
|
18
|
+
/** The keys the marker understands. Anything else is a typo, and typos are reported, not ignored. */
|
|
19
|
+
const KNOWN_KEYS = ['env', 'apiUrl'];
|
|
20
|
+
/**
|
|
21
|
+
* Reads the nearest `.bitmagic-env`, walking up from `startDir`.
|
|
22
|
+
*
|
|
23
|
+
* Format is `key=value`, one per line, with `#` comments and blank lines skipped:
|
|
24
|
+
*
|
|
25
|
+
* # local-games/.bitmagic-env
|
|
26
|
+
* env=local
|
|
27
|
+
* apiUrl=http://localhost:3102
|
|
28
|
+
*
|
|
29
|
+
* `apiUrl` is here rather than left to BITMAGIC_API_URL for the same reason the whole file exists:
|
|
30
|
+
* an environment variable is invisible to an agent's shell. It matters most for `local`, whose
|
|
31
|
+
* built-in URL assumes the default ports and is therefore wrong for any shifted clone.
|
|
32
|
+
*
|
|
33
|
+
* Every malformed case throws instead of falling through to the next input in the chain. The line
|
|
34
|
+
* config/environments.ts draws is machine-written state versus a file a human typed: a bad STORED
|
|
35
|
+
* default is treated as absent because it would otherwise wedge every command everywhere including
|
|
36
|
+
* the recovery, but this file was typed deliberately, is visible, wedges only commands run beneath
|
|
37
|
+
* its own folder, and `cd ..` or `--env` recovers in place. Falling through silently is exactly the
|
|
38
|
+
* failure this feature was built to end — a folder that said `production` would quietly resolve to
|
|
39
|
+
* whatever the last login happened to be.
|
|
40
|
+
*/
|
|
41
|
+
export function readFolderEnvironment(startDir) {
|
|
42
|
+
const dir = findDirWithFileUpwards(FOLDER_ENVIRONMENT_MARKER, startDir);
|
|
43
|
+
if (dir === null)
|
|
44
|
+
return undefined;
|
|
45
|
+
const file = path.join(dir, FOLDER_ENVIRONMENT_MARKER);
|
|
46
|
+
let text;
|
|
47
|
+
try {
|
|
48
|
+
text = fs.readFileSync(file, 'utf-8');
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
const code = err.code;
|
|
52
|
+
throw new CliError(`Cannot read ${file}: ${code ?? String(err)}`);
|
|
53
|
+
}
|
|
54
|
+
const values = new Map();
|
|
55
|
+
// A BOM would otherwise ride along on the first key and turn `env` into something unrecognised.
|
|
56
|
+
for (const raw of text.replace(/^\uFEFF/, '').split('\n')) {
|
|
57
|
+
const line = raw.trim();
|
|
58
|
+
if (line.length === 0 || line.startsWith('#'))
|
|
59
|
+
continue;
|
|
60
|
+
const eq = line.indexOf('=');
|
|
61
|
+
if (eq === -1) {
|
|
62
|
+
throw new CliError(`${file} has a line that is not key=value: "${line}". ` +
|
|
63
|
+
`Write ${KNOWN_KEYS.map((k) => `${k}=…`).join(' and ')}, one per line.`);
|
|
64
|
+
}
|
|
65
|
+
const key = line.slice(0, eq).trim();
|
|
66
|
+
const value = line.slice(eq + 1).trim();
|
|
67
|
+
if (!KNOWN_KEYS.includes(key)) {
|
|
68
|
+
throw new CliError(`${file} has an unknown key "${key}". Valid keys: ${KNOWN_KEYS.join(', ')}.`);
|
|
69
|
+
}
|
|
70
|
+
if (value.length === 0) {
|
|
71
|
+
throw new CliError(`${file} has an empty "${key}".`);
|
|
72
|
+
}
|
|
73
|
+
values.set(key, value);
|
|
74
|
+
}
|
|
75
|
+
const environment = values.get('env');
|
|
76
|
+
if (environment === undefined) {
|
|
77
|
+
throw new CliError(`${file} does not set "env". Write one of dev, prod or local as \`env=<name>\`, ` +
|
|
78
|
+
'or delete the file.');
|
|
79
|
+
}
|
|
80
|
+
const apiUrl = values.get('apiUrl');
|
|
81
|
+
return apiUrl === undefined ? { environment, file } : { environment, apiUrl, file };
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=folder-environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folder-environment.js","sourceRoot":"","sources":["../../src/config/folder-environment.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-viewer.js","sourceRoot":"","sources":["../../src/editor/asset-viewer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"asset-viewer.js","sourceRoot":"","sources":["../../src/editor/asset-viewer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1252,11 +1252,13 @@ ${ASSET_DETAIL_HTML}
|
|
|
1252
1252
|
* in, and a forged city has hundreds of assets: firing them all at once would stutter the game to
|
|
1253
1253
|
* decorate a side panel.
|
|
1254
1254
|
*
|
|
1255
|
-
* Two rather than one attempt, and the second is not defensive padding.
|
|
1256
|
-
*
|
|
1257
|
-
* game is loading is QUEUED
|
|
1258
|
-
*
|
|
1259
|
-
*
|
|
1255
|
+
* Two rather than one attempt, and the second is not defensive padding. On engines vendored before
|
|
1256
|
+
* the thumbnail renderer was taken out of the REQUIRES_GAME_LOADED set, GENERATE_VOXEL_PREVIEW
|
|
1257
|
+
* arriving while a game is loading is QUEUED past this 15 s wait and never seen as an answer;
|
|
1258
|
+
* current engines answer at once (and ACK receipt), but this page talks to whatever engine the
|
|
1259
|
+
* project has, so the retry stays. Marked attempted-once, that asset would keep its glyph for the
|
|
1260
|
+
* rest of the session; the retry costs one extra message and the cap keeps a genuinely broken
|
|
1261
|
+
* asset from asking forever.
|
|
1260
1262
|
*/
|
|
1261
1263
|
var MAX_PREVIEW_ATTEMPTS = 2;
|
|
1262
1264
|
var previewQueue = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-page.js","sourceRoot":"","sources":["../../src/editor/shell-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAEH,OAAO,EACL,qBAAqB,EAAE,kBAAkB,GAC1C,MAAM,qDAAqD,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE7F,oGAAoG;AACpG,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B;;;;;;GAMG;AACH,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B;;;;;;;;;;;;GAYG;AACH,SAAS,sBAAsB;IAC7B,OAAO;QACL,6BAA6B,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,GAAG;QACjE,iCAAiC,qBAAqB,CAAC,QAAQ,EAAE,GAAG;QACpE,8BAA8B,kBAAkB,CAAC,QAAQ,EAAE,GAAG;KAC/D,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAEnC,kGAAkG;AAClG,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3B,CAAC;AASD,MAAM,UAAU,iBAAiB,CAAC,OAA2B;IAC3D,MAAM,OAAO,GAAG,oBAAoB,OAAO,CAAC,QAAQ,2BAA2B,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;IACpH,OAAO;;;;wBAIe,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC;EAChD,kBAAkB;;EAElB,mBAAmB;EACnB,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsHrB,gBAAgB;EAChB,eAAe;;;;;;uBAMM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+B/C,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;EAyBhB,iBAAiB;;;;mBAIA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;kBACxB,gBAAgB;yBACT,qBAAqB;2BACnB,gBAAgB;;IAEvC,sBAAsB,EAAE
|
|
1
|
+
{"version":3,"file":"shell-page.js","sourceRoot":"","sources":["../../src/editor/shell-page.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0/C3B,CAAC;AACF,CAAC"}
|
|
@@ -25,13 +25,10 @@
|
|
|
25
25
|
* which both lanes run baseline-diffed so a legacy game's existing violations still accept
|
|
26
26
|
* unrelated writes.
|
|
27
27
|
*/
|
|
28
|
-
import * as fs from 'fs';
|
|
29
28
|
import * as path from 'path';
|
|
30
29
|
import { CliError } from '../errors.js';
|
|
31
30
|
import { validateWorldData } from '@bitmagic/world-forger/world-json-strict-validator.js';
|
|
32
|
-
|
|
33
|
-
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
34
|
-
}
|
|
31
|
+
import { isJsonObject, readWorldJson, writeWorldJsonAtomic } from '../project/world-json.js';
|
|
35
32
|
/** Walks `path`, creating intermediate objects, and returns the container of the final key. */
|
|
36
33
|
function getOrCreatePath(root, segments) {
|
|
37
34
|
let current = root;
|
|
@@ -154,23 +151,7 @@ function applyOne(world, modification) {
|
|
|
154
151
|
* expensive enough that "run it again" is not an acceptable recovery.
|
|
155
152
|
*/
|
|
156
153
|
export function applyModificationsToWorld(worldPath, modifications) {
|
|
157
|
-
|
|
158
|
-
try {
|
|
159
|
-
raw = fs.readFileSync(worldPath, 'utf-8');
|
|
160
|
-
}
|
|
161
|
-
catch {
|
|
162
|
-
throw new CliError(`Cannot read ${worldPath}. Is this a Bitmagic project?`);
|
|
163
|
-
}
|
|
164
|
-
let world;
|
|
165
|
-
try {
|
|
166
|
-
world = JSON.parse(raw);
|
|
167
|
-
}
|
|
168
|
-
catch {
|
|
169
|
-
throw new CliError(`${worldPath} is not valid JSON. Nothing has been changed.`);
|
|
170
|
-
}
|
|
171
|
-
if (!isJsonObject(world)) {
|
|
172
|
-
throw new CliError(`${worldPath} does not contain a world object. Nothing has been changed.`);
|
|
173
|
-
}
|
|
154
|
+
const world = readWorldJson(worldPath);
|
|
174
155
|
// Baseline BEFORE applying: a violation already present in a legacy or imported world must not
|
|
175
156
|
// block an unrelated write. Only violations this batch INTRODUCES are refused.
|
|
176
157
|
const preExisting = new Set(validateWorldData(world));
|
|
@@ -188,9 +169,7 @@ export function applyModificationsToWorld(worldPath, modifications) {
|
|
|
188
169
|
throw new CliError(`The forged level would make ${path.basename(worldPath)} invalid against the engine's GameData `
|
|
189
170
|
+ `schema, so nothing was written. Violations: ${introduced.join('; ')}`);
|
|
190
171
|
}
|
|
191
|
-
|
|
192
|
-
fs.writeFileSync(temp, `${JSON.stringify(world, null, 2)}\n`);
|
|
193
|
-
fs.renameSync(temp, worldPath);
|
|
172
|
+
writeWorldJsonAtomic(worldPath, world);
|
|
194
173
|
return { applied: modifications.length, summary };
|
|
195
174
|
}
|
|
196
175
|
//# sourceMappingURL=apply-modifications.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply-modifications.js","sourceRoot":"","sources":["../../src/forge/apply-modifications.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"apply-modifications.js","sourceRoot":"","sources":["../../src/forge/apply-modifications.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import * as fs from 'fs';
|
|
2
|
-
import * as path from 'path';
|
|
3
1
|
import { buildUpsertPredicate, isUpsertRootPatch, validateWorldPatch, } from '@bitmagic/asset-core';
|
|
4
2
|
import { CliError } from '../errors.js';
|
|
5
|
-
|
|
6
|
-
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
7
|
-
}
|
|
3
|
+
import { isJsonObject, readWorldJson, writeWorldJsonAtomic } from '../project/world-json.js';
|
|
8
4
|
/** Walks `path`, creating intermediate objects, and returns the container plus the final key. */
|
|
9
5
|
function resolveContainer(root, segments) {
|
|
10
6
|
let current = root;
|
|
@@ -69,29 +65,10 @@ export function applyPatchesToWorld(worldPath, patches) {
|
|
|
69
65
|
throw new CliError(`The server sent a patch this CLI cannot apply: ${problem}`);
|
|
70
66
|
}
|
|
71
67
|
}
|
|
72
|
-
|
|
73
|
-
try {
|
|
74
|
-
raw = fs.readFileSync(worldPath, 'utf-8');
|
|
75
|
-
}
|
|
76
|
-
catch {
|
|
77
|
-
throw new CliError(`Cannot read ${worldPath}. Is this a Bitmagic project?`);
|
|
78
|
-
}
|
|
79
|
-
let world;
|
|
80
|
-
try {
|
|
81
|
-
world = JSON.parse(raw);
|
|
82
|
-
}
|
|
83
|
-
catch {
|
|
84
|
-
throw new CliError(`${worldPath} is not valid JSON. Nothing has been changed.`);
|
|
85
|
-
}
|
|
86
|
-
if (!isJsonObject(world)) {
|
|
87
|
-
throw new CliError(`${worldPath} does not contain a world object. Nothing has been changed.`);
|
|
88
|
-
}
|
|
68
|
+
const world = readWorldJson(worldPath);
|
|
89
69
|
const summary = patches.map((patch) => applyOne(world, patch));
|
|
90
|
-
// Write once,
|
|
91
|
-
|
|
92
|
-
const temp = path.join(path.dirname(worldPath), `.world.json.${process.pid}.tmp`);
|
|
93
|
-
fs.writeFileSync(temp, `${JSON.stringify(world, null, 2)}\n`);
|
|
94
|
-
fs.renameSync(temp, worldPath);
|
|
70
|
+
// Write once, atomically — see project/world-json.ts for the temp-file contract.
|
|
71
|
+
writeWorldJsonAtomic(worldPath, world);
|
|
95
72
|
return { applied: patches.length, summary };
|
|
96
73
|
}
|
|
97
74
|
//# sourceMappingURL=apply-patches.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply-patches.js","sourceRoot":"","sources":["../../src/generate/apply-patches.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"apply-patches.js","sourceRoot":"","sources":["../../src/generate/apply-patches.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,18 @@ export interface ProjectContext {
|
|
|
21
21
|
root: string;
|
|
22
22
|
metadata: ProjectMetadata;
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* The nearest ancestor of `startDir` (itself included) holding `fileName`, or null at the root.
|
|
26
|
+
*
|
|
27
|
+
* `startDir` does NOT have to exist. `fs.existsSync` on a path under a missing directory is simply
|
|
28
|
+
* false, so the walk falls through to the nearest ancestor that does exist — which is what lets
|
|
29
|
+
* `bitmagic init <dir>` ask about a target directory it has not created yet.
|
|
30
|
+
*
|
|
31
|
+
* Shared rather than written twice: the loop is four lines and two of them are easy to get wrong
|
|
32
|
+
* (resolving `startDir` on the way in, and stopping when `path.dirname` stops moving), so a second
|
|
33
|
+
* copy would drift. Config markers live above this module — see config/folder-environment.ts.
|
|
34
|
+
*/
|
|
35
|
+
export declare function findDirWithFileUpwards(fileName: string, startDir?: string): string | null;
|
|
24
36
|
/**
|
|
25
37
|
* Like findProjectRoot, but answers "is there one?" instead of insisting there is.
|
|
26
38
|
*
|
package/dist/project/context.js
CHANGED
|
@@ -23,15 +23,20 @@ function findMissingField(value) {
|
|
|
23
23
|
return REQUIRED_STRING_FIELDS.find((field) => typeof value[field] !== 'string' || value[field].length === 0);
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
|
-
*
|
|
26
|
+
* The nearest ancestor of `startDir` (itself included) holding `fileName`, or null at the root.
|
|
27
27
|
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
28
|
+
* `startDir` does NOT have to exist. `fs.existsSync` on a path under a missing directory is simply
|
|
29
|
+
* false, so the walk falls through to the nearest ancestor that does exist — which is what lets
|
|
30
|
+
* `bitmagic init <dir>` ask about a target directory it has not created yet.
|
|
31
|
+
*
|
|
32
|
+
* Shared rather than written twice: the loop is four lines and two of them are easy to get wrong
|
|
33
|
+
* (resolving `startDir` on the way in, and stopping when `path.dirname` stops moving), so a second
|
|
34
|
+
* copy would drift. Config markers live above this module — see config/folder-environment.ts.
|
|
30
35
|
*/
|
|
31
|
-
export function
|
|
36
|
+
export function findDirWithFileUpwards(fileName, startDir = process.cwd()) {
|
|
32
37
|
let dir = path.resolve(startDir);
|
|
33
38
|
for (;;) {
|
|
34
|
-
if (fs.existsSync(path.join(dir,
|
|
39
|
+
if (fs.existsSync(path.join(dir, fileName)))
|
|
35
40
|
return dir;
|
|
36
41
|
const parent = path.dirname(dir);
|
|
37
42
|
if (parent === dir)
|
|
@@ -39,6 +44,15 @@ export function findProjectRootOrNull(startDir = process.cwd()) {
|
|
|
39
44
|
dir = parent;
|
|
40
45
|
}
|
|
41
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Like findProjectRoot, but answers "is there one?" instead of insisting there is.
|
|
49
|
+
*
|
|
50
|
+
* Environment resolution runs on EVERY command, including the ones that legitimately have no
|
|
51
|
+
* project — `login`, `logout`, `whoami`, `usage`, `subscribe`, and `init`, which creates one.
|
|
52
|
+
*/
|
|
53
|
+
export function findProjectRootOrNull(startDir = process.cwd()) {
|
|
54
|
+
return findDirWithFileUpwards(MARKER, startDir);
|
|
55
|
+
}
|
|
42
56
|
/** Walks up from `startDir` looking for bitmagic.json, so commands work from any subdirectory. */
|
|
43
57
|
export function findProjectRoot(startDir = process.cwd()) {
|
|
44
58
|
const root = findProjectRootOrNull(startDir);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/project/context.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,gGAAgG;AAChG,4CAA4C;AAC5C,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AA2B/E,MAAM,MAAM,GAAG,eAAe,CAAC;AAE/B,MAAM,sBAAsB,GAA8B;IACxD,QAAQ;IACR,eAAe;IACf,OAAO;IACP,UAAU;CACX,CAAC;AAEF;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,KAA8B;IACtD,OAAO,sBAAsB,CAAC,IAAI,CAChC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAK,KAAK,CAAC,KAAK,CAAY,CAAC,MAAM,KAAK,CAAC,CACrF,CAAC;AACJ,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/project/context.ts"],"names":[],"mappings":"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"}
|