@metamask/snaps-cli 0.17.0 → 0.19.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 (61) hide show
  1. package/dist/builders.d.ts +0 -1
  2. package/dist/builders.js +0 -6
  3. package/dist/builders.js.map +1 -1
  4. package/dist/cmds/build/buildHandler.js +7 -6
  5. package/dist/cmds/build/buildHandler.js.map +1 -1
  6. package/dist/cmds/build/bundle.js +6 -11
  7. package/dist/cmds/build/bundle.js.map +1 -1
  8. package/dist/cmds/build/index.js +0 -1
  9. package/dist/cmds/build/index.js.map +1 -1
  10. package/dist/cmds/build/utils.js +1 -1
  11. package/dist/cmds/build/utils.js.map +1 -1
  12. package/dist/cmds/eval/evalHandler.d.ts +1 -1
  13. package/dist/cmds/eval/evalHandler.js +8 -9
  14. package/dist/cmds/eval/evalHandler.js.map +1 -1
  15. package/dist/cmds/eval/index.js +1 -1
  16. package/dist/cmds/eval/index.js.map +1 -1
  17. package/dist/cmds/init/index.js +1 -5
  18. package/dist/cmds/init/index.js.map +1 -1
  19. package/dist/cmds/init/init-template.json +1 -1
  20. package/dist/cmds/init/initHandler.js +9 -10
  21. package/dist/cmds/init/initHandler.js.map +1 -1
  22. package/dist/cmds/init/initUtils.d.ts +1 -1
  23. package/dist/cmds/init/initUtils.js +12 -12
  24. package/dist/cmds/init/initUtils.js.map +1 -1
  25. package/dist/cmds/manifest/index.js +1 -1
  26. package/dist/cmds/manifest/index.js.map +1 -1
  27. package/dist/cmds/manifest/manifestHandler.d.ts +1 -10
  28. package/dist/cmds/manifest/manifestHandler.js +23 -180
  29. package/dist/cmds/manifest/manifestHandler.js.map +1 -1
  30. package/dist/cmds/serve/serveHandler.js +6 -2
  31. package/dist/cmds/serve/serveHandler.js.map +1 -1
  32. package/dist/cmds/watch/index.js +0 -1
  33. package/dist/cmds/watch/index.js.map +1 -1
  34. package/dist/cmds/watch/watchHandler.js +6 -5
  35. package/dist/cmds/watch/watchHandler.js.map +1 -1
  36. package/dist/tsconfig.json +6 -1
  37. package/dist/utils/index.d.ts +0 -2
  38. package/dist/utils/index.js +0 -2
  39. package/dist/utils/index.js.map +1 -1
  40. package/dist/utils/misc.d.ts +0 -1
  41. package/dist/utils/misc.js +1 -3
  42. package/dist/utils/misc.js.map +1 -1
  43. package/package.json +4 -5
  44. package/dist/cmds/eval/eval-worker.d.ts +0 -1
  45. package/dist/cmds/eval/eval-worker.js +0 -40
  46. package/dist/cmds/eval/eval-worker.js.map +0 -1
  47. package/dist/cmds/eval/mock.d.ts +0 -14
  48. package/dist/cmds/eval/mock.js +0 -98
  49. package/dist/cmds/eval/mock.js.map +0 -1
  50. package/dist/cmds/eval/workerEval.d.ts +0 -8
  51. package/dist/cmds/eval/workerEval.js +0 -37
  52. package/dist/cmds/eval/workerEval.js.map +0 -1
  53. package/dist/utils/fs.d.ts +0 -24
  54. package/dist/utils/fs.js +0 -66
  55. package/dist/utils/fs.js.map +0 -1
  56. package/dist/utils/snap-config.__GENERATED__.d.ts +0 -2
  57. package/dist/utils/snap-config.__GENERATED__.js +0 -18
  58. package/dist/utils/snap-config.__GENERATED__.js.map +0 -1
  59. package/dist/utils/validate-fs.d.ts +0 -35
  60. package/dist/utils/validate-fs.js +0 -69
  61. package/dist/utils/validate-fs.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"initUtils.js","sourceRoot":"","sources":["../../../src/cmds/init/initUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, promises as fs } from 'fs';\nimport pathUtils from 'path';\nimport {\n NpmSnapFileNames,\n NpmSnapPackageJson,\n PROPOSED_NAME_REGEX,\n SnapManifest,\n validateSnapJsonFile,\n} from '@metamask/snap-controllers/dist/snaps';\nimport initPackageJson from 'init-package-json';\nimport mkdirp from 'mkdirp';\nimport slash from 'slash';\nimport { Arguments } from 'yargs';\nimport { YargsArgs } from '../../types/yargs';\nimport {\n CONFIG_FILE,\n deepClone,\n logError,\n logWarning,\n prompt,\n readJsonFile,\n trimPathString,\n} from '../../utils';\nimport { TemplateType } from '../../builders';\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 * @param argv - Yargs arguments object.\n * @returns The contents of the `package.json` file.\n */\nexport async function asyncPackageInit(\n argv: YargsArgs,\n): Promise<Readonly<NpmSnapPackageJson>> {\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 throw error;\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 throw new Error('Already existing yarn.lock file found');\n }\n\n // Run 'npm init'\n return new Promise((resolve, reject) => {\n initPackageJson(\n process.cwd(),\n '',\n {\n 'init.main': argv.src,\n },\n (err, data) => {\n if (err) {\n reject(err);\n } else {\n resolve(data);\n }\n },\n );\n });\n}\n\nconst YES = 'yes';\nconst YES_VALUES = new Set([YES, 'y']);\n\n/**\n * Checks if user input provided over a prompt is \"yes\", i.e., if the value is\n * truthy and in the {@link YES_VALUES} set.\n *\n * @param userInput - The user input to check.\n * @returns `true` if the user input is \"yes\", `false` otherwise.\n */\nfunction isYes(userInput: string | undefined) {\n return userInput && YES_VALUES.has(userInput.toLowerCase());\n}\n\nconst DEFAULT_PERMISSION_KEY = 'snap_confirm';\n\n/**\n * Get the default permissions to write to the snap manifest.\n *\n * @returns An object containing the default permissions.\n */\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 * @returns A tuple of the resulting Snap manifest object and a new `argv`\n * object 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 throw err;\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 /**\n * Get the final snap manifest object and return it, along with the dist and\n * file names.\n *\n * @returns A tuple of the resulting snap manifest object and an object\n * containing the dist and file names.\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 iconPath: 'images/icon.svg',\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 throw new Error('User refused to continue');\n }\n }\n}\n\n/**\n * In case when TypeScript version is used, default source file\n * will be updated if previous was not correct.\n *\n * @param yargsArgv - The Yargs arguments object.\n * @returns Modified Yargs arguments object.\n */\nexport function correctDefaultArgs(yargsArgv: Arguments): Arguments {\n if (\n yargsArgv.template === TemplateType.TypeScript &&\n yargsArgv.src === 'src/index.js'\n ) {\n yargsArgv.src = 'src/index.ts';\n yargsArgv.s = 'src/index.ts';\n }\n\n return yargsArgv;\n}\n\n/**\n * Check if template argument is TemplateType.TypeScript.\n *\n * @param templateType - TemplateType value of the template argument passed from CLI.\n * @returns True or false.\n */\nexport function isTemplateTypescript(templateType: TemplateType): boolean {\n return templateType === TemplateType.TypeScript;\n}\n"]}
