diff --git a/packages/snaps-utils/coverage.json b/packages/snaps-utils/coverage.json index dcf2e2b964..fe235fd33d 100644 --- a/packages/snaps-utils/coverage.json +++ b/packages/snaps-utils/coverage.json @@ -1,6 +1,6 @@ { "branches": 99.75, "functions": 98.94, - "lines": 99.62, - "statements": 96.99 + "lines": 98.55, + "statements": 97.03 } diff --git a/packages/snaps-utils/src/eval-worker.ts b/packages/snaps-utils/src/eval-worker.ts index 3da16f88e9..232dbc30dd 100644 --- a/packages/snaps-utils/src/eval-worker.ts +++ b/packages/snaps-utils/src/eval-worker.ts @@ -6,8 +6,8 @@ import 'ses/lockdown'; import { readFileSync } from 'fs'; -import type { HandlerType } from './handler-types'; -import { SNAP_EXPORT_NAMES } from './handler-types'; +import type { HandlerType } from './handlers'; +import { SNAP_EXPORT_NAMES } from './handlers'; import { generateMockEndowments } from './mock'; declare let lockdown: any, Compartment: any; diff --git a/packages/snaps-utils/src/handlers.test.ts b/packages/snaps-utils/src/handlers.test.ts deleted file mode 100644 index 292cc93ce9..0000000000 --- a/packages/snaps-utils/src/handlers.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { SNAP_EXPORTS } from './handlers'; - -describe('SNAP_EXPORTS', () => { - describe('validator', () => { - it.each(Object.values(SNAP_EXPORTS))( - 'validates that the snap export is a function', - ({ validator }) => { - expect(validator(() => undefined)).toBe(true); - expect(validator('')).toBe(false); - }, - ); - }); -}); diff --git a/packages/snaps-utils/src/handlers/exports.test.ts b/packages/snaps-utils/src/handlers/exports.test.ts new file mode 100644 index 0000000000..cb0a5b617d --- /dev/null +++ b/packages/snaps-utils/src/handlers/exports.test.ts @@ -0,0 +1,34 @@ +import { SNAP_EXPORT_NAMES, SNAP_EXPORTS } from './exports'; + +describe('SNAP_EXPORTS', () => { + describe('validator', () => { + it.each(Object.values(SNAP_EXPORTS))( + 'validates that the snap export is a function', + ({ validator }) => { + expect(validator(() => undefined)).toBe(true); + expect(validator('')).toBe(false); + }, + ); + }); +}); + +describe('SNAP_EXPORT_NAMES', () => { + it('is an array of all handler types', () => { + expect(SNAP_EXPORT_NAMES).toStrictEqual([ + 'onRpcRequest', + 'onSignature', + 'onTransaction', + 'onCronjob', + 'onInstall', + 'onUpdate', + 'onNameLookup', + 'onKeyringRequest', + 'onHomePage', + 'onSettingsPage', + 'onUserInput', + 'onAssetsLookup', + 'onAssetsConversion', + 'onProtocolRequest', + ]); + }); +}); diff --git a/packages/snaps-utils/src/handlers.ts b/packages/snaps-utils/src/handlers/exports.ts similarity index 57% rename from packages/snaps-utils/src/handlers.ts rename to packages/snaps-utils/src/handlers/exports.ts index ef24aa4da7..bcf4cefe3f 100644 --- a/packages/snaps-utils/src/handlers.ts +++ b/packages/snaps-utils/src/handlers/exports.ts @@ -14,27 +14,8 @@ import type { OnUpdateHandler, OnUserInputHandler, } from '@metamask/snaps-sdk'; -import { ComponentOrElementStruct, SeverityLevel } from '@metamask/snaps-sdk'; -import { - assign, - literal, - nullable, - object, - optional, - string, - array, - size, - union, -} from '@metamask/superstruct'; -import type { SnapHandler } from './handler-types'; -import { HandlerType } from './handler-types'; - -export type SnapRpcHookArgs = { - origin: string; - handler: HandlerType; - request: Record; -}; +import { HandlerType } from './types'; export const SNAP_EXPORTS = { [HandlerType.OnRpcRequest]: { @@ -141,89 +122,4 @@ export const SNAP_EXPORTS = { }, } as const; -export const OnTransactionSeverityResponseStruct = object({ - severity: optional(literal(SeverityLevel.Critical)), -}); - -export const OnTransactionResponseWithIdStruct = assign( - OnTransactionSeverityResponseStruct, - object({ - id: string(), - }), -); - -export const OnTransactionResponseWithContentStruct = assign( - OnTransactionSeverityResponseStruct, - object({ - content: ComponentOrElementStruct, - }), -); - -export const OnTransactionResponseStruct = nullable( - union([ - OnTransactionResponseWithContentStruct, - OnTransactionResponseWithIdStruct, - ]), -); - -export const OnSignatureResponseStruct = OnTransactionResponseStruct; - -export const OnHomePageResponseWithContentStruct = object({ - content: ComponentOrElementStruct, -}); - -export const OnHomePageResponseWithIdStruct = object({ - id: string(), -}); - -export const OnHomePageResponseStruct = union([ - OnHomePageResponseWithContentStruct, - OnHomePageResponseWithIdStruct, -]); - -export const OnSettingsPageResponseStruct = OnHomePageResponseStruct; - -export const AddressResolutionStruct = object({ - protocol: string(), - resolvedDomain: string(), -}); - -export const DomainResolutionStruct = object({ - protocol: string(), - resolvedAddress: string(), - domainName: string(), -}); - -export const AddressResolutionResponseStruct = object({ - resolvedDomains: size(array(AddressResolutionStruct), 1, Infinity), -}); - -export const DomainResolutionResponseStruct = object({ - resolvedAddresses: size(array(DomainResolutionStruct), 1, Infinity), -}); - -export const OnNameLookupResponseStruct = nullable( - union([AddressResolutionResponseStruct, DomainResolutionResponseStruct]), -); - -/** - * Utility type for getting the handler function type from a handler type. - */ -export type HandlerFunction = - Type['validator'] extends (snapExport: unknown) => snapExport is infer Handler - ? Handler - : never; - -/** - * All the function-based handlers that a snap can implement. - */ -export type SnapFunctionExports = { - [Key in keyof typeof SNAP_EXPORTS]?: HandlerFunction< - (typeof SNAP_EXPORTS)[Key] - >; -}; - -/** - * All handlers that a snap can implement. - */ -export type SnapExports = SnapFunctionExports; +export const SNAP_EXPORT_NAMES = Object.values(HandlerType); diff --git a/packages/snaps-utils/src/handlers/home-page.ts b/packages/snaps-utils/src/handlers/home-page.ts new file mode 100644 index 0000000000..fce4b94643 --- /dev/null +++ b/packages/snaps-utils/src/handlers/home-page.ts @@ -0,0 +1,15 @@ +import { ComponentOrElementStruct } from '@metamask/snaps-sdk'; +import { object, string, union } from '@metamask/superstruct'; + +export const OnHomePageResponseWithContentStruct = object({ + content: ComponentOrElementStruct, +}); + +export const OnHomePageResponseWithIdStruct = object({ + id: string(), +}); + +export const OnHomePageResponseStruct = union([ + OnHomePageResponseWithContentStruct, + OnHomePageResponseWithIdStruct, +]); diff --git a/packages/snaps-utils/src/handlers/index.ts b/packages/snaps-utils/src/handlers/index.ts new file mode 100644 index 0000000000..0c164de707 --- /dev/null +++ b/packages/snaps-utils/src/handlers/index.ts @@ -0,0 +1,7 @@ +export * from './exports'; +export * from './home-page'; +export * from './name-lookup'; +export * from './settings-page'; +export * from './signature'; +export * from './transaction'; +export * from './types'; diff --git a/packages/snaps-utils/src/handlers/name-lookup.ts b/packages/snaps-utils/src/handlers/name-lookup.ts new file mode 100644 index 0000000000..c99d2313c7 --- /dev/null +++ b/packages/snaps-utils/src/handlers/name-lookup.ts @@ -0,0 +1,31 @@ +import { + array, + nullable, + object, + size, + string, + union, +} from '@metamask/superstruct'; + +export const AddressResolutionStruct = object({ + protocol: string(), + resolvedDomain: string(), +}); + +export const DomainResolutionStruct = object({ + protocol: string(), + resolvedAddress: string(), + domainName: string(), +}); + +export const AddressResolutionResponseStruct = object({ + resolvedDomains: size(array(AddressResolutionStruct), 1, Infinity), +}); + +export const DomainResolutionResponseStruct = object({ + resolvedAddresses: size(array(DomainResolutionStruct), 1, Infinity), +}); + +export const OnNameLookupResponseStruct = nullable( + union([AddressResolutionResponseStruct, DomainResolutionResponseStruct]), +); diff --git a/packages/snaps-utils/src/handlers/settings-page.ts b/packages/snaps-utils/src/handlers/settings-page.ts new file mode 100644 index 0000000000..4876095e2f --- /dev/null +++ b/packages/snaps-utils/src/handlers/settings-page.ts @@ -0,0 +1,3 @@ +import { OnHomePageResponseStruct } from './home-page'; + +export const OnSettingsPageResponseStruct = OnHomePageResponseStruct; diff --git a/packages/snaps-utils/src/handlers/signature.ts b/packages/snaps-utils/src/handlers/signature.ts new file mode 100644 index 0000000000..6073ea65e8 --- /dev/null +++ b/packages/snaps-utils/src/handlers/signature.ts @@ -0,0 +1,3 @@ +import { OnTransactionResponseStruct } from './transaction'; + +export const OnSignatureResponseStruct = OnTransactionResponseStruct; diff --git a/packages/snaps-utils/src/handlers/transaction.ts b/packages/snaps-utils/src/handlers/transaction.ts new file mode 100644 index 0000000000..66cc708207 --- /dev/null +++ b/packages/snaps-utils/src/handlers/transaction.ts @@ -0,0 +1,35 @@ +import { ComponentOrElementStruct, SeverityLevel } from '@metamask/snaps-sdk'; +import { + literal, + object, + optional, + string, + assign, + nullable, + union, +} from '@metamask/superstruct'; + +export const OnTransactionSeverityResponseStruct = object({ + severity: optional(literal(SeverityLevel.Critical)), +}); + +export const OnTransactionResponseWithIdStruct = assign( + OnTransactionSeverityResponseStruct, + object({ + id: string(), + }), +); + +export const OnTransactionResponseWithContentStruct = assign( + OnTransactionSeverityResponseStruct, + object({ + content: ComponentOrElementStruct, + }), +); + +export const OnTransactionResponseStruct = nullable( + union([ + OnTransactionResponseWithContentStruct, + OnTransactionResponseWithIdStruct, + ]), +); diff --git a/packages/snaps-utils/src/handler-types.ts b/packages/snaps-utils/src/handlers/types.ts similarity index 60% rename from packages/snaps-utils/src/handler-types.ts rename to packages/snaps-utils/src/handlers/types.ts index 210ac70115..bd68948828 100644 --- a/packages/snaps-utils/src/handler-types.ts +++ b/packages/snaps-utils/src/handlers/types.ts @@ -1,3 +1,33 @@ +import type { SNAP_EXPORTS } from './exports'; + +export type SnapRpcHookArgs = { + origin: string; + handler: HandlerType; + request: Record; +}; + +/** + * Utility type for getting the handler function type from a handler type. + */ +export type HandlerFunction = + Type['validator'] extends (snapExport: unknown) => snapExport is infer Handler + ? Handler + : never; + +/** + * All the function-based handlers that a snap can implement. + */ +export type SnapFunctionExports = { + [Key in keyof typeof SNAP_EXPORTS]?: HandlerFunction< + (typeof SNAP_EXPORTS)[Key] + >; +}; + +/** + * All handlers that a snap can implement. + */ +export type SnapExports = SnapFunctionExports; + export enum HandlerType { OnRpcRequest = 'onRpcRequest', OnSignature = 'onSignature', @@ -38,5 +68,3 @@ export type SnapHandler = { */ validator: (snapExport: unknown) => boolean; }; - -export const SNAP_EXPORT_NAMES = Object.values(HandlerType); diff --git a/packages/snaps-utils/src/index.executionenv.ts b/packages/snaps-utils/src/index.executionenv.ts index db7dbf9123..231173cb3f 100644 --- a/packages/snaps-utils/src/index.executionenv.ts +++ b/packages/snaps-utils/src/index.executionenv.ts @@ -1,7 +1,6 @@ // Special entrypoint for execution environments for bundle sizing reasons export * from './errors'; export * from './handlers'; -export * from './handler-types'; export * from './iframe'; export * from './logging'; export * from './types'; diff --git a/packages/snaps-utils/src/index.ts b/packages/snaps-utils/src/index.ts index bc35f64f4d..b51634f29b 100644 --- a/packages/snaps-utils/src/index.ts +++ b/packages/snaps-utils/src/index.ts @@ -14,7 +14,6 @@ export * from './derivation-paths'; export * from './entropy'; export * from './errors'; export * from './handlers'; -export * from './handler-types'; export * from './iframe'; export * from './json'; export * from './json-rpc';