@metamask/account-api
Version:
MetaMask Account API
1 lines • 6.52 kB
Source Map (JSON)
{"version":3,"file":"group.mjs","sourceRoot":"","sources":["../../src/api/group.ts"],"names":[],"mappings":"AAWA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAW,SAAS,CAAC;AAEjE;;;;GAIG;AACH,MAAM,CAAN,IAAY,gBAMX;AAND,WAAY,gBAAgB;IAC1B,kDAAkD;IAClD,4DAAwC,CAAA;IAExC,8CAA8C;IAC9C,oDAAgC,CAAA;AAClC,CAAC,EANW,gBAAgB,KAAhB,gBAAgB,QAM3B;AAOD;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GACjC,8FAA8F,CAAC;AAyEjG;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAuC,EACvC,EAAU;IAEV,OAAO,GAAG,QAAQ,IAAI,EAAE,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAAuC;IAEvC,OAAO,gBAAgB,CACrB,QAAQ,EACR,+BAA+B,CAChC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAO,GAAG,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,QAA2B,CAAC;IAC1D,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,UAA+B,CAAC;IAChE,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,WAAqB,CAAC;IAEvD,OAAO;QACL,MAAM,EAAE;YACN,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,WAAW;SACnB;QACD,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,UAAoB;KACzC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC;AAC5C,CAAC","sourcesContent":["import type { KeyringAccount } from '@metamask/keyring-api';\n\n// Circular import are allowed when using `import type`.\nimport type { AccountSelector } from './selector';\nimport {\n type AccountWallet,\n type AccountWalletId,\n type AccountWalletIdOf,\n type AccountWalletType,\n} from './wallet';\n\n/**\n * Default account group unique ID.\n *\n * This constant can be used to reference the \"default\" group from\n * an account wallet.\n */\nexport const DEFAULT_ACCOUNT_GROUP_UNIQUE_ID: string = 'default';\n\n/**\n * Account group object.\n *\n * Each group types groups accounts using different criterias.\n */\nexport enum AccountGroupType {\n /** Group that represents a multichain account. */\n MultichainAccount = 'multichain-account',\n\n /** Group that represents a single account. */\n SingleAccount = 'single-account',\n}\n\n/**\n * Account group ID.\n */\nexport type AccountGroupId = `${AccountWalletId}/${string}`;\n\n/**\n * Regex to validate a valid account group ID.\n */\nexport const ACCOUNT_GROUP_ID_REGEX =\n /^(?<walletId>(?<walletType>entropy|snap|keyring):(?<walletSubId>.+))\\/(?<groupSubId>[^/]+)$/u;\n\n/**\n * Parsed account group ID with its parsed wallet component and its sub-ID.\n */\nexport type ParsedAccountGroupId = {\n wallet: {\n id: AccountWalletId;\n type: AccountWalletType;\n subId: string;\n };\n subId: string;\n};\n\n/**\n * Account group that can hold multiple accounts.\n */\nexport type AccountGroup<Account extends KeyringAccount> = {\n /**\n * Account group ID.\n */\n get id(): AccountGroupId;\n\n /**\n * Account group type.\n */\n get type(): AccountGroupType;\n\n /**\n * Account wallet (parent).\n */\n get wallet(): AccountWallet<Account>;\n\n /**\n * Gets the accounts for this account group.\n *\n * @returns The accounts.\n */\n getAccounts(): Account[];\n\n /**\n * Gets the account for a given account ID.\n *\n * @param id - Account ID.\n * @returns The account or undefined if not found.\n */\n getAccount(id: Account['id']): Account | undefined;\n\n /**\n * Query an account matching the selector.\n *\n * @param selector - Query selector.\n * @returns The account matching the selector or undefined if not matching.\n * @throws If multiple accounts match the selector.\n */\n get(selector: AccountSelector<Account>): Account | undefined;\n\n /**\n * Query accounts matching the selector.\n *\n * @param selector - Query selector.\n * @returns The accounts matching the selector.\n */\n select(selector: AccountSelector<Account>): Account[];\n};\n\n/**\n * Type utility to compute a constrained {@link AccountGroupId} type given a\n * specifc {@link AccountWalletType}.\n */\nexport type AccountGroupIdOf<WalletType extends AccountWalletType> =\n `${AccountWalletIdOf<WalletType>}/${string}`;\n\n/**\n * Convert a wallet ID and a unique ID, to a group ID.\n *\n * @param walletId - A wallet ID.\n * @param id - A unique ID.\n * @returns A group ID.\n */\nexport function toAccountGroupId<WalletType extends AccountWalletType>(\n walletId: AccountWalletIdOf<WalletType>,\n id: string,\n): AccountGroupIdOf<WalletType> {\n return `${walletId}/${id}`;\n}\n\n/**\n * Convert a wallet ID to the default group ID.\n *\n * @param walletId - A wallet ID.\n * @returns The default group ID.\n */\nexport function toDefaultAccountGroupId<WalletType extends AccountWalletType>(\n walletId: AccountWalletIdOf<WalletType>,\n): AccountGroupIdOf<WalletType> {\n return toAccountGroupId<WalletType>(\n walletId,\n DEFAULT_ACCOUNT_GROUP_UNIQUE_ID,\n );\n}\n\n/**\n * Checks if the given value is {@link AccountGroupId}.\n *\n * @param value - The value to check.\n * @returns Whether the value is a {@link AccountGroupId}.\n */\nexport function isAccountGroupId(value: string): value is AccountGroupId {\n return ACCOUNT_GROUP_ID_REGEX.test(value);\n}\n\n/**\n * Parse a multichain account group ID to an object containing a wallet ID\n * information (wallet type and wallet sub-ID), as well as account group ID\n * information (group sub-ID).\n *\n * @param groupId - The account group ID to validate and parse.\n * @returns The parsed account group ID.\n * @throws When the group ID format is invalid.\n */\nexport function parseAccountGroupId(groupId: string): ParsedAccountGroupId {\n const match = ACCOUNT_GROUP_ID_REGEX.exec(groupId);\n if (!match?.groups) {\n throw new Error(`Invalid account group ID: \"${groupId}\"`);\n }\n\n const walletId = match.groups.walletId as AccountWalletId;\n const walletType = match.groups.walletType as AccountWalletType;\n const walletSubId = match.groups.walletSubId as string;\n\n return {\n wallet: {\n id: walletId,\n type: walletType,\n subId: walletSubId,\n },\n subId: match.groups.groupSubId as string,\n };\n}\n\n/**\n * Strip the account wallet ID from an account group ID.\n *\n * @param groupId - Account group ID.\n * @returns Account group sub-ID.\n * @throws When the group ID format is invalid.\n */\nexport function stripAccountWalletId(groupId: string): string {\n return parseAccountGroupId(groupId).subId;\n}\n"]}