@metamask/snaps-cli 0.3.0 → 0.6.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.
Files changed (48) hide show
  1. package/CHANGELOG.md +28 -1
  2. package/README.md +65 -104
  3. package/dist/builders.d.ts +17 -2
  4. package/dist/builders.js +4 -6
  5. package/dist/builders.js.map +1 -1
  6. package/dist/cli.d.ts +0 -7
  7. package/dist/cli.js +3 -3
  8. package/dist/cli.js.map +1 -1
  9. package/dist/cmds/build/buildHandler.js +1 -1
  10. package/dist/cmds/build/buildHandler.js.map +1 -1
  11. package/dist/cmds/build/bundleUtils.d.ts +2 -2
  12. package/dist/cmds/build/bundleUtils.js.map +1 -1
  13. package/dist/cmds/build/index.js +2 -3
  14. package/dist/cmds/build/index.js.map +1 -1
  15. package/dist/cmds/eval/eval-worker.js +4 -1
  16. package/dist/cmds/eval/eval-worker.js.map +1 -1
  17. package/dist/cmds/init/index.js +3 -2
  18. package/dist/cmds/init/index.js.map +1 -1
  19. package/dist/cmds/init/init-template.json +2 -2
  20. package/dist/cmds/init/initHandler.d.ts +6 -1
  21. package/dist/cmds/init/initHandler.js +50 -33
  22. package/dist/cmds/init/initHandler.js.map +1 -1
  23. package/dist/cmds/init/initUtils.d.ts +28 -11
  24. package/dist/cmds/init/initUtils.js +158 -91
  25. package/dist/cmds/init/initUtils.js.map +1 -1
  26. package/dist/cmds/manifest/index.js +3 -6
  27. package/dist/cmds/manifest/index.js.map +1 -1
  28. package/dist/cmds/manifest/manifestHandler.d.ts +15 -3
  29. package/dist/cmds/manifest/manifestHandler.js +180 -147
  30. package/dist/cmds/manifest/manifestHandler.js.map +1 -1
  31. package/dist/cmds/watch/watchHandler.js +2 -0
  32. package/dist/cmds/watch/watchHandler.js.map +1 -1
  33. package/dist/main.js.map +1 -1
  34. package/dist/tsconfig.json +3 -0
  35. package/dist/utils/fs.d.ts +10 -2
  36. package/dist/utils/fs.js +16 -3
  37. package/dist/utils/fs.js.map +1 -1
  38. package/dist/utils/misc.d.ts +4 -3
  39. package/dist/utils/misc.js +24 -4
  40. package/dist/utils/misc.js.map +1 -1
  41. package/dist/utils/readline.d.ts +2 -2
  42. package/dist/utils/readline.js.map +1 -1
  43. package/dist/utils/snap-config.js +12 -17
  44. package/dist/utils/snap-config.js.map +1 -1
  45. package/dist/utils/validate-fs.d.ts +1 -1
  46. package/dist/utils/validate-fs.js +1 -1
  47. package/dist/utils/validate-fs.js.map +1 -1
  48. package/package.json +10 -2
@@ -3,62 +3,79 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.initHandler = void 0;
6
+ exports.updateManifestShasum = exports.initHandler = void 0;
7
7
  const fs_1 = require("fs");
8
+ const path_1 = __importDefault(require("path"));
9
+ const mkdirp_1 = __importDefault(require("mkdirp"));
10
+ const snap_controllers_1 = require("@metamask/snap-controllers");
8
11
  const utils_1 = require("../../utils");
12
+ const manifestHandler_1 = require("../manifest/manifestHandler");
9
13
  const init_template_json_1 = __importDefault(require("./init-template.json"));
10
14
  const initUtils_1 = require("./initUtils");
