@metamask/snaps-utils 11.7.0 → 12.0.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 (116) hide show
  1. package/CHANGELOG.md +28 -1
  2. package/dist/checksum.cjs +1 -9
  3. package/dist/checksum.cjs.map +1 -1
  4. package/dist/checksum.d.cts.map +1 -1
  5. package/dist/checksum.d.mts.map +1 -1
  6. package/dist/checksum.mjs +2 -10
  7. package/dist/checksum.mjs.map +1 -1
  8. package/dist/handlers/assets-market-data.cjs +2 -2
  9. package/dist/handlers/assets-market-data.cjs.map +1 -1
  10. package/dist/handlers/assets-market-data.d.cts +2 -2
  11. package/dist/handlers/assets-market-data.d.mts +2 -2
  12. package/dist/handlers/assets-market-data.mjs +2 -2
  13. package/dist/handlers/assets-market-data.mjs.map +1 -1
  14. package/dist/iframe.cjs +1 -1
  15. package/dist/iframe.cjs.map +1 -1
  16. package/dist/iframe.d.cts.map +1 -1
  17. package/dist/iframe.d.mts.map +1 -1
  18. package/dist/iframe.mjs +1 -1
  19. package/dist/iframe.mjs.map +1 -1
  20. package/dist/localization.d.cts +1 -0
  21. package/dist/localization.d.cts.map +1 -1
  22. package/dist/localization.d.mts +1 -0
  23. package/dist/localization.d.mts.map +1 -1
  24. package/dist/manifest/manifest.cjs +99 -27
  25. package/dist/manifest/manifest.cjs.map +1 -1
  26. package/dist/manifest/manifest.d.cts +18 -5
  27. package/dist/manifest/manifest.d.cts.map +1 -1
  28. package/dist/manifest/manifest.d.mts +18 -5
  29. package/dist/manifest/manifest.d.mts.map +1 -1
  30. package/dist/manifest/manifest.mjs +106 -28
  31. package/dist/manifest/manifest.mjs.map +1 -1
  32. package/dist/manifest/validation.cjs +1 -0
  33. package/dist/manifest/validation.cjs.map +1 -1
  34. package/dist/manifest/validation.d.cts +2 -0
  35. package/dist/manifest/validation.d.cts.map +1 -1
  36. package/dist/manifest/validation.d.mts +2 -0
  37. package/dist/manifest/validation.d.mts.map +1 -1
  38. package/dist/manifest/validation.mjs +1 -0
  39. package/dist/manifest/validation.mjs.map +1 -1
  40. package/dist/manifest/validator-types.cjs.map +1 -1
  41. package/dist/manifest/validator-types.d.cts +4 -5
  42. package/dist/manifest/validator-types.d.cts.map +1 -1
  43. package/dist/manifest/validator-types.d.mts +4 -5
  44. package/dist/manifest/validator-types.d.mts.map +1 -1
  45. package/dist/manifest/validator-types.mjs.map +1 -1
  46. package/dist/manifest/validator.cjs +1 -1
  47. package/dist/manifest/validator.cjs.map +1 -1
  48. package/dist/manifest/validator.d.cts +3 -3
  49. package/dist/manifest/validator.d.cts.map +1 -1
  50. package/dist/manifest/validator.d.mts +3 -3
  51. package/dist/manifest/validator.d.mts.map +1 -1
  52. package/dist/manifest/validator.mjs +1 -1
  53. package/dist/manifest/validator.mjs.map +1 -1
  54. package/dist/manifest/validators/checksum.cjs +11 -3
  55. package/dist/manifest/validators/checksum.cjs.map +1 -1
  56. package/dist/manifest/validators/checksum.d.cts.map +1 -1
  57. package/dist/manifest/validators/checksum.d.mts.map +1 -1
  58. package/dist/manifest/validators/checksum.mjs +11 -3
  59. package/dist/manifest/validators/checksum.mjs.map +1 -1
  60. package/dist/manifest/validators/icon-declared.cjs +1 -1
  61. package/dist/manifest/validators/icon-declared.cjs.map +1 -1
  62. package/dist/manifest/validators/icon-declared.mjs +1 -1
  63. package/dist/manifest/validators/icon-declared.mjs.map +1 -1
  64. package/dist/manifest/validators/icon-missing.cjs +1 -1
  65. package/dist/manifest/validators/icon-missing.cjs.map +1 -1
  66. package/dist/manifest/validators/icon-missing.d.cts.map +1 -1
  67. package/dist/manifest/validators/icon-missing.d.mts.map +1 -1
  68. package/dist/manifest/validators/icon-missing.mjs +1 -1
  69. package/dist/manifest/validators/icon-missing.mjs.map +1 -1
  70. package/dist/manifest/validators/is-snap-manifest.cjs +1 -1
  71. package/dist/manifest/validators/is-snap-manifest.cjs.map +1 -1
  72. package/dist/manifest/validators/is-snap-manifest.mjs +1 -1
  73. package/dist/manifest/validators/is-snap-manifest.mjs.map +1 -1
  74. package/dist/manifest/validators/manifest-localization.cjs +1 -1
  75. package/dist/manifest/validators/manifest-localization.cjs.map +1 -1
  76. package/dist/manifest/validators/manifest-localization.mjs +1 -1
  77. package/dist/manifest/validators/manifest-localization.mjs.map +1 -1
  78. package/dist/manifest/validators/package-name-match.cjs +6 -2
  79. package/dist/manifest/validators/package-name-match.cjs.map +1 -1
  80. package/dist/manifest/validators/package-name-match.d.cts.map +1 -1
  81. package/dist/manifest/validators/package-name-match.d.mts.map +1 -1
  82. package/dist/manifest/validators/package-name-match.mjs +6 -2
  83. package/dist/manifest/validators/package-name-match.mjs.map +1 -1
  84. package/dist/manifest/validators/platform-version.cjs +4 -4
  85. package/dist/manifest/validators/platform-version.cjs.map +1 -1
  86. package/dist/manifest/validators/platform-version.d.cts.map +1 -1
  87. package/dist/manifest/validators/platform-version.d.mts.map +1 -1
  88. package/dist/manifest/validators/platform-version.mjs +4 -4
  89. package/dist/manifest/validators/platform-version.mjs.map +1 -1
  90. package/dist/manifest/validators/production-platform-version.cjs +1 -1
  91. package/dist/manifest/validators/production-platform-version.cjs.map +1 -1
  92. package/dist/manifest/validators/production-platform-version.d.cts.map +1 -1
  93. package/dist/manifest/validators/production-platform-version.d.mts.map +1 -1
  94. package/dist/manifest/validators/production-platform-version.mjs +1 -1
  95. package/dist/manifest/validators/production-platform-version.mjs.map +1 -1
  96. package/dist/manifest/validators/repository-match.cjs +2 -2
  97. package/dist/manifest/validators/repository-match.cjs.map +1 -1
  98. package/dist/manifest/validators/repository-match.d.cts.map +1 -1
  99. package/dist/manifest/validators/repository-match.d.mts.map +1 -1
  100. package/dist/manifest/validators/repository-match.mjs +2 -2
  101. package/dist/manifest/validators/repository-match.mjs.map +1 -1
  102. package/dist/manifest/validators/unused-exports.cjs +3 -3
  103. package/dist/manifest/validators/unused-exports.cjs.map +1 -1
  104. package/dist/manifest/validators/unused-exports.mjs +3 -3
  105. package/dist/manifest/validators/unused-exports.mjs.map +1 -1
  106. package/dist/manifest/validators/version-match.cjs +2 -2
  107. package/dist/manifest/validators/version-match.cjs.map +1 -1
  108. package/dist/manifest/validators/version-match.mjs +2 -2
  109. package/dist/manifest/validators/version-match.mjs.map +1 -1
  110. package/dist/types.cjs.map +1 -1
  111. package/dist/types.d.cts +66 -1
  112. package/dist/types.d.cts.map +1 -1
  113. package/dist/types.d.mts +66 -1
  114. package/dist/types.d.mts.map +1 -1
  115. package/dist/types.mjs.map +1 -1
  116. package/package.json +5 -6
