@junojs/core 0.1.2 → 0.1.3

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/core/decorators.ts","../src/core/persist.ts","../src/core/reactivity.ts","../src/core/engine.ts","../src/core/dom.ts","../src/common/router/router.service.ts","../src/core/bootstrap.ts","../src/core/error-handler.ts","../src/common/forms/form-model.ts","../src/common/forms/validators.ts","../src/common/forms/schema.ts","../src/common/http/http.service.ts","../src/common/i18n/i18n.service.ts"],"sourcesContent":["import \"reflect-metadata\";\n\nexport function Component(config: { tag: string; template?: string; templateUrl?: string; shadow?: boolean }) {\n return (target: any) => {\n // Default shadow to true if not specified\n if (config.shadow === undefined) config.shadow = true;\n Reflect.defineMetadata('nf:config', config, target);\n };\n}\n\nexport function State() {\n return (target: any, key: string) => {\n const states: string[] = Reflect.getMetadata('nf:states', target) || [];\n states.push(key);\n Reflect.defineMetadata('nf:states', states, target);\n };\n}\n\nexport function Input() {\n return (target: any, key: string) => {\n const inputs: string[] = Reflect.getMetadata('nf:inputs', target) || [];\n inputs.push(key);\n Reflect.defineMetadata('nf:inputs', inputs, target);\n };\n}\n\nexport function Param(paramName?: string) {\n return (target: any, key: string) => {\n const params: { key: string, paramName: string }[] = Reflect.getMetadata('nf:params', target) || [];\n params.push({ key, paramName: paramName || key });\n Reflect.defineMetadata('nf:params', params, target);\n };\n}\n\nexport function Use(service: any) {\n return (target: any, key: string) => {\n Reflect.defineMetadata('nf:inject', service, target, key);\n };\n}\n\nexport function Transform() {\n return (target: any, key: string) => {\n const transforms: string[] = Reflect.getMetadata('nf:transforms', target) || [];\n transforms.push(key);\n Reflect.defineMetadata('nf:transforms', transforms, target);\n };\n}\n\nexport function Action() {\n return (target: any, key: string) => {\n const actions: string[] = Reflect.getMetadata('nf:actions', target) || [];\n actions.push(key);\n Reflect.defineMetadata('nf:actions', actions, target);\n };\n}\n\nexport interface RefineOptions {\n fields: string[];\n validate: (data: any) => boolean | Promise<boolean>;\n message: string;\n}\n\nexport interface ValidateOptions {\n predicate: (value: any) => boolean | Promise<boolean>;\n message: string;\n}\n\n/**\n * Context API: Provides a value to all nested children.\n */\nexport function Provide(key: string) {\n return (target: any, propertyKey: string) => {\n const provides: { key: string; property: string }[] = Reflect.getMetadata('nf:provides', target) || [];\n provides.push({ key, property: propertyKey });\n Reflect.defineMetadata('nf:provides', provides, target);\n };\n}\n\n/**\n * Context API: Injects a value from a parent provider.\n */\nexport function Inject(key: string) {\n return (target: any, propertyKey: string) => {\n const injects: { key: string; property: string }[] = Reflect.getMetadata('nf:injects', target) || [];\n injects.push({ key, property: propertyKey });\n Reflect.defineMetadata('nf:injects', injects, target);\n };\n}\n\n/**\n * Class-level decorator for complex, cross-field validation.\n */\nexport function Refine(options: RefineOptions) {\n return (constructor: Function) => {\n const existing: RefineOptions[] = Reflect.getMetadata('nf:refine', constructor) || [];\n existing.push(options);\n Reflect.defineMetadata('nf:refine', existing, constructor);\n };\n}\n\n/**\n * Property-level decorator for simple field validation.\n */\nexport function Validate(predicate: (value: any) => boolean | Promise<boolean>, message: string) {\n return (target: any, key: string) => {\n const validates: { key: string; predicate: (value: any) => boolean | Promise<boolean>; message: string }[] = \n Reflect.getMetadata('nf:validates', target) || [];\n validates.push({ key, predicate, message });\n Reflect.defineMetadata('nf:validates', validates, target);\n };\n}\n\n/**\n * Intercepts an event before it bubbles.\n * Returning false stops propagation automatically.\n */\nexport function Intercept(predicate: (ctx: any) => boolean | Promise<boolean>) {\n return (target: any, key: string) => {\n Reflect.defineMetadata('nf:intercept', predicate, target, key);\n };\n}\n\n/**\n * Route guard decorator for components.\n */\nexport function CanActivate(guard: () => boolean | Promise<boolean> | string | Promise<string>) {\n return (constructor: Function) => {\n Reflect.defineMetadata('nf:canActivate', guard, constructor);\n };\n}\n\n/**\n * Injects the host HTMLElement into a component property.\n */\nexport function HostElement() {\n return (target: any, key: string) => {\n const properties: string[] = Reflect.getMetadata('nf:host-properties', target) || [];\n properties.push(key);\n Reflect.defineMetadata('nf:host-properties', properties, target);\n };\n}\n\n/**\n * Decorator to attach a validation schema to a component.\n */\nexport function Schema(schema: any) {\n return (constructor: Function) => {\n Reflect.defineMetadata('nf:schema', schema, constructor);\n };\n}\n","import \"reflect-metadata\";\n\nexport type PersistStorage = 'local' | 'session';\n\ninterface PersistConfig {\n property: string;\n storage: PersistStorage;\n key: string; // Storage key: \"nf:ClassName:property\"\n}\n\n/**\n * Persist a @State property to localStorage or sessionStorage.\n * On class instantiation the value is restored; on mutation it is saved.\n *\n * Usage:\n * @State() @Persist('local') theme = 'dark';\n */\nexport function Persist(storage: PersistStorage = 'local') {\n return (target: any, propertyKey: string) => {\n const configs: PersistConfig[] =\n Reflect.getMetadata('nf:persist', target) || [];\n configs.push({\n property: propertyKey,\n storage,\n key: `nf:${target.constructor.name}:${propertyKey}`,\n });\n Reflect.defineMetadata('nf:persist', configs, target);\n };\n}\n\n// ── Helpers used by reactivity.ts and bootstrap.ts ────────\n\n/** Get the storage API for a given type, SSR safe. */\nfunction getStorage(type: PersistStorage): Storage | undefined {\n if (typeof window === 'undefined') return undefined;\n return type === 'session' ? window.sessionStorage : window.localStorage;\n}\n\n/** Restore all @Persist values onto an instance. */\nexport function restorePersistedValues(instance: any): void {\n const configs: PersistConfig[] =\n Reflect.getMetadata('nf:persist', instance) || [];\n\n for (const cfg of configs) {\n const storage = getStorage(cfg.storage);\n if (!storage) continue; // Skip during SSR\n const stored = storage.getItem(cfg.key);\n if (stored !== null) {\n try {\n (instance as any)[cfg.property] = JSON.parse(stored);\n } catch {\n (instance as any)[cfg.property] = stored;\n }\n }\n }\n}\n\n/** Save a single persisted property if it has @Persist metadata. */\nexport function savePersistedValue(\n instance: any,\n prop: string,\n value: any,\n): void {\n const configs: PersistConfig[] =\n Reflect.getMetadata('nf:persist', instance) || [];\n const cfg = configs.find((c) => c.property === prop);\n if (cfg) {\n const storage = getStorage(cfg.storage);\n if (storage) {\n storage.setItem(cfg.key, JSON.stringify(value));\n }\n }\n}\n","import \"reflect-metadata\";\nimport { savePersistedValue } from './persist';\n\nexport function createReactiveProxy(instance: any, onUpdate: () => void) {\n const stateKeys: string[] = Reflect.getMetadata('nf:states', instance) || [];\n const inputKeys: string[] = Reflect.getMetadata('nf:inputs', instance) || [];\n const reactiveKeys = [...stateKeys, ...inputKeys, 'errors'];\n\n // We need the proxy reference so methods can be bound to it (not the raw target).\n // This ensures `this.count++` inside a method flows through the Proxy set trap.\n let proxy: any;\n\n proxy = new Proxy(instance, {\n set(target, prop: string, value) {\n const oldValue = target[prop];\n target[prop] = value;\n\n // Trigger UI update only for @State-decorated properties OR the built-in 'errors' validation state\n if (reactiveKeys.includes(prop) && oldValue !== value) {\n // Auto-persist if property has @Persist decorator\n savePersistedValue(target, prop, value);\n onUpdate();\n }\n return true;\n },\n get(target, prop: string) {\n const value = target[prop];\n // Bind methods to the *proxy* so that `this` inside methods goes through the set trap\n return typeof value === 'function' ? value.bind(proxy) : value;\n }\n });\n\n return proxy;\n}\n","export class JunoEngine {\n static render(template: string, context: any): Element {\n const parser = new DOMParser();\n const doc = parser.parseFromString(`<div>${template}</div>`, 'text/html');\n const container = doc.body.firstElementChild as HTMLElement;\n\n if (!container) return document.createElement('div');\n\n // Process nodes recursively\n this.processNode(container, context);\n\n return container;\n }\n\n private static processNode(node: Node, context: any) {\n if (node.nodeType === Node.TEXT_NODE) {\n node.textContent = this.interpolate(node.textContent || '', context);\n return;\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE) return;\n\n const el = node as HTMLElement;\n const tagName = el.tagName.toLowerCase();\n\n // 1. Process <for each=\"{item in list}\">\n if (tagName === 'for') {\n const eachAttr = el.getAttribute('each')?.trim() || '';\n const cleanEach = eachAttr.replace(/^\\{/, '').replace(/\\}$/, '');\n // Support both: 'item in list' and '(item, index) in list'\n const match = cleanEach.match(/(?:\\(\\s*([a-zA-Z_$]\\w*)\\s*,\\s*([a-zA-Z_$]\\w*)\\s*\\)|([a-zA-Z_$]\\w*))\\s+in\\s+(.+)/);\n \n if (match) {\n const itemName = match[1] || match[3];\n const indexName = match[2];\n const listExpr = match[4];\n const list = this.evaluateExpression(listExpr, context);\n \n const fragment = document.createDocumentFragment();\n if (Array.isArray(list)) {\n list.forEach((item: any, idx: number) => {\n const childCtx = Object.create(context);\n childCtx[itemName] = item;\n if (indexName) {\n childCtx[indexName] = idx;\n }\n const clone = el.cloneNode(true);\n // Process children of the clone\n Array.from(clone.childNodes).forEach(child => this.processNode(child, childCtx));\n while (clone.firstChild) {\n fragment.appendChild(clone.firstChild);\n }\n });\n }\n el.parentNode?.replaceChild(fragment, el);\n }\n return; \n }\n\n // 2. Process <if condition=\"...\">\n if (tagName === 'if') {\n const condition = el.getAttribute('condition')?.trim() || '';\n const cleanCondition = condition.replace(/^\\{/, '').replace(/\\}$/, '');\n let isTrue = false;\n try {\n isTrue = !!new Function('ctx', `with(ctx) { return ${cleanCondition} }`)(context);\n } catch (e) {\n console.error(`JunoEngine condition error: ${cleanCondition}`, e);\n }\n\n const fragment = document.createDocumentFragment();\n \n // Find <else> if it exists\n const children = Array.from(el.childNodes);\n const elseIndex = children.findIndex(c => (c as HTMLElement).tagName?.toLowerCase() === 'else');\n \n const targetNodes = isTrue \n ? (elseIndex !== -1 ? children.slice(0, elseIndex) : children)\n : (elseIndex !== -1 ? Array.from(children[elseIndex].childNodes) : []);\n\n targetNodes.forEach(child => {\n const cloned = child.cloneNode(true);\n this.processNode(cloned, context);\n fragment.appendChild(cloned);\n });\n\n el.parentNode?.replaceChild(fragment, el);\n return;\n }\n\n // 3. Process attributes and nested elements\n const attrs = Array.from(el.attributes);\n const isCustomElement = tagName.includes('-');\n\n attrs.forEach(attr => {\n // Check for property binding: {expression}\n const isExpression = /^\\{[^{}]+\\}$/.test(attr.value);\n \n if (isCustomElement && isExpression) {\n // Property binding for custom elements: pass raw objects/arrays\n const expr = attr.value.slice(1, -1);\n const value = this.evaluateExpression(expr, context);\n \n // Convert hyphen-case attribute to camelCase property\n const propName = attr.name.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\n (el as any)[propName] = value;\n } else {\n // Standard attribute interpolation (string only)\n const newValue = this.interpolate(attr.value, context);\n if (newValue !== attr.value) {\n el.setAttribute(attr.name, newValue);\n }\n }\n });\n\n // Process children recursively\n const children = Array.from(el.childNodes);\n children.forEach(child => this.processNode(child, context));\n }\n\n private static evaluateExpression(expr: string, context: any): any {\n const parts = expr.trim().split('|').map((s: string) => s.trim());\n const rawExpr = parts[0];\n const pipeName = parts[1];\n const transforms: Record<string, Function> = context.__transforms__ || {};\n\n let value;\n try {\n // Handle simple property access or complex expressions\n if (/^[\\w.]+$/.test(rawExpr)) {\n value = rawExpr.split('.').reduce((o: any, i: string) => o?.[i], context);\n } else {\n // Evaluate complex expression (like array literals or logic)\n value = new Function('ctx', `with(ctx) { return ${rawExpr} }`)(context);\n }\n } catch (e) {\n return undefined;\n }\n\n if (pipeName && transforms[pipeName]) {\n value = transforms[pipeName](value);\n }\n return value;\n }\n\n private static interpolate(text: string, context: any): string {\n return text.replace(/\\{((?:[^{}]|\\{[^{}]*\\})*)\\}/g, (_, expr) => {\n const value = this.evaluateExpression(expr, context);\n return value !== undefined ? String(value) : '';\n });\n }\n}\n","/**\n * Lightweight DOM Reconciliation (surgical updates)\n * Compares current element with a new template and updates only changed parts.\n */\nexport function reconcile(target: Element | ShadowRoot, newContent: string | Element) {\n let newNode: Element | DocumentFragment;\n if (typeof newContent === 'string') {\n const parser = new DOMParser();\n const newDoc = parser.parseFromString(`<body>${newContent}</body>`, 'text/html');\n newNode = newDoc.body;\n } else {\n newNode = newContent;\n }\n\n // Track the active element and its selection if it's an input/textarea\n const root = (target instanceof ShadowRoot) ? target : document;\n const activeElement = root.activeElement as HTMLInputElement | HTMLTextAreaElement;\n const activeSelector = activeElement && activeElement.id ? `#${activeElement.id}` : null;\n const selectionStart = activeElement ? activeElement.selectionStart : null;\n const selectionEnd = activeElement ? activeElement.selectionEnd : null;\n\n diff(target as any, newNode as any, target as any);\n\n // Restore focus and selection\n if (activeSelector) {\n const el = target.querySelector(activeSelector) as HTMLInputElement;\n if (el && el !== root.activeElement) {\n el.focus();\n if (selectionStart !== null && selectionEnd !== null) {\n el.setSelectionRange(selectionStart, selectionEnd);\n }\n }\n }\n}\n\nfunction diff(oldParent: Element, newParent: Element, root: Element) {\n const oldChildren = Array.from(oldParent.childNodes);\n const newChildren = Array.from(newParent.childNodes);\n\n const max = Math.max(oldChildren.length, newChildren.length);\n for (let i = 0; i < max; i++) {\n const oldNode = oldChildren[i] as ChildNode;\n const newNode = newChildren[i] as ChildNode;\n\n // 1. If no old node, append new node\n if (!oldNode) {\n oldParent.appendChild(newNode);\n continue;\n }\n\n // 2. If no new node, remove old node\n if (!newNode) {\n oldParent.removeChild(oldNode);\n continue;\n }\n\n // 3. If nodes are different types, replace old with new\n if (oldNode.nodeType !== newNode.nodeType || (oldNode as Element).tagName !== (newNode as Element).tagName) {\n oldParent.replaceChild(newNode, oldNode);\n continue;\n }\n\n // 4. If text nodes, update content if changed\n if (oldNode.nodeType === Node.TEXT_NODE) {\n if (oldNode.textContent !== newNode.textContent) {\n oldNode.textContent = newNode.textContent;\n }\n continue;\n }\n\n // 5. If elements, sync attributes and recurse\n if (oldNode.nodeType === Node.ELEMENT_NODE) {\n const oldEl = oldNode as Element;\n const newEl = newNode as Element;\n\n // Update attributes\n const oldAttrs = oldEl.getAttributeNames();\n const newAttrs = newEl.getAttributeNames();\n\n // Remove removed attributes\n for (const name of oldAttrs) {\n if (!newEl.hasAttribute(name)) {\n oldEl.removeAttribute(name);\n }\n }\n\n // Add/Update changed attributes\n for (const name of newAttrs) {\n const newVal = newEl.getAttribute(name);\n if (oldEl.getAttribute(name) !== newVal) {\n oldEl.setAttribute(name, newVal!);\n }\n\n // PROPERTY SYNCING for Custom Elements\n // If the new element (from template) has a property set, sync it to the old element\n const propName = name.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\n if (oldEl.tagName.includes('-') && (newEl as any)[propName] !== undefined) {\n (oldEl as any)[propName] = (newEl as any)[propName];\n }\n }\n\n // Special handling for Input values to avoid cursor jumps if value is same\n if (oldEl instanceof HTMLInputElement || oldEl instanceof HTMLTextAreaElement) {\n const newVal = (newEl as any).value || newEl.getAttribute('value') || '';\n if (oldEl.value !== newVal) {\n oldEl.value = newVal;\n }\n }\n\n // Recurse children\n // SKIP recursion if the element is a custom-element (has hyphen)\n // UNLESS it is the reconciliation root itself. \n // This allows components to manage their own internal Light DOM.\n if (!oldEl.tagName.includes('-') || oldEl === root) {\n diff(oldEl, newEl, root);\n }\n }\n }\n}\n","// src/common/router/router.service.ts\n\n/**\n * Route definition Mapping a path to a component state string.\n */\nexport interface Route {\n path: string;\n tab: string; // The @State string value\n title?: string;\n canActivate?: () => boolean | Promise<boolean> | string | Promise<string>;\n}\n\nexport type RouteChangeCallback = (tab: string, params: Record<string, string>) => void;\n\n/**\n * Singleton Router service for JunoJS.\n * Syncs the browser URL with a component's @State.\n */\nexport class RouterService {\n private static _instance: RouterService;\n private routes: Route[] = [];\n private listeners: RouteChangeCallback[] = [];\n\n private lastTab: string | null = null;\n private lastParams: Record<string, string> = {};\n\n static get instance(): RouterService {\n if (!RouterService._instance) {\n RouterService._instance = new RouterService();\n }\n return RouterService._instance;\n }\n\n private constructor() {\n if (typeof window !== 'undefined') {\n window.addEventListener('popstate', () => this.handleLocationChange());\n window.addEventListener('hashchange', () => this.handleLocationChange());\n }\n }\n\n /**\n * Register available routes.\n */\n register(routes: Route[]): void {\n this.routes = routes;\n }\n\n /**\n * Programmatically navigate to a path.\n */\n navigate(path: string, trigger: boolean = true): void {\n if (typeof window === 'undefined') return;\n\n // Ensure path starts with /\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n\n if (window.location.pathname !== cleanPath) {\n window.history.pushState({}, '', cleanPath);\n if (trigger) this.handleLocationChange();\n }\n }\n\n /**\n * Subscribe to route changes.\n */\n onRouteMatch(cb: RouteChangeCallback): () => void {\n this.listeners.push(cb);\n\n // Immediately fire with current state (BehaviorSubject pattern)\n if (this.lastTab !== null) {\n cb(this.lastTab, this.lastParams);\n } else {\n // If not yet evaluated, perform initial match\n this.handleLocationChange();\n }\n\n return () => {\n this.listeners = this.listeners.filter(l => l !== cb);\n };\n }\n\n /**\n * Manually trigger initial route matching (e.g. on page load).\n */\n init(): void {\n this.handleLocationChange();\n }\n\n private async handleLocationChange(): Promise<void> {\n if (typeof window === 'undefined') return;\n\n const path = window.location.pathname;\n\n let matchedRoute: Route | undefined;\n let params: Record<string, string> = {};\n\n for (const r of this.routes) {\n if (r.path === path || `/${r.tab}` === path) {\n matchedRoute = r;\n break;\n }\n\n // Dynamic route matching (e.g. /product/:id)\n if (r.path.includes('/:')) {\n const routeParts = r.path.split('/');\n const pathParts = path.split('/');\n\n if (routeParts.length === pathParts.length) {\n let match = true;\n const extractedParams: Record<string, string> = {};\n\n for (let i = 0; i < routeParts.length; i++) {\n if (routeParts[i].startsWith(':')) {\n extractedParams[routeParts[i].substring(1)] = pathParts[i];\n } else if (routeParts[i] !== pathParts[i]) {\n match = false;\n break;\n }\n }\n\n if (match) {\n matchedRoute = r;\n params = extractedParams;\n break;\n }\n }\n }\n }\n\n if (matchedRoute) {\n if (matchedRoute.canActivate) {\n try {\n const canActivateResult = await matchedRoute.canActivate();\n if (canActivateResult === false) {\n // Block navigation - default behavior is to not change view.\n return;\n }\n if (typeof canActivateResult === 'string') {\n // Redirect to the provided path\n this.navigate(canActivateResult);\n return;\n }\n } catch (e) {\n console.error(`Route guard error on ${matchedRoute.path}:`, e);\n return;\n }\n }\n\n if (matchedRoute.title) document.title = matchedRoute.title;\n this.notify(matchedRoute.tab, params);\n } else if (path === '/' || path === '') {\n // Default to the first route if we're at root\n const first = this.routes[0];\n if (first) {\n this.notify(first.tab, {});\n }\n }\n }\n\n private notify(tab: string, params: Record<string, string>): void {\n this.lastTab = tab;\n this.lastParams = params;\n this.listeners.forEach(cb => cb(tab, params));\n }\n\n /**\n * Get the current path.\n */\n get currentPath(): string {\n return typeof window !== 'undefined' ? window.location.pathname : '/';\n }\n}\n","import \"reflect-metadata\";\nimport { createReactiveProxy } from './reactivity';\nimport { JunoEngine } from './engine';\nimport { restorePersistedValues } from './persist';\nimport { reconcile } from './dom';\nimport { RouterService } from '../common/router/router.service';\n\nexport async function bootstrap(ComponentClass: any) {\n const config = Reflect.getMetadata('nf:config', ComponentClass);\n\n if (!config || !config.tag) {\n throw new Error('Missing @Component decorator or tag!');\n }\n\n customElements.define(\n config.tag,\n class extends HTMLElement {\n private instance: any;\n private proxy: any;\n private target: HTMLElement | ShadowRoot;\n private routeUnsubscribe?: () => void;\n\n static get observedAttributes() {\n return Reflect.getMetadata('nf:inputs', ComponentClass.prototype) || [];\n }\n\n attributeChangedCallback(name: string, oldValue: string, newValue: string) {\n // Ignore literal template bindings like \"{var}\" generated by the old parser\n // They are managed strictly via rich object property binding in our engine.\n if (newValue && /^\\{[^{}]+\\}$/.test(newValue)) return;\n\n if (oldValue !== newValue) {\n // Attribute binding (always string)\n if (this.proxy) {\n this.proxy[name] = newValue;\n this.update();\n } else if (this.instance) {\n this.instance[name] = newValue;\n }\n }\n }\n\n constructor() {\n super();\n this.instance = new ComponentClass();\n \n // 0. Inject HostElement if requested\n const hostProps = Reflect.getMetadata('nf:host-properties', ComponentClass.prototype) || [];\n hostProps.forEach((key: string) => {\n this.instance[key] = this;\n });\n \n // Setup direct property proxying for @Input fields\n (Reflect.getMetadata('nf:inputs', ComponentClass.prototype) || []).forEach((key: string) => {\n // 1. Cache pre-upgrade value if JunoEngine attached one early\n let initialValue = this.hasOwnProperty(key) ? (this as any)[key] : undefined;\n \n // 2. Define the getter/setter which overwrites the raw property\n Object.defineProperty(this, key, {\n get: () => this.proxy[key],\n set: (val) => {\n this.proxy[key] = val;\n this.update();\n }\n });\n\n // 3. Restore the pre-upgrade value if one was found\n if (initialValue !== undefined) {\n this.instance[key] = initialValue;\n }\n });\n \n // 1. Inject built-in validation state\n if (!this.instance.errors) {\n this.instance.errors = {};\n }\n\n // 2. Inject built-in isValid() method for component validation\n if (!this.instance.isValid) {\n this.instance.isValid = () => {\n // Reset built-in errors\n this.proxy.errors = {};\n let valid = true;\n \n const schema = Reflect.getMetadata('nf:schema', ComponentClass);\n const refines = Reflect.getMetadata('nf:refine', ComponentClass) || [];\n const validates = Reflect.getMetadata('nf:validates', ComponentClass.prototype) || [];\n const promises: Promise<void>[] = [];\n \n // A) Schema-based Validation (Zod-like)\n if (schema && typeof schema.parse === 'function') {\n const res = schema.parse(this.proxy);\n if (res instanceof Promise) {\n promises.push(res.then(r => {\n if (!r.success) {\n valid = false;\n this.proxy.errors = { ...this.proxy.errors, ...r.errors };\n }\n }));\n } else if (!res.success) {\n valid = false;\n this.proxy.errors = { ...this.proxy.errors, ...res.errors };\n }\n }\n\n // B) @Validate-based Validation (Property-level)\n for (const v of validates) {\n const val = this.proxy[v.key];\n const result = v.predicate(val);\n\n if (result instanceof Promise) {\n promises.push(\n result.then((pass) => {\n if (!pass) {\n valid = false;\n this.proxy.errors = { ...this.proxy.errors, [v.key]: v.message };\n }\n })\n );\n } else if (!result) {\n valid = false;\n this.proxy.errors = { ...this.proxy.errors, [v.key]: v.message };\n }\n }\n\n // C) @Refine-based Validation (Classic Class-level)\n for (const ref of refines) {\n const result = ref.validate(this.proxy);\n \n if (result instanceof Promise) {\n promises.push(\n result.then((pass) => {\n if (!pass) {\n valid = false;\n const targetField = ref.fields[ref.fields.length - 1];\n this.proxy.errors = { ...this.proxy.errors, [targetField]: ref.message };\n }\n })\n );\n } else {\n if (!result) {\n valid = false;\n // Attach error message to the last field in the list (most common pattern)\n const targetField = ref.fields[ref.fields.length - 1];\n this.proxy.errors = { ...this.proxy.errors, [targetField]: ref.message };\n }\n }\n }\n \n if (promises.length > 0) {\n return Promise.all(promises).then(() => valid);\n }\n return valid;\n };\n }\n\n restorePersistedValues(this.instance);\n this.proxy = createReactiveProxy(this.instance, () => this.update());\n\n // 3. Setup Render Target (Shadow or Light DOM)\n if (config.shadow) {\n this.target = this.shadowRoot || this.attachShadow({ mode: 'open' });\n } else {\n this.target = this;\n }\n\n const dispatchEvent = (e: Event, attrName: string) => {\n let curr = e.target as HTMLElement;\n // Traverse up from target to host, looking for the first element with the attribute\n // that corresponds to a method in the component instance\n while (curr && curr !== this.parentElement) {\n const expression = curr.getAttribute(attrName);\n if (expression) {\n const match = expression.match(/^(\\w+)(?:\\((.*)\\))?$/);\n if (match) {\n const [_, methodName, argsString] = match;\n const method = this.proxy[methodName];\n \n if (typeof method === 'function') {\n // NEW: @Intercept check\n const interceptor = Reflect.getMetadata('nf:intercept', this.instance, methodName);\n if (interceptor) {\n const proceed = interceptor(this.proxy);\n if (proceed instanceof Promise) {\n proceed.then(res => {\n if (res === false) {\n e.stopImmediatePropagation();\n e.stopPropagation();\n } else {\n this.executeMethod(method, e, argsString);\n }\n });\n return;\n } else if (proceed === false) {\n e.stopImmediatePropagation();\n e.stopPropagation();\n return;\n }\n }\n\n this.executeMethod(method, e, argsString);\n return; // Found and executed locally, stop bubbling\n }\n }\n }\n if (curr === this) break;\n curr = curr.parentElement as HTMLElement;\n }\n };\n\n this.target.addEventListener('click', (e: Event) => dispatchEvent(e, '@click'));\n this.target.addEventListener('input', (e: Event) => dispatchEvent(e, '@input'));\n }\n\n private executeMethod(method: Function, e: Event, argsString?: string) {\n if (argsString !== undefined) {\n const args = argsString.split(',').map(arg => {\n arg = arg.trim();\n if (arg === 'e' || arg === '$event') return e;\n if (arg === 'true') return true;\n if (arg === 'false') return false;\n if (!isNaN(Number(arg)) && arg !== '') return Number(arg);\n if ((arg.startsWith(\"'\") && arg.endsWith(\"'\")) || (arg.startsWith('\"') && arg.endsWith('\"'))) {\n return arg.slice(1, -1);\n }\n return arg;\n });\n method.apply(this.proxy, args);\n } else {\n method.call(this.proxy, e);\n }\n }\n\n async connectedCallback() {\n // Run @CanActivate Guard if present\n const canActivateFn = Reflect.getMetadata('nf:canActivate', ComponentClass);\n if (canActivateFn) {\n try {\n const result = await canActivateFn();\n if (result === false) return; // Block render silently\n if (typeof result === 'string') {\n RouterService.instance.navigate(result);\n return; // Redirect and block render\n }\n } catch (e) {\n console.error('Guard evaluation failed:', e);\n return;\n }\n }\n\n // Run instance-level canActivate() lifecycle hook if present\n if (this.instance.canActivate) {\n try {\n const result = await this.instance.canActivate.call(this.proxy);\n if (result === false) return; // Block render silently\n if (typeof result === 'string') {\n RouterService.instance.navigate(result);\n return; // Redirect and block render\n }\n } catch (e) {\n console.error('Lifecycle canActivate hook failed:', e);\n return;\n }\n }\n\n // Load external template if templateUrl is specified\n if (config.templateUrl) {\n const response = await fetch(config.templateUrl);\n this.instance.template = await response.text();\n }\n\n // Auto-Inject Router Params if @Param decorators exist\n const paramsMeta = Reflect.getMetadata('nf:params', ComponentClass.prototype) || [];\n if (paramsMeta.length > 0) {\n const router = RouterService.instance;\n this.routeUnsubscribe = router.onRouteMatch((tab, params) => {\n paramsMeta.forEach((p: { key: string, paramName: string }) => {\n if (params[p.paramName] !== undefined && this.proxy[p.key] !== params[p.paramName]) {\n this.proxy[p.key] = params[p.paramName];\n }\n });\n });\n }\n\n // 5. Context Injection (@Inject)\n const injects = Reflect.getMetadata('nf:injects', ComponentClass.prototype) || [];\n injects.forEach((inj: { key: string; property: string }) => {\n let current: any = this.parentElement;\n let providerFound = false;\n\n while (current) {\n if (current.instance) {\n const provides = Reflect.getMetadata('nf:provides', current.instance.constructor) || [];\n const provider = provides.find((p: any) => p.key === inj.key);\n\n if (provider) {\n // Initial sync\n this.proxy[inj.property] = current.proxy[provider.property];\n\n // Since context providers are reactive, we could ideally setup a permanent link.\n // For simplicity in this engine version, we'll shadow it into the local proxy.\n // Note: Complex cases might need a more robust observer pattern here.\n providerFound = true;\n break;\n }\n }\n current = current.parentElement || (current.getRootNode() as any).host;\n }\n });\n\n // Lifecycle: onInit (async data fetching, no DOM access)\n if (this.instance.onInit) {\n await this.instance.onInit.call(this.proxy);\n }\n\n this.update();\n\n // Lifecycle: onRender (post-render, DOM access)\n if (this.instance.onRender) {\n this.instance.onRender.call(this.proxy, this);\n }\n }\n\n disconnectedCallback() {\n if (this.routeUnsubscribe) {\n this.routeUnsubscribe();\n }\n \n // Lifecycle: onDestroy (cleanup)\n if (this.instance.onDestroy) {\n this.instance.onDestroy();\n }\n }\n\n update() {\n const template: string = this.instance.template || '<div>No template</div>';\n\n // Collect @Transform methods as a pipe map for the engine\n const transformKeys: string[] =\n Reflect.getMetadata('nf:transforms', this.instance) || [];\n const transforms: Record<string, Function> = {};\n for (const key of transformKeys) {\n if (typeof this.proxy[key] === 'function') {\n transforms[key] = this.proxy[key];\n }\n }\n\n // Build context: proxy + transforms\n const context = Object.create(this.proxy);\n context.__transforms__ = transforms;\n\n const rendered = JunoEngine.render(template, context);\n reconcile(this.target, rendered);\n }\n }\n );\n}\n","/**\n * Central error-handling middleware for JunoJS.\n *\n * Usage:\n * const handler = ErrorHandler.instance;\n * handler.addMiddleware((err) => {\n * if (err.status === 401) { location.href = '/login'; return true; }\n * return false;\n * });\n */\n\nexport interface JunoJSError {\n status?: number;\n message: string;\n url?: string;\n original?: any;\n}\n\nexport type ErrorMiddleware = (error: JunoJSError) => boolean | void;\n\nexport class ErrorHandler {\n // ── Singleton ─────────────────────────────────────────────\n private static _instance: ErrorHandler;\n\n static get instance(): ErrorHandler {\n if (!ErrorHandler._instance) {\n ErrorHandler._instance = new ErrorHandler();\n }\n return ErrorHandler._instance;\n }\n\n // ── State ─────────────────────────────────────────────────\n private middlewares: ErrorMiddleware[] = [];\n\n // ── Public API ────────────────────────────────────────────\n\n /** Register an error-handling middleware. Returns an unsubscribe function. */\n addMiddleware(fn: ErrorMiddleware): () => void {\n this.middlewares.push(fn);\n return () => {\n this.middlewares = this.middlewares.filter((m) => m !== fn);\n };\n }\n\n /**\n * Run the middleware chain. The first middleware that returns `true`\n * stops propagation. If no middleware handles it, logs to console.\n */\n handle(error: JunoJSError): void {\n for (const mw of this.middlewares) {\n const handled = mw(error);\n if (handled === true) return;\n }\n // Fallback: no middleware handled the error\n console.error('[JunoJS ErrorHandler] Unhandled error:', error.message, error);\n }\n\n /** Convenience: create a JunoJSError from an HTTP Response. */\n static fromResponse(res: Response, url: string): JunoJSError {\n return {\n status: res.status,\n message: `HTTP ${res.status}: ${res.statusText}`,\n url,\n original: res,\n };\n }\n\n /** Convenience: create a JunoJSError from a caught exception. */\n static fromException(err: unknown): JunoJSError {\n if (err instanceof Error) {\n return { message: err.message, original: err };\n }\n return { message: String(err), original: err };\n }\n}\n","import \"reflect-metadata\";\n\ninterface ValidatorRule {\n name: string;\n message: string;\n validate: (value: any, instance: any) => boolean;\n}\n\n/**\n * Base class for reactive form models.\n *\n * Usage:\n * class LoginForm extends FormModel {\n * @Required() @Email() email = '';\n * @Required() password = '';\n * }\n */\nexport class FormModel {\n private _initialValues: Record<string, any> = {};\n private _touched: Record<string, boolean> = {};\n\n constructor() {\n // Snapshot initial values after the subclass constructor runs\n // (we defer to the next microtick so subclass field initialisers have run)\n queueMicrotask(() => this._captureInitialValues());\n }\n\n // ─── Public API ───────────────────────────────────────────\n\n /** Returns true if every validated field passes all its rules. */\n isValid(): boolean {\n const errors = this.getErrors();\n return Object.keys(errors).length === 0;\n }\n\n /** Returns a map of field → error messages (only fields with errors). */\n getErrors(): Record<string, string[]> {\n const validators: Map<string, ValidatorRule[]> =\n Reflect.getMetadata('nf:validators', this) || new Map();\n const errors: Record<string, string[]> = {};\n\n validators.forEach((rules, field) => {\n const value = (this as any)[field];\n const fieldErrors: string[] = [];\n\n for (const rule of rules) {\n if (!rule.validate(value, this)) {\n fieldErrors.push(rule.message);\n }\n }\n\n if (fieldErrors.length > 0) {\n errors[field] = fieldErrors;\n }\n });\n\n return errors;\n }\n\n /** Resets all fields to their initial values and clears touched state. */\n reset(): void {\n for (const [key, value] of Object.entries(this._initialValues)) {\n (this as any)[key] = value;\n }\n this._touched = {};\n }\n\n /** True if any field differs from its initial value. */\n get dirty(): boolean {\n for (const [key, initial] of Object.entries(this._initialValues)) {\n if ((this as any)[key] !== initial) return true;\n }\n return false;\n }\n\n /** Per-field touched tracking. */\n get touched(): Record<string, boolean> {\n return { ...this._touched };\n }\n\n /** Mark a field as touched (e.g. on blur). */\n markTouched(field: string): void {\n this._touched[field] = true;\n }\n\n // ─── Internals ────────────────────────────────────────────\n\n private _captureInitialValues(): void {\n const validators: Map<string, ValidatorRule[]> =\n Reflect.getMetadata('nf:validators', this) || new Map();\n\n // Capture every field that has at least one validator\n validators.forEach((_rules, field) => {\n this._initialValues[field] = (this as any)[field];\n });\n }\n}\n","import \"reflect-metadata\";\n\n// ─── Types ────────────────────────────────────────────────────\ninterface ValidatorRule {\n name: string;\n message: string;\n validate: (value: any, instance: any) => boolean;\n}\n\n// ─── Helpers ──────────────────────────────────────────────────\nfunction addValidator(target: any, key: string, rule: ValidatorRule) {\n const validators: Map<string, ValidatorRule[]> =\n Reflect.getMetadata('nf:validators', target) || new Map();\n const fieldRules = validators.get(key) || [];\n fieldRules.push(rule);\n validators.set(key, fieldRules);\n Reflect.defineMetadata('nf:validators', validators, target);\n}\n\n// ─── Decorators ───────────────────────────────────────────────\n\n/**\n * Field must be non-empty (non-null, non-undefined, non-empty-string).\n */\nexport function Required(message = 'This field is required') {\n return (target: any, key: string) => {\n addValidator(target, key, {\n name: 'required',\n message,\n validate: (value: any) =>\n value !== null && value !== undefined && String(value).trim().length > 0,\n });\n };\n}\n\n/**\n * Field must be a valid email address.\n */\nexport function Email(message = 'Invalid email address') {\n return (target: any, key: string) => {\n addValidator(target, key, {\n name: 'email',\n message,\n validate: (value: any) => {\n if (!value) return true; // let @Required handle emptiness\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(value));\n },\n });\n };\n}\n\n/**\n * Field must equal the value of another property.\n */\nexport function Match(otherProp: string, message?: string) {\n return (target: any, key: string) => {\n addValidator(target, key, {\n name: 'match',\n message: message || `Must match ${otherProp}`,\n validate: (value: any, instance: any) => value === instance[otherProp],\n });\n };\n}\n\n/**\n * Field must match a regular expression.\n */\nexport function Pattern(regex: RegExp, message = 'Invalid format') {\n return (target: any, key: string) => {\n addValidator(target, key, {\n name: 'pattern',\n message,\n validate: (value: any) => {\n if (!value) return true; // let @Required handle emptiness\n return regex.test(String(value));\n },\n });\n };\n}\n","export type ValidationResult = { success: boolean; errors?: Record<string, string> };\n\nexport class SchemaField {\n private rules: ((value: any, data: any) => string | undefined)[] = [];\n private IS_REQUIRED = false;\n\n required(msg = 'Required') {\n this.IS_REQUIRED = true;\n this.rules.push((v) => (!v && v !== 0 && v !== false ? msg : undefined));\n return this;\n }\n\n email(msg = 'Invalid email') {\n this.rules.push((v) => {\n if (!v) return undefined;\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(v)) ? undefined : msg;\n });\n return this;\n }\n\n min(length: number, msg?: string) {\n this.rules.push((v) => {\n if (!v) return undefined;\n return String(v).length < length ? (msg || `Min length ${length}`) : undefined;\n });\n return this;\n }\n\n max(length: number, msg?: string) {\n this.rules.push((v) => {\n if (!v) return undefined;\n return String(v).length > length ? (msg || `Max length ${length}`) : undefined;\n });\n return this;\n }\n\n validate(value: any, data: any): string | undefined {\n for (const rule of this.rules) {\n const error = rule(value, data);\n if (error) return error;\n }\n return undefined;\n }\n}\n\nexport class Schema {\n private fields: Record<string, SchemaField> = {};\n private refines: { validate: (data: any) => boolean | Promise<boolean>; message: string; path: string }[] = [];\n\n string() { return new SchemaField(); }\n number() { return new SchemaField(); }\n boolean() { return new SchemaField(); }\n\n shape(fields: Record<string, SchemaField>) {\n this.fields = fields;\n return this;\n }\n\n refine(validate: (data: any) => boolean | Promise<boolean>, params: { message: string; path: string }) {\n this.refines.push({ validate, ...params });\n return this;\n }\n\n async parse(data: any): Promise<ValidationResult> {\n const errors: Record<string, string> = {};\n let success = true;\n\n // Field validations\n for (const [key, field] of Object.entries(this.fields)) {\n const error = field.validate(data[key], data);\n if (error) {\n errors[key] = error;\n success = false;\n }\n }\n\n // Refine validations (cross-field)\n for (const ref of this.refines) {\n const result = ref.validate(data);\n const pass = result instanceof Promise ? await result : result;\n if (!pass) {\n errors[ref.path] = ref.message;\n success = false;\n }\n }\n\n return { success, errors: success ? undefined : errors };\n }\n}\n\nexport const s = {\n string: () => new SchemaField(),\n number: () => new SchemaField(),\n boolean: () => new SchemaField(),\n object: (fields: Record<string, SchemaField>) => new Schema().shape(fields),\n};\n","import { ErrorHandler } from '../../core/error-handler';\n\n// ─── Types ────────────────────────────────────────────────────\n\nexport interface RequestConfig {\n headers?: Record<string, string>;\n timeout?: number; // ms — auto-abort after this duration\n signal?: AbortSignal; // external AbortController signal\n params?: Record<string, string>; // URL query params\n}\n\nexport type RequestInterceptor = (\n url: string,\n init: RequestInit,\n) => [string, RequestInit] | void;\n\nexport type ResponseInterceptor = (response: Response) => Response | void;\n\n// ─── HttpClient ───────────────────────────────────────────────\n\nexport class HttpClient {\n private requestInterceptors: RequestInterceptor[] = [];\n private responseInterceptors: ResponseInterceptor[] = [];\n private errorHandler: ErrorHandler | null = null;\n\n /** Plug in the global ErrorHandler for automatic error routing. */\n setErrorHandler(handler: ErrorHandler): void {\n this.errorHandler = handler;\n }\n\n // ── Interceptors ──────────────────────────────────────────\n\n addRequestInterceptor(fn: RequestInterceptor): void {\n this.requestInterceptors.push(fn);\n }\n\n addResponseInterceptor(fn: ResponseInterceptor): void {\n this.responseInterceptors.push(fn);\n }\n\n // ── HTTP Methods ──────────────────────────────────────────\n\n async get<T>(url: string, config?: RequestConfig): Promise<T> {\n return this.request<T>('GET', url, undefined, config);\n }\n\n async post<T>(url: string, body?: any, config?: RequestConfig): Promise<T> {\n return this.request<T>('POST', url, body, config);\n }\n\n async put<T>(url: string, body?: any, config?: RequestConfig): Promise<T> {\n return this.request<T>('PUT', url, body, config);\n }\n\n async delete<T>(url: string, config?: RequestConfig): Promise<T> {\n return this.request<T>('DELETE', url, undefined, config);\n }\n\n async patch<T>(url: string, body?: any, config?: RequestConfig): Promise<T> {\n return this.request<T>('PATCH', url, body, config);\n }\n\n // ── Core ──────────────────────────────────────────────────\n\n private async request<T>(\n method: string,\n url: string,\n body?: any,\n config?: RequestConfig,\n ): Promise<T> {\n // Build URL with query params\n let finalUrl = url;\n if (config?.params) {\n const qs = new URLSearchParams(config.params).toString();\n finalUrl += (url.includes('?') ? '&' : '?') + qs;\n }\n\n // Build RequestInit\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(config?.headers || {}),\n };\n\n const init: RequestInit = { method, headers };\n\n // Auto-JSON body\n if (body !== undefined) {\n init.body = JSON.stringify(body);\n }\n\n // AbortController — timeout or external signal\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n if (config?.signal) {\n // Forward external abort\n config.signal.addEventListener('abort', () => controller.abort());\n }\n\n if (config?.timeout && config.timeout > 0) {\n timeoutId = setTimeout(() => controller.abort(), config.timeout);\n }\n\n init.signal = controller.signal;\n\n // Apply request interceptors\n for (const interceptor of this.requestInterceptors) {\n const result = interceptor(finalUrl, init);\n if (result) {\n [finalUrl, ] = result;\n Object.assign(init, result[1]);\n }\n }\n\n try {\n let response = await fetch(finalUrl, init);\n\n // Apply response interceptors\n for (const interceptor of this.responseInterceptors) {\n const modified = interceptor(response);\n if (modified) response = modified;\n }\n\n if (!response.ok) {\n // Route through ErrorHandler middleware if configured\n if (this.errorHandler) {\n this.errorHandler.handle(\n ErrorHandler.fromResponse(response, finalUrl),\n );\n }\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n // Auto-JSON parse\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n return (await response.json()) as T;\n }\n return (await response.text()) as unknown as T;\n } finally {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n }\n }\n}\n","type TranslationDict = Record<string, string>;\n\n/**\n * Singleton internationalisation service.\n *\n * Usage:\n * const i18n = I18nService.instance;\n * i18n.addTranslations('en', { greeting: 'Hello, {{name}}!' });\n * i18n.setLocale('en');\n * i18n.t('greeting', { name: 'World' }); // → \"Hello, World!\"\n */\nexport class I18nService {\n // ── Singleton ─────────────────────────────────────────────\n private static _instance: I18nService;\n\n static get instance(): I18nService {\n if (!I18nService._instance) {\n I18nService._instance = new I18nService();\n }\n return I18nService._instance;\n }\n\n // ── State ─────────────────────────────────────────────────\n private dictionaries: Map<string, TranslationDict> = new Map();\n private _locale: string = 'en';\n private _onLocaleChange: Array<() => void> = [];\n\n /** Current active locale. */\n get locale(): string {\n return this._locale;\n }\n\n // ── Public API ────────────────────────────────────────────\n\n /** Register translations for a locale. Merges with any existing entries. */\n addTranslations(locale: string, dict: TranslationDict): void {\n const existing = this.dictionaries.get(locale) || {};\n this.dictionaries.set(locale, { ...existing, ...dict });\n }\n\n /** Switch the active locale. */\n setLocale(locale: string): void {\n if (!this.dictionaries.has(locale)) {\n console.warn(`[i18n] No translations registered for locale \"${locale}\".`);\n }\n this._locale = locale;\n // Notify listeners (components can subscribe to trigger re-render)\n for (const cb of this._onLocaleChange) cb();\n }\n\n /** Subscribe to locale changes. Returns an unsubscribe function. */\n onLocaleChange(cb: () => void): () => void {\n this._onLocaleChange.push(cb);\n return () => {\n this._onLocaleChange = this._onLocaleChange.filter((fn) => fn !== cb);\n };\n }\n\n /**\n * Translate a key with optional parameter interpolation.\n * Params replace `{{paramName}}` placeholders in the translation string.\n *\n * t('greeting', { name: 'Ada' }) // \"Hello, Ada!\"\n */\n t(key: string, params?: Record<string, string | number>): string {\n const dict = this.dictionaries.get(this._locale);\n let value = dict?.[key];\n\n if (value === undefined) {\n // Fallback: return the key itself so missing translations are visible\n return key;\n }\n\n // Replace {{param}} placeholders\n if (params) {\n for (const [paramKey, paramVal] of Object.entries(params)) {\n value = value.replace(\n new RegExp(`\\\\{\\\\{${paramKey}\\\\}\\\\}`, 'g'),\n String(paramVal),\n );\n }\n }\n\n return value;\n }\n\n /** List all registered locales. */\n get availableLocales(): string[] {\n return [...this.dictionaries.keys()];\n }\n}\n"],"names":["Component","config","target","State","key","states","Input","inputs","Param","paramName","params","Use","service","Transform","transforms","Action","actions","Provide","propertyKey","provides","Inject","injects","Refine","options","constructor","existing","Validate","predicate","message","validates","Intercept","CanActivate","guard","HostElement","properties","Schema","schema","Persist","storage","configs","getStorage","type","restorePersistedValues","instance","cfg","stored","savePersistedValue","prop","value","c","createReactiveProxy","onUpdate","stateKeys","inputKeys","reactiveKeys","proxy","oldValue","JunoEngine","template","context","container","node","el","tagName","match","_a","itemName","indexName","listExpr","list","fragment","item","idx","childCtx","clone","child","_b","cleanCondition","_c","isTrue","e","children","elseIndex","cloned","_d","attrs","isCustomElement","attr","isExpression","expr","propName","g","newValue","parts","s","rawExpr","pipeName","o","i","text","_","reconcile","newContent","newNode","root","activeElement","activeSelector","selectionStart","selectionEnd","diff","oldParent","newParent","oldChildren","newChildren","max","oldNode","oldEl","newEl","oldAttrs","newAttrs","name","newVal","_RouterService","__publicField","routes","path","trigger","cleanPath","cb","l","matchedRoute","r","routeParts","pathParts","extractedParams","canActivateResult","first","tab","RouterService","bootstrap","ComponentClass","initialValue","val","valid","refines","promises","res","v","result","pass","ref","targetField","dispatchEvent","attrName","curr","expression","methodName","argsString","method","interceptor","proceed","args","arg","canActivateFn","response","paramsMeta","router","p","inj","current","provider","transformKeys","rendered","_ErrorHandler","fn","m","error","mw","url","err","ErrorHandler","FormModel","errors","validators","rules","field","fieldErrors","rule","initial","_rules","addValidator","fieldRules","Required","Email","Match","otherProp","Pattern","regex","SchemaField","msg","length","data","fields","validate","success","HttpClient","handler","body","finalUrl","qs","headers","init","controller","timeoutId","modified","_I18nService","locale","dict","paramKey","paramVal","I18nService"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/core/decorators.ts","../src/core/persist.ts","../src/core/reactivity.ts","../src/core/engine.ts","../src/core/dom.ts","../src/common/router/router.service.ts","../src/core/bootstrap.ts","../src/core/error-handler.ts","../src/common/forms/form-model.ts","../src/common/forms/validators.ts","../src/common/forms/schema.ts","../src/common/http/http.service.ts","../src/common/i18n/i18n.service.ts"],"sourcesContent":["import \"reflect-metadata\";\n\nexport function Component(config: { tag: string; template?: string; templateUrl?: string; shadow?: boolean }) {\n return (target: any) => {\n // Default shadow to true if not specified\n if (config.shadow === undefined) config.shadow = true;\n Reflect.defineMetadata('nf:config', config, target);\n };\n}\n\nexport function State() {\n return (target: any, key: string) => {\n const states: string[] = Reflect.getMetadata('nf:states', target) || [];\n states.push(key);\n Reflect.defineMetadata('nf:states', states, target);\n };\n}\n\nexport function Input() {\n return (target: any, key: string) => {\n const inputs: string[] = Reflect.getMetadata('nf:inputs', target) || [];\n inputs.push(key);\n Reflect.defineMetadata('nf:inputs', inputs, target);\n };\n}\n\nexport function Param(paramName?: string) {\n return (target: any, key: string) => {\n const params: { key: string, paramName: string }[] = Reflect.getMetadata('nf:params', target) || [];\n params.push({ key, paramName: paramName || key });\n Reflect.defineMetadata('nf:params', params, target);\n };\n}\n\nexport function Use(service: any) {\n return (target: any, key: string) => {\n Reflect.defineMetadata('nf:inject', service, target, key);\n };\n}\n\nexport function Transform() {\n return (target: any, key: string) => {\n const transforms: string[] = Reflect.getMetadata('nf:transforms', target) || [];\n transforms.push(key);\n Reflect.defineMetadata('nf:transforms', transforms, target);\n };\n}\n\nexport function Action() {\n return (target: any, key: string) => {\n const actions: string[] = Reflect.getMetadata('nf:actions', target) || [];\n actions.push(key);\n Reflect.defineMetadata('nf:actions', actions, target);\n };\n}\n\nexport interface RefineOptions {\n fields: string[];\n validate: (data: any) => boolean | Promise<boolean>;\n message: string;\n}\n\nexport interface ValidateOptions {\n predicate: (value: any) => boolean | Promise<boolean>;\n message: string;\n}\n\n/**\n * Context API: Provides a value to all nested children.\n */\nexport function Provide(key: string) {\n return (target: any, propertyKey: string) => {\n const provides: { key: string; property: string }[] = Reflect.getMetadata('nf:provides', target) || [];\n provides.push({ key, property: propertyKey });\n Reflect.defineMetadata('nf:provides', provides, target);\n };\n}\n\n/**\n * Context API: Injects a value from a parent provider.\n */\nexport function Inject(key: string) {\n return (target: any, propertyKey: string) => {\n const injects: { key: string; property: string }[] = Reflect.getMetadata('nf:injects', target) || [];\n injects.push({ key, property: propertyKey });\n Reflect.defineMetadata('nf:injects', injects, target);\n };\n}\n\n/**\n * Class-level decorator for complex, cross-field validation.\n */\nexport function Refine(options: RefineOptions) {\n return (constructor: Function) => {\n const existing: RefineOptions[] = Reflect.getMetadata('nf:refine', constructor) || [];\n existing.push(options);\n Reflect.defineMetadata('nf:refine', existing, constructor);\n };\n}\n\n/**\n * Property-level decorator for simple field validation.\n */\nexport function Validate(predicate: (value: any) => boolean | Promise<boolean>, message: string) {\n return (target: any, key: string) => {\n const validates: { key: string; predicate: (value: any) => boolean | Promise<boolean>; message: string }[] = \n Reflect.getMetadata('nf:validates', target) || [];\n validates.push({ key, predicate, message });\n Reflect.defineMetadata('nf:validates', validates, target);\n };\n}\n\n/**\n * Intercepts an event before it bubbles.\n * Returning false stops propagation automatically.\n */\nexport function Intercept(predicate: (ctx: any) => boolean | Promise<boolean>) {\n return (target: any, key: string) => {\n Reflect.defineMetadata('nf:intercept', predicate, target, key);\n };\n}\n\n/**\n * Route guard decorator for components.\n */\nexport function CanActivate(guard: () => boolean | Promise<boolean> | string | Promise<string>) {\n return (constructor: Function) => {\n Reflect.defineMetadata('nf:canActivate', guard, constructor);\n };\n}\n\n/**\n * Injects the host HTMLElement into a component property.\n */\nexport function HostElement() {\n return (target: any, key: string) => {\n const properties: string[] = Reflect.getMetadata('nf:host-properties', target) || [];\n properties.push(key);\n Reflect.defineMetadata('nf:host-properties', properties, target);\n };\n}\n\n/**\n * Decorator to attach a validation schema to a component.\n */\nexport function Schema(schema: any) {\n return (constructor: Function) => {\n Reflect.defineMetadata('nf:schema', schema, constructor);\n };\n}\n","import \"reflect-metadata\";\n\nexport type PersistStorage = 'local' | 'session';\n\ninterface PersistConfig {\n property: string;\n storage: PersistStorage;\n key: string; // Storage key: \"nf:ClassName:property\"\n}\n\n/**\n * Persist a @State property to localStorage or sessionStorage.\n * On class instantiation the value is restored; on mutation it is saved.\n *\n * Usage:\n * @State() @Persist('local') theme = 'dark';\n */\nexport function Persist(storage: PersistStorage = 'local') {\n return (target: any, propertyKey: string) => {\n const configs: PersistConfig[] =\n Reflect.getMetadata('nf:persist', target) || [];\n configs.push({\n property: propertyKey,\n storage,\n key: `nf:${target.constructor.name}:${propertyKey}`,\n });\n Reflect.defineMetadata('nf:persist', configs, target);\n };\n}\n\n// ── Helpers used by reactivity.ts and bootstrap.ts ────────\n\n/** Get the storage API for a given type, SSR safe. */\nfunction getStorage(type: PersistStorage): Storage | undefined {\n if (typeof window === 'undefined') return undefined;\n return type === 'session' ? window.sessionStorage : window.localStorage;\n}\n\n/** Restore all @Persist values onto an instance. */\nexport function restorePersistedValues(instance: any): void {\n const configs: PersistConfig[] =\n Reflect.getMetadata('nf:persist', instance) || [];\n\n for (const cfg of configs) {\n const storage = getStorage(cfg.storage);\n if (!storage) continue; // Skip during SSR\n const stored = storage.getItem(cfg.key);\n if (stored !== null) {\n try {\n (instance as any)[cfg.property] = JSON.parse(stored);\n } catch {\n (instance as any)[cfg.property] = stored;\n }\n }\n }\n}\n\n/** Save a single persisted property if it has @Persist metadata. */\nexport function savePersistedValue(\n instance: any,\n prop: string,\n value: any,\n): void {\n const configs: PersistConfig[] =\n Reflect.getMetadata('nf:persist', instance) || [];\n const cfg = configs.find((c) => c.property === prop);\n if (cfg) {\n const storage = getStorage(cfg.storage);\n if (storage) {\n storage.setItem(cfg.key, JSON.stringify(value));\n }\n }\n}\n","import \"reflect-metadata\";\nimport { savePersistedValue } from './persist';\n\nexport function createReactiveProxy(instance: any, onUpdate: () => void) {\n const stateKeys: string[] = Reflect.getMetadata('nf:states', instance) || [];\n const inputKeys: string[] = Reflect.getMetadata('nf:inputs', instance) || [];\n const reactiveKeys = [...stateKeys, ...inputKeys, 'errors'];\n\n // We need the proxy reference so methods can be bound to it (not the raw target).\n // This ensures `this.count++` inside a method flows through the Proxy set trap.\n let proxy: any;\n\n proxy = new Proxy(instance, {\n set(target, prop: string, value) {\n const oldValue = target[prop];\n target[prop] = value;\n\n // Trigger UI update only for @State-decorated properties OR the built-in 'errors' validation state\n if (reactiveKeys.includes(prop) && oldValue !== value) {\n // Auto-persist if property has @Persist decorator\n savePersistedValue(target, prop, value);\n onUpdate();\n }\n return true;\n },\n get(target, prop: string) {\n const value = target[prop];\n // Bind methods to the *proxy* so that `this` inside methods goes through the set trap\n return typeof value === 'function' ? value.bind(proxy) : value;\n }\n });\n\n return proxy;\n}\n","export class JunoEngine {\n static render(template: string, context: any): Element {\n const parser = new DOMParser();\n const doc = parser.parseFromString(`<div>${template}</div>`, 'text/html');\n const container = doc.body.firstElementChild as HTMLElement;\n\n if (!container) return document.createElement('div');\n\n // Process nodes recursively\n this.processNode(container, context);\n\n return container;\n }\n\n private static processNode(node: Node, context: any) {\n if (node.nodeType === Node.TEXT_NODE) {\n node.textContent = this.interpolate(node.textContent || '', context);\n return;\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE) return;\n\n const el = node as HTMLElement;\n const tagName = el.tagName.toLowerCase();\n\n // 1. Process <for each=\"{item in list}\">\n if (tagName === 'for') {\n const eachAttr = el.getAttribute('each')?.trim() || '';\n const cleanEach = eachAttr.replace(/^\\{/, '').replace(/\\}$/, '');\n // Support both: 'item in list' and '(item, index) in list'\n const match = cleanEach.match(/(?:\\(\\s*([a-zA-Z_$]\\w*)\\s*,\\s*([a-zA-Z_$]\\w*)\\s*\\)|([a-zA-Z_$]\\w*))\\s+in\\s+(.+)/);\n \n if (match) {\n const itemName = match[1] || match[3];\n const indexName = match[2];\n const listExpr = match[4];\n const list = this.evaluateExpression(listExpr, context);\n \n const fragment = document.createDocumentFragment();\n if (Array.isArray(list)) {\n list.forEach((item: any, idx: number) => {\n const childCtx = Object.create(context);\n childCtx[itemName] = item;\n if (indexName) {\n childCtx[indexName] = idx;\n }\n const clone = el.cloneNode(true);\n // Process children of the clone\n Array.from(clone.childNodes).forEach(child => this.processNode(child, childCtx));\n while (clone.firstChild) {\n fragment.appendChild(clone.firstChild);\n }\n });\n }\n el.parentNode?.replaceChild(fragment, el);\n }\n return; \n }\n\n // 2. Process <if condition=\"...\">\n if (tagName === 'if') {\n const condition = el.getAttribute('condition')?.trim() || '';\n const cleanCondition = condition.replace(/^\\{/, '').replace(/\\}$/, '');\n let isTrue = false;\n try {\n isTrue = !!new Function('ctx', `with(ctx) { return ${cleanCondition} }`)(context);\n } catch (e) {\n console.error(`JunoEngine condition error: ${cleanCondition}`, e);\n }\n\n const fragment = document.createDocumentFragment();\n \n // Find <else> if it exists\n const children = Array.from(el.childNodes);\n const elseIndex = children.findIndex(c => (c as HTMLElement).tagName?.toLowerCase() === 'else');\n \n const targetNodes = isTrue \n ? (elseIndex !== -1 ? children.slice(0, elseIndex) : children)\n : (elseIndex !== -1 ? Array.from(children[elseIndex].childNodes) : []);\n\n targetNodes.forEach(child => {\n const cloned = child.cloneNode(true);\n this.processNode(cloned, context);\n fragment.appendChild(cloned);\n });\n\n el.parentNode?.replaceChild(fragment, el);\n return;\n }\n\n // 3. Process attributes and nested elements\n const attrs = Array.from(el.attributes);\n const isCustomElement = tagName.includes('-');\n\n attrs.forEach(attr => {\n // Check for property binding: {expression}\n const isExpression = /^\\{[^{}]+\\}$/.test(attr.value);\n \n if (isCustomElement && isExpression) {\n // Property binding for custom elements: pass raw objects/arrays\n const expr = attr.value.slice(1, -1);\n const value = this.evaluateExpression(expr, context);\n \n // Convert hyphen-case attribute to camelCase property\n const propName = attr.name.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\n (el as any)[propName] = value;\n } else {\n // Standard attribute interpolation (string only)\n const newValue = this.interpolate(attr.value, context);\n if (newValue !== attr.value) {\n el.setAttribute(attr.name, newValue);\n }\n }\n });\n\n // Process children recursively\n const children = Array.from(el.childNodes);\n children.forEach(child => this.processNode(child, context));\n }\n\n private static evaluateExpression(expr: string, context: any): any {\n const parts = expr.trim().split('|').map((s: string) => s.trim());\n const rawExpr = parts[0];\n const pipeName = parts[1];\n const transforms: Record<string, Function> = context.__transforms__ || {};\n\n let value;\n try {\n // Handle simple property access or complex expressions\n if (/^[\\w.]+$/.test(rawExpr)) {\n value = rawExpr.split('.').reduce((o: any, i: string) => o?.[i], context);\n } else {\n // Evaluate complex expression (like array literals or logic)\n value = new Function('ctx', `with(ctx) { return ${rawExpr} }`)(context);\n }\n } catch (e) {\n return undefined;\n }\n\n if (pipeName && transforms[pipeName]) {\n value = transforms[pipeName](value);\n }\n return value;\n }\n\n private static interpolate(text: string, context: any): string {\n return text.replace(/\\{((?:[^{}]|\\{[^{}]*\\})*)\\}/g, (_, expr) => {\n const value = this.evaluateExpression(expr, context);\n return value !== undefined ? String(value) : '';\n });\n }\n}\n","/**\n * Lightweight DOM Reconciliation (surgical updates)\n * Compares current element with a new template and updates only changed parts.\n */\nexport function reconcile(target: Element | ShadowRoot, newContent: string | Element) {\n let newNode: Element | DocumentFragment;\n if (typeof newContent === 'string') {\n const parser = new DOMParser();\n const newDoc = parser.parseFromString(`<body>${newContent}</body>`, 'text/html');\n newNode = newDoc.body;\n } else {\n newNode = newContent;\n }\n\n // Track the active element and its selection if it's an input/textarea\n const root = (target instanceof ShadowRoot) ? target : document;\n const activeElement = root.activeElement as HTMLInputElement | HTMLTextAreaElement;\n const activeSelector = activeElement && activeElement.id ? `#${activeElement.id}` : null;\n const selectionStart = activeElement ? activeElement.selectionStart : null;\n const selectionEnd = activeElement ? activeElement.selectionEnd : null;\n\n diff(target as any, newNode as any, target as any);\n\n // Restore focus and selection\n if (activeSelector) {\n const el = target.querySelector(activeSelector) as HTMLInputElement;\n if (el && el !== root.activeElement) {\n el.focus();\n if (selectionStart !== null && selectionEnd !== null) {\n el.setSelectionRange(selectionStart, selectionEnd);\n }\n }\n }\n}\n\nfunction diff(oldParent: Element, newParent: Element, root: Element) {\n const oldChildren = Array.from(oldParent.childNodes);\n const newChildren = Array.from(newParent.childNodes);\n\n const max = Math.max(oldChildren.length, newChildren.length);\n for (let i = 0; i < max; i++) {\n const oldNode = oldChildren[i] as ChildNode;\n const newNode = newChildren[i] as ChildNode;\n\n // 1. If no old node, append new node\n if (!oldNode) {\n oldParent.appendChild(newNode);\n continue;\n }\n\n // 2. If no new node, remove old node\n if (!newNode) {\n oldParent.removeChild(oldNode);\n continue;\n }\n\n // 3. If nodes are different types, replace old with new\n if (oldNode.nodeType !== newNode.nodeType || (oldNode as Element).tagName !== (newNode as Element).tagName) {\n oldParent.replaceChild(newNode, oldNode);\n continue;\n }\n\n // 4. If text nodes, update content if changed\n if (oldNode.nodeType === Node.TEXT_NODE) {\n if (oldNode.textContent !== newNode.textContent) {\n oldNode.textContent = newNode.textContent;\n }\n continue;\n }\n\n // 5. If elements, sync attributes and recurse\n if (oldNode.nodeType === Node.ELEMENT_NODE) {\n const oldEl = oldNode as Element;\n const newEl = newNode as Element;\n\n // Update attributes\n const oldAttrs = oldEl.getAttributeNames();\n const newAttrs = newEl.getAttributeNames();\n\n // Remove removed attributes\n for (const name of oldAttrs) {\n if (!newEl.hasAttribute(name)) {\n oldEl.removeAttribute(name);\n }\n }\n\n // Add/Update changed attributes\n for (const name of newAttrs) {\n const newVal = newEl.getAttribute(name);\n if (oldEl.getAttribute(name) !== newVal) {\n oldEl.setAttribute(name, newVal!);\n }\n\n // PROPERTY SYNCING for Custom Elements\n // If the new element (from template) has a property set, sync it to the old element\n const propName = name.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\n if (oldEl.tagName.includes('-') && (newEl as any)[propName] !== undefined) {\n (oldEl as any)[propName] = (newEl as any)[propName];\n }\n }\n\n // Special handling for Input values to avoid cursor jumps if value is same\n if (oldEl instanceof HTMLInputElement || oldEl instanceof HTMLTextAreaElement) {\n const newVal = (newEl as any).value || newEl.getAttribute('value') || '';\n if (oldEl.value !== newVal) {\n oldEl.value = newVal;\n }\n }\n\n // Recurse children\n // SKIP recursion if the element is a custom-element (has hyphen)\n // UNLESS it is the reconciliation root itself. \n // This allows components to manage their own internal Light DOM.\n if (!oldEl.tagName.includes('-') || oldEl === root) {\n diff(oldEl, newEl, root);\n }\n }\n }\n}\n","// src/common/router/router.service.ts\n\n/**\n * Route definition Mapping a path to a component state string.\n */\nexport interface Route {\n path: string;\n tab: string; // The @State string value\n title?: string;\n canActivate?: () => boolean | Promise<boolean> | string | Promise<string>;\n}\n\nexport type RouteChangeCallback = (tab: string, params: Record<string, string>) => void;\n\n/**\n * Singleton Router service for JunoJS.\n * Syncs the browser URL with a component's @State.\n */\nexport class RouterService {\n private static _instance: RouterService;\n private routes: Route[] = [];\n private listeners: RouteChangeCallback[] = [];\n\n private lastTab: string | null = null;\n private lastParams: Record<string, string> = {};\n\n static get instance(): RouterService {\n if (!RouterService._instance) {\n RouterService._instance = new RouterService();\n }\n return RouterService._instance;\n }\n\n private constructor() {\n if (typeof window !== 'undefined') {\n window.addEventListener('popstate', () => this.handleLocationChange());\n window.addEventListener('hashchange', () => this.handleLocationChange());\n }\n }\n\n /**\n * Register available routes.\n */\n register(routes: Route[]): void {\n this.routes = routes;\n }\n\n /**\n * Programmatically navigate to a path.\n */\n navigate(path: string, trigger: boolean = true): void {\n if (typeof window === 'undefined') return;\n\n // Ensure path starts with /\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n\n if (window.location.pathname !== cleanPath) {\n window.history.pushState({}, '', cleanPath);\n if (trigger) this.handleLocationChange();\n }\n }\n\n /**\n * Subscribe to route changes.\n */\n onRouteMatch(cb: RouteChangeCallback): () => void {\n this.listeners.push(cb);\n\n // Immediately fire with current state (BehaviorSubject pattern)\n if (this.lastTab !== null) {\n cb(this.lastTab, this.lastParams);\n } else {\n // If not yet evaluated, perform initial match\n this.handleLocationChange();\n }\n\n return () => {\n this.listeners = this.listeners.filter(l => l !== cb);\n };\n }\n\n /**\n * Manually trigger initial route matching (e.g. on page load).\n */\n init(): void {\n this.handleLocationChange();\n }\n\n private async handleLocationChange(): Promise<void> {\n if (typeof window === 'undefined') return;\n\n const path = window.location.pathname;\n\n let matchedRoute: Route | undefined;\n let params: Record<string, string> = {};\n\n for (const r of this.routes) {\n if (r.path === path || `/${r.tab}` === path) {\n matchedRoute = r;\n break;\n }\n\n // Dynamic route matching (e.g. /product/:id)\n if (r.path.includes('/:')) {\n const routeParts = r.path.split('/');\n const pathParts = path.split('/');\n\n if (routeParts.length === pathParts.length) {\n let match = true;\n const extractedParams: Record<string, string> = {};\n\n for (let i = 0; i < routeParts.length; i++) {\n if (routeParts[i].startsWith(':')) {\n extractedParams[routeParts[i].substring(1)] = pathParts[i];\n } else if (routeParts[i] !== pathParts[i]) {\n match = false;\n break;\n }\n }\n\n if (match) {\n matchedRoute = r;\n params = extractedParams;\n break;\n }\n }\n }\n }\n\n if (matchedRoute) {\n if (matchedRoute.canActivate) {\n try {\n const canActivateResult = await matchedRoute.canActivate();\n if (canActivateResult === false) {\n // Block navigation - default behavior is to not change view.\n return;\n }\n if (typeof canActivateResult === 'string') {\n // Redirect to the provided path\n this.navigate(canActivateResult);\n return;\n }\n } catch (e) {\n console.error(`Route guard error on ${matchedRoute.path}:`, e);\n return;\n }\n }\n\n if (matchedRoute.title) document.title = matchedRoute.title;\n this.notify(matchedRoute.tab, params);\n } else if (path === '/' || path === '') {\n // Default to the first route if we're at root\n const first = this.routes[0];\n if (first) {\n this.notify(first.tab, {});\n }\n }\n }\n\n private notify(tab: string, params: Record<string, string>): void {\n this.lastTab = tab;\n this.lastParams = params;\n this.listeners.forEach(cb => cb(tab, params));\n }\n\n /**\n * Get the current path.\n */\n get currentPath(): string {\n return typeof window !== 'undefined' ? window.location.pathname : '/';\n }\n}\n","import \"reflect-metadata\";\nimport { createReactiveProxy } from './reactivity';\nimport { JunoEngine } from './engine';\nimport { restorePersistedValues } from './persist';\nimport { reconcile } from './dom';\nimport { RouterService } from '../common/router/router.service';\n\nexport async function bootstrap(ComponentClass: any) {\n const config = Reflect.getMetadata('nf:config', ComponentClass);\n\n if (!config || !config.tag) {\n throw new Error('Missing @Component decorator or tag!');\n }\n\n customElements.define(\n config.tag,\n class extends HTMLElement {\n private instance: any;\n private proxy: any;\n private target: HTMLElement | ShadowRoot;\n private routeUnsubscribe?: () => void;\n\n static get observedAttributes() {\n return Reflect.getMetadata('nf:inputs', ComponentClass.prototype) || [];\n }\n\n attributeChangedCallback(name: string, oldValue: string, newValue: string) {\n // Ignore literal template bindings like \"{var}\" generated by the old parser\n // They are managed strictly via rich object property binding in our engine.\n if (newValue && /^\\{[^{}]+\\}$/.test(newValue)) return;\n\n if (oldValue !== newValue) {\n // Attribute binding (always string)\n if (this.proxy) {\n this.proxy[name] = newValue;\n this.update();\n } else if (this.instance) {\n this.instance[name] = newValue;\n }\n }\n }\n\n constructor() {\n super();\n this.instance = new ComponentClass();\n \n // 0. Inject HostElement if requested\n const hostProps = Reflect.getMetadata('nf:host-properties', ComponentClass.prototype) || [];\n hostProps.forEach((key: string) => {\n this.instance[key] = this;\n });\n \n // Setup direct property proxying for @Input fields\n (Reflect.getMetadata('nf:inputs', ComponentClass.prototype) || []).forEach((key: string) => {\n // 1. Cache pre-upgrade value if JunoEngine attached one early\n let initialValue = this.hasOwnProperty(key) ? (this as any)[key] : undefined;\n \n // 2. Define the getter/setter which overwrites the raw property\n Object.defineProperty(this, key, {\n get: () => this.proxy[key],\n set: (val) => {\n this.proxy[key] = val;\n this.update();\n }\n });\n\n // 3. Restore the pre-upgrade value if one was found\n if (initialValue !== undefined) {\n this.instance[key] = initialValue;\n }\n });\n \n // 1. Inject built-in validation state\n if (!this.instance.errors) {\n this.instance.errors = {};\n }\n\n // 2. Inject built-in isValid() method for component validation\n if (!this.instance.isValid) {\n this.instance.isValid = () => {\n // Reset built-in errors\n this.proxy.errors = {};\n let valid = true;\n \n const schema = Reflect.getMetadata('nf:schema', ComponentClass);\n const refines = Reflect.getMetadata('nf:refine', ComponentClass) || [];\n const validates = Reflect.getMetadata('nf:validates', ComponentClass.prototype) || [];\n const promises: Promise<void>[] = [];\n \n // A) Schema-based Validation (Zod-like)\n if (schema && typeof schema.parse === 'function') {\n const res = schema.parse(this.proxy);\n if (res instanceof Promise) {\n promises.push(res.then(r => {\n if (!r.success) {\n valid = false;\n this.proxy.errors = { ...this.proxy.errors, ...r.errors };\n }\n }));\n } else if (!res.success) {\n valid = false;\n this.proxy.errors = { ...this.proxy.errors, ...res.errors };\n }\n }\n\n // B) @Validate-based Validation (Property-level)\n for (const v of validates) {\n const val = this.proxy[v.key];\n const result = v.predicate(val);\n\n if (result instanceof Promise) {\n promises.push(\n result.then((pass) => {\n if (!pass) {\n valid = false;\n this.proxy.errors = { ...this.proxy.errors, [v.key]: v.message };\n }\n })\n );\n } else if (!result) {\n valid = false;\n this.proxy.errors = { ...this.proxy.errors, [v.key]: v.message };\n }\n }\n\n // C) @Refine-based Validation (Classic Class-level)\n for (const ref of refines) {\n const result = ref.validate(this.proxy);\n \n if (result instanceof Promise) {\n promises.push(\n result.then((pass) => {\n if (!pass) {\n valid = false;\n const targetField = ref.fields[ref.fields.length - 1];\n this.proxy.errors = { ...this.proxy.errors, [targetField]: ref.message };\n }\n })\n );\n } else {\n if (!result) {\n valid = false;\n // Attach error message to the last field in the list (most common pattern)\n const targetField = ref.fields[ref.fields.length - 1];\n this.proxy.errors = { ...this.proxy.errors, [targetField]: ref.message };\n }\n }\n }\n \n if (promises.length > 0) {\n return Promise.all(promises).then(() => valid);\n }\n return valid;\n };\n }\n\n restorePersistedValues(this.instance);\n this.proxy = createReactiveProxy(this.instance, () => this.update());\n\n // 3. Setup Render Target (Shadow or Light DOM)\n if (config.shadow) {\n this.target = this.shadowRoot || this.attachShadow({ mode: 'open' });\n } else {\n this.target = this;\n }\n\n const dispatchEvent = (e: Event, attrName: string) => {\n let curr = e.target as HTMLElement;\n // Traverse up from target to host, looking for the first element with the attribute\n // that corresponds to a method in the component instance\n while (curr && curr !== this.parentElement) {\n const expression = curr.getAttribute(attrName);\n if (expression) {\n const match = expression.match(/^(\\w+)(?:\\((.*)\\))?$/);\n if (match) {\n const [_, methodName, argsString] = match;\n const method = this.proxy[methodName];\n \n if (typeof method === 'function') {\n // NEW: @Intercept check\n const interceptor = Reflect.getMetadata('nf:intercept', this.instance, methodName);\n if (interceptor) {\n const proceed = interceptor(this.proxy);\n if (proceed instanceof Promise) {\n proceed.then(res => {\n if (res === false) {\n e.stopImmediatePropagation();\n e.stopPropagation();\n } else {\n this.executeMethod(method, e, argsString);\n }\n });\n return;\n } else if (proceed === false) {\n e.stopImmediatePropagation();\n e.stopPropagation();\n return;\n }\n }\n\n this.executeMethod(method, e, argsString);\n return; // Found and executed locally, stop bubbling\n }\n }\n }\n if (curr === this) break;\n curr = curr.parentElement as HTMLElement;\n }\n };\n\n this.target.addEventListener('click', (e: Event) => dispatchEvent(e, '@click'));\n this.target.addEventListener('input', (e: Event) => dispatchEvent(e, '@input'));\n }\n\n private executeMethod(method: Function, e: Event, argsString?: string) {\n if (argsString !== undefined) {\n const args = argsString.split(',').map(arg => {\n arg = arg.trim();\n if (arg === 'e' || arg === '$event') return e;\n if (arg === 'true') return true;\n if (arg === 'false') return false;\n if (!isNaN(Number(arg)) && arg !== '') return Number(arg);\n if ((arg.startsWith(\"'\") && arg.endsWith(\"'\")) || (arg.startsWith('\"') && arg.endsWith('\"'))) {\n return arg.slice(1, -1);\n }\n return arg;\n });\n method.apply(this.proxy, args);\n } else {\n method.call(this.proxy, e);\n }\n }\n\n async connectedCallback() {\n // Run @CanActivate Guard if present\n const canActivateFn = Reflect.getMetadata('nf:canActivate', ComponentClass);\n if (canActivateFn) {\n try {\n const result = await canActivateFn();\n if (result === false) return; // Block render silently\n if (typeof result === 'string') {\n RouterService.instance.navigate(result);\n return; // Redirect and block render\n }\n } catch (e) {\n console.error('Guard evaluation failed:', e);\n return;\n }\n }\n\n // Run instance-level canActivate() lifecycle hook if present\n if (this.instance.canActivate) {\n try {\n const result = await this.instance.canActivate.call(this.proxy);\n if (result === false) return; // Block render silently\n if (typeof result === 'string') {\n RouterService.instance.navigate(result);\n return; // Redirect and block render\n }\n } catch (e) {\n console.error('Lifecycle canActivate hook failed:', e);\n return;\n }\n }\n\n // Load external template if templateUrl is specified\n if (config.templateUrl) {\n const response = await fetch(config.templateUrl);\n this.instance.template = await response.text();\n }\n\n // Auto-Inject Router Params if @Param decorators exist\n const paramsMeta = Reflect.getMetadata('nf:params', ComponentClass.prototype) || [];\n if (paramsMeta.length > 0) {\n const router = RouterService.instance;\n this.routeUnsubscribe = router.onRouteMatch((tab, params) => {\n paramsMeta.forEach((p: { key: string, paramName: string }) => {\n if (params[p.paramName] !== undefined && this.proxy[p.key] !== params[p.paramName]) {\n this.proxy[p.key] = params[p.paramName];\n }\n });\n });\n }\n\n // 5. Context Injection (@Inject)\n const injects = Reflect.getMetadata('nf:injects', ComponentClass.prototype) || [];\n injects.forEach((inj: { key: string; property: string }) => {\n let current: any = this.parentElement;\n let providerFound = false;\n\n while (current) {\n if (current.instance) {\n const provides = Reflect.getMetadata('nf:provides', current.instance.constructor) || [];\n const provider = provides.find((p: any) => p.key === inj.key);\n\n if (provider) {\n // Initial sync\n this.proxy[inj.property] = current.proxy[provider.property];\n\n // Since context providers are reactive, we could ideally setup a permanent link.\n // For simplicity in this engine version, we'll shadow it into the local proxy.\n // Note: Complex cases might need a more robust observer pattern here.\n providerFound = true;\n break;\n }\n }\n current = current.parentElement || (current.getRootNode() as any).host;\n }\n });\n\n // Lifecycle: onInit (async data fetching, no DOM access)\n if (this.instance.onInit) {\n await this.instance.onInit.call(this.proxy);\n }\n\n this.update();\n\n // Lifecycle: onRender (post-render, DOM access)\n if (this.instance.onRender) {\n this.instance.onRender.call(this.proxy, this);\n }\n }\n\n disconnectedCallback() {\n if (this.routeUnsubscribe) {\n this.routeUnsubscribe();\n }\n \n // Lifecycle: onDestroy (cleanup)\n if (this.instance.onDestroy) {\n this.instance.onDestroy();\n }\n }\n\n update() {\n const template: string = this.instance.template || '<div>No template</div>';\n\n // Collect @Transform methods as a pipe map for the engine\n const transformKeys: string[] =\n Reflect.getMetadata('nf:transforms', this.instance) || [];\n const transforms: Record<string, Function> = {};\n for (const key of transformKeys) {\n if (typeof this.proxy[key] === 'function') {\n transforms[key] = this.proxy[key];\n }\n }\n\n // Build context: proxy + transforms\n const context = Object.create(this.proxy);\n context.__transforms__ = transforms;\n\n const rendered = JunoEngine.render(template, context);\n reconcile(this.target, rendered);\n }\n }\n );\n}\n","/**\n * Central error-handling middleware for JunoJS.\n *\n * Usage:\n * const handler = ErrorHandler.instance;\n * handler.addMiddleware((err) => {\n * if (err.status === 401) { location.href = '/login'; return true; }\n * return false;\n * });\n */\n\nexport interface JunoJSError {\n status?: number;\n message: string;\n url?: string;\n original?: any;\n}\n\nexport type ErrorMiddleware = (error: JunoJSError) => boolean | void;\n\nexport class ErrorHandler {\n // ── Singleton ─────────────────────────────────────────────\n private static _instance: ErrorHandler;\n\n static get instance(): ErrorHandler {\n if (!ErrorHandler._instance) {\n ErrorHandler._instance = new ErrorHandler();\n }\n return ErrorHandler._instance;\n }\n\n // ── State ─────────────────────────────────────────────────\n private middlewares: ErrorMiddleware[] = [];\n\n // ── Public API ────────────────────────────────────────────\n\n /** Register an error-handling middleware. Returns an unsubscribe function. */\n addMiddleware(fn: ErrorMiddleware): () => void {\n this.middlewares.push(fn);\n return () => {\n this.middlewares = this.middlewares.filter((m) => m !== fn);\n };\n }\n\n /**\n * Run the middleware chain. The first middleware that returns `true`\n * stops propagation. If no middleware handles it, logs to console.\n */\n handle(error: JunoJSError): void {\n for (const mw of this.middlewares) {\n const handled = mw(error);\n if (handled === true) return;\n }\n // Fallback: no middleware handled the error\n console.error('[JunoJS ErrorHandler] Unhandled error:', error.message, error);\n }\n\n /** Convenience: create a JunoJSError from an HTTP Response. */\n static fromResponse(res: Response, url: string): JunoJSError {\n return {\n status: res.status,\n message: `HTTP ${res.status}: ${res.statusText}`,\n url,\n original: res,\n };\n }\n\n /** Convenience: create a JunoJSError from a caught exception. */\n static fromException(err: unknown): JunoJSError {\n if (err instanceof Error) {\n return { message: err.message, original: err };\n }\n return { message: String(err), original: err };\n }\n}\n","import \"reflect-metadata\";\n\ninterface ValidatorRule {\n name: string;\n message: string;\n validate: (value: any, instance: any) => boolean;\n}\n\n/**\n * Base class for reactive form models.\n *\n * Usage:\n * class LoginForm extends FormModel {\n * @Required() @Email() email = '';\n * @Required() password = '';\n * }\n */\nexport class FormModel {\n private _initialValues: Record<string, any> = {};\n private _touched: Record<string, boolean> = {};\n\n constructor() {\n // Snapshot initial values after the subclass constructor runs\n // (we defer to the next microtick so subclass field initialisers have run)\n queueMicrotask(() => this._captureInitialValues());\n }\n\n // ─── Public API ───────────────────────────────────────────\n\n /** Returns true if every validated field passes all its rules. */\n isValid(): boolean {\n const errors = this.getErrors();\n return Object.keys(errors).length === 0;\n }\n\n /** Returns a map of field → error messages (only fields with errors). */\n getErrors(): Record<string, string[]> {\n const validators: Map<string, ValidatorRule[]> =\n Reflect.getMetadata('nf:validators', this) || new Map();\n const errors: Record<string, string[]> = {};\n\n validators.forEach((rules, field) => {\n const value = (this as any)[field];\n const fieldErrors: string[] = [];\n\n for (const rule of rules) {\n if (!rule.validate(value, this)) {\n fieldErrors.push(rule.message);\n }\n }\n\n if (fieldErrors.length > 0) {\n errors[field] = fieldErrors;\n }\n });\n\n return errors;\n }\n\n /** Resets all fields to their initial values and clears touched state. */\n reset(): void {\n for (const [key, value] of Object.entries(this._initialValues)) {\n (this as any)[key] = value;\n }\n this._touched = {};\n }\n\n /** True if any field differs from its initial value. */\n get dirty(): boolean {\n for (const [key, initial] of Object.entries(this._initialValues)) {\n if ((this as any)[key] !== initial) return true;\n }\n return false;\n }\n\n /** Per-field touched tracking. */\n get touched(): Record<string, boolean> {\n return { ...this._touched };\n }\n\n /** Mark a field as touched (e.g. on blur). */\n markTouched(field: string): void {\n this._touched[field] = true;\n }\n\n // ─── Internals ────────────────────────────────────────────\n\n private _captureInitialValues(): void {\n const validators: Map<string, ValidatorRule[]> =\n Reflect.getMetadata('nf:validators', this) || new Map();\n\n // Capture every field that has at least one validator\n validators.forEach((_rules, field) => {\n this._initialValues[field] = (this as any)[field];\n });\n }\n}\n","import \"reflect-metadata\";\n\n// ─── Types ────────────────────────────────────────────────────\ninterface ValidatorRule {\n name: string;\n message: string;\n validate: (value: any, instance: any) => boolean;\n}\n\n// ─── Helpers ──────────────────────────────────────────────────\nfunction addValidator(target: any, key: string, rule: ValidatorRule) {\n const validators: Map<string, ValidatorRule[]> =\n Reflect.getMetadata('nf:validators', target) || new Map();\n const fieldRules = validators.get(key) || [];\n fieldRules.push(rule);\n validators.set(key, fieldRules);\n Reflect.defineMetadata('nf:validators', validators, target);\n}\n\n// ─── Decorators ───────────────────────────────────────────────\n\n/**\n * Field must be non-empty (non-null, non-undefined, non-empty-string).\n */\nexport function Required(message = 'This field is required') {\n return (target: any, key: string) => {\n addValidator(target, key, {\n name: 'required',\n message,\n validate: (value: any) =>\n value !== null && value !== undefined && String(value).trim().length > 0,\n });\n };\n}\n\n/**\n * Field must be a valid email address.\n */\nexport function Email(message = 'Invalid email address') {\n return (target: any, key: string) => {\n addValidator(target, key, {\n name: 'email',\n message,\n validate: (value: any) => {\n if (!value) return true; // let @Required handle emptiness\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(value));\n },\n });\n };\n}\n\n/**\n * Field must equal the value of another property.\n */\nexport function Match(otherProp: string, message?: string) {\n return (target: any, key: string) => {\n addValidator(target, key, {\n name: 'match',\n message: message || `Must match ${otherProp}`,\n validate: (value: any, instance: any) => value === instance[otherProp],\n });\n };\n}\n\n/**\n * Field must match a regular expression.\n */\nexport function Pattern(regex: RegExp, message = 'Invalid format') {\n return (target: any, key: string) => {\n addValidator(target, key, {\n name: 'pattern',\n message,\n validate: (value: any) => {\n if (!value) return true; // let @Required handle emptiness\n return regex.test(String(value));\n },\n });\n };\n}\n","export type ValidationResult = { success: boolean; errors?: Record<string, string> };\n\nexport class SchemaField {\n private rules: ((value: any, data: any) => string | undefined)[] = [];\n private IS_REQUIRED = false;\n\n required(msg = 'Required') {\n this.IS_REQUIRED = true;\n this.rules.push((v) => (!v && v !== 0 && v !== false ? msg : undefined));\n return this;\n }\n\n email(msg = 'Invalid email') {\n this.rules.push((v) => {\n if (!v) return undefined;\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(v)) ? undefined : msg;\n });\n return this;\n }\n\n min(length: number, msg?: string) {\n this.rules.push((v) => {\n if (!v) return undefined;\n return String(v).length < length ? (msg || `Min length ${length}`) : undefined;\n });\n return this;\n }\n\n max(length: number, msg?: string) {\n this.rules.push((v) => {\n if (!v) return undefined;\n return String(v).length > length ? (msg || `Max length ${length}`) : undefined;\n });\n return this;\n }\n\n validate(value: any, data: any): string | undefined {\n for (const rule of this.rules) {\n const error = rule(value, data);\n if (error) return error;\n }\n return undefined;\n }\n}\n\nexport class Schema {\n private fields: Record<string, SchemaField> = {};\n private refines: { validate: (data: any) => boolean | Promise<boolean>; message: string; path: string }[] = [];\n\n string() { return new SchemaField(); }\n number() { return new SchemaField(); }\n boolean() { return new SchemaField(); }\n\n shape(fields: Record<string, SchemaField>) {\n this.fields = fields;\n return this;\n }\n\n refine(validate: (data: any) => boolean | Promise<boolean>, params: { message: string; path: string }) {\n this.refines.push({ validate, ...params });\n return this;\n }\n\n async parse(data: any): Promise<ValidationResult> {\n const errors: Record<string, string> = {};\n let success = true;\n\n // Field validations\n for (const [key, field] of Object.entries(this.fields)) {\n const error = field.validate(data[key], data);\n if (error) {\n errors[key] = error;\n success = false;\n }\n }\n\n // Refine validations (cross-field)\n for (const ref of this.refines) {\n const result = ref.validate(data);\n const pass = result instanceof Promise ? await result : result;\n if (!pass) {\n errors[ref.path] = ref.message;\n success = false;\n }\n }\n\n return { success, errors: success ? undefined : errors };\n }\n}\n\nexport const s = {\n string: () => new SchemaField(),\n number: () => new SchemaField(),\n boolean: () => new SchemaField(),\n object: (fields: Record<string, SchemaField>) => new Schema().shape(fields),\n};\n","import { ErrorHandler } from '../../core/error-handler';\n\n// ─── Types ────────────────────────────────────────────────────\n\nexport interface RequestConfig {\n headers?: Record<string, string>;\n timeout?: number; // ms — auto-abort after this duration\n signal?: AbortSignal; // external AbortController signal\n params?: Record<string, string>; // URL query params\n}\n\nexport type RequestInterceptor = (\n url: string,\n init: RequestInit,\n) => [string, RequestInit] | void;\n\nexport type ResponseInterceptor = (response: Response) => Response | void;\n\n// ─── HttpClient ───────────────────────────────────────────────\n\nexport class HttpClient {\n private requestInterceptors: RequestInterceptor[] = [];\n private responseInterceptors: ResponseInterceptor[] = [];\n private errorHandler: ErrorHandler | null = null;\n\n /** Plug in the global ErrorHandler for automatic error routing. */\n setErrorHandler(handler: ErrorHandler): void {\n this.errorHandler = handler;\n }\n\n // ── Interceptors ──────────────────────────────────────────\n\n addRequestInterceptor(fn: RequestInterceptor): void {\n this.requestInterceptors.push(fn);\n }\n\n addResponseInterceptor(fn: ResponseInterceptor): void {\n this.responseInterceptors.push(fn);\n }\n\n // ── HTTP Methods ──────────────────────────────────────────\n\n async get<T>(url: string, config?: RequestConfig): Promise<T> {\n return this.request<T>('GET', url, undefined, config);\n }\n\n async post<T>(url: string, body?: any, config?: RequestConfig): Promise<T> {\n return this.request<T>('POST', url, body, config);\n }\n\n async put<T>(url: string, body?: any, config?: RequestConfig): Promise<T> {\n return this.request<T>('PUT', url, body, config);\n }\n\n async delete<T>(url: string, config?: RequestConfig): Promise<T> {\n return this.request<T>('DELETE', url, undefined, config);\n }\n\n async patch<T>(url: string, body?: any, config?: RequestConfig): Promise<T> {\n return this.request<T>('PATCH', url, body, config);\n }\n\n // ── Core ──────────────────────────────────────────────────\n\n private async request<T>(\n method: string,\n url: string,\n body?: any,\n config?: RequestConfig,\n ): Promise<T> {\n // Build URL with query params\n let finalUrl = url;\n if (config?.params) {\n const qs = new URLSearchParams(config.params).toString();\n finalUrl += (url.includes('?') ? '&' : '?') + qs;\n }\n\n // Build RequestInit\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(config?.headers || {}),\n };\n\n const init: RequestInit = { method, headers };\n\n // Auto-JSON body\n if (body !== undefined) {\n init.body = JSON.stringify(body);\n }\n\n // AbortController — timeout or external signal\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n if (config?.signal) {\n // Forward external abort\n config.signal.addEventListener('abort', () => controller.abort());\n }\n\n if (config?.timeout && config.timeout > 0) {\n timeoutId = setTimeout(() => controller.abort(), config.timeout);\n }\n\n init.signal = controller.signal;\n\n // Apply request interceptors\n for (const interceptor of this.requestInterceptors) {\n const result = interceptor(finalUrl, init);\n if (result) {\n [finalUrl, ] = result;\n Object.assign(init, result[1]);\n }\n }\n\n try {\n let response = await fetch(finalUrl, init);\n\n // Apply response interceptors\n for (const interceptor of this.responseInterceptors) {\n const modified = interceptor(response);\n if (modified) response = modified;\n }\n\n if (!response.ok) {\n // Route through ErrorHandler middleware if configured\n if (this.errorHandler) {\n this.errorHandler.handle(\n ErrorHandler.fromResponse(response, finalUrl),\n );\n }\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n // Auto-JSON parse\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n return (await response.json()) as T;\n }\n return (await response.text()) as unknown as T;\n } finally {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n }\n }\n}\n","type TranslationDict = Record<string, string>;\n\n/**\n * Singleton internationalisation service.\n *\n * Usage:\n * const i18n = I18nService.instance;\n * i18n.addTranslations('en', { greeting: 'Hello, {{name}}!' });\n * i18n.setLocale('en');\n * i18n.t('greeting', { name: 'World' }); // → \"Hello, World!\"\n */\nexport class I18nService {\n // ── Singleton ─────────────────────────────────────────────\n private static _instance: I18nService;\n\n static get instance(): I18nService {\n if (!I18nService._instance) {\n I18nService._instance = new I18nService();\n }\n return I18nService._instance;\n }\n\n // ── State ─────────────────────────────────────────────────\n private dictionaries: Map<string, TranslationDict> = new Map();\n private _locale: string = 'en';\n private _onLocaleChange: Array<() => void> = [];\n\n /** Current active locale. */\n get locale(): string {\n return this._locale;\n }\n\n // ── Public API ────────────────────────────────────────────\n\n /** Register translations for a locale. Merges with any existing entries. */\n addTranslations(locale: string, dict: TranslationDict): void {\n const existing = this.dictionaries.get(locale) || {};\n this.dictionaries.set(locale, { ...existing, ...dict });\n }\n\n /** Switch the active locale. */\n setLocale(locale: string): void {\n if (!this.dictionaries.has(locale)) {\n console.warn(`[i18n] No translations registered for locale \"${locale}\".`);\n }\n this._locale = locale;\n // Notify listeners (components can subscribe to trigger re-render)\n for (const cb of this._onLocaleChange) cb();\n }\n\n /** Subscribe to locale changes. Returns an unsubscribe function. */\n onLocaleChange(cb: () => void): () => void {\n this._onLocaleChange.push(cb);\n return () => {\n this._onLocaleChange = this._onLocaleChange.filter((fn) => fn !== cb);\n };\n }\n\n /**\n * Translate a key with optional parameter interpolation.\n * Params replace `{{paramName}}` placeholders in the translation string.\n *\n * t('greeting', { name: 'Ada' }) // \"Hello, Ada!\"\n */\n t(key: string, params?: Record<string, string | number>): string {\n const dict = this.dictionaries.get(this._locale);\n let value = dict?.[key];\n\n if (value === undefined) {\n // Fallback: return the key itself so missing translations are visible\n return key;\n }\n\n // Replace {{param}} placeholders\n if (params) {\n for (const [paramKey, paramVal] of Object.entries(params)) {\n value = value.replace(\n new RegExp(`\\\\{\\\\{${paramKey}\\\\}\\\\}`, 'g'),\n String(paramVal),\n );\n }\n }\n\n return value;\n }\n\n /** List all registered locales. */\n get availableLocales(): string[] {\n return [...this.dictionaries.keys()];\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@junojs/core",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "JunoJS — AI-Native Reactive Engine based on Native Web Components and Proxy-based Reactivity",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -54,16 +54,17 @@
54
54
  },
55
55
  "homepage": "https://junojs.org",
56
56
  "dependencies": {
57
- "reflect-metadata": "^0.2.1",
58
- "zod": "^3.22.4"
57
+ "reflect-metadata": "^0.2.2",
58
+ "zod": "^4.3.6"
59
59
  },
60
60
  "devDependencies": {
61
- "sass": "^1.98.0",
61
+ "@types/node": "^20.19.39",
62
+ "sass": "^1.99.0",
62
63
  "ts-node": "^10.9.2",
63
- "typescript": "^5.2.2",
64
- "vite": "^5.4.0"
64
+ "typescript": "^6.0.2",
65
+ "vite": "^8.0.3"
65
66
  },
66
67
  "publishConfig": {
67
68
  "access": "public"
68
69
  }
69
- }
70
+ }