@guanjinke/artifact-client 1.7.1 → 1.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +5 -0
  2. package/dist/cli/environment.d.ts +10 -1
  3. package/dist/cli/environment.d.ts.map +1 -1
  4. package/dist/cli/environment.js +24 -0
  5. package/dist/cli/environment.js.map +1 -1
  6. package/dist/cli/setup.js +9 -4
  7. package/dist/cli/setup.js.map +1 -1
  8. package/dist/environment/builder.d.ts.map +1 -1
  9. package/dist/environment/builder.js +15 -1
  10. package/dist/environment/builder.js.map +1 -1
  11. package/dist/environment/package-resource.d.ts +89 -0
  12. package/dist/environment/package-resource.d.ts.map +1 -0
  13. package/dist/environment/package-resource.js +317 -0
  14. package/dist/environment/package-resource.js.map +1 -0
  15. package/dist/environment/resource.d.ts +36 -0
  16. package/dist/environment/resource.d.ts.map +1 -0
  17. package/dist/environment/resource.js +101 -0
  18. package/dist/environment/resource.js.map +1 -0
  19. package/dist/environment/types.d.ts +7 -0
  20. package/dist/environment/types.d.ts.map +1 -1
  21. package/dist/environment/update.d.ts +25 -0
  22. package/dist/environment/update.d.ts.map +1 -1
  23. package/dist/environment/update.js +55 -8
  24. package/dist/environment/update.js.map +1 -1
  25. package/dist/index.d.ts +1 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/package.json +3 -2
  28. package/resources/3DScene/capeHill.hdr +0 -0
  29. package/resources/3DScene/defaultGround.jpg +0 -0
  30. package/resources/3DScene/environmentSpecular.env +0 -0
  31. package/resources/3DScene/flare.png +0 -0
  32. package/resources/3DScene/geometry1.png +0 -0
  33. package/resources/3DScene/geometry10.png +0 -0
  34. package/resources/3DScene/geometry11.png +0 -0
  35. package/resources/3DScene/geometry12.png +0 -0
  36. package/resources/3DScene/geometry13.png +0 -0
  37. package/resources/3DScene/geometry2.png +0 -0
  38. package/resources/3DScene/geometry3.png +0 -0
  39. package/resources/3DScene/geometry4.png +0 -0
  40. package/resources/3DScene/geometry5.png +0 -0
  41. package/resources/3DScene/geometry6.png +0 -0
  42. package/resources/3DScene/geometry7.png +0 -0
  43. package/resources/3DScene/geometry8.png +0 -0
  44. package/resources/3DScene/geometry9.png +0 -0
  45. package/resources/3DScene/lilienstein.hdr +0 -0
  46. package/resources/3DScene/sky.hdr +0 -0
  47. package/resources/3DScene/studio.env +0 -0
  48. package/resources/3DScene/wastelandCloudsPureSky.hdr +0 -0
