@lukso/core 1.3.0 → 1.4.0-dev.ce42189

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -118,6 +118,42 @@ The `browserInfo` function is useful for:
118
118
  - Determining browser-specific features or limitations
119
119
  - Customizing UX based on browser capabilities
120
120
 
121
+ #### isLyx
122
+
123
+ Check if an asset is the native LYX token:
124
+
125
+ ```typescript
126
+ import { isLyx } from '@lukso/core/utils'
127
+
128
+ isLyx({ isNativeToken: true }) // true
129
+ isLyx({ standard: 'LSP7DigitalAsset' }) // false
130
+ ```
131
+
132
+ #### isToken
133
+
134
+ Check if an asset is a fungible token (including native LYX):
135
+
136
+ ```typescript
137
+ import { isToken } from '@lukso/core/utils'
138
+
139
+ isToken({ isNativeToken: true }) // true (LYX)
140
+ isToken({ standard: 'LSP7DigitalAsset', tokenType: 0 }) // true (Token)
141
+ isToken({ standard: 'LSP7DigitalAsset', tokenType: 1 }) // false (NFT)
142
+ isToken({ standard: 'LSP8IdentifiableDigitalAsset', tokenType: 0 }) // false
143
+ ```
144
+
145
+ #### isCollectible
146
+
147
+ Check if an asset is a collectible (NFT or collection) based on its LSP standard and token type:
148
+
149
+ ```typescript
150
+ import { isCollectible } from '@lukso/core/utils'
151
+
152
+ isCollectible({ standard: 'LSP7DigitalAsset', tokenType: 1 }) // true (NFT)
153
+ isCollectible({ standard: 'LSP8IdentifiableDigitalAsset', tokenType: 2 }) // true (Collection)
154
+ isCollectible({ standard: 'LSP7DigitalAsset', tokenType: 0 }) // false (Token)
155
+ ```
156
+
121
157
  #### slug
122
158
 
123
159
  Convert text to slug format (lowercase with hyphens):
