xs-dev 1.3.0 → 1.4.0

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 CHANGED
@@ -6,7 +6,7 @@ The Moddable SDK and associated dev board tooling is incredibly empowering for e
6
6
 
7
7
  [Check out the documentation!](https://hipsterbrown.github.io/xs-dev/)
8
8
 
9
- **This project is a work in progress and currently pre-1.0, so there may be breaking changes.**
9
+ **This project is a continual work in progress and v1, so breaking changes will be semantically-released with major version bumps.**
10
10
 
11
11
  ## Requirements
12
12
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xs-dev",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "CLI for automating the setup and usage of Moddable XS tools",
5
5
  "type": "module",
6
6
  "types": "build/types/types.d.ts",
@@ -1,21 +1,14 @@
1
- import { readFile, writeFile } from 'node:fs/promises';
2
1
  import { existsSync, statSync, readdirSync } from 'node:fs';
3
2
  import { join } from 'node:path';
4
3
  import { buildCommand } from '@stricli/core';
5
4
  import { select } from '@inquirer/prompts';
6
5
  import { collectChoicesFromTree } from '../toolbox/prompt/choices.js';
6
+ import { buildTree } from '../toolbox/prompt/tree.js';
7
7
  import { sourceEnvironment } from '../toolbox/system/exec.js';
8
8
  import { DEVICE_ALIAS } from '../toolbox/prompt/devices.js';
9
9
  import * as output from '../lib/output.js';
10
+ import { readManifest, writeManifest, addInclude, } from '../toolbox/manifest/index.js';
10
11
  const deviceSet = new Set(Object.values(DEVICE_ALIAS));
11
- function buildTree(dirPath, name) {
12
- const stat = statSync(dirPath);
13
- if (stat.isDirectory()) {
14
- const children = readdirSync(dirPath).map((entry) => buildTree(join(dirPath, entry), entry));
15
- return { name, type: 'dir', children };
16
- }
17
- return { name, type: 'file', children: [] };
18
- }
19
12
  const command = buildCommand({
20
13
  docs: {
21
14
  brief: 'Name or select Moddable module to add to project manifest',
@@ -52,32 +45,9 @@ const command = buildCommand({
52
45
  }
53
46
  output.info(`Adding "${String(moduleName)}" to manifest includes`);
54
47
  const modulePath = `$(MODDABLE)/modules/${String(moduleName)}/manifest.json`;
55
- const raw = await readFile(manifestPath, 'utf8');
56
- const data = JSON.parse(raw);
57
- const fn = (manifestIn) => {
58
- let manifest = manifestIn;
59
- if (device !== '') {
60
- manifest.platforms ??= {};
61
- manifest.platforms[device] ??= {};
62
- manifest = manifest.platforms[device];
63
- }
64
- if (!('include' in manifest)) {
65
- manifest.include = [];
66
- }
67
- if (typeof manifest.include === 'string') {
68
- manifest.include = [manifest.include];
69
- }
70
- if (!manifest.include.includes(modulePath)) {
71
- ;
72
- manifest.include.push(modulePath);
73
- }
74
- if (manifest.include.length === 1) {
75
- manifest.include = manifest.include[0];
76
- }
77
- return manifestIn;
78
- };
79
- const result = fn(data);
80
- await writeFile(manifestPath, JSON.stringify(result ?? data, null, 2), 'utf8');
48
+ const manifest = await readManifest(manifestPath);
49
+ const updated = addInclude(manifest, modulePath, device);
50
+ await writeManifest(manifestPath, updated);
81
51
  output.success('Done!');
82
52
  },
83
53
  parameters: {
@@ -106,4 +76,4 @@ const command = buildCommand({
106
76
  },
107
77
  });
108
78
  export default command;
109
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9pbmNsdWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQzNELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDaEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFMUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFBO0FBRTNELE9BQU8sS0FBSyxNQUFNLE1BQU0sa0JBQWtCLENBQUE7QUFNMUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFBO0FBUXRELFNBQVMsU0FBUyxDQUFDLE9BQWUsRUFBRSxJQUFZO0lBQzlDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUM5QixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNsRCxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FDdkMsQ0FBQTtRQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUs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
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9pbmNsdWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUMzRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDNUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRTFDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDhCQUE4QixDQUFBO0FBQ3JFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFFM0QsT0FBTyxLQUFLLE1BQU0sTUFBTSxrQkFBa0IsQ0FBQTtBQUMxQyxPQUFPLEVBQ0wsWUFBWSxFQUNaLGFBQWEsRUFDYixVQUFVLEdBQ1gsTUFBTSw4QkFBOEIsQ0FBQTtBQU1yQyxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUE7QUFFdEQsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDO0lBQzNCLElBQUksRUFBRTtRQUNKLEtBQUssRUFBRSwyREFBMkQ7S0FDbkU7SUFDRCxLQUFLLENBQUMsSUFBSSxDQUFxQixLQUFxQixFQUFFLFVBQW1CO1FBQ3ZFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsZUFBZSxDQUFDLENBQUE7UUFDekQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzlCLE1B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
@@ -1,18 +1,11 @@
1
- import { existsSync, statSync, readdirSync, mkdirSync, cpSync } from 'node:fs';
1
+ import { existsSync, statSync, mkdirSync, cpSync, readdirSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
3
  import { buildCommand } from '@stricli/core';
4
4
  import { select } from '@inquirer/prompts';
5
5
  import { collectChoicesFromTree } from '../toolbox/prompt/choices.js';
6
+ import { buildTree } from '../toolbox/prompt/tree.js';
6
7
  import { sourceEnvironment } from '../toolbox/system/exec.js';
7
8
  import * as output from '../lib/output.js';
8
- function buildTree(dirPath, name) {
9
- const stat = statSync(dirPath);
10
- if (stat.isDirectory()) {
11
- const children = readdirSync(dirPath).map((entry) => buildTree(join(dirPath, entry), entry));
12
- return { name, type: 'dir', children };
13
- }
14
- return { name, type: 'file', children: [] };
15
- }
16
9
  const command = buildCommand({
17
10
  docs: {
18
11
  brief: 'Scaffold a new Moddable XS project',
@@ -169,4 +162,4 @@ const command = buildCommand({
169
162
  },
170
163
  });
171
164
  export default command;
172
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9pbml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQzlFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDaEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFMUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFDN0QsT0FBTyxLQUFLLE1BQU0sTUFBTSxrQkFBa0IsQ0FBQTtBQWtCMUMsU0FBUyxTQUFTLENBQUMsT0FBZSxFQUFFLElBQVk7SUFDOUMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzlCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7UUFDdkIsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ2xELFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUN2QyxDQUFBO1FBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFBO0lBQ3hDLENBQUM7SUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFBO0FBQzdDLENBQUM7QUFFRCxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUM7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
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9pbml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQzlFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDaEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFMUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFDckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ3JELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQzdELE9BQU8sS0FBSyxNQUFNLE1BQU0sa0JBQWtCLENBQUE7QUFZMUMsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDO0lBQzNCLElBQUksRUFBRTtRQUNKLEtBQUssRUFBRSxvQ0FBb0M7S0FDNUM7SUFDRCxLQUFLLENBQUMsSUFBSSxDQUFxQixLQUFrQixFQUFFLFdBQW1CO1FBQ3BFLE1BQU0sRUFDSixVQUFVLEdBQUcsS0FBSyxFQUNsQixFQUFFLEdBQUcsSUFBSSxFQUNULFFBQVEsR0FBRyxLQUFLLEVBQ2hCLE9BQU8sRUFDUCxlQUFlLEVBQUUsWUFBWSxHQUFHLEtBQUssRUFDckMsU0FBUyxHQUFHLEtBQUssRUFDakIsU0FBUyxHQUFHLEtBQUssR0FDbEIsR0FBRyxLQUFLLENBQUE7UUFFVCxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM5QixJQUNFLENBQUMsU0FBUztnQkFDVixVQUFVLENBQUMsV0FBVyxDQUFDO2dCQUN2QixRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsV0FB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
@@ -1,9 +1,9 @@
1
- import { readFile, writeFile } from 'node:fs/promises';
2
1
  import { existsSync } from 'node:fs';
3
2
  import { join } from 'node:path';
4
3
  import { buildCommand } from '@stricli/core';
5
4
  import { DEVICE_ALIAS } from '../toolbox/prompt/devices.js';
6
5
  import * as output from '../lib/output.js';
6
+ import { readManifest, writeManifest, removeInclude, } from '../toolbox/manifest/index.js';
7
7
  const deviceSet = new Set(Object.values(DEVICE_ALIAS));
8
8
  const command = buildCommand({
9
9
  docs: {
@@ -15,46 +15,22 @@ const command = buildCommand({
15
15
  output.error('Cannot find manifest.json. Must be in project directory to update manifest includes.');
16
16
  process.exit(1);
17
17
  }
18
- const { device = '' } = flags;
19
18
  if (moduleName === undefined) {
20
19
  output.error('Module name is required');
21
20
  return;
22
21
  }
23
22
  output.info(`Removing "${String(moduleName)}" from manifest includes`);
24
- const raw = await readFile(manifestPath, 'utf8');
25
- const data = JSON.parse(raw);
26
- const fn = (manifestIn) => {
27
- let manifest = manifestIn;
28
- if (device !== '') {
29
- manifest.platforms ??= {};
30
- manifest.platforms[device] ??= {};
31
- manifest = manifest.platforms[device];
32
- }
33
- if (!('include' in manifest)) {
34
- return;
35
- }
36
- if (typeof manifest.include === 'string') {
37
- manifest.include = [manifest.include];
38
- }
39
- const lengthBefore = manifest.include.length;
40
- const toRemove = manifest.include.filter((mod) => mod.includes(moduleName));
41
- toRemove.forEach((mod) => {
42
- output.info(` Removing: ${mod}`);
43
- });
44
- manifest.include = manifest.include.filter((mod) => !mod.includes(moduleName));
45
- if (manifest.include.length === lengthBefore) {
46
- output.error(`"${moduleName}" not found. No modules removed.`);
47
- }
48
- if (manifest.include.length === 1) {
49
- manifest.include = manifest.include[0];
50
- }
51
- else if (manifest.include.length === 0) {
52
- delete manifest.include;
53
- }
54
- return manifestIn;
55
- };
56
- const result = fn(data);
57
- await writeFile(manifestPath, JSON.stringify(result ?? data, null, 2), 'utf8');
23
+ const { device = '' } = flags;
24
+ const manifest = await readManifest(manifestPath);
25
+ const { manifest: updated, removed } = removeInclude(manifest, moduleName, device);
26
+ if (removed.length === 0) {
27
+ output.error(`"${moduleName}" not found. No modules removed.`);
28
+ return;
29
+ }
30
+ for (const mod of removed) {
31
+ output.info(` Removing: ${mod}`);
32
+ }
33
+ await writeManifest(manifestPath, updated);
58
34
  output.success('Done!');
59
35
  },
60
36
  parameters: {
@@ -82,4 +58,4 @@ const command = buildCommand({
82
58
  },
83
59
  });
84
60
  export default command;
85
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3ZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3JlbW92ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ3RELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDcEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRTVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUUzRCxPQUFPLEtBQUssTUFBTSxNQUFNLGtCQUFrQixDQUFBO0FBTTFDLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQTtBQUV0RCxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUM7SUFDM0IsSUFBSSxFQUFFO1FBQ0osS0FBSyxFQUFFLGdFQUFnRTtLQUN4RTtJQUNELEtBQUssQ0FBQyxJQUFJLENBQXFCLEtBQW9CLEVBQUUsVUFBa0I7UUFDckUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQTtRQUN6RCxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDOUIsTUFBTSxDQUFDLEtBQUssQ0FDVixzRkFBc0YsQ0FDdkYsQ0FBQTtZQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDakIsQ0FBQztRQUNELE1BQU0sRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFBO1FBRTdCLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxLQUFLLENBQUMseUJBQXlCLENB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
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3ZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3JlbW92ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDaEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUU1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFFM0QsT0FBTyxLQUFLLE1BQU0sTUFBTSxrQkFBa0IsQ0FBQTtBQUMxQyxPQUFPLEVBQ0wsWUFBWSxFQUNaLGFBQWEsRUFDYixhQUFhLEdBQ2QsTUFBTSw4QkFBOEIsQ0FBQTtBQU1yQyxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUE7QUFFdEQsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDO0lBQzNCLElBQUksRUFBRTtRQUNKLEtBQUssRUFBRSxnRUFBZ0U7S0FDeEU7SUFDRCxLQUFLLENBQUMsSUFBSSxDQUFxQixLQUFvQixFQUFFLFVBQWtCO1FBQ3JFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsZUFBZSxDQUFDLENBQUE7UUFDekQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxLQUFLLENBQ1Ysc0ZBQXNGLENBQ3ZGLENBQUE7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2pCLENBQUM7UUFFRCxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM3QixNQUFNLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUE7WUFDdkMsT0FBTTtRQUNSLENBQUM7UUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsTUFBTSxDQUFDLFVBQVUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO1FBRXRFLE1BQU0sRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFBO1FBQzdCLE1BQU0sUUFBUSxHQUFHLE1BQU0sWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQ2pELE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLGFBQWEsQ0FDbEQsUUFBUSxFQUNSLFVBQVUsRUFDVixNQUFNLENBQ1AsQ0FBQTtRQUVELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksVUFBVSxrQ0FBa0MsQ0FBQyxDQUFBO1lBQzlELE9BQU07UUFDUixDQUFDO1FBRUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUNsQyxDQUFDO1FBRUQsTUFBTSxhQUFhLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBRTFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDekIsQ0FBQztJQUNELFVBQVUsRUFBRTtRQUNWLFVBQVUsRUFBRTtZQUNWLElBQUksRUFBRSxPQUFPO1lBQ2IsVUFBVSxFQUFFO2dCQUNWO29CQUNFLFdBQVcsRUFBRSxZQUFZO29CQUN6QixLQUFLLEVBQ0gsbUVBQW1FO29CQUNyRSxLQUFLLEVBQUUsTUFBTTtpQkFDZDthQUNGO1NBQ0Y7UUFDRCxLQUFLLEVBQUU7WUFDTCxNQUFNLEVBQUU7Z0JBQ04sSUFBSSxFQUFFLE1BQU07Z0JBQ1osTUFBTSxFQUFFLENBQUMsR0FBRyxTQUFTLENBQTBCO2dCQUMvQyxLQUFLLEVBQUUsOENBQThDO2dCQUNyRCxRQUFRLEVBQUUsSUFBSTthQUNmO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUCxDQUFDLEVBQUUsUUFBUTtTQUNaO0tBQ0Y7Q0FDRixDQUFDLENBQUE7QUFFRixlQUFlLE9BQU8sQ0FBQSJ9
@@ -0,0 +1,68 @@
1
+ import { readFile, writeFile } from 'node:fs/promises';
2
+ export async function readManifest(path) {
3
+ const raw = await readFile(path, 'utf8');
4
+ return JSON.parse(raw);
5
+ }
6
+ export async function writeManifest(path, manifest) {
7
+ await writeFile(path, JSON.stringify(manifest, null, 2), 'utf8');
8
+ }
9
+ function getTarget(manifest, device) {
10
+ if (device === '')
11
+ return manifest;
12
+ manifest.platforms ??= {};
13
+ manifest.platforms[device] ??= {};
14
+ return manifest.platforms[device];
15
+ }
16
+ export function addInclude(manifest, modulePath, device = '') {
17
+ const clone = structuredClone(manifest);
18
+ const target = getTarget(clone, device);
19
+ if (!('include' in target)) {
20
+ target.include = [];
21
+ }
22
+ if (typeof target.include === 'string') {
23
+ target.include = [target.include];
24
+ }
25
+ const includes = target.include.filter((x) => typeof x === 'string');
26
+ if (!includes.includes(modulePath)) {
27
+ includes.push(modulePath);
28
+ }
29
+ // Moddable manifests use a bare string for a single include, array for multiple
30
+ if (includes.length === 1) {
31
+ target.include = includes[0];
32
+ }
33
+ else {
34
+ target.include = includes;
35
+ }
36
+ return clone;
37
+ }
38
+ export function removeInclude(manifest, moduleName, device = '') {
39
+ const clone = structuredClone(manifest);
40
+ // If device specified but platform doesn't exist in manifest, nothing to remove
41
+ if (device !== '' &&
42
+ clone.platforms?.[device] ===
43
+ undefined) {
44
+ return { manifest: clone, removed: [] };
45
+ }
46
+ const target = getTarget(clone, device);
47
+ if (!('include' in target)) {
48
+ return { manifest: clone, removed: [] };
49
+ }
50
+ if (typeof target.include === 'string') {
51
+ target.include = [target.include];
52
+ }
53
+ const includes = target.include.filter((x) => typeof x === 'string');
54
+ const toRemove = includes.filter((mod) => mod.includes(moduleName));
55
+ const remaining = includes.filter((mod) => !mod.includes(moduleName));
56
+ // Moddable manifests use a bare string for a single include, array for multiple
57
+ if (remaining.length === 1) {
58
+ target.include = remaining[0];
59
+ }
60
+ else if (remaining.length === 0) {
61
+ delete target.include;
62
+ }
63
+ else {
64
+ target.include = remaining;
65
+ }
66
+ return { manifest: clone, removed: toRemove };
67
+ }
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdG9vbGJveC9tYW5pZmVzdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBSXRELE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUFDLElBQVk7SUFDN0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0lBQ3hDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQWEsQ0FBQTtBQUNwQyxDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxhQUFhLENBQ2pDLElBQVksRUFDWixRQUFrQjtJQUVsQixNQUFNLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFBO0FBQ2xFLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxRQUFrQixFQUFFLE1BQWM7SUFDbkQsSUFBSSxNQUFNLEtBQUssRUFBRTtRQUFFLE9BQU8sUUFBUSxDQUFBO0lBQ2xDLFFBQVEsQ0FBQyxTQUFTLEtBQUssRUFBRSxDQUN4QjtJQUFDLFFBQVEsQ0FBQyxTQUFxQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUMvRCxPQUFRLFFBQVEsQ0FBQyxTQUFxQyxDQUFDLE1BQU0sQ0FBYSxDQUFBO0FBQzVFLENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUN4QixRQUFrQixFQUNsQixVQUFrQixFQUNsQixNQUFNLEdBQUcsRUFBRTtJQUVYLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUN2QyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO0lBQ3ZD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
@@ -0,0 +1,11 @@
1
+ import { statSync, readdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ export function buildTree(dirPath, name) {
4
+ const stat = statSync(dirPath);
5
+ if (stat.isDirectory()) {
6
+ const children = readdirSync(dirPath).map((entry) => buildTree(join(dirPath, entry), entry));
7
+ return { name, type: 'dir', children };
8
+ }
9
+ return { name, type: 'file', children: [] };
10
+ }
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90b29sYm94L3Byb21wdC90cmVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQy9DLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFRaEMsTUFBTSxVQUFVLFNBQVMsQ0FBQyxPQUFlLEVBQUUsSUFBWTtJQUNyRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDOUIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztRQUN2QixNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDbEQsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQ3ZDLENBQUE7UUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUE7SUFDeEMsQ0FBQztJQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUE7QUFDN0MsQ0FBQyJ9
@@ -0,0 +1,8 @@
1
+ export type Manifest = Record<string, unknown>;
2
+ export declare function readManifest(path: string): Promise<Manifest>;
3
+ export declare function writeManifest(path: string, manifest: Manifest): Promise<void>;
4
+ export declare function addInclude(manifest: Manifest, modulePath: string, device?: string): Manifest;
5
+ export declare function removeInclude(manifest: Manifest, moduleName: string, device?: string): {
6
+ manifest: Manifest;
7
+ removed: string[];
8
+ };
@@ -0,0 +1,6 @@
1
+ export interface TreeNode {
2
+ name: string;
3
+ type: 'dir' | 'file';
4
+ children: TreeNode[];
5
+ }
6
+ export declare function buildTree(dirPath: string, name: string): TreeNode;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xs-dev",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "CLI for automating the setup and usage of Moddable XS tools",
5
5
  "type": "module",
6
6
  "types": "build/types/types.d.ts",