@@ -0,0 +1,317 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.sceneResourceDestination = exports.sceneResourceName = void 0;
37
+ exports.bundledResourcesDirectory = bundledResourcesDirectory;
38
+ exports.bundledResourceDirectory = bundledResourceDirectory;
39
+ exports.copyBundledResource = copyBundledResource;
40
+ exports.planBundledResource = planBundledResource;
41
+ exports.applyBundledResource = applyBundledResource;
42
+ const fs = __importStar(require("fs/promises"));
43
+ const fsSync = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const crypto_1 = require("crypto");
46
+ const atomic_1 = require("../utils/atomic");
47
+ /**
48
+ * The 3D scene assets bundled with this package.
49
+ *
50
+ * Wyn's 3D scene document designer loads its scene assets (HDR environments,
51
+ * geometry thumbnails, ground and flare textures) from `/3DScene` at the
52
+ * Server's own web root, so a created environment needs exactly those files
53
+ * below `<root>/Server/wwwroot/3DScene`. They are part of this package
54
+ * (`resources/3DScene`) and are copied from the package's installation
55
+ * directory — the downloaded product artifacts do not ship them.
56
+ */
57
+ exports.sceneResourceName = '3DScene';
58
+ /** Environment-relative destination of the bundled 3D scene assets (POSIX separators). */
59
+ exports.sceneResourceDestination = 'Server/wwwroot/3DScene';
60
+ /**
61
+ * The `resources` directory of this package.
62
+ *
63
+ * Resolved from the compiled file location instead of the working directory:
64
+ * `__dirname` is `<package>/dist/environment` in an installed package and
65
+ * `<repository>/src/environment` under ts-jest, and the directory that holds
66
+ * `package.json` and `resources/` is two levels up in both layouts. `dist` is
67
+ * never named, so a differently compiled layout keeps working; the copy itself
68
+ * reports the resolved path when it is missing.
69
+ */
70
+ function bundledResourcesDirectory() {
71
+ return path.resolve(__dirname, '..', '..', 'resources');
72
+ }
73
+ /** One named resource tree inside a bundled resources directory. */
74
+ function bundledResourceDirectory(name, resources = bundledResourcesDirectory()) {
75
+ return path.join(resources, name);
76
+ }
77
+ /**
78
+ * Whether a bundling layout is usable at all: the resource tree must be a real
79
+ * directory, not a link or a file. A missing tree fails loudly with the path
80
+ * that was expected — the alternative (skipping the copy) would produce an
81
+ * environment whose 3D scene designer is silently broken.
82
+ */
83
+ async function resourceRoot(source, destination) {
84
+ let stat;
85
+ try {
86
+ stat = await fs.lstat(source);
87
+ }
88
+ catch (error) {
89
+ if (error.code !== 'ENOENT')
90
+ throw error;
91
+ throw new Error(`Bundled resource directory is missing: ${source}. This installation is incomplete and the environment would have no resources at ${destination}; reinstall the package, or create the environment with a complete installation.`);
92
+ }
93
+ if (!stat.isDirectory() || stat.isSymbolicLink())
94
+ throw new Error(`Bundled resource directory is not a regular directory: ${source}.`);
95
+ }
96
+ /**
97
+ * Copy every file of `source` into `destination` and return the relative POSIX
98
+ * paths that were written.
99
+ *
100
+ * Copies are exclusive, exactly like the rest of the builder: an existing file
101
+ * at a destination path fails the whole layout instead of being replaced, so a
102
+ * packed environment can never silently shadow the packaged assets (or the
103
+ * other way round). Directories are only merged when they are real directories.
104
+ */
105
+ async function copyBundledResource(source, destination) {
106
+ await resourceRoot(source, destination);
107
+ const written = [];
108
+ const visit = async (from, to, relative) => {
109
+ for (const entry of await fs.readdir(from, { withFileTypes: true })) {
110
+ const child = relative ? `${relative}/${entry.name}` : entry.name;
111
+ const target = path.join(to, entry.name);
112
+ if (entry.isDirectory()) {
113
+ try {
114
+ await fs.mkdir(target);
115
+ }
116
+ catch (error) {
117
+ if (error.code !== 'EEXIST')
118
+ throw error;
119
+ const stat = await fs.lstat(target);
120
+ if (!stat.isDirectory() || stat.isSymbolicLink())
121
+ throw new Error(`Bundled resource destination is not a directory: ${target}.`);
122
+ }
123
+ await visit(path.join(from, entry.name), target, child);
124
+ }
125
+ else if (entry.isFile()) {
126
+ try {
127
+ await fs.copyFile(path.join(from, entry.name), target, fsSync.constants.COPYFILE_EXCL);
128
+ }
129
+ catch (error) {
130
+ if (error.code === 'EEXIST')
131
+ throw new Error(`Bundled resource file already exists at ${target}. Bundled resources are copied exclusively and never overwrite an existing file.`);
132
+ throw error;
133
+ }
134
+ written.push(child);
135
+ }
136
+ else
137
+ throw new Error(`Unexpected link in bundled resource ${source}: ${child}.`);
138
+ }
139
+ };
140
+ await fs.mkdir(destination, { recursive: true });
141
+ await visit(source, destination, '');
142
+ return written.sort();
143
+ }
144
+ /** Whether two regular files hold exactly the same bytes. */
145
+ async function sameContent(left, right) {
146
+ const digest = async (file) => {
147
+ const hash = (0, crypto_1.createHash)('sha256');
148
+ for await (const chunk of fsSync.createReadStream(file))
149
+ hash.update(chunk);
150
+ return hash.digest('hex');
151
+ };
152
+ return await digest(left) === await digest(right);
153
+ }
154
+ /** Classify one packaged file against its destination; fail loudly on an unusable destination. */
155
+ async function fileStatus(from, to) {
156
+ let stat;
157
+ try {
158
+ stat = await fs.lstat(to);
159
+ }
160
+ catch (error) {
161
+ const code = error.code;
162
+ if (code === 'ENOENT')
163
+ return 'missing';
164
+ if (code === 'ENOTDIR')
165
+ throw new Error(`Bundled resource destination is not a directory: ${path.dirname(to)}.`);
166
+ throw error;
167
+ }
168
+ if (!stat.isFile() || stat.isSymbolicLink())
169
+ throw new Error(`Bundled resource destination is not a regular file: ${to}.`);
170
+ if ((await fs.lstat(from)).size !== stat.size)
171
+ return 'different';
172
+ return await sameContent(from, to) ? 'identical' : 'different';
173
+ }
174
+ /**
175
+ * A destination directory is usable only when it is a real directory, or when it
176
+ * does not exist yet and will be created by the apply. A file or a link where the
177
+ * packaged tree needs a directory fails the plan, on every platform, before
178
+ * anything is written.
179
+ */
180
+ async function checkDestinationDirectory(directory) {
181
+ const stat = await fs.lstat(directory).catch((error) => {
182
+ if (error.code === 'ENOENT' || error.code === 'ENOTDIR')
183
+ return undefined;
184
+ throw error;
185
+ });
186
+ if (stat && (!stat.isDirectory() || stat.isSymbolicLink()))
187
+ throw new Error(`Bundled resource destination is not a directory: ${directory}.`);
188
+ }
189
+ /**
190
+ * Plan one bundled resource tree against its destination without writing anything.
191
+ *
192
+ * Every packaged file is classified (missing, identical or different) and the
193
+ * result carries the sorted relative POSIX paths plus the `added`/`updated`
194
+ * totals the update reports. A missing or unusable bundled directory fails loudly
195
+ * with the expected path, before anything is written, exactly like
196
+ * `copyBundledResource` fails a create — an environment whose 3D scene designer
197
+ * cannot load its assets is broken rather than degraded.
198
+ */
199
+ async function planBundledResource(source, destination) {
200
+ await resourceRoot(source, destination);
201
+ await checkDestinationDirectory(destination);
202
+ const files = [];
203
+ const visit = async (from, to, relative) => {
204
+ for (const entry of await fs.readdir(from, { withFileTypes: true })) {
205
+ const child = relative ? `${relative}/${entry.name}` : entry.name;
206
+ if (entry.isDirectory()) {
207
+ const directory = path.join(to, entry.name);
208
+ await checkDestinationDirectory(directory);
209
+ await visit(path.join(from, entry.name), directory, child);
210
+ continue;
211
+ }
212
+ if (!entry.isFile())
213
+ throw new Error(`Unexpected link in bundled resource ${source}: ${child}.`);
214
+ files.push({ relative: child, status: await fileStatus(path.join(from, entry.name), path.join(to, entry.name)) });
215
+ }
216
+ };
217
+ await visit(source, destination, '');
218
+ files.sort((left, right) => left.relative < right.relative ? -1 : left.relative > right.relative ? 1 : 0);
219
+ return { files, added: files.filter(file => file.status === 'missing').length, updated: files.filter(file => file.status === 'different').length };
220
+ }
221
+ /**
222
+ * Create one destination directory and every missing parent of it, remembering
223
+ * what was created so a failed apply can remove exactly those directories again.
224
+ */
225
+ async function ensureDirectory(directory, created) {
226
+ const missing = [];
227
+ for (let current = directory;;) {
228
+ let stat;
229
+ try {
230
+ stat = await fs.lstat(current);
231
+ }
232
+ catch (error) {
233
+ if (error.code !== 'ENOENT')
234
+ throw error;
235
+ missing.unshift(current);
236
+ const parent = path.dirname(current);
237
+ if (parent === current)
238
+ break;
239
+ current = parent;
240
+ continue;
241
+ }
242
+ if (!stat.isDirectory() || stat.isSymbolicLink())
243
+ throw new Error(`Bundled resource destination is not a directory: ${current}.`);
244
+ break;
245
+ }
246
+ for (const item of missing) {
247
+ try {
248
+ await fs.mkdir(item);
249
+ created.push(item);
250
+ }
251
+ catch (error) {
252
+ if (error.code !== 'EEXIST')
253
+ throw error;
254
+ const stat = await fs.lstat(item);
255
+ if (!stat.isDirectory() || stat.isSymbolicLink())
256
+ throw new Error(`Bundled resource destination is not a directory: ${item}.`);
257
+ }
258
+ }
259
+ }
260
+ /**
261
+ * Reconcile one planned bundled tree into `destination`.
262
+ *
263
+ * A missing file is copied with the same exclusive discipline the builder uses,
264
+ * so a racing writer is never overwritten. A different file is first copied into
265
+ * `scratch` and then replaced through a temporary file and an atomic rename, so a
266
+ * reader never sees a partial file. Identical files are not touched at all. When
267
+ * any write fails, the files this call added are removed, the files it replaced
268
+ * are restored from `scratch` and the directories it created are removed again —
269
+ * a failed layout never leaves a half-applied resource tree behind.
270
+ *
271
+ * `scratch` must be on the same volume as `destination` (the update workspace
272
+ * beside the environment root is) and is only used for the replaced content.
273
+ */
274
+ async function applyBundledResource(source, destination, plan, scratch) {
275
+ const added = [];
276
+ const updated = [];
277
+ const temporary = [];
278
+ const replaced = [];
279
+ const directories = [];
280
+ const targetOf = (relative) => path.join(destination, ...relative.split('/'));
281
+ try {
282
+ for (const file of plan.files) {
283
+ if (file.status === 'identical')
284
+ continue;
285
+ const from = path.join(source, ...file.relative.split('/'));
286
+ const target = targetOf(file.relative);
287
+ await ensureDirectory(path.dirname(target), directories);
288
+ if (file.status === 'missing') {
289
+ await fs.copyFile(from, target, fsSync.constants.COPYFILE_EXCL);
290
+ added.push(file.relative);
291
+ continue;
292
+ }
293
+ const pending = `${target}.afm-tmp`;
294
+ await fs.copyFile(from, pending);
295
+ temporary.push(pending);
296
+ const backup = path.join(scratch, ...file.relative.split('/'));
297
+ await fs.mkdir(path.dirname(backup), { recursive: true });
298
+ await fs.copyFile(target, backup);
299
+ await (0, atomic_1.renameAtomic)(pending, target);
300
+ replaced.push({ target, backup });
301
+ updated.push(file.relative);
302
+ }
303
+ }
304
+ catch (error) {
305
+ for (const file of temporary)
306
+ await fs.rm(file, { force: true }).catch(() => { });
307
+ for (const relative of added)
308
+ await fs.rm(targetOf(relative), { force: true }).catch(() => { });
309
+ for (const item of replaced)
310
+ await (0, atomic_1.renameAtomic)(item.backup, item.target).catch(() => { });
311
+ for (const directory of directories.reverse())
312
+ await fs.rmdir(directory).catch(() => { });
313
+ throw error;
314
+ }
315
+ return { added, updated };
316
+ }
317
+ //# sourceMappingURL=package-resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-resource.js","sourceRoot":"","sources":["../../src/environment/package-resource.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { LayoutMapping } from './types';
2
+ /**
3
+ * Where the Server serves the 3D scene designer's static resources from.
4
+ *
5
+ * Wyn's 3D scene document designer requests its scene assets from `/3DScene` at
6
+ * the Server's own web root, so a package that ships them in a directory of its
7
+ * own (`resource/3DScene`) has to be laid out here — not at `Server/resource/3DScene`,
8
+ * which is where a whole-archive mapping into `Server` would put them.
9
+ */
10
+ export declare const resourceDestination = "Server/wwwroot/3DScene";
11
+ /**
12
+ * Whether a directory inside an artifact archive is a 3D scene resource tree.
13
+ *
14
+ * The last two path segments are compared, so `resource/3DScene` and
15
+ * `resources/3dscene` match at the archive root and when nested (for example
16
+ * inside a `Web Contents` folder). Both segments are case-insensitive and either
17
+ * singular or plural is accepted, because the packaging side chooses the
18
+ * spelling and this layout rule must not depend on a particular artifact.
19
+ */
20
+ export declare function isResourceDirectory(relative: string): boolean;
21
+ /** The layout mapping of one resource directory: static files, no assembly and no service entry. */
22
+ export declare function resourceMapping(source: string): LayoutMapping;
23
+ /**
24
+ * The resource mappings an extracted archive really contains.
25
+ *
26
+ * Resource trees are not named in the catalog: the same fixed destination
27
+ * applies whatever module ships the files, so the archive's own directory list
28
+ * decides. Reading the extracted tree keeps `environment.lock.json` truthful —
29
+ * an artifact that ships no resource directory gets no mapping, one that does
30
+ * gets the mapping that was actually laid out.
31
+ *
32
+ * The walk is iterative and ignores files, so a deep or wide archive neither
33
+ * recurses the stack nor reads anything but directories.
34
+ */
35
+ export declare function resourceMappings(extracted: string): Promise<LayoutMapping[]>;
36
+ //# sourceMappingURL=resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../../src/environment/resource.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAE5D;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAI7D;AAED,oGAAoG;AACpG,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAE7D;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAelF"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.resourceDestination = void 0;
37
+ exports.isResourceDirectory = isResourceDirectory;
38
+ exports.resourceMapping = resourceMapping;
39
+ exports.resourceMappings = resourceMappings;
40
+ const fs = __importStar(require("fs/promises"));
41
+ const path = __importStar(require("path"));
42
+ /**
43
+ * Where the Server serves the 3D scene designer's static resources from.
44
+ *
45
+ * Wyn's 3D scene document designer requests its scene assets from `/3DScene` at
46
+ * the Server's own web root, so a package that ships them in a directory of its
47
+ * own (`resource/3DScene`) has to be laid out here — not at `Server/resource/3DScene`,
48
+ * which is where a whole-archive mapping into `Server` would put them.
49
+ */
50
+ exports.resourceDestination = 'Server/wwwroot/3DScene';
51
+ /**
52
+ * Whether a directory inside an artifact archive is a 3D scene resource tree.
53
+ *
54
+ * The last two path segments are compared, so `resource/3DScene` and
55
+ * `resources/3dscene` match at the archive root and when nested (for example
56
+ * inside a `Web Contents` folder). Both segments are case-insensitive and either
57
+ * singular or plural is accepted, because the packaging side chooses the
58
+ * spelling and this layout rule must not depend on a particular artifact.
59
+ */
60
+ function isResourceDirectory(relative) {
61
+ const segments = relative.split('/');
62
+ if (segments.length < 2)
63
+ return false;
64
+ return /^resources?$/i.test(segments[segments.length - 2]) && /^3dscene$/i.test(segments[segments.length - 1]);
65
+ }
66
+ /** The layout mapping of one resource directory: static files, no assembly and no service entry. */
67
+ function resourceMapping(source) {
68
+ return { source, destination: exports.resourceDestination, assemblies: [], role: 'resource' };
69
+ }
70
+ /**
71
+ * The resource mappings an extracted archive really contains.
72
+ *
73
+ * Resource trees are not named in the catalog: the same fixed destination
74
+ * applies whatever module ships the files, so the archive's own directory list
75
+ * decides. Reading the extracted tree keeps `environment.lock.json` truthful —
76
+ * an artifact that ships no resource directory gets no mapping, one that does
77
+ * gets the mapping that was actually laid out.
78
+ *
79
+ * The walk is iterative and ignores files, so a deep or wide archive neither
80
+ * recurses the stack nor reads anything but directories.
81
+ */
82
+ async function resourceMappings(extracted) {
83
+ const found = [];
84
+ const pending = [''];
85
+ while (pending.length) {
86
+ const relative = pending.pop();
87
+ for (const entry of await fs.readdir(path.join(extracted, relative), { withFileTypes: true })) {
88
+ if (!entry.isDirectory())
89
+ continue;
90
+ const child = relative ? `${relative}/${entry.name}` : entry.name;
91
+ // The matched directory is a leaf for this walk: a nested resource tree of
92
+ // its own would be part of the same 3D scene assets.
93
+ if (isResourceDirectory(child))
94
+ found.push(child);
95
+ else
96
+ pending.push(child);
97
+ }
98
+ }
99
+ return found.sort().map(resourceMapping);
100
+ }
101
+ //# sourceMappingURL=resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.js","sourceRoot":"","sources":["../../src/environment/resource.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,kDAIC;AAGD,0CAEC;AAcD,4CAeC;AA7DD,gDAAkC;AAClC,2CAA6B;AAG7B;;;;;;;GAOG;AACU,QAAA,mBAAmB,GAAG,wBAAwB,CAAC;AAE5D;;;;;;;;GAQG;AACH,SAAgB,mBAAmB,CAAC,QAAgB;IAClD,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AACjH,CAAC;AAED,oGAAoG;AACpG,SAAgB,eAAe,CAAC,MAAc;IAC5C,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,2BAAmB,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AACxF,CAAC;AAED;;;;;;;;;;;GAWG;AACI,KAAK,UAAU,gBAAgB,CAAC,SAAiB;IACtD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAa,CAAC,EAAE,CAAC,CAAC;IAC/B,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAG,CAAC;QAChC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC9F,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBAAE,SAAS;YACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YAClE,2EAA2E;YAC3E,qDAAqD;YACrD,IAAI,mBAAmB,CAAC,KAAK,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;gBAC7C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAC3C,CAAC"}
@@ -67,5 +67,12 @@ export interface EnvironmentDependencies {
67
67
  id: string;
68
68
  name: string;
69
69
  };
