@lukso/core 0.1.0-dev.95d5a55 → 0.1.0-dev.a8c9315
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-SV4TVR2K.js → chunk-25O35V5J.js} +3 -3
- package/dist/chunk-25O35V5J.js.map +1 -0
- package/dist/{chunk-FR74YPGJ.cjs → chunk-75FLRXXN.cjs} +10 -10
- package/dist/chunk-75FLRXXN.cjs.map +1 -0
- package/dist/{chunk-3WGYJTN4.js → chunk-7ESVFJO6.js} +1 -1
- package/dist/chunk-7ESVFJO6.js.map +1 -0
- package/dist/{chunk-4TNWG4ME.js → chunk-BAVNEYR7.js} +4 -15
- package/dist/chunk-BAVNEYR7.js.map +1 -0
- package/dist/{chunk-MBIRTPNM.cjs → chunk-FVO474U6.cjs} +1 -1
- package/dist/chunk-FVO474U6.cjs.map +1 -0
- package/dist/{chunk-CC3LFUYY.cjs → chunk-R77UDCWD.cjs} +1 -1
- package/dist/chunk-R77UDCWD.cjs.map +1 -0
- package/dist/{chunk-DKXHVRHM.js → chunk-U2BBWX4F.js} +1 -1
- package/dist/chunk-U2BBWX4F.js.map +1 -0
- package/dist/{chunk-RM42NG7E.cjs → chunk-UOLYOGEV.cjs} +5 -16
- package/dist/chunk-UOLYOGEV.cjs.map +1 -0
- package/dist/index.cjs +5 -5
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4 -4
- package/dist/mixins/device.cjs +2 -2
- package/dist/mixins/device.js +1 -1
- package/dist/mixins/index.cjs +4 -4
- package/dist/mixins/index.js +3 -3
- package/dist/mixins/intl.cjs +3 -3
- package/dist/mixins/intl.js +2 -2
- package/dist/services/index.cjs +2 -2
- package/dist/services/index.d.cts +1 -1
- package/dist/services/index.d.ts +1 -1
- package/dist/services/index.js +1 -1
- package/dist/services/intl.cjs +2 -2
- package/dist/services/intl.d.cts +5 -25
- package/dist/services/intl.d.ts +5 -25
- package/dist/services/intl.js +1 -1
- package/dist/utils/index.cjs +2 -2
- package/dist/utils/index.js +1 -1
- package/package.json +2 -3
- package/src/mixins/device.ts +1 -1
- package/src/mixins/intl.ts +3 -3
- package/src/services/__tests__/intl.spec.ts +1 -37
- package/src/services/index.ts +1 -1
- package/src/services/intl.ts +12 -53
- package/src/utils/__tests__/browserInfo.spec.ts +1 -1
- package/src/utils/browserInfo.ts +1 -1
- package/dist/chunk-3WGYJTN4.js.map +0 -1
- package/dist/chunk-4TNWG4ME.js.map +0 -1
- package/dist/chunk-CC3LFUYY.cjs.map +0 -1
- package/dist/chunk-DKXHVRHM.js.map +0 -1
- package/dist/chunk-FR74YPGJ.cjs.map +0 -1
- package/dist/chunk-MBIRTPNM.cjs.map +0 -1
- package/dist/chunk-RM42NG7E.cjs.map +0 -1
- package/dist/chunk-SV4TVR2K.js.map +0 -1
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
defaultConfig,
|
|
4
4
|
getIntlService,
|
|
5
5
|
setIntlService
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-BAVNEYR7.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
|
|
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-
|
|
87
|
+
//# sourceMappingURL=chunk-25O35V5J.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 { 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":[]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkUOLYOGEVcjs = require('./chunk-UOLYOGEV.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 =
|
|
38
|
+
let intl = _chunkUOLYOGEVcjs.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
|
-
|
|
44
|
+
intl.localeChanged.value;
|
|
45
45
|
this.requestUpdate();
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
|
-
_optionalChain([intl, 'optionalAccess',
|
|
48
|
+
_optionalChain([intl, 'optionalAccess', _ => _.setFallbackTranslations, 'call', _2 => _2(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 =
|
|
62
|
-
Object.assign(
|
|
61
|
+
const intlService = _chunkUOLYOGEVcjs.createIntlService.call(void 0,
|
|
62
|
+
Object.assign(_chunkUOLYOGEVcjs.defaultConfig, {
|
|
63
63
|
messages: en_US_default
|
|
64
64
|
})
|
|
65
65
|
);
|
|
66
|
-
|
|
66
|
+
_chunkUOLYOGEVcjs.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 =
|
|
78
|
-
return _nullishCoalesce(_optionalChain([intl, 'optionalAccess',
|
|
77
|
+
const intl = _chunkUOLYOGEVcjs.getIntlService.call(void 0, );
|
|
78
|
+
return _nullishCoalesce(_optionalChain([intl, 'optionalAccess', _3 => _3.formatMessage, 'call', _4 => _4(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-
|
|
87
|
+
//# sourceMappingURL=chunk-75FLRXXN.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-75FLRXXN.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-75FLRXXN.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}"]}
|
|
@@ -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 { 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":[]}
|
|
@@ -8,12 +8,11 @@ var formatNumberDefaultOptions = {
|
|
|
8
8
|
};
|
|
9
9
|
var defaultConfig = {
|
|
10
10
|
locale: "en-US",
|
|
11
|
-
messages: {}
|
|
12
|
-
formats: {}
|
|
11
|
+
messages: {}
|
|
13
12
|
};
|
|
14
13
|
var intlService = null;
|
|
15
14
|
function createIntlService(config = defaultConfig) {
|
|
16
|
-
let currentConfig =
|
|
15
|
+
let currentConfig = config;
|
|
17
16
|
let intl = createIntl({ ...currentConfig, defaultLocale: "en-US" });
|
|
18
17
|
const localeChanged = signal(0);
|
|
19
18
|
let fallbackMessages = {};
|
|
@@ -52,17 +51,7 @@ function createIntlService(config = defaultConfig) {
|
|
|
52
51
|
formatTimestamp: (timestamp, options) => {
|
|
53
52
|
if (!timestamp) return "";
|
|
54
53
|
const time = typeof timestamp === "string" ? Number(timestamp) : timestamp;
|
|
55
|
-
const date =
|
|
56
|
-
if (typeof options === "string") {
|
|
57
|
-
const dateTimeOptions = currentConfig.formats?.date?.[options];
|
|
58
|
-
if (dateTimeOptions) {
|
|
59
|
-
return new Intl.DateTimeFormat(
|
|
60
|
-
currentConfig.locale,
|
|
61
|
-
dateTimeOptions
|
|
62
|
-
).format(date);
|
|
63
|
-
}
|
|
64
|
-
return intl.formatDate(date) || "";
|
|
65
|
-
}
|
|
54
|
+
const date = new Date(time * 1e3);
|
|
66
55
|
return intl.formatDate(date, options) || "";
|
|
67
56
|
},
|
|
68
57
|
setLocale: (locale, messages) => {
|
|
@@ -103,4 +92,4 @@ export {
|
|
|
103
92
|
getIntlService,
|
|
104
93
|
clearIntlService
|
|
105
94
|
};
|
|
106
|
-
//# sourceMappingURL=chunk-
|
|
95
|
+
//# sourceMappingURL=chunk-BAVNEYR7.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 * 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 - optional Intl.DateTimeFormat options\n * @returns - formatted date & time string\n */\n formatTimestamp: (\n timestamp?: number | string,\n options?: 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}\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 = 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?: Intl.DateTimeFormatOptions\n ): string => {\n if (!timestamp) return ''\n\n const time = typeof timestamp === 'string' ? Number(timestamp) : timestamp\n const date = new Date(time * 1000)\n\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":";AAMA;AAAA,EACE;AAAA,OAGK;AACP,SAAS,cAAc;AAMvB,IAAM,6BAA6B;AAAA,EACjC,uBAAuB;AACzB;AA8FO,IAAM,gBAA4B;AAAA,EACvC,QAAQ;AAAA,EACR,UAAU,CAAC;AACb;AAKA,IAAI,cAAkC;AA0B/B,SAAS,kBACd,SAAqB,eACR;AACb,MAAI,gBAAgB;AACpB,MAAI,OAAO,WAAW,EAAE,GAAG,eAAe,eAAe,QAAQ,CAAC;AAClE,QAAM,gBAAgB,OAAO,CAAC;AAC9B,MAAI,mBAA2C,CAAC;AAEhD,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,OAAO,IAAI,KAAK,OAAO,GAAI;AAEjC,aAAO,KAAK,WAAW,MAAM,OAAO,KAAK;AAAA,IAC3C;AAAA,IAEA,WAAW,CAAC,QAAgB,aAA4C;AACtE,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,CACvB,0BACS;AACT,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":[]}
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
|
@@ -0,0 +1 @@
|
|
|
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,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true})
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/services/intl.ts
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
var _intl = require('@formatjs/intl');
|
|
@@ -8,12 +8,11 @@ var formatNumberDefaultOptions = {
|
|
|
8
8
|
};
|
|
9
9
|
var defaultConfig = {
|
|
10
10
|
locale: "en-US",
|
|
11
|
-
messages: {}
|
|
12
|
-
formats: {}
|
|
11
|
+
messages: {}
|
|
13
12
|
};
|
|
14
13
|
var intlService = null;
|
|
15
14
|
function createIntlService(config = defaultConfig) {
|
|
16
|
-
let currentConfig =
|
|
15
|
+
let currentConfig = config;
|
|
17
16
|
let intl = _intl.createIntl.call(void 0, { ...currentConfig, defaultLocale: "en-US" });
|
|
18
17
|
const localeChanged = _signalscore.signal.call(void 0, 0);
|
|
19
18
|
let fallbackMessages = {};
|
|
@@ -52,17 +51,7 @@ function createIntlService(config = defaultConfig) {
|
|
|
52
51
|
formatTimestamp: (timestamp, options) => {
|
|
53
52
|
if (!timestamp) return "";
|
|
54
53
|
const time = typeof timestamp === "string" ? Number(timestamp) : timestamp;
|
|
55
|
-
const date =
|
|
56
|
-
if (typeof options === "string") {
|
|
57
|
-
const dateTimeOptions = _optionalChain([currentConfig, 'access', _ => _.formats, 'optionalAccess', _2 => _2.date, 'optionalAccess', _3 => _3[options]]);
|
|
58
|
-
if (dateTimeOptions) {
|
|
59
|
-
return new Intl.DateTimeFormat(
|
|
60
|
-
currentConfig.locale,
|
|
61
|
-
dateTimeOptions
|
|
62
|
-
).format(date);
|
|
63
|
-
}
|
|
64
|
-
return intl.formatDate(date) || "";
|
|
65
|
-
}
|
|
54
|
+
const date = new Date(time * 1e3);
|
|
66
55
|
return intl.formatDate(date, options) || "";
|
|
67
56
|
},
|
|
68
57
|
setLocale: (locale, messages) => {
|
|
@@ -103,4 +92,4 @@ function clearIntlService() {
|
|
|
103
92
|
|
|
104
93
|
|
|
105
94
|
exports.defaultConfig = defaultConfig; exports.createIntlService = createIntlService; exports.setIntlService = setIntlService; exports.getIntlService = getIntlService; exports.clearIntlService = clearIntlService;
|
|
106
|
-
//# sourceMappingURL=chunk-
|
|
95
|
+
//# sourceMappingURL=chunk-UOLYOGEV.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-UOLYOGEV.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-UOLYOGEV.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 * 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 - optional Intl.DateTimeFormat options\n * @returns - formatted date & time string\n */\n formatTimestamp: (\n timestamp?: number | string,\n options?: 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}\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 = 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?: Intl.DateTimeFormatOptions\n ): string => {\n if (!timestamp) return ''\n\n const time = typeof timestamp === 'string' ? Number(timestamp) : timestamp\n const date = new Date(time * 1000)\n\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"]}
|
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
|
|
4
|
+
var _chunkR77UDCWDcjs = require('./chunk-R77UDCWD.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _chunk75FLRXXNcjs = require('./chunk-75FLRXXN.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
|
|
18
|
+
var _chunkUOLYOGEVcjs = require('./chunk-UOLYOGEV.cjs');
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
var
|
|
23
|
+
var _chunkFVO474U6cjs = require('./chunk-FVO474U6.cjs');
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
|
|
@@ -33,5 +33,5 @@ var _chunkMBIRTPNMcjs = require('./chunk-MBIRTPNM.cjs');
|
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
|
|
36
|
-
exports.EXTENSION_STORE_LINKS =
|
|
36
|
+
exports.EXTENSION_STORE_LINKS = _chunkFVO474U6cjs.EXTENSION_STORE_LINKS; exports.browserInfo = _chunkFVO474U6cjs.browserInfo; exports.clearIntlService = _chunkUOLYOGEVcjs.clearIntlService; exports.createIntlService = _chunkUOLYOGEVcjs.createIntlService; exports.defaultConfig = _chunkUOLYOGEVcjs.defaultConfig; exports.deviceService = _chunkNJQVWIZLcjs.deviceService; exports.getIntlService = _chunkUOLYOGEVcjs.getIntlService; exports.setIntlService = _chunkUOLYOGEVcjs.setIntlService; exports.slug = _chunkFVO474U6cjs.slug; exports.withDeviceService = _chunkR77UDCWDcjs.withDeviceService; exports.withIntlService = _chunk75FLRXXNcjs.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 {
|
|
4
|
+
export { 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 {
|
|
4
|
+
export { 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-
|
|
4
|
+
} from "./chunk-7ESVFJO6.js";
|
|
5
5
|
import {
|
|
6
6
|
withIntlService
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-25O35V5J.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-
|
|
18
|
+
} from "./chunk-BAVNEYR7.js";
|
|
19
19
|
import {
|
|
20
20
|
EXTENSION_STORE_LINKS,
|
|
21
21
|
browserInfo,
|
|
22
22
|
slug
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-U2BBWX4F.js";
|
|
24
24
|
export {
|
|
25
25
|
EXTENSION_STORE_LINKS,
|
|
26
26
|
browserInfo,
|
package/dist/mixins/device.cjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkR77UDCWDcjs = require('../chunk-R77UDCWD.cjs');
|
|
4
4
|
require('../chunk-NJQVWIZL.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
exports.withDeviceService =
|
|
7
|
+
exports.withDeviceService = _chunkR77UDCWDcjs.withDeviceService;
|
|
8
8
|
//# sourceMappingURL=device.cjs.map
|
package/dist/mixins/device.js
CHANGED
package/dist/mixins/index.cjs
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});require('../chunk-AMRGSLR5.cjs');
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkR77UDCWDcjs = require('../chunk-R77UDCWD.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _chunk75FLRXXNcjs = require('../chunk-75FLRXXN.cjs');
|
|
8
8
|
require('../chunk-NJQVWIZL.cjs');
|
|
9
|
-
require('../chunk-
|
|
9
|
+
require('../chunk-UOLYOGEV.cjs');
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
exports.withDeviceService =
|
|
13
|
+
exports.withDeviceService = _chunkR77UDCWDcjs.withDeviceService; exports.withIntlService = _chunk75FLRXXNcjs.withIntlService;
|
|
14
14
|
//# sourceMappingURL=index.cjs.map
|
package/dist/mixins/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import "../chunk-DKEXQFNE.js";
|
|
2
2
|
import {
|
|
3
3
|
withDeviceService
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-7ESVFJO6.js";
|
|
5
5
|
import {
|
|
6
6
|
withIntlService
|
|
7
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-25O35V5J.js";
|
|
8
8
|
import "../chunk-X2QNFZU7.js";
|
|
9
|
-
import "../chunk-
|
|
9
|
+
import "../chunk-BAVNEYR7.js";
|
|
10
10
|
export {
|
|
11
11
|
withDeviceService,
|
|
12
12
|
withIntlService
|
package/dist/mixins/intl.cjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../chunk-
|
|
3
|
+
var _chunk75FLRXXNcjs = require('../chunk-75FLRXXN.cjs');
|
|
4
|
+
require('../chunk-UOLYOGEV.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
exports.withIntlService =
|
|
7
|
+
exports.withIntlService = _chunk75FLRXXNcjs.withIntlService;
|
|
8
8
|
//# sourceMappingURL=intl.cjs.map
|
package/dist/mixins/intl.js
CHANGED
package/dist/services/index.cjs
CHANGED
|
@@ -8,7 +8,7 @@ var _chunkNJQVWIZLcjs = require('../chunk-NJQVWIZL.cjs');
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
var
|
|
11
|
+
var _chunkUOLYOGEVcjs = require('../chunk-UOLYOGEV.cjs');
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
|
|
@@ -16,5 +16,5 @@ var _chunkRM42NG7Ecjs = require('../chunk-RM42NG7E.cjs');
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
exports.clearIntlService =
|
|
19
|
+
exports.clearIntlService = _chunkUOLYOGEVcjs.clearIntlService; exports.createIntlService = _chunkUOLYOGEVcjs.createIntlService; exports.defaultConfig = _chunkUOLYOGEVcjs.defaultConfig; exports.deviceService = _chunkNJQVWIZLcjs.deviceService; exports.getIntlService = _chunkUOLYOGEVcjs.getIntlService; exports.setIntlService = _chunkUOLYOGEVcjs.setIntlService;
|
|
20
20
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { DeviceService, NavigatorExtended, deviceService } from './device.cjs';
|
|
2
|
-
export {
|
|
2
|
+
export { IntlService, clearIntlService, createIntlService, defaultConfig, getIntlService, setIntlService } from './intl.cjs';
|
|
3
3
|
import 'ua-parser-js';
|
|
4
4
|
import '@formatjs/intl';
|
package/dist/services/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { DeviceService, NavigatorExtended, deviceService } from './device.js';
|
|
2
|
-
export {
|
|
2
|
+
export { IntlService, clearIntlService, createIntlService, defaultConfig, getIntlService, setIntlService } from './intl.js';
|
|
3
3
|
import 'ua-parser-js';
|
|
4
4
|
import '@formatjs/intl';
|
package/dist/services/index.js
CHANGED
package/dist/services/intl.cjs
CHANGED
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _chunkUOLYOGEVcjs = require('../chunk-UOLYOGEV.cjs');
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
exports.clearIntlService =
|
|
14
|
+
exports.clearIntlService = _chunkUOLYOGEVcjs.clearIntlService; exports.createIntlService = _chunkUOLYOGEVcjs.createIntlService; exports.defaultConfig = _chunkUOLYOGEVcjs.defaultConfig; exports.getIntlService = _chunkUOLYOGEVcjs.getIntlService; exports.setIntlService = _chunkUOLYOGEVcjs.setIntlService;
|
|
15
15
|
//# sourceMappingURL=intl.cjs.map
|
package/dist/services/intl.d.cts
CHANGED
|
@@ -6,11 +6,6 @@ import { FormatNumberOptions, IntlConfig } from '@formatjs/intl';
|
|
|
6
6
|
* Provides locale-aware formatting for messages, numbers, dates, and times.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
/**
|
|
10
|
-
* Translation messages object type
|
|
11
|
-
* Maps translation keys to their corresponding string values
|
|
12
|
-
*/
|
|
13
|
-
type IntlMessages = Record<string, string>;
|
|
14
9
|
/**
|
|
15
10
|
* Intl service interface
|
|
16
11
|
*/
|
|
@@ -49,32 +44,17 @@ interface IntlService {
|
|
|
49
44
|
* Timestamp formatting based on the locale
|
|
50
45
|
*
|
|
51
46
|
* @param timestamp - UNIX timestamp in seconds or milliseconds
|
|
52
|
-
* @param options -
|
|
47
|
+
* @param options - optional Intl.DateTimeFormat options
|
|
53
48
|
* @returns - formatted date & time string
|
|
54
|
-
*
|
|
55
|
-
* @example
|
|
56
|
-
* ```typescript
|
|
57
|
-
* const intl = getIntlService();
|
|
58
|
-
*
|
|
59
|
-
* // Use predefined shortDateTime format
|
|
60
|
-
* intl.formatTimestamp(1733251200, 'shortDateTime'); // "Wed, Dec 3, 2025, 16:07"
|
|
61
|
-
*
|
|
62
|
-
* // Use custom format options
|
|
63
|
-
* intl.formatTimestamp(1733251200, { year: '2-digit', month: '2-digit', day: '2-digit' });
|
|
64
|
-
* // "12/03/25"
|
|
65
|
-
*
|
|
66
|
-
* // No options (basic format)
|
|
67
|
-
* intl.formatTimestamp(1733251200);
|
|
68
|
-
* ```
|
|
69
49
|
*/
|
|
70
|
-
formatTimestamp: (timestamp?: number | string, options?: Intl.DateTimeFormatOptions
|
|
50
|
+
formatTimestamp: (timestamp?: number | string, options?: Intl.DateTimeFormatOptions) => string;
|
|
71
51
|
/**
|
|
72
52
|
* Change the locale and optionally update messages
|
|
73
53
|
*
|
|
74
54
|
* @param locale - new locale code (e.g., 'en-US', 'de-DE')
|
|
75
55
|
* @param messages - optional new messages object for the locale
|
|
76
56
|
*/
|
|
77
|
-
setLocale: (locale: string, messages?:
|
|
57
|
+
setLocale: (locale: string, messages?: Record<string, string>) => void;
|
|
78
58
|
/**
|
|
79
59
|
* Get the current locale
|
|
80
60
|
*
|
|
@@ -93,7 +73,7 @@ interface IntlService {
|
|
|
93
73
|
* intl.setFallbackTranslations(defaultMessages);
|
|
94
74
|
* ```
|
|
95
75
|
*/
|
|
96
|
-
setFallbackTranslations: (fallbackMessages:
|
|
76
|
+
setFallbackTranslations: (fallbackMessages: Record<string, string>) => void;
|
|
97
77
|
/**
|
|
98
78
|
* Signal that tracks locale changes
|
|
99
79
|
* Use this signal to reactively update UI when locale changes
|
|
@@ -167,4 +147,4 @@ declare function getIntlService(): IntlService | null;
|
|
|
167
147
|
*/
|
|
168
148
|
declare function clearIntlService(): void;
|
|
169
149
|
|
|
170
|
-
export { type
|
|
150
|
+
export { type IntlService, clearIntlService, createIntlService, defaultConfig, getIntlService, setIntlService };
|
package/dist/services/intl.d.ts
CHANGED
|
@@ -6,11 +6,6 @@ import { FormatNumberOptions, IntlConfig } from '@formatjs/intl';
|
|
|
6
6
|
* Provides locale-aware formatting for messages, numbers, dates, and times.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
/**
|
|
10
|
-
* Translation messages object type
|
|
11
|
-
* Maps translation keys to their corresponding string values
|
|
12
|
-
*/
|
|
13
|
-
type IntlMessages = Record<string, string>;
|
|
14
9
|
/**
|
|
15
10
|
* Intl service interface
|
|
16
11
|
*/
|
|
@@ -49,32 +44,17 @@ interface IntlService {
|
|
|
49
44
|
* Timestamp formatting based on the locale
|
|
50
45
|
*
|
|
51
46
|
* @param timestamp - UNIX timestamp in seconds or milliseconds
|
|
52
|
-
* @param options -
|
|
47
|
+
* @param options - optional Intl.DateTimeFormat options
|
|
53
48
|
* @returns - formatted date & time string
|
|
54
|
-
*
|
|
55
|
-
* @example
|
|
56
|
-
* ```typescript
|
|
57
|
-
* const intl = getIntlService();
|
|
58
|
-
*
|
|
59
|
-
* // Use predefined shortDateTime format
|
|
60
|
-
* intl.formatTimestamp(1733251200, 'shortDateTime'); // "Wed, Dec 3, 2025, 16:07"
|
|
61
|
-
*
|
|
62
|
-
* // Use custom format options
|
|
63
|
-
* intl.formatTimestamp(1733251200, { year: '2-digit', month: '2-digit', day: '2-digit' });
|
|
64
|
-
* // "12/03/25"
|
|
65
|
-
*
|
|
66
|
-
* // No options (basic format)
|
|
67
|
-
* intl.formatTimestamp(1733251200);
|
|
68
|
-
* ```
|
|
69
49
|
*/
|
|
70
|
-
formatTimestamp: (timestamp?: number | string, options?: Intl.DateTimeFormatOptions
|
|
50
|
+
formatTimestamp: (timestamp?: number | string, options?: Intl.DateTimeFormatOptions) => string;
|
|
71
51
|
/**
|
|
72
52
|
* Change the locale and optionally update messages
|
|
73
53
|
*
|
|
74
54
|
* @param locale - new locale code (e.g., 'en-US', 'de-DE')
|
|
75
55
|
* @param messages - optional new messages object for the locale
|
|
76
56
|
*/
|
|
77
|
-
setLocale: (locale: string, messages?:
|
|
57
|
+
setLocale: (locale: string, messages?: Record<string, string>) => void;
|
|
78
58
|
/**
|
|
79
59
|
* Get the current locale
|
|
80
60
|
*
|
|
@@ -93,7 +73,7 @@ interface IntlService {
|
|
|
93
73
|
* intl.setFallbackTranslations(defaultMessages);
|
|
94
74
|
* ```
|
|
95
75
|
*/
|
|
96
|
-
setFallbackTranslations: (fallbackMessages:
|
|
76
|
+
setFallbackTranslations: (fallbackMessages: Record<string, string>) => void;
|
|
97
77
|
/**
|
|
98
78
|
* Signal that tracks locale changes
|
|
99
79
|
* Use this signal to reactively update UI when locale changes
|
|
@@ -167,4 +147,4 @@ declare function getIntlService(): IntlService | null;
|
|
|
167
147
|
*/
|
|
168
148
|
declare function clearIntlService(): void;
|
|
169
149
|
|
|
170
|
-
export { type
|
|
150
|
+
export { type IntlService, clearIntlService, createIntlService, defaultConfig, getIntlService, setIntlService };
|
package/dist/services/intl.js
CHANGED
package/dist/utils/index.cjs
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var _chunkFVO474U6cjs = require('../chunk-FVO474U6.cjs');
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
exports.EXTENSION_STORE_LINKS =
|
|
10
|
+
exports.EXTENSION_STORE_LINKS = _chunkFVO474U6cjs.EXTENSION_STORE_LINKS; exports.browserInfo = _chunkFVO474U6cjs.browserInfo; exports.slug = _chunkFVO474U6cjs.slug;
|
|
11
11
|
//# sourceMappingURL=index.cjs.map
|
package/dist/utils/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lukso/core",
|
|
3
|
-
"version": "0.1.0-dev.
|
|
3
|
+
"version": "0.1.0-dev.a8c9315",
|
|
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,7 +108,6 @@
|
|
|
108
108
|
"dev-alt": "tsup --watch",
|
|
109
109
|
"clean": "rm -rf dist",
|
|
110
110
|
"test": "vitest",
|
|
111
|
-
"test:run": "vitest run"
|
|
112
|
-
"check": "tsc --noEmit"
|
|
111
|
+
"test:run": "vitest run"
|
|
113
112
|
}
|
|
114
113
|
}
|
package/src/mixins/device.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Mixin to add device detection service to a Lit component
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import
|
|
7
|
+
import { LitElement } from 'lit'
|
|
8
8
|
import type { DeviceService } from '../services/device.js'
|
|
9
9
|
import { deviceService, type NavigatorExtended } from '../services/device.js'
|
|
10
10
|
|
package/src/mixins/intl.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { effect } from '@preact/signals-core'
|
|
8
|
-
import
|
|
8
|
+
import { 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
|
|
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)
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
disconnectedCallback(): void {
|
|
@@ -98,17 +98,6 @@ 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
|
-
})
|
|
112
101
|
})
|
|
113
102
|
|
|
114
103
|
describe('formatNumber', () => {
|
|
@@ -147,8 +136,7 @@ describe('Intl service', () => {
|
|
|
147
136
|
|
|
148
137
|
it('should use default maximum fraction digits of 18', () => {
|
|
149
138
|
const intl = createIntlService({ locale: 'en-US', messages: {} })
|
|
150
|
-
|
|
151
|
-
const result = intl.formatNumber(0.123456789012345678123)
|
|
139
|
+
const result = intl.formatNumber(0.123456789012345678)
|
|
152
140
|
expect(result).toBe('0.12345678901234568')
|
|
153
141
|
})
|
|
154
142
|
})
|
|
@@ -221,7 +209,6 @@ describe('Intl service', () => {
|
|
|
221
209
|
|
|
222
210
|
it('should return empty string for undefined or null', () => {
|
|
223
211
|
const intl = createIntlService({ locale: 'en-US', messages: {} })
|
|
224
|
-
expect(intl.formatTimestamp('')).toBe('')
|
|
225
212
|
expect(intl.formatTimestamp(undefined)).toBe('')
|
|
226
213
|
expect(intl.formatTimestamp(null as any)).toBe('')
|
|
227
214
|
})
|
|
@@ -236,29 +223,6 @@ describe('Intl service', () => {
|
|
|
236
223
|
})
|
|
237
224
|
expect(result).toBe('December 2, 2024')
|
|
238
225
|
})
|
|
239
|
-
|
|
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
|
-
})
|
|
258
|
-
const timestamp = 1733144400 // 2024-12-02T14:00:00Z
|
|
259
|
-
const result = intl.formatTimestamp(timestamp, 'shortDateTime')
|
|
260
|
-
expect(result).toBe('Mon, Dec 2, 2024, 13:00')
|
|
261
|
-
})
|
|
262
226
|
})
|
|
263
227
|
|
|
264
228
|
describe('setLocale', () => {
|
package/src/services/index.ts
CHANGED
|
@@ -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 {
|
|
10
|
+
export type { IntlService } from './intl.js'
|
|
11
11
|
export {
|
|
12
12
|
clearIntlService,
|
|
13
13
|
createIntlService,
|
package/src/services/intl.ts
CHANGED
|
@@ -11,12 +11,6 @@ import {
|
|
|
11
11
|
} from '@formatjs/intl'
|
|
12
12
|
import { signal } from '@preact/signals-core'
|
|
13
13
|
|
|
14
|
-
/**
|
|
15
|
-
* Translation messages object type
|
|
16
|
-
* Maps translation keys to their corresponding string values
|
|
17
|
-
*/
|
|
18
|
-
export type IntlMessages = Record<string, string>
|
|
19
|
-
|
|
20
14
|
/**
|
|
21
15
|
* Default format number options
|
|
22
16
|
* @see https://github.com/formatjs/formatjs/blob/main/packages/ecma402-abstract/types/number.ts
|
|
@@ -70,27 +64,12 @@ export interface IntlService {
|
|
|
70
64
|
* Timestamp formatting based on the locale
|
|
71
65
|
*
|
|
72
66
|
* @param timestamp - UNIX timestamp in seconds or milliseconds
|
|
73
|
-
* @param options -
|
|
67
|
+
* @param options - optional Intl.DateTimeFormat options
|
|
74
68
|
* @returns - formatted date & time string
|
|
75
|
-
*
|
|
76
|
-
* @example
|
|
77
|
-
* ```typescript
|
|
78
|
-
* const intl = getIntlService();
|
|
79
|
-
*
|
|
80
|
-
* // Use predefined shortDateTime format
|
|
81
|
-
* intl.formatTimestamp(1733251200, 'shortDateTime'); // "Wed, Dec 3, 2025, 16:07"
|
|
82
|
-
*
|
|
83
|
-
* // Use custom format options
|
|
84
|
-
* intl.formatTimestamp(1733251200, { year: '2-digit', month: '2-digit', day: '2-digit' });
|
|
85
|
-
* // "12/03/25"
|
|
86
|
-
*
|
|
87
|
-
* // No options (basic format)
|
|
88
|
-
* intl.formatTimestamp(1733251200);
|
|
89
|
-
* ```
|
|
90
69
|
*/
|
|
91
70
|
formatTimestamp: (
|
|
92
71
|
timestamp?: number | string,
|
|
93
|
-
options?: Intl.DateTimeFormatOptions
|
|
72
|
+
options?: Intl.DateTimeFormatOptions
|
|
94
73
|
) => string
|
|
95
74
|
|
|
96
75
|
/**
|
|
@@ -99,7 +78,7 @@ export interface IntlService {
|
|
|
99
78
|
* @param locale - new locale code (e.g., 'en-US', 'de-DE')
|
|
100
79
|
* @param messages - optional new messages object for the locale
|
|
101
80
|
*/
|
|
102
|
-
setLocale: (locale: string, messages?:
|
|
81
|
+
setLocale: (locale: string, messages?: Record<string, string>) => void
|
|
103
82
|
|
|
104
83
|
/**
|
|
105
84
|
* Get the current locale
|
|
@@ -120,7 +99,7 @@ export interface IntlService {
|
|
|
120
99
|
* intl.setFallbackTranslations(defaultMessages);
|
|
121
100
|
* ```
|
|
122
101
|
*/
|
|
123
|
-
setFallbackTranslations: (fallbackMessages:
|
|
102
|
+
setFallbackTranslations: (fallbackMessages: Record<string, string>) => void
|
|
124
103
|
|
|
125
104
|
/**
|
|
126
105
|
* Signal that tracks locale changes
|
|
@@ -135,7 +114,6 @@ export interface IntlService {
|
|
|
135
114
|
export const defaultConfig: IntlConfig = {
|
|
136
115
|
locale: 'en-US',
|
|
137
116
|
messages: {},
|
|
138
|
-
formats: {},
|
|
139
117
|
}
|
|
140
118
|
|
|
141
119
|
/**
|
|
@@ -170,10 +148,10 @@ let intlService: IntlService | null = null
|
|
|
170
148
|
export function createIntlService(
|
|
171
149
|
config: IntlConfig = defaultConfig
|
|
172
150
|
): IntlService {
|
|
173
|
-
let currentConfig =
|
|
151
|
+
let currentConfig = config
|
|
174
152
|
let intl = createIntl({ ...currentConfig, defaultLocale: 'en-US' })
|
|
175
153
|
const localeChanged = signal(0)
|
|
176
|
-
let fallbackMessages:
|
|
154
|
+
let fallbackMessages: Record<string, string> = {}
|
|
177
155
|
|
|
178
156
|
return {
|
|
179
157
|
formatMessage: (key: string, options?: Record<string, string>): string => {
|
|
@@ -225,38 +203,17 @@ export function createIntlService(
|
|
|
225
203
|
|
|
226
204
|
formatTimestamp: (
|
|
227
205
|
timestamp?: number | string,
|
|
228
|
-
options?: Intl.DateTimeFormatOptions
|
|
206
|
+
options?: Intl.DateTimeFormatOptions
|
|
229
207
|
): string => {
|
|
230
208
|
if (!timestamp) return ''
|
|
231
209
|
|
|
232
210
|
const time = typeof timestamp === 'string' ? Number(timestamp) : timestamp
|
|
233
|
-
const date =
|
|
234
|
-
time < 10_000_000_000
|
|
235
|
-
? new Date(time * 1000) // seconds
|
|
236
|
-
: new Date(time) // milliseconds
|
|
237
|
-
|
|
238
|
-
// Handle predefined format
|
|
239
|
-
if (typeof options === 'string') {
|
|
240
|
-
const dateTimeOptions = currentConfig.formats?.date?.[
|
|
241
|
-
options
|
|
242
|
-
] as Intl.DateTimeFormatOptions
|
|
243
|
-
|
|
244
|
-
if (dateTimeOptions) {
|
|
245
|
-
return new Intl.DateTimeFormat(
|
|
246
|
-
currentConfig.locale,
|
|
247
|
-
dateTimeOptions
|
|
248
|
-
).format(date)
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
// Fallback to default format if predefined format not found
|
|
252
|
-
return intl.formatDate(date) || ''
|
|
253
|
-
}
|
|
211
|
+
const date = new Date(time * 1000)
|
|
254
212
|
|
|
255
|
-
// For normal @formatjs/intl options
|
|
256
213
|
return intl.formatDate(date, options) || ''
|
|
257
214
|
},
|
|
258
215
|
|
|
259
|
-
setLocale: (locale: string, messages?:
|
|
216
|
+
setLocale: (locale: string, messages?: Record<string, string>): void => {
|
|
260
217
|
currentConfig = {
|
|
261
218
|
...currentConfig,
|
|
262
219
|
locale,
|
|
@@ -273,7 +230,9 @@ export function createIntlService(
|
|
|
273
230
|
return currentConfig.locale
|
|
274
231
|
},
|
|
275
232
|
|
|
276
|
-
setFallbackTranslations: (
|
|
233
|
+
setFallbackTranslations: (
|
|
234
|
+
fallbackMessagesInput: Record<string, string>
|
|
235
|
+
): void => {
|
|
277
236
|
fallbackMessages = fallbackMessagesInput
|
|
278
237
|
},
|
|
279
238
|
|
package/src/utils/browserInfo.ts
CHANGED
|
@@ -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 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":[]}
|
|
@@ -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\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":[]}
|
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
|
@@ -1 +0,0 @@
|
|
|
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}"]}
|
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
|
@@ -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 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":[]}
|