@lukso/core 0.1.0-dev.c785f65 → 0.1.0-dev.f83cd08

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/{chunk-7ESVFJO6.js → chunk-3WGYJTN4.js} +1 -1
  2. package/dist/chunk-3WGYJTN4.js.map +1 -0
  3. package/dist/{chunk-SOMU2QZE.js → chunk-4TNWG4ME.js} +2 -20
  4. package/dist/chunk-4TNWG4ME.js.map +1 -0
  5. package/dist/{chunk-R77UDCWD.cjs → chunk-CC3LFUYY.cjs} +1 -1
  6. package/dist/chunk-CC3LFUYY.cjs.map +1 -0
  7. package/dist/{chunk-U2BBWX4F.js → chunk-DKXHVRHM.js} +1 -1
  8. package/dist/chunk-DKXHVRHM.js.map +1 -0
  9. package/dist/{chunk-WZIEEMOM.cjs → chunk-FR74YPGJ.cjs} +10 -10
  10. package/dist/chunk-FR74YPGJ.cjs.map +1 -0
  11. package/dist/{chunk-FVO474U6.cjs → chunk-MBIRTPNM.cjs} +1 -1
  12. package/dist/chunk-MBIRTPNM.cjs.map +1 -0
  13. package/dist/{chunk-XOL2VVVB.cjs → chunk-RM42NG7E.cjs} +2 -20
  14. package/dist/chunk-RM42NG7E.cjs.map +1 -0
  15. package/dist/{chunk-6QJEVD4O.js → chunk-SV4TVR2K.js} +3 -3
  16. package/dist/chunk-SV4TVR2K.js.map +1 -0
  17. package/dist/index.cjs +5 -5
  18. package/dist/index.d.cts +1 -1
  19. package/dist/index.d.ts +1 -1
  20. package/dist/index.js +4 -4
  21. package/dist/mixins/device.cjs +2 -2
  22. package/dist/mixins/device.js +1 -1
  23. package/dist/mixins/index.cjs +4 -4
  24. package/dist/mixins/index.js +3 -3
  25. package/dist/mixins/intl.cjs +3 -3
  26. package/dist/mixins/intl.js +2 -2
  27. package/dist/services/index.cjs +2 -2
  28. package/dist/services/index.d.cts +1 -1
  29. package/dist/services/index.d.ts +1 -1
  30. package/dist/services/index.js +1 -1
  31. package/dist/services/intl.cjs +2 -2
  32. package/dist/services/intl.d.cts +9 -5
  33. package/dist/services/intl.d.ts +9 -5
  34. package/dist/services/intl.js +1 -1
  35. package/dist/utils/index.cjs +2 -2
  36. package/dist/utils/index.js +1 -1
  37. package/package.json +3 -2
  38. package/src/index.ts +2 -0
  39. package/src/mixins/device.ts +1 -1
  40. package/src/mixins/intl.ts +3 -3
  41. package/src/services/__tests__/intl.spec.ts +31 -3
  42. package/src/services/index.ts +1 -1
  43. package/src/services/intl.ts +14 -24
  44. package/src/utils/__tests__/browserInfo.spec.ts +1 -1
  45. package/src/utils/browserInfo.ts +1 -1
  46. package/dist/chunk-6QJEVD4O.js.map +0 -1
  47. package/dist/chunk-7ESVFJO6.js.map +0 -1
  48. package/dist/chunk-FVO474U6.cjs.map +0 -1
  49. package/dist/chunk-R77UDCWD.cjs.map +0 -1
  50. package/dist/chunk-SOMU2QZE.js.map +0 -1
  51. package/dist/chunk-U2BBWX4F.js.map +0 -1
  52. package/dist/chunk-WZIEEMOM.cjs.map +0 -1
  53. package/dist/chunk-XOL2VVVB.cjs.map +0 -1