70
+ /**
71
+ * Root directory of the resource trees bundled with this package, for
72
+ * `create-env`'s layout of `resources/<name>` into the environment. Injectable
73
+ * so a test can point at a fixture tree; the default is the `resources`
74
+ * directory beside the installed package.
75
+ */
76
+ bundledResourcesDirectory?: string;
70
77
  }
71
78
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/environment/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,eAAe,CAAC;AAClH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AACD,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,cAAc,EAAE,kBAAkB,GAAG,eAAe,GAAG,kBAAkB,CAAC,CAAC;AAChH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AACD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AACD,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,MAAM,CAAC;AAC/C,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACtC,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,UAAU,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,iBAAiB,EAAE,CAAC;IACrC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AACD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AACD,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAE5D,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,gEAAgE;IAChE,OAAO,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACxC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/environment/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,eAAe,CAAC;AAClH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AACD,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,cAAc,EAAE,kBAAkB,GAAG,eAAe,GAAG,kBAAkB,CAAC,CAAC;AAChH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AACD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AACD,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,MAAM,CAAC;AAC/C,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACtC,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,UAAU,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,iBAAiB,EAAE,CAAC;IACrC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AACD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AACD,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAE5D,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,gEAAgE;IAChE,OAAO,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC;;;;;OAKG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC"}
@@ -31,6 +31,21 @@ export interface ModuleChange {
31
31
  copiedDirectories: string[];
32
32
  removedDirectories: string[];
33
33
  }
