@metamask/snaps-cli 0.4.0 → 0.6.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.
- package/CHANGELOG.md +29 -1
- package/README.md +65 -104
- package/dist/builders.d.ts +17 -2
- package/dist/builders.js +4 -6
- package/dist/builders.js.map +1 -1
- package/dist/cli.d.ts +0 -7
- package/dist/cli.js +3 -3
- package/dist/cli.js.map +1 -1
- package/dist/cmds/build/buildHandler.js +1 -1
- package/dist/cmds/build/buildHandler.js.map +1 -1
- package/dist/cmds/build/bundleUtils.d.ts +2 -2
- package/dist/cmds/build/bundleUtils.js.map +1 -1
- package/dist/cmds/build/index.js +2 -3
- package/dist/cmds/build/index.js.map +1 -1
- package/dist/cmds/eval/eval-worker.js +4 -1
- package/dist/cmds/eval/eval-worker.js.map +1 -1
- package/dist/cmds/init/index.js +3 -2
- package/dist/cmds/init/index.js.map +1 -1
- package/dist/cmds/init/init-template.json +2 -2
- package/dist/cmds/init/initHandler.d.ts +6 -1
- package/dist/cmds/init/initHandler.js +50 -33
- package/dist/cmds/init/initHandler.js.map +1 -1
- package/dist/cmds/init/initUtils.d.ts +28 -11
- package/dist/cmds/init/initUtils.js +158 -91
- package/dist/cmds/init/initUtils.js.map +1 -1
- package/dist/cmds/manifest/index.js +3 -6
- package/dist/cmds/manifest/index.js.map +1 -1
- package/dist/cmds/manifest/manifestHandler.d.ts +15 -3
- package/dist/cmds/manifest/manifestHandler.js +180 -147
- package/dist/cmds/manifest/manifestHandler.js.map +1 -1
- package/dist/cmds/watch/watchHandler.js +2 -0
- package/dist/cmds/watch/watchHandler.js.map +1 -1
- package/dist/main.js.map +1 -1
- package/dist/tsconfig.json +3 -0
- package/dist/utils/fs.d.ts +10 -2
- package/dist/utils/fs.js +16 -3
- package/dist/utils/fs.js.map +1 -1
- package/dist/utils/misc.d.ts +4 -3
- package/dist/utils/misc.js +6 -4
- package/dist/utils/misc.js.map +1 -1
- package/dist/utils/readline.d.ts +2 -2
- package/dist/utils/readline.js.map +1 -1
- package/dist/utils/snap-config.js +12 -17
- package/dist/utils/snap-config.js.map +1 -1
- package/dist/utils/validate-fs.d.ts +1 -1
- package/dist/utils/validate-fs.js +1 -1
- package/dist/utils/validate-fs.js.map +1 -1
- package/package.json +16 -7
|
@@ -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(`
|
|
14
|
-
const
|
|
15
|
-
await initUtils_1.
|
|
16
|
-
console.log(`\nInit:
|
|
17
|
-
const [
|
|
18
|
-
const newArgs = _newArgs
|
|
19
|
-
|
|
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(
|
|
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:
|
|
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: '
|
|
28
|
-
//
|
|
29
|
-
const {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
54
|
+
utils_1.logError(`Init Error: Failed to write 'index.html'.`, err);
|
|
50
55
|
process.exit(1);
|
|
51
56
|
}
|
|
52
|
-
//
|
|
57
|
+
// Write config file
|
|
53
58
|
try {
|
|
54
|
-
await fs_1.promises.writeFile(
|
|
55
|
-
console.log(`Init: Wrote '${
|
|
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 '${
|
|
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,
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
17
|
-
|
|
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
|
|
22
|
-
|
|
23
|
-
|
|
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 '
|
|
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
|
-
//
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
|
57
|
-
defaultValue:
|
|
86
|
+
question: `Use default Snap manifest values?`,
|
|
87
|
+
defaultValue: YES,
|
|
58
88
|
shouldClose: false,
|
|
59
89
|
});
|
|
60
|
-
if (
|
|
90
|
+
if (isYes(userInput)) {
|
|
61
91
|
console.log('Using default values...');
|
|
62
92
|
try {
|
|
63
|
-
await
|
|
93
|
+
await mkdirp_1.default(dist);
|
|
64
94
|
}
|
|
65
95
|
catch (err) {
|
|
66
|
-
|
|
67
|
-
|
|
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
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
question: `
|
|
83
|
-
defaultValue:
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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(`
|
|
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: `
|
|
139
|
+
dist = await utils_1.prompt({ question: `Output directory:`, defaultValue: dist });
|
|
99
140
|
try {
|
|
100
141
|
dist = utils_1.trimPathString(dist);
|
|
101
|
-
await
|
|
142
|
+
await mkdirp_1.default(dist);
|
|
102
143
|
invalidDist = false;
|
|
103
144
|
}
|
|
104
145
|
catch (distError) {
|
|
105
|
-
|
|
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
|
-
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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}',
|
|
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
|
|
144
|
-
function
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
-
|
|
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.
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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:
|
|
233
|
+
defaultValue: YES,
|
|
167
234
|
});
|
|
168
|
-
const shouldContinue = continueInput &&
|
|
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.
|
|
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
|
|
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.
|
|
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,
|
|
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"]}
|