@relax.js/core 1.0.4 → 1.0.6
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/DependencyInjection.d.ts +3 -3
- package/dist/collections/LinkedList.d.ts +9 -8
- package/dist/collections/index.js +1 -1
- package/dist/collections/index.js.map +3 -3
- package/dist/collections/index.mjs +1 -1
- package/dist/collections/index.mjs.map +3 -3
- package/dist/di/index.js +1 -1
- package/dist/di/index.js.map +2 -2
- package/dist/di/index.mjs +1 -1
- package/dist/di/index.mjs.map +2 -2
- package/dist/elements/index.js +1 -1
- package/dist/elements/index.js.map +1 -1
- package/dist/forms/FormValidator.d.ts +2 -2
- package/dist/forms/ValidationRules.d.ts +2 -6
- package/dist/forms/index.js +1 -1
- package/dist/forms/index.js.map +3 -3
- package/dist/forms/index.mjs +1 -1
- package/dist/forms/index.mjs.map +3 -3
- package/dist/forms/setFormData.d.ts +52 -1
- package/dist/html/index.js +1 -1
- package/dist/html/index.js.map +3 -3
- package/dist/html/index.mjs +1 -1
- package/dist/html/index.mjs.map +3 -3
- package/dist/http/ServerSentEvents.d.ts +1 -1
- package/dist/http/SimpleWebSocket.d.ts +1 -1
- package/dist/http/index.js +1 -1
- package/dist/http/index.js.map +3 -3
- package/dist/http/index.mjs +1 -1
- package/dist/http/index.mjs.map +3 -3
- package/dist/i18n/icu.d.ts +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/i18n/index.js.map +2 -2
- package/dist/i18n/index.mjs +1 -1
- package/dist/i18n/index.mjs.map +2 -2
- package/dist/index.js +3 -3
- package/dist/index.js.map +3 -3
- package/dist/index.mjs +3 -3
- package/dist/index.mjs.map +3 -3
- package/dist/routing/NavigateRouteEvent.d.ts +4 -4
- package/dist/routing/index.js +2 -2
- package/dist/routing/index.js.map +3 -3
- package/dist/routing/index.mjs +3 -3
- package/dist/routing/index.mjs.map +3 -3
- package/dist/routing/navigation.d.ts +1 -1
- package/dist/templates/NodeTemplate.d.ts +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +3 -3
- package/dist/utils/index.mjs +1 -1
- package/dist/utils/index.mjs.map +3 -3
- package/docs/GettingStarted.md +7 -0
- package/docs/api.json +34 -12
- package/docs/forms/reading-writing.md +137 -1
- package/docs/setup/bootstrapping.md +154 -0
- package/docs/setup/build-and-deploy.md +183 -0
- package/docs/setup/project-structure.md +170 -0
- package/docs/setup/vite.md +175 -0
- package/package.json +3 -2
- package/docs/api/.nojekyll +0 -1
- package/docs/api/assets/hierarchy.js +0 -1
- package/docs/api/assets/highlight.css +0 -120
- package/docs/api/assets/icons.js +0 -18
- package/docs/api/assets/icons.svg +0 -1
- package/docs/api/assets/main.js +0 -60
- package/docs/api/assets/navigation.js +0 -1
- package/docs/api/assets/search.js +0 -1
- package/docs/api/assets/style.css +0 -1633
- package/docs/api/classes/http.WebSocketClient.html +0 -26
- package/docs/api/classes/i18n.LocaleChangeEvent.html +0 -66
- package/docs/api/classes/index.Blueprint.html +0 -3
- package/docs/api/classes/index.BoundNode.html +0 -3
- package/docs/api/classes/index.DigitsValidation.html +0 -10
- package/docs/api/classes/index.FormValidator.html +0 -32
- package/docs/api/classes/index.HttpError.html +0 -13
- package/docs/api/classes/index.LinkedList.html +0 -26
- package/docs/api/classes/index.NavigateRouteEvent.html +0 -76
- package/docs/api/classes/index.Node.html +0 -15
- package/docs/api/classes/index.PageSelectedEvent.html +0 -61
- package/docs/api/classes/index.Pager.html +0 -4
- package/docs/api/classes/index.RangeValidation.html +0 -15
- package/docs/api/classes/index.RelaxError.html +0 -17
- package/docs/api/classes/index.RequiredValidation.html +0 -10
- package/docs/api/classes/index.RouteError.html +0 -11
- package/docs/api/classes/index.RouteGuardError.html +0 -12
- package/docs/api/classes/index.RouteLink.html +0 -779
- package/docs/api/classes/index.RouteTarget.html +0 -788
- package/docs/api/classes/index.SSEClient.html +0 -13
- package/docs/api/classes/index.SSEDataEvent.html +0 -63
- package/docs/api/classes/index.ServiceCollection.html +0 -28
- package/docs/api/classes/index.ServiceContainer.html +0 -24
- package/docs/api/classes/index.SortChangeEvent.html +0 -61
- package/docs/api/classes/index.TableRenderer.html +0 -5
- package/docs/api/classes/index.TableSorter.html +0 -4
- package/docs/api/enums/index.GuardResult.html +0 -9
- package/docs/api/functions/elements.formError.html +0 -6
- package/docs/api/functions/elements.selectOne.html +0 -6
- package/docs/api/functions/i18n.getCurrentLocale.html +0 -3
- package/docs/api/functions/i18n.loadNamespace.html +0 -7
- package/docs/api/functions/i18n.loadNamespaces.html +0 -6
- package/docs/api/functions/i18n.onMissingTranslation.html +0 -7
- package/docs/api/functions/i18n.setLocale.html +0 -7
- package/docs/api/functions/i18n.setMessageFormatter.html +0 -7
- package/docs/api/functions/i18n.t.html +0 -9
- package/docs/api/functions/index.BooleanConverter.html +0 -6
- package/docs/api/functions/index.ContainerService.html +0 -13
- package/docs/api/functions/index.DateConverter.html +0 -11
- package/docs/api/functions/index.Inject.html +0 -16
- package/docs/api/functions/index.NumberConverter.html +0 -5
- package/docs/api/functions/index.RegisterValidator.html +0 -7
- package/docs/api/functions/index.applyPipes.html +0 -17
- package/docs/api/functions/index.asyncHandler.html +0 -11
- package/docs/api/functions/index.capitalizePipe.html +0 -4
- package/docs/api/functions/index.clearPendingNavigations.html +0 -1
- package/docs/api/functions/index.compileTemplate.html +0 -26
- package/docs/api/functions/index.configure.html +0 -5
- package/docs/api/functions/index.createBluePrint.html +0 -1
- package/docs/api/functions/index.createConverterFromDataType.html +0 -4
- package/docs/api/functions/index.createConverterFromInputType.html +0 -5
- package/docs/api/functions/index.createPipeRegistry.html +0 -12
- package/docs/api/functions/index.currencyPipe.html +0 -9
- package/docs/api/functions/index.datePipe.html +0 -9
- package/docs/api/functions/index.daysAgoPipe.html +0 -8
- package/docs/api/functions/index.defaultPipe.html +0 -5
- package/docs/api/functions/index.defineRoutes.html +0 -8
- package/docs/api/functions/index.del.html +0 -8
- package/docs/api/functions/index.findRouteByName.html +0 -5
- package/docs/api/functions/index.findRouteByUrl.html +0 -4
- package/docs/api/functions/index.firstPipe.html +0 -4
- package/docs/api/functions/index.generateSequentialId.html +0 -21
- package/docs/api/functions/index.get.html +0 -9
- package/docs/api/functions/index.getDataConverter.html +0 -11
- package/docs/api/functions/index.getParentComponent.html +0 -18
- package/docs/api/functions/index.getValidator.html +0 -4
- package/docs/api/functions/index.html.html +0 -19
- package/docs/api/functions/index.joinPipe.html +0 -5
- package/docs/api/functions/index.keysPipe.html +0 -4
- package/docs/api/functions/index.lastPipe.html +0 -4
- package/docs/api/functions/index.lowercasePipe.html +0 -4
- package/docs/api/functions/index.mapFormToClass.html +0 -17
- package/docs/api/functions/index.matchRoute.html +0 -5
- package/docs/api/functions/index.navigate.html +0 -8
- package/docs/api/functions/index.onError.html +0 -8
- package/docs/api/functions/index.piecesPipe.html +0 -8
- package/docs/api/functions/index.post.html +0 -9
- package/docs/api/functions/index.printRoutes.html +0 -2
- package/docs/api/functions/index.put.html +0 -9
- package/docs/api/functions/index.readData.html +0 -17
- package/docs/api/functions/index.registerRouteTarget.html +0 -9
- package/docs/api/functions/index.reportError.html +0 -10
- package/docs/api/functions/index.request.html +0 -8
- package/docs/api/functions/index.resolveValue.html +0 -18
- package/docs/api/functions/index.setFetch.html +0 -6
- package/docs/api/functions/index.setFormData.html +0 -17
- package/docs/api/functions/index.shortenPipe.html +0 -5
- package/docs/api/functions/index.startRouting.html +0 -6
- package/docs/api/functions/index.ternaryPipe.html +0 -6
- package/docs/api/functions/index.trimPipe.html +0 -4
- package/docs/api/functions/index.unregisterRouteTarget.html +0 -3
- package/docs/api/functions/index.uppercasePipe.html +0 -4
- package/docs/api/hierarchy.html +0 -1
- package/docs/api/index.html +0 -323
- package/docs/api/interfaces/http.SimpleDataEvent.html +0 -3
- package/docs/api/interfaces/http.WebSocketAbstraction.html +0 -9
- package/docs/api/interfaces/http.WebSocketCodec.html +0 -4
- package/docs/api/interfaces/http.WebSocketOptions.html +0 -20
- package/docs/api/interfaces/index.CompiledTemplate.html +0 -10
- package/docs/api/interfaces/index.DataLoader.html +0 -19
- package/docs/api/interfaces/index.EngineConfig.html +0 -11
- package/docs/api/interfaces/index.ErrorContext.html +0 -4
- package/docs/api/interfaces/index.FormReaderOptions.html +0 -8
- package/docs/api/interfaces/index.HttpOptions.html +0 -16
- package/docs/api/interfaces/index.HttpResponse.html +0 -17
- package/docs/api/interfaces/index.LoadRoute.html +0 -7
- package/docs/api/interfaces/index.NavigateOptions.html +0 -7
- package/docs/api/interfaces/index.PipeRegistry.html +0 -12
- package/docs/api/interfaces/index.RegistrationOptions.html +0 -22
- package/docs/api/interfaces/index.RenderTemplate.html +0 -7
- package/docs/api/interfaces/index.RequestOptions.html +0 -11
- package/docs/api/interfaces/index.Routable.html +0 -10
- package/docs/api/interfaces/index.Route.html +0 -13
- package/docs/api/interfaces/index.RouteGuard.html +0 -2
- package/docs/api/interfaces/index.RouteValue.html +0 -6
- package/docs/api/interfaces/index.SSEOptions.html +0 -24
- package/docs/api/interfaces/index.ValidationContext.html +0 -8
- package/docs/api/interfaces/index.ValidatorOptions.html +0 -14
- package/docs/api/media/Architecture.md +0 -333
- package/docs/api/media/DependencyInjection.md +0 -277
- package/docs/api/media/GettingStarted.md +0 -231
- package/docs/api/media/HttpClient.md +0 -459
- package/docs/api/media/Pipes.md +0 -211
- package/docs/api/media/Routing.md +0 -332
- package/docs/api/media/WhyRelaxjs.md +0 -336
- package/docs/api/media/forms.md +0 -99
- package/docs/api/media/html.md +0 -175
- package/docs/api/media/i18n.md +0 -354
- package/docs/api/media/utilities.md +0 -143
- package/docs/api/media/validation.md +0 -351
- package/docs/api/modules/collections_Index.html +0 -1
- package/docs/api/modules/di.html +0 -1
- package/docs/api/modules/elements.html +0 -1
- package/docs/api/modules/forms.html +0 -1
- package/docs/api/modules/html.html +0 -1
- package/docs/api/modules/http.html +0 -1
- package/docs/api/modules/i18n.html +0 -1
- package/docs/api/modules/index.html +0 -1
- package/docs/api/modules/routing.html +0 -1
- package/docs/api/modules/utils.html +0 -1
- package/docs/api/modules.html +0 -1
- package/docs/api/types/http.WebSocketFactory.html +0 -2
- package/docs/api/types/i18n.MessageFormatter.html +0 -3
- package/docs/api/types/i18n.MissingTranslationHandler.html +0 -1
- package/docs/api/types/index.Constructor.html +0 -7
- package/docs/api/types/index.ConverterFunc.html +0 -2
- package/docs/api/types/index.DataType.html +0 -2
- package/docs/api/types/index.InputType.html +0 -2
- package/docs/api/types/index.PipeFunction.html +0 -6
- package/docs/api/types/index.RouteData.html +0 -1
- package/docs/api/types/index.RouteMatchResult.html +0 -9
- package/docs/api/types/index.RouteParamType.html +0 -1
- package/docs/api/types/index.RouteSegmentType.html +0 -2
- package/docs/api/types/index.SSEEventFactory.html +0 -5
- package/docs/api/types/index.ServiceScope.html +0 -10
- package/docs/api/types/index.SortColumn.html +0 -3
- package/docs/api/variables/i18n.formatICU.html +0 -3
- package/docs/api/variables/index.container.html +0 -6
- package/docs/api/variables/index.defaultPipes.html +0 -6
- package/docs/api/variables/index.internalRoutes.html +0 -1
- package/docs/api/variables/index.serviceCollection.html +0 -6
package/dist/i18n/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/i18n/locales/en/r-common.json", "../../src/i18n/locales/en/r-pipes.json", "../../src/i18n/locales/en/r-validation.json", "../../src/i18n/locales/sv/r-common.json", "../../src/i18n/locales/sv/r-pipes.json", "../../src/i18n/locales/sv/r-validation.json", "../../src/i18n/index.ts", "../../src/i18n/icu.ts", "../../src/i18n/i18n.ts"],
|
|
4
|
-
"sourcesContent": ["{\r\n \"greeting\": \"Hello, {name}!\",\r\n \"items\": \"{count, plural, one {# item} other {# items}}\"\r\n}\r\n", "{\r\n \"today\": \"today\",\r\n \"yesterday\": \"yesterday\",\r\n \"daysAgo\": \"{count, plural, one {# day ago} other {# days ago}}\",\r\n \"pieces\": \"{count, plural, =0 {none} one {one} other {# pcs}}\"\r\n}\r\n", "{\r\n \"required\": \"This field is required.\",\r\n \"range\": \"Number must be between {min} and {max}, was {actual}.\",\r\n \"digits\": \"Please enter only digits.\"\r\n}\r\n", "{\r\n \"greeting\": \"Hej, {name}!\",\r\n \"items\": \"{count, plural, one {# sak} other {# saker}}\"\r\n}\r\n", "{\r\n \"today\": \"idag\",\r\n \"yesterday\": \"ig\u00E5r\",\r\n \"daysAgo\": \"{count, plural, one {# dag sedan} other {# dagar sedan}}\",\r\n \"pieces\": \"{count, plural, =0 {inga} one {en} other {# st}}\"\r\n}\r\n", "{\r\n \"required\": \"Detta f\u00E4lt \u00E4r obligatoriskt.\",\r\n \"range\": \"Talet m\u00E5ste vara mellan {min} och {max}, var {actual}.\",\r\n \"digits\": \"Ange endast siffror.\"\r\n}\r\n", "export {\r\n t,\r\n setLocale,\r\n loadNamespace,\r\n loadNamespaces,\r\n getCurrentLocale,\r\n onMissingTranslation,\r\n LocaleChangeEvent,\r\n MissingTranslationHandler,\r\n} from './i18n';\r\n\r\nexport {\r\n MessageFormatter,\r\n formatICU,\r\n setMessageFormatter,\r\n} from './icu';\r\n", "/**\r\n * @module icu\r\n * ICU message format support for internationalization.\r\n * Provides pluralization, select, and value interpolation.\r\n *\r\n * @example\r\n * // Simple interpolation\r\n * formatICU('Hello, {name}!', { name: 'World' });\r\n * // Returns: 'Hello, World!'\r\n *\r\n * @example\r\n * // Pluralization\r\n * formatICU('{count, plural, one {# item} other {# items}}', { count: 5 });\r\n * // Returns: '5 items'\r\n *\r\n * @example\r\n * // Select\r\n * formatICU('{gender, select, male {He} female {She} other {They}}', { gender: 'female' });\r\n * // Returns: 'She'\r\n */\r\n\r\nconst pluralRulesCache = new Map<string, Intl.PluralRules>();\r\n\r\n/**\r\n * Function type for message formatters.\r\n * Implement this to provide custom message formatting.\r\n */\r\nexport type MessageFormatter = (\r\n message: string,\r\n values?: Record<string, any>,\r\n locale?: string\r\n) => string;\r\n\r\n\r\nfunction getPluralRule(locale: string): Intl.PluralRules {\r\n if (!pluralRulesCache.has(locale)) {\r\n pluralRulesCache.set(locale, new Intl.PluralRules(locale));\r\n }\r\n return pluralRulesCache.get(locale)!;\r\n}\r\n\r\nfunction escapeRegex(s: string): string {\r\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n\r\n/**\r\n * Default ICU message formatter implementation.\r\n * Supports simple interpolation, pluralization with exact matches, and select.\r\n *\r\n * @param message - ICU format message string\r\n * @param values - Values to interpolate\r\n * @param locale - Locale for plural rules (default: 'en')\r\n * @returns Formatted message string\r\n *\r\n * @example\r\n * defaultFormatICU('{n, plural, =0 {none} one {# item} other {# items}}', { n: 0 }, 'en');\r\n * // Returns: 'none'\r\n *\r\n * @example\r\n * defaultFormatICU('{role, select, admin {Full access} other {Limited access}}', { role: 'admin' });\r\n * // Returns: 'Full access'\r\n */\r\nexport function defaultFormatICU(\r\n message: string,\r\n values: Record<string, any>,\r\n locale: string = 'en'\r\n): string {\r\n return message.replace(\r\n /\\{(\\w+)(?:, (plural|select),((?:[^{}]*\\{[^{}]*\\})+))?\\}/g,\r\n (_, key, type, categoriesPart) => {\r\n const value = values[key];\r\n\r\n if (type === 'plural') {\r\n const exact = new RegExp(\r\n `=${escapeRegex(String(value))}\\\\s*\\\\{([^{}]*)\\\\}`\r\n ).exec(categoriesPart);\r\n if (exact) {\r\n return exact[1]\r\n .replace(`{${key}}`, String(value))\r\n .replace('#', String(value));\r\n }\r\n\r\n const rules = getPluralRule(locale);\r\n const category = rules.select(value);\r\n const match =\r\n new RegExp(`${category}\\\\s*\\\\{([^{}]*)\\\\}`).exec(categoriesPart) ||\r\n new RegExp(`other\\\\s*\\\\{([^{}]*)\\\\}`).exec(categoriesPart);\r\n if (match) {\r\n return match[1]\r\n .replace(`{${key}}`, String(value))\r\n .replace('#', String(value));\r\n }\r\n return String(value);\r\n }\r\n\r\n if (type === 'select') {\r\n const escaped = escapeRegex(String(value));\r\n const match =\r\n new RegExp(`\\\\b${escaped}\\\\s*\\\\{([^{}]*)\\\\}`).exec(categoriesPart) ||\r\n new RegExp(`\\\\bother\\\\s*\\\\{([^{}]*)\\\\}`).exec(categoriesPart);\r\n return match ? match[1] : String(value);\r\n }\r\n\r\n return value !== undefined ? String(value) : `{${key}}`;\r\n },\r\n );\r\n}\r\n\r\n/**\r\n * The active message formatter. Defaults to `defaultFormatICU`.\r\n * Can be replaced with `setMessageFormatter` for custom formatting.\r\n */\r\nexport let formatICU: MessageFormatter = defaultFormatICU;\r\n\r\n/**\r\n * Replaces the default message formatter with a custom implementation.\r\n * Use this to integrate with external i18n libraries like FormatJS.\r\n *\r\n * @param formatter - The custom formatter function\r\n *\r\n * @example\r\n * // Use FormatJS IntlMessageFormat\r\n * import { IntlMessageFormat } from 'intl-messageformat';\r\n *\r\n * setMessageFormatter((message, values, locale) => {\r\n * const fmt = new IntlMessageFormat(message, locale);\r\n * return fmt.format(values);\r\n * });\r\n */\r\nexport function setMessageFormatter(formatter: MessageFormatter) {\r\n formatICU = formatter;\r\n}", "/**\r\n * @module i18n\r\n * Internationalization support with namespace-based translations.\r\n * Uses ICU message format for pluralization, select, and formatting.\r\n *\r\n * @example\r\n * // Initialize locale\r\n * await setLocale('sv');\r\n *\r\n * // Use translations\r\n * const greeting = t('r-common:greeting', { name: 'John' });\r\n * const items = t('shop:items', { count: 5 });\r\n */\r\n\r\nimport { formatICU } from './icu';\r\n\r\ntype Locale = string;\r\ntype Namespace = string;\r\ntype TranslationMap = Record<string, string>;\r\ntype Translations = Record<Namespace, TranslationMap>;\r\n\r\nexport type MissingTranslationHandler = (\r\n key: string,\r\n namespace: string,\r\n locale: string,\r\n) => void;\r\n\r\n/**\r\n * Dispatched on `document` after `setLocale()` completes.\r\n * The `locale` property contains the new normalized locale code.\r\n *\r\n * @example\r\n * document.addEventListener('localechange', (e) => {\r\n * console.log(`Locale changed to ${e.locale}`);\r\n * this.render();\r\n * });\r\n */\r\nexport class LocaleChangeEvent extends Event {\r\n readonly locale: string;\r\n constructor(locale: string) {\r\n super('localechange', { bubbles: false });\r\n this.locale = locale;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface DocumentEventMap {\r\n localechange: LocaleChangeEvent;\r\n }\r\n}\r\n\r\nconst fallbackLocale: Locale = 'en';\r\nlet currentLocale: Locale = fallbackLocale;\r\nconst loadedNamespaces = new Set<Namespace>();\r\nconst translations: Translations = {};\r\nlet missingHandler: MissingTranslationHandler | null = null;\r\n\r\nfunction normalizeLocale(locale: string): string {\r\n return locale.toLowerCase().split('-')[0];\r\n}\r\n\r\n/**\r\n * Sets the current locale and loads the common namespace.\r\n * Clears previously loaded translations and dispatches a `localechange` event.\r\n *\r\n * @param locale - The locale code (e.g., 'en', 'sv', 'en-US')\r\n *\r\n * @example\r\n * await setLocale('sv');\r\n */\r\nexport async function setLocale(locale: string): Promise<void> {\r\n const normalized = normalizeLocale(locale);\r\n currentLocale = normalized;\r\n loadedNamespaces.clear();\r\n Object.keys(translations).forEach(ns => delete translations[ns]);\r\n await loadNamespace('r-common');\r\n if (typeof document !== 'undefined') {\r\n document.dispatchEvent(new LocaleChangeEvent(normalized));\r\n }\r\n}\r\n\r\n/**\r\n * Loads a translation namespace on demand.\r\n * Falls back to the default locale if translations are not found.\r\n *\r\n * @param namespace - The namespace to load (e.g., 'shop', 'errors')\r\n *\r\n * @example\r\n * await loadNamespace('shop');\r\n * const price = t('shop:priceLabel');\r\n */\r\nexport async function loadNamespace(namespace: Namespace): Promise<void> {\r\n if (loadedNamespaces.has(namespace)) return;\r\n\r\n try {\r\n const module = await import(`./locales/${currentLocale}/${namespace}.json`);\r\n translations[namespace] = module.default;\r\n loadedNamespaces.add(namespace);\r\n } catch (err) {\r\n if (currentLocale !== fallbackLocale) {\r\n const fallback = await import(`./locales/${fallbackLocale}/${namespace}.json`);\r\n translations[namespace] = fallback.default;\r\n loadedNamespaces.add(namespace);\r\n } else {\r\n console.warn(`i18n: Failed to load namespace '${namespace}' for locale '${currentLocale}'`);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Loads multiple translation namespaces in parallel.\r\n *\r\n * @param namespaces - Array of namespace names to load\r\n *\r\n * @example\r\n * await loadNamespaces(['r-pipes', 'r-validation']);\r\n */\r\nexport async function loadNamespaces(namespaces: Namespace[]): Promise<void> {\r\n await Promise.all(namespaces.map(ns => loadNamespace(ns)));\r\n}\r\n\r\n/**\r\n * Translates a key with optional value interpolation.\r\n * Supports ICU message format for pluralization and select.\r\n *\r\n * @param fullKey - Translation key in format 'namespace:key' or just 'key' (uses 'r-common')\r\n * @param values - Values to interpolate into the message\r\n * @returns The translated string, or the key if not found\r\n *\r\n * @example\r\n * // Simple translation\r\n * t('greeting'); // Uses r-common:greeting\r\n *\r\n * // With namespace\r\n * t('errors:notFound');\r\n *\r\n * // With interpolation\r\n * t('welcome', { name: 'John' }); // \"Welcome, John!\"\r\n *\r\n * // With pluralization (ICU format)\r\n * t('items', { count: 5 }); // \"5 items\" or \"5 f\u00F6rem\u00E5l\"\r\n */\r\nexport function t(fullKey: string, values?: Record<string, any>): string {\r\n const [namespace, key] = fullKey.includes(':')\r\n ? fullKey.split(':')\r\n : ['r-common', fullKey];\r\n const message = translations[namespace]?.[key];\r\n if (!message) {\r\n if (missingHandler) missingHandler(key, namespace, currentLocale);\r\n return fullKey;\r\n }\r\n try {\r\n return formatICU(message, values, currentLocale) as string;\r\n } catch {\r\n return fullKey;\r\n }\r\n}\r\n\r\n/**\r\n * Returns the current locale code.\r\n *\r\n * @returns The normalized locale code (e.g., 'en', 'sv')\r\n */\r\nexport function getCurrentLocale(): string {\r\n return currentLocale;\r\n}\r\n\r\n/**\r\n * Registers a handler called when `t()` encounters a missing translation key.\r\n * Pass `null` to remove the handler.\r\n *\r\n * @param handler - Callback receiving the key, namespace, and locale\r\n *\r\n * @example\r\n * onMissingTranslation((key, ns, locale) => {\r\n * console.warn(`Missing: ${ns}:${key} [${locale}]`);\r\n * });\r\n */\r\nexport function onMissingTranslation(handler: MissingTranslationHandler | null): void {\r\n missingHandler = handler;\r\n}\r\n"],
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["{\r\n \"greeting\": \"Hello, {name}!\",\r\n \"items\": \"{count, plural, one {# item} other {# items}}\"\r\n}\r\n", "{\r\n \"today\": \"today\",\r\n \"yesterday\": \"yesterday\",\r\n \"daysAgo\": \"{count, plural, one {# day ago} other {# days ago}}\",\r\n \"pieces\": \"{count, plural, =0 {none} one {one} other {# pcs}}\"\r\n}\r\n", "{\r\n \"required\": \"This field is required.\",\r\n \"range\": \"Number must be between {min} and {max}, was {actual}.\",\r\n \"digits\": \"Please enter only digits.\"\r\n}\r\n", "{\r\n \"greeting\": \"Hej, {name}!\",\r\n \"items\": \"{count, plural, one {# sak} other {# saker}}\"\r\n}\r\n", "{\r\n \"today\": \"idag\",\r\n \"yesterday\": \"ig\u00E5r\",\r\n \"daysAgo\": \"{count, plural, one {# dag sedan} other {# dagar sedan}}\",\r\n \"pieces\": \"{count, plural, =0 {inga} one {en} other {# st}}\"\r\n}\r\n", "{\r\n \"required\": \"Detta f\u00E4lt \u00E4r obligatoriskt.\",\r\n \"range\": \"Talet m\u00E5ste vara mellan {min} och {max}, var {actual}.\",\r\n \"digits\": \"Ange endast siffror.\"\r\n}\r\n", "export {\r\n t,\r\n setLocale,\r\n loadNamespace,\r\n loadNamespaces,\r\n getCurrentLocale,\r\n onMissingTranslation,\r\n LocaleChangeEvent,\r\n MissingTranslationHandler,\r\n} from './i18n';\r\n\r\nexport {\r\n MessageFormatter,\r\n formatICU,\r\n setMessageFormatter,\r\n} from './icu';\r\n", "/**\r\n * @module icu\r\n * ICU message format support for internationalization.\r\n * Provides pluralization, select, and value interpolation.\r\n *\r\n * @example\r\n * // Simple interpolation\r\n * formatICU('Hello, {name}!', { name: 'World' });\r\n * // Returns: 'Hello, World!'\r\n *\r\n * @example\r\n * // Pluralization\r\n * formatICU('{count, plural, one {# item} other {# items}}', { count: 5 });\r\n * // Returns: '5 items'\r\n *\r\n * @example\r\n * // Select\r\n * formatICU('{gender, select, male {He} female {She} other {They}}', { gender: 'female' });\r\n * // Returns: 'She'\r\n */\r\n\r\nconst pluralRulesCache = new Map<string, Intl.PluralRules>();\r\n\r\n/**\r\n * Function type for message formatters.\r\n * Implement this to provide custom message formatting.\r\n */\r\nexport type MessageFormatter = (\r\n message: string,\r\n values?: Record<string, any>,\r\n locale?: string\r\n) => string;\r\n\r\n\r\nfunction getPluralRule(locale: string): Intl.PluralRules {\r\n if (!pluralRulesCache.has(locale)) {\r\n pluralRulesCache.set(locale, new Intl.PluralRules(locale));\r\n }\r\n return pluralRulesCache.get(locale)!;\r\n}\r\n\r\nfunction escapeRegex(s: string): string {\r\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n\r\n/**\r\n * Default ICU message formatter implementation.\r\n * Supports simple interpolation, pluralization with exact matches, and select.\r\n *\r\n * @param message - ICU format message string\r\n * @param values - Values to interpolate\r\n * @param locale - Locale for plural rules (default: 'en')\r\n * @returns Formatted message string\r\n *\r\n * @example\r\n * defaultFormatICU('{n, plural, =0 {none} one {# item} other {# items}}', { n: 0 }, 'en');\r\n * // Returns: 'none'\r\n *\r\n * @example\r\n * defaultFormatICU('{role, select, admin {Full access} other {Limited access}}', { role: 'admin' });\r\n * // Returns: 'Full access'\r\n */\r\nexport function defaultFormatICU(\r\n message: string,\r\n values?: Record<string, any>,\r\n locale: string = 'en'\r\n): string {\r\n return message.replace(\r\n /\\{(\\w+)(?:, (plural|select),((?:[^{}]*\\{[^{}]*\\})+))?\\}/g,\r\n (_, key, type, categoriesPart) => {\r\n const value = values?.[key];\r\n\r\n if (type === 'plural') {\r\n const exact = new RegExp(\r\n `=${escapeRegex(String(value))}\\\\s*\\\\{([^{}]*)\\\\}`\r\n ).exec(categoriesPart);\r\n if (exact) {\r\n return exact[1]\r\n .replace(`{${key}}`, String(value))\r\n .replace('#', String(value));\r\n }\r\n\r\n const rules = getPluralRule(locale);\r\n const category = rules.select(value);\r\n const match =\r\n new RegExp(`${category}\\\\s*\\\\{([^{}]*)\\\\}`).exec(categoriesPart) ||\r\n new RegExp(`other\\\\s*\\\\{([^{}]*)\\\\}`).exec(categoriesPart);\r\n if (match) {\r\n return match[1]\r\n .replace(`{${key}}`, String(value))\r\n .replace('#', String(value));\r\n }\r\n return String(value);\r\n }\r\n\r\n if (type === 'select') {\r\n const escaped = escapeRegex(String(value));\r\n const match =\r\n new RegExp(`\\\\b${escaped}\\\\s*\\\\{([^{}]*)\\\\}`).exec(categoriesPart) ||\r\n new RegExp(`\\\\bother\\\\s*\\\\{([^{}]*)\\\\}`).exec(categoriesPart);\r\n return match ? match[1] : String(value);\r\n }\r\n\r\n return value !== undefined ? String(value) : `{${key}}`;\r\n },\r\n );\r\n}\r\n\r\n/**\r\n * The active message formatter. Defaults to `defaultFormatICU`.\r\n * Can be replaced with `setMessageFormatter` for custom formatting.\r\n */\r\nexport let formatICU: MessageFormatter = defaultFormatICU;\r\n\r\n/**\r\n * Replaces the default message formatter with a custom implementation.\r\n * Use this to integrate with external i18n libraries like FormatJS.\r\n *\r\n * @param formatter - The custom formatter function\r\n *\r\n * @example\r\n * // Use FormatJS IntlMessageFormat\r\n * import { IntlMessageFormat } from 'intl-messageformat';\r\n *\r\n * setMessageFormatter((message, values, locale) => {\r\n * const fmt = new IntlMessageFormat(message, locale);\r\n * return fmt.format(values);\r\n * });\r\n */\r\nexport function setMessageFormatter(formatter: MessageFormatter) {\r\n formatICU = formatter;\r\n}", "/**\r\n * @module i18n\r\n * Internationalization support with namespace-based translations.\r\n * Uses ICU message format for pluralization, select, and formatting.\r\n *\r\n * @example\r\n * // Initialize locale\r\n * await setLocale('sv');\r\n *\r\n * // Use translations\r\n * const greeting = t('r-common:greeting', { name: 'John' });\r\n * const items = t('shop:items', { count: 5 });\r\n */\r\n\r\nimport { formatICU } from './icu';\r\n\r\ntype Locale = string;\r\ntype Namespace = string;\r\ntype TranslationMap = Record<string, string>;\r\ntype Translations = Record<Namespace, TranslationMap>;\r\n\r\nexport type MissingTranslationHandler = (\r\n key: string,\r\n namespace: string,\r\n locale: string,\r\n) => void;\r\n\r\n/**\r\n * Dispatched on `document` after `setLocale()` completes.\r\n * The `locale` property contains the new normalized locale code.\r\n *\r\n * @example\r\n * document.addEventListener('localechange', (e) => {\r\n * console.log(`Locale changed to ${e.locale}`);\r\n * this.render();\r\n * });\r\n */\r\nexport class LocaleChangeEvent extends Event {\r\n readonly locale: string;\r\n constructor(locale: string) {\r\n super('localechange', { bubbles: false });\r\n this.locale = locale;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface DocumentEventMap {\r\n localechange: LocaleChangeEvent;\r\n }\r\n}\r\n\r\nconst fallbackLocale: Locale = 'en';\r\nlet currentLocale: Locale = fallbackLocale;\r\nconst loadedNamespaces = new Set<Namespace>();\r\nconst translations: Translations = {};\r\nlet missingHandler: MissingTranslationHandler | null = null;\r\n\r\nfunction normalizeLocale(locale: string): string {\r\n return locale.toLowerCase().split('-')[0];\r\n}\r\n\r\n/**\r\n * Sets the current locale and loads the common namespace.\r\n * Clears previously loaded translations and dispatches a `localechange` event.\r\n *\r\n * @param locale - The locale code (e.g., 'en', 'sv', 'en-US')\r\n *\r\n * @example\r\n * await setLocale('sv');\r\n */\r\nexport async function setLocale(locale: string): Promise<void> {\r\n const normalized = normalizeLocale(locale);\r\n currentLocale = normalized;\r\n loadedNamespaces.clear();\r\n Object.keys(translations).forEach(ns => delete translations[ns]);\r\n await loadNamespace('r-common');\r\n if (typeof document !== 'undefined') {\r\n document.dispatchEvent(new LocaleChangeEvent(normalized));\r\n }\r\n}\r\n\r\n/**\r\n * Loads a translation namespace on demand.\r\n * Falls back to the default locale if translations are not found.\r\n *\r\n * @param namespace - The namespace to load (e.g., 'shop', 'errors')\r\n *\r\n * @example\r\n * await loadNamespace('shop');\r\n * const price = t('shop:priceLabel');\r\n */\r\nexport async function loadNamespace(namespace: Namespace): Promise<void> {\r\n if (loadedNamespaces.has(namespace)) return;\r\n\r\n try {\r\n const module = await import(`./locales/${currentLocale}/${namespace}.json`);\r\n translations[namespace] = module.default;\r\n loadedNamespaces.add(namespace);\r\n } catch (err) {\r\n if (currentLocale !== fallbackLocale) {\r\n const fallback = await import(`./locales/${fallbackLocale}/${namespace}.json`);\r\n translations[namespace] = fallback.default;\r\n loadedNamespaces.add(namespace);\r\n } else {\r\n console.warn(`i18n: Failed to load namespace '${namespace}' for locale '${currentLocale}'`);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Loads multiple translation namespaces in parallel.\r\n *\r\n * @param namespaces - Array of namespace names to load\r\n *\r\n * @example\r\n * await loadNamespaces(['r-pipes', 'r-validation']);\r\n */\r\nexport async function loadNamespaces(namespaces: Namespace[]): Promise<void> {\r\n await Promise.all(namespaces.map(ns => loadNamespace(ns)));\r\n}\r\n\r\n/**\r\n * Translates a key with optional value interpolation.\r\n * Supports ICU message format for pluralization and select.\r\n *\r\n * @param fullKey - Translation key in format 'namespace:key' or just 'key' (uses 'r-common')\r\n * @param values - Values to interpolate into the message\r\n * @returns The translated string, or the key if not found\r\n *\r\n * @example\r\n * // Simple translation\r\n * t('greeting'); // Uses r-common:greeting\r\n *\r\n * // With namespace\r\n * t('errors:notFound');\r\n *\r\n * // With interpolation\r\n * t('welcome', { name: 'John' }); // \"Welcome, John!\"\r\n *\r\n * // With pluralization (ICU format)\r\n * t('items', { count: 5 }); // \"5 items\" or \"5 f\u00F6rem\u00E5l\"\r\n */\r\nexport function t(fullKey: string, values?: Record<string, any>): string {\r\n const [namespace, key] = fullKey.includes(':')\r\n ? fullKey.split(':')\r\n : ['r-common', fullKey];\r\n const message = translations[namespace]?.[key];\r\n if (!message) {\r\n if (missingHandler) missingHandler(key, namespace, currentLocale);\r\n return fullKey;\r\n }\r\n try {\r\n return formatICU(message, values, currentLocale) as string;\r\n } catch {\r\n return fullKey;\r\n }\r\n}\r\n\r\n/**\r\n * Returns the current locale code.\r\n *\r\n * @returns The normalized locale code (e.g., 'en', 'sv')\r\n */\r\nexport function getCurrentLocale(): string {\r\n return currentLocale;\r\n}\r\n\r\n/**\r\n * Registers a handler called when `t()` encounters a missing translation key.\r\n * Pass `null` to remove the handler.\r\n *\r\n * @param handler - Callback receiving the key, namespace, and locale\r\n *\r\n * @example\r\n * onMissingTranslation((key, ns, locale) => {\r\n * console.warn(`Missing: ${ns}:${key} [${locale}]`);\r\n * });\r\n */\r\nexport function onMissingTranslation(handler: MissingTranslationHandler | null): void {\r\n missingHandler = handler;\r\n}\r\n"],
|
|
5
|
+
"mappings": "+sBAAA,IAAAA,EAAAC,EAAA,CAAAC,GAAAC,IAAA,CAAAA,EAAA,SACI,SAAY,iBACZ,MAAS,+CACb,ICHA,IAAAC,EAAAC,EAAA,CAAAC,GAAAC,IAAA,CAAAA,EAAA,SACI,MAAS,QACT,UAAa,YACb,QAAW,sDACX,OAAU,oDACd,ICLA,IAAAC,EAAAC,EAAA,CAAAC,GAAAC,IAAA,CAAAA,EAAA,SACI,SAAY,0BACZ,MAAS,wDACT,OAAU,2BACd,ICJA,IAAAC,EAAAC,EAAA,CAAAC,GAAAC,IAAA,CAAAA,EAAA,SACI,SAAY,eACZ,MAAS,8CACb,ICHA,IAAAC,EAAAC,EAAA,CAAAC,GAAAC,IAAA,CAAAA,EAAA,SACI,MAAS,OACT,UAAa,UACb,QAAW,2DACX,OAAU,kDACd,ICLA,IAAAC,EAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAA,SACI,SAAY,qCACZ,MAAS,4DACT,OAAU,sBACd,ICJA,IAAAC,GAAA,GAAAC,EAAAD,GAAA,uBAAAE,EAAA,cAAAC,EAAA,qBAAAC,EAAA,kBAAAC,EAAA,mBAAAC,EAAA,yBAAAC,EAAA,cAAAC,EAAA,wBAAAC,EAAA,MAAAC,IAAA,eAAAC,EAAAX,ICqBA,IAAMY,EAAmB,IAAI,IAa7B,SAASC,EAAcC,EAAkC,CACrD,OAAKF,EAAiB,IAAIE,CAAM,GAC5BF,EAAiB,IAAIE,EAAQ,IAAI,KAAK,YAAYA,CAAM,CAAC,EAEtDF,EAAiB,IAAIE,CAAM,CACtC,CAEA,SAASC,EAAYC,EAAmB,CACpC,OAAOA,EAAE,QAAQ,sBAAuB,MAAM,CAClD,CAmBO,SAASC,EACZC,EACAC,EACAL,EAAiB,KACX,CACN,OAAOI,EAAQ,QACX,2DACA,CAACE,EAAGC,EAAKC,EAAMC,IAAmB,CAC9B,IAAMC,EAAQL,IAASE,CAAG,EAE1B,GAAIC,IAAS,SAAU,CACnB,IAAMG,EAAQ,IAAI,OACd,IAAIV,EAAY,OAAOS,CAAK,CAAC,CAAC,oBAClC,EAAE,KAAKD,CAAc,EACrB,GAAIE,EACA,OAAOA,EAAM,CAAC,EACT,QAAQ,IAAIJ,CAAG,IAAK,OAAOG,CAAK,CAAC,EACjC,QAAQ,IAAK,OAAOA,CAAK,CAAC,EAInC,IAAME,EADQb,EAAcC,CAAM,EACX,OAAOU,CAAK,EAC7BG,EACF,IAAI,OAAO,GAAGD,CAAQ,oBAAoB,EAAE,KAAKH,CAAc,GAC/D,IAAI,OAAO,yBAAyB,EAAE,KAAKA,CAAc,EAC7D,OAAII,EACOA,EAAM,CAAC,EACT,QAAQ,IAAIN,CAAG,IAAK,OAAOG,CAAK,CAAC,EACjC,QAAQ,IAAK,OAAOA,CAAK,CAAC,EAE5B,OAAOA,CAAK,CACvB,CAEA,GAAIF,IAAS,SAAU,CACnB,IAAMM,EAAUb,EAAY,OAAOS,CAAK,CAAC,EACnCG,EACF,IAAI,OAAO,MAAMC,CAAO,oBAAoB,EAAE,KAAKL,CAAc,GACjE,IAAI,OAAO,4BAA4B,EAAE,KAAKA,CAAc,EAChE,OAAOI,EAAQA,EAAM,CAAC,EAAI,OAAOH,CAAK,CAC1C,CAEA,OAAOA,IAAU,OAAY,OAAOA,CAAK,EAAI,IAAIH,CAAG,GACxD,CACJ,CACJ,CAMO,IAAIQ,EAA8BZ,EAiBlC,SAASa,EAAoBC,EAA6B,CAC7DF,EAAYE,CAChB,0aC9FO,IAAMC,EAAN,cAAgC,KAAM,CAEzC,YAAYC,EAAgB,CACxB,MAAM,eAAgB,CAAE,QAAS,EAAM,CAAC,EACxC,KAAK,OAASA,CAClB,CACJ,EAQMC,EAAyB,KAC3BC,EAAwBD,EACtBE,EAAmB,IAAI,IACvBC,EAA6B,CAAC,EAChCC,EAAmD,KAEvD,SAASC,GAAgBN,EAAwB,CAC7C,OAAOA,EAAO,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAC5C,CAWA,eAAsBO,EAAUP,EAA+B,CAC3D,IAAMQ,EAAaF,GAAgBN,CAAM,EACzCE,EAAgBM,EAChBL,EAAiB,MAAM,EACvB,OAAO,KAAKC,CAAY,EAAE,QAAQK,GAAM,OAAOL,EAAaK,CAAE,CAAC,EAC/D,MAAMC,EAAc,UAAU,EAC1B,OAAO,SAAa,KACpB,SAAS,cAAc,IAAIX,EAAkBS,CAAU,CAAC,CAEhE,CAYA,eAAsBE,EAAcC,EAAqC,CACrE,GAAI,CAAAR,EAAiB,IAAIQ,CAAS,EAElC,GAAI,CACA,IAAMC,EAAS,MAAaC,EAAA,aAAaX,CAAa,IAAIS,CAAS,SACnEP,EAAaO,CAAS,EAAIC,EAAO,QACjCT,EAAiB,IAAIQ,CAAS,CAClC,MAAc,CACV,GAAIT,IAAkBD,EAAgB,CAClC,IAAMa,EAAW,MAAaD,EAAA,aAAaZ,CAAc,IAAIU,CAAS,SACtEP,EAAaO,CAAS,EAAIG,EAAS,QACnCX,EAAiB,IAAIQ,CAAS,CAClC,MACI,QAAQ,KAAK,mCAAmCA,CAAS,iBAAiBT,CAAa,GAAG,CAElG,CACJ,CAUA,eAAsBa,EAAeC,EAAwC,CACzE,MAAM,QAAQ,IAAIA,EAAW,IAAIP,GAAMC,EAAcD,CAAE,CAAC,CAAC,CAC7D,CAuBO,SAASQ,EAAEC,EAAiBC,EAAsC,CACrE,GAAM,CAACR,EAAWS,CAAG,EAAIF,EAAQ,SAAS,GAAG,EACvCA,EAAQ,MAAM,GAAG,EACjB,CAAC,WAAYA,CAAO,EACpBG,EAAUjB,EAAaO,CAAS,IAAIS,CAAG,EAC7C,GAAI,CAACC,EACD,OAAIhB,GAAgBA,EAAee,EAAKT,EAAWT,CAAa,EACzDgB,EAEX,GAAI,CACA,OAAOI,EAAUD,EAASF,EAAQjB,CAAa,CACnD,MAAQ,CACJ,OAAOgB,CACX,CACJ,CAOO,SAASK,GAA2B,CACvC,OAAOrB,CACX,CAaO,SAASsB,EAAqBC,EAAiD,CAClFpB,EAAiBoB,CACrB",
|
|
6
6
|
"names": ["require_r_common", "__commonJSMin", "exports", "module", "require_r_pipes", "__commonJSMin", "exports", "module", "require_r_validation", "__commonJSMin", "exports", "module", "require_r_common", "__commonJSMin", "exports", "module", "require_r_pipes", "__commonJSMin", "exports", "module", "require_r_validation", "__commonJSMin", "exports", "module", "index_exports", "__export", "LocaleChangeEvent", "formatICU", "getCurrentLocale", "loadNamespace", "loadNamespaces", "onMissingTranslation", "setLocale", "setMessageFormatter", "t", "__toCommonJS", "pluralRulesCache", "getPluralRule", "locale", "escapeRegex", "s", "defaultFormatICU", "message", "values", "_", "key", "type", "categoriesPart", "value", "exact", "category", "match", "escaped", "formatICU", "setMessageFormatter", "formatter", "LocaleChangeEvent", "locale", "fallbackLocale", "currentLocale", "loadedNamespaces", "translations", "missingHandler", "normalizeLocale", "setLocale", "normalized", "ns", "loadNamespace", "namespace", "module", "globImport_locales_json", "fallback", "loadNamespaces", "namespaces", "t", "fullKey", "values", "key", "message", "formatICU", "getCurrentLocale", "onMissingTranslation", "handler"]
|
|
7
7
|
}
|
package/dist/i18n/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var I=Object.create;var $=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var U=Object.getPrototypeOf,j=Object.prototype.hasOwnProperty;var b=e=>t=>{var n=e[t];if(n)return n();throw new Error("Module not found in bundle: "+t)};var i=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var q=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of P(t))!j.call(e,r)&&r!==n&&$(e,r,{get:()=>t[r],enumerable:!(o=k(t,r))||o.enumerable});return e};var l=(e,t,n)=>(n=e!=null?I(U(e)):{},q(t||!e||!e.__esModule?$(n,"default",{value:e,enumerable:!0}):n,e));var L=i((ne,O)=>{O.exports={greeting:"Hello, {name}!",items:"{count, plural, one {# item} other {# items}}"}});var T=i((re,_)=>{_.exports={today:"today",yesterday:"yesterday",daysAgo:"{count, plural, one {# day ago} other {# days ago}}",pieces:"{count, plural, =0 {none} one {one} other {# pcs}}"}});var N=i((ae,B)=>{B.exports={required:"This field is required.",range:"Number must be between {min} and {max}, was {actual}.",digits:"Please enter only digits."}});var E=i((se,G)=>{G.exports={greeting:"Hej, {name}!",items:"{count, plural, one {# sak} other {# saker}}"}});var S=i((oe,J)=>{J.exports={today:"idag",yesterday:"ig\xE5r",daysAgo:"{count, plural, one {# dag sedan} other {# dagar sedan}}",pieces:"{count, plural, =0 {inga} one {en} other {# st}}"}});var C=i((ie,Q)=>{Q.exports={required:"Detta f\xE4lt \xE4r obligatoriskt.",range:"Talet m\xE5ste vara mellan {min} och {max}, var {actual}.",digits:"Ange endast siffror."}});var x=new Map;function A(e){return x.has(e)||x.set(e,new Intl.PluralRules(e)),x.get(e)}function v(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function z(e,t,n="en"){return e.replace(/\{(\w+)(?:, (plural|select),((?:[^{}]*\{[^{}]*\})+))?\}/g,(o,r,M,c)=>{let a=t[r];if(M==="plural"){let u=new RegExp(`=${v(String(a))}\\s*\\{([^{}]*)\\}`).exec(c);if(u)return u[1].replace(`{${r}}`,String(a)).replace("#",String(a));let H=A(n).select(a),R=new RegExp(`${H}\\s*\\{([^{}]*)\\}`).exec(c)||new RegExp("other\\s*\\{([^{}]*)\\}").exec(c);return R?R[1].replace(`{${r}}`,String(a)).replace("#",String(a)):String(a)}if(M==="select"){let u=v(String(a)),f=new RegExp(`\\b${u}\\s*\\{([^{}]*)\\}`).exec(c)||new RegExp("\\bother\\s*\\{([^{}]*)\\}").exec(c);return f?f[1]:String(a)}return a!==void 0?String(a):`{${r}}`})}var d=z;function D(e){d=e}var F=b({"./locales/en/r-common.json":()=>Promise.resolve().then(()=>l(L())),"./locales/en/r-pipes.json":()=>Promise.resolve().then(()=>l(T())),"./locales/en/r-validation.json":()=>Promise.resolve().then(()=>l(N())),"./locales/sv/r-common.json":()=>Promise.resolve().then(()=>l(E())),"./locales/sv/r-pipes.json":()=>Promise.resolve().then(()=>l(S())),"./locales/sv/r-validation.json":()=>Promise.resolve().then(()=>l(C()))});var m=class extends Event{constructor(t){super("localechange",{bubbles:!1}),this.locale=t}},y="en",s=y,p=new Set,g={},h=null;function V(e){return e.toLowerCase().split("-")[0]}async function W(e){let t=V(e);s=t,p.clear(),Object.keys(g).forEach(n=>delete g[n]),await w("r-common"),typeof document<"u"&&document.dispatchEvent(new m(t))}async function w(e){if(!p.has(e))try{let t=await F(`./locales/${s}/${e}.json`);g[e]=t.default,p.add(e)}catch{if(s!==y){let n=await F(`./locales/${y}/${e}.json`);g[e]=n.default,p.add(e)}else console.warn(`i18n: Failed to load namespace '${e}' for locale '${s}'`)}}async function X(e){await Promise.all(e.map(t=>w(t)))}function Y(e,t){let[n,o]=e.includes(":")?e.split(":"):["r-common",e],r=g[n]?.[o];if(!r)return h&&h(o,n,s),e;try{return d(r,t,s)}catch{return e}}function Z(){return s}function K(e){h=e}export{m as LocaleChangeEvent,d as formatICU,Z as getCurrentLocale,w as loadNamespace,X as loadNamespaces,K as onMissingTranslation,W as setLocale,D as setMessageFormatter,Y as t};
|
|
1
|
+
var I=Object.create;var $=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var U=Object.getPrototypeOf,j=Object.prototype.hasOwnProperty;var b=e=>t=>{var n=e[t];if(n)return n();throw new Error("Module not found in bundle: "+t)};var i=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var q=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of P(t))!j.call(e,r)&&r!==n&&$(e,r,{get:()=>t[r],enumerable:!(o=k(t,r))||o.enumerable});return e};var l=(e,t,n)=>(n=e!=null?I(U(e)):{},q(t||!e||!e.__esModule?$(n,"default",{value:e,enumerable:!0}):n,e));var L=i((ne,O)=>{O.exports={greeting:"Hello, {name}!",items:"{count, plural, one {# item} other {# items}}"}});var T=i((re,_)=>{_.exports={today:"today",yesterday:"yesterday",daysAgo:"{count, plural, one {# day ago} other {# days ago}}",pieces:"{count, plural, =0 {none} one {one} other {# pcs}}"}});var N=i((ae,B)=>{B.exports={required:"This field is required.",range:"Number must be between {min} and {max}, was {actual}.",digits:"Please enter only digits."}});var E=i((se,G)=>{G.exports={greeting:"Hej, {name}!",items:"{count, plural, one {# sak} other {# saker}}"}});var S=i((oe,J)=>{J.exports={today:"idag",yesterday:"ig\xE5r",daysAgo:"{count, plural, one {# dag sedan} other {# dagar sedan}}",pieces:"{count, plural, =0 {inga} one {en} other {# st}}"}});var C=i((ie,Q)=>{Q.exports={required:"Detta f\xE4lt \xE4r obligatoriskt.",range:"Talet m\xE5ste vara mellan {min} och {max}, var {actual}.",digits:"Ange endast siffror."}});var x=new Map;function A(e){return x.has(e)||x.set(e,new Intl.PluralRules(e)),x.get(e)}function v(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function z(e,t,n="en"){return e.replace(/\{(\w+)(?:, (plural|select),((?:[^{}]*\{[^{}]*\})+))?\}/g,(o,r,M,c)=>{let a=t?.[r];if(M==="plural"){let u=new RegExp(`=${v(String(a))}\\s*\\{([^{}]*)\\}`).exec(c);if(u)return u[1].replace(`{${r}}`,String(a)).replace("#",String(a));let H=A(n).select(a),R=new RegExp(`${H}\\s*\\{([^{}]*)\\}`).exec(c)||new RegExp("other\\s*\\{([^{}]*)\\}").exec(c);return R?R[1].replace(`{${r}}`,String(a)).replace("#",String(a)):String(a)}if(M==="select"){let u=v(String(a)),f=new RegExp(`\\b${u}\\s*\\{([^{}]*)\\}`).exec(c)||new RegExp("\\bother\\s*\\{([^{}]*)\\}").exec(c);return f?f[1]:String(a)}return a!==void 0?String(a):`{${r}}`})}var d=z;function D(e){d=e}var F=b({"./locales/en/r-common.json":()=>Promise.resolve().then(()=>l(L())),"./locales/en/r-pipes.json":()=>Promise.resolve().then(()=>l(T())),"./locales/en/r-validation.json":()=>Promise.resolve().then(()=>l(N())),"./locales/sv/r-common.json":()=>Promise.resolve().then(()=>l(E())),"./locales/sv/r-pipes.json":()=>Promise.resolve().then(()=>l(S())),"./locales/sv/r-validation.json":()=>Promise.resolve().then(()=>l(C()))});var m=class extends Event{constructor(t){super("localechange",{bubbles:!1}),this.locale=t}},y="en",s=y,p=new Set,g={},h=null;function V(e){return e.toLowerCase().split("-")[0]}async function W(e){let t=V(e);s=t,p.clear(),Object.keys(g).forEach(n=>delete g[n]),await w("r-common"),typeof document<"u"&&document.dispatchEvent(new m(t))}async function w(e){if(!p.has(e))try{let t=await F(`./locales/${s}/${e}.json`);g[e]=t.default,p.add(e)}catch{if(s!==y){let n=await F(`./locales/${y}/${e}.json`);g[e]=n.default,p.add(e)}else console.warn(`i18n: Failed to load namespace '${e}' for locale '${s}'`)}}async function X(e){await Promise.all(e.map(t=>w(t)))}function Y(e,t){let[n,o]=e.includes(":")?e.split(":"):["r-common",e],r=g[n]?.[o];if(!r)return h&&h(o,n,s),e;try{return d(r,t,s)}catch{return e}}function Z(){return s}function K(e){h=e}export{m as LocaleChangeEvent,d as formatICU,Z as getCurrentLocale,w as loadNamespace,X as loadNamespaces,K as onMissingTranslation,W as setLocale,D as setMessageFormatter,Y as t};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/i18n/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/i18n/locales/en/r-common.json", "../../src/i18n/locales/en/r-pipes.json", "../../src/i18n/locales/en/r-validation.json", "../../src/i18n/locales/sv/r-common.json", "../../src/i18n/locales/sv/r-pipes.json", "../../src/i18n/locales/sv/r-validation.json", "../../src/i18n/icu.ts", "../../src/i18n/i18n.ts"],
|
|
4
|
-
"sourcesContent": ["{\r\n \"greeting\": \"Hello, {name}!\",\r\n \"items\": \"{count, plural, one {# item} other {# items}}\"\r\n}\r\n", "{\r\n \"today\": \"today\",\r\n \"yesterday\": \"yesterday\",\r\n \"daysAgo\": \"{count, plural, one {# day ago} other {# days ago}}\",\r\n \"pieces\": \"{count, plural, =0 {none} one {one} other {# pcs}}\"\r\n}\r\n", "{\r\n \"required\": \"This field is required.\",\r\n \"range\": \"Number must be between {min} and {max}, was {actual}.\",\r\n \"digits\": \"Please enter only digits.\"\r\n}\r\n", "{\r\n \"greeting\": \"Hej, {name}!\",\r\n \"items\": \"{count, plural, one {# sak} other {# saker}}\"\r\n}\r\n", "{\r\n \"today\": \"idag\",\r\n \"yesterday\": \"ig\u00E5r\",\r\n \"daysAgo\": \"{count, plural, one {# dag sedan} other {# dagar sedan}}\",\r\n \"pieces\": \"{count, plural, =0 {inga} one {en} other {# st}}\"\r\n}\r\n", "{\r\n \"required\": \"Detta f\u00E4lt \u00E4r obligatoriskt.\",\r\n \"range\": \"Talet m\u00E5ste vara mellan {min} och {max}, var {actual}.\",\r\n \"digits\": \"Ange endast siffror.\"\r\n}\r\n", "/**\r\n * @module icu\r\n * ICU message format support for internationalization.\r\n * Provides pluralization, select, and value interpolation.\r\n *\r\n * @example\r\n * // Simple interpolation\r\n * formatICU('Hello, {name}!', { name: 'World' });\r\n * // Returns: 'Hello, World!'\r\n *\r\n * @example\r\n * // Pluralization\r\n * formatICU('{count, plural, one {# item} other {# items}}', { count: 5 });\r\n * // Returns: '5 items'\r\n *\r\n * @example\r\n * // Select\r\n * formatICU('{gender, select, male {He} female {She} other {They}}', { gender: 'female' });\r\n * // Returns: 'She'\r\n */\r\n\r\nconst pluralRulesCache = new Map<string, Intl.PluralRules>();\r\n\r\n/**\r\n * Function type for message formatters.\r\n * Implement this to provide custom message formatting.\r\n */\r\nexport type MessageFormatter = (\r\n message: string,\r\n values?: Record<string, any>,\r\n locale?: string\r\n) => string;\r\n\r\n\r\nfunction getPluralRule(locale: string): Intl.PluralRules {\r\n if (!pluralRulesCache.has(locale)) {\r\n pluralRulesCache.set(locale, new Intl.PluralRules(locale));\r\n }\r\n return pluralRulesCache.get(locale)!;\r\n}\r\n\r\nfunction escapeRegex(s: string): string {\r\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n\r\n/**\r\n * Default ICU message formatter implementation.\r\n * Supports simple interpolation, pluralization with exact matches, and select.\r\n *\r\n * @param message - ICU format message string\r\n * @param values - Values to interpolate\r\n * @param locale - Locale for plural rules (default: 'en')\r\n * @returns Formatted message string\r\n *\r\n * @example\r\n * defaultFormatICU('{n, plural, =0 {none} one {# item} other {# items}}', { n: 0 }, 'en');\r\n * // Returns: 'none'\r\n *\r\n * @example\r\n * defaultFormatICU('{role, select, admin {Full access} other {Limited access}}', { role: 'admin' });\r\n * // Returns: 'Full access'\r\n */\r\nexport function defaultFormatICU(\r\n message: string,\r\n values: Record<string, any>,\r\n locale: string = 'en'\r\n): string {\r\n return message.replace(\r\n /\\{(\\w+)(?:, (plural|select),((?:[^{}]*\\{[^{}]*\\})+))?\\}/g,\r\n (_, key, type, categoriesPart) => {\r\n const value = values[key];\r\n\r\n if (type === 'plural') {\r\n const exact = new RegExp(\r\n `=${escapeRegex(String(value))}\\\\s*\\\\{([^{}]*)\\\\}`\r\n ).exec(categoriesPart);\r\n if (exact) {\r\n return exact[1]\r\n .replace(`{${key}}`, String(value))\r\n .replace('#', String(value));\r\n }\r\n\r\n const rules = getPluralRule(locale);\r\n const category = rules.select(value);\r\n const match =\r\n new RegExp(`${category}\\\\s*\\\\{([^{}]*)\\\\}`).exec(categoriesPart) ||\r\n new RegExp(`other\\\\s*\\\\{([^{}]*)\\\\}`).exec(categoriesPart);\r\n if (match) {\r\n return match[1]\r\n .replace(`{${key}}`, String(value))\r\n .replace('#', String(value));\r\n }\r\n return String(value);\r\n }\r\n\r\n if (type === 'select') {\r\n const escaped = escapeRegex(String(value));\r\n const match =\r\n new RegExp(`\\\\b${escaped}\\\\s*\\\\{([^{}]*)\\\\}`).exec(categoriesPart) ||\r\n new RegExp(`\\\\bother\\\\s*\\\\{([^{}]*)\\\\}`).exec(categoriesPart);\r\n return match ? match[1] : String(value);\r\n }\r\n\r\n return value !== undefined ? String(value) : `{${key}}`;\r\n },\r\n );\r\n}\r\n\r\n/**\r\n * The active message formatter. Defaults to `defaultFormatICU`.\r\n * Can be replaced with `setMessageFormatter` for custom formatting.\r\n */\r\nexport let formatICU: MessageFormatter = defaultFormatICU;\r\n\r\n/**\r\n * Replaces the default message formatter with a custom implementation.\r\n * Use this to integrate with external i18n libraries like FormatJS.\r\n *\r\n * @param formatter - The custom formatter function\r\n *\r\n * @example\r\n * // Use FormatJS IntlMessageFormat\r\n * import { IntlMessageFormat } from 'intl-messageformat';\r\n *\r\n * setMessageFormatter((message, values, locale) => {\r\n * const fmt = new IntlMessageFormat(message, locale);\r\n * return fmt.format(values);\r\n * });\r\n */\r\nexport function setMessageFormatter(formatter: MessageFormatter) {\r\n formatICU = formatter;\r\n}", "/**\r\n * @module i18n\r\n * Internationalization support with namespace-based translations.\r\n * Uses ICU message format for pluralization, select, and formatting.\r\n *\r\n * @example\r\n * // Initialize locale\r\n * await setLocale('sv');\r\n *\r\n * // Use translations\r\n * const greeting = t('r-common:greeting', { name: 'John' });\r\n * const items = t('shop:items', { count: 5 });\r\n */\r\n\r\nimport { formatICU } from './icu';\r\n\r\ntype Locale = string;\r\ntype Namespace = string;\r\ntype TranslationMap = Record<string, string>;\r\ntype Translations = Record<Namespace, TranslationMap>;\r\n\r\nexport type MissingTranslationHandler = (\r\n key: string,\r\n namespace: string,\r\n locale: string,\r\n) => void;\r\n\r\n/**\r\n * Dispatched on `document` after `setLocale()` completes.\r\n * The `locale` property contains the new normalized locale code.\r\n *\r\n * @example\r\n * document.addEventListener('localechange', (e) => {\r\n * console.log(`Locale changed to ${e.locale}`);\r\n * this.render();\r\n * });\r\n */\r\nexport class LocaleChangeEvent extends Event {\r\n readonly locale: string;\r\n constructor(locale: string) {\r\n super('localechange', { bubbles: false });\r\n this.locale = locale;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface DocumentEventMap {\r\n localechange: LocaleChangeEvent;\r\n }\r\n}\r\n\r\nconst fallbackLocale: Locale = 'en';\r\nlet currentLocale: Locale = fallbackLocale;\r\nconst loadedNamespaces = new Set<Namespace>();\r\nconst translations: Translations = {};\r\nlet missingHandler: MissingTranslationHandler | null = null;\r\n\r\nfunction normalizeLocale(locale: string): string {\r\n return locale.toLowerCase().split('-')[0];\r\n}\r\n\r\n/**\r\n * Sets the current locale and loads the common namespace.\r\n * Clears previously loaded translations and dispatches a `localechange` event.\r\n *\r\n * @param locale - The locale code (e.g., 'en', 'sv', 'en-US')\r\n *\r\n * @example\r\n * await setLocale('sv');\r\n */\r\nexport async function setLocale(locale: string): Promise<void> {\r\n const normalized = normalizeLocale(locale);\r\n currentLocale = normalized;\r\n loadedNamespaces.clear();\r\n Object.keys(translations).forEach(ns => delete translations[ns]);\r\n await loadNamespace('r-common');\r\n if (typeof document !== 'undefined') {\r\n document.dispatchEvent(new LocaleChangeEvent(normalized));\r\n }\r\n}\r\n\r\n/**\r\n * Loads a translation namespace on demand.\r\n * Falls back to the default locale if translations are not found.\r\n *\r\n * @param namespace - The namespace to load (e.g., 'shop', 'errors')\r\n *\r\n * @example\r\n * await loadNamespace('shop');\r\n * const price = t('shop:priceLabel');\r\n */\r\nexport async function loadNamespace(namespace: Namespace): Promise<void> {\r\n if (loadedNamespaces.has(namespace)) return;\r\n\r\n try {\r\n const module = await import(`./locales/${currentLocale}/${namespace}.json`);\r\n translations[namespace] = module.default;\r\n loadedNamespaces.add(namespace);\r\n } catch (err) {\r\n if (currentLocale !== fallbackLocale) {\r\n const fallback = await import(`./locales/${fallbackLocale}/${namespace}.json`);\r\n translations[namespace] = fallback.default;\r\n loadedNamespaces.add(namespace);\r\n } else {\r\n console.warn(`i18n: Failed to load namespace '${namespace}' for locale '${currentLocale}'`);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Loads multiple translation namespaces in parallel.\r\n *\r\n * @param namespaces - Array of namespace names to load\r\n *\r\n * @example\r\n * await loadNamespaces(['r-pipes', 'r-validation']);\r\n */\r\nexport async function loadNamespaces(namespaces: Namespace[]): Promise<void> {\r\n await Promise.all(namespaces.map(ns => loadNamespace(ns)));\r\n}\r\n\r\n/**\r\n * Translates a key with optional value interpolation.\r\n * Supports ICU message format for pluralization and select.\r\n *\r\n * @param fullKey - Translation key in format 'namespace:key' or just 'key' (uses 'r-common')\r\n * @param values - Values to interpolate into the message\r\n * @returns The translated string, or the key if not found\r\n *\r\n * @example\r\n * // Simple translation\r\n * t('greeting'); // Uses r-common:greeting\r\n *\r\n * // With namespace\r\n * t('errors:notFound');\r\n *\r\n * // With interpolation\r\n * t('welcome', { name: 'John' }); // \"Welcome, John!\"\r\n *\r\n * // With pluralization (ICU format)\r\n * t('items', { count: 5 }); // \"5 items\" or \"5 f\u00F6rem\u00E5l\"\r\n */\r\nexport function t(fullKey: string, values?: Record<string, any>): string {\r\n const [namespace, key] = fullKey.includes(':')\r\n ? fullKey.split(':')\r\n : ['r-common', fullKey];\r\n const message = translations[namespace]?.[key];\r\n if (!message) {\r\n if (missingHandler) missingHandler(key, namespace, currentLocale);\r\n return fullKey;\r\n }\r\n try {\r\n return formatICU(message, values, currentLocale) as string;\r\n } catch {\r\n return fullKey;\r\n }\r\n}\r\n\r\n/**\r\n * Returns the current locale code.\r\n *\r\n * @returns The normalized locale code (e.g., 'en', 'sv')\r\n */\r\nexport function getCurrentLocale(): string {\r\n return currentLocale;\r\n}\r\n\r\n/**\r\n * Registers a handler called when `t()` encounters a missing translation key.\r\n * Pass `null` to remove the handler.\r\n *\r\n * @param handler - Callback receiving the key, namespace, and locale\r\n *\r\n * @example\r\n * onMissingTranslation((key, ns, locale) => {\r\n * console.warn(`Missing: ${ns}:${key} [${locale}]`);\r\n * });\r\n */\r\nexport function onMissingTranslation(handler: MissingTranslationHandler | null): void {\r\n missingHandler = handler;\r\n}\r\n"],
|
|
5
|
-
"mappings": "omBAAA,IAAAA,EAAAC,EAAA,CAAAC,GAAAC,IAAA,CAAAA,EAAA,SACI,SAAY,iBACZ,MAAS,+CACb,ICHA,IAAAC,EAAAC,EAAA,CAAAC,GAAAC,IAAA,CAAAA,EAAA,SACI,MAAS,QACT,UAAa,YACb,QAAW,sDACX,OAAU,oDACd,ICLA,IAAAC,EAAAC,EAAA,CAAAC,GAAAC,IAAA,CAAAA,EAAA,SACI,SAAY,0BACZ,MAAS,wDACT,OAAU,2BACd,ICJA,IAAAC,EAAAC,EAAA,CAAAC,GAAAC,IAAA,CAAAA,EAAA,SACI,SAAY,eACZ,MAAS,8CACb,ICHA,IAAAC,EAAAC,EAAA,CAAAC,GAAAC,IAAA,CAAAA,EAAA,SACI,MAAS,OACT,UAAa,UACb,QAAW,2DACX,OAAU,kDACd,ICLA,IAAAC,EAAAC,EAAA,CAAAC,GAAAC,IAAA,CAAAA,EAAA,SACI,SAAY,qCACZ,MAAS,4DACT,OAAU,sBACd,ICiBA,IAAMC,EAAmB,IAAI,IAa7B,SAASC,EAAcC,EAAkC,CACrD,OAAKF,EAAiB,IAAIE,CAAM,GAC5BF,EAAiB,IAAIE,EAAQ,IAAI,KAAK,YAAYA,CAAM,CAAC,EAEtDF,EAAiB,IAAIE,CAAM,CACtC,CAEA,SAASC,EAAYC,EAAmB,CACpC,OAAOA,EAAE,QAAQ,sBAAuB,MAAM,CAClD,CAmBO,SAASC,EACZC,EACAC,EACAL,EAAiB,KACX,CACN,OAAOI,EAAQ,QACX,2DACA,CAACE,EAAGC,EAAKC,EAAMC,IAAmB,CAC9B,IAAMC,EAAQL,
|
|
4
|
+
"sourcesContent": ["{\r\n \"greeting\": \"Hello, {name}!\",\r\n \"items\": \"{count, plural, one {# item} other {# items}}\"\r\n}\r\n", "{\r\n \"today\": \"today\",\r\n \"yesterday\": \"yesterday\",\r\n \"daysAgo\": \"{count, plural, one {# day ago} other {# days ago}}\",\r\n \"pieces\": \"{count, plural, =0 {none} one {one} other {# pcs}}\"\r\n}\r\n", "{\r\n \"required\": \"This field is required.\",\r\n \"range\": \"Number must be between {min} and {max}, was {actual}.\",\r\n \"digits\": \"Please enter only digits.\"\r\n}\r\n", "{\r\n \"greeting\": \"Hej, {name}!\",\r\n \"items\": \"{count, plural, one {# sak} other {# saker}}\"\r\n}\r\n", "{\r\n \"today\": \"idag\",\r\n \"yesterday\": \"ig\u00E5r\",\r\n \"daysAgo\": \"{count, plural, one {# dag sedan} other {# dagar sedan}}\",\r\n \"pieces\": \"{count, plural, =0 {inga} one {en} other {# st}}\"\r\n}\r\n", "{\r\n \"required\": \"Detta f\u00E4lt \u00E4r obligatoriskt.\",\r\n \"range\": \"Talet m\u00E5ste vara mellan {min} och {max}, var {actual}.\",\r\n \"digits\": \"Ange endast siffror.\"\r\n}\r\n", "/**\r\n * @module icu\r\n * ICU message format support for internationalization.\r\n * Provides pluralization, select, and value interpolation.\r\n *\r\n * @example\r\n * // Simple interpolation\r\n * formatICU('Hello, {name}!', { name: 'World' });\r\n * // Returns: 'Hello, World!'\r\n *\r\n * @example\r\n * // Pluralization\r\n * formatICU('{count, plural, one {# item} other {# items}}', { count: 5 });\r\n * // Returns: '5 items'\r\n *\r\n * @example\r\n * // Select\r\n * formatICU('{gender, select, male {He} female {She} other {They}}', { gender: 'female' });\r\n * // Returns: 'She'\r\n */\r\n\r\nconst pluralRulesCache = new Map<string, Intl.PluralRules>();\r\n\r\n/**\r\n * Function type for message formatters.\r\n * Implement this to provide custom message formatting.\r\n */\r\nexport type MessageFormatter = (\r\n message: string,\r\n values?: Record<string, any>,\r\n locale?: string\r\n) => string;\r\n\r\n\r\nfunction getPluralRule(locale: string): Intl.PluralRules {\r\n if (!pluralRulesCache.has(locale)) {\r\n pluralRulesCache.set(locale, new Intl.PluralRules(locale));\r\n }\r\n return pluralRulesCache.get(locale)!;\r\n}\r\n\r\nfunction escapeRegex(s: string): string {\r\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n\r\n/**\r\n * Default ICU message formatter implementation.\r\n * Supports simple interpolation, pluralization with exact matches, and select.\r\n *\r\n * @param message - ICU format message string\r\n * @param values - Values to interpolate\r\n * @param locale - Locale for plural rules (default: 'en')\r\n * @returns Formatted message string\r\n *\r\n * @example\r\n * defaultFormatICU('{n, plural, =0 {none} one {# item} other {# items}}', { n: 0 }, 'en');\r\n * // Returns: 'none'\r\n *\r\n * @example\r\n * defaultFormatICU('{role, select, admin {Full access} other {Limited access}}', { role: 'admin' });\r\n * // Returns: 'Full access'\r\n */\r\nexport function defaultFormatICU(\r\n message: string,\r\n values?: Record<string, any>,\r\n locale: string = 'en'\r\n): string {\r\n return message.replace(\r\n /\\{(\\w+)(?:, (plural|select),((?:[^{}]*\\{[^{}]*\\})+))?\\}/g,\r\n (_, key, type, categoriesPart) => {\r\n const value = values?.[key];\r\n\r\n if (type === 'plural') {\r\n const exact = new RegExp(\r\n `=${escapeRegex(String(value))}\\\\s*\\\\{([^{}]*)\\\\}`\r\n ).exec(categoriesPart);\r\n if (exact) {\r\n return exact[1]\r\n .replace(`{${key}}`, String(value))\r\n .replace('#', String(value));\r\n }\r\n\r\n const rules = getPluralRule(locale);\r\n const category = rules.select(value);\r\n const match =\r\n new RegExp(`${category}\\\\s*\\\\{([^{}]*)\\\\}`).exec(categoriesPart) ||\r\n new RegExp(`other\\\\s*\\\\{([^{}]*)\\\\}`).exec(categoriesPart);\r\n if (match) {\r\n return match[1]\r\n .replace(`{${key}}`, String(value))\r\n .replace('#', String(value));\r\n }\r\n return String(value);\r\n }\r\n\r\n if (type === 'select') {\r\n const escaped = escapeRegex(String(value));\r\n const match =\r\n new RegExp(`\\\\b${escaped}\\\\s*\\\\{([^{}]*)\\\\}`).exec(categoriesPart) ||\r\n new RegExp(`\\\\bother\\\\s*\\\\{([^{}]*)\\\\}`).exec(categoriesPart);\r\n return match ? match[1] : String(value);\r\n }\r\n\r\n return value !== undefined ? String(value) : `{${key}}`;\r\n },\r\n );\r\n}\r\n\r\n/**\r\n * The active message formatter. Defaults to `defaultFormatICU`.\r\n * Can be replaced with `setMessageFormatter` for custom formatting.\r\n */\r\nexport let formatICU: MessageFormatter = defaultFormatICU;\r\n\r\n/**\r\n * Replaces the default message formatter with a custom implementation.\r\n * Use this to integrate with external i18n libraries like FormatJS.\r\n *\r\n * @param formatter - The custom formatter function\r\n *\r\n * @example\r\n * // Use FormatJS IntlMessageFormat\r\n * import { IntlMessageFormat } from 'intl-messageformat';\r\n *\r\n * setMessageFormatter((message, values, locale) => {\r\n * const fmt = new IntlMessageFormat(message, locale);\r\n * return fmt.format(values);\r\n * });\r\n */\r\nexport function setMessageFormatter(formatter: MessageFormatter) {\r\n formatICU = formatter;\r\n}", "/**\r\n * @module i18n\r\n * Internationalization support with namespace-based translations.\r\n * Uses ICU message format for pluralization, select, and formatting.\r\n *\r\n * @example\r\n * // Initialize locale\r\n * await setLocale('sv');\r\n *\r\n * // Use translations\r\n * const greeting = t('r-common:greeting', { name: 'John' });\r\n * const items = t('shop:items', { count: 5 });\r\n */\r\n\r\nimport { formatICU } from './icu';\r\n\r\ntype Locale = string;\r\ntype Namespace = string;\r\ntype TranslationMap = Record<string, string>;\r\ntype Translations = Record<Namespace, TranslationMap>;\r\n\r\nexport type MissingTranslationHandler = (\r\n key: string,\r\n namespace: string,\r\n locale: string,\r\n) => void;\r\n\r\n/**\r\n * Dispatched on `document` after `setLocale()` completes.\r\n * The `locale` property contains the new normalized locale code.\r\n *\r\n * @example\r\n * document.addEventListener('localechange', (e) => {\r\n * console.log(`Locale changed to ${e.locale}`);\r\n * this.render();\r\n * });\r\n */\r\nexport class LocaleChangeEvent extends Event {\r\n readonly locale: string;\r\n constructor(locale: string) {\r\n super('localechange', { bubbles: false });\r\n this.locale = locale;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface DocumentEventMap {\r\n localechange: LocaleChangeEvent;\r\n }\r\n}\r\n\r\nconst fallbackLocale: Locale = 'en';\r\nlet currentLocale: Locale = fallbackLocale;\r\nconst loadedNamespaces = new Set<Namespace>();\r\nconst translations: Translations = {};\r\nlet missingHandler: MissingTranslationHandler | null = null;\r\n\r\nfunction normalizeLocale(locale: string): string {\r\n return locale.toLowerCase().split('-')[0];\r\n}\r\n\r\n/**\r\n * Sets the current locale and loads the common namespace.\r\n * Clears previously loaded translations and dispatches a `localechange` event.\r\n *\r\n * @param locale - The locale code (e.g., 'en', 'sv', 'en-US')\r\n *\r\n * @example\r\n * await setLocale('sv');\r\n */\r\nexport async function setLocale(locale: string): Promise<void> {\r\n const normalized = normalizeLocale(locale);\r\n currentLocale = normalized;\r\n loadedNamespaces.clear();\r\n Object.keys(translations).forEach(ns => delete translations[ns]);\r\n await loadNamespace('r-common');\r\n if (typeof document !== 'undefined') {\r\n document.dispatchEvent(new LocaleChangeEvent(normalized));\r\n }\r\n}\r\n\r\n/**\r\n * Loads a translation namespace on demand.\r\n * Falls back to the default locale if translations are not found.\r\n *\r\n * @param namespace - The namespace to load (e.g., 'shop', 'errors')\r\n *\r\n * @example\r\n * await loadNamespace('shop');\r\n * const price = t('shop:priceLabel');\r\n */\r\nexport async function loadNamespace(namespace: Namespace): Promise<void> {\r\n if (loadedNamespaces.has(namespace)) return;\r\n\r\n try {\r\n const module = await import(`./locales/${currentLocale}/${namespace}.json`);\r\n translations[namespace] = module.default;\r\n loadedNamespaces.add(namespace);\r\n } catch (err) {\r\n if (currentLocale !== fallbackLocale) {\r\n const fallback = await import(`./locales/${fallbackLocale}/${namespace}.json`);\r\n translations[namespace] = fallback.default;\r\n loadedNamespaces.add(namespace);\r\n } else {\r\n console.warn(`i18n: Failed to load namespace '${namespace}' for locale '${currentLocale}'`);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Loads multiple translation namespaces in parallel.\r\n *\r\n * @param namespaces - Array of namespace names to load\r\n *\r\n * @example\r\n * await loadNamespaces(['r-pipes', 'r-validation']);\r\n */\r\nexport async function loadNamespaces(namespaces: Namespace[]): Promise<void> {\r\n await Promise.all(namespaces.map(ns => loadNamespace(ns)));\r\n}\r\n\r\n/**\r\n * Translates a key with optional value interpolation.\r\n * Supports ICU message format for pluralization and select.\r\n *\r\n * @param fullKey - Translation key in format 'namespace:key' or just 'key' (uses 'r-common')\r\n * @param values - Values to interpolate into the message\r\n * @returns The translated string, or the key if not found\r\n *\r\n * @example\r\n * // Simple translation\r\n * t('greeting'); // Uses r-common:greeting\r\n *\r\n * // With namespace\r\n * t('errors:notFound');\r\n *\r\n * // With interpolation\r\n * t('welcome', { name: 'John' }); // \"Welcome, John!\"\r\n *\r\n * // With pluralization (ICU format)\r\n * t('items', { count: 5 }); // \"5 items\" or \"5 f\u00F6rem\u00E5l\"\r\n */\r\nexport function t(fullKey: string, values?: Record<string, any>): string {\r\n const [namespace, key] = fullKey.includes(':')\r\n ? fullKey.split(':')\r\n : ['r-common', fullKey];\r\n const message = translations[namespace]?.[key];\r\n if (!message) {\r\n if (missingHandler) missingHandler(key, namespace, currentLocale);\r\n return fullKey;\r\n }\r\n try {\r\n return formatICU(message, values, currentLocale) as string;\r\n } catch {\r\n return fullKey;\r\n }\r\n}\r\n\r\n/**\r\n * Returns the current locale code.\r\n *\r\n * @returns The normalized locale code (e.g., 'en', 'sv')\r\n */\r\nexport function getCurrentLocale(): string {\r\n return currentLocale;\r\n}\r\n\r\n/**\r\n * Registers a handler called when `t()` encounters a missing translation key.\r\n * Pass `null` to remove the handler.\r\n *\r\n * @param handler - Callback receiving the key, namespace, and locale\r\n *\r\n * @example\r\n * onMissingTranslation((key, ns, locale) => {\r\n * console.warn(`Missing: ${ns}:${key} [${locale}]`);\r\n * });\r\n */\r\nexport function onMissingTranslation(handler: MissingTranslationHandler | null): void {\r\n missingHandler = handler;\r\n}\r\n"],
|
|
5
|
+
"mappings": "omBAAA,IAAAA,EAAAC,EAAA,CAAAC,GAAAC,IAAA,CAAAA,EAAA,SACI,SAAY,iBACZ,MAAS,+CACb,ICHA,IAAAC,EAAAC,EAAA,CAAAC,GAAAC,IAAA,CAAAA,EAAA,SACI,MAAS,QACT,UAAa,YACb,QAAW,sDACX,OAAU,oDACd,ICLA,IAAAC,EAAAC,EAAA,CAAAC,GAAAC,IAAA,CAAAA,EAAA,SACI,SAAY,0BACZ,MAAS,wDACT,OAAU,2BACd,ICJA,IAAAC,EAAAC,EAAA,CAAAC,GAAAC,IAAA,CAAAA,EAAA,SACI,SAAY,eACZ,MAAS,8CACb,ICHA,IAAAC,EAAAC,EAAA,CAAAC,GAAAC,IAAA,CAAAA,EAAA,SACI,MAAS,OACT,UAAa,UACb,QAAW,2DACX,OAAU,kDACd,ICLA,IAAAC,EAAAC,EAAA,CAAAC,GAAAC,IAAA,CAAAA,EAAA,SACI,SAAY,qCACZ,MAAS,4DACT,OAAU,sBACd,ICiBA,IAAMC,EAAmB,IAAI,IAa7B,SAASC,EAAcC,EAAkC,CACrD,OAAKF,EAAiB,IAAIE,CAAM,GAC5BF,EAAiB,IAAIE,EAAQ,IAAI,KAAK,YAAYA,CAAM,CAAC,EAEtDF,EAAiB,IAAIE,CAAM,CACtC,CAEA,SAASC,EAAYC,EAAmB,CACpC,OAAOA,EAAE,QAAQ,sBAAuB,MAAM,CAClD,CAmBO,SAASC,EACZC,EACAC,EACAL,EAAiB,KACX,CACN,OAAOI,EAAQ,QACX,2DACA,CAACE,EAAGC,EAAKC,EAAMC,IAAmB,CAC9B,IAAMC,EAAQL,IAASE,CAAG,EAE1B,GAAIC,IAAS,SAAU,CACnB,IAAMG,EAAQ,IAAI,OACd,IAAIV,EAAY,OAAOS,CAAK,CAAC,CAAC,oBAClC,EAAE,KAAKD,CAAc,EACrB,GAAIE,EACA,OAAOA,EAAM,CAAC,EACT,QAAQ,IAAIJ,CAAG,IAAK,OAAOG,CAAK,CAAC,EACjC,QAAQ,IAAK,OAAOA,CAAK,CAAC,EAInC,IAAME,EADQb,EAAcC,CAAM,EACX,OAAOU,CAAK,EAC7BG,EACF,IAAI,OAAO,GAAGD,CAAQ,oBAAoB,EAAE,KAAKH,CAAc,GAC/D,IAAI,OAAO,yBAAyB,EAAE,KAAKA,CAAc,EAC7D,OAAII,EACOA,EAAM,CAAC,EACT,QAAQ,IAAIN,CAAG,IAAK,OAAOG,CAAK,CAAC,EACjC,QAAQ,IAAK,OAAOA,CAAK,CAAC,EAE5B,OAAOA,CAAK,CACvB,CAEA,GAAIF,IAAS,SAAU,CACnB,IAAMM,EAAUb,EAAY,OAAOS,CAAK,CAAC,EACnCG,EACF,IAAI,OAAO,MAAMC,CAAO,oBAAoB,EAAE,KAAKL,CAAc,GACjE,IAAI,OAAO,4BAA4B,EAAE,KAAKA,CAAc,EAChE,OAAOI,EAAQA,EAAM,CAAC,EAAI,OAAOH,CAAK,CAC1C,CAEA,OAAOA,IAAU,OAAY,OAAOA,CAAK,EAAI,IAAIH,CAAG,GACxD,CACJ,CACJ,CAMO,IAAIQ,EAA8BZ,EAiBlC,SAASa,EAAoBC,EAA6B,CAC7DF,EAAYE,CAChB,0aC9FO,IAAMC,EAAN,cAAgC,KAAM,CAEzC,YAAYC,EAAgB,CACxB,MAAM,eAAgB,CAAE,QAAS,EAAM,CAAC,EACxC,KAAK,OAASA,CAClB,CACJ,EAQMC,EAAyB,KAC3BC,EAAwBD,EACtBE,EAAmB,IAAI,IACvBC,EAA6B,CAAC,EAChCC,EAAmD,KAEvD,SAASC,EAAgBN,EAAwB,CAC7C,OAAOA,EAAO,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAC5C,CAWA,eAAsBO,EAAUP,EAA+B,CAC3D,IAAMQ,EAAaF,EAAgBN,CAAM,EACzCE,EAAgBM,EAChBL,EAAiB,MAAM,EACvB,OAAO,KAAKC,CAAY,EAAE,QAAQK,GAAM,OAAOL,EAAaK,CAAE,CAAC,EAC/D,MAAMC,EAAc,UAAU,EAC1B,OAAO,SAAa,KACpB,SAAS,cAAc,IAAIX,EAAkBS,CAAU,CAAC,CAEhE,CAYA,eAAsBE,EAAcC,EAAqC,CACrE,GAAI,CAAAR,EAAiB,IAAIQ,CAAS,EAElC,GAAI,CACA,IAAMC,EAAS,MAAaC,EAAA,aAAaX,CAAa,IAAIS,CAAS,SACnEP,EAAaO,CAAS,EAAIC,EAAO,QACjCT,EAAiB,IAAIQ,CAAS,CAClC,MAAc,CACV,GAAIT,IAAkBD,EAAgB,CAClC,IAAMa,EAAW,MAAaD,EAAA,aAAaZ,CAAc,IAAIU,CAAS,SACtEP,EAAaO,CAAS,EAAIG,EAAS,QACnCX,EAAiB,IAAIQ,CAAS,CAClC,MACI,QAAQ,KAAK,mCAAmCA,CAAS,iBAAiBT,CAAa,GAAG,CAElG,CACJ,CAUA,eAAsBa,EAAeC,EAAwC,CACzE,MAAM,QAAQ,IAAIA,EAAW,IAAIP,GAAMC,EAAcD,CAAE,CAAC,CAAC,CAC7D,CAuBO,SAASQ,EAAEC,EAAiBC,EAAsC,CACrE,GAAM,CAACR,EAAWS,CAAG,EAAIF,EAAQ,SAAS,GAAG,EACvCA,EAAQ,MAAM,GAAG,EACjB,CAAC,WAAYA,CAAO,EACpBG,EAAUjB,EAAaO,CAAS,IAAIS,CAAG,EAC7C,GAAI,CAACC,EACD,OAAIhB,GAAgBA,EAAee,EAAKT,EAAWT,CAAa,EACzDgB,EAEX,GAAI,CACA,OAAOI,EAAUD,EAASF,EAAQjB,CAAa,CACnD,MAAQ,CACJ,OAAOgB,CACX,CACJ,CAOO,SAASK,GAA2B,CACvC,OAAOrB,CACX,CAaO,SAASsB,EAAqBC,EAAiD,CAClFpB,EAAiBoB,CACrB",
|
|
6
6
|
"names": ["require_r_common", "__commonJSMin", "exports", "module", "require_r_pipes", "__commonJSMin", "exports", "module", "require_r_validation", "__commonJSMin", "exports", "module", "require_r_common", "__commonJSMin", "exports", "module", "require_r_pipes", "__commonJSMin", "exports", "module", "require_r_validation", "__commonJSMin", "exports", "module", "pluralRulesCache", "getPluralRule", "locale", "escapeRegex", "s", "defaultFormatICU", "message", "values", "_", "key", "type", "categoriesPart", "value", "exact", "category", "match", "escaped", "formatICU", "setMessageFormatter", "formatter", "LocaleChangeEvent", "locale", "fallbackLocale", "currentLocale", "loadedNamespaces", "translations", "missingHandler", "normalizeLocale", "setLocale", "normalized", "ns", "loadNamespace", "namespace", "module", "globImport_locales_json", "fallback", "loadNamespaces", "namespaces", "t", "fullKey", "values", "key", "message", "formatICU", "getCurrentLocale", "onMissingTranslation", "handler"]
|
|
7
7
|
}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var Qe=Object.create;var M=Object.defineProperty;var et=Object.getOwnPropertyDescriptor;var an=Object.getOwnPropertyNames;var cn=Object.getPrototypeOf,ln=Object.prototype.hasOwnProperty;var tt=(n,t)=>(t=Symbol[n])?t:Symbol.for("Symbol."+n),V=n=>{throw TypeError(n)};var un=(n,t,e)=>t in n?M(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e;var Ke=(n,t)=>M(n,"name",{value:t,configurable:!0});var nt=n=>t=>{var e=n[t];if(e)return e();throw new Error("Module not found in bundle: "+t)};var A=(n,t)=>()=>(t||n((t={exports:{}}).exports,t),t.exports),pn=(n,t)=>{for(var e in t)M(n,e,{get:t[e],enumerable:!0})},rt=(n,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of an(t))!ln.call(n,o)&&o!==e&&M(n,o,{get:()=>t[o],enumerable:!(r=et(t,o))||r.enumerable});return n};var $=(n,t,e)=>(e=n!=null?Qe(cn(n)):{},rt(t||!n||!n.__esModule?M(e,"default",{value:n,enumerable:!0}):e,n)),dn=n=>rt(M({},"__esModule",{value:!0}),n);var K=n=>[,,,Qe(n?.[tt("metadata")]??null)],ot=["class","method","getter","setter","accessor","field","value","get","set"],_=n=>n!==void 0&&typeof n!="function"?V("Function expected"):n,mn=(n,t,e,r,o)=>({kind:ot[n],name:t,metadata:r,addInitializer:s=>e._?V("Already initialized"):o.push(_(s||null))}),fn=(n,t)=>un(t,tt("metadata"),n[3]),Z=(n,t,e,r)=>{for(var o=0,s=n[t>>1],i=s&&s.length;o<i;o++)t&1?s[o].call(e):r=s[o].call(e,r);return r},Y=(n,t,e,r,o,s)=>{var i,a,c,l,p,u=t&7,d=!!(t&8),m=!!(t&16),f=u>3?n.length+1:u?d?1:2:0,x=ot[u+5],h=u>3&&(n[f-1]=[]),b=n[f]||(n[f]=[]),y=u&&(!m&&!d&&(o=o.prototype),u<5&&(u>3||!m)&&et(u<4?o:{get[e](){return Ze(this,s)},set[e](v){return Ye(this,s,v)}},e));u?m&&u<4&&Ke(s,(u>2?"set ":u>1?"get ":"")+e):Ke(o,e);for(var T=r.length-1;T>=0;T--)l=mn(u,e,c={},n[3],b),u&&(l.static=d,l.private=m,p=l.access={has:m?v=>gn(o,v):v=>e in v},u^3&&(p.get=m?v=>(u^1?Ze:hn)(v,o,u^4?s:y.get):v=>v[e]),u>2&&(p.set=m?(v,L)=>Ye(v,o,L,u^4?s:y.set):(v,L)=>v[e]=L)),a=(0,r[T])(u?u<4?m?s:y[x]:u>4?void 0:{get:y.get,set:y.set}:o,l),c._=1,u^4||a===void 0?_(a)&&(u>4?h.unshift(a):u?m?s=a:y[x]=a:o=a):typeof a!="object"||a===null?V("Object expected"):(_(i=a.get)&&(y.get=i),_(i=a.set)&&(y.set=i),_(i=a.init)&&h.unshift(i));return u||fn(n,o),y&&M(o,e,y),m?u^4?s:y:o};var Ce=(n,t,e)=>t.has(n)||V("Cannot "+e),gn=(n,t)=>Object(t)!==t?V('Cannot use the "in" operator on this value'):n.has(t),Ze=(n,t,e)=>(Ce(n,t,"read from private field"),e?e.call(n):t.get(n));var Ye=(n,t,e,r)=>(Ce(n,t,"write to private field"),r?r.call(n,e):t.set(n,e),e),hn=(n,t,e)=>(Ce(n,t,"access private method"),e);var at=A((Ar,bn)=>{bn.exports={greeting:"Hello, {name}!",items:"{count, plural, one {# item} other {# items}}"}});var ct=A(($r,wn)=>{wn.exports={today:"today",yesterday:"yesterday",daysAgo:"{count, plural, one {# day ago} other {# days ago}}",pieces:"{count, plural, =0 {none} one {one} other {# pcs}}"}});var lt=A((Fr,Cn)=>{Cn.exports={required:"This field is required.",range:"Number must be between {min} and {max}, was {actual}.",digits:"Please enter only digits."}});var ut=A((Hr,Rn)=>{Rn.exports={greeting:"Hej, {name}!",items:"{count, plural, one {# sak} other {# saker}}"}});var pt=A((Ir,Nn)=>{Nn.exports={today:"idag",yesterday:"ig\xE5r",daysAgo:"{count, plural, one {# dag sedan} other {# dagar sedan}}",pieces:"{count, plural, =0 {inga} one {en} other {# st}}"}});var dt=A((Dr,Sn)=>{Sn.exports={required:"Detta f\xE4lt \xE4r obligatoriskt.",range:"Talet m\xE5ste vara mellan {min} och {max}, var {actual}.",digits:"Ange endast siffror."}});var Tr={};pn(Tr,{Blueprint:()=>ce,BooleanConverter:()=>ne,BoundNode:()=>ae,ContainerService:()=>pr,DateConverter:()=>Pe,DigitsValidation:()=>Ie,FormValidator:()=>Ne,GuardResult:()=>pe,HttpError:()=>Je,Inject:()=>ur,LinkedList:()=>Q,NavigateRouteEvent:()=>C,Node:()=>F,NumberConverter:()=>ke,PageSelectedEvent:()=>q,Pager:()=>ee,RangeValidation:()=>He,RegisterValidator:()=>re,RelaxError:()=>R,RequiredValidation:()=>Fe,RouteError:()=>k,RouteGuardError:()=>P,RouteLink:()=>B,RouteTarget:()=>O,SSEClient:()=>Xe,SSEDataEvent:()=>we,ServiceCollection:()=>Ee,ServiceContainer:()=>xe,SortChangeEvent:()=>z,TableRenderer:()=>le,TableSorter:()=>ue,applyPipes:()=>De,asyncHandler:()=>vn,capitalizePipe:()=>St,clearPendingNavigations:()=>Kt,compileTemplate:()=>zt,configure:()=>gr,container:()=>nn,createBluePrint:()=>rr,createConverterFromDataType:()=>gt,createConverterFromInputType:()=>ht,createPipeRegistry:()=>Ot,currencyPipe:()=>kt,datePipe:()=>Pt,daysAgoPipe:()=>Lt,defaultPipe:()=>Dt,defaultPipes:()=>N,defineRoutes:()=>Yt,del:()=>Er,findRouteByName:()=>We,findRouteByUrl:()=>Ge,firstPipe:()=>Ft,generateSequentialId:()=>on,get:()=>hr,getDataConverter:()=>ft,getParentComponent:()=>dr,getValidator:()=>Fn,html:()=>jt,internalRoutes:()=>j,joinPipe:()=>$t,keysPipe:()=>It,lastPipe:()=>Ht,lowercasePipe:()=>Nt,mapFormToClass:()=>Pn,matchRoute:()=>ge,navigate:()=>G,onError:()=>yn,piecesPipe:()=>At,post:()=>yr,printRoutes:()=>he,put:()=>vr,readData:()=>Ln,registerRouteTarget:()=>me,reportError:()=>g,request:()=>X,resolveValue:()=>xr,serviceCollection:()=>Te,setFetch:()=>fr,setFormData:()=>Hn,shortenPipe:()=>Mt,startRouting:()=>Qt,ternaryPipe:()=>Bt,trimPipe:()=>Rt,unregisterRouteTarget:()=>fe,uppercasePipe:()=>Ct});module.exports=dn(Tr);var R=class extends Error{constructor(e,r){super(e);this.context=r}},Re=null;function yn(n){Re=n}function g(n,t){let e=new R(n,t);if(Re){let r=!1;if(Re(e,{suppress(){r=!0}}),r)return null}return e}function vn(n){return function(...t){n.call(this,...t).catch(e=>{let r=g("Async callback failed",{cause:e});if(r)throw r})}}var F=class{constructor(t,e){this.value=t;this.removeCallback=e;this.next=null;this.prev=null}remove(){this.prev.next=this.next,this.next.prev=this.prev,this.removeCallback()}},Q=class{constructor(){this._length=0}addFirst(t){let e=new F(t,()=>this._length--);this._first?(e.next=this._first,this._first.prev=e,this._first=e):(this._first=e,this._last=this._first),this._length++}addLast(t){let e=new F(t,()=>this._length--);this._first?(e.prev=this._last,this._last.next=e,this._last=e):(this._first=e,this._last=this._first),this._length++}removeFirst(){if(!this.first)throw new Error("The list is empty.");let t=this._first.value;return this._first=this._first.next,this._length--,t}removeLast(){if(!this.last)throw new Error("The list is empty.");let t=this._last.value;return this._last=this._last.prev,this._length--,t}get length(){return this._length}get first(){return this._first}get firstValue(){return this._first?.value}get last(){return this._last}get lastValue(){return this._last?.value}};var q=class extends Event{constructor(e){super("pageselected",{bubbles:!0,composed:!0});this.page=e}},ee=class{constructor(t,e,r){this.currentPage=1;this.container=t,this.totalCount=e,this.pageSize=r,this.render()}render(){this.container.innerHTML="";let t=Math.max(1,Math.ceil(this.totalCount/this.pageSize)),e=(r,o,s=!1)=>{let i=document.createElement("button");return i.textContent=r,i.disabled=s,i.addEventListener("click",()=>this.selectPage(o)),i};this.container.appendChild(e("Previous",this.currentPage-1,this.currentPage===1));for(let r=1;r<=t;r++){let o=e(r.toString(),r);r===this.currentPage&&o.classList.add("selected"),this.container.appendChild(o)}this.container.appendChild(e("Next",this.currentPage+1,this.currentPage===t))}selectPage(t){let e=Math.max(1,Math.ceil(this.totalCount/this.pageSize));t<1||t>e||t===this.currentPage||(this.currentPage=t,this.render(),this.container.dispatchEvent(new q(this.currentPage)))}update(t){this.totalCount=t;let e=Math.max(1,Math.ceil(this.totalCount/this.pageSize));this.currentPage>e&&(this.currentPage=e),this.render()}getCurrentPage(){return this.currentPage}};function En(n){let t=n.getAttribute("id");if(t){let e=n.closest("form");if(e){let r=e.querySelector(`label[for="${t}"]`);if(r)return r.textContent?.trim()||null}}return null}var Ne=class{constructor(t,e){this.form=t;this.options=e;if(!this.form)throw new Error("Form must be specified.");this.form.addEventListener("submit",r=>{if((e?.preventDefault||this.options?.submitCallback!=null)&&r.preventDefault(),this.options?.customChecks&&this.options.customChecks(t),this.validateForm())try{let o=this.options?.submitCallback?.call(this);o instanceof Promise&&o.catch(s=>{let i=g("submitCallback failed",{cause:s});if(i)throw i})}catch(o){let s=g("submitCallback failed",{cause:o});if(s)throw s}else e?.preventDefaultOnFailed!==!1&&r.preventDefault()}),e?.autoValidate&&t.addEventListener("input",()=>{this.validateForm()})}validateForm(){let t=Array.from(this.form.querySelectorAll("input,textarea,select")),e=!0;if(this.options?.useSummary!==!0)return this.form.checkValidity()?!0:(this.form.reportValidity(),this.focusFirstErrorElement(),!1);let r=[];return t.forEach(o=>{if(!o.checkValidity()){e=!1;let s=En.call(this,o)||o.name||"Unnamed Field";r.push(`${s}: ${o.validationMessage}`)}}),e?this.clearErrorSummary():(this.displayErrorSummary(r),this.focusFirstErrorElement()),e}displayErrorSummary(t){this.clearErrorSummary(),this.errorSummary||this.createErrorSummary();let e=this.errorSummary.querySelector("ul");t.forEach(r=>{let o=document.createElement("li");o.textContent=r,e.appendChild(o)})}createErrorSummary(){let t=document.createElement("div");t.className="error-summary",t.style.color="red",t.setAttribute("role","alert"),t.setAttribute("aria-live","assertive"),t.setAttribute("aria-atomic","true"),this.errorSummary=t;let e=document.createElement("ul");this.errorSummary.appendChild(e),this.form.prepend(t)}addErrorToSummary(t,e){this.errorSummary||this.createErrorSummary();let r=this.errorSummary.querySelector("ul"),o=document.createElement("li");o.textContent=`${t}: ${e}`,r.appendChild(o)}clearErrorSummary(){this.errorSummary&&(this.errorSummary.querySelector("ul").innerHTML="")}focusFirstErrorElement(){let t=this.form.querySelector(":invalid");t instanceof HTMLElement&&document.activeElement!==t&&t.focus()}static FindForm(t){if(t.parentElement?.tagName=="FORM")return t.parentElement;for(let e=0;e<t.children.length;e++){let r=t.children[e];if(r.tagName=="FORM")return r}throw new Error("Parent or a direct child must be a FORM for class "+t.constructor.name)}};var Se=new Map;function xn(n){return Se.has(n)||Se.set(n,new Intl.PluralRules(n)),Se.get(n)}function st(n){return n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Tn(n,t,e="en"){return n.replace(/\{(\w+)(?:, (plural|select),((?:[^{}]*\{[^{}]*\})+))?\}/g,(r,o,s,i)=>{let a=t[o];if(s==="plural"){let c=new RegExp(`=${st(String(a))}\\s*\\{([^{}]*)\\}`).exec(i);if(c)return c[1].replace(`{${o}}`,String(a)).replace("#",String(a));let p=xn(e).select(a),u=new RegExp(`${p}\\s*\\{([^{}]*)\\}`).exec(i)||new RegExp("other\\s*\\{([^{}]*)\\}").exec(i);return u?u[1].replace(`{${o}}`,String(a)).replace("#",String(a)):String(a)}if(s==="select"){let c=st(String(a)),l=new RegExp(`\\b${c}\\s*\\{([^{}]*)\\}`).exec(i)||new RegExp("\\bother\\s*\\{([^{}]*)\\}").exec(i);return l?l[1]:String(a)}return a!==void 0?String(a):`{${o}}`})}var it=Tn;var jr=nt({"./locales/en/r-common.json":()=>Promise.resolve().then(()=>$(at())),"./locales/en/r-pipes.json":()=>Promise.resolve().then(()=>$(ct())),"./locales/en/r-validation.json":()=>Promise.resolve().then(()=>$(lt())),"./locales/sv/r-common.json":()=>Promise.resolve().then(()=>$(ut())),"./locales/sv/r-pipes.json":()=>Promise.resolve().then(()=>$(pt())),"./locales/sv/r-validation.json":()=>Promise.resolve().then(()=>$(dt()))});var Mn="en",Me=Mn;var kn={},mt=null;function w(n,t){let[e,r]=n.includes(":")?n.split(":"):["r-common",n],o=kn[e]?.[r];if(!o)return mt&&mt(r,e,Me),n;try{return it(o,t,Me)}catch{return n}}function U(){return Me}function Pn(n,t,e={}){let r=n.querySelectorAll("input, select, textarea");if(r.forEach(o=>{if(!o.hasAttribute("name")||te(o,"disabled"))return;let s=o.getAttribute("name");if(!(s in t)){if(e.throwOnMissingProperty)throw new Error(`Form field "${s}" has no matching property in class instance`);return}let i=$n(o);i!==yt&&(t[s]=i)}),e.throwOnMissingField){let o=new Set;r.forEach(s=>{s.hasAttribute("name")&&o.add(s.getAttribute("name"))});for(let s in t)if(typeof t[s]!="function"&&Object.prototype.hasOwnProperty.call(t,s)&&!o.has(s))throw new Error(`Class property "${s}" has no matching form field`)}return t}function ft(n){let t=n.getAttribute("data-type");return t?gt(t):n instanceof HTMLInputElement?ht(n.type):"checked"in n&&typeof n.checked=="boolean"?ne:e=>e}function Ln(n){let t={},e=new FormData(n),r=new Set;e.forEach((o,s)=>{if(r.has(s))return;r.add(s);let i=e.getAll(s),a=n.elements.namedItem(s),c=a?ft(a):l=>l;if(i.length===1){let l=i[0];t[s]=typeof l=="string"?c(l):l}else t[s]=i.map(l=>typeof l=="string"?c(l):l)});for(let o=0;o<n.elements.length;o++){let s=n.elements[o];s.type==="checkbox"&&s.name&&!r.has(s.name)&&(r.add(s.name),t[s.name]=!1)}return t}function ne(n){if(!n||n=="")return;let t=n.toLowerCase();if(t==="true"||t==="on"||Number(n)>0)return!0;if(t==="false"||t==="off"||Number(n)<=0)return!1;throw new Error("Could not convert value '"+n+"' to boolean.")}function ke(n){if(!n||n=="")return;let t=Number(n);if(!isNaN(t))return t;throw new Error("Could not convert value '"+n+"' to number.")}function An(n){return new Intl.DateTimeFormat(n).formatToParts(new Date(2024,0,15)).filter(e=>e.type==="day"||e.type==="month"||e.type==="year").map(e=>e.type)}function Pe(n){if(!n||n==="")return;if(/^\d{4}-\d{2}-\d{2}(T|$)/.test(n)){let r=new Date(n);if(!isNaN(r.getTime()))return r}let t=n.split(/[\/.\-\s]/);if(t.length>=3&&t.every(r=>/^\d+$/.test(r))){let r=U(),o=An(r),s={};if(o.forEach((i,a)=>{s[i]=parseInt(t[a],10)}),s.year!==void 0&&s.month!==void 0&&s.day!==void 0){s.year<100&&(s.year+=2e3);let i=new Date(s.year,s.month-1,s.day);if(!isNaN(i.getTime()))return i}}let e=new Date(n);if(isNaN(e.getTime()))throw new Error("Invalid date format");return e}function gt(n){switch(n){case"boolean":return ne;case"number":return ke;case"Date":return Pe;case"string":return t=>!t||t==""?void 0:t;default:throw new Error(`Unknown data-type "${n}".`)}}function ht(n){switch(n){case"checkbox":return ne;case"number":return ke;case"date":case"datetime-local":return Pe;case"month":return t=>{let[e,r]=t.split("-").map(Number);return new Date(e,r-1)};case"week":return t=>{let[e,r]=t.split("-W").map(Number);return{year:e,week:r}};case"time":return t=>{let[e,r,o=0]=t.split(":").map(Number);return{hours:e,minutes:r,seconds:o}};default:return t=>!t||t==""?void 0:t}}function te(n,t){let e=n;if(t in e&&typeof e[t]=="boolean")return e[t];let r=n.getAttribute(t);return r===null?!1:r===""||r.toLowerCase()==="true"||r.toLowerCase()===t}var yt=Symbol("skip");function $n(n){let t=n,e=t.type||n.getAttribute("type")||"";if(e==="checkbox")return te(n,"checked");if(e==="radio")return te(n,"checked")?t.value:yt;if(e==="number")return t.value?Number(t.value):null;if(e==="date")return t.value?new Date(t.value):null;if("selectedOptions"in t&&te(n,"multiple"))return Array.from(t.selectedOptions).map(r=>r.value);if("value"in t)return t.value}var Tt=new Map;function re(n,t=[]){return function(e){Tt.set(n,{validator:e,validInputTypes:t})}}function Fn(n){return Tt.get(n)}var vt,Le;vt=[re("required")];var H=class H{static create(t){return t==="required"?new H:null}validate(t,e){t.trim()===""&&e.addError(this.getMessage())}getMessage(){return w("r-validation:required")}};Le=K(null),H=Y(Le,0,"RequiredValidation",vt,H),Z(Le,1,H);var Fe=H,Et,Ae;Et=[re("range",["number"])];var I=class I{constructor(t,e){this.min=void 0;this.max=void 0;this.min=t,this.max=e}static create(t){let e=t.match(/^range\((-?\d+(?:\.\d+)?)-(-?\d+(?:\.\d+)?)\)$/);if(e){let[,r,o]=e;return new I(parseFloat(r),parseFloat(o))}return null}validate(t,e){if(t.trim()==="")return;let r=parseFloat(t);!isNaN(r)&&r>=this.min&&r<=this.max||e.addError(this.getMessage(t))}getMessage(t){return w("r-validation:range",{min:this.min,max:this.max,actual:t})}};Ae=K(null),I=Y(Ae,0,"RangeValidation",Et,I),Z(Ae,1,I);var He=I,xt,$e;xt=[re("digits",["number"])];var D=class D{static create(t){return t==="digits"?new D:null}validate(t,e){/^\d+$/.test(t)||e.addError(this.getMessage())}getMessage(){return w("r-validation:digits")}};$e=K(null),D=Y($e,0,"DigitsValidation",xt,D),Z($e,1,D);var Ie=D;function Hn(n,t){n.querySelectorAll("[name]").forEach(r=>{let o=r.getAttribute("name");if(!o)return;if(o.endsWith("[]")){let i=o.slice(0,-2),a=bt(t,i);if(Array.isArray(a)){let c=r,l=c.type||r.getAttribute("type")||"";if(l==="checkbox"||l==="radio")c.checked=a.includes(c.value);else if("options"in c&&wt(r,"multiple"))a.forEach(p=>{let u=Array.from(c.options).find(d=>d.value===String(p));u&&(u.selected=!0)});else if("value"in c){let p=n.querySelectorAll(`[name="${o}"]`),u=Array.from(p).indexOf(r);u>=0&&u<a.length&&(c.value=String(a[u]))}}return}let s=bt(t,o);s!=null&&In(r,s)})}function bt(n,t){let e=[],r="",o=!1;for(let s=0;s<t.length;s++){let i=t[s];i==="["&&!o?(r&&(e.push(r),r=""),o=!0,r+=i):i==="]"&&o?(r+=i,e.push(r),r="",o=!1):i==="."&&!o?r&&(e.push(r),r=""):r+=i}return r&&e.push(r),e.reduce((s,i)=>{if(!(!s||typeof s!="object")){if(i.startsWith("[")&&i.endsWith("]")){let a=i.slice(1,-1);return s[a]}return s[i]}},n)}function In(n,t){let e=n,r=e.type||n.getAttribute("type")||"";if(r==="checkbox")e.checked=!!t;else if(r==="radio")e.checked=e.value===String(t);else if(r==="date"&&t instanceof Date)e.value=t.toISOString().split("T")[0];else if(r==="datetime-local"&&t instanceof Date){let o=s=>String(s).padStart(2,"0");e.value=`${t.getFullYear()}-${o(t.getMonth()+1)}-${o(t.getDate())}T${o(t.getHours())}:${o(t.getMinutes())}`}else if("options"in e&&wt(n,"multiple")&&Array.isArray(t)){let o=Array.from(e.options),s=t.map(String);o.forEach(i=>{i.selected=s.includes(i.value)})}else"value"in e&&(e.value=String(t))}function wt(n,t){let e=n;if(t in e&&typeof e[t]=="boolean")return e[t];let r=n.getAttribute(t);return r===null?!1:r===""||r.toLowerCase()==="true"||r.toLowerCase()===t}function Ct(n){return String(n).toUpperCase()}function Rt(n){return String(n).trimEnd().trimStart()}function Nt(n){return String(n).toLowerCase()}function St(n){let t=String(n);return t.charAt(0).toUpperCase()+t.slice(1)}function Mt(n,t){let e=String(n),r=parseInt(t,10);return e.length>r?e.substring(0,r-3)+"...":e}function kt(n,t="USD"){let e=U();return new Intl.NumberFormat(e,{style:"currency",currency:t}).format(n)}function Pt(n,t){let e=new Date(n),r=U();return t==="short"?e.toLocaleDateString(r):t==="long"?e.toLocaleDateString(r,{weekday:"long",year:"numeric",month:"long",day:"numeric"}):e.toISOString()}function Lt(n){if(!n)return"n/a";let t=new Date(n),e=new Date;t.setHours(0,0,0,0),e.setHours(0,0,0,0);let r=e.getTime()-t.getTime(),o=Math.round(r/(1e3*60*60*24));return o===0?w("r-pipes:today"):o===1?w("r-pipes:yesterday"):w("r-pipes:daysAgo",{count:o})}function At(n){if(n==null)return"n/a";let t=Number(n);return w("r-pipes:pieces",{count:t})}function $t(n,t=","){return Array.isArray(n)?n.join(t):n}function Ft(n){return!Array.isArray(n)||n.length===0?"":n[0]}function Ht(n){return!Array.isArray(n)||n.length===0?"":n[n.length-1]}function It(n){return typeof n!="object"||n===null?[]:Object.keys(n)}function Dt(n,t){return n||t}function Bt(n,t,e){return n?t:e}function Ot(){let n=new Map;return n.set("uppercase",Ct),n.set("lowercase",Nt),n.set("capitalize",St),n.set("trim",Rt),n.set("shorten",Mt),n.set("currency",kt),n.set("date",Pt),n.set("daysAgo",Lt),n.set("pieces",At),n.set("join",$t),n.set("first",Ft),n.set("last",Ht),n.set("keys",It),n.set("default",Dt),n.set("ternary",Bt),{lookup(t){return n.get(t)},get(t){var e=n.get(t);if(!e)throw Error("Pipe '"+t+"' not found.");return e},has(t){return n.has(t)}}}var N=Ot();function De(n,t,e=N){return t.reduce((r,o)=>{let[s,...i]=o.split(":").map(a=>a.trim());if(!e.has(s))return`[Pipe ${s} not found]`;try{return e.get(s)(r,...i)}catch(a){return`[Pipe ${s}, value: ${n}, error: ${a}]`}},n)}var Dn=N;function jt(n,...t){let e=document.createElement("template"),r=Bn(n);e.innerHTML=r;let o=[],s=document.createTreeWalker(e.content,NodeFilter.SHOW_ALL),i;for(;i=s.nextNode();)if(i.nodeType===Node.ELEMENT_NODE){let a=i;On(a,t,o),customElements.get(a.tagName.toLowerCase())&&customElements.upgrade(a)}else if(i.nodeType===Node.TEXT_NODE){let a=i,c=a.textContent,l=_t(c,t);if(l)if(/€€\d+€€/.test(c)){let u=null,d=null,m=[];o.push({originalValue:c,setter(f){var x=l(f);u||(u=document.createComment(""),d=document.createComment(""),a.parentNode?.replaceChild(d,a),d.parentNode?.insertBefore(u,d)),m.forEach(T=>T.parentNode?.removeChild(T)),m=[];let h=document.createElement("template");h.innerHTML=x;let b=Array.from(h.content.childNodes),y=d.parentNode;b.forEach(T=>{y.insertBefore(T,d),m.push(T)})}})}else o.push({originalValue:c,setter(u){var d=l(u);a.textContent=d}})}return function(c){return o.forEach(l=>{l.setter(c)}),{fragment:e.content,update(l){o.forEach(p=>{p.setter(l)})}}}}function Bn(n){return n.raw.map((t,e)=>e<n.raw.length-1?`${t}\u20AC\u20AC${e}\u20AC\u20AC`:t).join("")}function On(n,t,e){let r=[];for(let i of Array.from(n.attributes)){var o=i.value;if(o=="")continue;let a=/€€(\d+)€€/,c=o.match(a);if(c){let l=parseInt(c[1],10),p=t[l];if(typeof p=="function"){r.push({setter(u){let d=p.bind(u);n.removeAttribute(i.name),n[i.name]=d}});continue}}var s=_t(o,t);s!=null&&r.push({originalValue:o,setter(l){let p=s(l)??o;i.name in n?n[i.name]=p:i.value=p}})}r.length>0&&e.push({originalValue:n.tagName,setter(i){r.forEach(a=>a.setter(i))}})}function jn(n,t){return n.split(",").map(e=>{if(e=e.trim(),e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'"))return e.slice(1,-1);if(!isNaN(Number(e)))return Number(e);if(e.includes(".")){let r=e.split("."),o=t;for(let s of r){if(o==null)return;o=o[s]}return o}return t[e]})}function _t(n,t){let e=/€€(\d+)€€|{{\s*([^|]+?)(?:\|([\w|]+))?\s*}}/g,r=0,o,s=[];for(;(o=e.exec(n))!==null;){var i=n.slice(r,o.index);if(i.length>0&&s.push(c=>i),o[1]){let c=parseInt(o[1],10),l=t[c];if(!l)continue;if(typeof l=="function"){let p=l;s.push(u=>{var d=p.apply(u);return d})}else l&&l.length>0&&s.push(p=>l)}else if(o[2]){let c=o[2].trim(),l=o[3]?o[3].trim():null,p=o[4]?o[4].split("|").map(u=>u.trim()):[];s.push(u=>{var d=u[c];if(typeof d=="function")if(l){let m=jn(l,u);d=d.apply(u,m)}else d=d.call(u);return p.forEach(m=>{d=Dn[m](d)}),d})}r=e.lastIndex}if(s.length==0)return null;var a=n.slice(r);return a.length>0&&s.push(c=>a),c=>{var l="";return s.forEach(p=>{var u=p(c);l+=u}),l}}function Vt(n){let t=n.split("|").map(s=>s.trim()),e=t[0],r=t.slice(1),o=e.match(/^(\w+)\s*\((.*)\)$/);if(o){let[,s,i]=o,a=i?i.split(",").map(c=>c.trim()):[];return{type:"function",fnName:s,fnArgs:a,pipes:r}}return{type:"path",path:e,pipes:r}}function oe(n,t){let r=t.replace(/\[(\d+)\]/g,".$1").split("."),o=n;for(let s of r)if(o&&typeof o=="object"&&s in o)o=o[s];else return;return o}function S(n,t,e,r=!1){let o=`[template error] ${t} (at ${e})`;if(n.onError&&n.onError(o),n.strict||r)throw new Error(o)}function _n(n){return function(e,r,o=""){try{let s=oe(e,r);return s===void 0?(S(n,`Cannot resolve "${r}"`,o),""):s===null?"":Array.isArray(s)?s.length>0?JSON.stringify(s):"":typeof s=="object"?JSON.stringify(s):s}catch(s){let i=s instanceof Error?s.message:String(s);return S(n,`Exception resolving "${r}": ${i}`,o,!0),""}}}function qt(n,t,e,r,o){let s,i=r.pipeRegistry??N;if(n.type==="function"){let a=e?.[n.fnName];if(typeof a!="function")return S(r,`Function "${n.fnName}" not found`,o),"";let c=(n.fnArgs??[]).map(l=>l.startsWith('"')&&l.endsWith('"')||l.startsWith("'")&&l.endsWith("'")?l.slice(1,-1):isNaN(Number(l))?oe(t,l):Number(l));try{s=a(...c)}catch(l){let p=l instanceof Error?l.message:String(l);return S(r,`Error calling "${n.fnName}": ${p}`,o),""}}else{let a=oe(t,n.path);if(a===void 0)return S(r,`Cannot resolve "${n.path}"`,o),"";a===null?s="":typeof a=="object"?s=JSON.stringify(a):s=a}return n.pipes.length>0&&(s=De(s,n.pipes,i)),s}var Be=new Map;function Vn(n,t,e){if(n.nodeType!==Node.TEXT_NODE||!n.textContent?.includes("{{"))return;let r=n.textContent;if(!Be.has(r)){let a=r.split(/(\{\{.*?\}\})/).map(c=>{if(c.startsWith("{{")){let l=c.slice(2,-2).trim();return{parsed:Vt(l),literal:""}}else return{parsed:null,literal:c}});Be.set(r,a)}let o=Be.get(r),s=`TextNode: "${r}"`;return(i,a)=>{let c=o.map(({parsed:l,literal:p})=>l?String(qt(l,i,a,e,s)):p).join("");n.textContent=c}}function qn(n,t,e){if(n.nodeType!==Node.ELEMENT_NODE)return;let r=n,o=[],s=Array.from(r.attributes);for(let i of s){let a=i.value.match(/\{\{(.+?)\}\}/);if(a){let c=a[1].trim(),l=Vt(c),p=i.name,u=`Attribute: ${p} on <${r.tagName.toLowerCase()}>`;o.push((d,m)=>{let f=qt(l,d,m,e,u);r.setAttribute(p,String(f))})}}if(o.length>0)return(i,a)=>o.forEach(c=>c(i,a))}function Ut(n,t,e,r,o){if(n.nodeType!==Node.ELEMENT_NODE||!n.hasAttribute(r))return;let s=n,i=s.getAttribute(r),a=s.cloneNode(!0),c=document.createComment(`${r}: ${i}`),l=s.parentNode;l.insertBefore(c,s),s.remove();let p=null,u=null,d=null,m=null;return(f,x)=>{let h=t(f,i,`${r}="${i}"`),b=o(h);if(b&&!p){if(d&&m)p=d,u=m,d=null,m=null;else{let y=a.cloneNode(!0);y.removeAttribute(r),p=y,u=Oe(y,e)}u(f,x),l.insertBefore(p,c.nextSibling)}else b&&u&&u(f,x);!b&&p&&(p.remove(),d=p,m=u,p=null,u=null)}}function Un(n,t,e){return Ut(n,t,e,"if",r=>!!r)}function zn(n,t,e){return Ut(n,t,e,"unless",r=>!r)}function Wn(n,t,e){if(n.nodeType!==Node.ELEMENT_NODE||!n.hasAttribute("loop"))return;let r=n,o=r.getAttribute("loop"),s=o.match(/(\w+)\s+in\s+(.+)/);if(!s){S(e,`Invalid loop syntax: "${o}"`,`Element: <${r.tagName.toLowerCase()}>`);return}let[,i,a]=s,c=r.cloneNode(!0);c.removeAttribute("loop");let l=r.parentNode,p=document.createComment(`loop: ${o}`);l.insertBefore(p,r),r.remove();let u=[];return(d,m)=>{let f=oe(d,a);if(f===void 0){S(e,`Cannot resolve "${a}"`,`Loop source: "${o}"`);return}if(!Array.isArray(f)){S(e,`"${a}" is not an array in loop: "${o}"`,`Element: <${c.tagName.toLowerCase()}>`);return}let x=Math.min(u.length,f.length);for(let h=0;h<x;h++)u[h].renderer({...d,[i]:f[h]},m);for(let h=u.length-1;h>=f.length;h--)u[h].element.remove();if(f.length>x){let h=document.createDocumentFragment(),b=[];for(let T=x;T<f.length;T++){let v=c.cloneNode(!0),L=Oe(v,e);L({...d,[i]:f[T]},m),h.appendChild(v),b.push({element:v,renderer:L})}let y=x>0?u[x-1].element:p;l.insertBefore(h,y.nextSibling),u=u.slice(0,x).concat(b)}else u.length=f.length}}var Gn=[Wn,Un,zn],Jn=[Vn,qn];function Oe(n,t){let e=[],r=_n(t);function o(a){for(let c of Gn){let l=c(a,r,t);if(l){e.push(l);return}}for(let c of Jn){let l=c(a,r,t);l&&e.push(l)}for(let c of Array.from(a.childNodes))o(c)}o(n);let s=null,i;return(a,c)=>{(s!==a||i!==c)&&(e.forEach(l=>l(a,c)),s=a,i=c)}}function zt(n,t={strict:!1}){let o=new DOMParser().parseFromString(`<template><div>${n}</div></template>`,"text/html").querySelector("template").content.firstElementChild,s=Oe(o,t);return{content:o,render:s}}function Xn(n,t={}){let{delimiter:e=".",escapeChar:r="\\"}=t;if(!n||typeof n!="string")throw new Error("Notation must be a non-empty string");let o=[],s="",i=0,a=!1,c="";for(;i<n.length;){let l=n[i],p=n.substring(i,e.length+i),u=n[i+1],d=n.substring(i+1,e.length+i+1);if(l===r&&(d===e||u==="["||u==="]"))a?c+=u:s+=u,i+=2;else if(l==="["&&!a)s&&(o.push({type:"property",key:s}),s=""),a=!0,c="",i++;else if(l==="]"&&a){if(!/^\d+$/.test(c.trim()))throw new Error(`Invalid array index: [${c}]. Only numeric indices are supported.`);o.push({type:"index",key:c.trim()}),a=!1,c="",i++}else p===e&&!a?(s&&(o.push({type:"property",key:s}),s=""),i+=e.length):a?(c+=l,i++):(s+=l,i++)}if(a)throw new Error("Unclosed bracket in notation");if(s&&o.push({type:"property",key:s}),o.length===0)throw new Error("Invalid notation: must contain at least one property or index");return o}function Kn(n){return t=>{let e=t;for(let r of n){if(e==null)return;if(r.type==="property"){if(typeof e!="object")return;e=e[r.key]}else if(r.type==="index"){if(!Array.isArray(e))return;let o=parseInt(r.key,10);if(o<0||o>=e.length)return;e=e[o]}}return e}}function se(n,t={}){let e=Xn(n,t);return Kn(e)}function Gt(n){let t=[],e=0;for(;e<n.length;){let r=n[e];if(/\s/.test(r)){e++;continue}if(r==="|"){for(e++;e<n.length&&/\s/.test(n[e]);)e++;let o="";for(;e<n.length&&!/[\s\(\)\[\]\{\}\|\+\-\*\/\=\;\,\.]/.test(n[e]);)o+=n[e],e++;t.push({type:3,value:o});continue}if(r==='"'||r==="'"){let o=r,s=o;for(e++;e<n.length&&n[e]!==o;)n[e]==="\\"&&e+1<n.length&&n[e+1]===o?(s+="\\"+o,e+=2):(s+=n[e],e++);e<n.length&&(s+=o,e++),t.push({type:0,value:s});continue}if(/[0-9]/.test(r)){let o="",s=!1;for(;e<n.length&&(/[0-9]/.test(n[e])||n[e]==="."&&!s);)n[e]==="."&&(s=!0),o+=n[e],e++;t.push({type:0,value:o});continue}if(/[a-zA-Z_$]/.test(r)){let o="",s=!1;for(;e<n.length;)if(/[a-zA-Z0-9_$.]/.test(n[e]))o+=n[e],e++;else if(n[e]==="["){let l=1;for(o+=n[e++];e<n.length&&l>0;)n[e]==="["&&l++,n[e]==="]"&&l--,o+=n[e++]}else break;let i=0;for(;e<n.length&&/\s/.test(n[e]);)i++,e++;if(e<n.length&&n[e]==="("){s=!0,o+="(",e++;let l=1;for(;e<n.length&&l>0;)n[e]==="("&&l++,n[e]===")"&&l--,o+=n[e++]}else e-=i;let a=t[t.length-1],c=n[e-o.length-1]==="."&&a?.type===0;t.push({type:s||c?1:2,value:o});continue}e++}return t}function ie(n){let t=[],e=n.indexOf("("),r=n.lastIndexOf(")");if(e===-1||r===-1||r<=e)throw new Error("Invalid function call syntax");let o=n.slice(e+1,r),s=0;for(;s<o.length;){let i=o[s];if(/\s/.test(i)){s++;continue}if(i==='"'||i==="'"){let a=i,c="";for(s++;s<o.length&&o[s]!==a;)o[s]==="\\"?(s++,s<o.length&&(c+=o[s])):c+=o[s],s++;if(s>=o.length)throw new Error("Unterminated string in arguments");s++,t.push({type:"string",value:c});continue}if(/[0-9]/.test(i)){let a="";for(;s<o.length&&/[0-9.]/.test(o[s]);)a+=o[s],s++;t.push({type:"number",value:parseFloat(a)});continue}if(/[a-zA-Z_]/.test(i)){let a="";for(;s<o.length&&/[a-zA-Z0-9_\.]/.test(o[s]);)a+=o[s],s++;t.push({type:"identifier",value:a});continue}if(i===","){s++;continue}throw new Error(`Unexpected character in arguments: ${i}`)}return t}function Jt(n){let t=[],e=0;for(;e<n.length;){let r=n.indexOf("{{",e);if(r===-1){t.push(Wt(n.slice(e)));break}r>e&&t.push(Wt(n.slice(e,r)));let{value:o,endIndex:s,balanced:i}=Yn(n,r);if(!i)throw new Error(`Unclosed mustache tag starting at index ${r}, template: ${n}`);t.push(Zn(o)),e=s}return t}function Wt(n){return{type:"string",value:n}}function Zn(n){return{type:"mustache",value:n}}function Yn(n,t){let e="{{",r="}}",o=t+e.length,s=1;for(;o<n.length&&s>0;)n.slice(o,o+e.length)===e?(s++,o+=e.length):n.slice(o,o+r.length)===r?(s--,o+=r.length):o++;let i=s===0,a=i?o:n.length;return{value:n.slice(t,a),endIndex:a,balanced:i}}function je(n,t){let e=Jt(n).map(r=>r.type==="string"?(o,s)=>r.value:Qn(r,t));return(r,o)=>e.map(s=>s(r,o)).join("")}function Qn(n,t){let e=Gt(n.value),r=er(e,n.value,t?.pipeRegistry);return tr(r)}function er(n,t,e){let r=null;e||(e=N);for(let o of n)switch(o.type){case 0:throw Error(`Constants not supported: ${o.value}`);case 2:{r={source:se(o.value),pipes:[]};break}case 1:{r={source:nr(o.value),pipes:[]};break}case 3:{if(!r)throw Error(`Pipe '${o.value}' has no input expression in: ${t}`);if(!o.value||o.value==="")throw Error("Pipe symbol was provided, but no pipes. Template: "+t);let[s,...i]=o.value.split(":").map(c=>c.trim()),a=e.lookup(s);if(!a)throw Error(`Pipe not found: ${s}`);r.pipes.push(c=>a(c,i));break}}if(!r)throw Error(`Invalid expression: ${t}`);return r}function tr(n){return(t,e)=>{let r=n.source(t,e),o=n.pipes.reduce((s,i)=>i(s),r);return o!=null?o.toString():""}}function nr(n){let t=n.indexOf("(");if(t===-1)throw Error(`Invalid function: ${n}`);let r=ie(n).map(i=>{if(i.type==="number"||i.type==="string")return()=>i.value;if(i.type==="identifier")return a=>se(i.value)(a);throw Error(`Unsupported argument type: ${i.type}`)}),o=n.substring(0,t),s=se(o);return(i,a)=>{if(!a)throw Error(`Component context is required for calling '${o}'`);let c=s(a);if(typeof c!="function")throw Error(`Resolved '${o}' is not a function`);let l=r.map(p=>p(i));return c.apply(a,l)}}var ae=class{constructor(t,e,r,o){this.root=t;this.bindings=e;this.clickBindings=r;this.component=o}render(t){for(let e of this.bindings)e.type==="text"?e.func(t,e.node):e.func(t,e.element);for(let e of this.clickBindings){let r=this.getNodeAtPath(this.root,e.path),o=this.component?.[e.methodName];r instanceof HTMLElement&&typeof o=="function"&&(r.onclick=s=>{let i=e.argTokens.map(a=>{if(a.type==="number"||a.type==="string")return a.value;if(a.type==="identifier")return a.value==="event"?s:a.value.split(".").reduce((l,p)=>l?.[p],t)});o.apply(this.component,i)})}return this.root}getNodeAtPath(t,e){return e.reduce((r,o)=>r.childNodes[o],t)}};function rr(n){var t=new ce(n);return t}var ce=class{constructor(t){if(typeof t=="string"){let r=t.trim();if(r.startsWith("<template")){let o=document.createElement("div");o.innerHTML=r;let s=o.querySelector("template");if(!s)throw new Error("Could not find <template> in input string");this.template=s}else this.template=document.createElement("template"),this.template.innerHTML=r}else this.template=t;let e=this.getRootElement();this.bindings=this.collectBindings(e),this.clickBindings=this.collectClickBindings(e)}createInstance(t){let e=this.getRootElement().cloneNode(!0),r=this.bindings.map(o=>{let s=this.getNodeAtPath(e,o.path);return o.type==="text"?{type:"text",node:s,func:(i,a)=>o.func(i,t,a)}:{type:"attribute",element:s,name:o.name,func:(i,a)=>o.func(i,t,a)}});return new ae(e,r,this.clickBindings,t)}getRootElement(){let t=Array.from(this.template.content.childNodes).find(e=>e.nodeType===Node.ELEMENT_NODE);if(!(t instanceof HTMLElement))throw new Error("Template must contain a single root element");return t}collectBindings(t){let e=[],r=(o,s=[])=>{if(o.nodeType===Node.TEXT_NODE&&o.textContent&&o.textContent.match(/\{\{\s*(.*?)\s*\}\}/g)){let i=je(o.textContent);e.push({type:"text",path:[...s],func:(a,c,l)=>{l.textContent=i(a,c)}})}if(o.nodeType===Node.ELEMENT_NODE){let i=o;if(i.tagName==="TEMPLATE")return;for(let a=0;a<i.attributes.length;a++){let c=i.attributes[a];if(c.value.match(/\{\{\s*(.*?)\s*\}\}/g)){let l=je(c.value);e.push({type:"attribute",path:[...s],name:c.name,func:(p,u,d)=>{d.setAttribute(c.name,l(p,u))}})}}Array.from(o.childNodes).forEach((a,c)=>{r(a,[...s,c])})}};return r(t),e}collectClickBindings(t){let e=[],r=(o,s=[])=>{if(o.nodeType===Node.ELEMENT_NODE){let a=o.getAttribute("click");if(a?.trim()){let c=a.trim(),l=c.match(/^([a-zA-Z_$][\w$]*)\s*\((.*)\)$/);if(l){let p=l[1],u=ie(c);e.push({path:[...s],methodName:p,argTokens:u})}else e.push({path:[...s],methodName:c,argTokens:[]})}Array.from(o.childNodes).forEach((c,l)=>{r(c,[...s,l])})}};return r(t),e}getNodeAtPath(t,e){return e.reduce((r,o)=>r.childNodes[o],t)}};var le=class{constructor(t,e,r,o){this.dataMap=new Map;this.rowMap=new Map;this.table=t,this.template=e,this.IdColumn=r,this.component=o}render(t){this.clearRows();for(let e of t)this.renderRow(e)}clearRows(){this.table.tBodies[0].innerHTML="",this.dataMap.clear(),this.rowMap.clear()}renderRow(t){let e=t[this.IdColumn];if(e==null)throw new Error(`Missing IdColumn '${this.IdColumn}' in data`);let r=this.template.content.firstElementChild?.cloneNode(!0);if(!r)throw new Error("Template must have a <tr> as its first child");this.populateRow(r,t),this.attachEventHandlers(r,t),this.table.tBodies[0].appendChild(r),this.dataMap.set(e,t),this.rowMap.set(e,r)}populateRow(t,e){t.querySelectorAll("[data-field]").forEach(o=>{let s=o.dataset.field;s&&s in e&&(o.textContent=String(e[s]))})}attachEventHandlers(t,e){t.querySelectorAll("[onclick]").forEach(o=>{let s=o,i=s.getAttribute("onclick");if(!i)return;let a=i.match(/^(\w+)(\(([^)]*)\))?$/);if(!a)return;let[,c,,l]=a,p=l?l.split(",").map(u=>u.trim().replace(/^['"]|['"]$/g,"")):[];typeof this.component[c]=="function"&&(s.removeAttribute("onclick"),s.addEventListener("click",u=>{this.component[c](...p,e,u)}))})}update(t){let e=t[this.IdColumn];if(e==null)throw new Error(`Missing IdColumn '${this.IdColumn}' in update data`);let r=this.rowMap.get(e);r?(this.populateRow(r,t),this.attachEventHandlers(r,t),this.dataMap.set(e,t)):this.renderRow(t)}},z=class extends CustomEvent{constructor(t){super("sortchange",{detail:t,bubbles:!0,composed:!0})}},ue=class{constructor(t,e){this.sortColumns=[];this.table=t,this.component=e,this.setupListeners()}setupListeners(){this.table.tHead?.querySelectorAll("th[name]")?.forEach(e=>{e.addEventListener("click",()=>{let r=e.getAttribute("name");this.toggle(r),this.updateSortIndicators(),this.emit()})})}toggle(t){let e=this.sortColumns.findIndex(r=>r.column===t);e===-1?this.sortColumns.push({column:t,direction:"asc"}):this.sortColumns[e].direction==="asc"?this.sortColumns[e].direction="desc":this.sortColumns.splice(e,1)}emit(){let t=new z(this.sortColumns);this.component.dispatchEvent(t)}updateSortIndicators(){this.table.tHead?.querySelectorAll("th[name]")?.forEach(e=>{let r=e.querySelector(".sort-indicator");r&&e.removeChild(r);let o=e.getAttribute("name"),s=this.sortColumns.find(i=>i.column===o);if(s){let i=document.createElement("span");i.className="sort-indicator",i.textContent=s.direction==="asc"?"\u2191":"\u2193",i.style.float="right",i.style.marginLeft="5px",e.appendChild(i)}e.style.position||(e.style.position="relative")})}getSortColumns(){return[...this.sortColumns]}clear(){this.sortColumns=[],this.updateSortIndicators(),this.emit()}};var pe=(o=>(o[o.Allow=0]="Allow",o[o.Deny=1]="Deny",o[o.Continue=2]="Continue",o[o.Stop=3]="Stop",o))(pe||{}),k=class extends Error{},P=class extends k{constructor(){super(...arguments);this.isGuard=!0}};var C=class n extends Event{constructor(e,r,o,s,i){super(n.NAME,i);this.route=e;this.urlSegments=r;this.routeData=o;this.routeTarget=s}static{this.NAME="rlx.navigateRoute"}};var W=new Map,de=new Map;function me(n,t){if(_e(),W.has(n)){let r=g("Duplicate route target",{target:n??"default"});if(r)throw r;return}W.set(n,t);let e=de.get(n);e&&(de.delete(n),t(e))}function fe(n){W.delete(n)}function Kt(){de.clear(),W.clear()}function or(n){let t=W.get(n.routeTarget);t?t(n):de.set(n.routeTarget,n)}var Xt=!1;function _e(){Xt||(Xt=!0,document.addEventListener(C.NAME,n=>{or(n)}))}var Ve=class{constructor(t){this.paramName=t}isMatch(t){return!!/^\d+$/.test(t)}getValue(t){if(/^\d+$/.test(t)===!1)throw new Error(`Path is not a number, parameter name '${this.paramName}', value: '${t}'.`);return parseInt(t)}},qe=class{constructor(t){this.paramName=t}isMatch(t){return!0}getValue(t){return t}},Ue=class{constructor(t){this.value=t}isMatch(t){return t==this.value}getValue(t){return this.value}},ze=class{constructor(t,e){this.route=t;this.segments=e}match(t){if(t.length!=this.segments.length)return null;let e=[];var r={};for(let o=0;o<t.length;o++){let s=t[o],i=this.segments[o];if(!i.isMatch(s))return null;if(i.paramName){let a=i.getValue(s);r[i.paramName]=a,e.push(a.toString())}else e.push(s)}return{route:this.route,params:r,urlSegments:e}}buildUrl(t){let e=[];for(let o=0;o<this.segments.length;o++){let s=this.segments[o];if(s.paramName){var r=t[s.paramName];if(!r)throw new Error(`Route "${this.route.name}" did not get value for parameter "${s.paramName} from the provided routeData: "${JSON.stringify(t)}".`);e.push(r.toString())}else e.push(s.getValue("").toString())}return{route:this.route,params:t,urlSegments:e}}parseParameters(t){let e={};return this.segments.forEach(r=>{if(r.paramName){if(!r.isMatch(o))throw new Error(`Failed to convert parameter ${r.paramName}, or missing value: ${o}, route: ${this.route.name}.`);var o=t[r.paramName];if(!o)throw new Error(`Parameter ${r.paramName} was not provided, route: ${this.route.name}.`);var s=r.getValue(o);e[r.paramName]=s}}),e}};function ge(n,t,e){return t===""||t.indexOf("/")>=0?Ge(n,t||"/"):We(n,t,e)}function We(n,t,e){var r=n.find(i=>i.name===t);if(!r)return null;var o=Zt(r),s=o.buildUrl(e);return s}function Ge(n,t){let e=t.replace(/^\/|\/$/g,"").split("/"),r=sr(n);for(let o=0;o<r.length;o++){let i=r[o].match(e);if(i)return i}return null}function sr(n){let t=[];return n.forEach(e=>{var r=Zt(e);t.push(r)}),t}function Zt(n){var t=[];n.path.replace(/^\/|\/$/g,"").split("/").forEach(o=>{o.substring(0,1)==":"?t.push(new qe(o.substring(1))):o.substring(0,1)===";"?t.push(new Ve(o.substring(1))):o.substring(0,1)==="{"||t.push(new Ue(o))});var r=new ze(n,t);return r}var B=class extends HTMLElement{static get observedAttributes(){return["name","target","params"]}constructor(){super(),this.addEventListener("click",t=>this.handleClick(t))}handleClick(t){t.preventDefault();let e=this.getAttribute("name");if(!e)return;console.log("Calling printRoutes from RouteLink in relaxjs/components"),he();let r={};for(let a of Array.from(this.attributes))if(a.name.startsWith("param-")){let c=a.name.substring(6);r[c]=a.value}let o=this.getAttribute("params"),s;if(o)try{s=JSON.parse(o)}catch(a){let c=g("Failed to parse route params",{element:"r-link",params:o,cause:a});if(c)throw c}let i=this.getAttribute("target");s&&Object.assign(r,s);try{G(e,{params:r,target:i||void 0})}catch(a){if(a instanceof R)throw a;let c=g("Navigation failed",{element:"r-link",route:e,params:r,target:i,cause:a});if(c)throw c}}connectedCallback(){this.hasAttribute("tabindex")||this.setAttribute("tabindex","0"),this.style.cursor="pointer",this.role="link"}disconnectedCallback(){this.removeEventListener("click",this.handleClick)}};var O=class extends HTMLElement{constructor(){super(...arguments);this.name=void 0}connectedCallback(){this.name=this.getAttribute("name")??void 0,this.hasAttribute("dialog")&&(this.dialog=document.createElement("dialog"),this.dialog.addEventListener("close",()=>{this.dialog.replaceChildren()}),this.appendChild(this.dialog)),me(this.name,e=>this.onNavigate(e)),console.log("registered")}disconnectedCallback(){fe(this.name)}onNavigate(e){console.log("got nav",e),this.loadComponent(e).catch(r=>{r instanceof R||(r=g("Route navigation failed",{route:e.route.name,routeTarget:e.routeTarget,cause:r})),r&&console.error(r)})}async loadComponent(e){let r=e.route.componentTagName??customElements.getName(e.route.component);if(!r){let s=g("Failed to find component for route",{route:e.route.name,componentTagName:e.route.componentTagName,component:e.route.component?.name,routeData:e.routeData});if(s)throw s;return}await customElements.whenDefined(r);let o=document.createElement(r);await this.applyRouteData(o,e.routeData),this.dialog?(this.dialog.replaceChildren(o),this.dialog.open||this.dialog.showModal()):document.startViewTransition?document.startViewTransition(()=>this.replaceChildren(o)):this.replaceChildren(o)}close(){this.dialog?.close()}async applyRouteData(e,r){if("loadRoute"in e){let o=r??{error:"loadRoute function without mapped route data in the routes"};await e.loadRoute(o)}r&&(e.routeData=r)}};var J;function ye(){return J===void 0&&(J=ir()??"default"),J}function ir(){let n=window.location.pathname;return n=="/index.html"?"default":n.endsWith(".html")?n.slice(1,-5):null}var j=[];function he(){console.log(j)}function Yt(n){console.log("defining routes1",n),_e(),customElements.get("r-route-target")||customElements.define("r-route-target",O),customElements.get("r-link")||customElements.define("r-link",B),console.log("defining routes",n),j.length=0,j.push(...n);var t=[];if(n.forEach(e=>{e.componentTagName&&!customElements.get(e.componentTagName)&&t.push(`Component with tagName '${e.componentTagName}' is not defined in customElements.`),e.component&&!customElements.getName(e.component)&&t.push(`Component '${e.component.name}' is not defined in customElements. Used in route '${JSON.stringify(e)}'.`),e.layout===""&&(console.log("should not use empty string layout.",e),e.layout=void 0)}),t.length>0)throw new Error(t.join(`
|
|
2
|
-
`))}function Qt(){
|
|
1
|
+
"use strict";var Qe=Object.create;var M=Object.defineProperty;var et=Object.getOwnPropertyDescriptor;var an=Object.getOwnPropertyNames;var cn=Object.getPrototypeOf,ln=Object.prototype.hasOwnProperty;var tt=(n,t)=>(t=Symbol[n])?t:Symbol.for("Symbol."+n),j=n=>{throw TypeError(n)};var un=(n,t,e)=>t in n?M(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e;var Ke=(n,t)=>M(n,"name",{value:t,configurable:!0});var nt=n=>t=>{var e=n[t];if(e)return e();throw new Error("Module not found in bundle: "+t)};var A=(n,t)=>()=>(t||n((t={exports:{}}).exports,t),t.exports),pn=(n,t)=>{for(var e in t)M(n,e,{get:t[e],enumerable:!0})},rt=(n,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of an(t))!ln.call(n,o)&&o!==e&&M(n,o,{get:()=>t[o],enumerable:!(r=et(t,o))||r.enumerable});return n};var $=(n,t,e)=>(e=n!=null?Qe(cn(n)):{},rt(t||!n||!n.__esModule?M(e,"default",{value:n,enumerable:!0}):e,n)),dn=n=>rt(M({},"__esModule",{value:!0}),n);var K=n=>[,,,Qe(n?.[tt("metadata")]??null)],ot=["class","method","getter","setter","accessor","field","value","get","set"],_=n=>n!==void 0&&typeof n!="function"?j("Function expected"):n,mn=(n,t,e,r,o)=>({kind:ot[n],name:t,metadata:r,addInitializer:s=>e._?j("Already initialized"):o.push(_(s||null))}),fn=(n,t)=>un(t,tt("metadata"),n[3]),Z=(n,t,e,r)=>{for(var o=0,s=n[t>>1],i=s&&s.length;o<i;o++)t&1?s[o].call(e):r=s[o].call(e,r);return r},Y=(n,t,e,r,o,s)=>{var i,a,c,l,d,u=t&7,p=!!(t&8),m=!!(t&16),f=u>3?n.length+1:u?p?1:2:0,v=ot[u+5],h=u>3&&(n[f-1]=[]),g=n[f]||(n[f]=[]),E=u&&(!m&&!p&&(o=o.prototype),u<5&&(u>3||!m)&&et(u<4?o:{get[e](){return Ze(this,s)},set[e](x){return Ye(this,s,x)}},e));u?m&&u<4&&Ke(s,(u>2?"set ":u>1?"get ":"")+e):Ke(o,e);for(var b=r.length-1;b>=0;b--)l=mn(u,e,c={},n[3],g),u&&(l.static=p,l.private=m,d=l.access={has:m?x=>gn(o,x):x=>e in x},u^3&&(d.get=m?x=>(u^1?Ze:hn)(x,o,u^4?s:E.get):x=>x[e]),u>2&&(d.set=m?(x,P)=>Ye(x,o,P,u^4?s:E.set):(x,P)=>x[e]=P)),a=(0,r[b])(u?u<4?m?s:E[v]:u>4?void 0:{get:E.get,set:E.set}:o,l),c._=1,u^4||a===void 0?_(a)&&(u>4?h.unshift(a):u?m?s=a:E[v]=a:o=a):typeof a!="object"||a===null?j("Object expected"):(_(i=a.get)&&(E.get=i),_(i=a.set)&&(E.set=i),_(i=a.init)&&h.unshift(i));return u||fn(n,o),E&&M(o,e,E),m?u^4?s:E:o};var Ce=(n,t,e)=>t.has(n)||j("Cannot "+e),gn=(n,t)=>Object(t)!==t?j('Cannot use the "in" operator on this value'):n.has(t),Ze=(n,t,e)=>(Ce(n,t,"read from private field"),e?e.call(n):t.get(n));var Ye=(n,t,e,r)=>(Ce(n,t,"write to private field"),r?r.call(n,e):t.set(n,e),e),hn=(n,t,e)=>(Ce(n,t,"access private method"),e);var at=A(($r,bn)=>{bn.exports={greeting:"Hello, {name}!",items:"{count, plural, one {# item} other {# items}}"}});var ct=A((Fr,wn)=>{wn.exports={today:"today",yesterday:"yesterday",daysAgo:"{count, plural, one {# day ago} other {# days ago}}",pieces:"{count, plural, =0 {none} one {one} other {# pcs}}"}});var lt=A((Hr,Cn)=>{Cn.exports={required:"This field is required.",range:"Number must be between {min} and {max}, was {actual}.",digits:"Please enter only digits."}});var ut=A((Ir,Rn)=>{Rn.exports={greeting:"Hej, {name}!",items:"{count, plural, one {# sak} other {# saker}}"}});var pt=A((Dr,Sn)=>{Sn.exports={today:"idag",yesterday:"ig\xE5r",daysAgo:"{count, plural, one {# dag sedan} other {# dagar sedan}}",pieces:"{count, plural, =0 {inga} one {en} other {# st}}"}});var dt=A((Br,Nn)=>{Nn.exports={required:"Detta f\xE4lt \xE4r obligatoriskt.",range:"Talet m\xE5ste vara mellan {min} och {max}, var {actual}.",digits:"Ange endast siffror."}});var br={};pn(br,{Blueprint:()=>ce,BooleanConverter:()=>ne,BoundNode:()=>ae,ContainerService:()=>dr,DateConverter:()=>Le,DigitsValidation:()=>Ie,FormValidator:()=>Se,GuardResult:()=>pe,HttpError:()=>Je,Inject:()=>pr,LinkedList:()=>Q,NavigateRouteEvent:()=>C,Node:()=>V,NumberConverter:()=>ke,PageSelectedEvent:()=>q,Pager:()=>ee,RangeValidation:()=>He,RegisterValidator:()=>re,RelaxError:()=>R,RequiredValidation:()=>Fe,RouteError:()=>k,RouteGuardError:()=>L,RouteLink:()=>D,RouteTarget:()=>B,SSEClient:()=>Xe,SSEDataEvent:()=>we,ServiceCollection:()=>Ee,ServiceContainer:()=>xe,SortChangeEvent:()=>z,TableRenderer:()=>le,TableSorter:()=>ue,applyPipes:()=>De,asyncHandler:()=>vn,capitalizePipe:()=>Nt,clearPendingNavigations:()=>Kt,compileTemplate:()=>zt,configure:()=>hr,container:()=>nn,createBluePrint:()=>or,createConverterFromDataType:()=>gt,createConverterFromInputType:()=>ht,createPipeRegistry:()=>Ot,currencyPipe:()=>kt,datePipe:()=>Lt,daysAgoPipe:()=>Pt,defaultPipe:()=>Dt,defaultPipes:()=>S,defineRoutes:()=>Yt,del:()=>xr,findRouteByName:()=>We,findRouteByUrl:()=>Ge,firstPipe:()=>Ft,generateSequentialId:()=>on,get:()=>yr,getDataConverter:()=>ft,getParentComponent:()=>mr,getValidator:()=>Fn,html:()=>_t,internalRoutes:()=>O,joinPipe:()=>$t,keysPipe:()=>It,lastPipe:()=>Ht,lowercasePipe:()=>St,mapFormToClass:()=>Ln,matchRoute:()=>ge,navigate:()=>G,onError:()=>yn,piecesPipe:()=>At,post:()=>vr,printRoutes:()=>he,put:()=>Er,readData:()=>Pn,registerRouteTarget:()=>me,reportError:()=>y,request:()=>X,resolveValue:()=>Tr,serviceCollection:()=>Te,setFetch:()=>gr,setFormData:()=>Hn,shortenPipe:()=>Mt,startRouting:()=>Qt,ternaryPipe:()=>Bt,trimPipe:()=>Rt,unregisterRouteTarget:()=>fe,uppercasePipe:()=>Ct});module.exports=dn(br);var R=class extends Error{constructor(e,r){super(e);this.context=r}},Re=null;function yn(n){Re=n}function y(n,t){let e=new R(n,t);if(Re){let r=!1;if(Re(e,{suppress(){r=!0}}),r)return null}return e}function vn(n){return function(...t){n.call(this,...t).catch(e=>{let r=y("Async callback failed",{cause:e});if(r)throw r})}}var V=class{constructor(t,e){this.value=t;this.removeCallback=e;this.next=null;this.prev=null}remove(){this.prev&&(this.prev.next=this.next),this.next&&(this.next.prev=this.prev),this.removeCallback()}},Q=class{constructor(){this._first=null;this._last=null;this._length=0}addFirst(t){let e=this.createNode(t);this._first?(e.next=this._first,this._first.prev=e,this._first=e):(this._first=e,this._last=this._first),this._length++}addLast(t){let e=this.createNode(t);this._last?(e.prev=this._last,this._last.next=e,this._last=e):(this._first=e,this._last=e),this._length++}createNode(t){let e;return e=new V(t,()=>{this._first===e&&(this._first=e.next),this._last===e&&(this._last=e.prev),this._length--}),e}removeFirst(){if(!this._first)throw new Error("The list is empty.");let t=this._first.value;return this._first=this._first.next,this._first||(this._last=null),this._length--,t}removeLast(){if(!this._last)throw new Error("The list is empty.");let t=this._last.value;return this._last=this._last.prev,this._last||(this._first=null),this._length--,t}get length(){return this._length}get first(){return this._first}get firstValue(){return this._first?.value}get last(){return this._last}get lastValue(){return this._last?.value}};var q=class extends Event{constructor(e){super("pageselected",{bubbles:!0,composed:!0});this.page=e}},ee=class{constructor(t,e,r){this.currentPage=1;this.container=t,this.totalCount=e,this.pageSize=r,this.render()}render(){this.container.innerHTML="";let t=Math.max(1,Math.ceil(this.totalCount/this.pageSize)),e=(r,o,s=!1)=>{let i=document.createElement("button");return i.textContent=r,i.disabled=s,i.addEventListener("click",()=>this.selectPage(o)),i};this.container.appendChild(e("Previous",this.currentPage-1,this.currentPage===1));for(let r=1;r<=t;r++){let o=e(r.toString(),r);r===this.currentPage&&o.classList.add("selected"),this.container.appendChild(o)}this.container.appendChild(e("Next",this.currentPage+1,this.currentPage===t))}selectPage(t){let e=Math.max(1,Math.ceil(this.totalCount/this.pageSize));t<1||t>e||t===this.currentPage||(this.currentPage=t,this.render(),this.container.dispatchEvent(new q(this.currentPage)))}update(t){this.totalCount=t;let e=Math.max(1,Math.ceil(this.totalCount/this.pageSize));this.currentPage>e&&(this.currentPage=e),this.render()}getCurrentPage(){return this.currentPage}};function En(n){let t=n.getAttribute("id");if(t){let e=n.closest("form");if(e){let r=e.querySelector(`label[for="${t}"]`);if(r)return r.textContent?.trim()||null}}return null}var Se=class{constructor(t,e){this.form=t;this.options=e;if(!this.form)throw new Error("Form must be specified.");this.form.addEventListener("submit",r=>{if((e?.preventDefault||this.options?.submitCallback!=null)&&r.preventDefault(),this.options?.customChecks&&this.options.customChecks(t),this.validateForm())try{let o=this.options?.submitCallback?.call(this);o instanceof Promise&&o.catch(s=>{let i=y("submitCallback failed",{cause:s});if(i)throw i})}catch(o){let s=y("submitCallback failed",{cause:o});if(s)throw s}else e?.preventDefaultOnFailed!==!1&&r.preventDefault()}),e?.autoValidate&&t.addEventListener("input",()=>{this.validateForm()})}validateForm(){let t=Array.from(this.form.querySelectorAll("input,textarea,select")),e=!0;if(this.options?.useSummary!==!0)return this.form.checkValidity()?!0:(this.form.reportValidity(),this.focusFirstErrorElement(),!1);let r=[];return t.forEach(o=>{if(!o.checkValidity()){e=!1;let s=En.call(this,o)||o.name||"Unnamed Field";r.push(`${s}: ${o.validationMessage}`)}}),e?this.clearErrorSummary():(this.displayErrorSummary(r),this.focusFirstErrorElement()),e}displayErrorSummary(t){this.clearErrorSummary(),this.errorSummary||this.createErrorSummary();let e=this.errorSummary.querySelector("ul");t.forEach(r=>{let o=document.createElement("li");o.textContent=r,e.appendChild(o)})}createErrorSummary(){let t=document.createElement("div");t.className="error-summary",t.style.color="red",t.setAttribute("role","alert"),t.setAttribute("aria-live","assertive"),t.setAttribute("aria-atomic","true"),this.errorSummary=t;let e=document.createElement("ul");this.errorSummary.appendChild(e),this.form.prepend(t)}addErrorToSummary(t,e){this.errorSummary||this.createErrorSummary();let r=this.errorSummary.querySelector("ul"),o=document.createElement("li");o.textContent=`${t}: ${e}`,r.appendChild(o)}clearErrorSummary(){if(this.errorSummary){let t=this.errorSummary.querySelector("ul");t&&(t.innerHTML="")}}focusFirstErrorElement(){let t=this.form.querySelector(":invalid");t instanceof HTMLElement&&document.activeElement!==t&&t.focus()}static FindForm(t){if(t.parentElement?.tagName=="FORM")return t.parentElement;for(let e=0;e<t.children.length;e++){let r=t.children[e];if(r.tagName=="FORM")return r}throw new Error("Parent or a direct child must be a FORM for class "+t.constructor.name)}};var Ne=new Map;function xn(n){return Ne.has(n)||Ne.set(n,new Intl.PluralRules(n)),Ne.get(n)}function st(n){return n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Tn(n,t,e="en"){return n.replace(/\{(\w+)(?:, (plural|select),((?:[^{}]*\{[^{}]*\})+))?\}/g,(r,o,s,i)=>{let a=t?.[o];if(s==="plural"){let c=new RegExp(`=${st(String(a))}\\s*\\{([^{}]*)\\}`).exec(i);if(c)return c[1].replace(`{${o}}`,String(a)).replace("#",String(a));let d=xn(e).select(a),u=new RegExp(`${d}\\s*\\{([^{}]*)\\}`).exec(i)||new RegExp("other\\s*\\{([^{}]*)\\}").exec(i);return u?u[1].replace(`{${o}}`,String(a)).replace("#",String(a)):String(a)}if(s==="select"){let c=st(String(a)),l=new RegExp(`\\b${c}\\s*\\{([^{}]*)\\}`).exec(i)||new RegExp("\\bother\\s*\\{([^{}]*)\\}").exec(i);return l?l[1]:String(a)}return a!==void 0?String(a):`{${o}}`})}var it=Tn;var jr=nt({"./locales/en/r-common.json":()=>Promise.resolve().then(()=>$(at())),"./locales/en/r-pipes.json":()=>Promise.resolve().then(()=>$(ct())),"./locales/en/r-validation.json":()=>Promise.resolve().then(()=>$(lt())),"./locales/sv/r-common.json":()=>Promise.resolve().then(()=>$(ut())),"./locales/sv/r-pipes.json":()=>Promise.resolve().then(()=>$(pt())),"./locales/sv/r-validation.json":()=>Promise.resolve().then(()=>$(dt()))});var Mn="en",Me=Mn;var kn={},mt=null;function w(n,t){let[e,r]=n.includes(":")?n.split(":"):["r-common",n],o=kn[e]?.[r];if(!o)return mt&&mt(r,e,Me),n;try{return it(o,t,Me)}catch{return n}}function U(){return Me}function Ln(n,t,e={}){let r=n.querySelectorAll("input, select, textarea");if(r.forEach(o=>{if(!o.hasAttribute("name")||te(o,"disabled"))return;let s=o.getAttribute("name");if(!(s in t)){if(e.throwOnMissingProperty)throw new Error(`Form field "${s}" has no matching property in class instance`);return}let i=$n(o);i!==yt&&(t[s]=i)}),e.throwOnMissingField){let o=new Set;r.forEach(s=>{s.hasAttribute("name")&&o.add(s.getAttribute("name"))});for(let s in t)if(typeof t[s]!="function"&&Object.prototype.hasOwnProperty.call(t,s)&&!o.has(s))throw new Error(`Class property "${s}" has no matching form field`)}return t}function ft(n){let t=n.getAttribute("data-type");return t?gt(t):n instanceof HTMLInputElement?ht(n.type):"checked"in n&&typeof n.checked=="boolean"?ne:e=>e}function Pn(n){let t={},e=new FormData(n),r=new Set;e.forEach((o,s)=>{if(r.has(s))return;r.add(s);let i=e.getAll(s),a=n.elements.namedItem(s),c=a?ft(a):l=>l;if(i.length===1){let l=i[0];t[s]=typeof l=="string"?c(l):l}else t[s]=i.map(l=>typeof l=="string"?c(l):l)});for(let o=0;o<n.elements.length;o++){let s=n.elements[o];s.type==="checkbox"&&s.name&&!r.has(s.name)&&(r.add(s.name),t[s.name]=!1)}return t}function ne(n){if(!n||n=="")return;let t=n.toLowerCase();if(t==="true"||t==="on"||Number(n)>0)return!0;if(t==="false"||t==="off"||Number(n)<=0)return!1;throw new Error("Could not convert value '"+n+"' to boolean.")}function ke(n){if(!n||n=="")return;let t=Number(n);if(!isNaN(t))return t;throw new Error("Could not convert value '"+n+"' to number.")}function An(n){return new Intl.DateTimeFormat(n).formatToParts(new Date(2024,0,15)).filter(e=>e.type==="day"||e.type==="month"||e.type==="year").map(e=>e.type)}function Le(n){if(!n||n==="")return;if(/^\d{4}-\d{2}-\d{2}(T|$)/.test(n)){let r=new Date(n);if(!isNaN(r.getTime()))return r}let t=n.split(/[\/.\-\s]/);if(t.length>=3&&t.every(r=>/^\d+$/.test(r))){let r=U(),o=An(r),s={};if(o.forEach((i,a)=>{s[i]=parseInt(t[a],10)}),s.year!==void 0&&s.month!==void 0&&s.day!==void 0){s.year<100&&(s.year+=2e3);let i=new Date(s.year,s.month-1,s.day);if(!isNaN(i.getTime()))return i}}let e=new Date(n);if(isNaN(e.getTime()))throw new Error("Invalid date format");return e}function gt(n){switch(n){case"boolean":return ne;case"number":return ke;case"Date":return Le;case"string":return t=>!t||t==""?void 0:t;default:throw new Error(`Unknown data-type "${n}".`)}}function ht(n){switch(n){case"checkbox":return ne;case"number":return ke;case"date":case"datetime-local":return Le;case"month":return t=>{let[e,r]=t.split("-").map(Number);return new Date(e,r-1)};case"week":return t=>{let[e,r]=t.split("-W").map(Number);return{year:e,week:r}};case"time":return t=>{let[e,r,o=0]=t.split(":").map(Number);return{hours:e,minutes:r,seconds:o}};default:return t=>!t||t==""?void 0:t}}function te(n,t){let e=n;if(t in e&&typeof e[t]=="boolean")return e[t];let r=n.getAttribute(t);return r===null?!1:r===""||r.toLowerCase()==="true"||r.toLowerCase()===t}var yt=Symbol("skip");function $n(n){let t=n,e=t.type||n.getAttribute("type")||"";if(e==="checkbox")return te(n,"checked");if(e==="radio")return te(n,"checked")?t.value:yt;if(e==="number")return t.value?Number(t.value):null;if(e==="date")return t.value?new Date(t.value):null;if("selectedOptions"in t&&te(n,"multiple"))return Array.from(t.selectedOptions).map(r=>r.value);if("value"in t)return t.value}var Tt=new Map;function re(n,t=[]){return function(e){Tt.set(n,{validator:e,validInputTypes:t})}}function Fn(n){return Tt.get(n)}var vt,Pe;vt=[re("required")];var F=class F{static create(t){return t==="required"?new F:null}validate(t,e){t.trim()===""&&e.addError(this.getMessage())}getMessage(){return w("r-validation:required")}};Pe=K(null),F=Y(Pe,0,"RequiredValidation",vt,F),Z(Pe,1,F);var Fe=F,Et,Ae;Et=[re("range",["number"])];var H=class H{constructor(t,e){this.min=void 0;this.max=void 0;this.min=t,this.max=e}static create(t){let e=t.match(/^range\((-?\d+(?:\.\d+)?)-(-?\d+(?:\.\d+)?)\)$/);if(e){let[,r,o]=e;return new H(parseFloat(r),parseFloat(o))}return null}validate(t,e){if(t.trim()==="")return;let r=parseFloat(t);!isNaN(r)&&r>=this.min&&r<=this.max||e.addError(this.getMessage(t))}getMessage(t){return w("r-validation:range",{min:this.min,max:this.max,actual:t})}};Ae=K(null),H=Y(Ae,0,"RangeValidation",Et,H),Z(Ae,1,H);var He=H,xt,$e;xt=[re("digits",["number"])];var I=class I{static create(t){return t==="digits"?new I:null}validate(t,e){/^\d+$/.test(t)||e.addError(this.getMessage())}getMessage(){return w("r-validation:digits")}};$e=K(null),I=Y($e,0,"DigitsValidation",xt,I),Z($e,1,I);var Ie=I;function Hn(n,t,e){e&&n.querySelectorAll("select[name]").forEach(s=>{Dn(s,e)}),n.querySelectorAll("[name]").forEach(o=>{let s=o.getAttribute("name");if(!s)return;if(s.endsWith("[]")){let a=s.slice(0,-2),c=bt(t,a);if(Array.isArray(c)){let l=o,d=l.type||o.getAttribute("type")||"";if(d==="checkbox"||d==="radio")l.checked=c.includes(l.value);else if("options"in l&&wt(o,"multiple"))c.forEach(u=>{let p=Array.from(l.options).find(m=>m.value===String(u));p&&(p.selected=!0)});else if("value"in l){let u=n.querySelectorAll(`[name="${s}"]`),p=Array.from(u).indexOf(o);p>=0&&p<c.length&&(l.value=String(c[p]))}}return}let i=bt(t,s);i!=null&&In(o,i)})}function bt(n,t){let e=[],r="",o=!1;for(let s=0;s<t.length;s++){let i=t[s];i==="["&&!o?(r&&(e.push(r),r=""),o=!0,r+=i):i==="]"&&o?(r+=i,e.push(r),r="",o=!1):i==="."&&!o?r&&(e.push(r),r=""):r+=i}return r&&e.push(r),e.reduce((s,i)=>{if(!(!s||typeof s!="object")){if(i.startsWith("[")&&i.endsWith("]")){let a=i.slice(1,-1);return s[a]}return s[i]}},n)}function In(n,t){let e=n,r=e.type||n.getAttribute("type")||"";if(r==="checkbox")e.checked=!!t;else if(r==="radio")e.checked=e.value===String(t);else if(r==="date"&&t instanceof Date)e.value=t.toISOString().split("T")[0];else if(r==="datetime-local"&&t instanceof Date){let o=s=>String(s).padStart(2,"0");e.value=`${t.getFullYear()}-${o(t.getMonth()+1)}-${o(t.getDate())}T${o(t.getHours())}:${o(t.getMinutes())}`}else if("options"in e&&wt(n,"multiple")&&Array.isArray(t)){let o=Array.from(e.options),s=t.map(String);o.forEach(i=>{i.selected=s.includes(i.value)})}else"value"in e&&(e.value=String(t))}function Dn(n,t){let e=n.getAttribute("data-source"),r=n.getAttribute("name")||"",o,s="value",i="text",a=null;if(e){let p=e.match(/^\s*(\w+)\s*(?:\(\s*(\w+)\s*,\s*(\w+)\s*(?:,\s*(\w+)\s*)?\))?\s*$/);if(!p)return;o=p[1],p[2]&&p[3]&&(s=p[2],i=p[3]),p[4]&&(a=p[4])}else if(o=r.endsWith("[]")?r.slice(0,-2):r,!o)return;let c=t[o];if(c===void 0)return;let l=typeof c=="function"?c.call(t):c;if(!Array.isArray(l))return;let d=Array.from(n.options).filter(p=>p.value==="");n.innerHTML="",d.forEach(p=>n.add(p));let u=new Map;for(let p of l){if(p==null)continue;let m,f,v="";if(typeof p=="object"){if(m=String(p[s]),f=String(p[i]),a){let g=p[a];g!=null&&String(g)!==""&&(v=String(g))}}else{let g=String(p);m=g,f=g}let h=new Option(f,m);if(v){let g=u.get(v);g||(g=document.createElement("optgroup"),g.label=v,u.set(v,g),n.appendChild(g)),g.appendChild(h)}else n.add(h)}}function wt(n,t){let e=n;if(t in e&&typeof e[t]=="boolean")return e[t];let r=n.getAttribute(t);return r===null?!1:r===""||r.toLowerCase()==="true"||r.toLowerCase()===t}function Ct(n){return String(n).toUpperCase()}function Rt(n){return String(n).trimEnd().trimStart()}function St(n){return String(n).toLowerCase()}function Nt(n){let t=String(n);return t.charAt(0).toUpperCase()+t.slice(1)}function Mt(n,t){let e=String(n),r=parseInt(t,10);return e.length>r?e.substring(0,r-3)+"...":e}function kt(n,t="USD"){let e=U();return new Intl.NumberFormat(e,{style:"currency",currency:t}).format(n)}function Lt(n,t){let e=new Date(n),r=U();return t==="short"?e.toLocaleDateString(r):t==="long"?e.toLocaleDateString(r,{weekday:"long",year:"numeric",month:"long",day:"numeric"}):e.toISOString()}function Pt(n){if(!n)return"n/a";let t=new Date(n),e=new Date;t.setHours(0,0,0,0),e.setHours(0,0,0,0);let r=e.getTime()-t.getTime(),o=Math.round(r/(1e3*60*60*24));return o===0?w("r-pipes:today"):o===1?w("r-pipes:yesterday"):w("r-pipes:daysAgo",{count:o})}function At(n){if(n==null)return"n/a";let t=Number(n);return w("r-pipes:pieces",{count:t})}function $t(n,t=","){return Array.isArray(n)?n.join(t):n}function Ft(n){return!Array.isArray(n)||n.length===0?"":n[0]}function Ht(n){return!Array.isArray(n)||n.length===0?"":n[n.length-1]}function It(n){return typeof n!="object"||n===null?[]:Object.keys(n)}function Dt(n,t){return n||t}function Bt(n,t,e){return n?t:e}function Ot(){let n=new Map;return n.set("uppercase",Ct),n.set("lowercase",St),n.set("capitalize",Nt),n.set("trim",Rt),n.set("shorten",Mt),n.set("currency",kt),n.set("date",Lt),n.set("daysAgo",Pt),n.set("pieces",At),n.set("join",$t),n.set("first",Ft),n.set("last",Ht),n.set("keys",It),n.set("default",Dt),n.set("ternary",Bt),{lookup(t){return n.get(t)??null},get(t){var e=n.get(t);if(!e)throw Error("Pipe '"+t+"' not found.");return e},has(t){return n.has(t)}}}var S=Ot();function De(n,t,e=S){return t.reduce((r,o)=>{let[s,...i]=o.split(":").map(a=>a.trim());if(!e.has(s))return`[Pipe ${s} not found]`;try{return e.get(s)(r,...i)}catch(a){return`[Pipe ${s}, value: ${n}, error: ${a}]`}},n)}var Bn=S;function _t(n,...t){let e=document.createElement("template"),r=On(n);e.innerHTML=r;let o=[],s=document.createTreeWalker(e.content,NodeFilter.SHOW_ALL),i;for(;i=s.nextNode();)if(i.nodeType===Node.ELEMENT_NODE){let a=i;_n(a,t,o),customElements.get(a.tagName.toLowerCase())&&customElements.upgrade(a)}else if(i.nodeType===Node.TEXT_NODE){let a=i,c=a.textContent,l=jt(c,t);if(l)if(/€€\d+€€/.test(c)){let u=null,p=null,m=[];o.push({originalValue:c,setter(f){var v=l(f);u||(u=document.createComment(""),p=document.createComment(""),a.parentNode?.replaceChild(p,a),p.parentNode?.insertBefore(u,p)),m.forEach(b=>b.parentNode?.removeChild(b)),m=[];let h=document.createElement("template");h.innerHTML=v;let g=Array.from(h.content.childNodes),E=p.parentNode;g.forEach(b=>{E.insertBefore(b,p),m.push(b)})}})}else o.push({originalValue:c,setter(u){var p=l(u);a.textContent=p}})}return function(c){return o.forEach(l=>{l.setter(c)}),{fragment:e.content,update(l){o.forEach(d=>{d.setter(l)})}}}}function On(n){return n.raw.map((t,e)=>e<n.raw.length-1?`${t}\u20AC\u20AC${e}\u20AC\u20AC`:t).join("")}function _n(n,t,e){let r=[];for(let i of Array.from(n.attributes)){var o=i.value;if(o=="")continue;let a=/€€(\d+)€€/,c=o.match(a);if(c){let l=parseInt(c[1],10),d=t[l];if(typeof d=="function"){r.push({setter(u){let p=d.bind(u);n.removeAttribute(i.name),n[i.name]=p}});continue}}var s=jt(o,t);s!=null&&r.push({originalValue:o,setter(l){let d=s(l)??o;i.name in n?n[i.name]=d:i.value=d}})}r.length>0&&e.push({originalValue:n.tagName,setter(i){r.forEach(a=>a.setter(i))}})}function jn(n,t){return n.split(",").map(e=>{if(e=e.trim(),e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'"))return e.slice(1,-1);if(!isNaN(Number(e)))return Number(e);if(e.includes(".")){let r=e.split("."),o=t;for(let s of r){if(o==null)return;o=o[s]}return o}return t[e]})}function jt(n,t){let e=/€€(\d+)€€|{{\s*([^|]+?)(?:\|([\w|]+))?\s*}}/g,r=0,o,s=[];for(;(o=e.exec(n))!==null;){var i=n.slice(r,o.index);if(i.length>0&&s.push(c=>i),o[1]){let c=parseInt(o[1],10),l=t[c];if(!l)continue;if(typeof l=="function"){let d=l;s.push(u=>{var p=d.apply(u);return p})}else l&&l.length>0&&s.push(d=>l)}else if(o[2]){let c=o[2].trim(),l=o[3]?o[3].trim():null,d=o[4]?o[4].split("|").map(u=>u.trim()):[];s.push(u=>{var p=u[c];if(typeof p=="function")if(l){let m=jn(l,u);p=p.apply(u,m)}else p=p.call(u);return d.forEach(m=>{p=Bn.get(m)(p)}),p})}r=e.lastIndex}if(s.length==0)return null;var a=n.slice(r);return a.length>0&&s.push(c=>a),c=>{var l="";return s.forEach(d=>{var u=d(c);l+=u}),l}}function Vt(n){let t=n.split("|").map(s=>s.trim()),e=t[0],r=t.slice(1),o=e.match(/^(\w+)\s*\((.*)\)$/);if(o){let[,s,i]=o,a=i?i.split(",").map(c=>c.trim()):[];return{type:"function",fnName:s,fnArgs:a,pipes:r}}return{type:"path",path:e,pipes:r}}function oe(n,t){let r=t.replace(/\[(\d+)\]/g,".$1").split("."),o=n;for(let s of r)if(o&&typeof o=="object"&&s in o)o=o[s];else return;return o}function N(n,t,e,r=!1){let o=`[template error] ${t} (at ${e})`;if(n.onError&&n.onError(o),n.strict||r)throw new Error(o)}function Vn(n){return function(e,r,o=""){try{let s=oe(e,r);return s===void 0?(N(n,`Cannot resolve "${r}"`,o),""):s===null?"":Array.isArray(s)?s.length>0?JSON.stringify(s):"":typeof s=="object"?JSON.stringify(s):s}catch(s){let i=s instanceof Error?s.message:String(s);return N(n,`Exception resolving "${r}": ${i}`,o,!0),""}}}function qt(n,t,e,r,o){let s,i=r.pipeRegistry??S;if(n.type==="function"){let a=e?.[n.fnName];if(typeof a!="function")return N(r,`Function "${n.fnName}" not found`,o),"";let c=(n.fnArgs??[]).map(l=>l.startsWith('"')&&l.endsWith('"')||l.startsWith("'")&&l.endsWith("'")?l.slice(1,-1):isNaN(Number(l))?oe(t,l):Number(l));try{s=a(...c)}catch(l){let d=l instanceof Error?l.message:String(l);return N(r,`Error calling "${n.fnName}": ${d}`,o),""}}else{let a=oe(t,n.path);if(a===void 0)return N(r,`Cannot resolve "${n.path}"`,o),"";a===null?s="":typeof a=="object"?s=JSON.stringify(a):s=a}return n.pipes.length>0&&(s=De(s,n.pipes,i)),s}var Be=new Map;function qn(n,t,e){if(n.nodeType!==Node.TEXT_NODE||!n.textContent?.includes("{{"))return;let r=n.textContent;if(!Be.has(r)){let a=r.split(/(\{\{.*?\}\})/).map(c=>{if(c.startsWith("{{")){let l=c.slice(2,-2).trim();return{parsed:Vt(l),literal:""}}else return{parsed:null,literal:c}});Be.set(r,a)}let o=Be.get(r),s=`TextNode: "${r}"`;return(i,a)=>{let c=o.map(({parsed:l,literal:d})=>l?String(qt(l,i,a,e,s)):d).join("");n.textContent=c}}function Un(n,t,e){if(n.nodeType!==Node.ELEMENT_NODE)return;let r=n,o=[],s=Array.from(r.attributes);for(let i of s){let a=i.value.match(/\{\{(.+?)\}\}/);if(a){let c=a[1].trim(),l=Vt(c),d=i.name,u=`Attribute: ${d} on <${r.tagName.toLowerCase()}>`;o.push((p,m)=>{let f=qt(l,p,m,e,u);r.setAttribute(d,String(f))})}}if(o.length>0)return(i,a)=>o.forEach(c=>c(i,a))}function Ut(n,t,e,r,o){if(n.nodeType!==Node.ELEMENT_NODE||!n.hasAttribute(r))return;let s=n,i=s.getAttribute(r),a=s.cloneNode(!0),c=document.createComment(`${r}: ${i}`),l=s.parentNode;l.insertBefore(c,s),s.remove();let d=null,u=null,p=null,m=null;return(f,v)=>{let h=t(f,i,`${r}="${i}"`),g=o(h);if(g&&!d){if(p&&m)d=p,u=m,p=null,m=null;else{let E=a.cloneNode(!0);E.removeAttribute(r),d=E,u=Oe(E,e)}u(f,v),l.insertBefore(d,c.nextSibling)}else g&&u&&u(f,v);!g&&d&&(d.remove(),p=d,m=u,d=null,u=null)}}function zn(n,t,e){return Ut(n,t,e,"if",r=>!!r)}function Wn(n,t,e){return Ut(n,t,e,"unless",r=>!r)}function Gn(n,t,e){if(n.nodeType!==Node.ELEMENT_NODE||!n.hasAttribute("loop"))return;let r=n,o=r.getAttribute("loop"),s=o.match(/(\w+)\s+in\s+(.+)/);if(!s){N(e,`Invalid loop syntax: "${o}"`,`Element: <${r.tagName.toLowerCase()}>`);return}let[,i,a]=s,c=r.cloneNode(!0);c.removeAttribute("loop");let l=r.parentNode,d=document.createComment(`loop: ${o}`);l.insertBefore(d,r),r.remove();let u=[];return(p,m)=>{let f=oe(p,a);if(f===void 0){N(e,`Cannot resolve "${a}"`,`Loop source: "${o}"`);return}if(!Array.isArray(f)){N(e,`"${a}" is not an array in loop: "${o}"`,`Element: <${c.tagName.toLowerCase()}>`);return}let v=Math.min(u.length,f.length);for(let h=0;h<v;h++)u[h].renderer({...p,[i]:f[h]},m);for(let h=u.length-1;h>=f.length;h--)u[h].element.remove();if(f.length>v){let h=document.createDocumentFragment(),g=[];for(let b=v;b<f.length;b++){let x=c.cloneNode(!0),P=Oe(x,e);P({...p,[i]:f[b]},m),h.appendChild(x),g.push({element:x,renderer:P})}let E=v>0?u[v-1].element:d;l.insertBefore(h,E.nextSibling),u=u.slice(0,v).concat(g)}else u.length=f.length}}var Jn=[Gn,zn,Wn],Xn=[qn,Un];function Oe(n,t){let e=[],r=Vn(t);function o(a){for(let c of Jn){let l=c(a,r,t);if(l){e.push(l);return}}for(let c of Xn){let l=c(a,r,t);l&&e.push(l)}for(let c of Array.from(a.childNodes))o(c)}o(n);let s=null,i;return(a,c)=>{(s!==a||i!==c)&&(e.forEach(l=>l(a,c)),s=a,i=c)}}function zt(n,t={strict:!1}){let o=new DOMParser().parseFromString(`<template><div>${n}</div></template>`,"text/html").querySelector("template").content.firstElementChild,s=Oe(o,t);return{content:o,render:s}}function Kn(n,t={}){let{delimiter:e=".",escapeChar:r="\\"}=t;if(!n||typeof n!="string")throw new Error("Notation must be a non-empty string");let o=[],s="",i=0,a=!1,c="";for(;i<n.length;){let l=n[i],d=n.substring(i,e.length+i),u=n[i+1],p=n.substring(i+1,e.length+i+1);if(l===r&&(p===e||u==="["||u==="]"))a?c+=u:s+=u,i+=2;else if(l==="["&&!a)s&&(o.push({type:"property",key:s}),s=""),a=!0,c="",i++;else if(l==="]"&&a){if(!/^\d+$/.test(c.trim()))throw new Error(`Invalid array index: [${c}]. Only numeric indices are supported.`);o.push({type:"index",key:c.trim()}),a=!1,c="",i++}else d===e&&!a?(s&&(o.push({type:"property",key:s}),s=""),i+=e.length):a?(c+=l,i++):(s+=l,i++)}if(a)throw new Error("Unclosed bracket in notation");if(s&&o.push({type:"property",key:s}),o.length===0)throw new Error("Invalid notation: must contain at least one property or index");return o}function Zn(n){return t=>{let e=t;for(let r of n){if(e==null)return;if(r.type==="property"){if(typeof e!="object")return;e=e[r.key]}else if(r.type==="index"){if(!Array.isArray(e))return;let o=parseInt(r.key,10);if(o<0||o>=e.length)return;e=e[o]}}return e}}function se(n,t={}){let e=Kn(n,t);return Zn(e)}function Gt(n){let t=[],e=0;for(;e<n.length;){let r=n[e];if(/\s/.test(r)){e++;continue}if(r==="|"){for(e++;e<n.length&&/\s/.test(n[e]);)e++;let o="";for(;e<n.length&&!/[\s\(\)\[\]\{\}\|\+\-\*\/\=\;\,\.]/.test(n[e]);)o+=n[e],e++;t.push({type:3,value:o});continue}if(r==='"'||r==="'"){let o=r,s=o;for(e++;e<n.length&&n[e]!==o;)n[e]==="\\"&&e+1<n.length&&n[e+1]===o?(s+="\\"+o,e+=2):(s+=n[e],e++);e<n.length&&(s+=o,e++),t.push({type:0,value:s});continue}if(/[0-9]/.test(r)){let o="",s=!1;for(;e<n.length&&(/[0-9]/.test(n[e])||n[e]==="."&&!s);)n[e]==="."&&(s=!0),o+=n[e],e++;t.push({type:0,value:o});continue}if(/[a-zA-Z_$]/.test(r)){let o="",s=!1;for(;e<n.length;)if(/[a-zA-Z0-9_$.]/.test(n[e]))o+=n[e],e++;else if(n[e]==="["){let l=1;for(o+=n[e++];e<n.length&&l>0;)n[e]==="["&&l++,n[e]==="]"&&l--,o+=n[e++]}else break;let i=0;for(;e<n.length&&/\s/.test(n[e]);)i++,e++;if(e<n.length&&n[e]==="("){s=!0,o+="(",e++;let l=1;for(;e<n.length&&l>0;)n[e]==="("&&l++,n[e]===")"&&l--,o+=n[e++]}else e-=i;let a=t[t.length-1],c=n[e-o.length-1]==="."&&a?.type===0;t.push({type:s||c?1:2,value:o});continue}e++}return t}function ie(n){let t=[],e=n.indexOf("("),r=n.lastIndexOf(")");if(e===-1||r===-1||r<=e)throw new Error("Invalid function call syntax");let o=n.slice(e+1,r),s=0;for(;s<o.length;){let i=o[s];if(/\s/.test(i)){s++;continue}if(i==='"'||i==="'"){let a=i,c="";for(s++;s<o.length&&o[s]!==a;)o[s]==="\\"?(s++,s<o.length&&(c+=o[s])):c+=o[s],s++;if(s>=o.length)throw new Error("Unterminated string in arguments");s++,t.push({type:"string",value:c});continue}if(/[0-9]/.test(i)){let a="";for(;s<o.length&&/[0-9.]/.test(o[s]);)a+=o[s],s++;t.push({type:"number",value:parseFloat(a)});continue}if(/[a-zA-Z_]/.test(i)){let a="";for(;s<o.length&&/[a-zA-Z0-9_\.]/.test(o[s]);)a+=o[s],s++;t.push({type:"identifier",value:a});continue}if(i===","){s++;continue}throw new Error(`Unexpected character in arguments: ${i}`)}return t}function Jt(n){let t=[],e=0;for(;e<n.length;){let r=n.indexOf("{{",e);if(r===-1){t.push(Wt(n.slice(e)));break}r>e&&t.push(Wt(n.slice(e,r)));let{value:o,endIndex:s,balanced:i}=Qn(n,r);if(!i)throw new Error(`Unclosed mustache tag starting at index ${r}, template: ${n}`);t.push(Yn(o)),e=s}return t}function Wt(n){return{type:"string",value:n}}function Yn(n){return{type:"mustache",value:n}}function Qn(n,t){let e="{{",r="}}",o=t+e.length,s=1;for(;o<n.length&&s>0;)n.slice(o,o+e.length)===e?(s++,o+=e.length):n.slice(o,o+r.length)===r?(s--,o+=r.length):o++;let i=s===0,a=i?o:n.length;return{value:n.slice(t,a),endIndex:a,balanced:i}}function _e(n,t){let e=Jt(n).map(r=>r.type==="string"?(o,s)=>r.value:er(r,t));return(r,o)=>e.map(s=>s(r,o)).join("")}function er(n,t){let e=Gt(n.value),r=tr(e,n.value,t?.pipeRegistry);return nr(r)}function tr(n,t,e){let r=null;e||(e=S);for(let o of n)switch(o.type){case 0:throw Error(`Constants not supported: ${o.value}`);case 2:{r={source:se(o.value),pipes:[]};break}case 1:{r={source:rr(o.value),pipes:[]};break}case 3:{if(!r)throw Error(`Pipe '${o.value}' has no input expression in: ${t}`);if(!o.value||o.value==="")throw Error("Pipe symbol was provided, but no pipes. Template: "+t);let[s,...i]=o.value.split(":").map(c=>c.trim()),a=e.lookup(s);if(!a)throw Error(`Pipe not found: ${s}`);r.pipes.push(c=>a(c,i));break}}if(!r)throw Error(`Invalid expression: ${t}`);return r}function nr(n){return(t,e)=>{let r=n.source(t,e),o=n.pipes.reduce((s,i)=>i(s),r);return o!=null?o.toString():""}}function rr(n){let t=n.indexOf("(");if(t===-1)throw Error(`Invalid function: ${n}`);let r=ie(n).map(i=>{if(i.type==="number"||i.type==="string")return()=>i.value;if(i.type==="identifier")return a=>se(i.value)(a);throw Error(`Unsupported argument type: ${i.type}`)}),o=n.substring(0,t),s=se(o);return(i,a)=>{if(!a)throw Error(`Component context is required for calling '${o}'`);let c=s(a);if(typeof c!="function")throw Error(`Resolved '${o}' is not a function`);let l=r.map(d=>d(i));return c.apply(a,l)}}var ae=class{constructor(t,e,r,o){this.root=t;this.bindings=e;this.clickBindings=r;this.component=o}render(t){for(let e of this.bindings)e.type==="text"?e.func(t,e.node):e.func(t,e.element);for(let e of this.clickBindings){let r=this.getNodeAtPath(this.root,e.path),o=this.component?.[e.methodName];r instanceof HTMLElement&&typeof o=="function"&&(r.onclick=s=>{let i=e.argTokens.map(a=>{if(a.type==="number"||a.type==="string")return a.value;if(a.type==="identifier")return a.value==="event"?s:a.value.split(".").reduce((l,d)=>l?.[d],t)});o.apply(this.component,i)})}return this.root}getNodeAtPath(t,e){return e.reduce((r,o)=>r.childNodes[o],t)}};function or(n){var t=new ce(n);return t}var ce=class{constructor(t){if(typeof t=="string"){let r=t.trim();if(r.startsWith("<template")){let o=document.createElement("div");o.innerHTML=r;let s=o.querySelector("template");if(!s)throw new Error("Could not find <template> in input string");this.template=s}else this.template=document.createElement("template"),this.template.innerHTML=r}else this.template=t;let e=this.getRootElement();this.bindings=this.collectBindings(e),this.clickBindings=this.collectClickBindings(e)}createInstance(t){let e=this.getRootElement().cloneNode(!0),r=t??{},o=this.bindings.map(s=>{let i=this.getNodeAtPath(e,s.path);return s.type==="text"?{type:"text",node:i,func:(a,c)=>s.func(a,r,c)}:{type:"attribute",element:i,name:s.name,func:(a,c)=>s.func(a,r,c)}});return new ae(e,o,this.clickBindings,t)}getRootElement(){let t=Array.from(this.template.content.childNodes).find(e=>e.nodeType===Node.ELEMENT_NODE);if(!(t instanceof HTMLElement))throw new Error("Template must contain a single root element");return t}collectBindings(t){let e=[],r=(o,s=[])=>{if(o.nodeType===Node.TEXT_NODE&&o.textContent&&o.textContent.match(/\{\{\s*(.*?)\s*\}\}/g)){let i=_e(o.textContent);e.push({type:"text",path:[...s],func:(a,c,l)=>{l.textContent=i(a,c)}})}if(o.nodeType===Node.ELEMENT_NODE){let i=o;if(i.tagName==="TEMPLATE")return;for(let a=0;a<i.attributes.length;a++){let c=i.attributes[a];if(c.value.match(/\{\{\s*(.*?)\s*\}\}/g)){let l=_e(c.value);e.push({type:"attribute",path:[...s],name:c.name,func:(d,u,p)=>{p.setAttribute(c.name,l(d,u))}})}}Array.from(o.childNodes).forEach((a,c)=>{r(a,[...s,c])})}};return r(t),e}collectClickBindings(t){let e=[],r=(o,s=[])=>{if(o.nodeType===Node.ELEMENT_NODE){let a=o.getAttribute("click");if(a?.trim()){let c=a.trim(),l=c.match(/^([a-zA-Z_$][\w$]*)\s*\((.*)\)$/);if(l){let d=l[1],u=ie(c);e.push({path:[...s],methodName:d,argTokens:u})}else e.push({path:[...s],methodName:c,argTokens:[]})}Array.from(o.childNodes).forEach((c,l)=>{r(c,[...s,l])})}};return r(t),e}getNodeAtPath(t,e){return e.reduce((r,o)=>r.childNodes[o],t)}};var le=class{constructor(t,e,r,o){this.dataMap=new Map;this.rowMap=new Map;this.table=t,this.template=e,this.IdColumn=r,this.component=o}render(t){this.clearRows();for(let e of t)this.renderRow(e)}clearRows(){this.table.tBodies[0].innerHTML="",this.dataMap.clear(),this.rowMap.clear()}renderRow(t){let e=t[this.IdColumn];if(e==null)throw new Error(`Missing IdColumn '${this.IdColumn}' in data`);let r=this.template.content.firstElementChild?.cloneNode(!0);if(!r)throw new Error("Template must have a <tr> as its first child");this.populateRow(r,t),this.attachEventHandlers(r,t),this.table.tBodies[0].appendChild(r),this.dataMap.set(e,t),this.rowMap.set(e,r)}populateRow(t,e){t.querySelectorAll("[data-field]").forEach(o=>{let s=o.dataset.field;s&&s in e&&(o.textContent=String(e[s]))})}attachEventHandlers(t,e){t.querySelectorAll("[onclick]").forEach(o=>{let s=o,i=s.getAttribute("onclick");if(!i)return;let a=i.match(/^(\w+)(\(([^)]*)\))?$/);if(!a)return;let[,c,,l]=a,d=l?l.split(",").map(u=>u.trim().replace(/^['"]|['"]$/g,"")):[];typeof this.component[c]=="function"&&(s.removeAttribute("onclick"),s.addEventListener("click",u=>{this.component[c](...d,e,u)}))})}update(t){let e=t[this.IdColumn];if(e==null)throw new Error(`Missing IdColumn '${this.IdColumn}' in update data`);let r=this.rowMap.get(e);r?(this.populateRow(r,t),this.attachEventHandlers(r,t),this.dataMap.set(e,t)):this.renderRow(t)}},z=class extends CustomEvent{constructor(t){super("sortchange",{detail:t,bubbles:!0,composed:!0})}},ue=class{constructor(t,e){this.sortColumns=[];this.table=t,this.component=e,this.setupListeners()}setupListeners(){this.table.tHead?.querySelectorAll("th[name]")?.forEach(e=>{e.addEventListener("click",()=>{let r=e.getAttribute("name");this.toggle(r),this.updateSortIndicators(),this.emit()})})}toggle(t){let e=this.sortColumns.findIndex(r=>r.column===t);e===-1?this.sortColumns.push({column:t,direction:"asc"}):this.sortColumns[e].direction==="asc"?this.sortColumns[e].direction="desc":this.sortColumns.splice(e,1)}emit(){let t=new z(this.sortColumns);this.component.dispatchEvent(t)}updateSortIndicators(){this.table.tHead?.querySelectorAll("th[name]")?.forEach(e=>{let r=e,o=r.querySelector(".sort-indicator");o&&r.removeChild(o);let s=r.getAttribute("name"),i=this.sortColumns.find(a=>a.column===s);if(i){let a=document.createElement("span");a.className="sort-indicator",a.textContent=i.direction==="asc"?"\u2191":"\u2193",a.style.float="right",a.style.marginLeft="5px",r.appendChild(a)}r.style.position||(r.style.position="relative")})}getSortColumns(){return[...this.sortColumns]}clear(){this.sortColumns=[],this.updateSortIndicators(),this.emit()}};var pe=(o=>(o[o.Allow=0]="Allow",o[o.Deny=1]="Deny",o[o.Continue=2]="Continue",o[o.Stop=3]="Stop",o))(pe||{}),k=class extends Error{},L=class extends k{constructor(){super(...arguments);this.isGuard=!0}};var C=class n extends Event{constructor(e,r,o,s,i){super(n.NAME,i);this.route=e;this.urlSegments=r;this.routeData=o;this.routeTarget=s}static{this.NAME="rlx.navigateRoute"}};var W=new Map,de=new Map;function me(n,t){if(je(),W.has(n)){let r=y("Duplicate route target",{target:n??"default"});if(r)throw r;return}W.set(n,t);let e=de.get(n);e&&(de.delete(n),t(e))}function fe(n){W.delete(n)}function Kt(){de.clear(),W.clear()}function sr(n){let t=W.get(n.routeTarget);t?t(n):de.set(n.routeTarget,n)}var Xt=!1;function je(){Xt||(Xt=!0,document.addEventListener(C.NAME,n=>{sr(n)}))}var Ve=class{constructor(t){this.paramName=t}isMatch(t){return!!/^\d+$/.test(t)}getValue(t){if(/^\d+$/.test(t)===!1)throw new Error(`Path is not a number, parameter name '${this.paramName}', value: '${t}'.`);return parseInt(t)}},qe=class{constructor(t){this.paramName=t}isMatch(t){return!0}getValue(t){return t}},Ue=class{constructor(t){this.value=t}isMatch(t){return t==this.value}getValue(t){return this.value}},ze=class{constructor(t,e){this.route=t;this.segments=e}match(t){if(t.length!=this.segments.length)return null;let e=[];var r={};for(let o=0;o<t.length;o++){let s=t[o],i=this.segments[o];if(!i.isMatch(s))return null;if(i.paramName){let a=i.getValue(s);r[i.paramName]=a,e.push(a.toString())}else e.push(s)}return{route:this.route,params:r,urlSegments:e}}buildUrl(t){let e=[];for(let o=0;o<this.segments.length;o++){let s=this.segments[o];if(s.paramName){var r=t[s.paramName];if(!r)throw new Error(`Route "${this.route.name}" did not get value for parameter "${s.paramName} from the provided routeData: "${JSON.stringify(t)}".`);e.push(r.toString())}else e.push(s.getValue("").toString())}return{route:this.route,params:t,urlSegments:e}}};function ge(n,t,e){return t===""||t.indexOf("/")>=0?Ge(n,t||"/"):We(n,t,e)}function We(n,t,e){var r=n.find(i=>i.name===t);if(!r)return null;var o=Zt(r),s=o.buildUrl(e??{});return s}function Ge(n,t){let e=t.replace(/^\/|\/$/g,"").split("/"),r=ir(n);for(let o=0;o<r.length;o++){let i=r[o].match(e);if(i)return i}return null}function ir(n){let t=[];return n.forEach(e=>{var r=Zt(e);t.push(r)}),t}function Zt(n){var t=[];n.path.replace(/^\/|\/$/g,"").split("/").forEach(o=>{o.substring(0,1)==":"?t.push(new qe(o.substring(1))):o.substring(0,1)===";"?t.push(new Ve(o.substring(1))):o.substring(0,1)==="{"||t.push(new Ue(o))});var r=new ze(n,t);return r}var D=class extends HTMLElement{static get observedAttributes(){return["name","target","params"]}constructor(){super(),this.addEventListener("click",t=>this.handleClick(t))}handleClick(t){t.preventDefault();let e=this.getAttribute("name");if(!e)return;console.log("Calling printRoutes from RouteLink in relaxjs/components"),he();let r={};for(let a of Array.from(this.attributes))if(a.name.startsWith("param-")){let c=a.name.substring(6);r[c]=a.value}let o=this.getAttribute("params"),s;if(o)try{s=JSON.parse(o)}catch(a){let c=y("Failed to parse route params",{element:"r-link",params:o,cause:a});if(c)throw c}let i=this.getAttribute("target");s&&Object.assign(r,s);try{G(e,{params:r,target:i||void 0})}catch(a){if(a instanceof R)throw a;let c=y("Navigation failed",{element:"r-link",route:e,params:r,target:i,cause:a});if(c)throw c}}connectedCallback(){this.hasAttribute("tabindex")||this.setAttribute("tabindex","0"),this.style.cursor="pointer",this.role="link"}disconnectedCallback(){this.removeEventListener("click",this.handleClick)}};var B=class extends HTMLElement{constructor(){super(...arguments);this.name=void 0}connectedCallback(){this.name=this.getAttribute("name")??void 0,this.hasAttribute("dialog")&&(this.dialog=document.createElement("dialog"),this.dialog.addEventListener("close",()=>{this.dialog.replaceChildren()}),this.appendChild(this.dialog)),me(this.name,e=>this.onNavigate(e)),console.log("registered")}disconnectedCallback(){fe(this.name)}onNavigate(e){console.log("got nav",e),this.loadComponent(e).catch(r=>{r instanceof R||(r=y("Route navigation failed",{route:e.route.name,routeTarget:e.routeTarget,cause:r})),r&&console.error(r)})}async loadComponent(e){let r=e.route.componentTagName??(e.route.component?customElements.getName(e.route.component):null);if(!r){let s=y("Failed to find component for route",{route:e.route.name,componentTagName:e.route.componentTagName,component:e.route.component?.name,routeData:e.routeData});if(s)throw s;return}await customElements.whenDefined(r);let o=document.createElement(r);await this.applyRouteData(o,e.routeData),this.dialog?(this.dialog.replaceChildren(o),this.dialog.open||this.dialog.showModal()):document.startViewTransition?document.startViewTransition(()=>this.replaceChildren(o)):this.replaceChildren(o)}close(){this.dialog?.close()}async applyRouteData(e,r){if("loadRoute"in e){let o=r??{error:"loadRoute function without mapped route data in the routes"};await e.loadRoute(o)}r&&(e.routeData=r)}};var J;function ye(){return J===void 0&&(J=ar()??"default"),J}function ar(){let n=window.location.pathname;return n=="/index.html"?"default":n.endsWith(".html")?n.slice(1,-5):null}var O=[];function he(){console.log(O)}function Yt(n){console.log("defining routes1",n),je(),customElements.get("r-route-target")||customElements.define("r-route-target",B),customElements.get("r-link")||customElements.define("r-link",D),console.log("defining routes",n),O.length=0,O.push(...n);var t=[];if(n.forEach(e=>{e.componentTagName&&!customElements.get(e.componentTagName)&&t.push(`Component with tagName '${e.componentTagName}' is not defined in customElements.`),e.component&&!customElements.getName(e.component)&&t.push(`Component '${e.component.name}' is not defined in customElements. Used in route '${JSON.stringify(e)}'.`),e.layout===""&&(console.log("should not use empty string layout.",e),e.layout=void 0)}),t.length>0)throw new Error(t.join(`
|
|
2
|
+
`))}function Qt(){if(ye()==""){let s=window.location.pathname.match(/\/([^\/]+)\.html$/);s&&s[1]!==""?(console.log("setting current layut",s[1]),J=s[1]):(console.log("Setting default layout name"),J="default")}if(cr())return;let n=window.location.pathname.replace(/^\/|\/$/g,"")||"/",t=en(n,{}),e=new URLSearchParams(window.location.search);if(e.size>0&&(t.params??={},e.forEach((o,s)=>{t.params[s]=o})),tn(t))return;history.replaceState(t.urlSegments,"","/"+t.urlSegments.join("/"));let r=new C(t.route,t.urlSegments,t.params,t.route.target);document.dispatchEvent(r)}function G(n,t){console.log("navigating to ",n,t);let e=en(n,t);if(tn(e))return;let r=t?.target??e.route.target,o=e.urlSegments.join("/");window.location.pathname.replace(/^\/|\/$/g,"")!=o&&history.pushState(e.urlSegments,"","/"+e.urlSegments.join("/"));let i=new C(e.route,e.urlSegments,e.params,r);document.dispatchEvent(i)}function en(n,t){let e=t?.routes??O,r=t?.params,o=ge(e,n,r);if(!o){let s=lr(n,r,e);throw console.error(s),new k(s)}if(!ur(o))throw new L("Route guards stopped navigation for route "+n);return o}function tn(n){n||console.error("Route result is null, cannot navigate to layout.");let t=(n.route.layout??"default").replace(/\.html?$/,"");if(t===ye())return!1;if(console.log("Current layout: "+ye(),"Wanted layout: "+t),window.location.hash)throw Error('A redirect failed, does the requsted layout exist? "'+t+'"?');console.log(`requires layout switch from ${ye()} to ${t}`);let e={routeName:n.route.name,params:n.params||{}};sessionStorage.setItem("layoutNavigation",JSON.stringify(e));let r=t.indexOf(".htm")>-1?`/${t}#layout`:`/${t}.html#layout`;return console.log("redirecting to ",r),window.location.href=r,!0}function cr(){try{let n=sessionStorage.getItem("layoutNavigation");if(!n)return!1;let t=JSON.parse(n);return sessionStorage.removeItem("layoutNavigation"),console.log("session store navigation ",t),G(t.routeName,{params:t.params}),!0}catch(n){return sessionStorage.removeItem("layoutNavigation"),y("Failed to navigate from session storage",{cause:n}),!1}}function lr(n,t,e){var r="";t?r+=Object.entries(t).map(([s,i])=>`${s}=${i}`).join(", "):r=".";var o=e.map(s=>` * Name: '${s.name}', path: '${s.path}', target: ${s.target??"default"}
|
|
3
3
|
`);return`No route matched '${n}${r}'. Available routes:
|
|
4
|
-
${o}`}function
|
|
4
|
+
${o}`}function ur(n){if(!n||!n.route.guards||n.route.guards.length==0)return!0;for(let e=0;e<n.route.guards.length;e++){let r=n.route.guards[e];var t=r.check(n);if(t==0)return!0;if(t==3)return!1;if(t==1)throw new L(`Guard ${r.constructor.name} said 'Deny' for ${n.route.name}`)}return!0}function pr(n){return(t,e)=>function(){return nn.resolve(n)}}function dr(n){return t=>{let e=n??{inject:[]};e.key?Te.register(t,e):Te.registerByType(t,e)}}var ve=class{constructor(t,e,r,o={},s,i){this.classConstructor=t;this.scope=e;this.inject=r;this.properties=o;this.key=s;this.instance=i}},Ee=class{constructor(){this.servicesByKey=new Map;this.servicesByClassName=new Map}register(t,e){this.validateRegistration(t,e);let r=new ve(t,e.scope??"global",e.inject,e.properties??{},e.key,e.instance);e.key&&this.servicesByKey.set(e.key,r),this.servicesByClassName.set(t.name,r)}registerByType(t,e){this.checkNameCollision(t),e&&this.validateRegistration(t,e);let r=new ve(t,e?.scope??"global",e?.inject??[],e?.properties,e?.key,e?.instance);e?.key&&this.servicesByKey.set(e.key,r),this.servicesByClassName.set(t.name,r)}checkNameCollision(t){let e=this.servicesByClassName.get(t.name);if(e&&e.classConstructor!==t){let r=y("Service name collision: different class registered with same name",{service:t.name});if(r)throw r}}validateRegistration(t,e){if(this.checkNameCollision(t),e.key){let r=this.servicesByKey.get(e.key);if(r&&r.classConstructor!==t){let o=y("Service key already registered to a different class",{key:e.key,existingClass:r.classConstructor.name,newClass:t.name});if(o)throw o}}if(e.instance&&e.inject.length>0){let r=y("Service has both instance and inject (inject will be ignored)",{service:t.name});if(r)throw r}}tryGet(t){return typeof t=="string"?this.servicesByKey.get(t):this.servicesByClassName.get(t.name)}get(t){let e=this.tryGet(t);if(!e){let r=typeof t=="string"?t:t.name,o=y(`Failed to resolve service '${r}'`,{service:r,registeredTypes:Array.from(this.servicesByClassName.keys()),registeredKeys:Array.from(this.servicesByKey.keys())});if(o)throw o}return e}};var xe=class{constructor(t){this.serviceCollection=t;this.instances=new Map}resolve(t){let e=typeof t=="string"?t:t.name;if(this.instances.has(e))return this.instances.get(e);let r=this.serviceCollection.get(t);if(!r){let s=y(`Failed to resolve service '${e}'`,{service:e});if(s)throw s;return}if(r.instance){let s=r.instance;return this.injectFields(s,r),this.instances.set(e,s),s}let o=this.createInstance(r);return r.scope==="global"&&this.instances.set(e,o),this.injectFields(o,r),o}createInstance(t){let e=t.classConstructor,r=t.inject.map(o=>this.resolve(o));return new e(...r)}injectFields(t,e){for(let[r,o]of Object.entries(e.properties))t[r]=this.resolve(o)}},Te=new Ee,nn=new xe(Te);function mr(n,t){let e=n.parentElement;for(;e;){if(e instanceof t)return e;e=e.parentElement}return null}var fr=Math.floor(new Date("2025-01-01T00:00:00Z").getTime()/1e3),rn=0,be=0;function on(n){if(n<0||n>1048575)throw new Error("baseId must be between 0 and 1048575");let t=Math.floor(Date.now()/1e3);if(t===rn){if(be++,be>255)throw new Error("Too many IDs generated in one second")}else rn=t,be=0;let e=t-fr;if(e>1073741823)throw new Error("Timestamp exceeds allowed range (beyond 2045-01-01)");let r=BigInt(e),o=BigInt(be),s=BigInt(n);return(r<<BigInt(28)|o<<BigInt(20)|s).toString(36).toLowerCase()}var Je=class extends Error{constructor(t){super(t.statusReason),this.message=t.statusReason,this.response=t}},T={bearerTokenName:"jwt"},sn=fetch;function gr(n){sn=n??fetch}function hr(n){T={...T,...n},n.bearerTokenName===void 0&&(T.bearerTokenName="jwt")}async function X(n,t){if(T.bearerTokenName){let o=localStorage.getItem(T.bearerTokenName);if(o&&t){let s=t?.headers?new Headers(t.headers):new Headers;s.get("Authorization")||s.set("Authorization","Bearer "+o),t.headers=s}}T.timeout&&!t?.signal&&(t??={},t.signal=AbortSignal.timeout(T.timeout)),T.baseUrl&&(n[0]!=="/"&&T.baseUrl[T.baseUrl.length-1]!=="/"?n=`${T.baseUrl}/${n}`:n=T.baseUrl+n);let e=await sn(n,t);if(!e.ok)return{statusCode:e.status,statusReason:e.statusText,success:!1,contentType:e.headers.get("content-type"),body:await e.text(),charset:e.headers.get("charset"),as(){throw new Error("No response received")}};let r=null;return e.status!==204&&(r=await e.json()),{success:!0,statusCode:e.status,statusReason:e.statusText,contentType:e.headers.get("content-type"),body:r,charset:e.headers.get("charset"),as(){return r}}}async function yr(n,t,e){if(e?e.method="GET":e={method:"GET",headers:{"content-type":T.contentType??"application/json"}},t){let r="&";n.indexOf("?")===-1&&(r="?");for(let o in t){let s=t[o];n+=`${r}${o}=${s}`,r="&"}}return X(n,e)}async function vr(n,t,e){return e?(e.method="POST",e.body=t):e={method:"POST",body:t,headers:{"content-type":T.contentType??"application/json"}},X(n,e)}async function Er(n,t,e){return e?(e.method="PUT",e.body=t):e={method:"PUT",body:t,headers:{"content-type":T.contentType??"application/json"}},X(n,e)}async function xr(n,t){return t?t.method="DELETE":t={method:"DELETE",headers:{"content-type":T.contentType??"application/json"}},X(n,t)}var we=class extends Event{constructor(e,r,o){super(e,{bubbles:!0,...o});this.data=r}},Xe=class{constructor(t,e){this.url=t;this.options=e;this.target=this.resolveTarget(e?.target)}get connected(){return this.eventSource?.readyState===EventSource.OPEN}connect(){if(this.eventSource)return;let t=new EventSource(this.url,{withCredentials:this.options?.withCredentials??!1});if(this.eventSource=t,t.onopen=()=>{this.options?.onConnect?.(this)},t.onerror=e=>{this.options?.onError?.(this,e)},this.options?.eventTypes&&this.options.eventTypes.length>0)for(let e of this.options.eventTypes)t.addEventListener(e,r=>{this.dispatchEvent(e,r.data)});else t.onmessage=e=>{this.dispatchEvent("message",e.data)}}disconnect(){this.eventSource?.close(),this.eventSource=void 0}resolveTarget(t){if(!t)return document;if(typeof t=="string"){let e=document.querySelector(t);if(!e)throw new Error(`SSEClient: Target element not found: ${t}`);return e}return t}dispatchEvent(t,e){let r;if(e.length>0&&(e[0]==="{"||e[0]==="["||e[0]==='"'))try{r=JSON.parse(e)}catch{r=e}else r=e;let o=this.options?.eventFactory?this.options.eventFactory(t,r):new we(t,r);this.target.dispatchEvent(o)}};function Tr(n,t){let e=t;for(let r of n){if(e==null)return;e=e[r]}return e??void 0}
|
|
5
5
|
//# sourceMappingURL=index.js.map
|