34
+ /**
35
+ * What an update did (or, in a dry run, would do) to one bundled resource tree.
36
+ *
37
+ * `added` counts files the environment did not have yet and `updated` counts
38
+ * files whose destination content differed and was refreshed; `files` is the size
39
+ * of the packaged tree, exactly as the lock manifest records it.
40
+ */
41
+ export interface ResourceChange {
42
+ name: string;
43
+ source: string;
44
+ destination: string;
45
+ files: number;
46
+ added: number;
47
+ updated: number;
48
+ }
34
49
  export interface UpdateResult {
35
50
  name: string;
36
51
  root: string;
@@ -43,12 +58,21 @@ export interface UpdateResult {
43
58
  restartRequired: boolean;
44
59
  warnings: string[];
45
60
  localTargets: LocalTarget[];
61
+ resource: ResourceChange;
46
62
  }
47
63
  export interface UpdateDependencies {
48
64
  registry?: EnvironmentRegistry;
49
65
  processes?: ProcessBackend;
50
66
  platform?: NodeJS.Platform;
51
67
  onProgress?: EnvironmentProgress;
68
+ /**
69
+ * Root directory of the resource trees bundled with this package, for
70
+ * `update-env`'s layout of `resources/<name>` into an existing environment.
71
+ * Injectable so a test can point at a fixture tree; the default is the
72
+ * `resources` directory beside the installed package (the same seam
73
+ * `EnvironmentDependencies.bundledResourcesDirectory` gives `create-env`).
74
+ */
75
+ bundledResourcesDirectory?: string;
52
76
  }
53
77
  /**
54
78
  * One `<Server><Plugins>` or `<Server><PluginWorkers>` entry: where it is
@@ -98,6 +122,7 @@ export declare class EnvironmentUpdater {
98
122
  readonly registry: EnvironmentRegistry;
99
123
  private readonly processes;
100
124
  private readonly platform;
125
+ private readonly bundledResources;
101
126
  private readonly onProgress?;
102
127
  constructor(dependencies?: UpdateDependencies);
103
128
  update(name: string, specs: (ModuleUpdateSpec | string)[], clientFactory: () => EnvironmentClient, options?: {
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/environment/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/environment/update.ts"],"names":[],"mappings":"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"}