1
+ {"version":3,"file":"initUtils.js","sourceRoot":"","sources":["../../../src/cmds/init/initUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, promises as fs } from 'fs';\nimport pathUtils from 'path';\nimport {\n PROPOSED_NAME_REGEX,\n NpmSnapFileNames,\n SnapManifest,\n NpmSnapPackageJson,\n validateSnapJsonFile,\n readJsonFile,\n deepClone,\n} from '@metamask/snap-utils';\nimport initPackageJson from 'init-package-json';\nimport mkdirp from 'mkdirp';\nimport slash from 'slash';\nimport { Arguments } from 'yargs';\nimport { YargsArgs } from '../../types/yargs';\nimport {\n CONFIG_FILE,\n logError,\n logWarning,\n prompt,\n trimPathString,\n} from '../../utils';\nimport { TemplateType } from '../../builders';\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 * @param argv - Yargs arguments object.\n * @returns The contents of the `package.json` file.\n */\nexport async function asyncPackageInit(\n argv: YargsArgs,\n): Promise<Readonly<NpmSnapPackageJson>> {\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 throw error;\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 throw new Error('Already existing yarn.lock file found');\n }\n\n // Run 'npm init'\n return new Promise((resolve, reject) => {\n initPackageJson(\n process.cwd(),\n '',\n {\n 'init.main': argv.src,\n },\n (err, data) => {\n if (err) {\n reject(err);\n } else {\n resolve(data);\n }\n },\n );\n });\n}\n\nconst YES = 'yes';\nconst YES_VALUES = new Set([YES, 'y']);\n\n/**\n * Checks if user input provided over a prompt is \"yes\", i.e., if the value is\n * truthy and in the {@link YES_VALUES} set.\n *\n * @param userInput - The user input to check.\n * @returns `true` if the user input is \"yes\", `false` otherwise.\n */\nfunction isYes(userInput: string | undefined) {\n return userInput && YES_VALUES.has(userInput.toLowerCase());\n}\n\nconst DEFAULT_PERMISSION_KEY = 'snap_confirm';\n\n/**\n * Get the default permissions to write to the snap manifest.\n *\n * @returns An object containing the default permissions.\n */\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 * @returns A tuple of the resulting Snap manifest object and a new `argv`\n * object 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 throw err;\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 /**\n * Get the final snap manifest object and return it, along with the dist and\n * file names.\n *\n * @returns A tuple of the resulting snap manifest object and an object\n * containing the dist and file names.\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 iconPath: 'images/icon.svg',\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 throw new Error('User refused to continue');\n }\n }\n}\n\n/**\n * In case when TypeScript version is used, default source file\n * will be updated if previous was not correct.\n *\n * @param yargsArgv - The Yargs arguments object.\n * @returns Modified Yargs arguments object.\n */\nexport function correctDefaultArgs(yargsArgv: Arguments): Arguments {\n if (\n yargsArgv.template === TemplateType.TypeScript &&\n yargsArgv.src === 'src/index.js'\n ) {\n yargsArgv.src = 'src/index.ts';\n yargsArgv.s = 'src/index.ts';\n }\n\n return yargsArgv;\n}\n\n/**\n * Check if template argument is TemplateType.TypeScript.\n *\n * @param templateType - TemplateType value of the template argument passed from CLI.\n * @returns True or false.\n */\nexport function isTemplateTypescript(templateType: TemplateType): boolean {\n return templateType === TemplateType.TypeScript;\n}\n"]}
@@ -9,7 +9,7 @@ module.exports = {
9
9
  command: ['manifest', 'm'],
10
10
  desc: 'Validate the snap.manifest.json file',
11
11
  builder: (yarg) => {
12
- yarg.option('writeManifest', { ...builders_1.default.writeManifest, alias: ['fix'] });
12
+ yarg.option('writeManifest', Object.assign(Object.assign({}, builders_1.default.writeManifest), { alias: ['fix'] }));
13
13
  },
14
14
  handler: async (argv) => {
15
15
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cmds/manifest/index.ts"],"names":[],"mappings":";;;;AACA,8DAAsC;AAEtC,uCAAuC;AACvC,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,EAAE,EAAE,GAAG,kBAAQ,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAe,EAAE,EAAE;QACjC,IAAI;YACF,MAAM,IAAA,iCAAe,EAAC,IAAI,CAAC,CAAC;SAC7B;QAAC,OAAO,GAAG,EAAE;YACZ,IAAA,gBAAQ,EAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC3B,MAAM,GAAG,CAAC;SACX;IACH,CAAC;CACF,CAAC","sourcesContent":["import yargs from 'yargs';\nimport builders from '../../builders';\nimport { YargsArgs } from '../../types/yargs';\nimport { logError } from '../../utils';\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 throw err;\n }\n },\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cmds/manifest/index.ts"],"names":[],"mappings":";;;;AACA,8DAAsC;AAEtC,uCAAuC;AACvC,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,IAAA,iCAAe,EAAC,IAAI,CAAC,CAAC;SAC7B;QAAC,OAAO,GAAG,EAAE;YACZ,IAAA,gBAAQ,EAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC3B,MAAM,GAAG,CAAC;SACX;IACH,CAAC;CACF,CAAC","sourcesContent":["import yargs from 'yargs';\nimport builders from '../../builders';\nimport { YargsArgs } from '../../types/yargs';\nimport { logError } from '../../utils';\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 throw err;\n }\n },\n};\n"]}
@@ -1,4 +1,3 @@
1
- import type { SnapManifest } from '@metamask/snap-controllers';
2
1
  import { YargsArgs } from '../../types/yargs';
3
2
  /**
4
3
  * Validates a snap.manifest.json file. Attempts to fix the manifest and write
@@ -8,12 +7,4 @@ import { YargsArgs } from '../../types/yargs';
8
7
  * @param argv - The Yargs `argv` object.
9
8
  * @param argv.writeManifest - Whether to write the fixed manifest to disk.
10
9
  */
11
- export declare function manifestHandler({ writeManifest, }: YargsArgs): Promise<void>;
12
- /**
13
- * Sorts the given manifest in our preferred sort order and removes the
14
- * `repository` field if it is falsy (it may be `null`).
15
- *
16
- * @param manifest - The manifest to sort and modify.
17
- * @returns The disk-ready manifest.
18
- */
19
- export declare function getWritableManifest(manifest: SnapManifest): SnapManifest;
10
+ export declare function manifestHandler({ writeManifest }: YargsArgs): Promise<void>;
@@ -1,19 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getWritableManifest = exports.manifestHandler = void 0;
4
- const fs_1 = require("fs");
5
- const utils_1 = require("@metamask/snap-controllers/dist/snaps/utils");
6
- const utils_2 = require("../../utils");
7
- const errorPrefix = 'Manifest Error: ';
8
- const ManifestSortOrder = {
9
- version: 1,
10
- proposedName: 2,
11
- description: 2,
12
- repository: 3,
13
- source: 4,
14
- initialPermissions: 5,
15
- manifestVersion: 6,
16
- };
3
+ exports.manifestHandler = void 0;
4
+ const snap_utils_1 = require("@metamask/snap-utils");
5
+ const ERROR_PREFIX = 'Manifest Error: ';
17
6
  /**
18
7
  * Validates a snap.manifest.json file. Attempts to fix the manifest and write
19
8
  * the fixed version to disk if `writeManifest` is true. Throws if validation
@@ -22,186 +11,40 @@ const ManifestSortOrder = {
22
11
  * @param argv - The Yargs `argv` object.
23
12
  * @param argv.writeManifest - Whether to write the fixed manifest to disk.
24
13
  */