@@ -1 +1 @@
1
- {"version":3,"file":"validation.cjs","sourceRoot":"","sources":["../../src/manifest/validation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SupportedCurve } from '@metamask/key-tree';\nimport { isValidBIP32PathSegment } from '@metamask/key-tree';\nimport type { EmptyObject, InitialPermissions } from '@metamask/snaps-sdk';\nimport type { Describe, Infer, Struct } from '@metamask/superstruct';\nimport {\n array,\n boolean,\n create,\n enums,\n integer,\n is,\n literal,\n object,\n optional,\n refine,\n record,\n size,\n string,\n type,\n union,\n intersection,\n} from '@metamask/superstruct';\nimport {\n assertStruct,\n ChecksumStruct,\n VersionStruct,\n isValidSemVerRange,\n inMilliseconds,\n Duration,\n CaipChainIdStruct,\n} from '@metamask/utils';\n\nimport { isEqual } from '../array';\nimport { CronjobSpecificationArrayStruct } from '../cronjob';\nimport { SIP_6_MAGIC_VALUE, STATE_ENCRYPTION_MAGIC_VALUE } from '../entropy';\nimport { KeyringOriginsStruct, RpcOriginsStruct } from '../json-rpc';\nimport { SnapIdStruct } from '../snaps';\nimport { mergeStructs, type InferMatching } from '../structs';\nimport { NameStruct, NpmSnapFileNames, uri } from '../types';\n\n// BIP-43 purposes that cannot be used for entropy derivation. These are in the\n// string form, ending with `'`.\nconst FORBIDDEN_PURPOSES: string[] = [\n SIP_6_MAGIC_VALUE,\n STATE_ENCRYPTION_MAGIC_VALUE,\n];\n\nexport const FORBIDDEN_COIN_TYPES: number[] = [60];\nconst FORBIDDEN_PATHS: string[][] = FORBIDDEN_COIN_TYPES.map((coinType) => [\n 'm',\n \"44'\",\n `${coinType}'`,\n]);\n\nexport const Bip32PathStruct = refine(\n array(string()),\n 'BIP-32 path',\n (path: string[]) => {\n if (path.length === 0) {\n return 'Path must be a non-empty BIP-32 derivation path array';\n }\n\n if (path[0] !== 'm') {\n return 'Path must start with \"m\".';\n }\n\n if (path.length < 3) {\n return 'Paths must have a length of at least three.';\n }\n\n if (path.slice(1).some((part) => !isValidBIP32PathSegment(part))) {\n return 'Path must be a valid BIP-32 derivation path array.';\n }\n\n if (FORBIDDEN_PURPOSES.includes(path[1])) {\n return `The purpose \"${path[1]}\" is not allowed for entropy derivation.`;\n }\n\n if (\n FORBIDDEN_PATHS.some((forbiddenPath) =>\n isEqual(path.slice(0, forbiddenPath.length), forbiddenPath),\n )\n ) {\n return `The path \"${path.join(\n '/',\n )}\" is not allowed for entropy derivation.`;\n }\n\n return true;\n },\n);\n\nexport const bip32entropy = <\n Type extends { path: string[]; curve: string },\n Schema,\n>(\n struct: Struct<Type, Schema>,\n) =>\n refine(struct, 'BIP-32 entropy', (value) => {\n if (\n value.curve === 'ed25519' &&\n value.path.slice(1).some((part) => !part.endsWith(\"'\"))\n ) {\n return 'Ed25519 does not support unhardened paths.';\n }\n\n return true;\n });\n\nexport const CurveStruct: Describe<SupportedCurve> = enums([\n 'ed25519',\n 'secp256k1',\n 'ed25519Bip32',\n]);\n\n// Used outside @metamask/snap-utils\nexport const Bip32EntropyStruct = bip32entropy(\n type({\n path: Bip32PathStruct,\n curve: CurveStruct,\n }),\n);\n\nexport type Bip32Entropy = Infer<typeof Bip32EntropyStruct>;\n\nexport const SnapGetBip32EntropyPermissionsStruct = size(\n array(Bip32EntropyStruct),\n 1,\n Infinity,\n);\n\nexport const SemVerRangeStruct = refine(string(), 'SemVer range', (value) => {\n if (isValidSemVerRange(value)) {\n return true;\n }\n return 'Expected a valid SemVer range.';\n});\n\nexport const SnapIdsStruct = refine(\n record(SnapIdStruct, object({ version: optional(SemVerRangeStruct) })),\n 'SnapIds',\n (value) => {\n if (Object.keys(value).length === 0) {\n return false;\n }\n\n return true;\n },\n);\n\nexport type SnapIds = Infer<typeof SnapIdsStruct>;\n\nexport const ChainIdsStruct = size(array(CaipChainIdStruct), 1, Infinity);\n\nexport const LookupMatchersStruct = union([\n object({\n tlds: size(array(string()), 1, Infinity),\n }),\n object({\n schemes: size(array(string()), 1, Infinity),\n }),\n object({\n tlds: size(array(string()), 1, Infinity),\n schemes: size(array(string()), 1, Infinity),\n }),\n]);\n\nexport const MINIMUM_REQUEST_TIMEOUT = inMilliseconds(5, Duration.Second);\nexport const MAXIMUM_REQUEST_TIMEOUT = inMilliseconds(3, Duration.Minute);\n\nexport const MaxRequestTimeStruct = size(\n integer(),\n MINIMUM_REQUEST_TIMEOUT,\n MAXIMUM_REQUEST_TIMEOUT,\n);\n\nexport const ProtocolScopesStruct = record(\n CaipChainIdStruct,\n object({ methods: array(string()) }),\n);\n\n// Utility type to union with for all handler structs\nexport const HandlerCaveatsStruct = object({\n maxRequestTime: optional(MaxRequestTimeStruct),\n});\n\nexport type HandlerCaveats = Infer<typeof HandlerCaveatsStruct>;\n\nexport const EmptyObjectStruct = object<EmptyObject>({}) as unknown as Struct<\n EmptyObject,\n null\n>;\n\n/* eslint-disable @typescript-eslint/naming-convention */\nexport const PermissionsStruct: Describe<InitialPermissions> = type({\n 'endowment:assets': optional(\n mergeStructs(HandlerCaveatsStruct, object({ scopes: ChainIdsStruct })),\n ),\n 'endowment:cronjob': optional(\n mergeStructs(\n HandlerCaveatsStruct,\n object({ jobs: optional(CronjobSpecificationArrayStruct) }),\n ),\n ),\n 'endowment:ethereum-provider': optional(EmptyObjectStruct),\n 'endowment:keyring': optional(\n mergeStructs(HandlerCaveatsStruct, KeyringOriginsStruct),\n ),\n 'endowment:protocol': optional(\n mergeStructs(\n HandlerCaveatsStruct,\n object({ scopes: ProtocolScopesStruct }),\n ),\n ),\n 'endowment:lifecycle-hooks': optional(HandlerCaveatsStruct),\n 'endowment:name-lookup': optional(\n mergeStructs(\n HandlerCaveatsStruct,\n object({\n chains: optional(ChainIdsStruct),\n matchers: optional(LookupMatchersStruct),\n }),\n ),\n ),\n 'endowment:network-access': optional(EmptyObjectStruct),\n 'endowment:page-home': optional(HandlerCaveatsStruct),\n 'endowment:rpc': optional(\n mergeStructs(HandlerCaveatsStruct, RpcOriginsStruct),\n ),\n 'endowment:signature-insight': optional(\n mergeStructs(\n HandlerCaveatsStruct,\n object({\n allowSignatureOrigin: optional(boolean()),\n }),\n ),\n ),\n 'endowment:transaction-insight': optional(\n mergeStructs(\n HandlerCaveatsStruct,\n object({\n allowTransactionOrigin: optional(boolean()),\n }),\n ),\n ),\n 'endowment:webassembly': optional(EmptyObjectStruct),\n snap_dialog: optional(EmptyObjectStruct),\n snap_manageState: optional(EmptyObjectStruct),\n snap_manageAccounts: optional(EmptyObjectStruct),\n snap_notify: optional(EmptyObjectStruct),\n snap_getBip32Entropy: optional(SnapGetBip32EntropyPermissionsStruct),\n snap_getBip32PublicKey: optional(SnapGetBip32EntropyPermissionsStruct),\n snap_getBip44Entropy: optional(\n size(\n array(object({ coinType: size(integer(), 0, 2 ** 32 - 1) })),\n 1,\n Infinity,\n ),\n ),\n snap_getEntropy: optional(EmptyObjectStruct),\n snap_getLocale: optional(EmptyObjectStruct),\n wallet_snap: optional(SnapIdsStruct),\n});\n/* eslint-enable @typescript-eslint/naming-convention */\n\nexport type SnapPermissions = InferMatching<\n typeof PermissionsStruct,\n InitialPermissions\n>;\n\nexport const SnapAuxiliaryFilesStruct = array(string());\n\n/**\n * @deprecated Use SnapAuxiliaryFilesStruct instead. This was a typo that has been fixed.\n */\nexport const SnapAuxilaryFilesStruct = SnapAuxiliaryFilesStruct;\n\nexport const InitialConnectionsStruct = record(\n intersection([string(), uri()]),\n object({}),\n);\n\nexport type InitialConnections = Infer<typeof InitialConnectionsStruct>;\n\nexport const SnapManifestStruct = object({\n version: VersionStruct,\n description: size(string(), 1, 280),\n proposedName: size(string(), 1, 214),\n repository: optional(\n type({\n type: size(string(), 1, Infinity),\n url: size(string(), 1, Infinity),\n }),\n ),\n source: object({\n shasum: ChecksumStruct,\n location: object({\n npm: object({\n filePath: size(string(), 1, Infinity),\n iconPath: optional(size(string(), 1, Infinity)),\n packageName: NameStruct,\n registry: union([\n literal('https://registry.npmjs.org'),\n literal('https://registry.npmjs.org/'),\n ]),\n }),\n }),\n files: optional(SnapAuxiliaryFilesStruct),\n locales: optional(SnapAuxiliaryFilesStruct),\n }),\n initialConnections: optional(InitialConnectionsStruct),\n initialPermissions: PermissionsStruct,\n manifestVersion: literal('0.1'),\n platformVersion: optional(VersionStruct),\n $schema: optional(string()), // enables JSON-Schema linting in VSC and other IDEs\n});\n\nexport type SnapManifest = Infer<typeof SnapManifestStruct>;\n\n/**\n * Check if the given value is a valid {@link SnapManifest} object.\n *\n * @param value - The value to check.\n * @returns Whether the value is a valid {@link SnapManifest} object.\n */\nexport function isSnapManifest(value: unknown): value is SnapManifest {\n return is(value, SnapManifestStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link SnapManifest} object.\n *\n * @param value - The value to check.\n * @throws If the value is not a valid {@link SnapManifest} object.\n */\nexport function assertIsSnapManifest(\n value: unknown,\n): asserts value is SnapManifest {\n assertStruct(\n value,\n SnapManifestStruct,\n `\"${NpmSnapFileNames.Manifest}\" is invalid`,\n );\n}\n\n/**\n * Creates a {@link SnapManifest} object from JSON.\n *\n * @param value - The value to check.\n * @throws If the value cannot be coerced to a {@link SnapManifest} object.\n * @returns The created {@link SnapManifest} object.\n */\nexport function createSnapManifest(value: unknown): SnapManifest {\n // TODO: Add a utility to prefix these errors similar to assertStruct\n return create(value, SnapManifestStruct);\n}\n"]}
1
+ {"version":3,"file":"validation.cjs","sourceRoot":"","sources":["../../src/manifest/validation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SupportedCurve } from '@metamask/key-tree';\nimport { isValidBIP32PathSegment } from '@metamask/key-tree';\nimport type { EmptyObject, InitialPermissions } from '@metamask/snaps-sdk';\nimport type { Describe, Infer, Struct } from '@metamask/superstruct';\nimport {\n array,\n boolean,\n create,\n enums,\n integer,\n is,\n literal,\n object,\n optional,\n refine,\n record,\n size,\n string,\n type,\n union,\n intersection,\n} from '@metamask/superstruct';\nimport {\n assertStruct,\n ChecksumStruct,\n VersionStruct,\n isValidSemVerRange,\n inMilliseconds,\n Duration,\n CaipChainIdStruct,\n} from '@metamask/utils';\n\nimport { isEqual } from '../array';\nimport { CronjobSpecificationArrayStruct } from '../cronjob';\nimport { SIP_6_MAGIC_VALUE, STATE_ENCRYPTION_MAGIC_VALUE } from '../entropy';\nimport { KeyringOriginsStruct, RpcOriginsStruct } from '../json-rpc';\nimport { SnapIdStruct } from '../snaps';\nimport { mergeStructs, type InferMatching } from '../structs';\nimport { NameStruct, NpmSnapFileNames, uri } from '../types';\n\n// BIP-43 purposes that cannot be used for entropy derivation. These are in the\n// string form, ending with `'`.\nconst FORBIDDEN_PURPOSES: string[] = [\n SIP_6_MAGIC_VALUE,\n STATE_ENCRYPTION_MAGIC_VALUE,\n];\n\nexport const FORBIDDEN_COIN_TYPES: number[] = [60];\nconst FORBIDDEN_PATHS: string[][] = FORBIDDEN_COIN_TYPES.map((coinType) => [\n 'm',\n \"44'\",\n `${coinType}'`,\n]);\n\nexport const Bip32PathStruct = refine(\n array(string()),\n 'BIP-32 path',\n (path: string[]) => {\n if (path.length === 0) {\n return 'Path must be a non-empty BIP-32 derivation path array';\n }\n\n if (path[0] !== 'm') {\n return 'Path must start with \"m\".';\n }\n\n if (path.length < 3) {\n return 'Paths must have a length of at least three.';\n }\n\n if (path.slice(1).some((part) => !isValidBIP32PathSegment(part))) {\n return 'Path must be a valid BIP-32 derivation path array.';\n }\n\n if (FORBIDDEN_PURPOSES.includes(path[1])) {\n return `The purpose \"${path[1]}\" is not allowed for entropy derivation.`;\n }\n\n if (\n FORBIDDEN_PATHS.some((forbiddenPath) =>\n isEqual(path.slice(0, forbiddenPath.length), forbiddenPath),\n )\n ) {\n return `The path \"${path.join(\n '/',\n )}\" is not allowed for entropy derivation.`;\n }\n\n return true;\n },\n);\n\nexport const bip32entropy = <\n Type extends { path: string[]; curve: string },\n Schema,\n>(\n struct: Struct<Type, Schema>,\n) =>\n refine(struct, 'BIP-32 entropy', (value) => {\n if (\n value.curve === 'ed25519' &&\n value.path.slice(1).some((part) => !part.endsWith(\"'\"))\n ) {\n return 'Ed25519 does not support unhardened paths.';\n }\n\n return true;\n });\n\nexport const CurveStruct: Describe<SupportedCurve> = enums([\n 'ed25519',\n 'secp256k1',\n 'ed25519Bip32',\n]);\n\n// Used outside @metamask/snap-utils\nexport const Bip32EntropyStruct = bip32entropy(\n type({\n path: Bip32PathStruct,\n curve: CurveStruct,\n }),\n);\n\nexport type Bip32Entropy = Infer<typeof Bip32EntropyStruct>;\n\nexport const SnapGetBip32EntropyPermissionsStruct = size(\n array(Bip32EntropyStruct),\n 1,\n Infinity,\n);\n\nexport const SemVerRangeStruct = refine(string(), 'SemVer range', (value) => {\n if (isValidSemVerRange(value)) {\n return true;\n }\n return 'Expected a valid SemVer range.';\n});\n\nexport const SnapIdsStruct = refine(\n record(SnapIdStruct, object({ version: optional(SemVerRangeStruct) })),\n 'SnapIds',\n (value) => {\n if (Object.keys(value).length === 0) {\n return false;\n }\n\n return true;\n },\n);\n\nexport type SnapIds = Infer<typeof SnapIdsStruct>;\n\nexport const ChainIdsStruct = size(array(CaipChainIdStruct), 1, Infinity);\n\nexport const LookupMatchersStruct = union([\n object({\n tlds: size(array(string()), 1, Infinity),\n }),\n object({\n schemes: size(array(string()), 1, Infinity),\n }),\n object({\n tlds: size(array(string()), 1, Infinity),\n schemes: size(array(string()), 1, Infinity),\n }),\n]);\n\nexport const MINIMUM_REQUEST_TIMEOUT = inMilliseconds(5, Duration.Second);\nexport const MAXIMUM_REQUEST_TIMEOUT = inMilliseconds(3, Duration.Minute);\n\nexport const MaxRequestTimeStruct = size(\n integer(),\n MINIMUM_REQUEST_TIMEOUT,\n MAXIMUM_REQUEST_TIMEOUT,\n);\n\nexport const ProtocolScopesStruct = record(\n CaipChainIdStruct,\n object({ methods: array(string()) }),\n);\n\n// Utility type to union with for all handler structs\nexport const HandlerCaveatsStruct = object({\n maxRequestTime: optional(MaxRequestTimeStruct),\n});\n\nexport type HandlerCaveats = Infer<typeof HandlerCaveatsStruct>;\n\nexport const EmptyObjectStruct = object<EmptyObject>({}) as unknown as Struct<\n EmptyObject,\n null\n>;\n\n/* eslint-disable @typescript-eslint/naming-convention */\nexport const PermissionsStruct: Describe<InitialPermissions> = type({\n 'endowment:assets': optional(\n mergeStructs(HandlerCaveatsStruct, object({ scopes: ChainIdsStruct })),\n ),\n 'endowment:cronjob': optional(\n mergeStructs(\n HandlerCaveatsStruct,\n object({ jobs: optional(CronjobSpecificationArrayStruct) }),\n ),\n ),\n 'endowment:ethereum-provider': optional(EmptyObjectStruct),\n 'endowment:keyring': optional(\n mergeStructs(HandlerCaveatsStruct, KeyringOriginsStruct),\n ),\n 'endowment:protocol': optional(\n mergeStructs(\n HandlerCaveatsStruct,\n object({ scopes: ProtocolScopesStruct }),\n ),\n ),\n 'endowment:lifecycle-hooks': optional(HandlerCaveatsStruct),\n 'endowment:name-lookup': optional(\n mergeStructs(\n HandlerCaveatsStruct,\n object({\n chains: optional(ChainIdsStruct),\n matchers: optional(LookupMatchersStruct),\n }),\n ),\n ),\n 'endowment:network-access': optional(EmptyObjectStruct),\n 'endowment:page-home': optional(HandlerCaveatsStruct),\n 'endowment:rpc': optional(\n mergeStructs(HandlerCaveatsStruct, RpcOriginsStruct),\n ),\n 'endowment:signature-insight': optional(\n mergeStructs(\n HandlerCaveatsStruct,\n object({\n allowSignatureOrigin: optional(boolean()),\n }),\n ),\n ),\n 'endowment:transaction-insight': optional(\n mergeStructs(\n HandlerCaveatsStruct,\n object({\n allowTransactionOrigin: optional(boolean()),\n }),\n ),\n ),\n 'endowment:webassembly': optional(EmptyObjectStruct),\n snap_dialog: optional(EmptyObjectStruct),\n snap_manageState: optional(EmptyObjectStruct),\n snap_manageAccounts: optional(EmptyObjectStruct),\n snap_notify: optional(EmptyObjectStruct),\n snap_getBip32Entropy: optional(SnapGetBip32EntropyPermissionsStruct),\n snap_getBip32PublicKey: optional(SnapGetBip32EntropyPermissionsStruct),\n snap_getBip44Entropy: optional(\n size(\n array(object({ coinType: size(integer(), 0, 2 ** 32 - 1) })),\n 1,\n Infinity,\n ),\n ),\n snap_getEntropy: optional(EmptyObjectStruct),\n snap_getLocale: optional(EmptyObjectStruct),\n wallet_snap: optional(SnapIdsStruct),\n});\n/* eslint-enable @typescript-eslint/naming-convention */\n\nexport type SnapPermissions = InferMatching<\n typeof PermissionsStruct,\n InitialPermissions\n>;\n\nexport const SnapAuxiliaryFilesStruct = array(string());\n\n/**\n * @deprecated Use SnapAuxiliaryFilesStruct instead. This was a typo that has been fixed.\n */\nexport const SnapAuxilaryFilesStruct = SnapAuxiliaryFilesStruct;\n\nexport const InitialConnectionsStruct = record(\n intersection([string(), uri()]),\n object({}),\n);\n\nexport type InitialConnections = Infer<typeof InitialConnectionsStruct>;\n\nexport const SnapManifestStruct = object({\n extends: optional(size(string(), 1, Infinity)),\n version: VersionStruct,\n description: size(string(), 1, 280),\n proposedName: size(string(), 1, 214),\n repository: optional(\n type({\n type: size(string(), 1, Infinity),\n url: size(string(), 1, Infinity),\n }),\n ),\n source: object({\n shasum: ChecksumStruct,\n location: object({\n npm: object({\n filePath: size(string(), 1, Infinity),\n iconPath: optional(size(string(), 1, Infinity)),\n packageName: NameStruct,\n registry: union([\n literal('https://registry.npmjs.org'),\n literal('https://registry.npmjs.org/'),\n ]),\n }),\n }),\n files: optional(SnapAuxiliaryFilesStruct),\n locales: optional(SnapAuxiliaryFilesStruct),\n }),\n initialConnections: optional(InitialConnectionsStruct),\n initialPermissions: PermissionsStruct,\n manifestVersion: literal('0.1'),\n platformVersion: optional(VersionStruct),\n $schema: optional(string()), // enables JSON-Schema linting in VSC and other IDEs\n});\n\nexport type SnapManifest = Infer<typeof SnapManifestStruct>;\n\n/**\n * Check if the given value is a valid {@link SnapManifest} object.\n *\n * @param value - The value to check.\n * @returns Whether the value is a valid {@link SnapManifest} object.\n */\nexport function isSnapManifest(value: unknown): value is SnapManifest {\n return is(value, SnapManifestStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link SnapManifest} object.\n *\n * @param value - The value to check.\n * @throws If the value is not a valid {@link SnapManifest} object.\n */\nexport function assertIsSnapManifest(\n value: unknown,\n): asserts value is SnapManifest {\n assertStruct(\n value,\n SnapManifestStruct,\n `\"${NpmSnapFileNames.Manifest}\" is invalid`,\n );\n}\n\n/**\n * Creates a {@link SnapManifest} object from JSON.\n *\n * @param value - The value to check.\n * @throws If the value cannot be coerced to a {@link SnapManifest} object.\n * @returns The created {@link SnapManifest} object.\n */\nexport function createSnapManifest(value: unknown): SnapManifest {\n // TODO: Add a utility to prefix these errors similar to assertStruct\n return create(value, SnapManifestStruct);\n}\n"]}
@@ -132,6 +132,7 @@ export declare const SnapManifestStruct: Struct<{
132
132
  wallet_snap: Record<string, import("@metamask/snaps-sdk").RequestedSnap>;
133
133
  }>;