@@ -1,4 +1,44 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// src/utils/browserInfo.ts
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// src/utils/assetChecks.ts
2
+ var _lspsmartcontracts = require('@lukso/lsp-smart-contracts');
3
+ var isLyx = (asset) => {
4
+ if (!asset || typeof asset !== "object") {
5
+ return false;
6
+ }
7
+ return asset.isNativeToken === true;
8
+ };
9
+ var isToken = (asset) => {
10
+ if (isLyx(asset)) {
11
+ return true;
12
+ }
13
+ if (!asset || typeof asset !== "object") {
14
+ return false;
15
+ }
16
+ const { standard, tokenType } = asset;
17
+ switch (standard) {
18
+ case "LSP7DigitalAsset" /* lsp7 */:
19
+ return tokenType === void 0 || tokenType === _lspsmartcontracts.LSP4_TOKEN_TYPES.TOKEN;
20
+ case "LSP8IdentifiableDigitalAsset" /* lsp8 */:
21
+ return false;
22
+ default:
23
+ return false;
24
+ }
25
+ };
26
+ var isCollectible = (asset) => {
27
+ if (!asset || typeof asset !== "object") {
28
+ return false;
29
+ }
30
+ const { standard, tokenType } = asset;
31
+ switch (standard) {
32
+ case "LSP7DigitalAsset" /* lsp7 */:
33
+ return tokenType === _lspsmartcontracts.LSP4_TOKEN_TYPES.NFT;
34
+ case "LSP8IdentifiableDigitalAsset" /* lsp8 */:
35
+ return tokenType === _lspsmartcontracts.LSP4_TOKEN_TYPES.COLLECTION || tokenType === _lspsmartcontracts.LSP4_TOKEN_TYPES.NFT;
36
+ default:
37
+ return false;
38
+ }
39
+ };
40
+
41
+ // src/utils/browserInfo.ts
2
42
  var EXTENSION_STORE_LINKS = {
3
43
  chrome: "https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn",
4
44
  brave: "https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn",
@@ -68,6 +108,16 @@ var browserInfo = (deviceService) => {
68
108
  return browserInfo2;
69
109
  };
70
110
 
111
+ // src/utils/safe-custom-element.ts
112
+ function safeCustomElement(tagName) {
113
+ return (classOrDescriptor) => {
114
+ if (typeof customElements !== "undefined" && !customElements.get(tagName)) {
115
+ customElements.define(tagName, classOrDescriptor);
116
+ }
117
+ return classOrDescriptor;
118
+ };
119
+ }
120
+
71
121
  // src/utils/signed-profile-urls.ts
72
122
  var _viem = require('viem');
73
123
  var _accounts = require('viem/accounts');
@@ -256,5 +306,9 @@ var UrlResolver = class {
256
306
 
257
307
 
258
308
 
259
- exports.EXTENSION_STORE_LINKS = EXTENSION_STORE_LINKS; exports.browserInfo = browserInfo; exports.createMessage = createMessage; exports.createSignedQR = createSignedQR; exports.parseSignedQR = parseSignedQR; exports.verifySignedQR = verifySignedQR; exports.isSignedQRFormat = isSignedQRFormat; exports.getControllerAddress = getControllerAddress; exports.EIP1271_MAGIC_VALUE = EIP1271_MAGIC_VALUE; exports.getEIP1271Data = getEIP1271Data; exports.slug = slug; exports.UrlConverter = UrlConverter; exports.UrlResolver = UrlResolver;
260
- //# sourceMappingURL=chunk-2KVLFGLM.cjs.map
309
+
310
+
311
+
312
+
313
+ exports.isLyx = isLyx; exports.isToken = isToken; exports.isCollectible = isCollectible; exports.EXTENSION_STORE_LINKS = EXTENSION_STORE_LINKS; exports.browserInfo = browserInfo; exports.safeCustomElement = safeCustomElement; exports.createMessage = createMessage; exports.createSignedQR = createSignedQR; exports.parseSignedQR = parseSignedQR; exports.verifySignedQR = verifySignedQR; exports.isSignedQRFormat = isSignedQRFormat; exports.getControllerAddress = getControllerAddress; exports.EIP1271_MAGIC_VALUE = EIP1271_MAGIC_VALUE; exports.getEIP1271Data = getEIP1271Data; exports.slug = slug; exports.UrlConverter = UrlConverter; exports.UrlResolver = UrlResolver;
314
+ //# sourceMappingURL=chunk-EN5MQDYX.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-EN5MQDYX.cjs","../src/utils/assetChecks.ts","../src/utils/browserInfo.ts","../src/utils/safe-custom-element.ts","../src/utils/signed-profile-urls.ts","../src/utils/slug.ts","../src/utils/url-resolver.ts"],"names":["browserInfo"],"mappings":"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","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-EN5MQDYX.cjs","sourcesContent":[null,"import { LSP4_TOKEN_TYPES } from '@lukso/lsp-smart-contracts'\nimport { Standards } from '../enums'\n\n/**\n * Checks if the given asset is the native LYX token.\n *\n * @param asset The asset to check.\n * @returns True if the asset is the native token, false otherwise.\n */\nexport const isLyx = (asset?: unknown) => {\n if (!asset || typeof asset !== 'object') {\n return false\n }\n\n return (asset as { isNativeToken?: boolean }).isNativeToken === true\n}\n\n/**\n * Checks if the given asset is a token based on its standard and token type.\n *\n * @param asset The asset to check.\n * @returns True if the asset is a token, false otherwise.\n */\nexport const isToken = (asset?: unknown) => {\n if (isLyx(asset)) {\n return true\n }\n\n if (!asset || typeof asset !== 'object') {\n return false\n }\n\n const { standard, tokenType } = asset as {\n standard?: string\n tokenType?: number\n }\n\n switch (standard) {\n case Standards.lsp7:\n return tokenType === undefined || tokenType === LSP4_TOKEN_TYPES.TOKEN\n case Standards.lsp8:\n return false\n default:\n return false\n }\n}\n\n/**\n * Checks if the given asset is a collectible based on its standard and token type.\n *\n * @param asset The asset to check.\n * @returns True if the asset is a collectible, false otherwise.\n */\nexport const isCollectible = (asset?: unknown) => {\n if (!asset || typeof asset !== 'object') {\n return false\n }\n\n const { standard, tokenType } = asset as {\n standard?: string\n tokenType?: number\n }\n\n switch (standard) {\n case Standards.lsp7:\n return tokenType === LSP4_TOKEN_TYPES.NFT\n case Standards.lsp8:\n return (\n tokenType === LSP4_TOKEN_TYPES.COLLECTION ||\n tokenType === LSP4_TOKEN_TYPES.NFT\n )\n default:\n return false\n }\n}\n","import type { DeviceService } from '../services'\n\nexport type BrowserName =\n | 'chrome'\n | 'safari'\n | 'firefox'\n | 'edge'\n | 'opera'\n | 'brave'\n\nexport type BrowserInfo = {\n id: BrowserName\n name: string\n icon: string\n storeLink: string\n}\n\n// extension store links (all webkit based browsers use chrome web store installation)\nexport const EXTENSION_STORE_LINKS = {\n chrome:\n 'https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn',\n brave:\n 'https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn',\n edge: 'https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn',\n opera: '',\n safari: '',\n firefox: '',\n}\n\n/**\n * Expose browser info to the app\n */\nexport const browserInfo = (deviceService: DeviceService): BrowserInfo => {\n const browserInfoDefaults = {\n id: 'chrome',\n name: '',\n icon: '',\n } as BrowserInfo\n\n const detectBrowser = (): BrowserInfo | undefined => {\n const { isChrome, isBrave, isFirefox, isSafari, isEdge, isOpera } =\n deviceService\n\n if (isBrave) {\n return {\n id: 'brave',\n name: 'Brave',\n icon: 'logo-brave',\n storeLink: EXTENSION_STORE_LINKS.brave,\n }\n }\n\n if (isEdge) {\n return {\n id: 'edge',\n name: 'Edge',\n icon: 'logo-edge',\n storeLink: EXTENSION_STORE_LINKS.edge,\n }\n }\n\n if (isOpera) {\n return {\n id: 'opera',\n name: 'Opera',\n icon: 'logo-opera',\n storeLink: EXTENSION_STORE_LINKS.opera,\n }\n }\n\n if (isChrome) {\n return {\n id: 'chrome',\n name: 'Chrome',\n icon: 'logo-chrome',\n storeLink: EXTENSION_STORE_LINKS.chrome,\n }\n }\n\n if (isFirefox) {\n return {\n id: 'firefox',\n name: 'Firefox',\n icon: 'logo-firefox',\n storeLink: EXTENSION_STORE_LINKS.firefox,\n }\n }\n\n if (isSafari) {\n return {\n id: 'safari',\n name: 'Safari',\n icon: 'logo-safari',\n storeLink: EXTENSION_STORE_LINKS.safari,\n }\n }\n }\n\n const browserInfo = { ...browserInfoDefaults, ...detectBrowser() }\n\n return browserInfo\n}\n","/**\n * SSR-safe custom element decorator that prevents duplicate registration errors.\n *\n * ## Why this exists\n *\n * The standard `@customElement()` decorator from Lit will throw an error if\n * a component is registered twice. This can happen in SSR environments where:\n * - Components are dynamically imported via multiple paths\n * - HMR causes modules to be re-executed during development\n * - Server and client bundles both try to register components\n *\n * ## Usage\n *\n * Use this instead of `@customElement()`:\n * ```ts\n * import { safeCustomElement } from '@lukso/core/utils'\n *\n * @safeCustomElement('my-component')\n * export class MyComponent extends LitElement {\n * // ...\n * }\n * ```\n *\n * @param tagName - The custom element tag name (must contain a hyphen)\n * @returns A class decorator that safely registers the element\n */\nexport function safeCustomElement(tagName: string) {\n return <T extends CustomElementConstructor>(classOrDescriptor: T): T => {\n // Only register if not already defined\n if (typeof customElements !== 'undefined' && !customElements.get(tagName)) {\n customElements.define(tagName, classOrDescriptor)\n }\n\n return classOrDescriptor\n }\n}\n","/**\n * @service-checkin/signed-qr-code\n *\n * Create and verify signed QR codes for Universal Profile check-ins.\n * Pure TypeScript - compatible with React Native, Node.js, and browsers.\n *\n * URI Format: ethereum:<address>@<chainId>?ts=<unixTimestamp>&sig=<signature>\n *\n * The signed message is everything before &sig= (the URI without the signature).\n * Uses EIP-191 prefixed signing (signMessage) for safety - this prevents\n * signed messages from being confused with transaction hashes.\n */\n\nimport { type Hex, hashMessage, recoverMessageAddress } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SignedQRData {\n /** The Universal Profile address */\n profileAddress: string\n /** The chain ID (42 for LUKSO mainnet, 4201 for testnet) */\n chainId: number\n /** Unix timestamp (seconds since epoch) */\n timestamp: number\n /** The signature over the message */\n signature: Hex\n}\n\n/**\n * Custom signer function type.\n * Takes the message string and returns an EIP-191 signature.\n * The signer should use `signMessage` (which adds the EIP-191 prefix).\n * Compatible with hardware wallets, secure enclaves, WalletConnect, etc.\n *\n * The EIP-191 prefix prevents signed messages from being confused with\n * transaction hashes, making this safe for identity verification.\n */\nexport type SignerFunction = (message: string) => Promise<Hex>\n\nexport interface CreateSignedQROptions {\n /**\n * Seconds to add to current time to account for QR generation/display latency.\n * The QR timestamp will be set to (now + generationOffsetSeconds).\n * Capped at 5 seconds maximum to prevent abuse.\n * Default: 0\n */\n generationOffsetSeconds?: number\n\n /**\n * Custom signer function for signing the message.\n * If provided, the privateKey parameter can be omitted or set to null.\n * Useful for hardware wallets, secure enclaves, or WalletConnect.\n *\n * The signer receives the message string and should use `signMessage`\n * (EIP-191 prefixed signing) to return the signature.\n *\n * @example\n * ```ts\n * // Using a wallet that signs messages\n * const uri = await createSignedQR(null, profileAddress, 42, {\n * signer: async (message) => {\n * return await wallet.signMessage(message)\n * }\n * })\n * ```\n */\n signer?: SignerFunction\n}\n\nexport interface VerifySignedQROptions {\n /** Maximum age in seconds before QR is considered expired (default: 60) */\n maxAgeSeconds?: number\n /** Skip timestamp validation (useful for testing) */\n skipTimestampValidation?: boolean\n}\n\nexport interface VerificationResult {\n /** Whether the QR code is valid and not expired */\n isValid: boolean\n /** The Universal Profile address from the QR */\n profileAddress: string\n /** The chain ID from the QR */\n chainId: number\n /** The timestamp from the QR (unix seconds) */\n timestamp: number\n /** The address recovered from the signature (the controller) */\n recoveredAddress: string\n /** Whether the QR has expired based on maxAgeSeconds */\n isExpired: boolean\n /** The original signed message (for EIP-1271 verification) */\n message: string\n /** The hash of the message (for EIP-1271 verification) */\n messageHash: Hex\n}\n\nexport interface ParsedQRData {\n profileAddress: string\n chainId: number\n timestamp: number\n signature: Hex\n message: string\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** URI scheme for signed QR codes */\nexport const URI_SCHEME = 'ethereum'\n\n/** Regex pattern for parsing signed QR URIs */\nconst URI_PATTERN =\n /^ethereum:(0x[a-fA-F0-9]{40})@(\\d+)\\?ts=(\\d+)&sig=(0x[a-fA-F0-9]+)$/\n\n// ============================================================================\n// Core Functions\n// ============================================================================\n\n/**\n * Create the message that will be signed.\n * This is the URI without the signature parameter.\n */\nexport function createMessage(\n profileAddress: string,\n chainId: number,\n timestamp: number\n): string {\n return `${URI_SCHEME}:${profileAddress.toLowerCase()}@${chainId}?ts=${timestamp}`\n}\n\n/** Maximum allowed generation offset to prevent abuse */\nconst MAX_GENERATION_OFFSET_SECONDS = 5\n\n/**\n * Create a signed QR URI string.\n *\n * @param privateKey - The controller's private key (hex string with 0x prefix).\n * Can be '0x' or omitted if using options.signer.\n * @param profileAddress - The Universal Profile address to sign for\n * @param chainId - The chain ID (42 for LUKSO mainnet, 4201 for testnet)\n * @param options - Optional configuration including custom signer\n * @returns The complete signed URI string ready to encode as QR\n *\n * @example\n * ```ts\n * // Using a private key directly\n * const uri = await createSignedQR(\n * '0x1234...', // controller private key\n * '0xabcd...', // profile address\n * 42, // LUKSO mainnet\n * { generationOffsetSeconds: 2 }\n * )\n *\n * // Using a custom signer (WalletConnect, hardware wallet, etc.)\n * const uri = await createSignedQR(\n * null, // not needed when signer is provided\n * '0xabcd...', // profile address\n * 42, // LUKSO mainnet\n * {\n * signer: async (message) => await wallet.signMessage(message)\n * }\n * )\n * // Returns: ethereum:0xabcd...@42?ts=1706345678&sig=0x...\n * ```\n */\nexport async function createSignedQR(\n privateKey: Hex | null,\n profileAddress: string,\n chainId: number,\n options?: CreateSignedQROptions\n): Promise<string> {\n // Cap the offset at MAX_GENERATION_OFFSET_SECONDS to prevent abuse\n const requestedOffset = options?.generationOffsetSeconds ?? 0\n const generationOffset = Math.min(\n Math.max(0, requestedOffset),\n MAX_GENERATION_OFFSET_SECONDS\n )\n const timestamp = Math.floor(Date.now() / 1000) + generationOffset\n\n const message = createMessage(profileAddress, chainId, timestamp)\n\n let signature: Hex\n\n if (options?.signer) {\n // Use custom signer (hardware wallet, secure enclave, WalletConnect, etc.)\n // Pass the message string - signer should use signMessage (EIP-191)\n signature = await options.signer(message)\n } else if (privateKey && privateKey !== '0x') {\n // Use private key directly with EIP-191 prefix (signMessage)\n const account = privateKeyToAccount(privateKey)\n signature = await account.signMessage({ message })\n } else {\n throw new Error(\n 'Either a valid privateKey or options.signer must be provided'\n )\n }\n\n return `${message}&sig=${signature}`\n}\n\n/**\n * Parse a signed QR URI without verification.\n * Use this when you need to extract data before full verification.\n *\n * @param uri - The signed QR URI string\n * @returns Parsed data or null if format is invalid\n */\nexport function parseSignedQR(uri: string): ParsedQRData | null {\n const match = uri.match(URI_PATTERN)\n\n if (!match) {\n return null\n }\n\n const [, profileAddress, chainIdStr, timestampStr, signature] = match\n\n return {\n profileAddress: profileAddress.toLowerCase(),\n chainId: Number.parseInt(chainIdStr, 10),\n timestamp: Number.parseInt(timestampStr, 10),\n signature: signature as Hex,\n message: createMessage(\n profileAddress,\n Number.parseInt(chainIdStr, 10),\n Number.parseInt(timestampStr, 10)\n ),\n }\n}\n\n/**\n * Verify a signed QR URI and recover the signer.\n *\n * This performs:\n * 1. URI format validation\n * 2. Signature recovery (gets the controller address that signed)\n * 3. Timestamp validation (checks if expired)\n *\n * Note: This does NOT verify that the recovered address is an authorized\n * controller of the profile. That check should be done separately using\n * EIP-1271 isValidSignature() or by checking controller permissions on-chain.\n *\n * @param uri - The signed QR URI string\n * @param options - Optional configuration\n * @returns Verification result with recovered address\n *\n * @example\n * ```ts\n * const result = await verifySignedQR(uri)\n *\n * if (result.isValid) {\n * console.log('Profile:', result.profileAddress)\n * console.log('Signed by:', result.recoveredAddress)\n *\n * // Now verify the signer is an authorized controller\n * // Option 1: Check if recoveredAddress === profileAddress (EOA case)\n * // Option 2: Call isValidSignature() on the profile contract\n * }\n * ```\n */\nexport async function verifySignedQR(\n uri: string,\n options?: VerifySignedQROptions\n): Promise<VerificationResult> {\n const maxAgeSeconds = options?.maxAgeSeconds ?? 60\n const skipTimestampValidation = options?.skipTimestampValidation ?? false\n\n // Parse the URI\n const parsed = parseSignedQR(uri)\n\n if (!parsed) {\n throw new Error('Invalid QR format: does not match expected URI pattern')\n }\n\n const { profileAddress, chainId, timestamp, signature, message } = parsed\n\n // Compute the EIP-191 message hash for storage\n const messageHash = hashMessage(message)\n\n // Recover the signer address using EIP-191 message recovery\n const recoveredAddress = await recoverMessageAddress({\n message,\n signature,\n })\n\n // Check if expired\n const now = Math.floor(Date.now() / 1000)\n const isExpired = !skipTimestampValidation && timestamp + maxAgeSeconds < now\n\n return {\n isValid: !isExpired,\n profileAddress,\n chainId,\n timestamp,\n recoveredAddress: recoveredAddress.toLowerCase(),\n isExpired,\n message,\n messageHash,\n }\n}\n\n/**\n * Check if a string looks like a valid signed QR URI.\n * This is a quick format check without full verification.\n */\nexport function isSignedQRFormat(uri: string): boolean {\n return URI_PATTERN.test(uri)\n}\n\n/**\n * Get the controller address from a private key.\n * Useful for displaying which address will sign the QR codes.\n */\nexport function getControllerAddress(privateKey: Hex): string {\n const account = privateKeyToAccount(privateKey)\n return account.address\n}\n\n// ============================================================================\n// EIP-1271 Helpers\n// ============================================================================\n\n/**\n * EIP-1271 magic value returned for valid signatures\n */\nexport const EIP1271_MAGIC_VALUE = '0x1626ba7e' as const\n\n/**\n * ABI for EIP-1271 isValidSignature function.\n * Use with viem's readContract to verify signatures on Universal Profiles.\n */\nexport const EIP1271_ABI = [\n {\n name: 'isValidSignature',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { name: 'dataHash', type: 'bytes32' },\n { name: 'signature', type: 'bytes' },\n ],\n outputs: [{ name: '', type: 'bytes4' }],\n },\n] as const\n\n/**\n * Prepare data for EIP-1271 verification.\n * Returns the hash and signature needed to call isValidSignature().\n *\n * @param uri - The original signed QR URI (needed to extract the signature)\n * @param verificationResult - The result from verifySignedQR()\n *\n * @example\n * ```ts\n * const result = await verifySignedQR(uri)\n * const { hash, signature } = getEIP1271Data(uri, result)\n *\n * const magicValue = await client.readContract({\n * address: result.profileAddress,\n * abi: EIP1271_ABI,\n * functionName: 'isValidSignature',\n * args: [hash, signature],\n * })\n *\n * const isAuthorizedController = magicValue === EIP1271_MAGIC_VALUE\n * ```\n */\nexport function getEIP1271Data(\n uri: string,\n verificationResult: VerificationResult\n): {\n hash: Hex\n signature: Hex\n} {\n const parsed = parseSignedQR(uri)\n if (!parsed) {\n throw new Error('Invalid QR format')\n }\n\n return {\n hash: verificationResult.messageHash,\n signature: parsed.signature,\n }\n}\n","/**\n * Make slug from text\n *\n * @param value\n * @returns\n */\nexport const slug = (value?: string) => {\n if (!value) {\n return ''\n }\n\n return value.toLowerCase().replace(/\\s+/g, '-') // convert spaces to hyphens\n}\n","export class UrlConverter {\n private destination: URL\n /**\n * It will relatively append pathname or hostname to the destination URL\n *\n * For example:\n * destination=https://some.api.gateway/something/ipfs\n * url=ipfs://QmSomeHash\n * output=https://some.api.gateway/something/ipfs/QmSomeHash\n *\n * destination=https://some.api.gateway/something/ipfs\n * url=https://something.com/somewhere\n * output=https://some.api.gateway/something/ipfs/somewhere\n *\n * @param destination destination string | URL\n */\n constructor(destination: string | URL) {\n this.destination = new URL(destination)\n if (this.destination.pathname.at(-1) !== '/') {\n this.destination.pathname += '/'\n }\n }\n\n resolveUrl(url: string): string {\n // Parse and convert to javascript URL objects\n // this will manage / and relative paths for us.\n const source = new URL(url)\n // extract the relative path. For URLs with a pathname prepend \".\" to make it ./ (i.e. relative)\n // for anything that only has a hostname we prepend ./ to make it relative\n // the pathname is at least slash for https urls, but '' for ipfs for example\n const relativePath = source.pathname\n ? `./${source.hostname}${source.pathname}` // pathname always starts with at least a slash\n : `./${source.hostname}`\n // Construct relative URL on destination using the relative pathname.\n const out = new URL(relativePath, this.destination)\n out.pathname = out.pathname.replaceAll(/\\/\\/+/g, '/')\n return out.toString()\n }\n}\n\nexport class UrlResolver {\n private converters: Array<{\n match: string | RegExp\n converter: UrlConverter\n }> = []\n constructor(converters: Array<[string | RegExp, UrlConverter | string]>) {\n for (const item of converters) {\n const [match, _converter] = item\n if (match == null) {\n throw new TypeError('Match criteria not defined')\n }\n const converter =\n typeof _converter === 'string'\n ? new UrlConverter(_converter)\n : _converter\n if (!(converter instanceof UrlConverter)) {\n throw new TypeError('Invalid converter')\n }\n this.converters.push({ match, converter })\n }\n }\n\n /**\n * Resolves a URL to a gateway URL.\n * Supports possible multiple converters transforming the URL\n * in sequence until no converter matches.\n *\n * @param {string} url to resolve\n * @returns {string} resolved url (if resolver is found, otherwise the parameter url is returned)\n */\n resolveUrl(url_: string): string {\n let url = url_\n const current = new Set<{\n match: string | RegExp\n converter: UrlConverter\n }>(this.converters)\n let found = true\n while (found) {\n found = false\n for (const entry of current) {\n const { match, converter } = entry\n if (match instanceof RegExp ? match.test(url) : url.startsWith(match)) {\n url = converter.resolveUrl(url)\n // This converter matches, so don't use it again.\n current.delete(entry)\n found = true\n break\n }\n }\n }\n return url\n }\n}\n"]}
@@ -1,3 +1,43 @@
1
+ // src/utils/assetChecks.ts
2
+ import { LSP4_TOKEN_TYPES } from "@lukso/lsp-smart-contracts";
3
+ var isLyx = (asset) => {
4
+ if (!asset || typeof asset !== "object") {
5
+ return false;
6
+ }
7
+ return asset.isNativeToken === true;
8
+ };
9
+ var isToken = (asset) => {
10
+ if (isLyx(asset)) {
11
+ return true;
12
+ }
13
+ if (!asset || typeof asset !== "object") {
14
+ return false;
15
+ }
16
+ const { standard, tokenType } = asset;
17
+ switch (standard) {
18
+ case "LSP7DigitalAsset" /* lsp7 */:
19
+ return tokenType === void 0 || tokenType === LSP4_TOKEN_TYPES.TOKEN;
20
+ case "LSP8IdentifiableDigitalAsset" /* lsp8 */:
21
+ return false;
22
+ default:
23
+ return false;
24
+ }
25
+ };
26
+ var isCollectible = (asset) => {
27
+ if (!asset || typeof asset !== "object") {
28
+ return false;
29
+ }
30
+ const { standard, tokenType } = asset;
31
+ switch (standard) {
32
+ case "LSP7DigitalAsset" /* lsp7 */:
33
+ return tokenType === LSP4_TOKEN_TYPES.NFT;
34
+ case "LSP8IdentifiableDigitalAsset" /* lsp8 */:
35
+ return tokenType === LSP4_TOKEN_TYPES.COLLECTION || tokenType === LSP4_TOKEN_TYPES.NFT;
36
+ default:
37
+ return false;
38
+ }
39
+ };
40
+
1
41
  // src/utils/browserInfo.ts
2
42
  var EXTENSION_STORE_LINKS = {
3
43
  chrome: "https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn",
@@ -68,6 +108,16 @@ var browserInfo = (deviceService) => {
68
108
  return browserInfo2;
69
109
  };
70
110
 
111
+ // src/utils/safe-custom-element.ts
112
+ function safeCustomElement(tagName) {
113
+ return (classOrDescriptor) => {
114
+ if (typeof customElements !== "undefined" && !customElements.get(tagName)) {
115
+ customElements.define(tagName, classOrDescriptor);
116
+ }
117
+ return classOrDescriptor;
118
+ };
119
+ }
120
+
71
121
  // src/utils/signed-profile-urls.ts
72
122
  import { hashMessage, recoverMessageAddress } from "viem";
73
123
  import { privateKeyToAccount } from "viem/accounts";
@@ -243,8 +293,12 @@ var UrlResolver = class {
243
293
  };
244
294
 
245
295
  export {
296
+ isLyx,
297
+ isToken,
298
+ isCollectible,
246
299
  EXTENSION_STORE_LINKS,
247
300
  browserInfo,
301
+ safeCustomElement,
248
302
  createMessage,
249
303
  createSignedQR,
250
304
  parseSignedQR,
@@ -257,4 +311,4 @@ export {
257
311
  UrlConverter,
258
312
  UrlResolver
259
313
  };
260
- //# sourceMappingURL=chunk-RECO5F6T.js.map
314
+ //# sourceMappingURL=chunk-KWOHF22J.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/assetChecks.ts","../src/utils/browserInfo.ts","../src/utils/safe-custom-element.ts","../src/utils/signed-profile-urls.ts","../src/utils/slug.ts","../src/utils/url-resolver.ts"],"sourcesContent":["import { LSP4_TOKEN_TYPES } from '@lukso/lsp-smart-contracts'\nimport { Standards } from '../enums'\n\n/**\n * Checks if the given asset is the native LYX token.\n *\n * @param asset The asset to check.\n * @returns True if the asset is the native token, false otherwise.\n */\nexport const isLyx = (asset?: unknown) => {\n if (!asset || typeof asset !== 'object') {\n return false\n }\n\n return (asset as { isNativeToken?: boolean }).isNativeToken === true\n}\n\n/**\n * Checks if the given asset is a token based on its standard and token type.\n *\n * @param asset The asset to check.\n * @returns True if the asset is a token, false otherwise.\n */\nexport const isToken = (asset?: unknown) => {\n if (isLyx(asset)) {\n return true\n }\n\n if (!asset || typeof asset !== 'object') {\n return false\n }\n\n const { standard, tokenType } = asset as {\n standard?: string\n tokenType?: number\n }\n\n switch (standard) {\n case Standards.lsp7:\n return tokenType === undefined || tokenType === LSP4_TOKEN_TYPES.TOKEN\n case Standards.lsp8:\n return false\n default:\n return false\n }\n}\n\n/**\n * Checks if the given asset is a collectible based on its standard and token type.\n *\n * @param asset The asset to check.\n * @returns True if the asset is a collectible, false otherwise.\n */\nexport const isCollectible = (asset?: unknown) => {\n if (!asset || typeof asset !== 'object') {\n return false\n }\n\n const { standard, tokenType } = asset as {\n standard?: string\n tokenType?: number\n }\n\n switch (standard) {\n case Standards.lsp7:\n return tokenType === LSP4_TOKEN_TYPES.NFT\n case Standards.lsp8:\n return (\n tokenType === LSP4_TOKEN_TYPES.COLLECTION ||\n tokenType === LSP4_TOKEN_TYPES.NFT\n )\n default:\n return false\n }\n}\n","import type { DeviceService } from '../services'\n\nexport type BrowserName =\n | 'chrome'\n | 'safari'\n | 'firefox'\n | 'edge'\n | 'opera'\n | 'brave'\n\nexport type BrowserInfo = {\n id: BrowserName\n name: string\n icon: string\n storeLink: string\n}\n\n// extension store links (all webkit based browsers use chrome web store installation)\nexport const EXTENSION_STORE_LINKS = {\n chrome:\n 'https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn',\n brave:\n 'https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn',\n edge: 'https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn',\n opera: '',\n safari: '',\n firefox: '',\n}\n\n/**\n * Expose browser info to the app\n */\nexport const browserInfo = (deviceService: DeviceService): BrowserInfo => {\n const browserInfoDefaults = {\n id: 'chrome',\n name: '',\n icon: '',\n } as BrowserInfo\n\n const detectBrowser = (): BrowserInfo | undefined => {\n const { isChrome, isBrave, isFirefox, isSafari, isEdge, isOpera } =\n deviceService\n\n if (isBrave) {\n return {\n id: 'brave',\n name: 'Brave',\n icon: 'logo-brave',\n storeLink: EXTENSION_STORE_LINKS.brave,\n }\n }\n\n if (isEdge) {\n return {\n id: 'edge',\n name: 'Edge',\n icon: 'logo-edge',\n storeLink: EXTENSION_STORE_LINKS.edge,\n }\n }\n\n if (isOpera) {\n return {\n id: 'opera',\n name: 'Opera',\n icon: 'logo-opera',\n storeLink: EXTENSION_STORE_LINKS.opera,\n }\n }\n\n if (isChrome) {\n return {\n id: 'chrome',\n name: 'Chrome',\n icon: 'logo-chrome',\n storeLink: EXTENSION_STORE_LINKS.chrome,\n }\n }\n\n if (isFirefox) {\n return {\n id: 'firefox',\n name: 'Firefox',\n icon: 'logo-firefox',\n storeLink: EXTENSION_STORE_LINKS.firefox,\n }\n }\n\n if (isSafari) {\n return {\n id: 'safari',\n name: 'Safari',\n icon: 'logo-safari',\n storeLink: EXTENSION_STORE_LINKS.safari,\n }\n }\n }\n\n const browserInfo = { ...browserInfoDefaults, ...detectBrowser() }\n\n return browserInfo\n}\n","/**\n * SSR-safe custom element decorator that prevents duplicate registration errors.\n *\n * ## Why this exists\n *\n * The standard `@customElement()` decorator from Lit will throw an error if\n * a component is registered twice. This can happen in SSR environments where:\n * - Components are dynamically imported via multiple paths\n * - HMR causes modules to be re-executed during development\n * - Server and client bundles both try to register components\n *\n * ## Usage\n *\n * Use this instead of `@customElement()`:\n * ```ts\n * import { safeCustomElement } from '@lukso/core/utils'\n *\n * @safeCustomElement('my-component')\n * export class MyComponent extends LitElement {\n * // ...\n * }\n * ```\n *\n * @param tagName - The custom element tag name (must contain a hyphen)\n * @returns A class decorator that safely registers the element\n */\nexport function safeCustomElement(tagName: string) {\n return <T extends CustomElementConstructor>(classOrDescriptor: T): T => {\n // Only register if not already defined\n if (typeof customElements !== 'undefined' && !customElements.get(tagName)) {\n customElements.define(tagName, classOrDescriptor)\n }\n\n return classOrDescriptor\n }\n}\n","/**\n * @service-checkin/signed-qr-code\n *\n * Create and verify signed QR codes for Universal Profile check-ins.\n * Pure TypeScript - compatible with React Native, Node.js, and browsers.\n *\n * URI Format: ethereum:<address>@<chainId>?ts=<unixTimestamp>&sig=<signature>\n *\n * The signed message is everything before &sig= (the URI without the signature).\n * Uses EIP-191 prefixed signing (signMessage) for safety - this prevents\n * signed messages from being confused with transaction hashes.\n */\n\nimport { type Hex, hashMessage, recoverMessageAddress } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SignedQRData {\n /** The Universal Profile address */\n profileAddress: string\n /** The chain ID (42 for LUKSO mainnet, 4201 for testnet) */\n chainId: number\n /** Unix timestamp (seconds since epoch) */\n timestamp: number\n /** The signature over the message */\n signature: Hex\n}\n\n/**\n * Custom signer function type.\n * Takes the message string and returns an EIP-191 signature.\n * The signer should use `signMessage` (which adds the EIP-191 prefix).\n * Compatible with hardware wallets, secure enclaves, WalletConnect, etc.\n *\n * The EIP-191 prefix prevents signed messages from being confused with\n * transaction hashes, making this safe for identity verification.\n */\nexport type SignerFunction = (message: string) => Promise<Hex>\n\nexport interface CreateSignedQROptions {\n /**\n * Seconds to add to current time to account for QR generation/display latency.\n * The QR timestamp will be set to (now + generationOffsetSeconds).\n * Capped at 5 seconds maximum to prevent abuse.\n * Default: 0\n */\n generationOffsetSeconds?: number\n\n /**\n * Custom signer function for signing the message.\n * If provided, the privateKey parameter can be omitted or set to null.\n * Useful for hardware wallets, secure enclaves, or WalletConnect.\n *\n * The signer receives the message string and should use `signMessage`\n * (EIP-191 prefixed signing) to return the signature.\n *\n * @example\n * ```ts\n * // Using a wallet that signs messages\n * const uri = await createSignedQR(null, profileAddress, 42, {\n * signer: async (message) => {\n * return await wallet.signMessage(message)\n * }\n * })\n * ```\n */\n signer?: SignerFunction\n}\n\nexport interface VerifySignedQROptions {\n /** Maximum age in seconds before QR is considered expired (default: 60) */\n maxAgeSeconds?: number\n /** Skip timestamp validation (useful for testing) */\n skipTimestampValidation?: boolean\n}\n\nexport interface VerificationResult {\n /** Whether the QR code is valid and not expired */\n isValid: boolean\n /** The Universal Profile address from the QR */\n profileAddress: string\n /** The chain ID from the QR */\n chainId: number\n /** The timestamp from the QR (unix seconds) */\n timestamp: number\n /** The address recovered from the signature (the controller) */\n recoveredAddress: string\n /** Whether the QR has expired based on maxAgeSeconds */\n isExpired: boolean\n /** The original signed message (for EIP-1271 verification) */\n message: string\n /** The hash of the message (for EIP-1271 verification) */\n messageHash: Hex\n}\n\nexport interface ParsedQRData {\n profileAddress: string\n chainId: number\n timestamp: number\n signature: Hex\n message: string\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** URI scheme for signed QR codes */\nexport const URI_SCHEME = 'ethereum'\n\n/** Regex pattern for parsing signed QR URIs */\nconst URI_PATTERN =\n /^ethereum:(0x[a-fA-F0-9]{40})@(\\d+)\\?ts=(\\d+)&sig=(0x[a-fA-F0-9]+)$/\n\n// ============================================================================\n// Core Functions\n// ============================================================================\n\n/**\n * Create the message that will be signed.\n * This is the URI without the signature parameter.\n */\nexport function createMessage(\n profileAddress: string,\n chainId: number,\n timestamp: number\n): string {\n return `${URI_SCHEME}:${profileAddress.toLowerCase()}@${chainId}?ts=${timestamp}`\n}\n\n/** Maximum allowed generation offset to prevent abuse */\nconst MAX_GENERATION_OFFSET_SECONDS = 5\n\n/**\n * Create a signed QR URI string.\n *\n * @param privateKey - The controller's private key (hex string with 0x prefix).\n * Can be '0x' or omitted if using options.signer.\n * @param profileAddress - The Universal Profile address to sign for\n * @param chainId - The chain ID (42 for LUKSO mainnet, 4201 for testnet)\n * @param options - Optional configuration including custom signer\n * @returns The complete signed URI string ready to encode as QR\n *\n * @example\n * ```ts\n * // Using a private key directly\n * const uri = await createSignedQR(\n * '0x1234...', // controller private key\n * '0xabcd...', // profile address\n * 42, // LUKSO mainnet\n * { generationOffsetSeconds: 2 }\n * )\n *\n * // Using a custom signer (WalletConnect, hardware wallet, etc.)\n * const uri = await createSignedQR(\n * null, // not needed when signer is provided\n * '0xabcd...', // profile address\n * 42, // LUKSO mainnet\n * {\n * signer: async (message) => await wallet.signMessage(message)\n * }\n * )\n * // Returns: ethereum:0xabcd...@42?ts=1706345678&sig=0x...\n * ```\n */\nexport async function createSignedQR(\n privateKey: Hex | null,\n profileAddress: string,\n chainId: number,\n options?: CreateSignedQROptions\n): Promise<string> {\n // Cap the offset at MAX_GENERATION_OFFSET_SECONDS to prevent abuse\n const requestedOffset = options?.generationOffsetSeconds ?? 0\n const generationOffset = Math.min(\n Math.max(0, requestedOffset),\n MAX_GENERATION_OFFSET_SECONDS\n )\n const timestamp = Math.floor(Date.now() / 1000) + generationOffset\n\n const message = createMessage(profileAddress, chainId, timestamp)\n\n let signature: Hex\n\n if (options?.signer) {\n // Use custom signer (hardware wallet, secure enclave, WalletConnect, etc.)\n // Pass the message string - signer should use signMessage (EIP-191)\n signature = await options.signer(message)\n } else if (privateKey && privateKey !== '0x') {\n // Use private key directly with EIP-191 prefix (signMessage)\n const account = privateKeyToAccount(privateKey)\n signature = await account.signMessage({ message })\n } else {\n throw new Error(\n 'Either a valid privateKey or options.signer must be provided'\n )\n }\n\n return `${message}&sig=${signature}`\n}\n\n/**\n * Parse a signed QR URI without verification.\n * Use this when you need to extract data before full verification.\n *\n * @param uri - The signed QR URI string\n * @returns Parsed data or null if format is invalid\n */\nexport function parseSignedQR(uri: string): ParsedQRData | null {\n const match = uri.match(URI_PATTERN)\n\n if (!match) {\n return null\n }\n\n const [, profileAddress, chainIdStr, timestampStr, signature] = match\n\n return {\n profileAddress: profileAddress.toLowerCase(),\n chainId: Number.parseInt(chainIdStr, 10),\n timestamp: Number.parseInt(timestampStr, 10),\n signature: signature as Hex,\n message: createMessage(\n profileAddress,\n Number.parseInt(chainIdStr, 10),\n Number.parseInt(timestampStr, 10)\n ),\n }\n}\n\n/**\n * Verify a signed QR URI and recover the signer.\n *\n * This performs:\n * 1. URI format validation\n * 2. Signature recovery (gets the controller address that signed)\n * 3. Timestamp validation (checks if expired)\n *\n * Note: This does NOT verify that the recovered address is an authorized\n * controller of the profile. That check should be done separately using\n * EIP-1271 isValidSignature() or by checking controller permissions on-chain.\n *\n * @param uri - The signed QR URI string\n * @param options - Optional configuration\n * @returns Verification result with recovered address\n *\n * @example\n * ```ts\n * const result = await verifySignedQR(uri)\n *\n * if (result.isValid) {\n * console.log('Profile:', result.profileAddress)\n * console.log('Signed by:', result.recoveredAddress)\n *\n * // Now verify the signer is an authorized controller\n * // Option 1: Check if recoveredAddress === profileAddress (EOA case)\n * // Option 2: Call isValidSignature() on the profile contract\n * }\n * ```\n */\nexport async function verifySignedQR(\n uri: string,\n options?: VerifySignedQROptions\n): Promise<VerificationResult> {\n const maxAgeSeconds = options?.maxAgeSeconds ?? 60\n const skipTimestampValidation = options?.skipTimestampValidation ?? false\n\n // Parse the URI\n const parsed = parseSignedQR(uri)\n\n if (!parsed) {\n throw new Error('Invalid QR format: does not match expected URI pattern')\n }\n\n const { profileAddress, chainId, timestamp, signature, message } = parsed\n\n // Compute the EIP-191 message hash for storage\n const messageHash = hashMessage(message)\n\n // Recover the signer address using EIP-191 message recovery\n const recoveredAddress = await recoverMessageAddress({\n message,\n signature,\n })\n\n // Check if expired\n const now = Math.floor(Date.now() / 1000)\n const isExpired = !skipTimestampValidation && timestamp + maxAgeSeconds < now\n\n return {\n isValid: !isExpired,\n profileAddress,\n chainId,\n timestamp,\n recoveredAddress: recoveredAddress.toLowerCase(),\n isExpired,\n message,\n messageHash,\n }\n}\n\n/**\n * Check if a string looks like a valid signed QR URI.\n * This is a quick format check without full verification.\n */\nexport function isSignedQRFormat(uri: string): boolean {\n return URI_PATTERN.test(uri)\n}\n\n/**\n * Get the controller address from a private key.\n * Useful for displaying which address will sign the QR codes.\n */\nexport function getControllerAddress(privateKey: Hex): string {\n const account = privateKeyToAccount(privateKey)\n return account.address\n}\n\n// ============================================================================\n// EIP-1271 Helpers\n// ============================================================================\n\n/**\n * EIP-1271 magic value returned for valid signatures\n */\nexport const EIP1271_MAGIC_VALUE = '0x1626ba7e' as const\n\n/**\n * ABI for EIP-1271 isValidSignature function.\n * Use with viem's readContract to verify signatures on Universal Profiles.\n */\nexport const EIP1271_ABI = [\n {\n name: 'isValidSignature',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { name: 'dataHash', type: 'bytes32' },\n { name: 'signature', type: 'bytes' },\n ],\n outputs: [{ name: '', type: 'bytes4' }],\n },\n] as const\n\n/**\n * Prepare data for EIP-1271 verification.\n * Returns the hash and signature needed to call isValidSignature().\n *\n * @param uri - The original signed QR URI (needed to extract the signature)\n * @param verificationResult - The result from verifySignedQR()\n *\n * @example\n * ```ts\n * const result = await verifySignedQR(uri)\n * const { hash, signature } = getEIP1271Data(uri, result)\n *\n * const magicValue = await client.readContract({\n * address: result.profileAddress,\n * abi: EIP1271_ABI,\n * functionName: 'isValidSignature',\n * args: [hash, signature],\n * })\n *\n * const isAuthorizedController = magicValue === EIP1271_MAGIC_VALUE\n * ```\n */\nexport function getEIP1271Data(\n uri: string,\n verificationResult: VerificationResult\n): {\n hash: Hex\n signature: Hex\n} {\n const parsed = parseSignedQR(uri)\n if (!parsed) {\n throw new Error('Invalid QR format')\n }\n\n return {\n hash: verificationResult.messageHash,\n signature: parsed.signature,\n }\n}\n","/**\n * Make slug from text\n *\n * @param value\n * @returns\n */\nexport const slug = (value?: string) => {\n if (!value) {\n return ''\n }\n\n return value.toLowerCase().replace(/\\s+/g, '-') // convert spaces to hyphens\n}\n","export class UrlConverter {\n private destination: URL\n /**\n * It will relatively append pathname or hostname to the destination URL\n *\n * For example:\n * destination=https://some.api.gateway/something/ipfs\n * url=ipfs://QmSomeHash\n * output=https://some.api.gateway/something/ipfs/QmSomeHash\n *\n * destination=https://some.api.gateway/something/ipfs\n * url=https://something.com/somewhere\n * output=https://some.api.gateway/something/ipfs/somewhere\n *\n * @param destination destination string | URL\n */\n constructor(destination: string | URL) {\n this.destination = new URL(destination)\n if (this.destination.pathname.at(-1) !== '/') {\n this.destination.pathname += '/'\n }\n }\n\n resolveUrl(url: string): string {\n // Parse and convert to javascript URL objects\n // this will manage / and relative paths for us.\n const source = new URL(url)\n // extract the relative path. For URLs with a pathname prepend \".\" to make it ./ (i.e. relative)\n // for anything that only has a hostname we prepend ./ to make it relative\n // the pathname is at least slash for https urls, but '' for ipfs for example\n const relativePath = source.pathname\n ? `./${source.hostname}${source.pathname}` // pathname always starts with at least a slash\n : `./${source.hostname}`\n // Construct relative URL on destination using the relative pathname.\n const out = new URL(relativePath, this.destination)\n out.pathname = out.pathname.replaceAll(/\\/\\/+/g, '/')\n return out.toString()\n }\n}\n\nexport class UrlResolver {\n private converters: Array<{\n match: string | RegExp\n converter: UrlConverter\n }> = []\n constructor(converters: Array<[string | RegExp, UrlConverter | string]>) {\n for (const item of converters) {\n const [match, _converter] = item\n if (match == null) {\n throw new TypeError('Match criteria not defined')\n }\n const converter =\n typeof _converter === 'string'\n ? new UrlConverter(_converter)\n : _converter\n if (!(converter instanceof UrlConverter)) {\n throw new TypeError('Invalid converter')\n }\n this.converters.push({ match, converter })\n }\n }\n\n /**\n * Resolves a URL to a gateway URL.\n * Supports possible multiple converters transforming the URL\n * in sequence until no converter matches.\n *\n * @param {string} url to resolve\n * @returns {string} resolved url (if resolver is found, otherwise the parameter url is returned)\n */\n resolveUrl(url_: string): string {\n let url = url_\n const current = new Set<{\n match: string | RegExp\n converter: UrlConverter\n }>(this.converters)\n let found = true\n while (found) {\n found = false\n for (const entry of current) {\n const { match, converter } = entry\n if (match instanceof RegExp ? match.test(url) : url.startsWith(match)) {\n url = converter.resolveUrl(url)\n // This converter matches, so don't use it again.\n current.delete(entry)\n found = true\n break\n }\n }\n }\n return url\n }\n}\n"],"mappings":"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","names":["browserInfo"]}
@@ -27,7 +27,9 @@ var en_US_default = {
27
27
  connect_modal_description: "Log in with your Universal Profile",
28
28
  connect_modal_connectors_up_mobile: "Mobile Application",
29
29
  connect_modal_connectors_up_browser_extension: "Browser Extension",
30
- connect_modal_connectors_passkey_wallet: "Passkey Wallet"
30
+ connect_modal_connectors_passkey_wallet: "Passkey Wallet",
31
+ connect_modal_close: "Close modal",
32
+ connect_modal_go_back: "Go back"
31
33
  };
32
34
 
33
35
  // src/mixins/intl.ts
@@ -88,4 +90,4 @@ function withIntlService(Base) {
88
90
 
89
91
 
90
92
  exports.withIntlService = withIntlService;
91
- //# sourceMappingURL=chunk-YZZF3DXX.cjs.map
93
+ //# sourceMappingURL=chunk-P3OUBU4I.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-P3OUBU4I.cjs","../src/mixins/intl.ts","../translations/en_US.json"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACDA,mDAAuB;ADGvB;AACA;AEVA,IAAA,cAAA,EAAA;AAAA,EACE,wBAAA,EAA4B,gCAAA;AAAA,EAC5B,mBAAA,EAAuB,2BAAA;AAAA,EACvB,+BAAA,EAAmC,+BAAA;AAAA,EACnC,yBAAA,EAA6B,6GAAA;AAAA,EAC7B,uBAAA,EAA2B,WAAA;AAAA,EAC3B,mBAAA,EAAuB,uBAAA;AAAA,EACvB,2BAAA,EAA+B,gBAAA;AAAA,EAC/B,iCAAA,EAAqC,wEAAA;AAAA,EACrC,8BAAA,EAAkC,gBAAA;AAAA,EAClC,qBAAA,EAAyB,gCAAA;AAAA,EACzB,gBAAA,EAAoB,IAAA;AAAA,EACpB,uBAAA,EAA2B,WAAA;AAAA,EAC3B,4BAAA,EAAgC,mBAAA;AAAA,EAChC,uBAAA,EAA2B,qBAAA;AAAA,EAC3B,yBAAA,EAA6B,oCAAA;AAAA,EAC7B,kCAAA,EAAsC,oBAAA;AAAA,EACtC,6CAAA,EAAiD,mBAAA;AAAA,EACjD,uCAAA,EAA2C,gBAAA;AAAA,EAC3C,mBAAA,EAAuB,aAAA;AAAA,EACvB,qBAAA,EAAyB;AAC3B,CAAA;AFYA;AACA;ACyBO,SAAS,eAAA,CACd,IAAA,EACgC;AAAA,EAEhC,MAAM,MAAA,QAAe,KAAa;AAAA,IAAlC,WAAA,CAAA,EAAA;AAAA,MAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AACE,MAAA,IAAA,CAAU,gBAAA,EAA4C,KAAA,CAAA;AAAA,IAAA;AAAA,IAEtD,iBAAA,CAAA,EAA0B;AACxB,MAAA,KAAA,CAAM,iBAAA,CAAkB,CAAA;AAGxB,MAAA,IAAI,KAAA,EAA2B,8CAAA,CAAe;AAG9C,MAAA,GAAA,CAAI,CAAC,IAAA,EAAM;AACT,QAAA,KAAA,mBAAO,IAAA,CAAK,cAAA,CAAe,CAAA,UAAK,MAAA;AAAA,MAClC;AAEA,MAAA,GAAA,CAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,gBAAA,EAAkB,iCAAA,CAAO,EAAA,GAAM;AAElC,0BAAA,IAAA,2BAAM,aAAA,qBAAc,OAAA;AACpB,UAAA,IAAA,CAAK,aAAA,CAAc,CAAA;AAAA,QACrB,CAAC,CAAA;AAAA,MACH;AAGA,sBAAA,IAAA,6BAAM,uBAAA,mBAAwB,aAA0B,GAAA;AAAA,IAC1D;AAAA,IAEA,oBAAA,CAAA,EAA6B;AAC3B,MAAA,KAAA,CAAM,oBAAA,CAAqB,CAAA;AAG3B,MAAA,GAAA,CAAI,OAAO,IAAA,CAAK,gBAAA,IAAoB,UAAA,EAAY;AAC9C,QAAA,IAAA,CAAK,eAAA,CAAgB,CAAA;AAAA,MACvB;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,IAMU,cAAA,CAAA,EAA0C;AAClD,MAAA,MAAM,YAAA,EAAc,iDAAA;AAAA,QAClB,MAAA,CAAO,MAAA,CAAO,+BAAA,EAAe;AAAA,UAC3B,QAAA,EAAU;AAAA,QACZ,CAAC;AAAA,MACH,CAAA;AACA,MAAA,8CAAA,WAA0B,CAAA;AAC1B,MAAA,OAAO,WAAA;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,IAKA,aAAA,CAAc,GAAA,EAAc,OAAA,EAA0C;AACpE,MAAA,GAAA,CAAI,CAAC,GAAA,EAAK;AACR,QAAA,OAAA,CAAQ,IAAA,CAAK,8CAA8C,CAAA;AAC3D,QAAA,OAAO,EAAA;AAAA,MACT;AAEA,MAAA,MAAM,KAAA,EAAO,8CAAA,CAAe;AAC5B,MAAA,wCAAO,IAAA,6BAAM,aAAA,mBAAc,GAAA,EAAK,OAAO,GAAA,UAAK,KAAA;AAAA,IAC9C;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;ADvCA;AACA;AACE;AACF,0CAAC","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-P3OUBU4I.cjs","sourcesContent":[null,"/**\n * Internationalization Mixin\n *\n * Mixin to add internationalization service to a Lit component\n */\n\nimport { effect } from '@preact/signals-core'\nimport type { LitElement } from 'lit'\nimport englishTranslations from '../../translations/en_US.json'\nimport {\n createIntlService,\n defaultConfig,\n getIntlService,\n type IntlService,\n setIntlService,\n} from '../services/intl.js'\n\n/**\n * Interface for components that have intl service capabilities\n */\nexport interface IntlServiceMixin {\n formatMessage(key?: string, options?: Record<string, string>): string\n setupLocalIntl(): IntlService | undefined\n}\n\n/**\n * Type helper for the constructor returned by withIntlService\n */\nexport type IntlServiceMixinConstructor<T extends typeof LitElement> = (new (\n ...args: any[]\n) => InstanceType<T> & IntlServiceMixin) &\n T\n\n/**\n * Mixin to add internationalization service to a Lit component\n *\n * Provides access to the global intl service with reactive locale changes.\n * Automatically subscribes to locale changes and triggers re-renders.\n *\n * The component will use the global intl service if available, or create a local one.\n * This follows the singleton pattern for the global service while allowing flexibility.\n *\n * @typeParam T - The Lit component class being extended\n * @returns Extended class with intl service capabilities\n *\n * @example\n * ```typescript\n * import { LitElement, html } from 'lit';\n * import { customElement } from 'lit/decorators.js';\n * import { withIntlService } from '@lukso/core/mixins';\n *\n * @customElement('my-component')\n * export class MyComponent extends withIntlService(LitElement) {\n * render() {\n * return html\\`<p>\\${this.formatMessage('app.welcome')}</p>\\`;\n * }\n * }\n * ```\n */\nexport function withIntlService<T extends typeof LitElement>(\n Base: T\n): IntlServiceMixinConstructor<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n class Mixin extends (Base as any) {\n protected unsubscribeIntl: (() => void) | undefined = undefined\n\n connectedCallback(): void {\n super.connectedCallback()\n\n // Subscribe to intl changes via signal\n let intl: IntlService | null = getIntlService()\n\n // When no intl is provided by host app we initialize our own\n if (!intl) {\n intl = this.setupLocalIntl() ?? null\n }\n\n if (intl) {\n this.unsubscribeIntl = effect(() => {\n // Access the signal to track changes\n intl?.localeChanged.value\n this.requestUpdate()\n })\n }\n\n // Set fallback for missing translations\n intl?.setFallbackTranslations(englishTranslations as any)\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback()\n\n // Unsubscribe from intl changes\n if (typeof this.unsubscribeIntl === 'function') {\n this.unsubscribeIntl()\n }\n }\n\n /**\n * Setup a local intl service with default configuration\n * Subclasses can override this to customize initialization\n */\n protected setupLocalIntl(): IntlService | undefined {\n const intlService = createIntlService(\n Object.assign(defaultConfig, {\n messages: englishTranslations,\n })\n )\n setIntlService(intlService)\n return intlService\n }\n\n /**\n * Format message using the intl service\n */\n formatMessage(key?: string, options?: Record<string, string>): string {\n if (!key) {\n console.warn('No translation key provided to formatMessage')\n return ''\n }\n\n const intl = getIntlService()\n return intl?.formatMessage(key, options) ?? key\n }\n }\n\n return Mixin as unknown as IntlServiceMixinConstructor<T>\n}\n","{\n \"sign_up_modal_use_mobile\": \"Install the Mobile Application\",\n \"sign_up_modal_title\": \"Create Universal Profile!\",\n \"sign_up_modal_install_extension\": \"Install the Browser Extension\",\n \"sign_up_modal_description\": \"Choose the device on which you want to create a profile. You can use either to interact with supported apps\",\n \"connect_modal_try_again\": \"Try again\",\n \"connect_modal_title\": \"Let’s log you in\",\n \"connect_modal_qr_code_title\": \"Scan to log in\",\n \"connect_modal_qr_code_description\": \"Scan the below QR code with the Universal Profile mobile app to log in\",\n \"connect_modal_other_connectors\": \"Connect Wallet\",\n \"connect_modal_or_info\": \"Log in with a different wallet\",\n \"connect_modal_or\": \"Or\",\n \"connect_modal_installed\": \"INSTALLED\",\n \"connect_modal_failed_to_load\": \"Failed to load...\",\n \"connect_modal_eoa_title\": \"Connect your Wallet\",\n \"connect_modal_description\": \"Log in with your Universal Profile\",\n \"connect_modal_connectors_up_mobile\": \"Mobile Application\",\n \"connect_modal_connectors_up_browser_extension\": \"Browser Extension\",\n \"connect_modal_connectors_passkey_wallet\": \"Passkey Wallet\",\n \"connect_modal_close\": \"Close modal\",\n \"connect_modal_go_back\": \"Go back\"\n}"]}
@@ -27,7 +27,9 @@ var en_US_default = {
27
27
  connect_modal_description: "Log in with your Universal Profile",
28
28
  connect_modal_connectors_up_mobile: "Mobile Application",
29
29
  connect_modal_connectors_up_browser_extension: "Browser Extension",
30
- connect_modal_connectors_passkey_wallet: "Passkey Wallet"
30
+ connect_modal_connectors_passkey_wallet: "Passkey Wallet",
31
+ connect_modal_close: "Close modal",
32
+ connect_modal_go_back: "Go back"
31
33
  };
32
34
 
33
35
  // src/mixins/intl.ts
@@ -88,4 +90,4 @@ function withIntlService(Base) {
88
90
  export {
89
91
  withIntlService
90
92
  };
91
- //# sourceMappingURL=chunk-UQCGHU37.js.map
93
+ //# sourceMappingURL=chunk-VODIIQT4.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mixins/intl.ts","../translations/en_US.json"],"sourcesContent":["/**\n * Internationalization Mixin\n *\n * Mixin to add internationalization service to a Lit component\n */\n\nimport { effect } from '@preact/signals-core'\nimport type { LitElement } from 'lit'\nimport englishTranslations from '../../translations/en_US.json'\nimport {\n createIntlService,\n defaultConfig,\n getIntlService,\n type IntlService,\n setIntlService,\n} from '../services/intl.js'\n\n/**\n * Interface for components that have intl service capabilities\n */\nexport interface IntlServiceMixin {\n formatMessage(key?: string, options?: Record<string, string>): string\n setupLocalIntl(): IntlService | undefined\n}\n\n/**\n * Type helper for the constructor returned by withIntlService\n */\nexport type IntlServiceMixinConstructor<T extends typeof LitElement> = (new (\n ...args: any[]\n) => InstanceType<T> & IntlServiceMixin) &\n T\n\n/**\n * Mixin to add internationalization service to a Lit component\n *\n * Provides access to the global intl service with reactive locale changes.\n * Automatically subscribes to locale changes and triggers re-renders.\n *\n * The component will use the global intl service if available, or create a local one.\n * This follows the singleton pattern for the global service while allowing flexibility.\n *\n * @typeParam T - The Lit component class being extended\n * @returns Extended class with intl service capabilities\n *\n * @example\n * ```typescript\n * import { LitElement, html } from 'lit';\n * import { customElement } from 'lit/decorators.js';\n * import { withIntlService } from '@lukso/core/mixins';\n *\n * @customElement('my-component')\n * export class MyComponent extends withIntlService(LitElement) {\n * render() {\n * return html\\`<p>\\${this.formatMessage('app.welcome')}</p>\\`;\n * }\n * }\n * ```\n */\nexport function withIntlService<T extends typeof LitElement>(\n Base: T\n): IntlServiceMixinConstructor<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n class Mixin extends (Base as any) {\n protected unsubscribeIntl: (() => void) | undefined = undefined\n\n connectedCallback(): void {\n super.connectedCallback()\n\n // Subscribe to intl changes via signal\n let intl: IntlService | null = getIntlService()\n\n // When no intl is provided by host app we initialize our own\n if (!intl) {\n intl = this.setupLocalIntl() ?? null\n }\n\n if (intl) {\n this.unsubscribeIntl = effect(() => {\n // Access the signal to track changes\n intl?.localeChanged.value\n this.requestUpdate()\n })\n }\n\n // Set fallback for missing translations\n intl?.setFallbackTranslations(englishTranslations as any)\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback()\n\n // Unsubscribe from intl changes\n if (typeof this.unsubscribeIntl === 'function') {\n this.unsubscribeIntl()\n }\n }\n\n /**\n * Setup a local intl service with default configuration\n * Subclasses can override this to customize initialization\n */\n protected setupLocalIntl(): IntlService | undefined {\n const intlService = createIntlService(\n Object.assign(defaultConfig, {\n messages: englishTranslations,\n })\n )\n setIntlService(intlService)\n return intlService\n }\n\n /**\n * Format message using the intl service\n */\n formatMessage(key?: string, options?: Record<string, string>): string {\n if (!key) {\n console.warn('No translation key provided to formatMessage')\n return ''\n }\n\n const intl = getIntlService()\n return intl?.formatMessage(key, options) ?? key\n }\n }\n\n return Mixin as unknown as IntlServiceMixinConstructor<T>\n}\n","{\n \"sign_up_modal_use_mobile\": \"Install the Mobile Application\",\n \"sign_up_modal_title\": \"Create Universal Profile!\",\n \"sign_up_modal_install_extension\": \"Install the Browser Extension\",\n \"sign_up_modal_description\": \"Choose the device on which you want to create a profile. You can use either to interact with supported apps\",\n \"connect_modal_try_again\": \"Try again\",\n \"connect_modal_title\": \"Let’s log you in\",\n \"connect_modal_qr_code_title\": \"Scan to log in\",\n \"connect_modal_qr_code_description\": \"Scan the below QR code with the Universal Profile mobile app to log in\",\n \"connect_modal_other_connectors\": \"Connect Wallet\",\n \"connect_modal_or_info\": \"Log in with a different wallet\",\n \"connect_modal_or\": \"Or\",\n \"connect_modal_installed\": \"INSTALLED\",\n \"connect_modal_failed_to_load\": \"Failed to load...\",\n \"connect_modal_eoa_title\": \"Connect your Wallet\",\n \"connect_modal_description\": \"Log in with your Universal Profile\",\n \"connect_modal_connectors_up_mobile\": \"Mobile Application\",\n \"connect_modal_connectors_up_browser_extension\": \"Browser Extension\",\n \"connect_modal_connectors_passkey_wallet\": \"Passkey Wallet\"\n}"],"mappings":";;;;;;;;AAMA,SAAS,cAAc;;;ACNvB;AAAA,EACE,0BAA4B;AAAA,EAC5B,qBAAuB;AAAA,EACvB,iCAAmC;AAAA,EACnC,2BAA6B;AAAA,EAC7B,yBAA2B;AAAA,EAC3B,qBAAuB;AAAA,EACvB,6BAA+B;AAAA,EAC/B,mCAAqC;AAAA,EACrC,gCAAkC;AAAA,EAClC,uBAAyB;AAAA,EACzB,kBAAoB;AAAA,EACpB,yBAA2B;AAAA,EAC3B,8BAAgC;AAAA,EAChC,yBAA2B;AAAA,EAC3B,2BAA6B;AAAA,EAC7B,oCAAsC;AAAA,EACtC,+CAAiD;AAAA,EACjD,yCAA2C;AAC7C;;;ADwCO,SAAS,gBACd,MACgC;AAAA,EAEhC,MAAM,cAAe,KAAa;AAAA,IAAlC;AAAA;AACE,WAAU,kBAA4C;AAAA;AAAA,IAEtD,oBAA0B;AACxB,YAAM,kBAAkB;AAGxB,UAAI,OAA2B,eAAe;AAG9C,UAAI,CAAC,MAAM;AACT,eAAO,KAAK,eAAe,KAAK;AAAA,MAClC;AAEA,UAAI,MAAM;AACR,aAAK,kBAAkB,OAAO,MAAM;AAElC,gBAAM,cAAc;AACpB,eAAK,cAAc;AAAA,QACrB,CAAC;AAAA,MACH;AAGA,YAAM,wBAAwB,aAA0B;AAAA,IAC1D;AAAA,IAEA,uBAA6B;AAC3B,YAAM,qBAAqB;AAG3B,UAAI,OAAO,KAAK,oBAAoB,YAAY;AAC9C,aAAK,gBAAgB;AAAA,MACvB;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,IAMU,iBAA0C;AAClD,YAAM,cAAc;AAAA,QAClB,OAAO,OAAO,eAAe;AAAA,UAC3B,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AACA,qBAAe,WAAW;AAC1B,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,IAKA,cAAc,KAAc,SAA0C;AACpE,UAAI,CAAC,KAAK;AACR,gBAAQ,KAAK,8CAA8C;AAC3D,eAAO;AAAA,MACT;AAEA,YAAM,OAAO,eAAe;AAC5B,aAAO,MAAM,cAAc,KAAK,OAAO,KAAK;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/mixins/intl.ts","../translations/en_US.json"],"sourcesContent":["/**\n * Internationalization Mixin\n *\n * Mixin to add internationalization service to a Lit component\n */\n\nimport { effect } from '@preact/signals-core'\nimport type { LitElement } from 'lit'\nimport englishTranslations from '../../translations/en_US.json'\nimport {\n createIntlService,\n defaultConfig,\n getIntlService,\n type IntlService,\n setIntlService,\n} from '../services/intl.js'\n\n/**\n * Interface for components that have intl service capabilities\n */\nexport interface IntlServiceMixin {\n formatMessage(key?: string, options?: Record<string, string>): string\n setupLocalIntl(): IntlService | undefined\n}\n\n/**\n * Type helper for the constructor returned by withIntlService\n */\nexport type IntlServiceMixinConstructor<T extends typeof LitElement> = (new (\n ...args: any[]\n) => InstanceType<T> & IntlServiceMixin) &\n T\n\n/**\n * Mixin to add internationalization service to a Lit component\n *\n * Provides access to the global intl service with reactive locale changes.\n * Automatically subscribes to locale changes and triggers re-renders.\n *\n * The component will use the global intl service if available, or create a local one.\n * This follows the singleton pattern for the global service while allowing flexibility.\n *\n * @typeParam T - The Lit component class being extended\n * @returns Extended class with intl service capabilities\n *\n * @example\n * ```typescript\n * import { LitElement, html } from 'lit';\n * import { customElement } from 'lit/decorators.js';\n * import { withIntlService } from '@lukso/core/mixins';\n *\n * @customElement('my-component')\n * export class MyComponent extends withIntlService(LitElement) {\n * render() {\n * return html\\`<p>\\${this.formatMessage('app.welcome')}</p>\\`;\n * }\n * }\n * ```\n */\nexport function withIntlService<T extends typeof LitElement>(\n Base: T\n): IntlServiceMixinConstructor<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n class Mixin extends (Base as any) {\n protected unsubscribeIntl: (() => void) | undefined = undefined\n\n connectedCallback(): void {\n super.connectedCallback()\n\n // Subscribe to intl changes via signal\n let intl: IntlService | null = getIntlService()\n\n // When no intl is provided by host app we initialize our own\n if (!intl) {\n intl = this.setupLocalIntl() ?? null\n }\n\n if (intl) {\n this.unsubscribeIntl = effect(() => {\n // Access the signal to track changes\n intl?.localeChanged.value\n this.requestUpdate()\n })\n }\n\n // Set fallback for missing translations\n intl?.setFallbackTranslations(englishTranslations as any)\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback()\n\n // Unsubscribe from intl changes\n if (typeof this.unsubscribeIntl === 'function') {\n this.unsubscribeIntl()\n }\n }\n\n /**\n * Setup a local intl service with default configuration\n * Subclasses can override this to customize initialization\n */\n protected setupLocalIntl(): IntlService | undefined {\n const intlService = createIntlService(\n Object.assign(defaultConfig, {\n messages: englishTranslations,\n })\n )\n setIntlService(intlService)\n return intlService\n }\n\n /**\n * Format message using the intl service\n */\n formatMessage(key?: string, options?: Record<string, string>): string {\n if (!key) {\n console.warn('No translation key provided to formatMessage')\n return ''\n }\n\n const intl = getIntlService()\n return intl?.formatMessage(key, options) ?? key\n }\n }\n\n return Mixin as unknown as IntlServiceMixinConstructor<T>\n}\n","{\n \"sign_up_modal_use_mobile\": \"Install the Mobile Application\",\n \"sign_up_modal_title\": \"Create Universal Profile!\",\n \"sign_up_modal_install_extension\": \"Install the Browser Extension\",\n \"sign_up_modal_description\": \"Choose the device on which you want to create a profile. You can use either to interact with supported apps\",\n \"connect_modal_try_again\": \"Try again\",\n \"connect_modal_title\": \"Let’s log you in\",\n \"connect_modal_qr_code_title\": \"Scan to log in\",\n \"connect_modal_qr_code_description\": \"Scan the below QR code with the Universal Profile mobile app to log in\",\n \"connect_modal_other_connectors\": \"Connect Wallet\",\n \"connect_modal_or_info\": \"Log in with a different wallet\",\n \"connect_modal_or\": \"Or\",\n \"connect_modal_installed\": \"INSTALLED\",\n \"connect_modal_failed_to_load\": \"Failed to load...\",\n \"connect_modal_eoa_title\": \"Connect your Wallet\",\n \"connect_modal_description\": \"Log in with your Universal Profile\",\n \"connect_modal_connectors_up_mobile\": \"Mobile Application\",\n \"connect_modal_connectors_up_browser_extension\": \"Browser Extension\",\n \"connect_modal_connectors_passkey_wallet\": \"Passkey Wallet\",\n \"connect_modal_close\": \"Close modal\",\n \"connect_modal_go_back\": \"Go back\"\n}"],"mappings":";;;;;;;;AAMA,SAAS,cAAc;;;ACNvB;AAAA,EACE,0BAA4B;AAAA,EAC5B,qBAAuB;AAAA,EACvB,iCAAmC;AAAA,EACnC,2BAA6B;AAAA,EAC7B,yBAA2B;AAAA,EAC3B,qBAAuB;AAAA,EACvB,6BAA+B;AAAA,EAC/B,mCAAqC;AAAA,EACrC,gCAAkC;AAAA,EAClC,uBAAyB;AAAA,EACzB,kBAAoB;AAAA,EACpB,yBAA2B;AAAA,EAC3B,8BAAgC;AAAA,EAChC,yBAA2B;AAAA,EAC3B,2BAA6B;AAAA,EAC7B,oCAAsC;AAAA,EACtC,+CAAiD;AAAA,EACjD,yCAA2C;AAAA,EAC3C,qBAAuB;AAAA,EACvB,uBAAyB;AAC3B;;;ADsCO,SAAS,gBACd,MACgC;AAAA,EAEhC,MAAM,cAAe,KAAa;AAAA,IAAlC;AAAA;AACE,WAAU,kBAA4C;AAAA;AAAA,IAEtD,oBAA0B;AACxB,YAAM,kBAAkB;AAGxB,UAAI,OAA2B,eAAe;AAG9C,UAAI,CAAC,MAAM;AACT,eAAO,KAAK,eAAe,KAAK;AAAA,MAClC;AAEA,UAAI,MAAM;AACR,aAAK,kBAAkB,OAAO,MAAM;AAElC,gBAAM,cAAc;AACpB,eAAK,cAAc;AAAA,QACrB,CAAC;AAAA,MACH;AAGA,YAAM,wBAAwB,aAA0B;AAAA,IAC1D;AAAA,IAEA,uBAA6B;AAC3B,YAAM,qBAAqB;AAG3B,UAAI,OAAO,KAAK,oBAAoB,YAAY;AAC9C,aAAK,gBAAgB;AAAA,MACvB;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,IAMU,iBAA0C;AAClD,YAAM,cAAc;AAAA,QAClB,OAAO,OAAO,eAAe;AAAA,UAC3B,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AACA,qBAAe,WAAW;AAC1B,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,IAKA,cAAc,KAAc,SAA0C;AACpE,UAAI,CAAC,KAAK;AACR,gBAAQ,KAAK,8CAA8C;AAC3D,eAAO;AAAA,MACT;AAEA,YAAM,OAAO,eAAe;AAC5B,aAAO,MAAM,cAAc,KAAK,OAAO,KAAK;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
package/dist/index.cjs CHANGED
@@ -13,7 +13,11 @@
13
13
 
14
14
 
15
15
 
16
- var _chunk2KVLFGLMcjs = require('./chunk-2KVLFGLM.cjs');
16
+
17
+
18
+
19
+
20
+ var _chunkEN5MQDYXcjs = require('./chunk-EN5MQDYX.cjs');
17
21
 
18
22
 
19
23
 
@@ -34,7 +38,7 @@ require('./chunk-DWXFDFMM.cjs');
34
38
  var _chunkUQSIH233cjs = require('./chunk-UQSIH233.cjs');
35
39
 
36
40
 
37
- var _chunkYZZF3DXXcjs = require('./chunk-YZZF3DXX.cjs');
41
+ var _chunkP3OUBU4Icjs = require('./chunk-P3OUBU4I.cjs');
38
42
 
39
43
 
40
44
 
@@ -84,5 +88,9 @@ _chunkGBY3X5CQcjs.init_config.call(void 0, );
84
88
 
85
89
 
86
90
 
87
- exports.EIP1271_MAGIC_VALUE = _chunk2KVLFGLMcjs.EIP1271_MAGIC_VALUE; exports.EXTENSION_STORE_LINKS = _chunk2KVLFGLMcjs.EXTENSION_STORE_LINKS; exports.GRAPHQL_ENDPOINT_MAINNET = _chunkGBY3X5CQcjs.GRAPHQL_ENDPOINT_MAINNET; exports.GRAPHQL_ENDPOINT_TESTNET = _chunkGBY3X5CQcjs.GRAPHQL_ENDPOINT_TESTNET; exports.SUPPORTED_NETWORK_IDS = _chunkGBY3X5CQcjs.SUPPORTED_NETWORK_IDS; exports.UrlConverter = _chunk2KVLFGLMcjs.UrlConverter; exports.UrlResolver = _chunk2KVLFGLMcjs.UrlResolver; exports.browserInfo = _chunk2KVLFGLMcjs.browserInfo; exports.clearIntlService = _chunkIDQ6WJY5cjs.clearIntlService; exports.createIntlService = _chunkIDQ6WJY5cjs.createIntlService; exports.createMessage = _chunk2KVLFGLMcjs.createMessage; exports.createSignedQR = _chunk2KVLFGLMcjs.createSignedQR; exports.defaultConfig = _chunkIDQ6WJY5cjs.defaultConfig; exports.deviceService = _chunkNJQVWIZLcjs.deviceService; exports.getChainById = _chunk4TARUYHAcjs.getChainById; exports.getControllerAddress = _chunk2KVLFGLMcjs.getControllerAddress; exports.getEIP1271Data = _chunk2KVLFGLMcjs.getEIP1271Data; exports.getIntlService = _chunkIDQ6WJY5cjs.getIntlService; exports.getLuksoMainnet = _chunk4TARUYHAcjs.getLuksoMainnet; exports.getLuksoTestnet = _chunk4TARUYHAcjs.getLuksoTestnet; exports.isSignedQRFormat = _chunk2KVLFGLMcjs.isSignedQRFormat; exports.luksoChainsByID = _chunk4TARUYHAcjs.luksoChainsByID; exports.luksoMainnet = _chunk4TARUYHAcjs.luksoMainnet; exports.luksoTestnet = _chunk4TARUYHAcjs.luksoTestnet; exports.parseSignedQR = _chunk2KVLFGLMcjs.parseSignedQR; exports.setIntlService = _chunkIDQ6WJY5cjs.setIntlService; exports.slug = _chunk2KVLFGLMcjs.slug; exports.verifySignedQR = _chunk2KVLFGLMcjs.verifySignedQR; exports.withDeviceService = _chunkUQSIH233cjs.withDeviceService; exports.withIntlService = _chunkYZZF3DXXcjs.withIntlService; exports.withTheme = _chunkDF2DOQMFcjs.withTheme;
91
+
92
+
93
+
94
+
95
+ exports.EIP1271_MAGIC_VALUE = _chunkEN5MQDYXcjs.EIP1271_MAGIC_VALUE; exports.EXTENSION_STORE_LINKS = _chunkEN5MQDYXcjs.EXTENSION_STORE_LINKS; exports.GRAPHQL_ENDPOINT_MAINNET = _chunkGBY3X5CQcjs.GRAPHQL_ENDPOINT_MAINNET; exports.GRAPHQL_ENDPOINT_TESTNET = _chunkGBY3X5CQcjs.GRAPHQL_ENDPOINT_TESTNET; exports.SUPPORTED_NETWORK_IDS = _chunkGBY3X5CQcjs.SUPPORTED_NETWORK_IDS; exports.UrlConverter = _chunkEN5MQDYXcjs.UrlConverter; exports.UrlResolver = _chunkEN5MQDYXcjs.UrlResolver; exports.browserInfo = _chunkEN5MQDYXcjs.browserInfo; exports.clearIntlService = _chunkIDQ6WJY5cjs.clearIntlService; exports.createIntlService = _chunkIDQ6WJY5cjs.createIntlService; exports.createMessage = _chunkEN5MQDYXcjs.createMessage; exports.createSignedQR = _chunkEN5MQDYXcjs.createSignedQR; exports.defaultConfig = _chunkIDQ6WJY5cjs.defaultConfig; exports.deviceService = _chunkNJQVWIZLcjs.deviceService; exports.getChainById = _chunk4TARUYHAcjs.getChainById; exports.getControllerAddress = _chunkEN5MQDYXcjs.getControllerAddress; exports.getEIP1271Data = _chunkEN5MQDYXcjs.getEIP1271Data; exports.getIntlService = _chunkIDQ6WJY5cjs.getIntlService; exports.getLuksoMainnet = _chunk4TARUYHAcjs.getLuksoMainnet; exports.getLuksoTestnet = _chunk4TARUYHAcjs.getLuksoTestnet; exports.isCollectible = _chunkEN5MQDYXcjs.isCollectible; exports.isLyx = _chunkEN5MQDYXcjs.isLyx; exports.isSignedQRFormat = _chunkEN5MQDYXcjs.isSignedQRFormat; exports.isToken = _chunkEN5MQDYXcjs.isToken; exports.luksoChainsByID = _chunk4TARUYHAcjs.luksoChainsByID; exports.luksoMainnet = _chunk4TARUYHAcjs.luksoMainnet; exports.luksoTestnet = _chunk4TARUYHAcjs.luksoTestnet; exports.parseSignedQR = _chunkEN5MQDYXcjs.parseSignedQR; exports.safeCustomElement = _chunkEN5MQDYXcjs.safeCustomElement; exports.setIntlService = _chunkIDQ6WJY5cjs.setIntlService; exports.slug = _chunkEN5MQDYXcjs.slug; exports.verifySignedQR = _chunkEN5MQDYXcjs.verifySignedQR; exports.withDeviceService = _chunkUQSIH233cjs.withDeviceService; exports.withIntlService = _chunkP3OUBU4Icjs.withIntlService; exports.withTheme = _chunkDF2DOQMFcjs.withTheme;
88
96
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/index.cjs","../src/index.ts"],"names":[],"mappings":"AAAA,yGAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACA;AC5CA,2CAAA,CAAA;AD8CA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,w1DAAC","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/index.cjs","sourcesContent":[null,"/**\n * @lukso/core\n *\n * Core utilities, services, and mixins for LUKSO web components and applications\n */\n\n// Re-export all services and mixins\nexport * from './chains/index.js'\nexport * from './config.js'\nexport * from './mixins/index.js'\nexport * from './services/index.js'\nexport * from './utils/index.js'\n// Release update\n// build 2\n"]}
1
+ {"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/index.cjs","../src/index.ts"],"names":[],"mappings":"AAAA,yGAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACA;AChDA,2CAAA,CAAA;ADkDA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wiEAAC","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/index.cjs","sourcesContent":[null,"/**\n * @lukso/core\n *\n * Core utilities, services, and mixins for LUKSO web components and applications\n */\n\n// Re-export all services and mixins\nexport * from './chains/index.js'\nexport * from './config.js'\nexport * from './mixins/index.js'\nexport * from './services/index.js'\nexport * from './utils/index.js'\n// Release update\n// build 2\n"]}
package/dist/index.d.cts CHANGED
@@ -5,7 +5,7 @@ export { IntlServiceMixin, IntlServiceMixinConstructor, withIntlService } from '
5
5
  export { Theme, ThemeMixin, ThemeMixinConstructor, withTheme } from './mixins/theme.cjs';
6
6
  export { DeviceService, NavigatorExtended, deviceService } from './services/device.cjs';
7
7
  export { IntlMessages, IntlService, clearIntlService, createIntlService, defaultConfig, getIntlService, setIntlService } from './services/intl.cjs';
8
- export { BrowserInfo, BrowserName, EIP1271_MAGIC_VALUE, EXTENSION_STORE_LINKS, UrlConverter, UrlResolver, browserInfo, createMessage, createSignedQR, getControllerAddress, getEIP1271Data, isSignedQRFormat, parseSignedQR, slug, verifySignedQR } from './utils/index.cjs';
8
+ export { BrowserInfo, BrowserName, EIP1271_MAGIC_VALUE, EXTENSION_STORE_LINKS, UrlConverter, UrlResolver, browserInfo, createMessage, createSignedQR, getControllerAddress, getEIP1271Data, isCollectible, isLyx, isSignedQRFormat, isToken, parseSignedQR, safeCustomElement, slug, verifySignedQR } from './utils/index.cjs';
9
9
  import 'viem';
10
10
  import 'lit';
11
11
  import 'ua-parser-js';
package/dist/index.d.ts CHANGED
@@ -5,7 +5,7 @@ export { IntlServiceMixin, IntlServiceMixinConstructor, withIntlService } from '
5
5
  export { Theme, ThemeMixin, ThemeMixinConstructor, withTheme } from './mixins/theme.js';
6
6
  export { DeviceService, NavigatorExtended, deviceService } from './services/device.js';
7
7
  export { IntlMessages, IntlService, clearIntlService, createIntlService, defaultConfig, getIntlService, setIntlService } from './services/intl.js';
8
- export { BrowserInfo, BrowserName, EIP1271_MAGIC_VALUE, EXTENSION_STORE_LINKS, UrlConverter, UrlResolver, browserInfo, createMessage, createSignedQR, getControllerAddress, getEIP1271Data, isSignedQRFormat, parseSignedQR, slug, verifySignedQR } from './utils/index.js';
8
+ export { BrowserInfo, BrowserName, EIP1271_MAGIC_VALUE, EXTENSION_STORE_LINKS, UrlConverter, UrlResolver, browserInfo, createMessage, createSignedQR, getControllerAddress, getEIP1271Data, isCollectible, isLyx, isSignedQRFormat, isToken, parseSignedQR, safeCustomElement, slug, verifySignedQR } from './utils/index.js';
9
9
  import 'viem';
10
10
  import 'lit';
11
11
  import 'ua-parser-js';
package/dist/index.js CHANGED
@@ -9,11 +9,15 @@ import {
9
9
  createSignedQR,
10
10
  getControllerAddress,
11
11
  getEIP1271Data,
12
+ isCollectible,
13
+ isLyx,
12
14
  isSignedQRFormat,
15
+ isToken,
13
16
  parseSignedQR,
17
+ safeCustomElement,
14
18
  slug,
15
19
  verifySignedQR
16
- } from "./chunk-RECO5F6T.js";
20
+ } from "./chunk-KWOHF22J.js";
17
21
  import {
18
22
  getChainById,
19
23
  getLuksoMainnet,
@@ -34,7 +38,7 @@ import {
34
38
  } from "./chunk-UF5VAIDL.js";
35
39
  import {
36
40
  withIntlService
37
- } from "./chunk-UQCGHU37.js";
41
+ } from "./chunk-VODIIQT4.js";
38
42
  import {
39
43
  clearIntlService,
40
44
  createIntlService,
@@ -73,11 +77,15 @@ export {
73
77
  getIntlService,
74
78
  getLuksoMainnet,
75
79
  getLuksoTestnet,
80
+ isCollectible,
81
+ isLyx,
76
82
  isSignedQRFormat,
83
+ isToken,
77
84
  luksoChainsByID,
78
85
  luksoMainnet,
79
86
  luksoTestnet,
80
87
  parseSignedQR,
88
+ safeCustomElement,
81
89
  setIntlService,
82
90
  slug,
83
91
  verifySignedQR,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @lukso/core\n *\n * Core utilities, services, and mixins for LUKSO web components and applications\n */\n\n// Re-export all services and mixins\nexport * from './chains/index.js'\nexport * from './config.js'\nexport * from './mixins/index.js'\nexport * from './services/index.js'\nexport * from './utils/index.js'\n// Release update\n// build 2\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @lukso/core\n *\n * Core utilities, services, and mixins for LUKSO web components and applications\n */\n\n// Re-export all services and mixins\nexport * from './chains/index.js'\nexport * from './config.js'\nexport * from './mixins/index.js'\nexport * from './services/index.js'\nexport * from './utils/index.js'\n// Release update\n// build 2\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA;","names":[]}
@@ -4,7 +4,7 @@
4
4
  var _chunkUQSIH233cjs = require('../chunk-UQSIH233.cjs');
5
5
 
6
6
 
7
- var _chunkYZZF3DXXcjs = require('../chunk-YZZF3DXX.cjs');
7
+ var _chunkP3OUBU4Icjs = require('../chunk-P3OUBU4I.cjs');
8
8
  require('../chunk-IDQ6WJY5.cjs');
9
9
 
10
10
 
@@ -15,5 +15,5 @@ require('../chunk-KP76AWY3.cjs');
15
15
 
16
16
 
17
17
 
18
- exports.withDeviceService = _chunkUQSIH233cjs.withDeviceService; exports.withIntlService = _chunkYZZF3DXXcjs.withIntlService; exports.withTheme = _chunkDF2DOQMFcjs.withTheme;
18
+ exports.withDeviceService = _chunkUQSIH233cjs.withDeviceService; exports.withIntlService = _chunkP3OUBU4Icjs.withIntlService; exports.withTheme = _chunkDF2DOQMFcjs.withTheme;
19
19
  //# sourceMappingURL=index.cjs.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "../chunk-UF5VAIDL.js";
5
5
  import {
6
6
  withIntlService
7
- } from "../chunk-UQCGHU37.js";
7
+ } from "../chunk-VODIIQT4.js";
8
8
  import "../chunk-HTK4HH4J.js";
9
9
  import {
10
10
  withTheme
@@ -1,9 +1,9 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkYZZF3DXXcjs = require('../chunk-YZZF3DXX.cjs');
3
+ var _chunkP3OUBU4Icjs = require('../chunk-P3OUBU4I.cjs');
4
4
  require('../chunk-IDQ6WJY5.cjs');
5
5
  require('../chunk-KP76AWY3.cjs');
6
6
 
7
7
 
8
- exports.withIntlService = _chunkYZZF3DXXcjs.withIntlService;
8
+ exports.withIntlService = _chunkP3OUBU4Icjs.withIntlService;
9
9
  //# sourceMappingURL=intl.cjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  withIntlService
3
- } from "../chunk-UQCGHU37.js";
3
+ } from "../chunk-VODIIQT4.js";
4
4
  import "../chunk-HTK4HH4J.js";
5
5
  import "../chunk-ET7EYHRY.js";
6
6
  export {
@@ -12,7 +12,11 @@
12
12
 
13
13
 
14
14
 
15
- var _chunk2KVLFGLMcjs = require('../chunk-2KVLFGLM.cjs');
15
+
16
+
17
+
18
+
19
+ var _chunkEN5MQDYXcjs = require('../chunk-EN5MQDYX.cjs');
16
20
  require('../chunk-KP76AWY3.cjs');
17
21
 
18
22
 
@@ -28,5 +32,9 @@ require('../chunk-KP76AWY3.cjs');
28
32
 
29
33
 
30
34
 
31
- exports.EIP1271_MAGIC_VALUE = _chunk2KVLFGLMcjs.EIP1271_MAGIC_VALUE; exports.EXTENSION_STORE_LINKS = _chunk2KVLFGLMcjs.EXTENSION_STORE_LINKS; exports.UrlConverter = _chunk2KVLFGLMcjs.UrlConverter; exports.UrlResolver = _chunk2KVLFGLMcjs.UrlResolver; exports.browserInfo = _chunk2KVLFGLMcjs.browserInfo; exports.createMessage = _chunk2KVLFGLMcjs.createMessage; exports.createSignedQR = _chunk2KVLFGLMcjs.createSignedQR; exports.getControllerAddress = _chunk2KVLFGLMcjs.getControllerAddress; exports.getEIP1271Data = _chunk2KVLFGLMcjs.getEIP1271Data; exports.isSignedQRFormat = _chunk2KVLFGLMcjs.isSignedQRFormat; exports.parseSignedQR = _chunk2KVLFGLMcjs.parseSignedQR; exports.slug = _chunk2KVLFGLMcjs.slug; exports.verifySignedQR = _chunk2KVLFGLMcjs.verifySignedQR;
35
+
36
+
37
+
38
+
39
+ exports.EIP1271_MAGIC_VALUE = _chunkEN5MQDYXcjs.EIP1271_MAGIC_VALUE; exports.EXTENSION_STORE_LINKS = _chunkEN5MQDYXcjs.EXTENSION_STORE_LINKS; exports.UrlConverter = _chunkEN5MQDYXcjs.UrlConverter; exports.UrlResolver = _chunkEN5MQDYXcjs.UrlResolver; exports.browserInfo = _chunkEN5MQDYXcjs.browserInfo; exports.createMessage = _chunkEN5MQDYXcjs.createMessage; exports.createSignedQR = _chunkEN5MQDYXcjs.createSignedQR; exports.getControllerAddress = _chunkEN5MQDYXcjs.getControllerAddress; exports.getEIP1271Data = _chunkEN5MQDYXcjs.getEIP1271Data; exports.isCollectible = _chunkEN5MQDYXcjs.isCollectible; exports.isLyx = _chunkEN5MQDYXcjs.isLyx; exports.isSignedQRFormat = _chunkEN5MQDYXcjs.isSignedQRFormat; exports.isToken = _chunkEN5MQDYXcjs.isToken; exports.parseSignedQR = _chunkEN5MQDYXcjs.parseSignedQR; exports.safeCustomElement = _chunkEN5MQDYXcjs.safeCustomElement; exports.slug = _chunkEN5MQDYXcjs.slug; exports.verifySignedQR = _chunkEN5MQDYXcjs.verifySignedQR;
32
40
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/utils/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,8vBAAC","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/utils/index.cjs"}
1
+ {"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/utils/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,88BAAC","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/utils/index.cjs"}