25
- async function manifestHandler({ writeManifest, }) {
26
- let didUpdate = false;
27
- let hasWarnings = false;
28
- const unvalidatedManifest = await readSnapJsonFile(utils_1.NpmSnapFileNames.Manifest);
29
- const iconPath = unvalidatedManifest && typeof unvalidatedManifest === 'object'
30
- ? unvalidatedManifest.source?.location?.npm
31
- ?.iconPath
32
- : undefined;
33
- const snapFiles = {
34
- manifest: unvalidatedManifest,
35
- packageJson: await readSnapJsonFile(utils_1.NpmSnapFileNames.PackageJson),
36
- sourceCode: await getSnapSourceCode(unvalidatedManifest),
37
- svgIcon: iconPath && (await fs_1.promises.readFile(iconPath, 'utf8')),
38
- };
39
- let manifest;
14
+ async function manifestHandler({ writeManifest }) {
40
15
  try {
41
- ({ manifest } = (0, utils_1.validateNpmSnap)(snapFiles, errorPrefix));
42
- }
43
- catch (error) {
44
- if (writeManifest && error instanceof utils_1.ProgrammaticallyFixableSnapError) {
45
- // If we get here, the files at least have the correct shape.
46
- const partiallyValidatedFiles = snapFiles;
47
- let isInvalid = true;
48
- const maxAttempts = Object.keys(utils_1.SnapValidationFailureReason).length;
49
- // Attempt to fix all fixable validation failure reasons. All such reasons
50
- // are enumerated by the SnapValidationFailureReason enum, so we only
51
- for (let attempts = 1; isInvalid && attempts <= maxAttempts; attempts++) {
52
- manifest = fixManifest(partiallyValidatedFiles, error);
53
- try {
54
- (0, utils_1.validateNpmSnapManifest)({ ...partiallyValidatedFiles, manifest }, errorPrefix);
55
- isInvalid = false;
56
- }
57
- catch (nextValidationError) {
58
- /* istanbul ignore next: this should be impossible */
59
- if (!(nextValidationError instanceof utils_1.ProgrammaticallyFixableSnapError) ||
60
- (attempts === maxAttempts && !isInvalid)) {
61
- throw new Error(`Internal Error: Failed to fix manifest. This is a bug, please report it. Reason:\n${error.message}`);
62
- }
63
- }
64
- }
65
- didUpdate = true;
16
+ const { warnings, errors } = await (0, snap_utils_1.checkManifest)(process.cwd(), Boolean(writeManifest));
17
+ if (!writeManifest && errors.length > 0) {
18
+ console.error(`${ERROR_PREFIX}The manifest is invalid.`);
19
+ errors.forEach(logManifestError);
20
+ process.exit(1);
66
21
  }
67
- else {
68
- throw error;
22
+ if (warnings.length > 0) {
23
+ console.log('Manifest Warning: Validation of snap.manifest.json completed with warnings.');
24
+ warnings.forEach(logManifestWarning);
69
25
  }
70
26
  }
71
- // TypeScript doesn't see that the 'manifest' variable must be of type
72
- // SnapManifest at this point, so we cast it.
73
- const validatedManifest = manifest;
74
- // Check presence of recommended keys
75
- const recommendedFields = ['repository'];
76
- const missingRecommendedFields = recommendedFields.filter((key) => !validatedManifest[key]);
77
- if (missingRecommendedFields.length > 0) {
78
- logManifestWarning(`Missing recommended package.json properties:\n${missingRecommendedFields.reduce((allMissing, currentField) => {
79
- return `${allMissing}\t${currentField}\n`;
80
- }, '')}`);
81
- }
82
- // Validation complete, finish work and notify user.
83
- if (writeManifest) {
84
- try {
85
- await fs_1.promises.writeFile(utils_1.NpmSnapFileNames.Manifest, `${JSON.stringify(getWritableManifest(validatedManifest), null, 2)}\n`);
86
- if (didUpdate) {
87
- console.log(`Manifest: Updated snap.manifest.json`);
88
- }
89
- }
90
- catch (error) {
91
- throw new Error(`${errorPrefix}Failed to update snap.manifest.json: ${error.message}`);
92
- }
93
- }
94
- if (hasWarnings) {
95
- console.log(`Manifest Warning: Validation of snap.manifest.json completed with warnings. See above.`);
96
- }
97
- else {
98
- console.log(`Manifest Success: Validated snap.manifest.json!`);
99
- }
100
- /**
101
- * Logs a manifest warning, if `suppressWarnings` is not enabled.
102
- *
103
- * @param message - The message to log.
104
- */
105
- function logManifestWarning(message) {
106
- if (!global.snaps.suppressWarnings) {
107
- hasWarnings = true;
108
- console.warn(`Manifest Warning: ${message}`);
109
- }
110
- }
111
- }
112
- exports.manifestHandler = manifestHandler;
113
- /**
114
- * Utility function for reading `package.json` or the Snap manifest file.
115
- * These are assumed to be in the current working directory.
116
- *
117
- * @param snapJsonFileName - The name of the file to read.
118
- * @returns The parsed JSON file.
119
- */
120
- async function readSnapJsonFile(snapJsonFileName) {
121
- try {
122
- return await (0, utils_2.readJsonFile)(snapJsonFileName);
123
- }
124
27
  catch (error) {
125
- if (error.code === 'ENOENT') {
126
- throw new Error(`${errorPrefix}Could not find '${snapJsonFileName}'. Please ensure that ` +
127
- `you are running the command in the project root directory.`);
128
- }
129
- throw new Error(`${errorPrefix}${error.message}`);
28
+ throw new Error(`${ERROR_PREFIX}${error}`);
130
29
  }
131
30
  }
31
+ exports.manifestHandler = manifestHandler;
132
32
  /**
133
- * Given an unvalidated Snap manifest, attempts to extract the location of the
134
- * bundle source file location and read the file.
135
- *
136
- * @param manifest - The unvalidated Snap manifest file contents.
137
- * @returns The contents of the bundle file, if any.
138
- */
139
- async function getSnapSourceCode(manifest) {
140
- if (manifest && typeof manifest === 'object' && !Array.isArray(manifest)) {
141
- /* istanbul ignore next: optional chaining */
142
- const sourceFilePath = manifest.source?.location
143
- ?.npm?.filePath;
144
- try {
145
- return sourceFilePath
146
- ? await fs_1.promises.readFile(sourceFilePath, 'utf8')
147
- : undefined;
148
- }
149
- catch (error) {
150
- throw new Error(`Manifest Error: Failed to read Snap bundle file: ${error.message}`);
151
- }
152
- }
153
- return undefined;
154
- }
155
- /**
156
- * Given the relevant Snap files (manifest, `package.json`, and bundle) and a
157
- * Snap manifest validation error, fixes the fault in the manifest that caused
158
- * the error.
33
+ * Logs a manifest warning, if `suppressWarnings` is not enabled.
159
34
  *
160
- * @param snapFiles - The contents of all Snap files.
161
- * @param error - The {@link ProgrammaticallyFixableSnapError} that was thrown.
162
- * @returns A copy of the manifest file where the cause of the error is fixed.
35
+ * @param message - The message to log.
163
36
  */
164
- function fixManifest(snapFiles, error) {
165
- const { manifest, packageJson, sourceCode } = snapFiles;
166
- const manifestCopy = (0, utils_2.deepClone)(manifest);
167
- switch (error.reason) {
168
- case utils_1.SnapValidationFailureReason.NameMismatch:
169
- manifestCopy.source.location.npm.packageName = packageJson.name;
170
- break;
171
- case utils_1.SnapValidationFailureReason.VersionMismatch:
172
- manifestCopy.version = packageJson.version;
173
- break;
174
- case utils_1.SnapValidationFailureReason.RepositoryMismatch:
175
- manifestCopy.repository = packageJson.repository
176
- ? (0, utils_2.deepClone)(packageJson.repository)
177
- : null;
178
- break;
179
- case utils_1.SnapValidationFailureReason.ShasumMismatch:
180
- manifestCopy.source.shasum = (0, utils_1.getSnapSourceShasum)(sourceCode);
181
- break;
182
- /* istanbul ignore next */
183
- default:
184
- // eslint-disable-next-line no-case-declarations
185
- const failureReason = error.reason;
186
- throw new Error(`Unrecognized validation failure reason: '${failureReason}'`);
37
+ function logManifestWarning(message) {
38
+ if (!global.snaps.suppressWarnings) {
39
+ console.log(`Manifest Warning: ${message}`);
187
40
  }
188
- return manifestCopy;
189
41
  }
190
42
  /**
191
- * Sorts the given manifest in our preferred sort order and removes the
192
- * `repository` field if it is falsy (it may be `null`).
43
+ * Logs a manifest error.
193
44
  *
194
- * @param manifest - The manifest to sort and modify.
195
- * @returns The disk-ready manifest.
45
+ * @param message - The message to log.
196
46
  */
197
- function getWritableManifest(manifest) {
198
- const { repository, ...remaining } = manifest;
199
- return Object.keys(repository ? { ...remaining, repository } : remaining)
200
- .sort((a, b) => ManifestSortOrder[a] - ManifestSortOrder[b])
201
- .reduce((outManifest, key) => {
202
- outManifest[key] = manifest[key];
203
- return outManifest;
204
- }, {});
47
+ function logManifestError(message) {
48
+ console.error(`${ERROR_PREFIX}${message}`);
205
49
  }
206
- exports.getWritableManifest = getWritableManifest;
207
50
  //# sourceMappingURL=manifestHandler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manifestHandler.js","sourceRoot":"","sources":["../../../src/cmds/manifest/manifestHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fs } from 'fs';\nimport type { Json, SnapManifest } from '@metamask/snap-controllers';\nimport {\n NpmSnapFileNames,\n UnvalidatedSnapFiles,\n validateNpmSnap,\n validateNpmSnapManifest,\n getSnapSourceShasum,\n ProgrammaticallyFixableSnapError,\n SnapValidationFailureReason,\n SnapFiles,\n} from '@metamask/snap-controllers/dist/snaps/utils';\nimport { deepClone, readJsonFile } from '../../utils';\nimport { YargsArgs } from '../../types/yargs';\n\nconst errorPrefix = 'Manifest Error: ';\n\nconst ManifestSortOrder: Record<keyof SnapManifest, number> = {\n version: 1,\n proposedName: 2,\n description: 2,\n repository: 3,\n source: 4,\n initialPermissions: 5,\n manifestVersion: 6,\n};\n\n/**\n * Validates a snap.manifest.json file. Attempts to fix the manifest and write\n * the fixed version to disk if `writeManifest` is true. Throws if validation\n * fails.\n *\n * @param argv - The Yargs `argv` object.\n * @param argv.writeManifest - Whether to write the fixed manifest to disk.\n */\nexport async function manifestHandler({\n writeManifest,\n}: YargsArgs): Promise<void> {\n let didUpdate = false;\n let hasWarnings = false;\n\n const unvalidatedManifest = await readSnapJsonFile(NpmSnapFileNames.Manifest);\n\n const iconPath =\n unvalidatedManifest && typeof unvalidatedManifest === 'object'\n ? (unvalidatedManifest as Partial<SnapManifest>).source?.location?.npm\n ?.iconPath\n : undefined;\n\n const snapFiles: UnvalidatedSnapFiles = {\n manifest: unvalidatedManifest,\n packageJson: await readSnapJsonFile(NpmSnapFileNames.PackageJson),\n sourceCode: await getSnapSourceCode(unvalidatedManifest),\n svgIcon: iconPath && (await fs.readFile(iconPath, 'utf8')),\n };\n\n let manifest: SnapManifest | undefined;\n try {\n ({ manifest } = validateNpmSnap(snapFiles, errorPrefix));\n } catch (error) {\n if (writeManifest && error instanceof ProgrammaticallyFixableSnapError) {\n // If we get here, the files at least have the correct shape.\n const partiallyValidatedFiles = snapFiles as SnapFiles;\n\n let isInvalid = true;\n const maxAttempts = Object.keys(SnapValidationFailureReason).length;\n\n // Attempt to fix all fixable validation failure reasons. All such reasons\n // are enumerated by the SnapValidationFailureReason enum, so we only\n for (let attempts = 1; isInvalid && attempts <= maxAttempts; attempts++) {\n manifest = fixManifest(partiallyValidatedFiles, error);\n\n try {\n validateNpmSnapManifest(\n { ...partiallyValidatedFiles, manifest },\n errorPrefix,\n );\n\n isInvalid = false;\n } catch (nextValidationError) {\n /* istanbul ignore next: this should be impossible */\n if (\n !(\n nextValidationError instanceof ProgrammaticallyFixableSnapError\n ) ||\n (attempts === maxAttempts && !isInvalid)\n ) {\n throw new Error(\n `Internal Error: Failed to fix manifest. This is a bug, please report it. Reason:\\n${error.message}`,\n );\n }\n }\n }\n\n didUpdate = true;\n } else {\n throw error;\n }\n }\n\n // TypeScript doesn't see that the 'manifest' variable must be of type\n // SnapManifest at this point, so we cast it.\n const validatedManifest = manifest as SnapManifest;\n\n // Check presence of recommended keys\n const recommendedFields = ['repository'] as const;\n\n const missingRecommendedFields = recommendedFields.filter(\n (key) => !validatedManifest[key],\n );\n\n if (missingRecommendedFields.length > 0) {\n logManifestWarning(\n `Missing recommended package.json properties:\\n${missingRecommendedFields.reduce(\n (allMissing, currentField) => {\n return `${allMissing}\\t${currentField}\\n`;\n },\n '',\n )}`,\n );\n }\n\n // Validation complete, finish work and notify user.\n\n if (writeManifest) {\n try {\n await fs.writeFile(\n NpmSnapFileNames.Manifest,\n `${JSON.stringify(getWritableManifest(validatedManifest), null, 2)}\\n`,\n );\n\n if (didUpdate) {\n console.log(`Manifest: Updated snap.manifest.json`);\n }\n } catch (error) {\n throw new Error(\n `${errorPrefix}Failed to update snap.manifest.json: ${error.message}`,\n );\n }\n }\n\n if (hasWarnings) {\n console.log(\n `Manifest Warning: Validation of snap.manifest.json completed with warnings. See above.`,\n );\n } else {\n console.log(`Manifest Success: Validated snap.manifest.json!`);\n }\n\n /**\n * Logs a manifest warning, if `suppressWarnings` is not enabled.\n *\n * @param message - The message to log.\n */\n function logManifestWarning(message: string) {\n if (!global.snaps.suppressWarnings) {\n hasWarnings = true;\n console.warn(`Manifest Warning: ${message}`);\n }\n }\n}\n\n/**\n * Utility function for reading `package.json` or the Snap manifest file.\n * These are assumed to be in the current working directory.\n *\n * @param snapJsonFileName - The name of the file to read.\n * @returns The parsed JSON file.\n */\nasync function readSnapJsonFile(\n snapJsonFileName: NpmSnapFileNames,\n): Promise<Json> {\n try {\n return await readJsonFile(snapJsonFileName);\n } catch (error) {\n if (error.code === 'ENOENT') {\n throw new Error(\n `${errorPrefix}Could not find '${snapJsonFileName}'. Please ensure that ` +\n `you are running the command in the project root directory.`,\n );\n }\n throw new Error(`${errorPrefix}${error.message}`);\n }\n}\n\n/**\n * Given an unvalidated Snap manifest, attempts to extract the location of the\n * bundle source file location and read the file.\n *\n * @param manifest - The unvalidated Snap manifest file contents.\n * @returns The contents of the bundle file, if any.\n */\nasync function getSnapSourceCode(manifest: Json): Promise<string | undefined> {\n if (manifest && typeof manifest === 'object' && !Array.isArray(manifest)) {\n /* istanbul ignore next: optional chaining */\n const sourceFilePath = (manifest as Partial<SnapManifest>).source?.location\n ?.npm?.filePath;\n\n try {\n return sourceFilePath\n ? await fs.readFile(sourceFilePath, 'utf8')\n : undefined;\n } catch (error) {\n throw new Error(\n `Manifest Error: Failed to read Snap bundle file: ${error.message}`,\n );\n }\n }\n return undefined;\n}\n\n/**\n * Given the relevant Snap files (manifest, `package.json`, and bundle) and a\n * Snap manifest validation error, fixes the fault in the manifest that caused\n * the error.\n *\n * @param snapFiles - The contents of all Snap files.\n * @param error - The {@link ProgrammaticallyFixableSnapError} that was thrown.\n * @returns A copy of the manifest file where the cause of the error is fixed.\n */\nfunction fixManifest(\n snapFiles: SnapFiles,\n error: ProgrammaticallyFixableSnapError,\n): SnapManifest {\n const { manifest, packageJson, sourceCode } = snapFiles;\n const manifestCopy = deepClone(manifest);\n\n switch (error.reason) {\n case SnapValidationFailureReason.NameMismatch:\n manifestCopy.source.location.npm.packageName = packageJson.name;\n break;\n\n case SnapValidationFailureReason.VersionMismatch:\n manifestCopy.version = packageJson.version;\n break;\n\n case SnapValidationFailureReason.RepositoryMismatch:\n manifestCopy.repository = packageJson.repository\n ? deepClone(packageJson.repository)\n : null;\n break;\n\n case SnapValidationFailureReason.ShasumMismatch:\n manifestCopy.source.shasum = getSnapSourceShasum(sourceCode);\n break;\n\n /* istanbul ignore next */\n default:\n // eslint-disable-next-line no-case-declarations\n const failureReason: never = error.reason;\n throw new Error(\n `Unrecognized validation failure reason: '${failureReason}'`,\n );\n }\n\n return manifestCopy;\n}\n\n/**\n * Sorts the given manifest in our preferred sort order and removes the\n * `repository` field if it is falsy (it may be `null`).\n *\n * @param manifest - The manifest to sort and modify.\n * @returns The disk-ready manifest.\n */\nexport function getWritableManifest(manifest: SnapManifest): SnapManifest {\n const { repository, ...remaining } = manifest;\n return (\n Object.keys(\n repository ? { ...remaining, repository } : remaining,\n ) as (keyof SnapManifest)[]\n )\n .sort((a, b) => ManifestSortOrder[a] - ManifestSortOrder[b])\n .reduce((outManifest, key) => {\n (outManifest as any)[key] = manifest[key];\n return outManifest;\n }, {} as SnapManifest);\n}\n"]}
1
+ {"version":3,"file":"manifestHandler.js","sourceRoot":"","sources":["../../../src/cmds/manifest/manifestHandler.ts"],"names":[],"mappings":";;;AAAA,qDAAqD;AAGrD,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAExC;;;;;;;GAOG;AACI,KAAK,UAAU,eAAe,CAAC,EAAE,aAAa,EAAa;IAChE,IAAI;QACF,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,0BAAa,EAC9C,OAAO,CAAC,GAAG,EAAE,EACb,OAAO,CAAC,aAAa,CAAC,CACvB,CAAC;QAEF,IAAI,CAAC,aAAa,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACvC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,0BAA0B,CAAC,CAAC;YACzD,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAEjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACjB;QAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACvB,OAAO,CAAC,GAAG,CACT,6EAA6E,CAC9E,CAAC;YACF,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;SACtC;KACF;IAAC,OAAO,KAAK,EAAE;QACd,MAAM,IAAI,KAAK,CAAC,GAAG,YAAY,GAAG,KAAK,EAAE,CAAC,CAAC;KAC5C;AACH,CAAC;AAvBD,0CAuBC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,OAAe;IACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE;QAClC,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,EAAE,CAAC,CAAC;KAC7C;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,GAAG,OAAO,EAAE,CAAC,CAAC;AAC7C,CAAC","sourcesContent":["import { checkManifest } from '@metamask/snap-utils';\nimport { YargsArgs } from '../../types/yargs';\n\nconst ERROR_PREFIX = 'Manifest Error: ';\n\n/**\n * Validates a snap.manifest.json file. Attempts to fix the manifest and write\n * the fixed version to disk if `writeManifest` is true. Throws if validation\n * fails.\n *\n * @param argv - The Yargs `argv` object.\n * @param argv.writeManifest - Whether to write the fixed manifest to disk.\n */\nexport async function manifestHandler({ writeManifest }: YargsArgs) {\n try {\n const { warnings, errors } = await checkManifest(\n process.cwd(),\n Boolean(writeManifest),\n );\n\n if (!writeManifest && errors.length > 0) {\n console.error(`${ERROR_PREFIX}The manifest is invalid.`);\n errors.forEach(logManifestError);\n\n process.exit(1);\n }\n\n if (warnings.length > 0) {\n console.log(\n 'Manifest Warning: Validation of snap.manifest.json completed with warnings.',\n );\n warnings.forEach(logManifestWarning);\n }\n } catch (error) {\n throw new Error(`${ERROR_PREFIX}${error}`);\n }\n}\n\n/**\n * Logs a manifest warning, if `suppressWarnings` is not enabled.\n *\n * @param message - The message to log.\n */\nfunction logManifestWarning(message: string) {\n if (!global.snaps.suppressWarnings) {\n console.log(`Manifest Warning: ${message}`);\n }\n}\n\n/**\n * Logs a manifest error.\n *\n * @param message - The message to log.\n */\nfunction logManifestError(message: string) {\n console.error(`${ERROR_PREFIX}${message}`);\n}\n"]}
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.serve = void 0;
7
7
  const http_1 = __importDefault(require("http"));
8
8
  const serve_handler_1 = __importDefault(require("serve-handler"));
9
- const utils_1 = require("../../utils");
9
+ const snap_utils_1 = require("@metamask/snap-utils");
10
10
  const serveUtils_1 = require("./serveUtils");
11
11
  /**
12
12
  * Starts a local, static HTTP server on the given port with the given root
@@ -18,7 +18,7 @@ const serveUtils_1 = require("./serveUtils");
18
18
  */
19
19
  async function serve(argv) {
20
20
  const { port, root: rootDir } = argv;
21
- await (0, utils_1.validateDirPath)(rootDir, true);
21
+ await (0, snap_utils_1.validateDirPath)(rootDir, true);
22
22
  console.log(`\nStarting server...`);
23
23
  const server = http_1.default.createServer(async (req, res) => {
24
24
  await (0, serve_handler_1.default)(req, res, {
@@ -31,6 +31,10 @@ async function serve(argv) {
31
31
  key: 'Cache-Control',
32
32
  value: 'no-cache',
33
33
  },
34
+ {
35
+ key: 'Access-Control-Allow-Origin',
36
+ value: '*',
37
+ },
34
38
  ],
35
39
  },
36
40
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"serveHandler.js","sourceRoot":"","sources":["../../../src/cmds/serve/serveHandler.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,kEAAyC;AAEzC,uCAA8C;AAC9C,6CAA8E;AAE9E;;;;;;;GAOG;AACI,KAAK,UAAU,KAAK,CAAC,IAAe;IACzC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAErC,MAAM,IAAA,uBAAe,EAAC,OAAiB,EAAE,IAAI,CAAC,CAAC;IAE/C,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAEpC,MAAM,MAAM,GAAG,cAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAClD,MAAM,IAAA,uBAAY,EAAC,GAAG,EAAE,GAAG,EAAE;YAC3B,MAAM,EAAE,OAAiB;YACzB,OAAO,EAAE;gBACP;oBACE,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP;4BACE,GAAG,EAAE,eAAe;4BACpB,KAAK,EAAE,UAAU;yBAClB;qBACF;iBACF;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,IAAA,+BAAkB,EAAC,IAAI,CAAC,CAAC,CAAC;IAExD,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAA,uBAAU,EAAC,OAAO,CAAC,CAAC,CAAC;IAEvD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QAC3B,IAAA,2BAAc,EAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACtB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC;AArCD,sBAqCC","sourcesContent":["import http from 'http';\nimport serveHandler from 'serve-handler';\nimport { YargsArgs } from '../../types/yargs';\nimport { validateDirPath } from '../../utils';\nimport { logRequest, logServerError, logServerListening } from './serveUtils';\n\n/**\n * Starts a local, static HTTP server on the given port with the given root\n * directory.\n *\n * @param argv - Arguments as an object generated by Yargs.\n * @param argv.root - The root directory path string.\n * @param argv.port - The server port.\n */\nexport async function serve(argv: YargsArgs): Promise<void> {\n const { port, root: rootDir } = argv;\n\n await validateDirPath(rootDir as string, true);\n\n console.log(`\\nStarting server...`);\n\n const server = http.createServer(async (req, res) => {\n await serveHandler(req, res, {\n public: rootDir as string,\n headers: [\n {\n source: '**/*',\n headers: [\n {\n key: 'Cache-Control',\n value: 'no-cache',\n },\n ],\n },\n ],\n });\n });\n\n server.listen({ port }, () => logServerListening(port));\n\n server.on('request', (request) => logRequest(request));\n\n server.on('error', (error) => {\n logServerError(error, argv.port);\n process.exitCode = 1;\n });\n\n server.on('close', () => {\n console.log('Server closed');\n process.exitCode = 1;\n });\n}\n"]}
1
+ {"version":3,"file":"serveHandler.js","sourceRoot":"","sources":["../../../src/cmds/serve/serveHandler.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,kEAAyC;AACzC,qDAAuD;AAEvD,6CAA8E;AAE9E;;;;;;;GAOG;AACI,KAAK,UAAU,KAAK,CAAC,IAAe;IACzC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAErC,MAAM,IAAA,4BAAe,EAAC,OAAiB,EAAE,IAAI,CAAC,CAAC;IAE/C,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAEpC,MAAM,MAAM,GAAG,cAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAClD,MAAM,IAAA,uBAAY,EAAC,GAAG,EAAE,GAAG,EAAE;YAC3B,MAAM,EAAE,OAAiB;YACzB,OAAO,EAAE;gBACP;oBACE,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP;4BACE,GAAG,EAAE,eAAe;4BACpB,KAAK,EAAE,UAAU;yBAClB;wBACD;4BACE,GAAG,EAAE,6BAA6B;4BAClC,KAAK,EAAE,GAAG;yBACX;qBACF;iBACF;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,IAAA,+BAAkB,EAAC,IAAI,CAAC,CAAC,CAAC;IAExD,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAA,uBAAU,EAAC,OAAO,CAAC,CAAC,CAAC;IAEvD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QAC3B,IAAA,2BAAc,EAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACtB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC;AAzCD,sBAyCC","sourcesContent":["import http from 'http';\nimport serveHandler from 'serve-handler';\nimport { validateDirPath } from '@metamask/snap-utils';\nimport { YargsArgs } from '../../types/yargs';\nimport { logRequest, logServerError, logServerListening } from './serveUtils';\n\n/**\n * Starts a local, static HTTP server on the given port with the given root\n * directory.\n *\n * @param argv - Arguments as an object generated by Yargs.\n * @param argv.root - The root directory path string.\n * @param argv.port - The server port.\n */\nexport async function serve(argv: YargsArgs): Promise<void> {\n const { port, root: rootDir } = argv;\n\n await validateDirPath(rootDir as string, true);\n\n console.log(`\\nStarting server...`);\n\n const server = http.createServer(async (req, res) => {\n await serveHandler(req, res, {\n public: rootDir as string,\n headers: [\n {\n source: '**/*',\n headers: [\n {\n key: 'Cache-Control',\n value: 'no-cache',\n },\n {\n key: 'Access-Control-Allow-Origin',\n value: '*',\n },\n ],\n },\n ],\n });\n });\n\n server.listen({ port }, () => logServerListening(port));\n\n server.on('request', (request) => logRequest(request));\n\n server.on('error', (error) => {\n logServerError(error, argv.port);\n process.exitCode = 1;\n });\n\n server.on('close', () => {\n console.log('Server closed');\n process.exitCode = 1;\n });\n}\n"]}
@@ -16,7 +16,6 @@ module.exports = {
16
16
  .option('outfileName', builders_1.default.outfileName)
17
17
  .option('sourceMaps', builders_1.default.sourceMaps)
18
18
  .option('stripComments', builders_1.default.stripComments)
19
- .option('transformHtmlComments', builders_1.default.transformHtmlComments)
20
19
  .option('transpilationMode', builders_1.default.transpilationMode)
21
20
  .option('depsToTranspile', builders_1.default.depsToTranspile)
22
21
  .option('manifest', builders_1.default.manifest)
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cmds/watch/index.ts"],"names":[],"mappings":";;;;AACA,8DAAsC;AAEtC,0CAA6D;AAC7D,iDAAuC;AAEvC,iBAAS;IACP,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC;IACvB,IAAI,EAAE,sBAAsB;IAC5B,OAAO,EAAE,CAAC,IAAgB,EAAE,EAAE;QAC5B,IAAI;aACD,MAAM,CAAC,KAAK,EAAE,kBAAQ,CAAC,GAAG,CAAC;aAC3B,MAAM,CAAC,MAAM,EAAE,kBAAQ,CAAC,IAAI,CAAC;aAC7B,MAAM,CAAC,MAAM,EAAE,kBAAQ,CAAC,IAAI,CAAC;aAC7B,MAAM,CAAC,aAAa,EAAE,kBAAQ,CAAC,WAAW,CAAC;aAC3C,MAAM,CAAC,YAAY,EAAE,kBAAQ,CAAC,UAAU,CAAC;aACzC,MAAM,CAAC,eAAe,EAAE,kBAAQ,CAAC,aAAa,CAAC;aAC/C,MAAM,CAAC,uBAAuB,EAAE,kBAAQ,CAAC,qBAAqB,CAAC;aAC/D,MAAM,CAAC,mBAAmB,EAAE,kBAAQ,CAAC,iBAAiB,CAAC;aACvD,MAAM,CAAC,iBAAiB,EAAE,kBAAQ,CAAC,eAAe,CAAC;aACnD,MAAM,CAAC,UAAU,EAAE,kBAAQ,CAAC,QAAQ,CAAC;aACrC,MAAM,CAAC,eAAe,EAAE,kBAAQ,CAAC,aAAa,CAAC;aAC/C,MAAM,CAAC,OAAO,EAAE,kBAAQ,CAAC,KAAK,CAAC;aAC/B,MAAM,CAAC,MAAM,EAAE,kBAAQ,CAAC,IAAI,CAAC;aAC7B,MAAM,CAAC,MAAM,EAAE,kBAAQ,CAAC,IAAI,CAAC;aAC7B,OAAO,CAAC,eAAe,EAAE,UAAU,CAAC;aACpC,OAAO,CAAC,iBAAiB,EAAE,mBAAmB,CAAC;aAC/C,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,mCAA2B,EAAC,IAAW,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,EAAE,CAAC,IAAe,EAAE,EAAE,CAAC,IAAA,oBAAK,EAAC,IAAI,CAAC;CAC1C,CAAC","sourcesContent":["import yargs from 'yargs';\nimport builders from '../../builders';\nimport { YargsArgs } from '../../types/yargs';\nimport { processInvalidTranspilation } from '../build/utils';\nimport { watch } from './watchHandler';\n\nexport = {\n command: ['watch', 'w'],\n desc: 'Build Snap on change',\n builder: (yarg: yargs.Argv) => {\n yarg\n .option('src', builders.src)\n .option('eval', builders.eval)\n .option('dist', builders.dist)\n .option('outfileName', builders.outfileName)\n .option('sourceMaps', builders.sourceMaps)\n .option('stripComments', builders.stripComments)\n .option('transformHtmlComments', builders.transformHtmlComments)\n .option('transpilationMode', builders.transpilationMode)\n .option('depsToTranspile', builders.depsToTranspile)\n .option('manifest', builders.manifest)\n .option('writeManifest', builders.writeManifest)\n .option('serve', builders.serve)\n .option('root', builders.root)\n .option('port', builders.port)\n .implies('writeManifest', 'manifest')\n .implies('depsToTranspile', 'transpilationMode')\n .middleware((argv) => processInvalidTranspilation(argv as any));\n },\n handler: (argv: YargsArgs) => watch(argv),\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cmds/watch/index.ts"],"names":[],"mappings":";;;;AACA,8DAAsC;AAEtC,0CAA6D;AAC7D,iDAAuC;AAEvC,iBAAS;IACP,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC;IACvB,IAAI,EAAE,sBAAsB;IAC5B,OAAO,EAAE,CAAC,IAAgB,EAAE,EAAE;QAC5B,IAAI;aACD,MAAM,CAAC,KAAK,EAAE,kBAAQ,CAAC,GAAG,CAAC;aAC3B,MAAM,CAAC,MAAM,EAAE,kBAAQ,CAAC,IAAI,CAAC;aAC7B,MAAM,CAAC,MAAM,EAAE,kBAAQ,CAAC,IAAI,CAAC;aAC7B,MAAM,CAAC,aAAa,EAAE,kBAAQ,CAAC,WAAW,CAAC;aAC3C,MAAM,CAAC,YAAY,EAAE,kBAAQ,CAAC,UAAU,CAAC;aACzC,MAAM,CAAC,eAAe,EAAE,kBAAQ,CAAC,aAAa,CAAC;aAC/C,MAAM,CAAC,mBAAmB,EAAE,kBAAQ,CAAC,iBAAiB,CAAC;aACvD,MAAM,CAAC,iBAAiB,EAAE,kBAAQ,CAAC,eAAe,CAAC;aACnD,MAAM,CAAC,UAAU,EAAE,kBAAQ,CAAC,QAAQ,CAAC;aACrC,MAAM,CAAC,eAAe,EAAE,kBAAQ,CAAC,aAAa,CAAC;aAC/C,MAAM,CAAC,OAAO,EAAE,kBAAQ,CAAC,KAAK,CAAC;aAC/B,MAAM,CAAC,MAAM,EAAE,kBAAQ,CAAC,IAAI,CAAC;aAC7B,MAAM,CAAC,MAAM,EAAE,kBAAQ,CAAC,IAAI,CAAC;aAC7B,OAAO,CAAC,eAAe,EAAE,UAAU,CAAC;aACpC,OAAO,CAAC,iBAAiB,EAAE,mBAAmB,CAAC;aAC/C,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,mCAA2B,EAAC,IAAW,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,EAAE,CAAC,IAAe,EAAE,EAAE,CAAC,IAAA,oBAAK,EAAC,IAAI,CAAC;CAC1C,CAAC","sourcesContent":["import yargs from 'yargs';\nimport builders from '../../builders';\nimport { YargsArgs } from '../../types/yargs';\nimport { processInvalidTranspilation } from '../build/utils';\nimport { watch } from './watchHandler';\n\nexport = {\n command: ['watch', 'w'],\n desc: 'Build Snap on change',\n builder: (yarg: yargs.Argv) => {\n yarg\n .option('src', builders.src)\n .option('eval', builders.eval)\n .option('dist', builders.dist)\n .option('outfileName', builders.outfileName)\n .option('sourceMaps', builders.sourceMaps)\n .option('stripComments', builders.stripComments)\n .option('transpilationMode', builders.transpilationMode)\n .option('depsToTranspile', builders.depsToTranspile)\n .option('manifest', builders.manifest)\n .option('writeManifest', builders.writeManifest)\n .option('serve', builders.serve)\n .option('root', builders.root)\n .option('port', builders.port)\n .implies('writeManifest', 'manifest')\n .implies('depsToTranspile', 'transpilationMode')\n .middleware((argv) => processInvalidTranspilation(argv as any));\n },\n handler: (argv: YargsArgs) => watch(argv),\n};\n"]}
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.watch = void 0;
7
7
  const chokidar_1 = __importDefault(require("chokidar"));
8
+ const snap_utils_1 = require("@metamask/snap-utils");
8
9
  const utils_1 = require("../../utils");
9
10
  const bundle_1 = require("../build/bundle");
10
11
  const evalHandler_1 = require("../eval/evalHandler");
@@ -25,12 +26,12 @@ const serveHandler_1 = require("../serve/serveHandler");
25
26
  async function watch(argv) {
26
27
  const { dist, eval: shouldEval, manifest, outfileName, src, serve: shouldServe, } = argv;
27
28
  if (outfileName) {
28
- (0, utils_1.validateOutfileName)(outfileName);
29
+ (0, snap_utils_1.validateOutfileName)(outfileName);
29
30
  }
30
- await (0, utils_1.validateFilePath)(src);
31
- await (0, utils_1.validateDirPath)(dist, true);
31
+ await (0, snap_utils_1.validateFilePath)(src);
32
+ await (0, snap_utils_1.validateDirPath)(dist, true);
32
33
  const rootDir = src.indexOf('/') === -1 ? '.' : src.substring(0, src.lastIndexOf('/') + 1);
33
- const outfilePath = (0, utils_1.getOutfilePath)(dist, outfileName);
34
+ const outfilePath = (0, snap_utils_1.getOutfilePath)(dist, outfileName);
34
35
  const buildSnap = async (path, logMessage) => {
35
36
  if (logMessage !== undefined) {
36
37
  console.log(logMessage);
@@ -41,7 +42,7 @@ async function watch(argv) {
41
42
  await (0, manifestHandler_1.manifestHandler)(argv);
42
43
  }
43
44
  if (shouldEval) {
44
- await (0, evalHandler_1.snapEval)({ ...argv, bundle: outfilePath });
45
+ await (0, evalHandler_1.evalHandler)(Object.assign(Object.assign({}, argv), { bundle: outfilePath }));
45
46
  }
46
47
  }
47
48
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"watchHandler.js","sourceRoot":"","sources":["../../../src/cmds/watch/watchHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import chokidar from 'chokidar';\nimport { YargsArgs } from '../../types/yargs';\nimport {\n getOutfilePath,\n loadConfig,\n logError,\n validateDirPath,\n validateFilePath,\n validateOutfileName,\n} from '../../utils';\nimport { bundle } from '../build/bundle';\nimport { snapEval } from '../eval/evalHandler';\nimport { manifestHandler } from '../manifest/manifestHandler';\nimport { serve } from '../serve/serveHandler';\n\n/**\n * Watch a directory and its subdirectories for changes, and build when files\n * are added or changed.\n *\n * Ignores 'node_modules' and dotfiles.\n * Creates destination directory if it doesn't exist.\n *\n * @param argv - Arguments as an object generated by Yargs.\n * @param argv.src - The source file path.\n * @param argv.dist - The output directory path.\n * @param argv.'outfileName' - The output file name.\n */\nexport async function watch(argv: YargsArgs): Promise<void> {\n const {\n dist,\n eval: shouldEval,\n manifest,\n outfileName,\n src,\n serve: shouldServe,\n } = argv;\n if (outfileName) {\n validateOutfileName(outfileName as string);\n }\n await validateFilePath(src);\n await validateDirPath(dist, true);\n const rootDir =\n src.indexOf('/') === -1 ? '.' : src.substring(0, src.lastIndexOf('/') + 1);\n const outfilePath = getOutfilePath(dist, outfileName as string);\n\n const buildSnap = async (path?: string, logMessage?: string) => {\n if (logMessage !== undefined) {\n console.log(logMessage);\n }\n\n try {\n await bundle(src, outfilePath, argv, loadConfig().bundlerCustomizer);\n\n if (manifest) {\n await manifestHandler(argv);\n }\n\n if (shouldEval) {\n await snapEval({ ...argv, bundle: outfilePath });\n }\n } catch (error) {\n logError(\n `Error ${\n path === undefined\n ? 'during initial build'\n : `while processing \"${path}\"`\n }.`,\n error,\n );\n }\n };\n\n chokidar\n .watch(rootDir, {\n ignoreInitial: true,\n ignored: [\n '**/node_modules/**',\n `**/${dist}/**`,\n `**/test/**`,\n `**/tests/**`,\n `**/*.test.js`,\n `**/*.test.ts`,\n /* istanbul ignore next */\n (str: string) => str !== '.' && str.startsWith('.'),\n ],\n })\n\n .on('ready', async () => {\n await buildSnap();\n if (shouldServe) {\n await serve(argv);\n }\n })\n .on('add', (path) => buildSnap(path, `File added: ${path}`))\n .on('change', (path) => buildSnap(path, `File changed: ${path}`))\n .on('unlink', (path) => console.log(`File removed: ${path}`))\n .on('error', (error: Error) => {\n logError(`Watcher error: ${error.message}`, error);\n })\n\n .add(rootDir);\n\n console.log(`Watching '${rootDir}' for changes...`);\n}\n"]}
1
+ {"version":3,"file":"watchHandler.js","sourceRoot":"","sources":["../../../src/cmds/watch/watchHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import chokidar from 'chokidar';\nimport {\n getOutfilePath,\n validateDirPath,\n validateFilePath,\n validateOutfileName,\n} from '@metamask/snap-utils';\nimport { YargsArgs } from '../../types/yargs';\nimport { loadConfig, logError } from '../../utils';\nimport { bundle } from '../build/bundle';\nimport { evalHandler } from '../eval/evalHandler';\nimport { manifestHandler } from '../manifest/manifestHandler';\nimport { serve } from '../serve/serveHandler';\n\n/**\n * Watch a directory and its subdirectories for changes, and build when files\n * are added or changed.\n *\n * Ignores 'node_modules' and dotfiles.\n * Creates destination directory if it doesn't exist.\n *\n * @param argv - Arguments as an object generated by Yargs.\n * @param argv.src - The source file path.\n * @param argv.dist - The output directory path.\n * @param argv.'outfileName' - The output file name.\n */\nexport async function watch(argv: YargsArgs): Promise<void> {\n const {\n dist,\n eval: shouldEval,\n manifest,\n outfileName,\n src,\n serve: shouldServe,\n } = argv;\n if (outfileName) {\n validateOutfileName(outfileName as string);\n }\n await validateFilePath(src);\n await validateDirPath(dist, true);\n const rootDir =\n src.indexOf('/') === -1 ? '.' : src.substring(0, src.lastIndexOf('/') + 1);\n const outfilePath = getOutfilePath(dist, outfileName as string);\n\n const buildSnap = async (path?: string, logMessage?: string) => {\n if (logMessage !== undefined) {\n console.log(logMessage);\n }\n\n try {\n await bundle(src, outfilePath, argv, loadConfig().bundlerCustomizer);\n\n if (manifest) {\n await manifestHandler(argv);\n }\n\n if (shouldEval) {\n await evalHandler({ ...argv, bundle: outfilePath });\n }\n } catch (error) {\n logError(\n `Error ${\n path === undefined\n ? 'during initial build'\n : `while processing \"${path}\"`\n }.`,\n error,\n );\n }\n };\n\n chokidar\n .watch(rootDir, {\n ignoreInitial: true,\n ignored: [\n '**/node_modules/**',\n `**/${dist}/**`,\n `**/test/**`,\n `**/tests/**`,\n `**/*.test.js`,\n `**/*.test.ts`,\n /* istanbul ignore next */\n (str: string) => str !== '.' && str.startsWith('.'),\n ],\n })\n\n .on('ready', async () => {\n await buildSnap();\n if (shouldServe) {\n await serve(argv);\n }\n })\n .on('add', (path) => buildSnap(path, `File added: ${path}`))\n .on('change', (path) => buildSnap(path, `File changed: ${path}`))\n .on('unlink', (path) => console.log(`File removed: ${path}`))\n .on('error', (error: Error) => {\n logError(`Watcher error: ${error.message}`, error);\n })\n\n .add(rootDir);\n\n console.log(`Watching '${rootDir}' for changes...`);\n}\n"]}
@@ -1,3 +1,8 @@
1
1
  {
2
- "extends": "../tsconfig.test.json"
2
+ "extends": "../tsconfig.test.json",
3
+ "references": [
4
+ {
5
+ "path": "../utils"
6
+ }
7
+ ]
3
8
  }
@@ -1,5 +1,3 @@
1
- export * from './fs';
2
1
  export * from './misc';
3
2
  export * from './readline';
4
3
  export * from './snap-config';
5
- export * from './validate-fs';
@@ -14,9 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./fs"), exports);
18
17
  __exportStar(require("./misc"), exports);
19
18
  __exportStar(require("./readline"), exports);
20
19
  __exportStar(require("./snap-config"), exports);
21
- __exportStar(require("./validate-fs"), exports);
22
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uCAAqB;AACrB,yCAAuB;AACvB,6CAA2B;AAC3B,gDAA8B;AAC9B,gDAA8B","sourcesContent":["export * from './fs';\nexport * from './misc';\nexport * from './readline';\nexport * from './snap-config';\nexport * from './validate-fs';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,6CAA2B;AAC3B,gDAA8B","sourcesContent":["export * from './misc';\nexport * from './readline';\nexport * from './snap-config';\n"]}
@@ -1,5 +1,4 @@
1
1
  import { Arguments } from 'yargs';
2
- export declare const deepClone: <T>(input: T) => T;
3
2
  export declare const permRequestKeys: string[];
4
3
  export declare const CONFIG_FILE = "snap.config.js";
5
4
  /**
@@ -3,12 +3,10 @@ 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.trimPathString = exports.writeError = exports.logWarning = exports.logError = exports.sanitizeInputs = exports.booleanStringToBoolean = exports.setSnapGlobals = exports.CONFIG_FILE = exports.permRequestKeys = exports.deepClone = void 0;
6
+ exports.trimPathString = exports.writeError = exports.logWarning = exports.logError = exports.sanitizeInputs = exports.booleanStringToBoolean = exports.setSnapGlobals = exports.CONFIG_FILE = exports.permRequestKeys = void 0;
7
7
  const fs_1 = require("fs");
8
8
  const path_1 = __importDefault(require("path"));
9
9
  const utils_1 = require("@metamask/utils");
10
- const rfdc_1 = __importDefault(require("rfdc"));
11
- exports.deepClone = (0, rfdc_1.default)({ proto: false, circles: false });
12
10
  exports.permRequestKeys = [
13
11
  '@context',
14
12
  'id',