134
134
  manifestVersion: "0.1";
135
+ extends?: string | undefined;
135
136
  repository?: {
136
137
  type: string;
137
138
  url: string;
@@ -140,6 +141,7 @@ export declare const SnapManifestStruct: Struct<{
140
141
  platformVersion?: import("@metamask/utils").SemVerVersion | undefined;
141
142
  $schema?: string | undefined;
142
143
  }, {
144
+ extends: Struct<string | undefined, null>;
143
145
  version: Struct<import("@metamask/utils").SemVerVersion, null>;
144
146
  description: Struct<string, null>;
145
147
  proposedName: Struct<string, null>;
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.cts","sourceRoot":"","sources":["../../src/manifest/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,2BAA2B;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,4BAA4B;AAC3E,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,8BAA8B;AAkCrE,OAAO,EAAgB,KAAK,aAAa,EAAE,uBAAmB;AAU9D,eAAO,MAAM,oBAAoB,EAAE,MAAM,EAAS,CAAC;AAOnD,eAAO,MAAM,eAAe,wCAoC3B,CAAC;AAEF,eAAO,MAAM,YAAY;UACF,MAAM,EAAE;WAAS,MAAM;gEAc1C,CAAC;AAEL,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,cAAc,CAI/C,CAAC;AAGH,eAAO,MAAM,kBAAkB;;;;;;EAK9B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE5D,eAAO,MAAM,oCAAoC;;;;;;;;;GAIhD,CAAC;AAEF,eAAO,MAAM,iBAAiB,sBAK5B,CAAC;AAEH,eAAO,MAAM,aAAa;;SAUzB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAElD,eAAO,MAAM,cAAc,sEAA8C,CAAC;AAE1E,eAAO,MAAM,oBAAoB;;;;;;;QAW/B,CAAC;AAEH,eAAO,MAAM,uBAAuB,QAAqC,CAAC;AAC1E,eAAO,MAAM,uBAAuB,QAAqC,CAAC;AAE1E,eAAO,MAAM,oBAAoB,sBAIhC,CAAC;AAEF,eAAO,MAAM,oBAAoB;;SAGhC,CAAC;AAGF,eAAO,MAAM,oBAAoB;;;;EAE/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEhE,eAAO,MAAM,iBAAiB,2BAG7B,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,kBAAkB,CAoEzD,CAAC;AAGH,MAAM,MAAM,eAAe,GAAG,aAAa,CACzC,OAAO,iBAAiB,EACxB,kBAAkB,CACnB,CAAC;AAEF,eAAO,MAAM,wBAAwB,wCAAkB,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,uBAAuB,wCAA2B,CAAC;AAEhE,eAAO,MAAM,wBAAwB,kCAGpC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAExE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+B7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE5D;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,KAAK,IAAI,YAAY,CAM/B;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAG/D"}
1
+ {"version":3,"file":"validation.d.cts","sourceRoot":"","sources":["../../src/manifest/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,2BAA2B;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,4BAA4B;AAC3E,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,8BAA8B;AAkCrE,OAAO,EAAgB,KAAK,aAAa,EAAE,uBAAmB;AAU9D,eAAO,MAAM,oBAAoB,EAAE,MAAM,EAAS,CAAC;AAOnD,eAAO,MAAM,eAAe,wCAoC3B,CAAC;AAEF,eAAO,MAAM,YAAY;UACF,MAAM,EAAE;WAAS,MAAM;gEAc1C,CAAC;AAEL,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,cAAc,CAI/C,CAAC;AAGH,eAAO,MAAM,kBAAkB;;;;;;EAK9B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE5D,eAAO,MAAM,oCAAoC;;;;;;;;;GAIhD,CAAC;AAEF,eAAO,MAAM,iBAAiB,sBAK5B,CAAC;AAEH,eAAO,MAAM,aAAa;;SAUzB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAElD,eAAO,MAAM,cAAc,sEAA8C,CAAC;AAE1E,eAAO,MAAM,oBAAoB;;;;;;;QAW/B,CAAC;AAEH,eAAO,MAAM,uBAAuB,QAAqC,CAAC;AAC1E,eAAO,MAAM,uBAAuB,QAAqC,CAAC;AAE1E,eAAO,MAAM,oBAAoB,sBAIhC,CAAC;AAEF,eAAO,MAAM,oBAAoB;;SAGhC,CAAC;AAGF,eAAO,MAAM,oBAAoB;;;;EAE/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEhE,eAAO,MAAM,iBAAiB,2BAG7B,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,kBAAkB,CAoEzD,CAAC;AAGH,MAAM,MAAM,eAAe,GAAG,aAAa,CACzC,OAAO,iBAAiB,EACxB,kBAAkB,CACnB,CAAC;AAEF,eAAO,MAAM,wBAAwB,wCAAkB,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,uBAAuB,wCAA2B,CAAC;AAEhE,eAAO,MAAM,wBAAwB,kCAGpC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAExE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgC7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE5D;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,KAAK,IAAI,YAAY,CAM/B;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAG/D"}
@@ -132,6 +132,7 @@ export declare const SnapManifestStruct: Struct<{
132
132
  wallet_snap: Record<string, import("@metamask/snaps-sdk").RequestedSnap>;
133
133
  }>;
134
134
  manifestVersion: "0.1";
135
+ extends?: string | undefined;
135
136
  repository?: {
136
137
  type: string;
137
138
  url: string;
@@ -140,6 +141,7 @@ export declare const SnapManifestStruct: Struct<{
140
141
  platformVersion?: import("@metamask/utils").SemVerVersion | undefined;
141
142
  $schema?: string | undefined;
142
143
  }, {
144
+ extends: Struct<string | undefined, null>;
143
145
  version: Struct<import("@metamask/utils").SemVerVersion, null>;
144
146
  description: Struct<string, null>;
145
147
  proposedName: Struct<string, null>;
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.mts","sourceRoot":"","sources":["../../src/manifest/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,2BAA2B;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,4BAA4B;AAC3E,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,8BAA8B;AAkCrE,OAAO,EAAgB,KAAK,aAAa,EAAE,uBAAmB;AAU9D,eAAO,MAAM,oBAAoB,EAAE,MAAM,EAAS,CAAC;AAOnD,eAAO,MAAM,eAAe,wCAoC3B,CAAC;AAEF,eAAO,MAAM,YAAY;UACF,MAAM,EAAE;WAAS,MAAM;gEAc1C,CAAC;AAEL,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,cAAc,CAI/C,CAAC;AAGH,eAAO,MAAM,kBAAkB;;;;;;EAK9B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE5D,eAAO,MAAM,oCAAoC;;;;;;;;;GAIhD,CAAC;AAEF,eAAO,MAAM,iBAAiB,sBAK5B,CAAC;AAEH,eAAO,MAAM,aAAa;;SAUzB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAElD,eAAO,MAAM,cAAc,sEAA8C,CAAC;AAE1E,eAAO,MAAM,oBAAoB;;;;;;;QAW/B,CAAC;AAEH,eAAO,MAAM,uBAAuB,QAAqC,CAAC;AAC1E,eAAO,MAAM,uBAAuB,QAAqC,CAAC;AAE1E,eAAO,MAAM,oBAAoB,sBAIhC,CAAC;AAEF,eAAO,MAAM,oBAAoB;;SAGhC,CAAC;AAGF,eAAO,MAAM,oBAAoB;;;;EAE/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEhE,eAAO,MAAM,iBAAiB,2BAG7B,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,kBAAkB,CAoEzD,CAAC;AAGH,MAAM,MAAM,eAAe,GAAG,aAAa,CACzC,OAAO,iBAAiB,EACxB,kBAAkB,CACnB,CAAC;AAEF,eAAO,MAAM,wBAAwB,wCAAkB,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,uBAAuB,wCAA2B,CAAC;AAEhE,eAAO,MAAM,wBAAwB,kCAGpC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAExE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+B7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE5D;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,KAAK,IAAI,YAAY,CAM/B;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAG/D"}
1
+ {"version":3,"file":"validation.d.mts","sourceRoot":"","sources":["../../src/manifest/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,2BAA2B;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,4BAA4B;AAC3E,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,8BAA8B;AAkCrE,OAAO,EAAgB,KAAK,aAAa,EAAE,uBAAmB;AAU9D,eAAO,MAAM,oBAAoB,EAAE,MAAM,EAAS,CAAC;AAOnD,eAAO,MAAM,eAAe,wCAoC3B,CAAC;AAEF,eAAO,MAAM,YAAY;UACF,MAAM,EAAE;WAAS,MAAM;gEAc1C,CAAC;AAEL,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,cAAc,CAI/C,CAAC;AAGH,eAAO,MAAM,kBAAkB;;;;;;EAK9B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE5D,eAAO,MAAM,oCAAoC;;;;;;;;;GAIhD,CAAC;AAEF,eAAO,MAAM,iBAAiB,sBAK5B,CAAC;AAEH,eAAO,MAAM,aAAa;;SAUzB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAElD,eAAO,MAAM,cAAc,sEAA8C,CAAC;AAE1E,eAAO,MAAM,oBAAoB;;;;;;;QAW/B,CAAC;AAEH,eAAO,MAAM,uBAAuB,QAAqC,CAAC;AAC1E,eAAO,MAAM,uBAAuB,QAAqC,CAAC;AAE1E,eAAO,MAAM,oBAAoB,sBAIhC,CAAC;AAEF,eAAO,MAAM,oBAAoB;;SAGhC,CAAC;AAGF,eAAO,MAAM,oBAAoB;;;;EAE/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEhE,eAAO,MAAM,iBAAiB,2BAG7B,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,kBAAkB,CAoEzD,CAAC;AAGH,MAAM,MAAM,eAAe,GAAG,aAAa,CACzC,OAAO,iBAAiB,EACxB,kBAAkB,CACnB,CAAC;AAEF,eAAO,MAAM,wBAAwB,wCAAkB,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,uBAAuB,wCAA2B,CAAC;AAEhE,eAAO,MAAM,wBAAwB,kCAGpC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAExE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgC7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE5D;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,KAAK,IAAI,YAAY,CAM/B;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAG/D"}
@@ -133,6 +133,7 @@ export const SnapAuxiliaryFilesStruct = array(string());
133
133
  export const SnapAuxilaryFilesStruct = SnapAuxiliaryFilesStruct;
134
134
  export const InitialConnectionsStruct = record(intersection([string(), uri()]), object({}));
135
135
  export const SnapManifestStruct = object({
136
+ extends: optional(size(string(), 1, Infinity)),
136
137
  version: VersionStruct,
137
138
  description: size(string(), 1, 280),
138
139
  proposedName: size(string(), 1, 214),
@@ -1 +1 @@
1
- {"version":3,"file":"validation.mjs","sourceRoot":"","sources":["../../src/manifest/validation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SupportedCurve } from '@metamask/key-tree';\nimport { isValidBIP32PathSegment } from '@metamask/key-tree';\nimport type { EmptyObject, InitialPermissions } from '@metamask/snaps-sdk';\nimport type { Describe, Infer, Struct } from '@metamask/superstruct';\nimport {\n array,\n boolean,\n create,\n enums,\n integer,\n is,\n literal,\n object,\n optional,\n refine,\n record,\n size,\n string,\n type,\n union,\n intersection,\n} from '@metamask/superstruct';\nimport {\n assertStruct,\n ChecksumStruct,\n VersionStruct,\n isValidSemVerRange,\n inMilliseconds,\n Duration,\n CaipChainIdStruct,\n} from '@metamask/utils';\n\nimport { isEqual } from '../array';\nimport { CronjobSpecificationArrayStruct } from '../cronjob';\nimport { SIP_6_MAGIC_VALUE, STATE_ENCRYPTION_MAGIC_VALUE } from '../entropy';\nimport { KeyringOriginsStruct, RpcOriginsStruct } from '../json-rpc';\nimport { SnapIdStruct } from '../snaps';\nimport { mergeStructs, type InferMatching } from '../structs';\nimport { NameStruct, NpmSnapFileNames, uri } from '../types';\n\n// BIP-43 purposes that cannot be used for entropy derivation. These are in the\n// string form, ending with `'`.\nconst FORBIDDEN_PURPOSES: string[] = [\n SIP_6_MAGIC_VALUE,\n STATE_ENCRYPTION_MAGIC_VALUE,\n];\n\nexport const FORBIDDEN_COIN_TYPES: number[] = [60];\nconst FORBIDDEN_PATHS: string[][] = FORBIDDEN_COIN_TYPES.map((coinType) => [\n 'm',\n \"44'\",\n `${coinType}'`,\n]);\n\nexport const Bip32PathStruct = refine(\n array(string()),\n 'BIP-32 path',\n (path: string[]) => {\n if (path.length === 0) {\n return 'Path must be a non-empty BIP-32 derivation path array';\n }\n\n if (path[0] !== 'm') {\n return 'Path must start with \"m\".';\n }\n\n if (path.length < 3) {\n return 'Paths must have a length of at least three.';\n }\n\n if (path.slice(1).some((part) => !isValidBIP32PathSegment(part))) {\n return 'Path must be a valid BIP-32 derivation path array.';\n }\n\n if (FORBIDDEN_PURPOSES.includes(path[1])) {\n return `The purpose \"${path[1]}\" is not allowed for entropy derivation.`;\n }\n\n if (\n FORBIDDEN_PATHS.some((forbiddenPath) =>\n isEqual(path.slice(0, forbiddenPath.length), forbiddenPath),\n )\n ) {\n return `The path \"${path.join(\n '/',\n )}\" is not allowed for entropy derivation.`;\n }\n\n return true;\n },\n);\n\nexport const bip32entropy = <\n Type extends { path: string[]; curve: string },\n Schema,\n>(\n struct: Struct<Type, Schema>,\n) =>\n refine(struct, 'BIP-32 entropy', (value) => {\n if (\n value.curve === 'ed25519' &&\n value.path.slice(1).some((part) => !part.endsWith(\"'\"))\n ) {\n return 'Ed25519 does not support unhardened paths.';\n }\n\n return true;\n });\n\nexport const CurveStruct: Describe<SupportedCurve> = enums([\n 'ed25519',\n 'secp256k1',\n 'ed25519Bip32',\n]);\n\n// Used outside @metamask/snap-utils\nexport const Bip32EntropyStruct = bip32entropy(\n type({\n path: Bip32PathStruct,\n curve: CurveStruct,\n }),\n);\n\nexport type Bip32Entropy = Infer<typeof Bip32EntropyStruct>;\n\nexport const SnapGetBip32EntropyPermissionsStruct = size(\n array(Bip32EntropyStruct),\n 1,\n Infinity,\n);\n\nexport const SemVerRangeStruct = refine(string(), 'SemVer range', (value) => {\n if (isValidSemVerRange(value)) {\n return true;\n }\n return 'Expected a valid SemVer range.';\n});\n\nexport const SnapIdsStruct = refine(\n record(SnapIdStruct, object({ version: optional(SemVerRangeStruct) })),\n 'SnapIds',\n (value) => {\n if (Object.keys(value).length === 0) {\n return false;\n }\n\n return true;\n },\n);\n\nexport type SnapIds = Infer<typeof SnapIdsStruct>;\n\nexport const ChainIdsStruct = size(array(CaipChainIdStruct), 1, Infinity);\n\nexport const LookupMatchersStruct = union([\n object({\n tlds: size(array(string()), 1, Infinity),\n }),\n object({\n schemes: size(array(string()), 1, Infinity),\n }),\n object({\n tlds: size(array(string()), 1, Infinity),\n schemes: size(array(string()), 1, Infinity),\n }),\n]);\n\nexport const MINIMUM_REQUEST_TIMEOUT = inMilliseconds(5, Duration.Second);\nexport const MAXIMUM_REQUEST_TIMEOUT = inMilliseconds(3, Duration.Minute);\n\nexport const MaxRequestTimeStruct = size(\n integer(),\n MINIMUM_REQUEST_TIMEOUT,\n MAXIMUM_REQUEST_TIMEOUT,\n);\n\nexport const ProtocolScopesStruct = record(\n CaipChainIdStruct,\n object({ methods: array(string()) }),\n);\n\n// Utility type to union with for all handler structs\nexport const HandlerCaveatsStruct = object({\n maxRequestTime: optional(MaxRequestTimeStruct),\n});\n\nexport type HandlerCaveats = Infer<typeof HandlerCaveatsStruct>;\n\nexport const EmptyObjectStruct = object<EmptyObject>({}) as unknown as Struct<\n EmptyObject,\n null\n>;\n\n/* eslint-disable @typescript-eslint/naming-convention */\nexport const PermissionsStruct: Describe<InitialPermissions> = type({\n 'endowment:assets': optional(\n mergeStructs(HandlerCaveatsStruct, object({ scopes: ChainIdsStruct })),\n ),\n 'endowment:cronjob': optional(\n mergeStructs(\n HandlerCaveatsStruct,\n object({ jobs: optional(CronjobSpecificationArrayStruct) }),\n ),\n ),\n 'endowment:ethereum-provider': optional(EmptyObjectStruct),\n 'endowment:keyring': optional(\n mergeStructs(HandlerCaveatsStruct, KeyringOriginsStruct),\n ),\n 'endowment:protocol': optional(\n mergeStructs(\n HandlerCaveatsStruct,\n object({ scopes: ProtocolScopesStruct }),\n ),\n ),\n 'endowment:lifecycle-hooks': optional(HandlerCaveatsStruct),\n 'endowment:name-lookup': optional(\n mergeStructs(\n HandlerCaveatsStruct,\n object({\n chains: optional(ChainIdsStruct),\n matchers: optional(LookupMatchersStruct),\n }),\n ),\n ),\n 'endowment:network-access': optional(EmptyObjectStruct),\n 'endowment:page-home': optional(HandlerCaveatsStruct),\n 'endowment:rpc': optional(\n mergeStructs(HandlerCaveatsStruct, RpcOriginsStruct),\n ),\n 'endowment:signature-insight': optional(\n mergeStructs(\n HandlerCaveatsStruct,\n object({\n allowSignatureOrigin: optional(boolean()),\n }),\n ),\n ),\n 'endowment:transaction-insight': optional(\n mergeStructs(\n HandlerCaveatsStruct,\n object({\n allowTransactionOrigin: optional(boolean()),\n }),\n ),\n ),\n 'endowment:webassembly': optional(EmptyObjectStruct),\n snap_dialog: optional(EmptyObjectStruct),\n snap_manageState: optional(EmptyObjectStruct),\n snap_manageAccounts: optional(EmptyObjectStruct),\n snap_notify: optional(EmptyObjectStruct),\n snap_getBip32Entropy: optional(SnapGetBip32EntropyPermissionsStruct),\n snap_getBip32PublicKey: optional(SnapGetBip32EntropyPermissionsStruct),\n snap_getBip44Entropy: optional(\n size(\n array(object({ coinType: size(integer(), 0, 2 ** 32 - 1) })),\n 1,\n Infinity,\n ),\n ),\n snap_getEntropy: optional(EmptyObjectStruct),\n snap_getLocale: optional(EmptyObjectStruct),\n wallet_snap: optional(SnapIdsStruct),\n});\n/* eslint-enable @typescript-eslint/naming-convention */\n\nexport type SnapPermissions = InferMatching<\n typeof PermissionsStruct,\n InitialPermissions\n>;\n\nexport const SnapAuxiliaryFilesStruct = array(string());\n\n/**\n * @deprecated Use SnapAuxiliaryFilesStruct instead. This was a typo that has been fixed.\n */\nexport const SnapAuxilaryFilesStruct = SnapAuxiliaryFilesStruct;\n\nexport const InitialConnectionsStruct = record(\n intersection([string(), uri()]),\n object({}),\n);\n\nexport type InitialConnections = Infer<typeof InitialConnectionsStruct>;\n\nexport const SnapManifestStruct = object({\n version: VersionStruct,\n description: size(string(), 1, 280),\n proposedName: size(string(), 1, 214),\n repository: optional(\n type({\n type: size(string(), 1, Infinity),\n url: size(string(), 1, Infinity),\n }),\n ),\n source: object({\n shasum: ChecksumStruct,\n location: object({\n npm: object({\n filePath: size(string(), 1, Infinity),\n iconPath: optional(size(string(), 1, Infinity)),\n packageName: NameStruct,\n registry: union([\n literal('https://registry.npmjs.org'),\n literal('https://registry.npmjs.org/'),\n ]),\n }),\n }),\n files: optional(SnapAuxiliaryFilesStruct),\n locales: optional(SnapAuxiliaryFilesStruct),\n }),\n initialConnections: optional(InitialConnectionsStruct),\n initialPermissions: PermissionsStruct,\n manifestVersion: literal('0.1'),\n platformVersion: optional(VersionStruct),\n $schema: optional(string()), // enables JSON-Schema linting in VSC and other IDEs\n});\n\nexport type SnapManifest = Infer<typeof SnapManifestStruct>;\n\n/**\n * Check if the given value is a valid {@link SnapManifest} object.\n *\n * @param value - The value to check.\n * @returns Whether the value is a valid {@link SnapManifest} object.\n */\nexport function isSnapManifest(value: unknown): value is SnapManifest {\n return is(value, SnapManifestStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link SnapManifest} object.\n *\n * @param value - The value to check.\n * @throws If the value is not a valid {@link SnapManifest} object.\n */\nexport function assertIsSnapManifest(\n value: unknown,\n): asserts value is SnapManifest {\n assertStruct(\n value,\n SnapManifestStruct,\n `\"${NpmSnapFileNames.Manifest}\" is invalid`,\n );\n}\n\n/**\n * Creates a {@link SnapManifest} object from JSON.\n *\n * @param value - The value to check.\n * @throws If the value cannot be coerced to a {@link SnapManifest} object.\n * @returns The created {@link SnapManifest} object.\n */\nexport function createSnapManifest(value: unknown): SnapManifest {\n // TODO: Add a utility to prefix these errors similar to assertStruct\n return create(value, SnapManifestStruct);\n}\n"]}
1
+ {"version":3,"file":"validation.mjs","sourceRoot":"","sources":["../../src/manifest/validation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SupportedCurve } from '@metamask/key-tree';\nimport { isValidBIP32PathSegment } from '@metamask/key-tree';\nimport type { EmptyObject, InitialPermissions } from '@metamask/snaps-sdk';\nimport type { Describe, Infer, Struct } from '@metamask/superstruct';\nimport {\n array,\n boolean,\n create,\n enums,\n integer,\n is,\n literal,\n object,\n optional,\n refine,\n record,\n size,\n string,\n type,\n union,\n intersection,\n} from '@metamask/superstruct';\nimport {\n assertStruct,\n ChecksumStruct,\n VersionStruct,\n isValidSemVerRange,\n inMilliseconds,\n Duration,\n CaipChainIdStruct,\n} from '@metamask/utils';\n\nimport { isEqual } from '../array';\nimport { CronjobSpecificationArrayStruct } from '../cronjob';\nimport { SIP_6_MAGIC_VALUE, STATE_ENCRYPTION_MAGIC_VALUE } from '../entropy';\nimport { KeyringOriginsStruct, RpcOriginsStruct } from '../json-rpc';\nimport { SnapIdStruct } from '../snaps';\nimport { mergeStructs, type InferMatching } from '../structs';\nimport { NameStruct, NpmSnapFileNames, uri } from '../types';\n\n// BIP-43 purposes that cannot be used for entropy derivation. These are in the\n// string form, ending with `'`.\nconst FORBIDDEN_PURPOSES: string[] = [\n SIP_6_MAGIC_VALUE,\n STATE_ENCRYPTION_MAGIC_VALUE,\n];\n\nexport const FORBIDDEN_COIN_TYPES: number[] = [60];\nconst FORBIDDEN_PATHS: string[][] = FORBIDDEN_COIN_TYPES.map((coinType) => [\n 'm',\n \"44'\",\n `${coinType}'`,\n]);\n\nexport const Bip32PathStruct = refine(\n array(string()),\n 'BIP-32 path',\n (path: string[]) => {\n if (path.length === 0) {\n return 'Path must be a non-empty BIP-32 derivation path array';\n }\n\n if (path[0] !== 'm') {\n return 'Path must start with \"m\".';\n }\n\n if (path.length < 3) {\n return 'Paths must have a length of at least three.';\n }\n\n if (path.slice(1).some((part) => !isValidBIP32PathSegment(part))) {\n return 'Path must be a valid BIP-32 derivation path array.';\n }\n\n if (FORBIDDEN_PURPOSES.includes(path[1])) {\n return `The purpose \"${path[1]}\" is not allowed for entropy derivation.`;\n }\n\n if (\n FORBIDDEN_PATHS.some((forbiddenPath) =>\n isEqual(path.slice(0, forbiddenPath.length), forbiddenPath),\n )\n ) {\n return `The path \"${path.join(\n '/',\n )}\" is not allowed for entropy derivation.`;\n }\n\n return true;\n },\n);\n\nexport const bip32entropy = <\n Type extends { path: string[]; curve: string },\n Schema,\n>(\n struct: Struct<Type, Schema>,\n) =>\n refine(struct, 'BIP-32 entropy', (value) => {\n if (\n value.curve === 'ed25519' &&\n value.path.slice(1).some((part) => !part.endsWith(\"'\"))\n ) {\n return 'Ed25519 does not support unhardened paths.';\n }\n\n return true;\n });\n\nexport const CurveStruct: Describe<SupportedCurve> = enums([\n 'ed25519',\n 'secp256k1',\n 'ed25519Bip32',\n]);\n\n// Used outside @metamask/snap-utils\nexport const Bip32EntropyStruct = bip32entropy(\n type({\n path: Bip32PathStruct,\n curve: CurveStruct,\n }),\n);\n\nexport type Bip32Entropy = Infer<typeof Bip32EntropyStruct>;\n\nexport const SnapGetBip32EntropyPermissionsStruct = size(\n array(Bip32EntropyStruct),\n 1,\n Infinity,\n);\n\nexport const SemVerRangeStruct = refine(string(), 'SemVer range', (value) => {\n if (isValidSemVerRange(value)) {\n return true;\n }\n return 'Expected a valid SemVer range.';\n});\n\nexport const SnapIdsStruct = refine(\n record(SnapIdStruct, object({ version: optional(SemVerRangeStruct) })),\n 'SnapIds',\n (value) => {\n if (Object.keys(value).length === 0) {\n return false;\n }\n\n return true;\n },\n);\n\nexport type SnapIds = Infer<typeof SnapIdsStruct>;\n\nexport const ChainIdsStruct = size(array(CaipChainIdStruct), 1, Infinity);\n\nexport const LookupMatchersStruct = union([\n object({\n tlds: size(array(string()), 1, Infinity),\n }),\n object({\n schemes: size(array(string()), 1, Infinity),\n }),\n object({\n tlds: size(array(string()), 1, Infinity),\n schemes: size(array(string()), 1, Infinity),\n }),\n]);\n\nexport const MINIMUM_REQUEST_TIMEOUT = inMilliseconds(5, Duration.Second);\nexport const MAXIMUM_REQUEST_TIMEOUT = inMilliseconds(3, Duration.Minute);\n\nexport const MaxRequestTimeStruct = size(\n integer(),\n MINIMUM_REQUEST_TIMEOUT,\n MAXIMUM_REQUEST_TIMEOUT,\n);\n\nexport const ProtocolScopesStruct = record(\n CaipChainIdStruct,\n object({ methods: array(string()) }),\n);\n\n// Utility type to union with for all handler structs\nexport const HandlerCaveatsStruct = object({\n maxRequestTime: optional(MaxRequestTimeStruct),\n});\n\nexport type HandlerCaveats = Infer<typeof HandlerCaveatsStruct>;\n\nexport const EmptyObjectStruct = object<EmptyObject>({}) as unknown as Struct<\n EmptyObject,\n null\n>;\n\n/* eslint-disable @typescript-eslint/naming-convention */\nexport const PermissionsStruct: Describe<InitialPermissions> = type({\n 'endowment:assets': optional(\n mergeStructs(HandlerCaveatsStruct, object({ scopes: ChainIdsStruct })),\n ),\n 'endowment:cronjob': optional(\n mergeStructs(\n HandlerCaveatsStruct,\n object({ jobs: optional(CronjobSpecificationArrayStruct) }),\n ),\n ),\n 'endowment:ethereum-provider': optional(EmptyObjectStruct),\n 'endowment:keyring': optional(\n mergeStructs(HandlerCaveatsStruct, KeyringOriginsStruct),\n ),\n 'endowment:protocol': optional(\n mergeStructs(\n HandlerCaveatsStruct,\n object({ scopes: ProtocolScopesStruct }),\n ),\n ),\n 'endowment:lifecycle-hooks': optional(HandlerCaveatsStruct),\n 'endowment:name-lookup': optional(\n mergeStructs(\n HandlerCaveatsStruct,\n object({\n chains: optional(ChainIdsStruct),\n matchers: optional(LookupMatchersStruct),\n }),\n ),\n ),\n 'endowment:network-access': optional(EmptyObjectStruct),\n 'endowment:page-home': optional(HandlerCaveatsStruct),\n 'endowment:rpc': optional(\n mergeStructs(HandlerCaveatsStruct, RpcOriginsStruct),\n ),\n 'endowment:signature-insight': optional(\n mergeStructs(\n HandlerCaveatsStruct,\n object({\n allowSignatureOrigin: optional(boolean()),\n }),\n ),\n ),\n 'endowment:transaction-insight': optional(\n mergeStructs(\n HandlerCaveatsStruct,\n object({\n allowTransactionOrigin: optional(boolean()),\n }),\n ),\n ),\n 'endowment:webassembly': optional(EmptyObjectStruct),\n snap_dialog: optional(EmptyObjectStruct),\n snap_manageState: optional(EmptyObjectStruct),\n snap_manageAccounts: optional(EmptyObjectStruct),\n snap_notify: optional(EmptyObjectStruct),\n snap_getBip32Entropy: optional(SnapGetBip32EntropyPermissionsStruct),\n snap_getBip32PublicKey: optional(SnapGetBip32EntropyPermissionsStruct),\n snap_getBip44Entropy: optional(\n size(\n array(object({ coinType: size(integer(), 0, 2 ** 32 - 1) })),\n 1,\n Infinity,\n ),\n ),\n snap_getEntropy: optional(EmptyObjectStruct),\n snap_getLocale: optional(EmptyObjectStruct),\n wallet_snap: optional(SnapIdsStruct),\n});\n/* eslint-enable @typescript-eslint/naming-convention */\n\nexport type SnapPermissions = InferMatching<\n typeof PermissionsStruct,\n InitialPermissions\n>;\n\nexport const SnapAuxiliaryFilesStruct = array(string());\n\n/**\n * @deprecated Use SnapAuxiliaryFilesStruct instead. This was a typo that has been fixed.\n */\nexport const SnapAuxilaryFilesStruct = SnapAuxiliaryFilesStruct;\n\nexport const InitialConnectionsStruct = record(\n intersection([string(), uri()]),\n object({}),\n);\n\nexport type InitialConnections = Infer<typeof InitialConnectionsStruct>;\n\nexport const SnapManifestStruct = object({\n extends: optional(size(string(), 1, Infinity)),\n version: VersionStruct,\n description: size(string(), 1, 280),\n proposedName: size(string(), 1, 214),\n repository: optional(\n type({\n type: size(string(), 1, Infinity),\n url: size(string(), 1, Infinity),\n }),\n ),\n source: object({\n shasum: ChecksumStruct,\n location: object({\n npm: object({\n filePath: size(string(), 1, Infinity),\n iconPath: optional(size(string(), 1, Infinity)),\n packageName: NameStruct,\n registry: union([\n literal('https://registry.npmjs.org'),\n literal('https://registry.npmjs.org/'),\n ]),\n }),\n }),\n files: optional(SnapAuxiliaryFilesStruct),\n locales: optional(SnapAuxiliaryFilesStruct),\n }),\n initialConnections: optional(InitialConnectionsStruct),\n initialPermissions: PermissionsStruct,\n manifestVersion: literal('0.1'),\n platformVersion: optional(VersionStruct),\n $schema: optional(string()), // enables JSON-Schema linting in VSC and other IDEs\n});\n\nexport type SnapManifest = Infer<typeof SnapManifestStruct>;\n\n/**\n * Check if the given value is a valid {@link SnapManifest} object.\n *\n * @param value - The value to check.\n * @returns Whether the value is a valid {@link SnapManifest} object.\n */\nexport function isSnapManifest(value: unknown): value is SnapManifest {\n return is(value, SnapManifestStruct);\n}\n\n/**\n * Assert that the given value is a valid {@link SnapManifest} object.\n *\n * @param value - The value to check.\n * @throws If the value is not a valid {@link SnapManifest} object.\n */\nexport function assertIsSnapManifest(\n value: unknown,\n): asserts value is SnapManifest {\n assertStruct(\n value,\n SnapManifestStruct,\n `\"${NpmSnapFileNames.Manifest}\" is invalid`,\n );\n}\n\n/**\n * Creates a {@link SnapManifest} object from JSON.\n *\n * @param value - The value to check.\n * @throws If the value cannot be coerced to a {@link SnapManifest} object.\n * @returns The created {@link SnapManifest} object.\n */\nexport function createSnapManifest(value: unknown): SnapManifest {\n // TODO: Add a utility to prefix these errors similar to assertStruct\n return create(value, SnapManifestStruct);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"validator-types.cjs","sourceRoot":"","sources":["../../src/manifest/validator-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { SnapManifest } from './validation';\nimport type { Promisable } from '../promise';\nimport type { SnapFiles, UnvalidatedSnapFiles } from '../types';\n\nexport type ValidatorFix = (files: {\n manifest: SnapManifest;\n}) => Promisable<{ manifest: SnapManifest }>;\n\n/**\n * The options for the validator context.\n */\nexport type ValidatorContextOptions = {\n /**\n * An object containing the names of the handlers and their respective\n * permission name. This must be provided to avoid circular dependencies\n * between `@metamask/snaps-utils` and `@metamask/snaps-rpc-methods`.\n */\n handlerEndowments?: Record<string, string | null>;\n\n /**\n * Exports detected by evaluating the bundle. This may be used by one or more\n * validators to determine whether the snap is valid.\n */\n exports?: string[];\n};\n\nexport type ValidatorSeverity = 'error' | 'warning';\n\nexport type ValidatorContext = {\n readonly report: (id: string, message: string, fix?: ValidatorFix) => void;\n readonly options?: ValidatorContextOptions;\n};\n\nexport type ValidatorReport = {\n id: string;\n severity: ValidatorSeverity;\n message: string;\n fix?: ValidatorFix;\n};\n\nexport type ValidatorMeta = {\n severity: ValidatorSeverity;\n\n /**\n * 1. Run the validator on unverified files to ensure that the files are\n * structurally sound.\n *\n * @param files - Files to be verified\n * @param context - Validator context to report errors\n */\n structureCheck?: (\n files: UnvalidatedSnapFiles,\n context: ValidatorContext,\n ) => void | Promise<void>;\n\n /**\n * 2. Run the validator after the files were checked to be structurally sound.\n *\n * @param files - Files to be verified\n * @param context - Validator context to report errors\n */\n semanticCheck?: (\n files: SnapFiles,\n context: ValidatorContext,\n ) => void | Promise<void>;\n};\n"]}
1
+ {"version":3,"file":"validator-types.cjs","sourceRoot":"","sources":["../../src/manifest/validator-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Promisable } from '../promise';\nimport type {\n ExtendableManifest,\n ExtendableSnapFiles,\n UnvalidatedSnapFiles,\n} from '../types';\n\nexport type ValidatorFix = (files: {\n manifest: ExtendableManifest;\n}) => Promisable<{ manifest: ExtendableManifest }>;\n\n/**\n * The options for the validator context.\n */\nexport type ValidatorContextOptions = {\n /**\n * An object containing the names of the handlers and their respective\n * permission name. This must be provided to avoid circular dependencies\n * between `@metamask/snaps-utils` and `@metamask/snaps-rpc-methods`.\n */\n handlerEndowments?: Record<string, string | null>;\n\n /**\n * Exports detected by evaluating the bundle. This may be used by one or more\n * validators to determine whether the snap is valid.\n */\n exports?: string[];\n};\n\nexport type ValidatorSeverity = 'error' | 'warning';\n\nexport type ValidatorContext = {\n readonly report: (id: string, message: string, fix?: ValidatorFix) => void;\n readonly options?: ValidatorContextOptions;\n};\n\nexport type ValidatorReport = {\n id: string;\n severity: ValidatorSeverity;\n message: string;\n fix?: ValidatorFix;\n};\n\nexport type ValidatorMeta = {\n severity: ValidatorSeverity;\n\n /**\n * 1. Run the validator on unverified files to ensure that the files are\n * structurally sound.\n *\n * @param files - Files to be verified\n * @param context - Validator context to report errors\n */\n structureCheck?: (\n files: UnvalidatedSnapFiles,\n context: ValidatorContext,\n ) => void | Promise<void>;\n\n /**\n * 2. Run the validator after the files were checked to be structurally sound.\n *\n * @param files - Files to be verified\n * @param context - Validator context to report errors\n */\n semanticCheck?: (\n files: ExtendableSnapFiles,\n context: ValidatorContext,\n ) => void | Promise<void>;\n};\n"]}
@@ -1,10 +1,9 @@
1
- import type { SnapManifest } from "./validation.cjs";
2
1
  import type { Promisable } from "../promise.cjs";
3
- import type { SnapFiles, UnvalidatedSnapFiles } from "../types.cjs";
2
+ import type { ExtendableManifest, ExtendableSnapFiles, UnvalidatedSnapFiles } from "../types.cjs";
4
3
  export type ValidatorFix = (files: {
5
- manifest: SnapManifest;
4
+ manifest: ExtendableManifest;
6
5
  }) => Promisable<{
7
- manifest: SnapManifest;
6
+ manifest: ExtendableManifest;
8
7
  }>;
9
8
  /**
10
9
  * The options for the validator context.
@@ -49,6 +48,6 @@ export type ValidatorMeta = {
49
48
  * @param files - Files to be verified
50
49
  * @param context - Validator context to report errors
51
50
  */
52
- semanticCheck?: (files: SnapFiles, context: ValidatorContext) => void | Promise<void>;
51
+ semanticCheck?: (files: ExtendableSnapFiles, context: ValidatorContext) => void | Promise<void>;
53
52
  };
54
53
  //# sourceMappingURL=validator-types.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validator-types.d.cts","sourceRoot":"","sources":["../../src/manifest/validator-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,yBAAqB;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAmB;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,qBAAiB;AAEhE,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE;IACjC,QAAQ,EAAE,YAAY,CAAC;CACxB,KAAK,UAAU,CAAC;IAAE,QAAQ,EAAE,YAAY,CAAA;CAAE,CAAC,CAAC;AAE7C;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAElD;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,SAAS,CAAC;AAEpD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC;IAC3E,QAAQ,CAAC,OAAO,CAAC,EAAE,uBAAuB,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,YAAY,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,iBAAiB,CAAC;IAE5B;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,CACf,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,gBAAgB,KACtB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CACd,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,gBAAgB,KACtB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC"}
1
+ {"version":3,"file":"validator-types.d.cts","sourceRoot":"","sources":["../../src/manifest/validator-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAmB;AAC7C,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACrB,qBAAiB;AAElB,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE;IACjC,QAAQ,EAAE,kBAAkB,CAAC;CAC9B,KAAK,UAAU,CAAC;IAAE,QAAQ,EAAE,kBAAkB,CAAA;CAAE,CAAC,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAElD;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,SAAS,CAAC;AAEpD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC;IAC3E,QAAQ,CAAC,OAAO,CAAC,EAAE,uBAAuB,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,YAAY,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,iBAAiB,CAAC;IAE5B;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,CACf,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,gBAAgB,KACtB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CACd,KAAK,EAAE,mBAAmB,EAC1B,OAAO,EAAE,gBAAgB,KACtB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC"}
@@ -1,10 +1,9 @@
1
- import type { SnapManifest } from "./validation.mjs";
2
1
  import type { Promisable } from "../promise.mjs";
3
- import type { SnapFiles, UnvalidatedSnapFiles } from "../types.mjs";
2
+ import type { ExtendableManifest, ExtendableSnapFiles, UnvalidatedSnapFiles } from "../types.mjs";
4
3
  export type ValidatorFix = (files: {
5
- manifest: SnapManifest;
4
+ manifest: ExtendableManifest;
6
5
  }) => Promisable<{
7
- manifest: SnapManifest;
6
+ manifest: ExtendableManifest;
8
7
  }>;
9
8
  /**
10
9
  * The options for the validator context.
@@ -49,6 +48,6 @@ export type ValidatorMeta = {
49
48
  * @param files - Files to be verified
50
49
  * @param context - Validator context to report errors
51
50
  */
52
- semanticCheck?: (files: SnapFiles, context: ValidatorContext) => void | Promise<void>;
51
+ semanticCheck?: (files: ExtendableSnapFiles, context: ValidatorContext) => void | Promise<void>;
53
52
  };
54
53
  //# sourceMappingURL=validator-types.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validator-types.d.mts","sourceRoot":"","sources":["../../src/manifest/validator-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,yBAAqB;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAmB;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,qBAAiB;AAEhE,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE;IACjC,QAAQ,EAAE,YAAY,CAAC;CACxB,KAAK,UAAU,CAAC;IAAE,QAAQ,EAAE,YAAY,CAAA;CAAE,CAAC,CAAC;AAE7C;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAElD;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,SAAS,CAAC;AAEpD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC;IAC3E,QAAQ,CAAC,OAAO,CAAC,EAAE,uBAAuB,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,YAAY,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,iBAAiB,CAAC;IAE5B;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,CACf,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,gBAAgB,KACtB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CACd,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,gBAAgB,KACtB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC"}
1
+ {"version":3,"file":"validator-types.d.mts","sourceRoot":"","sources":["../../src/manifest/validator-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAmB;AAC7C,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACrB,qBAAiB;AAElB,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE;IACjC,QAAQ,EAAE,kBAAkB,CAAC;CAC9B,KAAK,UAAU,CAAC;IAAE,QAAQ,EAAE,kBAAkB,CAAA;CAAE,CAAC,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAElD;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,SAAS,CAAC;AAEpD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC;IAC3E,QAAQ,CAAC,OAAO,CAAC,EAAE,uBAAuB,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,YAAY,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,iBAAiB,CAAC;IAE5B;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,CACf,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,gBAAgB,KACtB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CACd,KAAK,EAAE,mBAAmB,EAC1B,OAAO,EAAE,gBAAgB,KACtB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"validator-types.mjs","sourceRoot":"","sources":["../../src/manifest/validator-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { SnapManifest } from './validation';\nimport type { Promisable } from '../promise';\nimport type { SnapFiles, UnvalidatedSnapFiles } from '../types';\n\nexport type ValidatorFix = (files: {\n manifest: SnapManifest;\n}) => Promisable<{ manifest: SnapManifest }>;\n\n/**\n * The options for the validator context.\n */\nexport type ValidatorContextOptions = {\n /**\n * An object containing the names of the handlers and their respective\n * permission name. This must be provided to avoid circular dependencies\n * between `@metamask/snaps-utils` and `@metamask/snaps-rpc-methods`.\n */\n handlerEndowments?: Record<string, string | null>;\n\n /**\n * Exports detected by evaluating the bundle. This may be used by one or more\n * validators to determine whether the snap is valid.\n */\n exports?: string[];\n};\n\nexport type ValidatorSeverity = 'error' | 'warning';\n\nexport type ValidatorContext = {\n readonly report: (id: string, message: string, fix?: ValidatorFix) => void;\n readonly options?: ValidatorContextOptions;\n};\n\nexport type ValidatorReport = {\n id: string;\n severity: ValidatorSeverity;\n message: string;\n fix?: ValidatorFix;\n};\n\nexport type ValidatorMeta = {\n severity: ValidatorSeverity;\n\n /**\n * 1. Run the validator on unverified files to ensure that the files are\n * structurally sound.\n *\n * @param files - Files to be verified\n * @param context - Validator context to report errors\n */\n structureCheck?: (\n files: UnvalidatedSnapFiles,\n context: ValidatorContext,\n ) => void | Promise<void>;\n\n /**\n * 2. Run the validator after the files were checked to be structurally sound.\n *\n * @param files - Files to be verified\n * @param context - Validator context to report errors\n */\n semanticCheck?: (\n files: SnapFiles,\n context: ValidatorContext,\n ) => void | Promise<void>;\n};\n"]}
1
+ {"version":3,"file":"validator-types.mjs","sourceRoot":"","sources":["../../src/manifest/validator-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Promisable } from '../promise';\nimport type {\n ExtendableManifest,\n ExtendableSnapFiles,\n UnvalidatedSnapFiles,\n} from '../types';\n\nexport type ValidatorFix = (files: {\n manifest: ExtendableManifest;\n}) => Promisable<{ manifest: ExtendableManifest }>;\n\n/**\n * The options for the validator context.\n */\nexport type ValidatorContextOptions = {\n /**\n * An object containing the names of the handlers and their respective\n * permission name. This must be provided to avoid circular dependencies\n * between `@metamask/snaps-utils` and `@metamask/snaps-rpc-methods`.\n */\n handlerEndowments?: Record<string, string | null>;\n\n /**\n * Exports detected by evaluating the bundle. This may be used by one or more\n * validators to determine whether the snap is valid.\n */\n exports?: string[];\n};\n\nexport type ValidatorSeverity = 'error' | 'warning';\n\nexport type ValidatorContext = {\n readonly report: (id: string, message: string, fix?: ValidatorFix) => void;\n readonly options?: ValidatorContextOptions;\n};\n\nexport type ValidatorReport = {\n id: string;\n severity: ValidatorSeverity;\n message: string;\n fix?: ValidatorFix;\n};\n\nexport type ValidatorMeta = {\n severity: ValidatorSeverity;\n\n /**\n * 1. Run the validator on unverified files to ensure that the files are\n * structurally sound.\n *\n * @param files - Files to be verified\n * @param context - Validator context to report errors\n */\n structureCheck?: (\n files: UnvalidatedSnapFiles,\n context: ValidatorContext,\n ) => void | Promise<void>;\n\n /**\n * 2. Run the validator after the files were checked to be structurally sound.\n *\n * @param files - Files to be verified\n * @param context - Validator context to report errors\n */\n semanticCheck?: (\n files: ExtendableSnapFiles,\n context: ValidatorContext,\n ) => void | Promise<void>;\n};\n"]}
@@ -117,7 +117,7 @@ function isReportFixable(report, errorsOnly) {
117
117
  }
118
118
  exports.isReportFixable = isReportFixable;
119
119
  /**
120
- * Get whether any reports has pending fixes.
120
+ * Get whether any reports have pending fixes.
121
121
  *
122
122
  * @param results - Results of the validation run.
123
123
  * @param errorsOnly - Whether to only consider errors for pending fixes.
@@ -1 +1 @@
1
- {"version":3,"file":"validator.cjs","sourceRoot":"","sources":["../../src/manifest/validator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAyC;AAUzC,0EAAkD;AAQlD,MAAM,OAAO;IACX,OAAO,GAAsB,EAAE,CAAC;IAEvB,QAAQ,GAA4B,EAAE,CAAC;IAEhD,aAAa,GAAuB,SAAS,CAAC;IAE9C;;;;;OAKG;IACH,YAAY,OAAgC;QAC1C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,EAAU,EAAE,OAAe,EAAE,GAAkB;QACpD,IAAA,cAAM,EAAC,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC;QAEzC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,EAAE;YACF,OAAO;YACP,GAAG;YACH,QAAQ,EAAE,IAAI,CAAC,aAAa;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB,CAAC,QAAyC;QAC3D,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACzC,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF;AAED;;;;;;;;;;GAUG;AACH,iEAAiE;AACjE,8DAA8D;AAC9D,+BAA+B;AACxB,KAAK,UAAU,aAAa,CACjC,KAA2B,EAC3B,QAAyB,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,EACzD,UAAmC,EAAE;IAErC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,mBAAmB,CAAC;YAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,mBAAmB,CAAC;YAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,KAAkB,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAkB;QACzB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;AACJ,CAAC;AAjCD,sCAiCC;AAED;;;;;;GAMG;AACH,SAAgB,eAAe,CAAC,MAAuB,EAAE,UAAoB;IAC3E,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC;AAC7E,CAAC;AAFD,0CAEC;AAED;;;;;;GAMG;AACH,SAAgB,QAAQ,CACtB,OAAyB,EACzB,UAAoB;IAEpB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AAC/E,CAAC;AALD,4BAKC","sourcesContent":["import { assert } from '@metamask/utils';\n\nimport type {\n ValidatorContext,\n ValidatorContextOptions,\n ValidatorFix,\n ValidatorMeta,\n ValidatorReport,\n ValidatorSeverity,\n} from './validator-types';\nimport * as defaultValidators from './validators';\nimport type { SnapFiles, UnvalidatedSnapFiles } from '../types';\n\nexport type ValidatorResults = {\n files?: SnapFiles;\n reports: ValidatorReport[];\n};\n\nclass Context implements ValidatorContext {\n reports: ValidatorReport[] = [];\n\n readonly #options: ValidatorContextOptions = {};\n\n #nextSeverity?: ValidatorSeverity = undefined;\n\n /**\n * Construct a new validator context.\n *\n * @param options - The options for the validator context.\n * @param options.exports - Exports detected by evaluating the bundle.\n */\n constructor(options: ValidatorContextOptions) {\n this.#options = options;\n }\n\n /**\n * Report a validation error or warning.\n *\n * @param id - The unique identifier for the report.\n * @param message - The message describing the validation issue.\n * @param fix - An optional fix function that can be used to automatically\n * resolve the issue.\n */\n report(id: string, message: string, fix?: ValidatorFix): void {\n assert(this.#nextSeverity !== undefined);\n\n this.reports.push({\n id,\n message,\n fix,\n severity: this.#nextSeverity,\n });\n }\n\n prepareForValidator(settings: { severity: ValidatorSeverity }) {\n this.#nextSeverity = settings.severity;\n }\n\n get hasErrors() {\n return this.reports.some((report) => report.severity === 'error');\n }\n\n get options() {\n return this.#options;\n }\n}\n\n/**\n * Verify that snap files are completely valid.\n * First it runs validators on unparsed files to check structure.\n * Secondly it runs validators on parsed files to check semantics.\n *\n * @param files - All files required to run a snap.\n * @param rules - Validators to run.\n * @param options - Options for the validation.\n * @param options.exports - Exports detected by evaluating the bundle.\n * @returns The validation results.\n */\n// TODO(ritave): snap.manifest.json and package.json should check\n// json parsing as well instead of assuming it's\n// already parsed\nexport async function runValidators(\n files: UnvalidatedSnapFiles,\n rules: ValidatorMeta[] = Object.values(defaultValidators),\n options: ValidatorContextOptions = {},\n): Promise<ValidatorResults> {\n const context = new Context(options);\n\n for (const rule of rules) {\n context.prepareForValidator({\n severity: rule.severity,\n });\n\n await rule.structureCheck?.(files, context);\n }\n\n if (context.hasErrors) {\n return {\n reports: context.reports,\n };\n }\n\n for (const rule of rules) {\n context.prepareForValidator({\n severity: rule.severity,\n });\n\n await rule.semanticCheck?.(files as SnapFiles, context);\n }\n\n return {\n files: files as SnapFiles,\n reports: context.reports,\n };\n}\n\n/**\n * Check whether a report is fixable.\n *\n * @param report - The report to check.\n * @param errorsOnly - Whether to only consider errors for fixability.\n * @returns Whether the report is fixable.\n */\nexport function isReportFixable(report: ValidatorReport, errorsOnly?: boolean) {\n return Boolean(report.fix && (!errorsOnly || report.severity === 'error'));\n}\n\n/**\n * Get whether any reports has pending fixes.\n *\n * @param results - Results of the validation run.\n * @param errorsOnly - Whether to only consider errors for pending fixes.\n * @returns Whether there are fixes pending.\n */\nexport function hasFixes(\n results: ValidatorResults,\n errorsOnly?: boolean,\n): boolean {\n return results.reports.some((report) => isReportFixable(report, errorsOnly));\n}\n"]}
1
+ {"version":3,"file":"validator.cjs","sourceRoot":"","sources":["../../src/manifest/validator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAyC;AAUzC,0EAAkD;AAQlD,MAAM,OAAO;IACX,OAAO,GAAsB,EAAE,CAAC;IAEvB,QAAQ,GAA4B,EAAE,CAAC;IAEhD,aAAa,GAAuB,SAAS,CAAC;IAE9C;;;;;OAKG;IACH,YAAY,OAAgC;QAC1C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,EAAU,EAAE,OAAe,EAAE,GAAkB;QACpD,IAAA,cAAM,EAAC,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC;QAEzC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,EAAE;YACF,OAAO;YACP,GAAG;YACH,QAAQ,EAAE,IAAI,CAAC,aAAa;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB,CAAC,QAAyC;QAC3D,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACzC,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF;AAED;;;;;;;;;;GAUG;AACH,iEAAiE;AACjE,8DAA8D;AAC9D,+BAA+B;AACxB,KAAK,UAAU,aAAa,CACjC,KAA2B,EAC3B,QAAyB,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,EACzD,UAAmC,EAAE;IAErC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,mBAAmB,CAAC;YAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,mBAAmB,CAAC;YAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,KAA4B,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAA4B;QACnC,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;AACJ,CAAC;AAjCD,sCAiCC;AAED;;;;;;GAMG;AACH,SAAgB,eAAe,CAAC,MAAuB,EAAE,UAAoB;IAC3E,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC;AAC7E,CAAC;AAFD,0CAEC;AAED;;;;;;GAMG;AACH,SAAgB,QAAQ,CACtB,OAAyB,EACzB,UAAoB;IAEpB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AAC/E,CAAC;AALD,4BAKC","sourcesContent":["import { assert } from '@metamask/utils';\n\nimport type {\n ValidatorContext,\n ValidatorContextOptions,\n ValidatorFix,\n ValidatorMeta,\n ValidatorReport,\n ValidatorSeverity,\n} from './validator-types';\nimport * as defaultValidators from './validators';\nimport type { UnvalidatedSnapFiles, ExtendableSnapFiles } from '../types';\n\nexport type ValidatorResults = {\n files?: ExtendableSnapFiles;\n reports: ValidatorReport[];\n};\n\nclass Context implements ValidatorContext {\n reports: ValidatorReport[] = [];\n\n readonly #options: ValidatorContextOptions = {};\n\n #nextSeverity?: ValidatorSeverity = undefined;\n\n /**\n * Construct a new validator context.\n *\n * @param options - The options for the validator context.\n * @param options.exports - Exports detected by evaluating the bundle.\n */\n constructor(options: ValidatorContextOptions) {\n this.#options = options;\n }\n\n /**\n * Report a validation error or warning.\n *\n * @param id - The unique identifier for the report.\n * @param message - The message describing the validation issue.\n * @param fix - An optional fix function that can be used to automatically\n * resolve the issue.\n */\n report(id: string, message: string, fix?: ValidatorFix): void {\n assert(this.#nextSeverity !== undefined);\n\n this.reports.push({\n id,\n message,\n fix,\n severity: this.#nextSeverity,\n });\n }\n\n prepareForValidator(settings: { severity: ValidatorSeverity }) {\n this.#nextSeverity = settings.severity;\n }\n\n get hasErrors() {\n return this.reports.some((report) => report.severity === 'error');\n }\n\n get options() {\n return this.#options;\n }\n}\n\n/**\n * Verify that snap files are completely valid.\n * First it runs validators on unparsed files to check structure.\n * Secondly it runs validators on parsed files to check semantics.\n *\n * @param files - All files required to run a snap.\n * @param rules - Validators to run.\n * @param options - Options for the validation.\n * @param options.exports - Exports detected by evaluating the bundle.\n * @returns The validation results.\n */\n// TODO(ritave): snap.manifest.json and package.json should check\n// json parsing as well instead of assuming it's\n// already parsed\nexport async function runValidators(\n files: UnvalidatedSnapFiles,\n rules: ValidatorMeta[] = Object.values(defaultValidators),\n options: ValidatorContextOptions = {},\n): Promise<ValidatorResults> {\n const context = new Context(options);\n\n for (const rule of rules) {\n context.prepareForValidator({\n severity: rule.severity,\n });\n\n await rule.structureCheck?.(files, context);\n }\n\n if (context.hasErrors) {\n return {\n reports: context.reports,\n };\n }\n\n for (const rule of rules) {\n context.prepareForValidator({\n severity: rule.severity,\n });\n\n await rule.semanticCheck?.(files as ExtendableSnapFiles, context);\n }\n\n return {\n files: files as ExtendableSnapFiles,\n reports: context.reports,\n };\n}\n\n/**\n * Check whether a report is fixable.\n *\n * @param report - The report to check.\n * @param errorsOnly - Whether to only consider errors for fixability.\n * @returns Whether the report is fixable.\n */\nexport function isReportFixable(report: ValidatorReport, errorsOnly?: boolean) {\n return Boolean(report.fix && (!errorsOnly || report.severity === 'error'));\n}\n\n/**\n * Get whether any reports have pending fixes.\n *\n * @param results - Results of the validation run.\n * @param errorsOnly - Whether to only consider errors for pending fixes.\n * @returns Whether there are fixes pending.\n */\nexport function hasFixes(\n results: ValidatorResults,\n errorsOnly?: boolean,\n): boolean {\n return results.reports.some((report) => isReportFixable(report, errorsOnly));\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import type { ValidatorContextOptions, ValidatorMeta, ValidatorReport } from "./validator-types.cjs";
2
- import type { SnapFiles, UnvalidatedSnapFiles } from "../types.cjs";
2
+ import type { UnvalidatedSnapFiles, ExtendableSnapFiles } from "../types.cjs";
3
3
  export type ValidatorResults = {
4
- files?: SnapFiles;
4
+ files?: ExtendableSnapFiles;
5
5
  reports: ValidatorReport[];
6
6
  };
7
7
  /**
@@ -25,7 +25,7 @@ export declare function runValidators(files: UnvalidatedSnapFiles, rules?: Valid
25
25
  */
26
26
  export declare function isReportFixable(report: ValidatorReport, errorsOnly?: boolean): boolean;
27
27
  /**
28
- * Get whether any reports has pending fixes.
28
+ * Get whether any reports have pending fixes.
29
29
  *
30
30
  * @param results - Results of the validation run.
31
31
  * @param errorsOnly - Whether to only consider errors for pending fixes.
@@ -1 +1 @@
1
- {"version":3,"file":"validator.d.cts","sourceRoot":"","sources":["../../src/manifest/validator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,uBAAuB,EAEvB,aAAa,EACb,eAAe,EAEhB,8BAA0B;AAE3B,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,qBAAiB;AAEhE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B,CAAC;AAmDF;;;;;;;;;;GAUG;AAIH,wBAAsB,aAAa,CACjC,KAAK,EAAE,oBAAoB,EAC3B,KAAK,GAAE,aAAa,EAAqC,EACzD,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,gBAAgB,CAAC,CA6B3B;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,UAAU,CAAC,EAAE,OAAO,WAE5E;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE,gBAAgB,EACzB,UAAU,CAAC,EAAE,OAAO,GACnB,OAAO,CAET"}
1
+ {"version":3,"file":"validator.d.cts","sourceRoot":"","sources":["../../src/manifest/validator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,uBAAuB,EAEvB,aAAa,EACb,eAAe,EAEhB,8BAA0B;AAE3B,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,qBAAiB;AAE1E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B,CAAC;AAmDF;;;;;;;;;;GAUG;AAIH,wBAAsB,aAAa,CACjC,KAAK,EAAE,oBAAoB,EAC3B,KAAK,GAAE,aAAa,EAAqC,EACzD,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,gBAAgB,CAAC,CA6B3B;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,UAAU,CAAC,EAAE,OAAO,WAE5E;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE,gBAAgB,EACzB,UAAU,CAAC,EAAE,OAAO,GACnB,OAAO,CAET"}
@@ -1,7 +1,7 @@
1
1
  import type { ValidatorContextOptions, ValidatorMeta, ValidatorReport } from "./validator-types.mjs";
2
- import type { SnapFiles, UnvalidatedSnapFiles } from "../types.mjs";
2
+ import type { UnvalidatedSnapFiles, ExtendableSnapFiles } from "../types.mjs";
3
3
  export type ValidatorResults = {
4
- files?: SnapFiles;
4
+ files?: ExtendableSnapFiles;
5
5
  reports: ValidatorReport[];
6
6
  };
7
7
  /**
@@ -25,7 +25,7 @@ export declare function runValidators(files: UnvalidatedSnapFiles, rules?: Valid
25
25
  */
26
26
  export declare function isReportFixable(report: ValidatorReport, errorsOnly?: boolean): boolean;
27
27
  /**
28
- * Get whether any reports has pending fixes.
28
+ * Get whether any reports have pending fixes.
29
29
  *
30
30
  * @param results - Results of the validation run.
31
31
  * @param errorsOnly - Whether to only consider errors for pending fixes.
@@ -1 +1 @@
1
- {"version":3,"file":"validator.d.mts","sourceRoot":"","sources":["../../src/manifest/validator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,uBAAuB,EAEvB,aAAa,EACb,eAAe,EAEhB,8BAA0B;AAE3B,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,qBAAiB;AAEhE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B,CAAC;AAmDF;;;;;;;;;;GAUG;AAIH,wBAAsB,aAAa,CACjC,KAAK,EAAE,oBAAoB,EAC3B,KAAK,GAAE,aAAa,EAAqC,EACzD,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,gBAAgB,CAAC,CA6B3B;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,UAAU,CAAC,EAAE,OAAO,WAE5E;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE,gBAAgB,EACzB,UAAU,CAAC,EAAE,OAAO,GACnB,OAAO,CAET"}
1
+ {"version":3,"file":"validator.d.mts","sourceRoot":"","sources":["../../src/manifest/validator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,uBAAuB,EAEvB,aAAa,EACb,eAAe,EAEhB,8BAA0B;AAE3B,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,qBAAiB;AAE1E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B,CAAC;AAmDF;;;;;;;;;;GAUG;AAIH,wBAAsB,aAAa,CACjC,KAAK,EAAE,oBAAoB,EAC3B,KAAK,GAAE,aAAa,EAAqC,EACzD,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,gBAAgB,CAAC,CA6B3B;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,UAAU,CAAC,EAAE,OAAO,WAE5E;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE,gBAAgB,EACzB,UAAU,CAAC,EAAE,OAAO,GACnB,OAAO,CAET"}
@@ -89,7 +89,7 @@ export function isReportFixable(report, errorsOnly) {
89
89
  return Boolean(report.fix && (!errorsOnly || report.severity === 'error'));
90
90
  }
91
91
  /**
92
- * Get whether any reports has pending fixes.
92
+ * Get whether any reports have pending fixes.
93
93
  *
94
94
  * @param results - Results of the validation run.
95
95
  * @param errorsOnly - Whether to only consider errors for pending fixes.
@@ -1 +1 @@
1
- {"version":3,"file":"validator.mjs","sourceRoot":"","sources":["../../src/manifest/validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,wBAAwB;AAUzC,OAAO,KAAK,iBAAiB,+BAAqB;AAQlD,MAAM,OAAO;IACX,OAAO,GAAsB,EAAE,CAAC;IAEvB,QAAQ,GAA4B,EAAE,CAAC;IAEhD,aAAa,GAAuB,SAAS,CAAC;IAE9C;;;;;OAKG;IACH,YAAY,OAAgC;QAC1C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,EAAU,EAAE,OAAe,EAAE,GAAkB;QACpD,MAAM,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC;QAEzC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,EAAE;YACF,OAAO;YACP,GAAG;YACH,QAAQ,EAAE,IAAI,CAAC,aAAa;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB,CAAC,QAAyC;QAC3D,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACzC,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF;AAED;;;;;;;;;;GAUG;AACH,iEAAiE;AACjE,8DAA8D;AAC9D,+BAA+B;AAC/B,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAA2B,EAC3B,QAAyB,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,EACzD,UAAmC,EAAE;IAErC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,mBAAmB,CAAC;YAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,mBAAmB,CAAC;YAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,KAAkB,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAkB;QACzB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,MAAuB,EAAE,UAAoB;IAC3E,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CACtB,OAAyB,EACzB,UAAoB;IAEpB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AAC/E,CAAC","sourcesContent":["import { assert } from '@metamask/utils';\n\nimport type {\n ValidatorContext,\n ValidatorContextOptions,\n ValidatorFix,\n ValidatorMeta,\n ValidatorReport,\n ValidatorSeverity,\n} from './validator-types';\nimport * as defaultValidators from './validators';\nimport type { SnapFiles, UnvalidatedSnapFiles } from '../types';\n\nexport type ValidatorResults = {\n files?: SnapFiles;\n reports: ValidatorReport[];\n};\n\nclass Context implements ValidatorContext {\n reports: ValidatorReport[] = [];\n\n readonly #options: ValidatorContextOptions = {};\n\n #nextSeverity?: ValidatorSeverity = undefined;\n\n /**\n * Construct a new validator context.\n *\n * @param options - The options for the validator context.\n * @param options.exports - Exports detected by evaluating the bundle.\n */\n constructor(options: ValidatorContextOptions) {\n this.#options = options;\n }\n\n /**\n * Report a validation error or warning.\n *\n * @param id - The unique identifier for the report.\n * @param message - The message describing the validation issue.\n * @param fix - An optional fix function that can be used to automatically\n * resolve the issue.\n */\n report(id: string, message: string, fix?: ValidatorFix): void {\n assert(this.#nextSeverity !== undefined);\n\n this.reports.push({\n id,\n message,\n fix,\n severity: this.#nextSeverity,\n });\n }\n\n prepareForValidator(settings: { severity: ValidatorSeverity }) {\n this.#nextSeverity = settings.severity;\n }\n\n get hasErrors() {\n return this.reports.some((report) => report.severity === 'error');\n }\n\n get options() {\n return this.#options;\n }\n}\n\n/**\n * Verify that snap files are completely valid.\n * First it runs validators on unparsed files to check structure.\n * Secondly it runs validators on parsed files to check semantics.\n *\n * @param files - All files required to run a snap.\n * @param rules - Validators to run.\n * @param options - Options for the validation.\n * @param options.exports - Exports detected by evaluating the bundle.\n * @returns The validation results.\n */\n// TODO(ritave): snap.manifest.json and package.json should check\n// json parsing as well instead of assuming it's\n// already parsed\nexport async function runValidators(\n files: UnvalidatedSnapFiles,\n rules: ValidatorMeta[] = Object.values(defaultValidators),\n options: ValidatorContextOptions = {},\n): Promise<ValidatorResults> {\n const context = new Context(options);\n\n for (const rule of rules) {\n context.prepareForValidator({\n severity: rule.severity,\n });\n\n await rule.structureCheck?.(files, context);\n }\n\n if (context.hasErrors) {\n return {\n reports: context.reports,\n };\n }\n\n for (const rule of rules) {\n context.prepareForValidator({\n severity: rule.severity,\n });\n\n await rule.semanticCheck?.(files as SnapFiles, context);\n }\n\n return {\n files: files as SnapFiles,\n reports: context.reports,\n };\n}\n\n/**\n * Check whether a report is fixable.\n *\n * @param report - The report to check.\n * @param errorsOnly - Whether to only consider errors for fixability.\n * @returns Whether the report is fixable.\n */\nexport function isReportFixable(report: ValidatorReport, errorsOnly?: boolean) {\n return Boolean(report.fix && (!errorsOnly || report.severity === 'error'));\n}\n\n/**\n * Get whether any reports has pending fixes.\n *\n * @param results - Results of the validation run.\n * @param errorsOnly - Whether to only consider errors for pending fixes.\n * @returns Whether there are fixes pending.\n */\nexport function hasFixes(\n results: ValidatorResults,\n errorsOnly?: boolean,\n): boolean {\n return results.reports.some((report) => isReportFixable(report, errorsOnly));\n}\n"]}
1
+ {"version":3,"file":"validator.mjs","sourceRoot":"","sources":["../../src/manifest/validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,wBAAwB;AAUzC,OAAO,KAAK,iBAAiB,+BAAqB;AAQlD,MAAM,OAAO;IACX,OAAO,GAAsB,EAAE,CAAC;IAEvB,QAAQ,GAA4B,EAAE,CAAC;IAEhD,aAAa,GAAuB,SAAS,CAAC;IAE9C;;;;;OAKG;IACH,YAAY,OAAgC;QAC1C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,EAAU,EAAE,OAAe,EAAE,GAAkB;QACpD,MAAM,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC;QAEzC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,EAAE;YACF,OAAO;YACP,GAAG;YACH,QAAQ,EAAE,IAAI,CAAC,aAAa;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB,CAAC,QAAyC;QAC3D,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACzC,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF;AAED;;;;;;;;;;GAUG;AACH,iEAAiE;AACjE,8DAA8D;AAC9D,+BAA+B;AAC/B,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAA2B,EAC3B,QAAyB,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,EACzD,UAAmC,EAAE;IAErC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,mBAAmB,CAAC;YAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,mBAAmB,CAAC;YAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,KAA4B,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAA4B;QACnC,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,MAAuB,EAAE,UAAoB;IAC3E,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CACtB,OAAyB,EACzB,UAAoB;IAEpB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AAC/E,CAAC","sourcesContent":["import { assert } from '@metamask/utils';\n\nimport type {\n ValidatorContext,\n ValidatorContextOptions,\n ValidatorFix,\n ValidatorMeta,\n ValidatorReport,\n ValidatorSeverity,\n} from './validator-types';\nimport * as defaultValidators from './validators';\nimport type { UnvalidatedSnapFiles, ExtendableSnapFiles } from '../types';\n\nexport type ValidatorResults = {\n files?: ExtendableSnapFiles;\n reports: ValidatorReport[];\n};\n\nclass Context implements ValidatorContext {\n reports: ValidatorReport[] = [];\n\n readonly #options: ValidatorContextOptions = {};\n\n #nextSeverity?: ValidatorSeverity = undefined;\n\n /**\n * Construct a new validator context.\n *\n * @param options - The options for the validator context.\n * @param options.exports - Exports detected by evaluating the bundle.\n */\n constructor(options: ValidatorContextOptions) {\n this.#options = options;\n }\n\n /**\n * Report a validation error or warning.\n *\n * @param id - The unique identifier for the report.\n * @param message - The message describing the validation issue.\n * @param fix - An optional fix function that can be used to automatically\n * resolve the issue.\n */\n report(id: string, message: string, fix?: ValidatorFix): void {\n assert(this.#nextSeverity !== undefined);\n\n this.reports.push({\n id,\n message,\n fix,\n severity: this.#nextSeverity,\n });\n }\n\n prepareForValidator(settings: { severity: ValidatorSeverity }) {\n this.#nextSeverity = settings.severity;\n }\n\n get hasErrors() {\n return this.reports.some((report) => report.severity === 'error');\n }\n\n get options() {\n return this.#options;\n }\n}\n\n/**\n * Verify that snap files are completely valid.\n * First it runs validators on unparsed files to check structure.\n * Secondly it runs validators on parsed files to check semantics.\n *\n * @param files - All files required to run a snap.\n * @param rules - Validators to run.\n * @param options - Options for the validation.\n * @param options.exports - Exports detected by evaluating the bundle.\n * @returns The validation results.\n */\n// TODO(ritave): snap.manifest.json and package.json should check\n// json parsing as well instead of assuming it's\n// already parsed\nexport async function runValidators(\n files: UnvalidatedSnapFiles,\n rules: ValidatorMeta[] = Object.values(defaultValidators),\n options: ValidatorContextOptions = {},\n): Promise<ValidatorResults> {\n const context = new Context(options);\n\n for (const rule of rules) {\n context.prepareForValidator({\n severity: rule.severity,\n });\n\n await rule.structureCheck?.(files, context);\n }\n\n if (context.hasErrors) {\n return {\n reports: context.reports,\n };\n }\n\n for (const rule of rules) {\n context.prepareForValidator({\n severity: rule.severity,\n });\n\n await rule.semanticCheck?.(files as ExtendableSnapFiles, context);\n }\n\n return {\n files: files as ExtendableSnapFiles,\n reports: context.reports,\n };\n}\n\n/**\n * Check whether a report is fixable.\n *\n * @param report - The report to check.\n * @param errorsOnly - Whether to only consider errors for fixability.\n * @returns Whether the report is fixable.\n */\nexport function isReportFixable(report: ValidatorReport, errorsOnly?: boolean) {\n return Boolean(report.fix && (!errorsOnly || report.severity === 'error'));\n}\n\n/**\n * Get whether any reports have pending fixes.\n *\n * @param results - Results of the validation run.\n * @param errorsOnly - Whether to only consider errors for pending fixes.\n * @returns Whether there are fixes pending.\n */\nexport function hasFixes(\n results: ValidatorResults,\n errorsOnly?: boolean,\n): boolean {\n return results.reports.some((report) => isReportFixable(report, errorsOnly));\n}\n"]}
@@ -9,12 +9,20 @@ const types_1 = require("../../types.cjs");
9
9
  exports.checksum = {
10
10
  severity: 'error',
11
11
  async semanticCheck(files, context) {
12
- const fetchedFiles = files;
13
- const gotChecksum = files.manifest.result.source.shasum;
12
+ const mergedManifest = files.manifest.mainManifest.clone();
13
+ mergedManifest.result = files.manifest.mergedManifest;
14
+ mergedManifest.value = JSON.stringify(files.manifest.mergedManifest);
15
+ const fetchedFiles = {
16
+ ...files,
17
+ manifest: mergedManifest,
18
+ };
19
+ const gotChecksum = files.manifest.mergedManifest.source.shasum;
14
20
  const expectedChecksum = await (0, snaps_1.getSnapChecksum)(fetchedFiles);
15
21
  if (gotChecksum !== expectedChecksum) {
16
22
  context.report('checksum', `"${types_1.NpmSnapFileNames.Manifest}" "shasum" field does not match computed shasum. Got "${gotChecksum}", expected "${expectedChecksum}".`, async ({ manifest }) => {
17
- manifest.source.shasum = expectedChecksum;
23
+ manifest.mainManifest.result ??= {};
24
+ manifest.mainManifest.result.source ??= {};
25
+ manifest.mainManifest.result.source.shasum = expectedChecksum;
18
26
  return { manifest };
19
27
  });
20
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"checksum.cjs","sourceRoot":"","sources":["../../../src/manifest/validators/checksum.ts"],"names":[],"mappings":";;;AAAA,2CAA8C;AAE9C,2CAA+C;AAG/C;;GAEG;AACU,QAAA,QAAQ,GAAkB;IACrC,QAAQ,EAAE,OAAO;IACjB,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO;QAChC,MAAM,YAAY,GAAqB,KAAK,CAAC;QAC7C,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;QACxD,MAAM,gBAAgB,GAAG,MAAM,IAAA,uBAAe,EAAC,YAAY,CAAC,CAAC;QAC7D,IAAI,WAAW,KAAK,gBAAgB,EAAE,CAAC;YACrC,OAAO,CAAC,MAAM,CACZ,UAAU,EACV,IAAI,wBAAgB,CAAC,QAAQ,yDAAyD,WAAW,gBAAgB,gBAAgB,IAAI,EACrI,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;gBACrB,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,gBAAgB,CAAC;gBAC1C,OAAO,EAAE,QAAQ,EAAE,CAAC;YACtB,CAAC,CACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC","sourcesContent":["import { getSnapChecksum } from '../../snaps';\nimport type { FetchedSnapFiles } from '../../types';\nimport { NpmSnapFileNames } from '../../types';\nimport type { ValidatorMeta } from '../validator-types';\n\n/**\n * Check if the checksum in manifest matches computed value.\n */\nexport const checksum: ValidatorMeta = {\n severity: 'error',\n async semanticCheck(files, context) {\n const fetchedFiles: FetchedSnapFiles = files;\n const gotChecksum = files.manifest.result.source.shasum;\n const expectedChecksum = await getSnapChecksum(fetchedFiles);\n if (gotChecksum !== expectedChecksum) {\n context.report(\n 'checksum',\n `\"${NpmSnapFileNames.Manifest}\" \"shasum\" field does not match computed shasum. Got \"${gotChecksum}\", expected \"${expectedChecksum}\".`,\n async ({ manifest }) => {\n manifest.source.shasum = expectedChecksum;\n return { manifest };\n },\n );\n }\n },\n};\n"]}
1
+ {"version":3,"file":"checksum.cjs","sourceRoot":"","sources":["../../../src/manifest/validators/checksum.ts"],"names":[],"mappings":";;;AAAA,2CAA8C;AAE9C,2CAA+C;AAK/C;;GAEG;AACU,QAAA,QAAQ,GAAkB;IACrC,QAAQ,EAAE,OAAO;IACjB,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO;QAChC,MAAM,cAAc,GAClB,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,EAA+B,CAAC;QACnE,cAAc,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC;QACtD,cAAc,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAErE,MAAM,YAAY,GAAqB;YACrC,GAAG,KAAK;YACR,QAAQ,EAAE,cAAc;SACzB,CAAC;QAEF,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC;QAChE,MAAM,gBAAgB,GAAG,MAAM,IAAA,uBAAe,EAAC,YAAY,CAAC,CAAC;QAC7D,IAAI,WAAW,KAAK,gBAAgB,EAAE,CAAC;YACrC,OAAO,CAAC,MAAM,CACZ,UAAU,EACV,IAAI,wBAAgB,CAAC,QAAQ,yDAAyD,WAAW,gBAAgB,gBAAgB,IAAI,EACrI,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;gBACrB,QAAQ,CAAC,YAAY,CAAC,MAAM,KAAK,EAAE,CAAC;gBACpC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,KAAK,EAAE,CAAC;gBAC3C,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,gBAAgB,CAAC;gBAC9D,OAAO,EAAE,QAAQ,EAAE,CAAC;YACtB,CAAC,CACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC","sourcesContent":["import { getSnapChecksum } from '../../snaps';\nimport type { FetchedSnapFiles } from '../../types';\nimport { NpmSnapFileNames } from '../../types';\nimport type { VirtualFile } from '../../virtual-file';\nimport type { SnapManifest } from '../validation';\nimport type { ValidatorMeta } from '../validator-types';\n\n/**\n * Check if the checksum in manifest matches computed value.\n */\nexport const checksum: ValidatorMeta = {\n severity: 'error',\n async semanticCheck(files, context) {\n const mergedManifest =\n files.manifest.mainManifest.clone() as VirtualFile<SnapManifest>;\n mergedManifest.result = files.manifest.mergedManifest;\n mergedManifest.value = JSON.stringify(files.manifest.mergedManifest);\n\n const fetchedFiles: FetchedSnapFiles = {\n ...files,\n manifest: mergedManifest,\n };\n\n const gotChecksum = files.manifest.mergedManifest.source.shasum;\n const expectedChecksum = await getSnapChecksum(fetchedFiles);\n if (gotChecksum !== expectedChecksum) {\n context.report(\n 'checksum',\n `\"${NpmSnapFileNames.Manifest}\" \"shasum\" field does not match computed shasum. Got \"${gotChecksum}\", expected \"${expectedChecksum}\".`,\n async ({ manifest }) => {\n manifest.mainManifest.result ??= {};\n manifest.mainManifest.result.source ??= {};\n manifest.mainManifest.result.source.shasum = expectedChecksum;\n return { manifest };\n },\n );\n }\n },\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"checksum.d.cts","sourceRoot":"","sources":["../../../src/manifest/validators/checksum.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,+BAA2B;AAExD;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,aAiBtB,CAAC"}
1
+ {"version":3,"file":"checksum.d.cts","sourceRoot":"","sources":["../../../src/manifest/validators/checksum.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,+BAA2B;AAExD;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,aA4BtB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"checksum.d.mts","sourceRoot":"","sources":["../../../src/manifest/validators/checksum.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,+BAA2B;AAExD;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,aAiBtB,CAAC"}
1
+ {"version":3,"file":"checksum.d.mts","sourceRoot":"","sources":["../../../src/manifest/validators/checksum.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,+BAA2B;AAExD;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,aA4BtB,CAAC"}
@@ -6,12 +6,20 @@ import { NpmSnapFileNames } from "../../types.mjs";
6
6
  export const checksum = {
7
7
  severity: 'error',
8
8
  async semanticCheck(files, context) {
9
- const fetchedFiles = files;
10
- const gotChecksum = files.manifest.result.source.shasum;
9
+ const mergedManifest = files.manifest.mainManifest.clone();
10
+ mergedManifest.result = files.manifest.mergedManifest;
11
+ mergedManifest.value = JSON.stringify(files.manifest.mergedManifest);
12
+ const fetchedFiles = {
13
+ ...files,
14
+ manifest: mergedManifest,
15
+ };
16
+ const gotChecksum = files.manifest.mergedManifest.source.shasum;
11
17
  const expectedChecksum = await getSnapChecksum(fetchedFiles);
12
18
  if (gotChecksum !== expectedChecksum) {
13
19
  context.report('checksum', `"${NpmSnapFileNames.Manifest}" "shasum" field does not match computed shasum. Got "${gotChecksum}", expected "${expectedChecksum}".`, async ({ manifest }) => {
14
- manifest.source.shasum = expectedChecksum;
20
+ manifest.mainManifest.result ??= {};
21
+ manifest.mainManifest.result.source ??= {};
22
+ manifest.mainManifest.result.source.shasum = expectedChecksum;
15
23
  return { manifest };
16
24
  });
17
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"checksum.mjs","sourceRoot":"","sources":["../../../src/manifest/validators/checksum.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,wBAAoB;AAE9C,OAAO,EAAE,gBAAgB,EAAE,wBAAoB;AAG/C;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAkB;IACrC,QAAQ,EAAE,OAAO;IACjB,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO;QAChC,MAAM,YAAY,GAAqB,KAAK,CAAC;QAC7C,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;QACxD,MAAM,gBAAgB,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,CAAC;QAC7D,IAAI,WAAW,KAAK,gBAAgB,EAAE,CAAC;YACrC,OAAO,CAAC,MAAM,CACZ,UAAU,EACV,IAAI,gBAAgB,CAAC,QAAQ,yDAAyD,WAAW,gBAAgB,gBAAgB,IAAI,EACrI,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;gBACrB,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,gBAAgB,CAAC;gBAC1C,OAAO,EAAE,QAAQ,EAAE,CAAC;YACtB,CAAC,CACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC","sourcesContent":["import { getSnapChecksum } from '../../snaps';\nimport type { FetchedSnapFiles } from '../../types';\nimport { NpmSnapFileNames } from '../../types';\nimport type { ValidatorMeta } from '../validator-types';\n\n/**\n * Check if the checksum in manifest matches computed value.\n */\nexport const checksum: ValidatorMeta = {\n severity: 'error',\n async semanticCheck(files, context) {\n const fetchedFiles: FetchedSnapFiles = files;\n const gotChecksum = files.manifest.result.source.shasum;\n const expectedChecksum = await getSnapChecksum(fetchedFiles);\n if (gotChecksum !== expectedChecksum) {\n context.report(\n 'checksum',\n `\"${NpmSnapFileNames.Manifest}\" \"shasum\" field does not match computed shasum. Got \"${gotChecksum}\", expected \"${expectedChecksum}\".`,\n async ({ manifest }) => {\n manifest.source.shasum = expectedChecksum;\n return { manifest };\n },\n );\n }\n },\n};\n"]}
1
+ {"version":3,"file":"checksum.mjs","sourceRoot":"","sources":["../../../src/manifest/validators/checksum.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,wBAAoB;AAE9C,OAAO,EAAE,gBAAgB,EAAE,wBAAoB;AAK/C;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAkB;IACrC,QAAQ,EAAE,OAAO;IACjB,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO;QAChC,MAAM,cAAc,GAClB,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,EAA+B,CAAC;QACnE,cAAc,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC;QACtD,cAAc,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAErE,MAAM,YAAY,GAAqB;YACrC,GAAG,KAAK;YACR,QAAQ,EAAE,cAAc;SACzB,CAAC;QAEF,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC;QAChE,MAAM,gBAAgB,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,CAAC;QAC7D,IAAI,WAAW,KAAK,gBAAgB,EAAE,CAAC;YACrC,OAAO,CAAC,MAAM,CACZ,UAAU,EACV,IAAI,gBAAgB,CAAC,QAAQ,yDAAyD,WAAW,gBAAgB,gBAAgB,IAAI,EACrI,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;gBACrB,QAAQ,CAAC,YAAY,CAAC,MAAM,KAAK,EAAE,CAAC;gBACpC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,KAAK,EAAE,CAAC;gBAC3C,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,gBAAgB,CAAC;gBAC9D,OAAO,EAAE,QAAQ,EAAE,CAAC;YACtB,CAAC,CACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC","sourcesContent":["import { getSnapChecksum } from '../../snaps';\nimport type { FetchedSnapFiles } from '../../types';\nimport { NpmSnapFileNames } from '../../types';\nimport type { VirtualFile } from '../../virtual-file';\nimport type { SnapManifest } from '../validation';\nimport type { ValidatorMeta } from '../validator-types';\n\n/**\n * Check if the checksum in manifest matches computed value.\n */\nexport const checksum: ValidatorMeta = {\n severity: 'error',\n async semanticCheck(files, context) {\n const mergedManifest =\n files.manifest.mainManifest.clone() as VirtualFile<SnapManifest>;\n mergedManifest.result = files.manifest.mergedManifest;\n mergedManifest.value = JSON.stringify(files.manifest.mergedManifest);\n\n const fetchedFiles: FetchedSnapFiles = {\n ...files,\n manifest: mergedManifest,\n };\n\n const gotChecksum = files.manifest.mergedManifest.source.shasum;\n const expectedChecksum = await getSnapChecksum(fetchedFiles);\n if (gotChecksum !== expectedChecksum) {\n context.report(\n 'checksum',\n `\"${NpmSnapFileNames.Manifest}\" \"shasum\" field does not match computed shasum. Got \"${gotChecksum}\", expected \"${expectedChecksum}\".`,\n async ({ manifest }) => {\n manifest.mainManifest.result ??= {};\n manifest.mainManifest.result.source ??= {};\n manifest.mainManifest.result.source.shasum = expectedChecksum;\n return { manifest };\n },\n );\n }\n },\n};\n"]}
@@ -7,7 +7,7 @@ exports.iconDeclared = void 0;
7
7
  exports.iconDeclared = {
8
8
  severity: 'warning',
9
9
  semanticCheck(files, context) {
10
- if (!files.manifest.result.source.location.npm.iconPath) {
10
+ if (!files.manifest.mergedManifest.source?.location?.npm?.iconPath) {
11
11
  context.report('icon-declared', 'No icon found in the Snap manifest. It is recommended to include an icon for the Snap. See https://docs.metamask.io/snaps/how-to/design-a-snap/#guidelines-at-a-glance for more information.');
12
12
  }
13
13
  },
@@ -1 +1 @@
1
- {"version":3,"file":"icon-declared.cjs","sourceRoot":"","sources":["../../../src/manifest/validators/icon-declared.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACU,QAAA,YAAY,GAAkB;IACzC,QAAQ,EAAE,SAAS;IACnB,aAAa,CAAC,KAAK,EAAE,OAAO;QAC1B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACxD,OAAO,CAAC,MAAM,CACZ,eAAe,EACf,8LAA8L,CAC/L,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC","sourcesContent":["import type { ValidatorMeta } from '../validator-types';\n\n/**\n * Suggest including an icon if not found in manifest.\n */\nexport const iconDeclared: ValidatorMeta = {\n severity: 'warning',\n semanticCheck(files, context) {\n if (!files.manifest.result.source.location.npm.iconPath) {\n context.report(\n 'icon-declared',\n 'No icon found in the Snap manifest. It is recommended to include an icon for the Snap. See https://docs.metamask.io/snaps/how-to/design-a-snap/#guidelines-at-a-glance for more information.',\n );\n }\n },\n};\n"]}
1
+ {"version":3,"file":"icon-declared.cjs","sourceRoot":"","sources":["../../../src/manifest/validators/icon-declared.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACU,QAAA,YAAY,GAAkB;IACzC,QAAQ,EAAE,SAAS;IACnB,aAAa,CAAC,KAAK,EAAE,OAAO;QAC1B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;YACnE,OAAO,CAAC,MAAM,CACZ,eAAe,EACf,8LAA8L,CAC/L,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC","sourcesContent":["import type { ValidatorMeta } from '../validator-types';\n\n/**\n * Suggest including an icon if not found in manifest.\n */\nexport const iconDeclared: ValidatorMeta = {\n severity: 'warning',\n semanticCheck(files, context) {\n if (!files.manifest.mergedManifest.source?.location?.npm?.iconPath) {\n context.report(\n 'icon-declared',\n 'No icon found in the Snap manifest. It is recommended to include an icon for the Snap. See https://docs.metamask.io/snaps/how-to/design-a-snap/#guidelines-at-a-glance for more information.',\n );\n }\n },\n};\n"]}