11
- const CONFIG_PATH = utils_1.CONFIG_PATHS[0];
12
15
  async function initHandler(argv) {
13
- console.log(`Init: Begin building 'package.json'\n`);
14
- const pkg = await initUtils_1.asyncPackageInit();
15
- await initUtils_1.validateEmptyDir();
16
- console.log(`\nInit: Set 'package.json' web3Wallet properties\n`);
17
- const [web3Wallet, _newArgs] = await initUtils_1.buildWeb3Wallet(argv);
18
- const newArgs = _newArgs;
19
- pkg.web3Wallet = web3Wallet;
16
+ console.log(`MetaMask Snaps: Initialize\n`);
17
+ const packageJson = await initUtils_1.asyncPackageInit();
18
+ await initUtils_1.prepareWorkingDirectory();
19
+ console.log(`\nInit: Building '${snap_controllers_1.NpmSnapFileNames.Manifest}'...\n`);
20
+ const [snapManifest, _newArgs] = await initUtils_1.buildSnapManifest(argv, packageJson);
21
+ const newArgs = Object.keys(_newArgs)
22
+ .sort()
23
+ .reduce((sorted, key) => {
24
+ sorted[key] = _newArgs[key];
25
+ return sorted;
26
+ }, {});
20
27
  try {
21
- await fs_1.promises.writeFile('package.json', `${JSON.stringify(pkg, null, 2)}\n`);
28
+ await fs_1.promises.writeFile(snap_controllers_1.NpmSnapFileNames.Manifest, `${JSON.stringify(snapManifest, null, 2)}\n`);
22
29
  }
23
30
  catch (err) {
24
- utils_1.logError(`Init Error: Fatal: Failed to write package.json`, err);
31
+ utils_1.logError(`Init Error: Failed to write '${snap_controllers_1.NpmSnapFileNames.Manifest}'.`, err);
25
32
  process.exit(1);
26
33
  }
27
- console.log(`\nInit: 'package.json' web3Wallet properties set successfully!`);
28
- // write main js entry file
29
- const { main } = pkg;
30
- if (main !== undefined) {
31
- newArgs.src = main;
32
- try {
33
- await fs_1.promises.writeFile(main, init_template_json_1.default.js);
34
- console.log(`Init: Wrote main entry file '${main}'`);
35
- }
36
- catch (err) {
37
- utils_1.logError(`Init Error: Fatal: Failed to write main .js file '${main}'`, err);
38
- process.exit(1);
34
+ console.log(`\nInit: Created '${snap_controllers_1.NpmSnapFileNames.Manifest}'.`);
35
+ // Write main .js entry file
36
+ const { src } = newArgs;
37
+ try {
38
+ if (path_1.default.basename(src) !== src) {
39
+ await mkdirp_1.default(path_1.default.dirname(src));
39
40
  }
41
+ await fs_1.promises.writeFile(src, init_template_json_1.default.source);
42
+ console.log(`Init: Created '${src}'.`);
40
43
  }
41
- // write index.html
44
+ catch (err) {
45
+ utils_1.logError(`Init Error: Failed to write '${src}'.`, err);
46
+ process.exit(1);
47
+ }
48
+ // Write index.html
42
49
  try {
43
- await fs_1.promises.writeFile('index.html', init_template_json_1.default.html
44
- .toString()
45
- .replace(/_PORT_/gu, newArgs.port.toString() || argv.port.toString()));
46
- console.log(`Init: Wrote 'index.html' file`);
50
+ await fs_1.promises.writeFile('index.html', init_template_json_1.default.html);
51
+ console.log(`Init: Created 'index.html'.`);
47
52
  }
48
53
  catch (err) {
49
- utils_1.logError(`Init Error: Fatal: Failed to write index.html file`, err);
54
+ utils_1.logError(`Init Error: Failed to write 'index.html'.`, err);
50
55
  process.exit(1);
51
56
  }
52
- // write config file
57
+ // Write config file
53
58
  try {
54
- await fs_1.promises.writeFile(CONFIG_PATH, JSON.stringify(newArgs, null, 2));
55
- console.log(`Init: Wrote '${CONFIG_PATH}' config file`);
59
+ await fs_1.promises.writeFile(utils_1.CONFIG_FILE, JSON.stringify(newArgs, null, 2));
60
+ console.log(`Init: Wrote '${utils_1.CONFIG_FILE}' config file`);
56
61
  }
57
62
  catch (err) {
58
- utils_1.logError(`Init Error: Failed to write '${CONFIG_PATH}' file`, err);
63
+ utils_1.logError(`Init Error: Failed to write '${utils_1.CONFIG_FILE}'.`, err);
64
+ process.exit(1);
59
65
  }
60
66
  utils_1.closePrompt();
61
67
  return Object.assign(Object.assign({}, argv), newArgs);
62
68
  }
63
69
  exports.initHandler = initHandler;
70
+ /**
71
+ * This updates the Snap shasum value of the manifest after building the Snap
72
+ * during the init command.
73
+ */
74
+ async function updateManifestShasum() {
75
+ const manifest = (await utils_1.readJsonFile(snap_controllers_1.NpmSnapFileNames.Manifest));
76
+ const bundleContents = await fs_1.promises.readFile(manifest.source.location.npm.filePath, 'utf8');
77
+ manifest.source.shasum = snap_controllers_1.getSnapSourceShasum(bundleContents);
78
+ await fs_1.promises.writeFile(snap_controllers_1.NpmSnapFileNames.Manifest, JSON.stringify(manifestHandler_1.getWritableManifest(manifest), null, 2));
79
+ }
80
+ exports.updateManifestShasum = updateManifestShasum;
64
81
  //# sourceMappingURL=initHandler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"initHandler.js","sourceRoot":"","sources":["../../../src/cmds/init/initHandler.ts"],"names":[],"mappings":";;;;;;AAAA,2BAAoC;AACpC,uCAAkE;AAElE,8EAA4C;AAC5C,2CAIqB;AAErB,MAAM,WAAW,GAAG,oBAAY,CAAC,CAAC,CAAC,CAAC;AAE7B,KAAK,UAAU,WAAW,CAAC,IAAe;IAC/C,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IAErD,MAAM,GAAG,GAAG,MAAM,4BAAgB,EAAE,CAAC;IAErC,MAAM,4BAAgB,EAAE,CAAC;IAEzB,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAElE,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,MAAM,2BAAe,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,QAAqB,CAAC;IACtC,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC;IAE5B,IAAI;QACF,MAAM,aAAE,CAAC,SAAS,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;KACzE;IAAC,OAAO,GAAG,EAAE;QACZ,gBAAQ,CAAC,iDAAiD,EAAE,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACjB;IAED,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAE9E,2BAA2B;IAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;IACrB,IAAI,IAAI,KAAK,SAAS,EAAE;QACtB,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;QACnB,IAAI;YACF,MAAM,aAAE,CAAC,SAAS,CAAC,IAAI,EAAE,4BAAQ,CAAC,EAAE,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,gCAAgC,IAAI,GAAG,CAAC,CAAC;SACtD;QAAC,OAAO,GAAG,EAAE;YACZ,gBAAQ,CACN,qDAAqD,IAAI,GAAG,EAC5D,GAAG,CACJ,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACjB;KACF;IAED,mBAAmB;IACnB,IAAI;QACF,MAAM,aAAE,CAAC,SAAS,CAChB,YAAY,EACZ,4BAAQ,CAAC,IAAI;aACV,QAAQ,EAAE;aACV,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CACxE,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;KAC9C;IAAC,OAAO,GAAG,EAAE;QACZ,gBAAQ,CAAC,oDAAoD,EAAE,GAAG,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACjB;IAED,oBAAoB;IACpB,IAAI;QACF,MAAM,aAAE,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,gBAAgB,WAAW,eAAe,CAAC,CAAC;KACzD;IAAC,OAAO,GAAG,EAAE;QACZ,gBAAQ,CAAC,gCAAgC,WAAW,QAAQ,EAAE,GAAG,CAAC,CAAC;KACpE;IAED,mBAAW,EAAE,CAAC;IACd,uCAAY,IAAI,GAAK,OAAO,EAAG;AACjC,CAAC;AA9DD,kCA8DC","sourcesContent":["import { promises as fs } from 'fs';\nimport { CONFIG_PATHS, logError, closePrompt } from '../../utils';\nimport { YargsArgs } from '../../types/yargs';\nimport template from './init-template.json';\nimport {\n asyncPackageInit,\n validateEmptyDir,\n buildWeb3Wallet,\n} from './initUtils';\n\nconst CONFIG_PATH = CONFIG_PATHS[0];\n\nexport async function initHandler(argv: YargsArgs) {\n console.log(`Init: Begin building 'package.json'\\n`);\n\n const pkg = await asyncPackageInit();\n\n await validateEmptyDir();\n\n console.log(`\\nInit: Set 'package.json' web3Wallet properties\\n`);\n\n const [web3Wallet, _newArgs] = await buildWeb3Wallet(argv);\n const newArgs = _newArgs as YargsArgs;\n pkg.web3Wallet = web3Wallet;\n\n try {\n await fs.writeFile('package.json', `${JSON.stringify(pkg, null, 2)}\\n`);\n } catch (err) {\n logError(`Init Error: Fatal: Failed to write package.json`, err);\n process.exit(1);\n }\n\n console.log(`\\nInit: 'package.json' web3Wallet properties set successfully!`);\n\n // write main js entry file\n const { main } = pkg;\n if (main !== undefined) {\n newArgs.src = main;\n try {\n await fs.writeFile(main, template.js);\n console.log(`Init: Wrote main entry file '${main}'`);\n } catch (err) {\n logError(\n `Init Error: Fatal: Failed to write main .js file '${main}'`,\n err,\n );\n process.exit(1);\n }\n }\n\n // write index.html\n try {\n await fs.writeFile(\n 'index.html',\n template.html\n .toString()\n .replace(/_PORT_/gu, newArgs.port.toString() || argv.port.toString()),\n );\n console.log(`Init: Wrote 'index.html' file`);\n } catch (err) {\n logError(`Init Error: Fatal: Failed to write index.html file`, err);\n process.exit(1);\n }\n\n // write config file\n try {\n await fs.writeFile(CONFIG_PATH, JSON.stringify(newArgs, null, 2));\n console.log(`Init: Wrote '${CONFIG_PATH}' config file`);\n } catch (err) {\n logError(`Init Error: Failed to write '${CONFIG_PATH}' file`, err);\n }\n\n closePrompt();\n return { ...argv, ...newArgs };\n}\n"]}
1
+ {"version":3,"file":"initHandler.js","sourceRoot":"","sources":["../../../src/cmds/init/initHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fs } from 'fs';\nimport pathUtils from 'path';\nimport mkdirp from 'mkdirp';\nimport {\n getSnapSourceShasum,\n NpmSnapFileNames,\n SnapManifest,\n} from '@metamask/snap-controllers';\nimport { CONFIG_FILE, logError, closePrompt, readJsonFile } from '../../utils';\nimport { YargsArgs } from '../../types/yargs';\nimport { getWritableManifest } from '../manifest/manifestHandler';\nimport template from './init-template.json';\nimport {\n asyncPackageInit,\n prepareWorkingDirectory,\n buildSnapManifest,\n} from './initUtils';\n\nexport async function initHandler(argv: YargsArgs) {\n console.log(`MetaMask Snaps: Initialize\\n`);\n\n const packageJson = await asyncPackageInit();\n\n await prepareWorkingDirectory();\n\n console.log(`\\nInit: Building '${NpmSnapFileNames.Manifest}'...\\n`);\n\n const [snapManifest, _newArgs] = await buildSnapManifest(argv, packageJson);\n\n const newArgs = Object.keys(_newArgs)\n .sort()\n .reduce((sorted, key) => {\n sorted[key] = _newArgs[key as keyof typeof _newArgs];\n return sorted;\n }, {} as YargsArgs);\n\n try {\n await fs.writeFile(\n NpmSnapFileNames.Manifest,\n `${JSON.stringify(snapManifest, null, 2)}\\n`,\n );\n } catch (err) {\n logError(\n `Init Error: Failed to write '${NpmSnapFileNames.Manifest}'.`,\n err,\n );\n process.exit(1);\n }\n\n console.log(`\\nInit: Created '${NpmSnapFileNames.Manifest}'.`);\n\n // Write main .js entry file\n const { src } = newArgs;\n try {\n if (pathUtils.basename(src) !== src) {\n await mkdirp(pathUtils.dirname(src));\n }\n\n await fs.writeFile(src, template.source);\n console.log(`Init: Created '${src}'.`);\n } catch (err) {\n logError(`Init Error: Failed to write '${src}'.`, err);\n process.exit(1);\n }\n\n // Write index.html\n try {\n await fs.writeFile('index.html', template.html);\n console.log(`Init: Created 'index.html'.`);\n } catch (err) {\n logError(`Init Error: Failed to write 'index.html'.`, err);\n process.exit(1);\n }\n\n // Write config file\n try {\n await fs.writeFile(CONFIG_FILE, JSON.stringify(newArgs, null, 2));\n console.log(`Init: Wrote '${CONFIG_FILE}' config file`);\n } catch (err) {\n logError(`Init Error: Failed to write '${CONFIG_FILE}'.`, err);\n process.exit(1);\n }\n\n closePrompt();\n return { ...argv, ...newArgs };\n}\n\n/**\n * This updates the Snap shasum value of the manifest after building the Snap\n * during the init command.\n */\nexport async function updateManifestShasum() {\n const manifest = (await readJsonFile(\n NpmSnapFileNames.Manifest,\n )) as SnapManifest;\n\n const bundleContents = await fs.readFile(\n manifest.source.location.npm.filePath,\n 'utf8',\n );\n\n manifest.source.shasum = getSnapSourceShasum(bundleContents);\n await fs.writeFile(\n NpmSnapFileNames.Manifest,\n JSON.stringify(getWritableManifest(manifest), null, 2),\n );\n}\n"]}
@@ -1,12 +1,29 @@
1
+ import { NpmSnapPackageJson, SnapManifest } from '@metamask/snap-controllers/dist/snaps';
1
2
  import { YargsArgs } from '../../types/yargs';
2
- import { ManifestWalletProperty, NodePackageManifest } from '../../types/package';
3
- export declare function asyncPackageInit(): Promise<NodePackageManifest>;
4
- export declare function buildWeb3Wallet(argv: YargsArgs): Promise<[
5
- ManifestWalletProperty,
6
- {
7
- port: number;
8
- dist: string;
9
- outfileName: string;
10
- }
11
- ]>;
12
- export declare function validateEmptyDir(): Promise<void>;
3
+ /**
4
+ * Initializes a `package.json` file for a Snap project. Will attempt to read
5
+ * and parse the existing file if it already exists, otherwise will intialize
6
+ * a brand new one.
7
+ *
8
+ * @returns The contents of the `package.json` file.
9
+ */
10
+ export declare function asyncPackageInit(): Promise<Readonly<NpmSnapPackageJson>>;
11
+ /**
12
+ * Interactively constructs a Snap manifest file by prompting the user.
13
+ *
14
+ * @param argv - The `yargs` `argv` object.
15
+ * @param packageJson - The `package.json` object.
16
+ * @param shasum - The shasum of the Snap source file.
17
+ * @returns A tuple of the resulting Snap manifest object and a new `argv` object
18
+ * with properties to match the manifest.
19
+ */
20
+ export declare function buildSnapManifest(argv: YargsArgs, packageJson: NpmSnapPackageJson): Promise<[SnapManifest, {
21
+ dist: string;
22
+ outfileName: string;
23
+ src: string;
24
+ }]>;
25
+ /**
26
+ * Checks whether any files in the current working directory will be overwritten
27
+ * by the initialization process, and asks the user whether to continue if so.
28
+ */
29
+ export declare function prepareWorkingDirectory(): Promise<void>;
@@ -3,37 +3,46 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.validateEmptyDir = exports.buildWeb3Wallet = exports.asyncPackageInit = void 0;
6
+ exports.prepareWorkingDirectory = exports.buildSnapManifest = exports.asyncPackageInit = void 0;
7
7
  const fs_1 = require("fs");
8
- // TypeScript won't accept the global unless we bring in the entire DOM
9
- // eslint-disable-next-line @typescript-eslint/no-shadow, node/prefer-global/url
10
- const url_1 = require("url");
11
8
  const path_1 = __importDefault(require("path"));
9
+ const snaps_1 = require("@metamask/snap-controllers/dist/snaps");
12
10
  const init_package_json_1 = __importDefault(require("init-package-json"));
11
+ const mkdirp_1 = __importDefault(require("mkdirp"));
12
+ const slash_1 = __importDefault(require("slash"));
13
13
  const utils_1 = require("../../utils");
14
- const CONFIG_PATH = utils_1.CONFIG_PATHS[0];
14
+ /**
15
+ * This is a placeholder shasum that will be replaced at the end of the init command.
16
+ */
17
+ const PLACEHOLDER_SHASUM = '2QqUxo5joo4kKKr7yiCjdYsZOZcIFBnIBEdwU9Yx7+M=';
18
+ const NPM_PUBLIC_REGISTRY_URL = 'https://registry.npmjs.org';
19
+ /**
20
+ * Initializes a `package.json` file for a Snap project. Will attempt to read
21
+ * and parse the existing file if it already exists, otherwise will intialize
22
+ * a brand new one.
23
+ *
24
+ * @returns The contents of the `package.json` file.
25
+ */
15
26
  async function asyncPackageInit() {
16
- // use existing package.json if found
17
- const hasPackage = fs_1.existsSync('package.json');
18
- if (hasPackage) {
19
- console.log(`Init: Attempting to use existing 'package.json'...`);
27
+ if (fs_1.existsSync(snaps_1.NpmSnapFileNames.PackageJson)) {
28
+ console.log(`Init: Attempting to use existing '${snaps_1.NpmSnapFileNames.PackageJson}'...`);
20
29
  try {
21
- const pkg = JSON.parse(await fs_1.promises.readFile('package.json', 'utf8'));
22
- console.log(`Init: Successfully parsed 'package.json'!`);
23
- return pkg;
30
+ const packageJson = await utils_1.readJsonFile(snaps_1.NpmSnapFileNames.PackageJson);
31
+ snaps_1.validateSnapJsonFile(snaps_1.NpmSnapFileNames.PackageJson, packageJson);
32
+ console.log(`Init: Successfully parsed '${snaps_1.NpmSnapFileNames.PackageJson}'!`);
33
+ return packageJson;
24
34
  }
25
35
  catch (error) {
26
- utils_1.logError(`Init Error: Could not parse 'package.json'. Please verify that the file is correctly formatted and try again.`, error);
36
+ utils_1.logError(`Init Error: Could not parse '${snaps_1.NpmSnapFileNames.PackageJson}'. Please verify that the file is correctly formatted and try again.`, error);
27
37
  process.exit(1);
28
38
  }
29
39
  }
30
- // exit if yarn.lock is found, or we'll be in trouble
31
- const usesYarn = fs_1.existsSync('yarn.lock');
32
- if (usesYarn) {
33
- utils_1.logError(`Init Error: Found a 'yarn.lock' file but no 'package.json'. Please run 'yarn init' and try again.`);
40
+ // Exit if yarn.lock is found, or we'll be in trouble
41
+ if (fs_1.existsSync('yarn.lock')) {
42
+ utils_1.logError(`Init Error: Found a 'yarn.lock' file but no '${snaps_1.NpmSnapFileNames.PackageJson}'. Please run 'yarn init' and try again.`);
34
43
  process.exit(1);
35
44
  }
36
- // run 'npm init'
45
+ // Run 'npm init'
37
46
  return new Promise((resolve, reject) => {
38
47
  init_package_json_1.default(process.cwd(), '', {}, (err, data) => {
39
48
  if (err) {
@@ -46,131 +55,189 @@ async function asyncPackageInit() {
46
55
  });
47
56
  }
48
57
  exports.asyncPackageInit = asyncPackageInit;
49
- async function buildWeb3Wallet(argv) {
50
- const outfileName = argv.outfileName;
51
- let { port, dist } = argv;
52
- const defaultPerms = { alert: {} };
53
- let initialPermissions = defaultPerms;
58
+ const YES = 'yes';
59
+ const YES_VALUES = new Set([YES, 'y']);
60
+ function isYes(userInput) {
61
+ return userInput && YES_VALUES.has(userInput.toLowerCase());
62
+ }
63
+ const DEFAULT_PERMISSION_KEY = 'snap_confirm';
64
+ const getDefaultPermissions = () => {
65
+ return { [DEFAULT_PERMISSION_KEY]: {} };
66
+ };
67
+ /**
68
+ * Interactively constructs a Snap manifest file by prompting the user.
69
+ *
70
+ * @param argv - The `yargs` `argv` object.
71
+ * @param packageJson - The `package.json` object.
72
+ * @param shasum - The shasum of the Snap source file.
73
+ * @returns A tuple of the resulting Snap manifest object and a new `argv` object
74
+ * with properties to match the manifest.
75
+ */
76
+ async function buildSnapManifest(argv, packageJson) {
77
+ const { outfileName } = argv;
78
+ let { dist } = argv;
79
+ let initialPermissions = getDefaultPermissions();
80
+ let { description, name: proposedName } = packageJson;
81
+ if (!description) {
82
+ description = `The ${proposedName} Snap.`;
83
+ }
54
84
  try {
55
85
  const userInput = await utils_1.prompt({
56
- question: `Use all default Snap manifest values?`,
57
- defaultValue: 'yes',
86
+ question: `Use default Snap manifest values?`,
87
+ defaultValue: YES,
58
88
  shouldClose: false,
59
89
  });
60
- if (userInput && ['y', 'yes'].includes(userInput.toLowerCase())) {
90
+ if (isYes(userInput)) {
61
91
  console.log('Using default values...');
62
92
  try {
63
- await fs_1.promises.mkdir(dist);
93
+ await mkdirp_1.default(dist);
64
94
  }
65
95
  catch (err) {
66
- if (err.code !== 'EEXIST') {
67
- utils_1.logError(`Init Error: Could not write default 'dist' '${dist}'. Maybe check your local ${CONFIG_PATH} file?`);
68
- throw err;
69
- }
96
+ utils_1.logError(`Init Error: Could not write default 'dist' '${dist}'. Maybe check your local ${utils_1.CONFIG_FILE} file?`);
97
+ throw err;
70
98
  }
71
- return endWeb3Wallet();
99
+ return endSnapManifest();
72
100
  }
73
101
  }
74
102
  catch (err) {
75
103
  utils_1.logError(`Init Error: ${err.message}`, err);
76
104
  process.exit(1);
77
105
  }
78
- // at this point, prompt the user for all values
79
- let noValidPort = true;
80
- while (noValidPort) {
81
- const inputPort = await utils_1.prompt({
82
- question: `local server port:`,
83
- defaultValue: port.toString(10),
106
+ let invalidProposedName = true;
107
+ while (invalidProposedName) {
108
+ // eslint-disable-next-line require-atomic-updates
109
+ proposedName = await utils_1.prompt({
110
+ question: `Proposed Snap name:`,
111
+ defaultValue: proposedName,
84
112
  });
85
- const parsedPort = Number.parseInt(inputPort, 10);
86
- if (parsedPort && parsedPort > 0) {
87
- // eslint-disable-next-line require-atomic-updates
88
- port = parsedPort;
89
- noValidPort = false;
113
+ if (proposedName.length > 0 &&
114
+ proposedName.length <= 214 &&
115
+ snaps_1.PROPOSED_NAME_REGEX.test(proposedName)) {
116
+ invalidProposedName = false;
90
117
  }
91
118
  else {
92
- utils_1.logError(`Invalid port '${parsedPort}', please retry.`);
119
+ utils_1.logError(`The proposed name must adhere to npm package naming conventions, except that capital letters are allowed. For details, see: https://docs.npmjs.com/cli/v6/configuring-npm/package-json#name`);
120
+ }
121
+ }
122
+ let invalidDescription = true;
123
+ while (invalidDescription) {
124
+ // eslint-disable-next-line require-atomic-updates
125
+ description = await utils_1.prompt({
126
+ question: `Description:`,
127
+ defaultValue: description,
128
+ });
129
+ if (description.length === 0 || description.length <= 280) {
130
+ invalidDescription = false;
131
+ }
132
+ else {
133
+ utils_1.logError(`The description must be a non-empty string less than or equal to 280 characters.`);
93
134
  }
94
135
  }
95
136
  let invalidDist = true;
96
137
  while (invalidDist) {
97
138
  // eslint-disable-next-line require-atomic-updates
98
- dist = await utils_1.prompt({ question: `output directory:`, defaultValue: dist });
139
+ dist = await utils_1.prompt({ question: `Output directory:`, defaultValue: dist });
99
140
  try {
100
141
  dist = utils_1.trimPathString(dist);
101
- await fs_1.promises.mkdir(dist);
142
+ await mkdirp_1.default(dist);
102
143
  invalidDist = false;
103
144
  }
104
145
  catch (distError) {
105
- if (distError.code === 'EEXIST') {
106
- invalidDist = false;
107
- }
108
- else {
109
- utils_1.logError(`Could not make directory '${dist}', please retry.`, distError);
110
- }
146
+ utils_1.logError(`Unable to create directory '${dist}'. Ensure that the path is valid and try again.`, distError);
111
147
  }
112
148
  }
113
149
  let invalidPermissions = true;
114
150
  while (invalidPermissions) {
115
151
  const inputPermissions = await utils_1.prompt({
116
- question: `initialPermissions: [perm1 perm2 ...] ([alert])`,
152
+ // We add the parenthetical default value ourselves
153
+ question: `Initial permissions: [perm1 perm2 ...] ([snap_confirm])`,
117
154
  });
155
+ if (!inputPermissions ||
156
+ inputPermissions.trim() === DEFAULT_PERMISSION_KEY) {
157
+ break;
158
+ }
118
159
  try {
119
- if (inputPermissions) {
120
- initialPermissions = inputPermissions
121
- .split(' ')
122
- .reduce((allPermissions, permission) => {
123
- if (typeof permission === 'string' &&
124
- permission.match(/^[\w\d_]+$/u)) {
125
- allPermissions[permission] = {};
126
- }
127
- else {
128
- throw new Error(`Invalid permission: ${permission}`);
129
- }
130
- return allPermissions;
131
- }, {});
132
- invalidPermissions = false;
133
- }
134
- else {
135
- initialPermissions = defaultPerms;
136
- invalidPermissions = false;
137
- }
160
+ initialPermissions = inputPermissions
161
+ .split(' ')
162
+ .reduce((allPermissions, permission) => {
163
+ if (typeof permission === 'string' &&
164
+ permission.match(/^[\w\d_:]+$/iu)) {
165
+ allPermissions[permission] = {};
166
+ }
167
+ else {
168
+ throw new Error(`Invalid permission: ${permission}`);
169
+ }
170
+ return allPermissions;
171
+ }, {});
172
+ invalidPermissions = false;
138
173
  }
139
174
  catch (err) {
140
- utils_1.logError(`Invalid permissions '${inputPermissions}', please retry.`, err);
175
+ utils_1.logError(`Invalid permissions '${inputPermissions}'.\nThe permissions must be specified as a space-separated list of strings with only characters, digits, underscores ('_'), and colons (':').`, err);
141
176
  }
142
177
  }
143
- return endWeb3Wallet();
144
- function endWeb3Wallet() {
145
- return [
146
- {
147
- bundle: {
148
- local: path_1.default.join(dist, outfileName),
149
- url: new url_1.URL(`/${dist}/${outfileName}`, `http://localhost:${port}`).toString(),
178
+ return endSnapManifest();
179
+ function endSnapManifest() {
180
+ const manifest = {
181
+ version: packageJson.version,
182
+ description,
183
+ proposedName,
184
+ repository: packageJson.repository
185
+ ? utils_1.deepClone(packageJson.repository)
186
+ : null,
187
+ source: {
188
+ shasum: PLACEHOLDER_SHASUM,
189
+ location: {
190
+ npm: {
191
+ filePath: slash_1.default(path_1.default.join(dist, outfileName)),
192
+ packageName: packageJson.name,
193
+ registry: NPM_PUBLIC_REGISTRY_URL,
194
+ },
150
195
  },
151
- initialPermissions,
152
196
  },
153
- { dist, outfileName, port },
197
+ initialPermissions,
198
+ manifestVersion: '0.1',
199
+ };
200
+ try {
201
+ snaps_1.validateSnapJsonFile(snaps_1.NpmSnapFileNames.Manifest, manifest);
202
+ }
203
+ catch (error) {
204
+ /* istanbul ignore next */
205
+ throw new Error(`Internal Error: Validation of constructed manifest failed. This is a bug, please report it. Reason:\n${error.message}`);
206
+ }
207
+ return [
208
+ manifest,
209
+ { dist, outfileName, src: packageJson.main || 'src/index.js' },
154
210
  ];
155
211
  }
156
212
  }
157
- exports.buildWeb3Wallet = buildWeb3Wallet;
158
- async function validateEmptyDir() {
159
- const existing = (await fs_1.promises.readdir(process.cwd())).filter((item) => ['index.js', 'index.html', CONFIG_PATH, 'dist'].includes(item.toString()));
160
- if (existing.length > 0) {
161
- utils_1.logWarning(`\nInit Warning: Existing files/directories may be overwritten:\n${existing.reduce((acc, curr) => {
162
- return `${acc}\t${curr}\n`;
213
+ exports.buildSnapManifest = buildSnapManifest;
214
+ const INIT_FILE_NAMES = new Set([
215
+ 'src',
216
+ 'index.html',
217
+ utils_1.CONFIG_FILE,
218
+ 'dist',
219
+ snaps_1.NpmSnapFileNames.Manifest,
220
+ ]);
221
+ /**
222
+ * Checks whether any files in the current working directory will be overwritten
223
+ * by the initialization process, and asks the user whether to continue if so.
224
+ */
225
+ async function prepareWorkingDirectory() {
226
+ const existingFiles = (await fs_1.promises.readdir(process.cwd())).filter((item) => INIT_FILE_NAMES.has(item.toString()));
227
+ if (existingFiles.length > 0) {
228
+ utils_1.logWarning(`\nInit Warning: Existing files and/or directories may be overwritten:\n${existingFiles.reduce((message, currentFile) => {
229
+ return `${message}\t${currentFile}\n`;
163
230
  }, '')}`);
164
231
  const continueInput = await utils_1.prompt({
165
232
  question: `Continue?`,
166
- defaultValue: 'yes',
233
+ defaultValue: YES,
167
234
  });
168
- const shouldContinue = continueInput && ['y', 'yes'].includes(continueInput.toLowerCase());
235
+ const shouldContinue = continueInput && isYes(continueInput);
169
236
  if (!shouldContinue) {
170
237
  console.log(`Init: Exiting...`);
171
238
  process.exit(1);
172
239
  }
173
240
  }
174
241
  }
175
- exports.validateEmptyDir = validateEmptyDir;
242
+ exports.prepareWorkingDirectory = prepareWorkingDirectory;
176
243
  //# sourceMappingURL=initUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"initUtils.js","sourceRoot":"","sources":["../../../src/cmds/init/initUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fs, existsSync } from 'fs';\n// TypeScript won't accept the global unless we bring in the entire DOM\n// eslint-disable-next-line @typescript-eslint/no-shadow, node/prefer-global/url\nimport { URL } from 'url';\nimport pathUtils from 'path';\nimport initPackageJson from 'init-package-json';\nimport {\n CONFIG_PATHS,\n logError,\n logWarning,\n prompt,\n trimPathString,\n} from '../../utils';\nimport { YargsArgs } from '../../types/yargs';\nimport {\n ManifestWalletProperty,\n NodePackageManifest,\n} from '../../types/package';\n\nconst CONFIG_PATH = CONFIG_PATHS[0];\n\nexport async function asyncPackageInit(): Promise<NodePackageManifest> {\n // use existing package.json if found\n const hasPackage = existsSync('package.json');\n\n if (hasPackage) {\n console.log(`Init: Attempting to use existing 'package.json'...`);\n\n try {\n const pkg = JSON.parse(await fs.readFile('package.json', 'utf8'));\n console.log(`Init: Successfully parsed 'package.json'!`);\n return pkg;\n } catch (error) {\n logError(\n `Init Error: Could not parse 'package.json'. Please verify that the file is correctly formatted and try again.`,\n error,\n );\n process.exit(1);\n }\n }\n\n // exit if yarn.lock is found, or we'll be in trouble\n const usesYarn = existsSync('yarn.lock');\n\n if (usesYarn) {\n logError(\n `Init Error: Found a 'yarn.lock' file but no 'package.json'. Please run 'yarn init' and try again.`,\n );\n process.exit(1);\n }\n\n // run 'npm init'\n return new Promise((resolve, reject) => {\n initPackageJson(process.cwd(), '', {}, (err, data) => {\n if (err) {\n reject(err);\n } else {\n resolve(data);\n }\n });\n });\n}\n\nexport async function buildWeb3Wallet(\n argv: YargsArgs,\n): Promise<\n [ManifestWalletProperty, { port: number; dist: string; outfileName: string }]\n> {\n const outfileName = argv.outfileName as string;\n let { port, dist } = argv;\n const defaultPerms = { alert: {} };\n let initialPermissions: Record<string, unknown> = defaultPerms;\n\n try {\n const userInput = await prompt({\n question: `Use all default Snap manifest values?`,\n defaultValue: 'yes',\n shouldClose: false,\n });\n if (userInput && ['y', 'yes'].includes(userInput.toLowerCase())) {\n console.log('Using default values...');\n try {\n await fs.mkdir(dist);\n } catch (err) {\n if (err.code !== 'EEXIST') {\n logError(\n `Init Error: Could not write default 'dist' '${dist}'. Maybe check your local ${CONFIG_PATH} file?`,\n );\n throw err;\n }\n }\n return endWeb3Wallet();\n }\n } catch (err) {\n logError(`Init Error: ${err.message}`, err);\n process.exit(1);\n }\n\n // at this point, prompt the user for all values\n let noValidPort = true;\n while (noValidPort) {\n const inputPort = await prompt({\n question: `local server port:`,\n defaultValue: port.toString(10),\n });\n const parsedPort = Number.parseInt(inputPort, 10);\n if (parsedPort && parsedPort > 0) {\n // eslint-disable-next-line require-atomic-updates\n port = parsedPort;\n noValidPort = false;\n } else {\n logError(`Invalid port '${parsedPort}', please retry.`);\n }\n }\n\n let invalidDist = true;\n while (invalidDist) {\n // eslint-disable-next-line require-atomic-updates\n dist = await prompt({ question: `output directory:`, defaultValue: dist });\n try {\n dist = trimPathString(dist);\n await fs.mkdir(dist);\n invalidDist = false;\n } catch (distError) {\n if (distError.code === 'EEXIST') {\n invalidDist = false;\n } else {\n logError(\n `Could not make directory '${dist}', please retry.`,\n distError,\n );\n }\n }\n }\n\n let invalidPermissions = true;\n while (invalidPermissions) {\n const inputPermissions = await prompt({\n question: `initialPermissions: [perm1 perm2 ...] ([alert])`,\n });\n try {\n if (inputPermissions) {\n initialPermissions = inputPermissions\n .split(' ')\n .reduce((allPermissions, permission) => {\n if (\n typeof permission === 'string' &&\n permission.match(/^[\\w\\d_]+$/u)\n ) {\n allPermissions[permission] = {};\n } else {\n throw new Error(`Invalid permission: ${permission}`);\n }\n return allPermissions;\n }, {} as Record<string, unknown>);\n\n invalidPermissions = false;\n } else {\n initialPermissions = defaultPerms;\n invalidPermissions = false;\n }\n } catch (err) {\n logError(`Invalid permissions '${inputPermissions}', please retry.`, err);\n }\n }\n\n return endWeb3Wallet();\n\n function endWeb3Wallet(): [\n ManifestWalletProperty,\n {\n port: number;\n dist: string;\n outfileName: string;\n },\n ] {\n return [\n {\n bundle: {\n local: pathUtils.join(dist, outfileName as string),\n url: new URL(\n `/${dist}/${outfileName}`,\n `http://localhost:${port}`,\n ).toString(),\n },\n initialPermissions,\n },\n { dist, outfileName, port },\n ];\n }\n}\n\nexport async function validateEmptyDir(): Promise<void> {\n const existing = (await fs.readdir(process.cwd())).filter((item) =>\n ['index.js', 'index.html', CONFIG_PATH, 'dist'].includes(item.toString()),\n );\n\n if (existing.length > 0) {\n logWarning(\n `\\nInit Warning: Existing files/directories may be overwritten:\\n${existing.reduce(\n (acc, curr) => {\n return `${acc}\\t${curr}\\n`;\n },\n '',\n )}`,\n );\n\n const continueInput = await prompt({\n question: `Continue?`,\n defaultValue: 'yes',\n });\n const shouldContinue =\n continueInput && ['y', 'yes'].includes(continueInput.toLowerCase());\n\n if (!shouldContinue) {\n console.log(`Init: Exiting...`);\n process.exit(1);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"initUtils.js","sourceRoot":"","sources":["../../../src/cmds/init/initUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fs, existsSync } from 'fs';\nimport pathUtils from 'path';\nimport {\n NpmSnapPackageJson,\n SnapManifest,\n NpmSnapFileNames,\n validateSnapJsonFile,\n PROPOSED_NAME_REGEX,\n} from '@metamask/snap-controllers/dist/snaps';\nimport initPackageJson from 'init-package-json';\nimport mkdirp from 'mkdirp';\nimport slash from 'slash';\nimport {\n CONFIG_FILE,\n deepClone,\n logError,\n logWarning,\n prompt,\n readJsonFile,\n trimPathString,\n} from '../../utils';\nimport { YargsArgs } from '../../types/yargs';\n\n/**\n * This is a placeholder shasum that will be replaced at the end of the init command.\n */\nconst PLACEHOLDER_SHASUM = '2QqUxo5joo4kKKr7yiCjdYsZOZcIFBnIBEdwU9Yx7+M=';\n\nconst NPM_PUBLIC_REGISTRY_URL = 'https://registry.npmjs.org';\n\n/**\n * Initializes a `package.json` file for a Snap project. Will attempt to read\n * and parse the existing file if it already exists, otherwise will intialize\n * a brand new one.\n *\n * @returns The contents of the `package.json` file.\n */\nexport async function asyncPackageInit(): Promise<\n Readonly<NpmSnapPackageJson>\n> {\n if (existsSync(NpmSnapFileNames.PackageJson)) {\n console.log(\n `Init: Attempting to use existing '${NpmSnapFileNames.PackageJson}'...`,\n );\n\n try {\n const packageJson = await readJsonFile(NpmSnapFileNames.PackageJson);\n validateSnapJsonFile(NpmSnapFileNames.PackageJson, packageJson);\n\n console.log(\n `Init: Successfully parsed '${NpmSnapFileNames.PackageJson}'!`,\n );\n return packageJson as NpmSnapPackageJson;\n } catch (error) {\n logError(\n `Init Error: Could not parse '${NpmSnapFileNames.PackageJson}'. Please verify that the file is correctly formatted and try again.`,\n error,\n );\n process.exit(1);\n }\n }\n\n // Exit if yarn.lock is found, or we'll be in trouble\n if (existsSync('yarn.lock')) {\n logError(\n `Init Error: Found a 'yarn.lock' file but no '${NpmSnapFileNames.PackageJson}'. Please run 'yarn init' and try again.`,\n );\n process.exit(1);\n }\n\n // Run 'npm init'\n return new Promise((resolve, reject) => {\n initPackageJson(process.cwd(), '', {}, (err, data) => {\n if (err) {\n reject(err);\n } else {\n resolve(data);\n }\n });\n });\n}\n\nconst YES = 'yes';\nconst YES_VALUES = new Set([YES, 'y']);\n\nfunction isYes(userInput: string | undefined) {\n return userInput && YES_VALUES.has(userInput.toLowerCase());\n}\n\nconst DEFAULT_PERMISSION_KEY = 'snap_confirm';\nconst getDefaultPermissions = () => {\n return { [DEFAULT_PERMISSION_KEY]: {} };\n};\n\n/**\n * Interactively constructs a Snap manifest file by prompting the user.\n *\n * @param argv - The `yargs` `argv` object.\n * @param packageJson - The `package.json` object.\n * @param shasum - The shasum of the Snap source file.\n * @returns A tuple of the resulting Snap manifest object and a new `argv` object\n * with properties to match the manifest.\n */\nexport async function buildSnapManifest(\n argv: YargsArgs,\n packageJson: NpmSnapPackageJson,\n): Promise<[SnapManifest, { dist: string; outfileName: string; src: string }]> {\n const { outfileName } = argv;\n let { dist } = argv;\n let initialPermissions: Record<string, unknown> = getDefaultPermissions();\n let { description, name: proposedName } = packageJson;\n\n if (!description) {\n description = `The ${proposedName} Snap.`;\n }\n\n try {\n const userInput = await prompt({\n question: `Use default Snap manifest values?`,\n defaultValue: YES,\n shouldClose: false,\n });\n\n if (isYes(userInput)) {\n console.log('Using default values...');\n try {\n await mkdirp(dist);\n } catch (err) {\n logError(\n `Init Error: Could not write default 'dist' '${dist}'. Maybe check your local ${CONFIG_FILE} file?`,\n );\n throw err;\n }\n return endSnapManifest();\n }\n } catch (err) {\n logError(`Init Error: ${err.message}`, err);\n process.exit(1);\n }\n\n let invalidProposedName = true;\n while (invalidProposedName) {\n // eslint-disable-next-line require-atomic-updates\n proposedName = await prompt({\n question: `Proposed Snap name:`,\n defaultValue: proposedName,\n });\n\n if (\n proposedName.length > 0 &&\n proposedName.length <= 214 &&\n PROPOSED_NAME_REGEX.test(proposedName)\n ) {\n invalidProposedName = false;\n } else {\n logError(\n `The proposed name must adhere to npm package naming conventions, except that capital letters are allowed. For details, see: https://docs.npmjs.com/cli/v6/configuring-npm/package-json#name`,\n );\n }\n }\n\n let invalidDescription = true;\n while (invalidDescription) {\n // eslint-disable-next-line require-atomic-updates\n description = await prompt({\n question: `Description:`,\n defaultValue: description,\n });\n\n if (description.length === 0 || description.length <= 280) {\n invalidDescription = false;\n } else {\n logError(\n `The description must be a non-empty string less than or equal to 280 characters.`,\n );\n }\n }\n\n let invalidDist = true;\n while (invalidDist) {\n // eslint-disable-next-line require-atomic-updates\n dist = await prompt({ question: `Output directory:`, defaultValue: dist });\n try {\n dist = trimPathString(dist);\n await mkdirp(dist);\n invalidDist = false;\n } catch (distError) {\n logError(\n `Unable to create directory '${dist}'. Ensure that the path is valid and try again.`,\n distError,\n );\n }\n }\n\n let invalidPermissions = true;\n while (invalidPermissions) {\n const inputPermissions = await prompt({\n // We add the parenthetical default value ourselves\n question: `Initial permissions: [perm1 perm2 ...] ([snap_confirm])`,\n });\n\n if (\n !inputPermissions ||\n inputPermissions.trim() === DEFAULT_PERMISSION_KEY\n ) {\n break;\n }\n\n try {\n initialPermissions = inputPermissions\n .split(' ')\n .reduce((allPermissions, permission) => {\n if (\n typeof permission === 'string' &&\n permission.match(/^[\\w\\d_:]+$/iu)\n ) {\n allPermissions[permission] = {};\n } else {\n throw new Error(`Invalid permission: ${permission}`);\n }\n return allPermissions;\n }, {} as Record<string, unknown>);\n\n invalidPermissions = false;\n } catch (err) {\n logError(\n `Invalid permissions '${inputPermissions}'.\\nThe permissions must be specified as a space-separated list of strings with only characters, digits, underscores ('_'), and colons (':').`,\n err,\n );\n }\n }\n\n return endSnapManifest();\n\n function endSnapManifest(): [\n SnapManifest,\n {\n dist: string;\n outfileName: string;\n src: string;\n },\n ] {\n const manifest = {\n version: packageJson.version,\n description,\n proposedName,\n repository: packageJson.repository\n ? deepClone(packageJson.repository)\n : null,\n source: {\n shasum: PLACEHOLDER_SHASUM,\n location: {\n npm: {\n filePath: slash(pathUtils.join(dist, outfileName)),\n packageName: packageJson.name,\n registry: NPM_PUBLIC_REGISTRY_URL,\n } as const,\n },\n },\n initialPermissions,\n manifestVersion: '0.1' as const,\n };\n\n try {\n validateSnapJsonFile(NpmSnapFileNames.Manifest, manifest);\n } catch (error) {\n /* istanbul ignore next */\n throw new Error(\n `Internal Error: Validation of constructed manifest failed. This is a bug, please report it. Reason:\\n${error.message}`,\n );\n }\n\n return [\n manifest,\n { dist, outfileName, src: packageJson.main || 'src/index.js' },\n ];\n }\n}\n\nconst INIT_FILE_NAMES = new Set([\n 'src',\n 'index.html',\n CONFIG_FILE,\n 'dist',\n NpmSnapFileNames.Manifest,\n]);\n\n/**\n * Checks whether any files in the current working directory will be overwritten\n * by the initialization process, and asks the user whether to continue if so.\n */\nexport async function prepareWorkingDirectory(): Promise<void> {\n const existingFiles = (await fs.readdir(process.cwd())).filter((item) =>\n INIT_FILE_NAMES.has(item.toString()),\n );\n\n if (existingFiles.length > 0) {\n logWarning(\n `\\nInit Warning: Existing files and/or directories may be overwritten:\\n${existingFiles.reduce(\n (message, currentFile) => {\n return `${message}\\t${currentFile}\\n`;\n },\n '',\n )}`,\n );\n\n const continueInput = await prompt({\n question: `Continue?`,\n defaultValue: YES,\n });\n const shouldContinue = continueInput && isYes(continueInput);\n\n if (!shouldContinue) {\n console.log(`Init: Exiting...`);\n process.exit(1);\n }\n }\n}\n"]}
@@ -7,16 +7,13 @@ const utils_1 = require("../../utils");
7
7
  const manifestHandler_1 = require("./manifestHandler");
8
8
  module.exports = {
9
9
  command: ['manifest', 'm'],
10
- desc: 'Validate project package.json as a Snap manifest',
10
+ desc: 'Validate the snap.manifest.json file',
11
11
  builder: (yarg) => {
12
- yarg
13
- .option('dist', builders_1.default.dist)
14
- .option('port', builders_1.default.port)
15
- .option('populate', builders_1.default.populate);
12
+ yarg.option('writeManifest', Object.assign(Object.assign({}, builders_1.default.writeManifest), { alias: ['fix'] }));
16
13
  },
17
14
  handler: async (argv) => {
18
15
  try {
19
- await manifestHandler_1.manifest(argv);
16
+ await manifestHandler_1.manifestHandler(argv);
20
17
  }
21
18
  catch (err) {
22
19
  utils_1.logError(err.message, err);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cmds/manifest/index.ts"],"names":[],"mappings":";;;;AACA,8DAAsC;AACtC,uCAAuC;AAEvC,uDAA6C;AAE7C,iBAAS;IACP,OAAO,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC;IAC1B,IAAI,EAAE,kDAAkD;IACxD,OAAO,EAAE,CAAC,IAAgB,EAAE,EAAE;QAC5B,IAAI;aACD,MAAM,CAAC,MAAM,EAAE,kBAAQ,CAAC,IAAI,CAAC;aAC7B,MAAM,CAAC,MAAM,EAAE,kBAAQ,CAAC,IAAI,CAAC;aAC7B,MAAM,CAAC,UAAU,EAAE,kBAAQ,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAe,EAAE,EAAE;QACjC,IAAI;YACF,MAAM,0BAAQ,CAAC,IAAI,CAAC,CAAC;SACtB;QAAC,OAAO,GAAG,EAAE;YACZ,gBAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACjB;IACH,CAAC;CACF,CAAC","sourcesContent":["import yargs from 'yargs';\nimport builders from '../../builders';\nimport { logError } from '../../utils';\nimport { YargsArgs } from '../../types/yargs';\nimport { manifest } from './manifestHandler';\n\nexport = {\n command: ['manifest', 'm'],\n desc: 'Validate project package.json as a Snap manifest',\n builder: (yarg: yargs.Argv) => {\n yarg\n .option('dist', builders.dist)\n .option('port', builders.port)\n .option('populate', builders.populate);\n },\n handler: async (argv: YargsArgs) => {\n try {\n await manifest(argv);\n } catch (err) {\n logError(err.message, err);\n process.exit(1);\n }\n },\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cmds/manifest/index.ts"],"names":[],"mappings":";;;;AACA,8DAAsC;AACtC,uCAAuC;AAEvC,uDAAoD;AAEpD,iBAAS;IACP,OAAO,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC;IAC1B,IAAI,EAAE,sCAAsC;IAC5C,OAAO,EAAE,CAAC,IAAgB,EAAE,EAAE;QAC5B,IAAI,CAAC,MAAM,CAAC,eAAe,kCAAO,kBAAQ,CAAC,aAAa,KAAE,KAAK,EAAE,CAAC,KAAK,CAAC,IAAG,CAAC;IAC9E,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAe,EAAE,EAAE;QACjC,IAAI;YACF,MAAM,iCAAe,CAAC,IAAI,CAAC,CAAC;SAC7B;QAAC,OAAO,GAAG,EAAE;YACZ,gBAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACjB;IACH,CAAC;CACF,CAAC","sourcesContent":["import yargs from 'yargs';\nimport builders from '../../builders';\nimport { logError } from '../../utils';\nimport { YargsArgs } from '../../types/yargs';\nimport { manifestHandler } from './manifestHandler';\n\nexport = {\n command: ['manifest', 'm'],\n desc: 'Validate the snap.manifest.json file',\n builder: (yarg: yargs.Argv) => {\n yarg.option('writeManifest', { ...builders.writeManifest, alias: ['fix'] });\n },\n handler: async (argv: YargsArgs) => {\n try {\n await manifestHandler(argv);\n } catch (err) {\n logError(err.message, err);\n process.exit(1);\n }\n },\n};\n"]}