@@ -16,4 +16,4 @@ function withDeviceService(Base) {
16
16
  export {
17
17
  withDeviceService
18
18
  };
19
- //# sourceMappingURL=chunk-7ESVFJO6.js.map
19
+ //# sourceMappingURL=chunk-3WGYJTN4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mixins/device.ts"],"sourcesContent":["/**\n * Device Detection Mixin\n *\n * Mixin to add device detection service to a Lit component\n */\n\nimport type { LitElement } from 'lit'\nimport type { DeviceService } from '../services/device.js'\nimport { deviceService, type NavigatorExtended } from '../services/device.js'\n\n/**\n * Mixin to add device detection service to a Lit component\n *\n * Provides a `device` property with device/OS/browser detection capabilities.\n * The device service is initialized in connectedCallback and follows component lifecycle.\n *\n * @typeParam T - The Lit component class being extended\n * @returns Extended class with device detection capabilities\n *\n * @example\n * ```typescript\n * import { LitElement } from 'lit';\n * import { customElement } from 'lit/decorators.js';\n * import { withDeviceService } from '@lukso/core/mixins';\n *\n * @customElement('my-component')\n * export class MyComponent extends withDeviceService(LitElement) {\n * render() {\n * return html\\`Device is mobile: \\${this.device?.isMobile}\\`;\n * }\n * }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withDeviceService<T extends typeof LitElement>(Base: T): any {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n class Mixin extends (Base as any) {\n device: DeviceService | undefined\n\n connectedCallback(): void {\n super.connectedCallback()\n this.device = deviceService(navigator as NavigatorExtended)\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return Mixin as any\n}\n"],"mappings":";;;;;AAkCO,SAAS,kBAA+C,MAAc;AAAA,EAE3E,MAAM,cAAe,KAAa;AAAA,IAGhC,oBAA0B;AACxB,YAAM,kBAAkB;AACxB,WAAK,SAAS,cAAc,SAA8B;AAAA,IAC5D;AAAA,EACF;AAGA,SAAO;AACT;","names":[]}
@@ -9,25 +9,7 @@ var formatNumberDefaultOptions = {
9
9
  var defaultConfig = {
10
10
  locale: "en-US",
11
11
  messages: {},
12
- formats: {
13
- date: {
14
- shortDateTime: {
15
- weekday: "short",
16
- // Wed
17
- month: "short",
18
- // Dec
19
- day: "numeric",
20
- // 3
21
- year: "numeric",
22
- // 2025
23
- hour: "2-digit",
24
- // 16
25
- minute: "2-digit",
26
- // 07
27
- hour12: false
28
- }
29
- }
30
- }
12
+ formats: {}
31
13
  };
32
14
  var intlService = null;
33
15
  function createIntlService(config = defaultConfig) {
@@ -121,4 +103,4 @@ export {
121
103
  getIntlService,
122
104
  clearIntlService
123
105
  };
124
- //# sourceMappingURL=chunk-SOMU2QZE.js.map
106
+ //# sourceMappingURL=chunk-4TNWG4ME.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/services/intl.ts"],"sourcesContent":["/**\n * Internationalization Service\n *\n * Provides locale-aware formatting for messages, numbers, dates, and times.\n */\n\nimport {\n createIntl,\n type FormatNumberOptions,\n type IntlConfig,\n} from '@formatjs/intl'\nimport { signal } from '@preact/signals-core'\n\n/**\n * Translation messages object type\n * Maps translation keys to their corresponding string values\n */\nexport type IntlMessages = Record<string, string>\n\n/**\n * Default format number options\n * @see https://github.com/formatjs/formatjs/blob/main/packages/ecma402-abstract/types/number.ts\n */\nconst formatNumberDefaultOptions = {\n maximumFractionDigits: 18,\n}\n\n/**\n * Intl service interface\n */\nexport interface IntlService {\n /**\n * Translate a string based on the key\n *\n * @param key - translation key\n * @param options - optional options for formatMessage (for variable interpolation)\n * @returns - translated string\n */\n formatMessage: (key: string, options?: Record<string, string>) => string\n\n /**\n * Number formatting based on the locale\n *\n * @param value - number to format\n * @param options - options for formatNumber\n * @returns - formatted number\n */\n formatNumber: (\n value: number | string | bigint,\n options?: FormatNumberOptions\n ) => string\n\n /**\n * Date formatting based on the locale\n *\n * @param date - date to format\n * @returns - formatted date\n */\n formatDate: (date?: string | number | Date) => string | undefined\n\n /**\n * Time formatting based on the locale\n *\n * @param date - date to format\n * @returns - formatted time\n */\n formatTime: (date?: string | number | Date) => string | undefined\n\n /**\n * Timestamp formatting based on the locale\n *\n * @param timestamp - UNIX timestamp in seconds or milliseconds\n * @param options - formatting options (predefined format name or custom Intl.DateTimeFormat options)\n * @returns - formatted date & time string\n *\n * @example\n * ```typescript\n * const intl = getIntlService();\n *\n * // Use predefined shortDateTime format\n * intl.formatTimestamp(1733251200, 'shortDateTime'); // \"Wed, Dec 3, 2025, 16:07\"\n *\n * // Use custom format options\n * intl.formatTimestamp(1733251200, { year: '2-digit', month: '2-digit', day: '2-digit' });\n * // \"12/03/25\"\n *\n * // No options (basic format)\n * intl.formatTimestamp(1733251200);\n * ```\n */\n formatTimestamp: (\n timestamp?: number | string,\n options?: Intl.DateTimeFormatOptions | string\n ) => string\n\n /**\n * Change the locale and optionally update messages\n *\n * @param locale - new locale code (e.g., 'en-US', 'de-DE')\n * @param messages - optional new messages object for the locale\n */\n setLocale: (locale: string, messages?: IntlMessages) => void\n\n /**\n * Get the current locale\n *\n * @returns - current locale code (e.g., 'en-US', 'de-DE')\n */\n getLocale: () => string\n\n /**\n * Set fallback translations to use when a translation key is missing\n * Useful when the host app's intl service doesn't have all translations\n *\n * @param fallbackMessages - translations to use as fallback\n *\n * @example\n * ```typescript\n * // After intl service is initialized by host app\n * intl.setFallbackTranslations(defaultMessages);\n * ```\n */\n setFallbackTranslations: (fallbackMessages: IntlMessages) => void\n\n /**\n * Signal that tracks locale changes\n * Use this signal to reactively update UI when locale changes\n */\n localeChanged: { value: number }\n}\n\n/**\n * Default configuration for intl\n */\nexport const defaultConfig: IntlConfig = {\n locale: 'en-US',\n messages: {},\n formats: {},\n}\n\n/**\n * Global intl service instance\n */\nlet intlService: IntlService | null = null\n\n/**\n * Create a new intl service instance\n *\n * @param config - intl configuration with locale and messages\n * @returns IntlService instance with formatting methods\n *\n * @example\n * ```typescript\n * import { createIntlService } from '@lukso/core/services/intl';\n *\n * const intl = createIntlService({\n * locale: 'en-US',\n * messages: customMessages,\n * });\n *\n * const translated = intl.formatMessage('app.title');\n * const formatted = intl.formatNumber(1234.56);\n * const currentLocale = intl.getLocale(); // 'en-US'\n *\n * // Change locale\n * intl.setLocale('de-DE', germanMessages);\n * console.log(intl.getLocale()); // 'de-DE'\n * ```\n */\nexport function createIntlService(\n config: IntlConfig = defaultConfig\n): IntlService {\n let currentConfig = { ...defaultConfig, ...config }\n let intl = createIntl({ ...currentConfig, defaultLocale: 'en-US' })\n const localeChanged = signal(0)\n let fallbackMessages: IntlMessages = {}\n\n return {\n formatMessage: (key: string, options?: Record<string, string>): string => {\n try {\n const result = intl.formatMessage({ id: key }, options)\n\n if (result && result !== key) {\n return result\n }\n\n // If no translation found, check fallback\n if (fallbackMessages[key]) {\n return fallbackMessages[key]\n }\n\n return key\n } catch {\n // On error, try fallback\n return fallbackMessages[key] || key\n }\n },\n\n formatNumber: (\n value: number | string | bigint,\n options: FormatNumberOptions = {}\n ): string => {\n if (value === null || value === undefined) {\n return '0'\n }\n\n const _value =\n typeof value === 'string' ? Number.parseFloat(value) : value\n\n const mergedOptions = {\n ...formatNumberDefaultOptions,\n ...options,\n }\n\n return intl.formatNumber(_value as number, mergedOptions) || ''\n },\n\n formatDate: (date?: string | number | Date): string => {\n return intl.formatDate(date)\n },\n\n formatTime: (date?: string | number | Date): string => {\n return intl.formatTime(date)\n },\n\n formatTimestamp: (\n timestamp?: number | string,\n options?: Intl.DateTimeFormatOptions | string\n ): string => {\n if (!timestamp) return ''\n\n const time = typeof timestamp === 'string' ? Number(timestamp) : timestamp\n const date =\n time < 10_000_000_000\n ? new Date(time * 1000) // seconds\n : new Date(time) // milliseconds\n\n // Handle predefined format\n if (typeof options === 'string') {\n const dateTimeOptions = currentConfig.formats?.date?.[\n options\n ] as Intl.DateTimeFormatOptions\n\n if (dateTimeOptions) {\n return new Intl.DateTimeFormat(\n currentConfig.locale,\n dateTimeOptions\n ).format(date)\n }\n\n // Fallback to default format if predefined format not found\n return intl.formatDate(date) || ''\n }\n\n // For normal @formatjs/intl options\n return intl.formatDate(date, options) || ''\n },\n\n setLocale: (locale: string, messages?: IntlMessages): void => {\n currentConfig = {\n ...currentConfig,\n locale,\n messages: messages || currentConfig.messages,\n }\n intl = createIntl({\n ...currentConfig,\n defaultLocale: 'en-US',\n })\n localeChanged.value += 1\n },\n\n getLocale: (): string => {\n return currentConfig.locale\n },\n\n setFallbackTranslations: (fallbackMessagesInput: IntlMessages): void => {\n fallbackMessages = fallbackMessagesInput\n },\n\n localeChanged,\n }\n}\n\n/**\n * Set the global intl service\n * Call this once from your app initialization\n *\n * @param service - IntlService instance\n *\n * @example\n * ```typescript\n * import { setIntlService, createIntlService } from '@lukso/core/services/intl';\n *\n * const intl = createIntlService(config);\n * setIntlService(intl);\n * ```\n */\nexport function setIntlService(service: IntlService): void {\n intlService = service\n}\n\n/**\n * Get the current global intl service\n * Returns null if no service has been set\n *\n * @example\n * ```typescript\n * import { getIntlService } from '@lukso/core/services/intl';\n *\n * const intl = getIntlService();\n * if (intl) {\n * console.log(intl.getLocale());\n * }\n * ```\n */\nexport function getIntlService(): IntlService | null {\n return intlService\n}\n\n/**\n * Clear the global intl service\n * Useful for testing or cleanup\n */\nexport function clearIntlService(): void {\n intlService = null\n}\n"],"mappings":";AAMA;AAAA,EACE;AAAA,OAGK;AACP,SAAS,cAAc;AAYvB,IAAM,6BAA6B;AAAA,EACjC,uBAAuB;AACzB;AA6GO,IAAM,gBAA4B;AAAA,EACvC,QAAQ;AAAA,EACR,UAAU,CAAC;AAAA,EACX,SAAS,CAAC;AACZ;AAKA,IAAI,cAAkC;AA0B/B,SAAS,kBACd,SAAqB,eACR;AACb,MAAI,gBAAgB,EAAE,GAAG,eAAe,GAAG,OAAO;AAClD,MAAI,OAAO,WAAW,EAAE,GAAG,eAAe,eAAe,QAAQ,CAAC;AAClE,QAAM,gBAAgB,OAAO,CAAC;AAC9B,MAAI,mBAAiC,CAAC;AAEtC,SAAO;AAAA,IACL,eAAe,CAAC,KAAa,YAA6C;AACxE,UAAI;AACF,cAAM,SAAS,KAAK,cAAc,EAAE,IAAI,IAAI,GAAG,OAAO;AAEtD,YAAI,UAAU,WAAW,KAAK;AAC5B,iBAAO;AAAA,QACT;AAGA,YAAI,iBAAiB,GAAG,GAAG;AACzB,iBAAO,iBAAiB,GAAG;AAAA,QAC7B;AAEA,eAAO;AAAA,MACT,QAAQ;AAEN,eAAO,iBAAiB,GAAG,KAAK;AAAA,MAClC;AAAA,IACF;AAAA,IAEA,cAAc,CACZ,OACA,UAA+B,CAAC,MACrB;AACX,UAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,eAAO;AAAA,MACT;AAEA,YAAM,SACJ,OAAO,UAAU,WAAW,OAAO,WAAW,KAAK,IAAI;AAEzD,YAAM,gBAAgB;AAAA,QACpB,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAEA,aAAO,KAAK,aAAa,QAAkB,aAAa,KAAK;AAAA,IAC/D;AAAA,IAEA,YAAY,CAAC,SAA0C;AACrD,aAAO,KAAK,WAAW,IAAI;AAAA,IAC7B;AAAA,IAEA,YAAY,CAAC,SAA0C;AACrD,aAAO,KAAK,WAAW,IAAI;AAAA,IAC7B;AAAA,IAEA,iBAAiB,CACf,WACA,YACW;AACX,UAAI,CAAC,UAAW,QAAO;AAEvB,YAAM,OAAO,OAAO,cAAc,WAAW,OAAO,SAAS,IAAI;AACjE,YAAM,OACJ,OAAO,OACH,IAAI,KAAK,OAAO,GAAI,IACpB,IAAI,KAAK,IAAI;AAGnB,UAAI,OAAO,YAAY,UAAU;AAC/B,cAAM,kBAAkB,cAAc,SAAS,OAC7C,OACF;AAEA,YAAI,iBAAiB;AACnB,iBAAO,IAAI,KAAK;AAAA,YACd,cAAc;AAAA,YACd;AAAA,UACF,EAAE,OAAO,IAAI;AAAA,QACf;AAGA,eAAO,KAAK,WAAW,IAAI,KAAK;AAAA,MAClC;AAGA,aAAO,KAAK,WAAW,MAAM,OAAO,KAAK;AAAA,IAC3C;AAAA,IAEA,WAAW,CAAC,QAAgB,aAAkC;AAC5D,sBAAgB;AAAA,QACd,GAAG;AAAA,QACH;AAAA,QACA,UAAU,YAAY,cAAc;AAAA,MACtC;AACA,aAAO,WAAW;AAAA,QAChB,GAAG;AAAA,QACH,eAAe;AAAA,MACjB,CAAC;AACD,oBAAc,SAAS;AAAA,IACzB;AAAA,IAEA,WAAW,MAAc;AACvB,aAAO,cAAc;AAAA,IACvB;AAAA,IAEA,yBAAyB,CAAC,0BAA8C;AACtE,yBAAmB;AAAA,IACrB;AAAA,IAEA;AAAA,EACF;AACF;AAgBO,SAAS,eAAe,SAA4B;AACzD,gBAAc;AAChB;AAgBO,SAAS,iBAAqC;AACnD,SAAO;AACT;AAMO,SAAS,mBAAyB;AACvC,gBAAc;AAChB;","names":[]}
@@ -16,4 +16,4 @@ function withDeviceService(Base) {
16
16
 
17
17
 
18
18
  exports.withDeviceService = withDeviceService;
19
- //# sourceMappingURL=chunk-R77UDCWD.cjs.map
19
+ //# sourceMappingURL=chunk-CC3LFUYY.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-CC3LFUYY.cjs","../src/mixins/device.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;AC8BO,SAAS,iBAAA,CAA+C,IAAA,EAAc;AAAA,EAE3E,MAAM,MAAA,QAAe,KAAa;AAAA,IAGhC,iBAAA,CAAA,EAA0B;AACxB,MAAA,KAAA,CAAM,iBAAA,CAAkB,CAAA;AACxB,MAAA,IAAA,CAAK,OAAA,EAAS,6CAAA,SAA4C,CAAA;AAAA,IAC5D;AAAA,EACF;AAGA,EAAA,OAAO,KAAA;AACT;ADjCA;AACA;AACE;AACF,8CAAC","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-CC3LFUYY.cjs","sourcesContent":[null,"/**\n * Device Detection Mixin\n *\n * Mixin to add device detection service to a Lit component\n */\n\nimport type { LitElement } from 'lit'\nimport type { DeviceService } from '../services/device.js'\nimport { deviceService, type NavigatorExtended } from '../services/device.js'\n\n/**\n * Mixin to add device detection service to a Lit component\n *\n * Provides a `device` property with device/OS/browser detection capabilities.\n * The device service is initialized in connectedCallback and follows component lifecycle.\n *\n * @typeParam T - The Lit component class being extended\n * @returns Extended class with device detection capabilities\n *\n * @example\n * ```typescript\n * import { LitElement } from 'lit';\n * import { customElement } from 'lit/decorators.js';\n * import { withDeviceService } from '@lukso/core/mixins';\n *\n * @customElement('my-component')\n * export class MyComponent extends withDeviceService(LitElement) {\n * render() {\n * return html\\`Device is mobile: \\${this.device?.isMobile}\\`;\n * }\n * }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withDeviceService<T extends typeof LitElement>(Base: T): any {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n class Mixin extends (Base as any) {\n device: DeviceService | undefined\n\n connectedCallback(): void {\n super.connectedCallback()\n this.device = deviceService(navigator as NavigatorExtended)\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return Mixin as any\n}\n"]}
@@ -81,4 +81,4 @@ export {
81
81
  browserInfo,
82
82
  slug
83
83
  };
84
- //# sourceMappingURL=chunk-U2BBWX4F.js.map
84
+ //# sourceMappingURL=chunk-DKXHVRHM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/browserInfo.ts","../src/utils/slug.ts"],"sourcesContent":["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 * 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"],"mappings":";AAkBO,IAAM,wBAAwB;AAAA,EACnC,QACE;AAAA,EACF,OACE;AAAA,EACF,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AACX;AAKO,IAAM,cAAc,CAAC,kBAA8C;AACxE,QAAM,sBAAsB;AAAA,IAC1B,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,QAAM,gBAAgB,MAA+B;AACnD,UAAM,EAAE,UAAU,SAAS,WAAW,UAAU,QAAQ,QAAQ,IAC9D;AAEF,QAAI,SAAS;AACX,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,sBAAsB;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,QAAQ;AACV,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,sBAAsB;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,SAAS;AACX,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,sBAAsB;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,UAAU;AACZ,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,sBAAsB;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,WAAW;AACb,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,sBAAsB;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,UAAU;AACZ,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,sBAAsB;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,QAAMA,eAAc,EAAE,GAAG,qBAAqB,GAAG,cAAc,EAAE;AAEjE,SAAOA;AACT;;;AC/FO,IAAM,OAAO,CAAC,UAAmB;AACtC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,YAAY,EAAE,QAAQ,QAAQ,GAAG;AAChD;","names":["browserInfo"]}
@@ -3,7 +3,7 @@
3
3
 
4
4
 
5
5
 
6
- var _chunkXOL2VVVBcjs = require('./chunk-XOL2VVVB.cjs');
6
+ var _chunkRM42NG7Ecjs = require('./chunk-RM42NG7E.cjs');
7
7
 
8
8
  // src/mixins/intl.ts
9
9
  var _signalscore = require('@preact/signals-core');
@@ -35,17 +35,17 @@ function withIntlService(Base) {
35
35
  }
36
36
  connectedCallback() {
37
37
  super.connectedCallback();
38
- let intl = _chunkXOL2VVVBcjs.getIntlService.call(void 0, );
38
+ let intl = _chunkRM42NG7Ecjs.getIntlService.call(void 0, );
39
39
  if (!intl) {
40
40
  intl = _nullishCoalesce(this.setupLocalIntl(), () => ( null));
41
41
  }
42
42
  if (intl) {
43
43
  this.unsubscribeIntl = _signalscore.effect.call(void 0, () => {
44
- intl.localeChanged.value;
44
+ _optionalChain([intl, 'optionalAccess', _ => _.localeChanged, 'access', _2 => _2.value]);
45
45
  this.requestUpdate();
46
46
  });
47
47
  }
48
- _optionalChain([intl, 'optionalAccess', _ => _.setFallbackTranslations, 'call', _2 => _2(en_US_default)]);
48
+ _optionalChain([intl, 'optionalAccess', _3 => _3.setFallbackTranslations, 'call', _4 => _4(en_US_default)]);
49
49
  }
50
50
  disconnectedCallback() {
51
51
  super.disconnectedCallback();
@@ -58,12 +58,12 @@ function withIntlService(Base) {
58
58
  * Subclasses can override this to customize initialization
59
59
  */
60
60
  setupLocalIntl() {
61
- const intlService = _chunkXOL2VVVBcjs.createIntlService.call(void 0,
62
- Object.assign(_chunkXOL2VVVBcjs.defaultConfig, {
61
+ const intlService = _chunkRM42NG7Ecjs.createIntlService.call(void 0,
62
+ Object.assign(_chunkRM42NG7Ecjs.defaultConfig, {
63
63
  messages: en_US_default
64
64
  })
65
65
  );
66
- _chunkXOL2VVVBcjs.setIntlService.call(void 0, intlService);
66
+ _chunkRM42NG7Ecjs.setIntlService.call(void 0, intlService);
67
67
  return intlService;
68
68
  }
69
69
  /**
@@ -74,8 +74,8 @@ function withIntlService(Base) {
74
74
  console.warn("No translation key provided to formatMessage");
75
75
  return "";
76
76
  }
77
- const intl = _chunkXOL2VVVBcjs.getIntlService.call(void 0, );
78
- return _nullishCoalesce(_optionalChain([intl, 'optionalAccess', _3 => _3.formatMessage, 'call', _4 => _4(key, options)]), () => ( key));
77
+ const intl = _chunkRM42NG7Ecjs.getIntlService.call(void 0, );
78
+ return _nullishCoalesce(_optionalChain([intl, 'optionalAccess', _5 => _5.formatMessage, 'call', _6 => _6(key, options)]), () => ( key));
79
79
  }
80
80
  }
81
81
  return Mixin;
@@ -84,4 +84,4 @@ function withIntlService(Base) {
84
84
 
85
85
 
86
86
  exports.withIntlService = withIntlService;
87
- //# sourceMappingURL=chunk-WZIEEMOM.cjs.map
87
+ //# sourceMappingURL=chunk-FR74YPGJ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-FR74YPGJ.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,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;AAC7C,CAAA;AFYA;AACA;ACgBO,SAAS,eAAA,CAA6C,IAAA,EAAc;AAAA,EAEzE,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;AAGA,EAAA,OAAO,KAAA;AACT;AD7BA;AACA;AACE;AACF,0CAAC","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-FR74YPGJ.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 * 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 */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withIntlService<T extends typeof LitElement>(Base: T): any {\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return Mixin as any\n}\n","{\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}"]}
@@ -81,4 +81,4 @@ var slug = (value) => {
81
81
 
82
82
 
83
83
  exports.EXTENSION_STORE_LINKS = EXTENSION_STORE_LINKS; exports.browserInfo = browserInfo; exports.slug = slug;
84
- //# sourceMappingURL=chunk-FVO474U6.cjs.map
84
+ //# sourceMappingURL=chunk-MBIRTPNM.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-MBIRTPNM.cjs","../src/utils/browserInfo.ts","../src/utils/slug.ts"],"names":["browserInfo"],"mappings":"AAAA;ACkBO,IAAM,sBAAA,EAAwB;AAAA,EACnC,MAAA,EACE,sGAAA;AAAA,EACF,KAAA,EACE,sGAAA;AAAA,EACF,IAAA,EAAM,sGAAA;AAAA,EACN,KAAA,EAAO,EAAA;AAAA,EACP,MAAA,EAAQ,EAAA;AAAA,EACR,OAAA,EAAS;AACX,CAAA;AAKO,IAAM,YAAA,EAAc,CAAC,aAAA,EAAA,GAA8C;AACxE,EAAA,MAAM,oBAAA,EAAsB;AAAA,IAC1B,EAAA,EAAI,QAAA;AAAA,IACJ,IAAA,EAAM,EAAA;AAAA,IACN,IAAA,EAAM;AAAA,EACR,CAAA;AAEA,EAAA,MAAM,cAAA,EAAgB,CAAA,EAAA,GAA+B;AACnD,IAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,MAAA,EAAQ,QAAQ,EAAA,EAC9D,aAAA;AAEF,IAAA,GAAA,CAAI,OAAA,EAAS;AACX,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,OAAA;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,YAAA;AAAA,QACN,SAAA,EAAW,qBAAA,CAAsB;AAAA,MACnC,CAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,MAAA,EAAQ;AACV,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,MAAA;AAAA,QACJ,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,SAAA,EAAW,qBAAA,CAAsB;AAAA,MACnC,CAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,OAAA,EAAS;AACX,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,OAAA;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,YAAA;AAAA,QACN,SAAA,EAAW,qBAAA,CAAsB;AAAA,MACnC,CAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,QAAA,EAAU;AACZ,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,QAAA;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,aAAA;AAAA,QACN,SAAA,EAAW,qBAAA,CAAsB;AAAA,MACnC,CAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,SAAA,EAAW;AACb,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,SAAA;AAAA,QACJ,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM,cAAA;AAAA,QACN,SAAA,EAAW,qBAAA,CAAsB;AAAA,MACnC,CAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,QAAA,EAAU;AACZ,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,QAAA;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,aAAA;AAAA,QACN,SAAA,EAAW,qBAAA,CAAsB;AAAA,MACnC,CAAA;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAMA,aAAAA,EAAc,EAAE,GAAG,mBAAA,EAAqB,GAAG,aAAA,CAAc,EAAE,CAAA;AAEjE,EAAA,OAAOA,YAAAA;AACT,CAAA;ADhCA;AACA;AEhEO,IAAM,KAAA,EAAO,CAAC,KAAA,EAAA,GAAmB;AACtC,EAAA,GAAA,CAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA,CAAM,WAAA,CAAY,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AAChD,CAAA;AFiEA;AACA;AACE;AACA;AACA;AACF,8GAAC","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-MBIRTPNM.cjs","sourcesContent":[null,"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 * 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"]}
@@ -9,25 +9,7 @@ var formatNumberDefaultOptions = {
9
9
  var defaultConfig = {
10
10
  locale: "en-US",
11
11
  messages: {},
12
- formats: {
13
- date: {
14
- shortDateTime: {
15
- weekday: "short",
16
- // Wed
17
- month: "short",
18
- // Dec
19
- day: "numeric",
20
- // 3
21
- year: "numeric",
22
- // 2025
23
- hour: "2-digit",
24
- // 16
25
- minute: "2-digit",
26
- // 07
27
- hour12: false
28
- }
29
- }
30
- }
12
+ formats: {}
31
13
  };
32
14
  var intlService = null;
33
15
  function createIntlService(config = defaultConfig) {
@@ -121,4 +103,4 @@ function clearIntlService() {
121
103
 
122
104
 
123
105
  exports.defaultConfig = defaultConfig; exports.createIntlService = createIntlService; exports.setIntlService = setIntlService; exports.getIntlService = getIntlService; exports.clearIntlService = clearIntlService;
124
- //# sourceMappingURL=chunk-XOL2VVVB.cjs.map
106
+ //# sourceMappingURL=chunk-RM42NG7E.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-RM42NG7E.cjs","../src/services/intl.ts"],"names":[],"mappings":"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","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-RM42NG7E.cjs","sourcesContent":[null,"/**\n * Internationalization Service\n *\n * Provides locale-aware formatting for messages, numbers, dates, and times.\n */\n\nimport {\n createIntl,\n type FormatNumberOptions,\n type IntlConfig,\n} from '@formatjs/intl'\nimport { signal } from '@preact/signals-core'\n\n/**\n * Translation messages object type\n * Maps translation keys to their corresponding string values\n */\nexport type IntlMessages = Record<string, string>\n\n/**\n * Default format number options\n * @see https://github.com/formatjs/formatjs/blob/main/packages/ecma402-abstract/types/number.ts\n */\nconst formatNumberDefaultOptions = {\n maximumFractionDigits: 18,\n}\n\n/**\n * Intl service interface\n */\nexport interface IntlService {\n /**\n * Translate a string based on the key\n *\n * @param key - translation key\n * @param options - optional options for formatMessage (for variable interpolation)\n * @returns - translated string\n */\n formatMessage: (key: string, options?: Record<string, string>) => string\n\n /**\n * Number formatting based on the locale\n *\n * @param value - number to format\n * @param options - options for formatNumber\n * @returns - formatted number\n */\n formatNumber: (\n value: number | string | bigint,\n options?: FormatNumberOptions\n ) => string\n\n /**\n * Date formatting based on the locale\n *\n * @param date - date to format\n * @returns - formatted date\n */\n formatDate: (date?: string | number | Date) => string | undefined\n\n /**\n * Time formatting based on the locale\n *\n * @param date - date to format\n * @returns - formatted time\n */\n formatTime: (date?: string | number | Date) => string | undefined\n\n /**\n * Timestamp formatting based on the locale\n *\n * @param timestamp - UNIX timestamp in seconds or milliseconds\n * @param options - formatting options (predefined format name or custom Intl.DateTimeFormat options)\n * @returns - formatted date & time string\n *\n * @example\n * ```typescript\n * const intl = getIntlService();\n *\n * // Use predefined shortDateTime format\n * intl.formatTimestamp(1733251200, 'shortDateTime'); // \"Wed, Dec 3, 2025, 16:07\"\n *\n * // Use custom format options\n * intl.formatTimestamp(1733251200, { year: '2-digit', month: '2-digit', day: '2-digit' });\n * // \"12/03/25\"\n *\n * // No options (basic format)\n * intl.formatTimestamp(1733251200);\n * ```\n */\n formatTimestamp: (\n timestamp?: number | string,\n options?: Intl.DateTimeFormatOptions | string\n ) => string\n\n /**\n * Change the locale and optionally update messages\n *\n * @param locale - new locale code (e.g., 'en-US', 'de-DE')\n * @param messages - optional new messages object for the locale\n */\n setLocale: (locale: string, messages?: IntlMessages) => void\n\n /**\n * Get the current locale\n *\n * @returns - current locale code (e.g., 'en-US', 'de-DE')\n */\n getLocale: () => string\n\n /**\n * Set fallback translations to use when a translation key is missing\n * Useful when the host app's intl service doesn't have all translations\n *\n * @param fallbackMessages - translations to use as fallback\n *\n * @example\n * ```typescript\n * // After intl service is initialized by host app\n * intl.setFallbackTranslations(defaultMessages);\n * ```\n */\n setFallbackTranslations: (fallbackMessages: IntlMessages) => void\n\n /**\n * Signal that tracks locale changes\n * Use this signal to reactively update UI when locale changes\n */\n localeChanged: { value: number }\n}\n\n/**\n * Default configuration for intl\n */\nexport const defaultConfig: IntlConfig = {\n locale: 'en-US',\n messages: {},\n formats: {},\n}\n\n/**\n * Global intl service instance\n */\nlet intlService: IntlService | null = null\n\n/**\n * Create a new intl service instance\n *\n * @param config - intl configuration with locale and messages\n * @returns IntlService instance with formatting methods\n *\n * @example\n * ```typescript\n * import { createIntlService } from '@lukso/core/services/intl';\n *\n * const intl = createIntlService({\n * locale: 'en-US',\n * messages: customMessages,\n * });\n *\n * const translated = intl.formatMessage('app.title');\n * const formatted = intl.formatNumber(1234.56);\n * const currentLocale = intl.getLocale(); // 'en-US'\n *\n * // Change locale\n * intl.setLocale('de-DE', germanMessages);\n * console.log(intl.getLocale()); // 'de-DE'\n * ```\n */\nexport function createIntlService(\n config: IntlConfig = defaultConfig\n): IntlService {\n let currentConfig = { ...defaultConfig, ...config }\n let intl = createIntl({ ...currentConfig, defaultLocale: 'en-US' })\n const localeChanged = signal(0)\n let fallbackMessages: IntlMessages = {}\n\n return {\n formatMessage: (key: string, options?: Record<string, string>): string => {\n try {\n const result = intl.formatMessage({ id: key }, options)\n\n if (result && result !== key) {\n return result\n }\n\n // If no translation found, check fallback\n if (fallbackMessages[key]) {\n return fallbackMessages[key]\n }\n\n return key\n } catch {\n // On error, try fallback\n return fallbackMessages[key] || key\n }\n },\n\n formatNumber: (\n value: number | string | bigint,\n options: FormatNumberOptions = {}\n ): string => {\n if (value === null || value === undefined) {\n return '0'\n }\n\n const _value =\n typeof value === 'string' ? Number.parseFloat(value) : value\n\n const mergedOptions = {\n ...formatNumberDefaultOptions,\n ...options,\n }\n\n return intl.formatNumber(_value as number, mergedOptions) || ''\n },\n\n formatDate: (date?: string | number | Date): string => {\n return intl.formatDate(date)\n },\n\n formatTime: (date?: string | number | Date): string => {\n return intl.formatTime(date)\n },\n\n formatTimestamp: (\n timestamp?: number | string,\n options?: Intl.DateTimeFormatOptions | string\n ): string => {\n if (!timestamp) return ''\n\n const time = typeof timestamp === 'string' ? Number(timestamp) : timestamp\n const date =\n time < 10_000_000_000\n ? new Date(time * 1000) // seconds\n : new Date(time) // milliseconds\n\n // Handle predefined format\n if (typeof options === 'string') {\n const dateTimeOptions = currentConfig.formats?.date?.[\n options\n ] as Intl.DateTimeFormatOptions\n\n if (dateTimeOptions) {\n return new Intl.DateTimeFormat(\n currentConfig.locale,\n dateTimeOptions\n ).format(date)\n }\n\n // Fallback to default format if predefined format not found\n return intl.formatDate(date) || ''\n }\n\n // For normal @formatjs/intl options\n return intl.formatDate(date, options) || ''\n },\n\n setLocale: (locale: string, messages?: IntlMessages): void => {\n currentConfig = {\n ...currentConfig,\n locale,\n messages: messages || currentConfig.messages,\n }\n intl = createIntl({\n ...currentConfig,\n defaultLocale: 'en-US',\n })\n localeChanged.value += 1\n },\n\n getLocale: (): string => {\n return currentConfig.locale\n },\n\n setFallbackTranslations: (fallbackMessagesInput: IntlMessages): void => {\n fallbackMessages = fallbackMessagesInput\n },\n\n localeChanged,\n }\n}\n\n/**\n * Set the global intl service\n * Call this once from your app initialization\n *\n * @param service - IntlService instance\n *\n * @example\n * ```typescript\n * import { setIntlService, createIntlService } from '@lukso/core/services/intl';\n *\n * const intl = createIntlService(config);\n * setIntlService(intl);\n * ```\n */\nexport function setIntlService(service: IntlService): void {\n intlService = service\n}\n\n/**\n * Get the current global intl service\n * Returns null if no service has been set\n *\n * @example\n * ```typescript\n * import { getIntlService } from '@lukso/core/services/intl';\n *\n * const intl = getIntlService();\n * if (intl) {\n * console.log(intl.getLocale());\n * }\n * ```\n */\nexport function getIntlService(): IntlService | null {\n return intlService\n}\n\n/**\n * Clear the global intl service\n * Useful for testing or cleanup\n */\nexport function clearIntlService(): void {\n intlService = null\n}\n"]}
@@ -3,7 +3,7 @@ import {
3
3
  defaultConfig,
4
4
  getIntlService,
5
5
  setIntlService
6
- } from "./chunk-SOMU2QZE.js";
6
+ } from "./chunk-4TNWG4ME.js";
7
7
 
8
8
  // src/mixins/intl.ts
9
9
  import { effect } from "@preact/signals-core";
@@ -41,7 +41,7 @@ function withIntlService(Base) {
41
41
  }
42
42
  if (intl) {
43
43
  this.unsubscribeIntl = effect(() => {
44
- intl.localeChanged.value;
44
+ intl?.localeChanged.value;
45
45
  this.requestUpdate();
46
46
  });
47
47
  }
@@ -84,4 +84,4 @@ function withIntlService(Base) {
84
84
  export {
85
85
  withIntlService
86
86
  };
87
- //# sourceMappingURL=chunk-6QJEVD4O.js.map
87
+ //# sourceMappingURL=chunk-SV4TVR2K.js.map
@@ -0,0 +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 * 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 */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withIntlService<T extends typeof LitElement>(Base: T): any {\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return Mixin as any\n}\n","{\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,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;;;AD6BO,SAAS,gBAA6C,MAAc;AAAA,EAEzE,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;AAGA,SAAO;AACT;","names":[]}
package/dist/index.cjs CHANGED
@@ -1,10 +1,10 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});require('./chunk-AMRGSLR5.cjs');
2
2
 
3
3
 
4
- var _chunkR77UDCWDcjs = require('./chunk-R77UDCWD.cjs');
4
+ var _chunkCC3LFUYYcjs = require('./chunk-CC3LFUYY.cjs');
5
5
 
6
6
 
7
- var _chunkWZIEEMOMcjs = require('./chunk-WZIEEMOM.cjs');
7
+ var _chunkFR74YPGJcjs = require('./chunk-FR74YPGJ.cjs');
8
8
  require('./chunk-DFMMMF62.cjs');
9
9
 
10
10
 
@@ -15,12 +15,12 @@ var _chunkNJQVWIZLcjs = require('./chunk-NJQVWIZL.cjs');
15
15
 
16
16
 
17
17
 
18
- var _chunkXOL2VVVBcjs = require('./chunk-XOL2VVVB.cjs');
18
+ var _chunkRM42NG7Ecjs = require('./chunk-RM42NG7E.cjs');
19
19
 
20
20
 
21
21
 
22
22
 
23
- var _chunkFVO474U6cjs = require('./chunk-FVO474U6.cjs');
23
+ var _chunkMBIRTPNMcjs = require('./chunk-MBIRTPNM.cjs');
24
24
 
25
25
 
26
26
 
@@ -33,5 +33,5 @@ var _chunkFVO474U6cjs = require('./chunk-FVO474U6.cjs');
33
33
 
34
34
 
35
35
 
36
- exports.EXTENSION_STORE_LINKS = _chunkFVO474U6cjs.EXTENSION_STORE_LINKS; exports.browserInfo = _chunkFVO474U6cjs.browserInfo; exports.clearIntlService = _chunkXOL2VVVBcjs.clearIntlService; exports.createIntlService = _chunkXOL2VVVBcjs.createIntlService; exports.defaultConfig = _chunkXOL2VVVBcjs.defaultConfig; exports.deviceService = _chunkNJQVWIZLcjs.deviceService; exports.getIntlService = _chunkXOL2VVVBcjs.getIntlService; exports.setIntlService = _chunkXOL2VVVBcjs.setIntlService; exports.slug = _chunkFVO474U6cjs.slug; exports.withDeviceService = _chunkR77UDCWDcjs.withDeviceService; exports.withIntlService = _chunkWZIEEMOMcjs.withIntlService;
36
+ exports.EXTENSION_STORE_LINKS = _chunkMBIRTPNMcjs.EXTENSION_STORE_LINKS; exports.browserInfo = _chunkMBIRTPNMcjs.browserInfo; exports.clearIntlService = _chunkRM42NG7Ecjs.clearIntlService; exports.createIntlService = _chunkRM42NG7Ecjs.createIntlService; exports.defaultConfig = _chunkRM42NG7Ecjs.defaultConfig; exports.deviceService = _chunkNJQVWIZLcjs.deviceService; exports.getIntlService = _chunkRM42NG7Ecjs.getIntlService; exports.setIntlService = _chunkRM42NG7Ecjs.setIntlService; exports.slug = _chunkMBIRTPNMcjs.slug; exports.withDeviceService = _chunkCC3LFUYYcjs.withDeviceService; exports.withIntlService = _chunkFR74YPGJcjs.withIntlService;
37
37
  //# sourceMappingURL=index.cjs.map
package/dist/index.d.cts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { withDeviceService } from './mixins/device.cjs';
2
2
  export { withIntlService } from './mixins/intl.cjs';
3
3
  export { DeviceService, NavigatorExtended, deviceService } from './services/device.cjs';
4
- export { IntlService, clearIntlService, createIntlService, defaultConfig, getIntlService, setIntlService } from './services/intl.cjs';
4
+ export { IntlMessages, IntlService, clearIntlService, createIntlService, defaultConfig, getIntlService, setIntlService } from './services/intl.cjs';
5
5
  export { BrowserInfo, BrowserName, EXTENSION_STORE_LINKS, browserInfo, slug } from './utils/index.cjs';
6
6
  import 'lit';
7
7
  import 'ua-parser-js';
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { withDeviceService } from './mixins/device.js';
2
2
  export { withIntlService } from './mixins/intl.js';
3
3
  export { DeviceService, NavigatorExtended, deviceService } from './services/device.js';
4
- export { IntlService, clearIntlService, createIntlService, defaultConfig, getIntlService, setIntlService } from './services/intl.js';
4
+ export { IntlMessages, IntlService, clearIntlService, createIntlService, defaultConfig, getIntlService, setIntlService } from './services/intl.js';
5
5
  export { BrowserInfo, BrowserName, EXTENSION_STORE_LINKS, browserInfo, slug } from './utils/index.js';
6
6
  import 'lit';
7
7
  import 'ua-parser-js';
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import "./chunk-DKEXQFNE.js";
2
2
  import {
3
3
  withDeviceService
4
- } from "./chunk-7ESVFJO6.js";
4
+ } from "./chunk-3WGYJTN4.js";
5
5
  import {
6
6
  withIntlService
7
- } from "./chunk-6QJEVD4O.js";
7
+ } from "./chunk-SV4TVR2K.js";
8
8
  import "./chunk-LEL6VWU4.js";
9
9
  import {
10
10
  deviceService
@@ -15,12 +15,12 @@ import {
15
15
  defaultConfig,
16
16
  getIntlService,
17
17
  setIntlService
18
- } from "./chunk-SOMU2QZE.js";
18
+ } from "./chunk-4TNWG4ME.js";
19
19
  import {
20
20
  EXTENSION_STORE_LINKS,
21
21
  browserInfo,
22
22
  slug
23
- } from "./chunk-U2BBWX4F.js";
23
+ } from "./chunk-DKXHVRHM.js";
24
24
  export {
25
25
  EXTENSION_STORE_LINKS,
26
26
  browserInfo,
@@ -1,8 +1,8 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkR77UDCWDcjs = require('../chunk-R77UDCWD.cjs');
3
+ var _chunkCC3LFUYYcjs = require('../chunk-CC3LFUYY.cjs');
4
4
  require('../chunk-NJQVWIZL.cjs');
5
5
 
6
6
 
7
- exports.withDeviceService = _chunkR77UDCWDcjs.withDeviceService;
7
+ exports.withDeviceService = _chunkCC3LFUYYcjs.withDeviceService;
8
8
  //# sourceMappingURL=device.cjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  withDeviceService
3
- } from "../chunk-7ESVFJO6.js";
3
+ } from "../chunk-3WGYJTN4.js";
4
4
  import "../chunk-X2QNFZU7.js";
5
5
  export {
6
6
  withDeviceService
@@ -1,14 +1,14 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});require('../chunk-AMRGSLR5.cjs');
2
2
 
3
3
 
4
- var _chunkR77UDCWDcjs = require('../chunk-R77UDCWD.cjs');
4
+ var _chunkCC3LFUYYcjs = require('../chunk-CC3LFUYY.cjs');
5
5
 
6
6
 
7
- var _chunkWZIEEMOMcjs = require('../chunk-WZIEEMOM.cjs');
7
+ var _chunkFR74YPGJcjs = require('../chunk-FR74YPGJ.cjs');
8
8
  require('../chunk-NJQVWIZL.cjs');
9
- require('../chunk-XOL2VVVB.cjs');
9
+ require('../chunk-RM42NG7E.cjs');
10
10
 
11
11
 
12
12
 
13
- exports.withDeviceService = _chunkR77UDCWDcjs.withDeviceService; exports.withIntlService = _chunkWZIEEMOMcjs.withIntlService;
13
+ exports.withDeviceService = _chunkCC3LFUYYcjs.withDeviceService; exports.withIntlService = _chunkFR74YPGJcjs.withIntlService;
14
14
  //# sourceMappingURL=index.cjs.map
@@ -1,12 +1,12 @@
1
1
  import "../chunk-DKEXQFNE.js";
2
2
  import {
3
3
  withDeviceService
4
- } from "../chunk-7ESVFJO6.js";
4
+ } from "../chunk-3WGYJTN4.js";
5
5
  import {
6
6
  withIntlService
7
- } from "../chunk-6QJEVD4O.js";
7
+ } from "../chunk-SV4TVR2K.js";
8
8
  import "../chunk-X2QNFZU7.js";
9
- import "../chunk-SOMU2QZE.js";
9
+ import "../chunk-4TNWG4ME.js";
10
10
  export {
11
11
  withDeviceService,
12
12
  withIntlService
@@ -1,8 +1,8 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkWZIEEMOMcjs = require('../chunk-WZIEEMOM.cjs');
4
- require('../chunk-XOL2VVVB.cjs');
3
+ var _chunkFR74YPGJcjs = require('../chunk-FR74YPGJ.cjs');
4
+ require('../chunk-RM42NG7E.cjs');
5
5
 
6
6
 
7
- exports.withIntlService = _chunkWZIEEMOMcjs.withIntlService;
7
+ exports.withIntlService = _chunkFR74YPGJcjs.withIntlService;
8
8
  //# sourceMappingURL=intl.cjs.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  withIntlService
3
- } from "../chunk-6QJEVD4O.js";
4
- import "../chunk-SOMU2QZE.js";
3
+ } from "../chunk-SV4TVR2K.js";
4
+ import "../chunk-4TNWG4ME.js";
5
5
  export {
6
6
  withIntlService
7
7
  };
@@ -8,7 +8,7 @@ var _chunkNJQVWIZLcjs = require('../chunk-NJQVWIZL.cjs');
8
8
 
9
9
 
10
10
 
11
- var _chunkXOL2VVVBcjs = require('../chunk-XOL2VVVB.cjs');
11
+ var _chunkRM42NG7Ecjs = require('../chunk-RM42NG7E.cjs');
12
12
 
13
13
 
14
14
 
@@ -16,5 +16,5 @@ var _chunkXOL2VVVBcjs = require('../chunk-XOL2VVVB.cjs');
16
16
 
17
17
 
18
18
 
19
- exports.clearIntlService = _chunkXOL2VVVBcjs.clearIntlService; exports.createIntlService = _chunkXOL2VVVBcjs.createIntlService; exports.defaultConfig = _chunkXOL2VVVBcjs.defaultConfig; exports.deviceService = _chunkNJQVWIZLcjs.deviceService; exports.getIntlService = _chunkXOL2VVVBcjs.getIntlService; exports.setIntlService = _chunkXOL2VVVBcjs.setIntlService;
19
+ exports.clearIntlService = _chunkRM42NG7Ecjs.clearIntlService; exports.createIntlService = _chunkRM42NG7Ecjs.createIntlService; exports.defaultConfig = _chunkRM42NG7Ecjs.defaultConfig; exports.deviceService = _chunkNJQVWIZLcjs.deviceService; exports.getIntlService = _chunkRM42NG7Ecjs.getIntlService; exports.setIntlService = _chunkRM42NG7Ecjs.setIntlService;
20
20
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
1
  export { DeviceService, NavigatorExtended, deviceService } from './device.cjs';
2
- export { IntlService, clearIntlService, createIntlService, defaultConfig, getIntlService, setIntlService } from './intl.cjs';
2
+ export { IntlMessages, IntlService, clearIntlService, createIntlService, defaultConfig, getIntlService, setIntlService } from './intl.cjs';
3
3
  import 'ua-parser-js';
4
4
  import '@formatjs/intl';
@@ -1,4 +1,4 @@
1
1
  export { DeviceService, NavigatorExtended, deviceService } from './device.js';
2
- export { IntlService, clearIntlService, createIntlService, defaultConfig, getIntlService, setIntlService } from './intl.js';
2
+ export { IntlMessages, IntlService, clearIntlService, createIntlService, defaultConfig, getIntlService, setIntlService } from './intl.js';
3
3
  import 'ua-parser-js';
4
4
  import '@formatjs/intl';
@@ -8,7 +8,7 @@ import {
8
8
  defaultConfig,
9
9
  getIntlService,
10
10
  setIntlService
11
- } from "../chunk-SOMU2QZE.js";
11
+ } from "../chunk-4TNWG4ME.js";
12
12
  export {
13
13
  clearIntlService,
14
14
  createIntlService,
@@ -4,12 +4,12 @@
4
4
 
5
5
 
6
6
 
7
- var _chunkXOL2VVVBcjs = require('../chunk-XOL2VVVB.cjs');
7
+ var _chunkRM42NG7Ecjs = require('../chunk-RM42NG7E.cjs');
8
8
 
9
9
 
10
10
 
11
11
 
12
12
 
13
13
 
14
- exports.clearIntlService = _chunkXOL2VVVBcjs.clearIntlService; exports.createIntlService = _chunkXOL2VVVBcjs.createIntlService; exports.defaultConfig = _chunkXOL2VVVBcjs.defaultConfig; exports.getIntlService = _chunkXOL2VVVBcjs.getIntlService; exports.setIntlService = _chunkXOL2VVVBcjs.setIntlService;
14
+ exports.clearIntlService = _chunkRM42NG7Ecjs.clearIntlService; exports.createIntlService = _chunkRM42NG7Ecjs.createIntlService; exports.defaultConfig = _chunkRM42NG7Ecjs.defaultConfig; exports.getIntlService = _chunkRM42NG7Ecjs.getIntlService; exports.setIntlService = _chunkRM42NG7Ecjs.setIntlService;
15
15
  //# sourceMappingURL=intl.cjs.map
@@ -6,7 +6,11 @@ import { FormatNumberOptions, IntlConfig } from '@formatjs/intl';
6
6
  * Provides locale-aware formatting for messages, numbers, dates, and times.
7
7
  */
8
8
 
9
- type TimestampFormat = 'shortDateTime';
9
+ /**
10
+ * Translation messages object type
11
+ * Maps translation keys to their corresponding string values
12
+ */
13
+ type IntlMessages = Record<string, string>;
10
14
  /**
11
15
  * Intl service interface
12
16
  */
@@ -63,14 +67,14 @@ interface IntlService {
63
67
  * intl.formatTimestamp(1733251200);
64
68
  * ```
65
69
  */
66
- formatTimestamp: (timestamp?: number | string, options?: TimestampFormat | Intl.DateTimeFormatOptions) => string;
70
+ formatTimestamp: (timestamp?: number | string, options?: Intl.DateTimeFormatOptions | string) => string;
67
71
  /**
68
72
  * Change the locale and optionally update messages
69
73
  *
70
74
  * @param locale - new locale code (e.g., 'en-US', 'de-DE')
71
75
  * @param messages - optional new messages object for the locale
72
76
  */
73
- setLocale: (locale: string, messages?: Record<string, string>) => void;
77
+ setLocale: (locale: string, messages?: IntlMessages) => void;
74
78
  /**
75
79
  * Get the current locale
76
80
  *
@@ -89,7 +93,7 @@ interface IntlService {
89
93
  * intl.setFallbackTranslations(defaultMessages);
90
94
  * ```
91
95
  */
92
- setFallbackTranslations: (fallbackMessages: Record<string, string>) => void;
96
+ setFallbackTranslations: (fallbackMessages: IntlMessages) => void;
93
97
  /**
94
98
  * Signal that tracks locale changes
95
99
  * Use this signal to reactively update UI when locale changes
@@ -163,4 +167,4 @@ declare function getIntlService(): IntlService | null;
163
167
  */
164
168
  declare function clearIntlService(): void;
165
169
 
166
- export { type IntlService, type TimestampFormat, clearIntlService, createIntlService, defaultConfig, getIntlService, setIntlService };
170
+ export { type IntlMessages, type IntlService, clearIntlService, createIntlService, defaultConfig, getIntlService, setIntlService };
@@ -6,7 +6,11 @@ import { FormatNumberOptions, IntlConfig } from '@formatjs/intl';
6
6
  * Provides locale-aware formatting for messages, numbers, dates, and times.
7
7
  */
8
8
 
9
- type TimestampFormat = 'shortDateTime';
9
+ /**
10
+ * Translation messages object type
11
+ * Maps translation keys to their corresponding string values
12
+ */
13
+ type IntlMessages = Record<string, string>;
10
14
  /**
11
15
  * Intl service interface
12
16
  */
@@ -63,14 +67,14 @@ interface IntlService {
63
67
  * intl.formatTimestamp(1733251200);
64
68
  * ```
65
69
  */
66
- formatTimestamp: (timestamp?: number | string, options?: TimestampFormat | Intl.DateTimeFormatOptions) => string;
70
+ formatTimestamp: (timestamp?: number | string, options?: Intl.DateTimeFormatOptions | string) => string;
67
71
  /**
68
72
  * Change the locale and optionally update messages
69
73
  *
70
74
  * @param locale - new locale code (e.g., 'en-US', 'de-DE')
71
75
  * @param messages - optional new messages object for the locale
72
76
  */
73
- setLocale: (locale: string, messages?: Record<string, string>) => void;
77
+ setLocale: (locale: string, messages?: IntlMessages) => void;
74
78
  /**
75
79
  * Get the current locale
76
80
  *
@@ -89,7 +93,7 @@ interface IntlService {
89
93
  * intl.setFallbackTranslations(defaultMessages);
90
94
  * ```
91
95
  */
92
- setFallbackTranslations: (fallbackMessages: Record<string, string>) => void;
96
+ setFallbackTranslations: (fallbackMessages: IntlMessages) => void;
93
97
  /**
94
98
  * Signal that tracks locale changes
95
99
  * Use this signal to reactively update UI when locale changes
@@ -163,4 +167,4 @@ declare function getIntlService(): IntlService | null;
163
167
  */
164
168
  declare function clearIntlService(): void;
165
169
 
166
- export { type IntlService, type TimestampFormat, clearIntlService, createIntlService, defaultConfig, getIntlService, setIntlService };
170
+ export { type IntlMessages, type IntlService, clearIntlService, createIntlService, defaultConfig, getIntlService, setIntlService };
@@ -4,7 +4,7 @@ import {
4
4
  defaultConfig,
5
5
  getIntlService,
6
6
  setIntlService
7
- } from "../chunk-SOMU2QZE.js";
7
+ } from "../chunk-4TNWG4ME.js";
8
8
  export {
9
9
  clearIntlService,
10
10
  createIntlService,
@@ -2,10 +2,10 @@
2
2
 
3
3
 
4
4
 
5
- var _chunkFVO474U6cjs = require('../chunk-FVO474U6.cjs');
5
+ var _chunkMBIRTPNMcjs = require('../chunk-MBIRTPNM.cjs');
6
6
 
7
7
 
8
8
 
9
9
 
10
- exports.EXTENSION_STORE_LINKS = _chunkFVO474U6cjs.EXTENSION_STORE_LINKS; exports.browserInfo = _chunkFVO474U6cjs.browserInfo; exports.slug = _chunkFVO474U6cjs.slug;
10
+ exports.EXTENSION_STORE_LINKS = _chunkMBIRTPNMcjs.EXTENSION_STORE_LINKS; exports.browserInfo = _chunkMBIRTPNMcjs.browserInfo; exports.slug = _chunkMBIRTPNMcjs.slug;
11
11
  //# sourceMappingURL=index.cjs.map
@@ -2,7 +2,7 @@ import {
2
2
  EXTENSION_STORE_LINKS,
3
3
  browserInfo,
4
4
  slug
5
- } from "../chunk-U2BBWX4F.js";
5
+ } from "../chunk-DKXHVRHM.js";
6
6
  export {
7
7
  EXTENSION_STORE_LINKS,
8
8
  browserInfo,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lukso/core",
3
- "version": "0.1.0-dev.c785f65",
3
+ "version": "0.1.0-dev.f83cd08",
4
4
  "description": "Core utilities, services, and mixins for LUKSO web components and applications",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
@@ -108,6 +108,7 @@
108
108
  "dev-alt": "tsup --watch",
109
109
  "clean": "rm -rf dist",
110
110
  "test": "vitest",
111
- "test:run": "vitest run"
111
+ "test:run": "vitest run",
112
+ "check": "tsc --noEmit"
112
113
  }
113
114
  }
package/src/index.ts CHANGED
@@ -8,3 +8,5 @@
8
8
  export * from './mixins/index.js'
9
9
  export * from './services/index.js'
10
10
  export * from './utils/index.js'
11
+ // Release update
12
+ // build 2
@@ -4,7 +4,7 @@
4
4
  * Mixin to add device detection service to a Lit component
5
5
  */
6
6
 
7
- import { LitElement } from 'lit'
7
+ import type { LitElement } from 'lit'
8
8
  import type { DeviceService } from '../services/device.js'
9
9
  import { deviceService, type NavigatorExtended } from '../services/device.js'
10
10
 
@@ -5,7 +5,7 @@
5
5
  */
6
6
 
7
7
  import { effect } from '@preact/signals-core'
8
- import { LitElement } from 'lit'
8
+ import type { LitElement } from 'lit'
9
9
  import englishTranslations from '../../../translations/en_US.json'
10
10
  import {
11
11
  createIntlService,
@@ -61,13 +61,13 @@ export function withIntlService<T extends typeof LitElement>(Base: T): any {
61
61
  if (intl) {
62
62
  this.unsubscribeIntl = effect(() => {
63
63
  // Access the signal to track changes
64
- intl!.localeChanged.value
64
+ intl?.localeChanged.value
65
65
  this.requestUpdate()
66
66
  })
67
67
  }
68
68
 
69
69
  // Set fallback for missing translations
70
- intl?.setFallbackTranslations(englishTranslations)
70
+ intl?.setFallbackTranslations(englishTranslations as any)
71
71
  }
72
72
 
73
73
  disconnectedCallback(): void {
@@ -98,6 +98,17 @@ describe('Intl service', () => {
98
98
  const intl = createIntlService()
99
99
  expect(() => intl.formatMessage('missing_key')).not.toThrow()
100
100
  })
101
+
102
+ it('should handle dot notation keys', () => {
103
+ const messages = {
104
+ 'app.title': 'My Application',
105
+ }
106
+ const intl = createIntlService({
107
+ locale: 'en-US',
108
+ messages,
109
+ })
110
+ expect(intl.formatMessage('app.title')).toBe('My Application')
111
+ })
101
112
  })
102
113
 
103
114
  describe('formatNumber', () => {
@@ -136,7 +147,8 @@ describe('Intl service', () => {
136
147
 
137
148
  it('should use default maximum fraction digits of 18', () => {
138
149
  const intl = createIntlService({ locale: 'en-US', messages: {} })
139
- const result = intl.formatNumber(0.123456789012345678)
150
+ // biome-ignore lint/correctness/noPrecisionLoss: because of testing
151
+ const result = intl.formatNumber(0.123456789012345678123)
140
152
  expect(result).toBe('0.12345678901234568')
141
153
  })
142
154
  })
@@ -225,8 +237,24 @@ describe('Intl service', () => {
225
237
  expect(result).toBe('December 2, 2024')
226
238
  })
227
239
 
228
- it('should use predefined shortDateTime format when specified', () => {
229
- const intl = createIntlService({ locale: 'en-US', messages: {} })
240
+ it('can use custom format', () => {
241
+ const intl = createIntlService({
242
+ locale: 'en-US',
243
+ messages: {},
244
+ formats: {
245
+ date: {
246
+ shortDateTime: {
247
+ weekday: 'short', // Wed
248
+ month: 'short', // Dec
249
+ day: 'numeric', // 3
250
+ year: 'numeric', // 2025
251
+ hour: '2-digit', // 16
252
+ minute: '2-digit', // 07
253
+ hour12: false,
254
+ },
255
+ },
256
+ },
257
+ })
230
258
  const timestamp = 1733144400 // 2024-12-02T14:00:00Z
231
259
  const result = intl.formatTimestamp(timestamp, 'shortDateTime')
232
260
  expect(result).toBe('Mon, Dec 2, 2024, 13:00')
@@ -7,7 +7,7 @@
7
7
  export type { DeviceService, NavigatorExtended } from './device.js'
8
8
  export { deviceService } from './device.js'
9
9
 
10
- export type { IntlService } from './intl.js'
10
+ export type { IntlMessages, IntlService } from './intl.js'
11
11
  export {
12
12
  clearIntlService,
13
13
  createIntlService,
@@ -11,7 +11,11 @@ import {
11
11
  } from '@formatjs/intl'
12
12
  import { signal } from '@preact/signals-core'
13
13
 
14
- export type TimestampFormat = 'shortDateTime'
14
+ /**
15
+ * Translation messages object type
16
+ * Maps translation keys to their corresponding string values
17
+ */
18
+ export type IntlMessages = Record<string, string>
15
19
 
16
20
  /**
17
21
  * Default format number options
@@ -86,7 +90,7 @@ export interface IntlService {
86
90
  */
87
91
  formatTimestamp: (
88
92
  timestamp?: number | string,
89
- options?: TimestampFormat | Intl.DateTimeFormatOptions
93
+ options?: Intl.DateTimeFormatOptions | string
90
94
  ) => string
91
95
 
92
96
  /**
@@ -95,7 +99,7 @@ export interface IntlService {
95
99
  * @param locale - new locale code (e.g., 'en-US', 'de-DE')
96
100
  * @param messages - optional new messages object for the locale
97
101
  */
98
- setLocale: (locale: string, messages?: Record<string, string>) => void
102
+ setLocale: (locale: string, messages?: IntlMessages) => void
99
103
 
100
104
  /**
101
105
  * Get the current locale
@@ -116,7 +120,7 @@ export interface IntlService {
116
120
  * intl.setFallbackTranslations(defaultMessages);
117
121
  * ```
118
122
  */
119
- setFallbackTranslations: (fallbackMessages: Record<string, string>) => void
123
+ setFallbackTranslations: (fallbackMessages: IntlMessages) => void
120
124
 
121
125
  /**
122
126
  * Signal that tracks locale changes
@@ -131,19 +135,7 @@ export interface IntlService {
131
135
  export const defaultConfig: IntlConfig = {
132
136
  locale: 'en-US',
133
137
  messages: {},
134
- formats: {
135
- date: {
136
- shortDateTime: {
137
- weekday: 'short', // Wed
138
- month: 'short', // Dec
139
- day: 'numeric', // 3
140
- year: 'numeric', // 2025
141
- hour: '2-digit', // 16
142
- minute: '2-digit', // 07
143
- hour12: false,
144
- },
145
- },
146
- },
138
+ formats: {},
147
139
  }
148
140
 
149
141
  /**
@@ -181,7 +173,7 @@ export function createIntlService(
181
173
  let currentConfig = { ...defaultConfig, ...config }
182
174
  let intl = createIntl({ ...currentConfig, defaultLocale: 'en-US' })
183
175
  const localeChanged = signal(0)
184
- let fallbackMessages: Record<string, string> = {}
176
+ let fallbackMessages: IntlMessages = {}
185
177
 
186
178
  return {
187
179
  formatMessage: (key: string, options?: Record<string, string>): string => {
@@ -233,7 +225,7 @@ export function createIntlService(
233
225
 
234
226
  formatTimestamp: (
235
227
  timestamp?: number | string,
236
- options?: TimestampFormat | Intl.DateTimeFormatOptions
228
+ options?: Intl.DateTimeFormatOptions | string
237
229
  ): string => {
238
230
  if (!timestamp) return ''
239
231
 
@@ -246,7 +238,7 @@ export function createIntlService(
246
238
  // Handle predefined format
247
239
  if (typeof options === 'string') {
248
240
  const dateTimeOptions = currentConfig.formats?.date?.[
249
- options as TimestampFormat
241
+ options
250
242
  ] as Intl.DateTimeFormatOptions
251
243
 
252
244
  if (dateTimeOptions) {
@@ -264,7 +256,7 @@ export function createIntlService(
264
256
  return intl.formatDate(date, options) || ''
265
257
  },
266
258
 
267
- setLocale: (locale: string, messages?: Record<string, string>): void => {
259
+ setLocale: (locale: string, messages?: IntlMessages): void => {
268
260
  currentConfig = {
269
261
  ...currentConfig,
270
262
  locale,
@@ -281,9 +273,7 @@ export function createIntlService(
281
273
  return currentConfig.locale
282
274
  },
283
275
 
284
- setFallbackTranslations: (
285
- fallbackMessagesInput: Record<string, string>
286
- ): void => {
276
+ setFallbackTranslations: (fallbackMessagesInput: IntlMessages): void => {
287
277
  fallbackMessages = fallbackMessagesInput
288
278
  },
289
279
 
@@ -1,4 +1,4 @@
1
- import { describe, expect, it, vi } from 'vitest'
1
+ import { describe, expect, it } from 'vitest'
2
2
  import type { BrowserInfo, BrowserName } from '../browserInfo'
3
3
  import { browserInfo, EXTENSION_STORE_LINKS } from '../browserInfo'
4
4
 
@@ -1,4 +1,4 @@
1
- import { DeviceService, deviceService } from '../services'
1
+ import type { DeviceService } from '../services'
2
2
 
3
3
  export type BrowserName =
4
4
  | 'chrome'
@@ -1 +0,0 @@
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 { 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 * 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 */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withIntlService<T extends typeof LitElement>(Base: T): any {\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)\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return Mixin as any\n}\n","{\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,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;;;AD6BO,SAAS,gBAA6C,MAAc;AAAA,EAEzE,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,eAAM,cAAc;AACpB,eAAK,cAAc;AAAA,QACrB,CAAC;AAAA,MACH;AAGA,YAAM,wBAAwB,aAAmB;AAAA,IACnD;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;AAGA,SAAO;AACT;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/mixins/device.ts"],"sourcesContent":["/**\n * Device Detection Mixin\n *\n * Mixin to add device detection service to a Lit component\n */\n\nimport { LitElement } from 'lit'\nimport type { DeviceService } from '../services/device.js'\nimport { deviceService, type NavigatorExtended } from '../services/device.js'\n\n/**\n * Mixin to add device detection service to a Lit component\n *\n * Provides a `device` property with device/OS/browser detection capabilities.\n * The device service is initialized in connectedCallback and follows component lifecycle.\n *\n * @typeParam T - The Lit component class being extended\n * @returns Extended class with device detection capabilities\n *\n * @example\n * ```typescript\n * import { LitElement } from 'lit';\n * import { customElement } from 'lit/decorators.js';\n * import { withDeviceService } from '@lukso/core/mixins';\n *\n * @customElement('my-component')\n * export class MyComponent extends withDeviceService(LitElement) {\n * render() {\n * return html\\`Device is mobile: \\${this.device?.isMobile}\\`;\n * }\n * }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withDeviceService<T extends typeof LitElement>(Base: T): any {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n class Mixin extends (Base as any) {\n device: DeviceService | undefined\n\n connectedCallback(): void {\n super.connectedCallback()\n this.device = deviceService(navigator as NavigatorExtended)\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return Mixin as any\n}\n"],"mappings":";;;;;AAkCO,SAAS,kBAA+C,MAAc;AAAA,EAE3E,MAAM,cAAe,KAAa;AAAA,IAGhC,oBAA0B;AACxB,YAAM,kBAAkB;AACxB,WAAK,SAAS,cAAc,SAA8B;AAAA,IAC5D;AAAA,EACF;AAGA,SAAO;AACT;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-FVO474U6.cjs","../src/utils/browserInfo.ts","../src/utils/slug.ts"],"names":["browserInfo"],"mappings":"AAAA;ACkBO,IAAM,sBAAA,EAAwB;AAAA,EACnC,MAAA,EACE,sGAAA;AAAA,EACF,KAAA,EACE,sGAAA;AAAA,EACF,IAAA,EAAM,sGAAA;AAAA,EACN,KAAA,EAAO,EAAA;AAAA,EACP,MAAA,EAAQ,EAAA;AAAA,EACR,OAAA,EAAS;AACX,CAAA;AAKO,IAAM,YAAA,EAAc,CAAC,aAAA,EAAA,GAA8C;AACxE,EAAA,MAAM,oBAAA,EAAsB;AAAA,IAC1B,EAAA,EAAI,QAAA;AAAA,IACJ,IAAA,EAAM,EAAA;AAAA,IACN,IAAA,EAAM;AAAA,EACR,CAAA;AAEA,EAAA,MAAM,cAAA,EAAgB,CAAA,EAAA,GAA+B;AACnD,IAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,MAAA,EAAQ,QAAQ,EAAA,EAC9D,aAAA;AAEF,IAAA,GAAA,CAAI,OAAA,EAAS;AACX,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,OAAA;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,YAAA;AAAA,QACN,SAAA,EAAW,qBAAA,CAAsB;AAAA,MACnC,CAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,MAAA,EAAQ;AACV,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,MAAA;AAAA,QACJ,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,SAAA,EAAW,qBAAA,CAAsB;AAAA,MACnC,CAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,OAAA,EAAS;AACX,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,OAAA;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,YAAA;AAAA,QACN,SAAA,EAAW,qBAAA,CAAsB;AAAA,MACnC,CAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,QAAA,EAAU;AACZ,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,QAAA;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,aAAA;AAAA,QACN,SAAA,EAAW,qBAAA,CAAsB;AAAA,MACnC,CAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,SAAA,EAAW;AACb,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,SAAA;AAAA,QACJ,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM,cAAA;AAAA,QACN,SAAA,EAAW,qBAAA,CAAsB;AAAA,MACnC,CAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,QAAA,EAAU;AACZ,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,QAAA;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,aAAA;AAAA,QACN,SAAA,EAAW,qBAAA,CAAsB;AAAA,MACnC,CAAA;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAMA,aAAAA,EAAc,EAAE,GAAG,mBAAA,EAAqB,GAAG,aAAA,CAAc,EAAE,CAAA;AAEjE,EAAA,OAAOA,YAAAA;AACT,CAAA;ADhCA;AACA;AEhEO,IAAM,KAAA,EAAO,CAAC,KAAA,EAAA,GAAmB;AACtC,EAAA,GAAA,CAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA,CAAM,WAAA,CAAY,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AAChD,CAAA;AFiEA;AACA;AACE;AACA;AACA;AACF,8GAAC","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-FVO474U6.cjs","sourcesContent":[null,"import { DeviceService, 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 * 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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-R77UDCWD.cjs","../src/mixins/device.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;AC8BO,SAAS,iBAAA,CAA+C,IAAA,EAAc;AAAA,EAE3E,MAAM,MAAA,QAAe,KAAa;AAAA,IAGhC,iBAAA,CAAA,EAA0B;AACxB,MAAA,KAAA,CAAM,iBAAA,CAAkB,CAAA;AACxB,MAAA,IAAA,CAAK,OAAA,EAAS,6CAAA,SAA4C,CAAA;AAAA,IAC5D;AAAA,EACF;AAGA,EAAA,OAAO,KAAA;AACT;ADjCA;AACA;AACE;AACF,8CAAC","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-R77UDCWD.cjs","sourcesContent":[null,"/**\n * Device Detection Mixin\n *\n * Mixin to add device detection service to a Lit component\n */\n\nimport { LitElement } from 'lit'\nimport type { DeviceService } from '../services/device.js'\nimport { deviceService, type NavigatorExtended } from '../services/device.js'\n\n/**\n * Mixin to add device detection service to a Lit component\n *\n * Provides a `device` property with device/OS/browser detection capabilities.\n * The device service is initialized in connectedCallback and follows component lifecycle.\n *\n * @typeParam T - The Lit component class being extended\n * @returns Extended class with device detection capabilities\n *\n * @example\n * ```typescript\n * import { LitElement } from 'lit';\n * import { customElement } from 'lit/decorators.js';\n * import { withDeviceService } from '@lukso/core/mixins';\n *\n * @customElement('my-component')\n * export class MyComponent extends withDeviceService(LitElement) {\n * render() {\n * return html\\`Device is mobile: \\${this.device?.isMobile}\\`;\n * }\n * }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withDeviceService<T extends typeof LitElement>(Base: T): any {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n class Mixin extends (Base as any) {\n device: DeviceService | undefined\n\n connectedCallback(): void {\n super.connectedCallback()\n this.device = deviceService(navigator as NavigatorExtended)\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return Mixin as any\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/services/intl.ts"],"sourcesContent":["/**\n * Internationalization Service\n *\n * Provides locale-aware formatting for messages, numbers, dates, and times.\n */\n\nimport {\n createIntl,\n type FormatNumberOptions,\n type IntlConfig,\n} from '@formatjs/intl'\nimport { signal } from '@preact/signals-core'\n\nexport type TimestampFormat = 'shortDateTime'\n\n/**\n * Default format number options\n * @see https://github.com/formatjs/formatjs/blob/main/packages/ecma402-abstract/types/number.ts\n */\nconst formatNumberDefaultOptions = {\n maximumFractionDigits: 18,\n}\n\n/**\n * Intl service interface\n */\nexport interface IntlService {\n /**\n * Translate a string based on the key\n *\n * @param key - translation key\n * @param options - optional options for formatMessage (for variable interpolation)\n * @returns - translated string\n */\n formatMessage: (key: string, options?: Record<string, string>) => string\n\n /**\n * Number formatting based on the locale\n *\n * @param value - number to format\n * @param options - options for formatNumber\n * @returns - formatted number\n */\n formatNumber: (\n value: number | string | bigint,\n options?: FormatNumberOptions\n ) => string\n\n /**\n * Date formatting based on the locale\n *\n * @param date - date to format\n * @returns - formatted date\n */\n formatDate: (date?: string | number | Date) => string | undefined\n\n /**\n * Time formatting based on the locale\n *\n * @param date - date to format\n * @returns - formatted time\n */\n formatTime: (date?: string | number | Date) => string | undefined\n\n /**\n * Timestamp formatting based on the locale\n *\n * @param timestamp - UNIX timestamp in seconds or milliseconds\n * @param options - formatting options (predefined format name or custom Intl.DateTimeFormat options)\n * @returns - formatted date & time string\n *\n * @example\n * ```typescript\n * const intl = getIntlService();\n *\n * // Use predefined shortDateTime format\n * intl.formatTimestamp(1733251200, 'shortDateTime'); // \"Wed, Dec 3, 2025, 16:07\"\n *\n * // Use custom format options\n * intl.formatTimestamp(1733251200, { year: '2-digit', month: '2-digit', day: '2-digit' });\n * // \"12/03/25\"\n *\n * // No options (basic format)\n * intl.formatTimestamp(1733251200);\n * ```\n */\n formatTimestamp: (\n timestamp?: number | string,\n options?: TimestampFormat | Intl.DateTimeFormatOptions\n ) => string\n\n /**\n * Change the locale and optionally update messages\n *\n * @param locale - new locale code (e.g., 'en-US', 'de-DE')\n * @param messages - optional new messages object for the locale\n */\n setLocale: (locale: string, messages?: Record<string, string>) => void\n\n /**\n * Get the current locale\n *\n * @returns - current locale code (e.g., 'en-US', 'de-DE')\n */\n getLocale: () => string\n\n /**\n * Set fallback translations to use when a translation key is missing\n * Useful when the host app's intl service doesn't have all translations\n *\n * @param fallbackMessages - translations to use as fallback\n *\n * @example\n * ```typescript\n * // After intl service is initialized by host app\n * intl.setFallbackTranslations(defaultMessages);\n * ```\n */\n setFallbackTranslations: (fallbackMessages: Record<string, string>) => void\n\n /**\n * Signal that tracks locale changes\n * Use this signal to reactively update UI when locale changes\n */\n localeChanged: { value: number }\n}\n\n/**\n * Default configuration for intl\n */\nexport const defaultConfig: IntlConfig = {\n locale: 'en-US',\n messages: {},\n formats: {\n date: {\n shortDateTime: {\n weekday: 'short', // Wed\n month: 'short', // Dec\n day: 'numeric', // 3\n year: 'numeric', // 2025\n hour: '2-digit', // 16\n minute: '2-digit', // 07\n hour12: false,\n },\n },\n },\n}\n\n/**\n * Global intl service instance\n */\nlet intlService: IntlService | null = null\n\n/**\n * Create a new intl service instance\n *\n * @param config - intl configuration with locale and messages\n * @returns IntlService instance with formatting methods\n *\n * @example\n * ```typescript\n * import { createIntlService } from '@lukso/core/services/intl';\n *\n * const intl = createIntlService({\n * locale: 'en-US',\n * messages: customMessages,\n * });\n *\n * const translated = intl.formatMessage('app.title');\n * const formatted = intl.formatNumber(1234.56);\n * const currentLocale = intl.getLocale(); // 'en-US'\n *\n * // Change locale\n * intl.setLocale('de-DE', germanMessages);\n * console.log(intl.getLocale()); // 'de-DE'\n * ```\n */\nexport function createIntlService(\n config: IntlConfig = defaultConfig\n): IntlService {\n let currentConfig = { ...defaultConfig, ...config }\n let intl = createIntl({ ...currentConfig, defaultLocale: 'en-US' })\n const localeChanged = signal(0)\n let fallbackMessages: Record<string, string> = {}\n\n return {\n formatMessage: (key: string, options?: Record<string, string>): string => {\n try {\n const result = intl.formatMessage({ id: key }, options)\n\n if (result && result !== key) {\n return result\n }\n\n // If no translation found, check fallback\n if (fallbackMessages[key]) {\n return fallbackMessages[key]\n }\n\n return key\n } catch {\n // On error, try fallback\n return fallbackMessages[key] || key\n }\n },\n\n formatNumber: (\n value: number | string | bigint,\n options: FormatNumberOptions = {}\n ): string => {\n if (value === null || value === undefined) {\n return '0'\n }\n\n const _value =\n typeof value === 'string' ? Number.parseFloat(value) : value\n\n const mergedOptions = {\n ...formatNumberDefaultOptions,\n ...options,\n }\n\n return intl.formatNumber(_value as number, mergedOptions) || ''\n },\n\n formatDate: (date?: string | number | Date): string => {\n return intl.formatDate(date)\n },\n\n formatTime: (date?: string | number | Date): string => {\n return intl.formatTime(date)\n },\n\n formatTimestamp: (\n timestamp?: number | string,\n options?: TimestampFormat | Intl.DateTimeFormatOptions\n ): string => {\n if (!timestamp) return ''\n\n const time = typeof timestamp === 'string' ? Number(timestamp) : timestamp\n const date =\n time < 10_000_000_000\n ? new Date(time * 1000) // seconds\n : new Date(time) // milliseconds\n\n // Handle predefined format\n if (typeof options === 'string') {\n const dateTimeOptions = currentConfig.formats?.date?.[\n options as TimestampFormat\n ] as Intl.DateTimeFormatOptions\n\n if (dateTimeOptions) {\n return new Intl.DateTimeFormat(\n currentConfig.locale,\n dateTimeOptions\n ).format(date)\n }\n\n // Fallback to default format if predefined format not found\n return intl.formatDate(date) || ''\n }\n\n // For normal @formatjs/intl options\n return intl.formatDate(date, options) || ''\n },\n\n setLocale: (locale: string, messages?: Record<string, string>): void => {\n currentConfig = {\n ...currentConfig,\n locale,\n messages: messages || currentConfig.messages,\n }\n intl = createIntl({\n ...currentConfig,\n defaultLocale: 'en-US',\n })\n localeChanged.value += 1\n },\n\n getLocale: (): string => {\n return currentConfig.locale\n },\n\n setFallbackTranslations: (\n fallbackMessagesInput: Record<string, string>\n ): void => {\n fallbackMessages = fallbackMessagesInput\n },\n\n localeChanged,\n }\n}\n\n/**\n * Set the global intl service\n * Call this once from your app initialization\n *\n * @param service - IntlService instance\n *\n * @example\n * ```typescript\n * import { setIntlService, createIntlService } from '@lukso/core/services/intl';\n *\n * const intl = createIntlService(config);\n * setIntlService(intl);\n * ```\n */\nexport function setIntlService(service: IntlService): void {\n intlService = service\n}\n\n/**\n * Get the current global intl service\n * Returns null if no service has been set\n *\n * @example\n * ```typescript\n * import { getIntlService } from '@lukso/core/services/intl';\n *\n * const intl = getIntlService();\n * if (intl) {\n * console.log(intl.getLocale());\n * }\n * ```\n */\nexport function getIntlService(): IntlService | null {\n return intlService\n}\n\n/**\n * Clear the global intl service\n * Useful for testing or cleanup\n */\nexport function clearIntlService(): void {\n intlService = null\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/browserInfo.ts","../src/utils/slug.ts"],"sourcesContent":["import { DeviceService, 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 * 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"],"mappings":";AAkBO,IAAM,wBAAwB;AAAA,EACnC,QACE;AAAA,EACF,OACE;AAAA,EACF,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AACX;AAKO,IAAM,cAAc,CAAC,kBAA8C;AACxE,QAAM,sBAAsB;AAAA,IAC1B,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,QAAM,gBAAgB,MAA+B;AACnD,UAAM,EAAE,UAAU,SAAS,WAAW,UAAU,QAAQ,QAAQ,IAC9D;AAEF,QAAI,SAAS;AACX,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,sBAAsB;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,QAAQ;AACV,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,sBAAsB;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,SAAS;AACX,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,sBAAsB;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,UAAU;AACZ,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,sBAAsB;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,WAAW;AACb,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,sBAAsB;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,UAAU;AACZ,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,sBAAsB;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,QAAMA,eAAc,EAAE,GAAG,qBAAqB,GAAG,cAAc,EAAE;AAEjE,SAAOA;AACT;;;AC/FO,IAAM,OAAO,CAAC,UAAmB;AACtC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,YAAY,EAAE,QAAQ,QAAQ,GAAG;AAChD;","names":["browserInfo"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-WZIEEMOM.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,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;AAC7C,CAAA;AFYA;AACA;ACgBO,SAAS,eAAA,CAA6C,IAAA,EAAc;AAAA,EAEzE,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,UAAA,IAAA,CAAM,aAAA,CAAc,KAAA;AACpB,UAAA,IAAA,CAAK,aAAA,CAAc,CAAA;AAAA,QACrB,CAAC,CAAA;AAAA,MACH;AAGA,sBAAA,IAAA,2BAAM,uBAAA,mBAAwB,aAAmB,GAAA;AAAA,IACnD;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;AAGA,EAAA,OAAO,KAAA;AACT;AD7BA;AACA;AACE;AACF,0CAAC","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-WZIEEMOM.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 { 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 * 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 */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withIntlService<T extends typeof LitElement>(Base: T): any {\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)\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return Mixin as any\n}\n","{\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}"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-XOL2VVVB.cjs","../src/services/intl.ts"],"names":[],"mappings":"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","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-XOL2VVVB.cjs","sourcesContent":[null,"/**\n * Internationalization Service\n *\n * Provides locale-aware formatting for messages, numbers, dates, and times.\n */\n\nimport {\n createIntl,\n type FormatNumberOptions,\n type IntlConfig,\n} from '@formatjs/intl'\nimport { signal } from '@preact/signals-core'\n\nexport type TimestampFormat = 'shortDateTime'\n\n/**\n * Default format number options\n * @see https://github.com/formatjs/formatjs/blob/main/packages/ecma402-abstract/types/number.ts\n */\nconst formatNumberDefaultOptions = {\n maximumFractionDigits: 18,\n}\n\n/**\n * Intl service interface\n */\nexport interface IntlService {\n /**\n * Translate a string based on the key\n *\n * @param key - translation key\n * @param options - optional options for formatMessage (for variable interpolation)\n * @returns - translated string\n */\n formatMessage: (key: string, options?: Record<string, string>) => string\n\n /**\n * Number formatting based on the locale\n *\n * @param value - number to format\n * @param options - options for formatNumber\n * @returns - formatted number\n */\n formatNumber: (\n value: number | string | bigint,\n options?: FormatNumberOptions\n ) => string\n\n /**\n * Date formatting based on the locale\n *\n * @param date - date to format\n * @returns - formatted date\n */\n formatDate: (date?: string | number | Date) => string | undefined\n\n /**\n * Time formatting based on the locale\n *\n * @param date - date to format\n * @returns - formatted time\n */\n formatTime: (date?: string | number | Date) => string | undefined\n\n /**\n * Timestamp formatting based on the locale\n *\n * @param timestamp - UNIX timestamp in seconds or milliseconds\n * @param options - formatting options (predefined format name or custom Intl.DateTimeFormat options)\n * @returns - formatted date & time string\n *\n * @example\n * ```typescript\n * const intl = getIntlService();\n *\n * // Use predefined shortDateTime format\n * intl.formatTimestamp(1733251200, 'shortDateTime'); // \"Wed, Dec 3, 2025, 16:07\"\n *\n * // Use custom format options\n * intl.formatTimestamp(1733251200, { year: '2-digit', month: '2-digit', day: '2-digit' });\n * // \"12/03/25\"\n *\n * // No options (basic format)\n * intl.formatTimestamp(1733251200);\n * ```\n */\n formatTimestamp: (\n timestamp?: number | string,\n options?: TimestampFormat | Intl.DateTimeFormatOptions\n ) => string\n\n /**\n * Change the locale and optionally update messages\n *\n * @param locale - new locale code (e.g., 'en-US', 'de-DE')\n * @param messages - optional new messages object for the locale\n */\n setLocale: (locale: string, messages?: Record<string, string>) => void\n\n /**\n * Get the current locale\n *\n * @returns - current locale code (e.g., 'en-US', 'de-DE')\n */\n getLocale: () => string\n\n /**\n * Set fallback translations to use when a translation key is missing\n * Useful when the host app's intl service doesn't have all translations\n *\n * @param fallbackMessages - translations to use as fallback\n *\n * @example\n * ```typescript\n * // After intl service is initialized by host app\n * intl.setFallbackTranslations(defaultMessages);\n * ```\n */\n setFallbackTranslations: (fallbackMessages: Record<string, string>) => void\n\n /**\n * Signal that tracks locale changes\n * Use this signal to reactively update UI when locale changes\n */\n localeChanged: { value: number }\n}\n\n/**\n * Default configuration for intl\n */\nexport const defaultConfig: IntlConfig = {\n locale: 'en-US',\n messages: {},\n formats: {\n date: {\n shortDateTime: {\n weekday: 'short', // Wed\n month: 'short', // Dec\n day: 'numeric', // 3\n year: 'numeric', // 2025\n hour: '2-digit', // 16\n minute: '2-digit', // 07\n hour12: false,\n },\n },\n },\n}\n\n/**\n * Global intl service instance\n */\nlet intlService: IntlService | null = null\n\n/**\n * Create a new intl service instance\n *\n * @param config - intl configuration with locale and messages\n * @returns IntlService instance with formatting methods\n *\n * @example\n * ```typescript\n * import { createIntlService } from '@lukso/core/services/intl';\n *\n * const intl = createIntlService({\n * locale: 'en-US',\n * messages: customMessages,\n * });\n *\n * const translated = intl.formatMessage('app.title');\n * const formatted = intl.formatNumber(1234.56);\n * const currentLocale = intl.getLocale(); // 'en-US'\n *\n * // Change locale\n * intl.setLocale('de-DE', germanMessages);\n * console.log(intl.getLocale()); // 'de-DE'\n * ```\n */\nexport function createIntlService(\n config: IntlConfig = defaultConfig\n): IntlService {\n let currentConfig = { ...defaultConfig, ...config }\n let intl = createIntl({ ...currentConfig, defaultLocale: 'en-US' })\n const localeChanged = signal(0)\n let fallbackMessages: Record<string, string> = {}\n\n return {\n formatMessage: (key: string, options?: Record<string, string>): string => {\n try {\n const result = intl.formatMessage({ id: key }, options)\n\n if (result && result !== key) {\n return result\n }\n\n // If no translation found, check fallback\n if (fallbackMessages[key]) {\n return fallbackMessages[key]\n }\n\n return key\n } catch {\n // On error, try fallback\n return fallbackMessages[key] || key\n }\n },\n\n formatNumber: (\n value: number | string | bigint,\n options: FormatNumberOptions = {}\n ): string => {\n if (value === null || value === undefined) {\n return '0'\n }\n\n const _value =\n typeof value === 'string' ? Number.parseFloat(value) : value\n\n const mergedOptions = {\n ...formatNumberDefaultOptions,\n ...options,\n }\n\n return intl.formatNumber(_value as number, mergedOptions) || ''\n },\n\n formatDate: (date?: string | number | Date): string => {\n return intl.formatDate(date)\n },\n\n formatTime: (date?: string | number | Date): string => {\n return intl.formatTime(date)\n },\n\n formatTimestamp: (\n timestamp?: number | string,\n options?: TimestampFormat | Intl.DateTimeFormatOptions\n ): string => {\n if (!timestamp) return ''\n\n const time = typeof timestamp === 'string' ? Number(timestamp) : timestamp\n const date =\n time < 10_000_000_000\n ? new Date(time * 1000) // seconds\n : new Date(time) // milliseconds\n\n // Handle predefined format\n if (typeof options === 'string') {\n const dateTimeOptions = currentConfig.formats?.date?.[\n options as TimestampFormat\n ] as Intl.DateTimeFormatOptions\n\n if (dateTimeOptions) {\n return new Intl.DateTimeFormat(\n currentConfig.locale,\n dateTimeOptions\n ).format(date)\n }\n\n // Fallback to default format if predefined format not found\n return intl.formatDate(date) || ''\n }\n\n // For normal @formatjs/intl options\n return intl.formatDate(date, options) || ''\n },\n\n setLocale: (locale: string, messages?: Record<string, string>): void => {\n currentConfig = {\n ...currentConfig,\n locale,\n messages: messages || currentConfig.messages,\n }\n intl = createIntl({\n ...currentConfig,\n defaultLocale: 'en-US',\n })\n localeChanged.value += 1\n },\n\n getLocale: (): string => {\n return currentConfig.locale\n },\n\n setFallbackTranslations: (\n fallbackMessagesInput: Record<string, string>\n ): void => {\n fallbackMessages = fallbackMessagesInput\n },\n\n localeChanged,\n }\n}\n\n/**\n * Set the global intl service\n * Call this once from your app initialization\n *\n * @param service - IntlService instance\n *\n * @example\n * ```typescript\n * import { setIntlService, createIntlService } from '@lukso/core/services/intl';\n *\n * const intl = createIntlService(config);\n * setIntlService(intl);\n * ```\n */\nexport function setIntlService(service: IntlService): void {\n intlService = service\n}\n\n/**\n * Get the current global intl service\n * Returns null if no service has been set\n *\n * @example\n * ```typescript\n * import { getIntlService } from '@lukso/core/services/intl';\n *\n * const intl = getIntlService();\n * if (intl) {\n * console.log(intl.getLocale());\n * }\n * ```\n */\nexport function getIntlService(): IntlService | null {\n return intlService\n}\n\n/**\n * Clear the global intl service\n * Useful for testing or cleanup\n */\nexport function clearIntlService(): void {\n intlService = null\n}\n"]}