@wordrhyme/plugin 0.1.0-alpha.5 → 0.1.0-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/artifact.d.ts +1 -1
  2. package/dist/artifact.js +2 -1
  3. package/dist/artifact.js.map +1 -1
  4. package/dist/chunk-BI7E5CVM.js +26 -0
  5. package/dist/chunk-BI7E5CVM.js.map +1 -0
  6. package/dist/{chunk-46KUIGB6.js → chunk-BVOTSKM2.js} +36 -12
  7. package/dist/chunk-BVOTSKM2.js.map +1 -0
  8. package/dist/{chunk-QNCOGISF.js → chunk-FOCLZY64.js} +114 -3
  9. package/dist/chunk-FOCLZY64.js.map +1 -0
  10. package/dist/{chunk-YQDKOEUI.js → chunk-NAWUXVZQ.js} +43 -15
  11. package/dist/chunk-NAWUXVZQ.js.map +1 -0
  12. package/dist/{chunk-ZUBFLOKU.js → chunk-O4AYK3YP.js} +5 -2
  13. package/dist/chunk-O4AYK3YP.js.map +1 -0
  14. package/dist/{client-WXWbuuvd.d.ts → client-CKtDWayV.d.ts} +1 -1
  15. package/dist/client.d.ts +2 -2
  16. package/dist/client.js +2 -1
  17. package/dist/dev-utils.d.ts +6 -2
  18. package/dist/dev-utils.js +3 -1
  19. package/dist/{entity-extensions-B5BbZH-m.d.ts → entity-extensions-gJuSTXYZ.d.ts} +2 -2
  20. package/dist/globalization.d.ts +7 -2
  21. package/dist/globalization.js +11 -1
  22. package/dist/index.d.ts +381 -8
  23. package/dist/index.js +449 -18
  24. package/dist/index.js.map +1 -1
  25. package/dist/locale.d.ts +15 -0
  26. package/dist/locale.js +13 -0
  27. package/dist/locale.js.map +1 -0
  28. package/dist/{manifest-CPSCN_Ft.d.ts → manifest-CDTCsMYV.d.ts} +39 -4
  29. package/dist/react.d.ts +50 -3
  30. package/dist/react.js +105 -11
  31. package/dist/react.js.map +1 -1
  32. package/dist/server.d.ts +5 -4
  33. package/dist/server.js +1 -1
  34. package/dist/trpc.d.ts +2 -1
  35. package/dist/trpc.js +1 -1
  36. package/dist/{types-8P7XyoyQ.d.ts → types-9v-WZ_NU.d.ts} +230 -1
  37. package/package.json +10 -1
  38. package/dist/chunk-46KUIGB6.js.map +0 -1
  39. package/dist/chunk-QNCOGISF.js.map +0 -1
  40. package/dist/chunk-YQDKOEUI.js.map +0 -1
  41. package/dist/chunk-ZUBFLOKU.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/dev-utils.ts"],"sourcesContent":["/**\n * Plugin Development Utilities\n * \n * Shared utilities for plugin development, including automatic port assignment.\n */\n\nexport type PluginRemoteSurface = 'admin' | 'web';\n\nexport interface ResolvedPluginRemoteEntry {\n remoteEntry: string;\n source: 'dev' | 'manifest';\n}\n\nexport interface ResolvePluginRemoteEntryOptions {\n pluginId: string;\n manifestRemoteEntry: string;\n devRemoteEntry?: string | undefined;\n surface?: PluginRemoteSurface | undefined;\n isDev?: boolean | undefined;\n devRemoteEnabled?: boolean | undefined;\n probeTimeoutMs?: number | undefined;\n probeAttempts?: number | undefined;\n probeRetryDelayMs?: number | undefined;\n entryChunkPaths?: readonly string[] | undefined;\n}\n\ninterface DevProbeCacheEntry {\n result: ResolvedPluginRemoteEntry;\n expiresAt: number;\n}\n\ninterface StorageLike {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n}\n\ninterface RuntimeLike {\n location?: { search?: string | undefined } | undefined;\n sessionStorage?: StorageLike | undefined;\n localStorage?: StorageLike | undefined;\n fetch?: ((url: string, init: { method: 'HEAD' | 'GET'; signal?: unknown }) => Promise<{ ok: boolean; status: number }>) | undefined;\n AbortSignal?: { timeout?: (ms: number) => unknown } | undefined;\n AbortController?: (new () => { signal: unknown; abort: () => void }) | undefined;\n setTimeout?: ((handler: () => void, timeoutMs: number) => unknown) | undefined;\n clearTimeout?: ((handle: unknown) => void) | undefined;\n}\n\nconst DEV_ADMIN_ENTRY_CHUNK_PATHS = [\n '/static/js/admin.js',\n '/static/js/src_admin_index_tsx.js',\n] as const;\n\nconst DEV_WEB_ENTRY_CHUNK_PATHS = [\n '/static/js/web.js',\n '/static/js/client.js',\n '/static/js/src_web_index_tsx.js',\n '/static/js/src_web_client_tsx.js',\n] as const;\n\nconst DEV_REMOTE_FAILURE_TTL_MS = 30_000;\nconst ACTIVE_DEV_REMOTE_PROBE_ATTEMPTS = 20;\nconst ACTIVE_DEV_REMOTE_RETRY_DELAY_MS = 250;\nconst DEV_PROBE_CACHE_STORAGE_KEY = 'wr.plugin-dev-probe-cache';\nconst DEV_REMOTE_OPT_IN_QUERY_KEY = 'pluginDevRemote';\nconst DEV_REMOTE_OPT_IN_STORAGE_KEY = 'wr.plugin-dev-remote';\nconst devProbeCache = new Map<string, DevProbeCacheEntry>();\n\n/**\n * Calculate a deterministic dev port for a plugin based on its ID.\n * \n * This allows multiple plugins to run simultaneously without port conflicts,\n * while keeping the port assignment automatic and predictable.\n * \n * Port range: 3010-3109 (100 possible ports)\n * \n * @param pluginId - Full plugin ID (e.g., \"com.wordrhyme.hello-world\")\n * @returns Port number for the plugin's dev server\n * \n * @example\n * getPluginDevPort('com.wordrhyme.hello-world') // e.g., 3042\n * getPluginDevPort('com.wordrhyme.analytics') // e.g., 3015\n */\nexport function getPluginDevPort(pluginId: string): number {\n const BASE_PORT = 3010;\n const PORT_RANGE = 100;\n\n // Simple hash based on character codes\n const hash = pluginId.split('').reduce((acc, char) => {\n return acc + char.charCodeAt(0);\n }, 0);\n\n return BASE_PORT + (hash % PORT_RANGE);\n}\n\n/**\n * Get the dev remote entry URL for a plugin.\n * \n * @param pluginId - Full plugin ID\n * @returns Full URL to the plugin's remoteEntry.js in dev mode\n */\nexport function getPluginDevRemoteEntry(pluginId: string): string {\n const port = getPluginDevPort(pluginId);\n return `http://localhost:${port}/remoteEntry.js`;\n}\n\n/**\n * Calculate a deterministic public web dev port for a plugin.\n *\n * Public web remotes run beside admin remotes, so they use the same stable\n * plugin hash with a +100 offset.\n */\nexport function getPluginWebDevPort(pluginId: string): number {\n return getPluginDevPort(pluginId) + 100;\n}\n\n/**\n * Get the public web dev remote entry URL for a plugin.\n */\nexport function getPluginWebDevRemoteEntry(pluginId: string): string {\n return `http://localhost:${getPluginWebDevPort(pluginId)}/remoteEntry.js`;\n}\n\n/**\n * Normalize plugin ID to a valid Module Federation name.\n * \n * MF names must be valid JavaScript identifiers.\n * \"com.wordrhyme.hello-world\" → \"plugin_hello_world\"\n * \n * @param pluginId - Full plugin ID\n * @returns Valid MF module name\n */\nexport function getPluginMfName(pluginId: string): string {\n // Extract the last segment and convert to underscore format\n const shortId = pluginId.replace(/^com\\.wordrhyme\\./, '');\n return `plugin_${shortId.replace(/-/g, '_')}`;\n}\n\nfunction runtime(): RuntimeLike {\n return globalThis as unknown as RuntimeLike;\n}\n\nfunction readQueryValue(search: string | undefined, key: string): string | null {\n const query = search?.replace(/^\\?/, '');\n if (!query) return null;\n\n for (const part of query.split('&')) {\n const [rawKey, rawValue = ''] = part.split('=');\n if (!rawKey) continue;\n try {\n if (decodeURIComponent(rawKey.replace(/\\+/g, ' ')) === key) {\n return decodeURIComponent(rawValue.replace(/\\+/g, ' '));\n }\n } catch {\n if (rawKey === key) return rawValue;\n }\n }\n\n return null;\n}\n\nfunction matchesPluginOptIn(rawValue: string | null, pluginId: string): boolean {\n const value = rawValue?.trim();\n if (!value) return false;\n\n return value === '1'\n || value.toLowerCase() === 'true'\n || value.toLowerCase() === 'all'\n || value === pluginId;\n}\n\nexport function isPluginListed(pluginId: string, rawValue: unknown): boolean {\n if (typeof rawValue !== 'string') return false;\n\n return rawValue\n .split(',')\n .some((value) => value.trim() === pluginId);\n}\n\nexport function isPluginDevRemoteEnabled(pluginId: string): boolean {\n const host = runtime();\n if (matchesPluginOptIn(readQueryValue(host.location?.search, DEV_REMOTE_OPT_IN_QUERY_KEY), pluginId)) {\n return true;\n }\n\n try {\n if (matchesPluginOptIn(host.sessionStorage?.getItem(DEV_REMOTE_OPT_IN_STORAGE_KEY) ?? null, pluginId)) {\n return true;\n }\n } catch {\n // Ignore storage access failures.\n }\n\n try {\n if (matchesPluginOptIn(host.localStorage?.getItem(DEV_REMOTE_OPT_IN_STORAGE_KEY) ?? null, pluginId)) {\n return true;\n }\n } catch {\n // Ignore storage access failures.\n }\n\n return false;\n}\n\nfunction readStoredProbeCache(): Record<string, DevProbeCacheEntry> {\n try {\n const raw = runtime().sessionStorage?.getItem(DEV_PROBE_CACHE_STORAGE_KEY);\n if (!raw) return {};\n const parsed = JSON.parse(raw) as Record<string, DevProbeCacheEntry> | null;\n return parsed && typeof parsed === 'object' ? parsed : {};\n } catch {\n return {};\n }\n}\n\nfunction writeStoredProbeCache(cache: Record<string, DevProbeCacheEntry>) {\n try {\n runtime().sessionStorage?.setItem(DEV_PROBE_CACHE_STORAGE_KEY, JSON.stringify(cache));\n } catch {\n // Ignore storage failures and rely on in-memory cache.\n }\n}\n\nfunction probeCacheKey(surface: PluginRemoteSurface, pluginId: string, devRemoteEntry: string): string {\n return `${surface}:${pluginId}:${devRemoteEntry}`;\n}\n\nfunction getCachedProbeResult(key: string, now: number): ResolvedPluginRemoteEntry | null {\n const cached = devProbeCache.get(key);\n if (cached) {\n if (cached.expiresAt <= now) {\n devProbeCache.delete(key);\n } else {\n return cached.result;\n }\n }\n\n const storedCache = readStoredProbeCache();\n const stored = storedCache[key];\n if (!stored) return null;\n if (stored.expiresAt <= now) {\n delete storedCache[key];\n writeStoredProbeCache(storedCache);\n devProbeCache.delete(key);\n return null;\n }\n devProbeCache.set(key, stored);\n return stored.result;\n}\n\nfunction cacheProbeResult(key: string, result: ResolvedPluginRemoteEntry, ttlMs: number) {\n const entry = {\n result,\n expiresAt: Date.now() + ttlMs,\n };\n devProbeCache.set(key, entry);\n\n const storedCache = readStoredProbeCache();\n storedCache[key] = entry;\n writeStoredProbeCache(storedCache);\n}\n\nfunction createTimeoutSignal(timeoutMs: number): { signal?: unknown; cleanup: () => void } {\n const host = runtime();\n const timeout = host.AbortSignal?.timeout;\n if (timeout) {\n return { signal: timeout(timeoutMs), cleanup: () => {} };\n }\n\n const Controller = host.AbortController;\n if (!Controller || !host.setTimeout || !host.clearTimeout) {\n return { cleanup: () => {} };\n }\n\n const probeController = new Controller();\n const timeoutId = host.setTimeout(() => probeController.abort(), timeoutMs);\n return {\n signal: probeController.signal,\n cleanup: () => host.clearTimeout?.(timeoutId),\n };\n}\n\nfunction waitForRetry(delayMs: number): Promise<void> {\n const schedule = runtime().setTimeout;\n if (!schedule || delayMs <= 0) return Promise.resolve();\n\n return new Promise((resolve) => {\n schedule(() => resolve(), delayMs);\n });\n}\n\nfunction resolveChunkUrl(path: string, devRemoteEntry: string): string {\n const originMatch = devRemoteEntry.match(/^(https?:\\/\\/[^/?#]+)(?:[/?#]|$)/);\n if (originMatch?.[1] && path.startsWith('/')) {\n return `${originMatch[1]}${path}`;\n }\n\n const base = devRemoteEntry.replace(/[?#].*$/, '').replace(/\\/[^/]*$/, '/');\n return `${base}${path.replace(/^\\//, '')}`;\n}\n\nasync function requestOk(url: string, signal: unknown): Promise<boolean> {\n const fetcher = runtime().fetch;\n if (!fetcher) return false;\n\n const response = await fetcher(url, {\n method: 'HEAD',\n ...(signal ? { signal } : {}),\n });\n\n if (response.ok) return true;\n if (response.status !== 405) return false;\n\n const fallbackResponse = await fetcher(url, {\n method: 'GET',\n ...(signal ? { signal } : {}),\n });\n return fallbackResponse.ok;\n}\n\nasync function canLoadDevRemote(\n devRemoteEntry: string,\n surface: PluginRemoteSurface,\n signal: unknown,\n entryChunkPaths?: readonly string[] | undefined,\n): Promise<boolean> {\n if (!await requestOk(devRemoteEntry, signal)) {\n return false;\n }\n\n const chunkPaths = entryChunkPaths\n ?? (surface === 'web' ? DEV_WEB_ENTRY_CHUNK_PATHS : DEV_ADMIN_ENTRY_CHUNK_PATHS);\n for (const path of chunkPaths) {\n if (await requestOk(resolveChunkUrl(path, devRemoteEntry), signal)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction defaultDevRemoteEntry(pluginId: string, surface: PluginRemoteSurface): string {\n return surface === 'web'\n ? getPluginWebDevRemoteEntry(pluginId)\n : getPluginDevRemoteEntry(pluginId);\n}\n\nexport async function resolvePluginRemoteEntry({\n pluginId,\n manifestRemoteEntry,\n devRemoteEntry,\n surface = 'admin',\n isDev = false,\n devRemoteEnabled = false,\n probeTimeoutMs = 1500,\n probeAttempts,\n probeRetryDelayMs = ACTIVE_DEV_REMOTE_RETRY_DELAY_MS,\n entryChunkPaths,\n}: ResolvePluginRemoteEntryOptions): Promise<ResolvedPluginRemoteEntry> {\n const manifestResult = {\n remoteEntry: manifestRemoteEntry,\n source: 'manifest',\n } as const;\n\n if (!isDev || (!devRemoteEnabled && !isPluginDevRemoteEnabled(pluginId))) {\n return manifestResult;\n }\n\n const devUrl = devRemoteEntry?.trim() || defaultDevRemoteEntry(pluginId, surface);\n const cacheKey = probeCacheKey(surface, pluginId, devUrl);\n const cachedResult = getCachedProbeResult(cacheKey, Date.now());\n if (cachedResult && !(devRemoteEnabled && cachedResult.source === 'manifest')) {\n return cachedResult;\n }\n\n const attempts = Math.max(\n 1,\n Math.trunc(probeAttempts ?? (devRemoteEnabled ? ACTIVE_DEV_REMOTE_PROBE_ATTEMPTS : 1)),\n );\n\n for (let attempt = 0; attempt < attempts; attempt += 1) {\n const { signal, cleanup } = createTimeoutSignal(probeTimeoutMs);\n\n try {\n if (await canLoadDevRemote(devUrl, surface, signal, entryChunkPaths)) {\n return {\n remoteEntry: devUrl,\n source: 'dev',\n };\n }\n } catch {\n // The selected dev process may still be starting. Retry below when explicitly active.\n } finally {\n cleanup();\n }\n\n if (attempt + 1 < attempts) {\n await waitForRetry(probeRetryDelayMs);\n }\n }\n\n console.info(`[Plugin] ${pluginId}: ${surface} dev server 不在线,使用预构建静态文件`);\n if (!devRemoteEnabled) {\n cacheProbeResult(cacheKey, manifestResult, DEV_REMOTE_FAILURE_TTL_MS);\n }\n return manifestResult;\n}\n\nexport function appendRemoteEntryCacheBust(remoteEntry: string, value: string | number): string {\n const separator = remoteEntry.includes('?') ? '&' : '?';\n return `${remoteEntry}${separator}t=${encodeURIComponent(String(value))}`;\n}\n"],"mappings":"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","names":[]}
@@ -84,6 +84,7 @@ var defaultPermissions = {
84
84
  };
85
85
  var defaultSettings = {
86
86
  get: async () => null,
87
+ has: async () => false,
87
88
  set: async () => {
88
89
  throw new Error("Settings capability not available");
89
90
  },
@@ -141,7 +142,9 @@ function createPluginContext(partial) {
141
142
  queue: partial.queue,
142
143
  usage: partial.usage,
143
144
  entityExtensions: partial.entityExtensions,
144
- crudExtensions: partial.crudExtensions
145
+ crudExtensions: partial.crudExtensions,
146
+ ai: partial.ai,
147
+ aiRuntime: partial.aiRuntime
145
148
  };
146
149
  }
147
150
 
@@ -150,4 +153,4 @@ export {
150
153
  pluginProcedure,
151
154
  createPluginContext
152
155
  };
153
- //# sourceMappingURL=chunk-ZUBFLOKU.js.map
156
+ //# sourceMappingURL=chunk-O4AYK3YP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/trpc.ts"],"sourcesContent":["import { initTRPC, TRPCError } from \"@trpc/server\";\nimport type { PluginContext, PluginPermissionCapability, PluginScopedDb, PluginSettingsCapability } from \"./types\";\n\n/**\n * tRPC builders for plugins\n *\n * Plugins use these to define their API routes, just like a normal tRPC project.\n */\nconst t = initTRPC.context<PluginContext>().meta<Record<string, unknown>>().create();\n\nconst ANONYMOUS_ROLE = \"anonymous\";\n\nfunction allowsAnonymousAccess(meta: unknown): boolean {\n if (!meta || typeof meta !== \"object\") return false;\n\n const metaRecord = meta as Record<string, unknown>;\n const permission = metaRecord[\"permission\"];\n if (permission && typeof permission === \"object\") {\n const permissionRecord = permission as Record<string, unknown>;\n if (permissionRecord[\"anonymous\"] === true) return true;\n }\n\n if (metaRecord[\"anonymous\"] === true) return true;\n\n const access = metaRecord[\"access\"];\n if (access === \"anonymous\") return true;\n\n if (access && typeof access === \"object\") {\n const accessRecord = access as Record<string, unknown>;\n return (\n accessRecord[\"anonymous\"] === true ||\n accessRecord[\"allowAnonymous\"] === true ||\n accessRecord[\"mode\"] === \"anonymous\"\n );\n }\n\n return false;\n}\n\nfunction injectAnonymousRole(target: Record<string, unknown>) {\n const roles = Array.isArray(target[\"userRoles\"]) ? [...(target[\"userRoles\"] as string[])] : [];\n if (!roles.includes(ANONYMOUS_ROLE)) {\n roles.push(ANONYMOUS_ROLE);\n }\n target[\"userRoles\"] = roles;\n if (!target[\"userRole\"]) {\n target[\"userRole\"] = ANONYMOUS_ROLE;\n }\n}\n\nfunction isTrustedSystemContext(ctxRecord: Record<string, unknown>): boolean {\n if (ctxRecord[\"isSystemContext\"] === true || ctxRecord[\"actorType\"] === \"system\") {\n return true;\n }\n\n if (ctxRecord[\"invoker\"] === \"scheduler\") {\n return true;\n }\n\n const principal = ctxRecord[\"principal\"];\n return (\n principal !== null &&\n typeof principal === \"object\" &&\n (principal as Record<string, unknown>)[\"kind\"] === \"system\"\n );\n}\n\ntype PluginProcedureMiddleware = (opts: any) => Promise<any>;\n\nconst pluginProcedureBase = t.procedure.use(async (opts) => {\n const ctxRecord = (opts.ctx as Record<string, unknown> | undefined) ?? {};\n const shouldEnforcePluginAccess = ctxRecord[\"__enforcePluginAccess\"] === true;\n const isAnonymousRequest = !ctxRecord[\"userId\"];\n\n if (shouldEnforcePluginAccess && isAnonymousRequest && !isTrustedSystemContext(ctxRecord)) {\n if (!allowsAnonymousAccess(opts.meta)) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"Authentication required\",\n });\n }\n\n injectAnonymousRole(ctxRecord);\n\n const requestContextRef = ctxRecord[\"__requestContextRef\"];\n if (requestContextRef && typeof requestContextRef === \"object\") {\n injectAnonymousRole(requestContextRef as Record<string, unknown>);\n }\n }\n\n const pluginProcedureMiddlewares = ((opts.ctx as Record<string, unknown> | undefined)?.[\n \"__pluginProcedureMiddlewares\"\n ] ?? []) as PluginProcedureMiddleware[];\n\n const run = (index: number, accumulatedOverrides: Record<string, unknown>) => {\n if (index >= pluginProcedureMiddlewares.length) {\n return opts.next(accumulatedOverrides as any);\n }\n\n const middleware = pluginProcedureMiddlewares[index]!;\n return middleware({\n ...opts,\n ...accumulatedOverrides,\n next: (nextOverrides?: Record<string, unknown>) =>\n run(index + 1, {\n ...accumulatedOverrides,\n ...(nextOverrides ?? {}),\n }),\n });\n };\n\n return run(0, {});\n});\n\n/**\n * Plugin router builder\n *\n * @example\n * ```ts\n * import { pluginRouter, pluginProcedure } from '@wordrhyme/plugin';\n *\n * export const router = pluginRouter({\n * hello: pluginProcedure.query(() => 'Hello from plugin!'),\n * });\n * ```\n */\nexport const pluginRouter = t.router;\n\n/**\n * Plugin procedure builder (with context)\n *\n * Use this to define procedures that have access to PluginContext.\n */\nexport const pluginProcedure = pluginProcedureBase;\n\n/**\n * Default no-op permission capability (for standalone plugin development)\n */\nconst defaultPermissions: PluginPermissionCapability = {\n can: async () => false,\n require: async () => {\n throw new Error(\"Permission capability not available\");\n },\n hasDeclared: () => false,\n};\n\n/**\n * Default no-op settings capability (for standalone plugin development)\n */\nconst defaultSettings: PluginSettingsCapability = {\n get: async () => null,\n has: async () => false,\n set: async () => {\n throw new Error(\"Settings capability not available\");\n },\n delete: async () => {\n throw new Error(\"Settings capability not available\");\n },\n list: async () => [],\n isFeatureEnabled: async () => false,\n};\n\nconst defaultDb = new Proxy({} as PluginScopedDb, {\n get() {\n throw new Error(\"Database capability not available in this standalone plugin context\");\n },\n});\n\n/**\n * Create plugin context (used by Core to inject context)\n *\n * This is called by PluginManager when invoking plugin handlers.\n */\nexport function createPluginContext(partial: Partial<PluginContext> & { pluginId: string }): PluginContext {\n return {\n pluginId: partial.pluginId,\n organizationId: partial.organizationId,\n originalOrganizationId: partial.originalOrganizationId,\n userId: partial.userId,\n user: partial.user,\n requestId: partial.requestId,\n userRole: partial.userRole,\n userRoles: partial.userRoles,\n currentTeamId: partial.currentTeamId,\n locale: partial.locale,\n timezone: partial.timezone,\n clientTimeZone: partial.clientTimeZone,\n resolveDateRange: partial.resolveDateRange,\n actorType: partial.actorType,\n apiTokenId: partial.apiTokenId,\n apiTokenScopes: partial.apiTokenScopes,\n isSystemContext: partial.isSystemContext,\n principal: partial.principal,\n invoker: partial.invoker,\n logger: partial.logger ?? {\n info: (msg, meta) => console.log(`[${partial.pluginId}]`, msg, meta),\n warn: (msg, meta) => console.warn(`[${partial.pluginId}]`, msg, meta),\n error: (msg, meta) => console.error(`[${partial.pluginId}]`, msg, meta),\n debug: (msg, meta) => console.debug(`[${partial.pluginId}]`, msg, meta),\n },\n permissions: partial.permissions ?? defaultPermissions,\n plugins: partial.plugins,\n db: partial.db ?? defaultDb,\n organizationProvisioning: partial.organizationProvisioning,\n tx: partial.tx,\n settings: partial.settings ?? defaultSettings,\n currency: partial.currency,\n hooks: partial.hooks,\n metrics: partial.metrics,\n trace: partial.trace,\n media: partial.media,\n storage: partial.storage,\n notifications: partial.notifications,\n queue: partial.queue,\n usage: partial.usage,\n entityExtensions: partial.entityExtensions,\n crudExtensions: partial.crudExtensions,\n ai: partial.ai,\n aiRuntime: partial.aiRuntime,\n };\n}\n\n// Re-export tRPC types for convenience\nexport type { inferRouterInputs, inferRouterOutputs } from \"@trpc/server\";\n"],"mappings":";AAAA,SAAS,UAAU,iBAAiB;AAQpC,IAAM,IAAI,SAAS,QAAuB,EAAE,KAA8B,EAAE,OAAO;AAEnF,IAAM,iBAAiB;AAEvB,SAAS,sBAAsB,MAAwB;AACnD,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAE9C,QAAM,aAAa;AACnB,QAAM,aAAa,WAAW,YAAY;AAC1C,MAAI,cAAc,OAAO,eAAe,UAAU;AAC9C,UAAM,mBAAmB;AACzB,QAAI,iBAAiB,WAAW,MAAM,KAAM,QAAO;AAAA,EACvD;AAEA,MAAI,WAAW,WAAW,MAAM,KAAM,QAAO;AAE7C,QAAM,SAAS,WAAW,QAAQ;AAClC,MAAI,WAAW,YAAa,QAAO;AAEnC,MAAI,UAAU,OAAO,WAAW,UAAU;AACtC,UAAM,eAAe;AACrB,WACI,aAAa,WAAW,MAAM,QAC9B,aAAa,gBAAgB,MAAM,QACnC,aAAa,MAAM,MAAM;AAAA,EAEjC;AAEA,SAAO;AACX;AAEA,SAAS,oBAAoB,QAAiC;AAC1D,QAAM,QAAQ,MAAM,QAAQ,OAAO,WAAW,CAAC,IAAI,CAAC,GAAI,OAAO,WAAW,CAAc,IAAI,CAAC;AAC7F,MAAI,CAAC,MAAM,SAAS,cAAc,GAAG;AACjC,UAAM,KAAK,cAAc;AAAA,EAC7B;AACA,SAAO,WAAW,IAAI;AACtB,MAAI,CAAC,OAAO,UAAU,GAAG;AACrB,WAAO,UAAU,IAAI;AAAA,EACzB;AACJ;AAEA,SAAS,uBAAuB,WAA6C;AACzE,MAAI,UAAU,iBAAiB,MAAM,QAAQ,UAAU,WAAW,MAAM,UAAU;AAC9E,WAAO;AAAA,EACX;AAEA,MAAI,UAAU,SAAS,MAAM,aAAa;AACtC,WAAO;AAAA,EACX;AAEA,QAAM,YAAY,UAAU,WAAW;AACvC,SACI,cAAc,QACd,OAAO,cAAc,YACpB,UAAsC,MAAM,MAAM;AAE3D;AAIA,IAAM,sBAAsB,EAAE,UAAU,IAAI,OAAO,SAAS;AACxD,QAAM,YAAa,KAAK,OAA+C,CAAC;AACxE,QAAM,4BAA4B,UAAU,uBAAuB,MAAM;AACzE,QAAM,qBAAqB,CAAC,UAAU,QAAQ;AAE9C,MAAI,6BAA6B,sBAAsB,CAAC,uBAAuB,SAAS,GAAG;AACvF,QAAI,CAAC,sBAAsB,KAAK,IAAI,GAAG;AACnC,YAAM,IAAI,UAAU;AAAA,QAChB,MAAM;AAAA,QACN,SAAS;AAAA,MACb,CAAC;AAAA,IACL;AAEA,wBAAoB,SAAS;AAE7B,UAAM,oBAAoB,UAAU,qBAAqB;AACzD,QAAI,qBAAqB,OAAO,sBAAsB,UAAU;AAC5D,0BAAoB,iBAA4C;AAAA,IACpE;AAAA,EACJ;AAEA,QAAM,6BAA+B,KAAK,MACtC,8BACJ,KAAK,CAAC;AAEN,QAAM,MAAM,CAAC,OAAe,yBAAkD;AAC1E,QAAI,SAAS,2BAA2B,QAAQ;AAC5C,aAAO,KAAK,KAAK,oBAA2B;AAAA,IAChD;AAEA,UAAM,aAAa,2BAA2B,KAAK;AACnD,WAAO,WAAW;AAAA,MACd,GAAG;AAAA,MACH,GAAG;AAAA,MACH,MAAM,CAAC,kBACH,IAAI,QAAQ,GAAG;AAAA,QACX,GAAG;AAAA,QACH,GAAI,iBAAiB,CAAC;AAAA,MAC1B,CAAC;AAAA,IACT,CAAC;AAAA,EACL;AAEA,SAAO,IAAI,GAAG,CAAC,CAAC;AACpB,CAAC;AAcM,IAAM,eAAe,EAAE;AAOvB,IAAM,kBAAkB;AAK/B,IAAM,qBAAiD;AAAA,EACnD,KAAK,YAAY;AAAA,EACjB,SAAS,YAAY;AACjB,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACzD;AAAA,EACA,aAAa,MAAM;AACvB;AAKA,IAAM,kBAA4C;AAAA,EAC9C,KAAK,YAAY;AAAA,EACjB,KAAK,YAAY;AAAA,EACjB,KAAK,YAAY;AACb,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACvD;AAAA,EACA,QAAQ,YAAY;AAChB,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACvD;AAAA,EACA,MAAM,YAAY,CAAC;AAAA,EACnB,kBAAkB,YAAY;AAClC;AAEA,IAAM,YAAY,IAAI,MAAM,CAAC,GAAqB;AAAA,EAC9C,MAAM;AACF,UAAM,IAAI,MAAM,qEAAqE;AAAA,EACzF;AACJ,CAAC;AAOM,SAAS,oBAAoB,SAAuE;AACvG,SAAO;AAAA,IACH,UAAU,QAAQ;AAAA,IAClB,gBAAgB,QAAQ;AAAA,IACxB,wBAAwB,QAAQ;AAAA,IAChC,QAAQ,QAAQ;AAAA,IAChB,MAAM,QAAQ;AAAA,IACd,WAAW,QAAQ;AAAA,IACnB,UAAU,QAAQ;AAAA,IAClB,WAAW,QAAQ;AAAA,IACnB,eAAe,QAAQ;AAAA,IACvB,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,IAClB,gBAAgB,QAAQ;AAAA,IACxB,kBAAkB,QAAQ;AAAA,IAC1B,WAAW,QAAQ;AAAA,IACnB,YAAY,QAAQ;AAAA,IACpB,gBAAgB,QAAQ;AAAA,IACxB,iBAAiB,QAAQ;AAAA,IACzB,WAAW,QAAQ;AAAA,IACnB,SAAS,QAAQ;AAAA,IACjB,QAAQ,QAAQ,UAAU;AAAA,MACtB,MAAM,CAAC,KAAK,SAAS,QAAQ,IAAI,IAAI,QAAQ,QAAQ,KAAK,KAAK,IAAI;AAAA,MACnE,MAAM,CAAC,KAAK,SAAS,QAAQ,KAAK,IAAI,QAAQ,QAAQ,KAAK,KAAK,IAAI;AAAA,MACpE,OAAO,CAAC,KAAK,SAAS,QAAQ,MAAM,IAAI,QAAQ,QAAQ,KAAK,KAAK,IAAI;AAAA,MACtE,OAAO,CAAC,KAAK,SAAS,QAAQ,MAAM,IAAI,QAAQ,QAAQ,KAAK,KAAK,IAAI;AAAA,IAC1E;AAAA,IACA,aAAa,QAAQ,eAAe;AAAA,IACpC,SAAS,QAAQ;AAAA,IACjB,IAAI,QAAQ,MAAM;AAAA,IAClB,0BAA0B,QAAQ;AAAA,IAClC,IAAI,QAAQ;AAAA,IACZ,UAAU,QAAQ,YAAY;AAAA,IAC9B,UAAU,QAAQ;AAAA,IAClB,OAAO,QAAQ;AAAA,IACf,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ;AAAA,IACf,OAAO,QAAQ;AAAA,IACf,SAAS,QAAQ;AAAA,IACjB,eAAe,QAAQ;AAAA,IACvB,OAAO,QAAQ;AAAA,IACf,OAAO,QAAQ;AAAA,IACf,kBAAkB,QAAQ;AAAA,IAC1B,gBAAgB,QAAQ;AAAA,IACxB,IAAI,QAAQ;AAAA,IACZ,WAAW,QAAQ;AAAA,EACvB;AACJ;","names":[]}
@@ -1,4 +1,4 @@
1
- import './manifest-CPSCN_Ft.js';
1
+ import './manifest-CDTCsMYV.js';
2
2
 
3
3
  type ComponentType = (props: any) => any;
4
4
  type Target = NavTarget | NavGroupTarget | RouteTarget | SettingsTarget | DashboardTarget | GenericTarget;
package/dist/client.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { D as DashboardTarget, G as GenericTarget, a as NavTarget, S as SettingsTarget, b as SlotContext, T as Target, U as UIExtensionDef, d as dashboardExtension, e as defineExtension, m as multiSlotExtension, n as navExtension, s as settingsExtension } from './client-WXWbuuvd.js';
2
- export { d as AggregationStrategy, l as PluginCapabilities, P as PluginManifest, m as PluginNotificationType, n as PluginStatus, z as adminExtensionSchema, L as dashboardTargetSchema, T as navTargetSchema, V as pluginManifestSchema, Z as settingsTargetSchema, _ as targetSchema } from './manifest-CPSCN_Ft.js';
1
+ export { D as DashboardTarget, G as GenericTarget, a as NavTarget, S as SettingsTarget, b as SlotContext, T as Target, U as UIExtensionDef, d as dashboardExtension, e as defineExtension, m as multiSlotExtension, n as navExtension, s as settingsExtension } from './client-CKtDWayV.js';
2
+ export { d as AggregationStrategy, l as PluginCapabilities, P as PluginManifest, m as PluginNotificationType, n as PluginStatus, z as adminExtensionSchema, L as dashboardTargetSchema, T as navTargetSchema, V as pluginManifestSchema, Z as settingsTargetSchema, _ as targetSchema } from './manifest-CDTCsMYV.js';
3
3
  import 'zod';
package/dist/client.js CHANGED
@@ -12,7 +12,8 @@ import {
12
12
  pluginManifestSchema,
13
13
  settingsTargetSchema,
14
14
  targetSchema
15
- } from "./chunk-QNCOGISF.js";
15
+ } from "./chunk-FOCLZY64.js";
16
+ import "./chunk-BI7E5CVM.js";
16
17
  export {
17
18
  adminExtensionSchema,
18
19
  dashboardExtension,
@@ -14,7 +14,10 @@ interface ResolvePluginRemoteEntryOptions {
14
14
  devRemoteEntry?: string | undefined;
15
15
  surface?: PluginRemoteSurface | undefined;
16
16
  isDev?: boolean | undefined;
17
+ devRemoteEnabled?: boolean | undefined;
17
18
  probeTimeoutMs?: number | undefined;
19
+ probeAttempts?: number | undefined;
20
+ probeRetryDelayMs?: number | undefined;
18
21
  entryChunkPaths?: readonly string[] | undefined;
19
22
  }
20
23
  /**
@@ -61,8 +64,9 @@ declare function getPluginWebDevRemoteEntry(pluginId: string): string;
61
64
  * @returns Valid MF module name
62
65
  */
63
66
  declare function getPluginMfName(pluginId: string): string;
67
+ declare function isPluginListed(pluginId: string, rawValue: unknown): boolean;
64
68
  declare function isPluginDevRemoteEnabled(pluginId: string): boolean;
65
- declare function resolvePluginRemoteEntry({ pluginId, manifestRemoteEntry, devRemoteEntry, surface, isDev, probeTimeoutMs, entryChunkPaths, }: ResolvePluginRemoteEntryOptions): Promise<ResolvedPluginRemoteEntry>;
69
+ declare function resolvePluginRemoteEntry({ pluginId, manifestRemoteEntry, devRemoteEntry, surface, isDev, devRemoteEnabled, probeTimeoutMs, probeAttempts, probeRetryDelayMs, entryChunkPaths, }: ResolvePluginRemoteEntryOptions): Promise<ResolvedPluginRemoteEntry>;
66
70
  declare function appendRemoteEntryCacheBust(remoteEntry: string, value: string | number): string;
67
71
 
68
- export { type PluginRemoteSurface, type ResolvePluginRemoteEntryOptions, type ResolvedPluginRemoteEntry, appendRemoteEntryCacheBust, getPluginDevPort, getPluginDevRemoteEntry, getPluginMfName, getPluginWebDevPort, getPluginWebDevRemoteEntry, isPluginDevRemoteEnabled, resolvePluginRemoteEntry };
72
+ export { type PluginRemoteSurface, type ResolvePluginRemoteEntryOptions, type ResolvedPluginRemoteEntry, appendRemoteEntryCacheBust, getPluginDevPort, getPluginDevRemoteEntry, getPluginMfName, getPluginWebDevPort, getPluginWebDevRemoteEntry, isPluginDevRemoteEnabled, isPluginListed, resolvePluginRemoteEntry };
package/dist/dev-utils.js CHANGED
@@ -6,8 +6,9 @@ import {
6
6
  getPluginWebDevPort,
7
7
  getPluginWebDevRemoteEntry,
8
8
  isPluginDevRemoteEnabled,
9
+ isPluginListed,
9
10
  resolvePluginRemoteEntry
10
- } from "./chunk-YQDKOEUI.js";
11
+ } from "./chunk-NAWUXVZQ.js";
11
12
  export {
12
13
  appendRemoteEntryCacheBust,
13
14
  getPluginDevPort,
@@ -16,6 +17,7 @@ export {
16
17
  getPluginWebDevPort,
17
18
  getPluginWebDevRemoteEntry,
18
19
  isPluginDevRemoteEnabled,
20
+ isPluginListed,
19
21
  resolvePluginRemoteEntry
20
22
  };
21
23
  //# sourceMappingURL=dev-utils.js.map
@@ -1,5 +1,5 @@
1
- import { E as EntityExtensionFieldType, a as EntityExtensionField } from './manifest-CPSCN_Ft.js';
2
- import { H as HookContext, a as PluginContext, b as HookHandlerOptions } from './types-8P7XyoyQ.js';
1
+ import { E as EntityExtensionFieldType, a as EntityExtensionField } from './manifest-CDTCsMYV.js';
2
+ import { H as HookContext, a as PluginContext, b as HookHandlerOptions } from './types-9v-WZ_NU.js';
3
3
 
4
4
  /**
5
5
  * Projection customization hook for entity extension values.
@@ -1,7 +1,9 @@
1
1
  export { default as Decimal } from 'decimal.js';
2
+ export { DEFAULT_LOCALE, canonicalizeLocale, isLocale, normalizeLocale } from './locale.js';
2
3
 
3
4
  type TextDirection = 'ltr' | 'rtl';
4
5
  type TranslationMessages = Record<string, string>;
6
+ type I18nResourceSnapshot = Record<string, Record<string, TranslationMessages>>;
5
7
  type I18nTextField = string | Record<string, string | null | undefined> | null | undefined;
6
8
  interface LanguageInfo {
7
9
  locale: string;
@@ -39,6 +41,9 @@ interface GlobalizationState {
39
41
  timezone?: string | undefined;
40
42
  fallbackLocale?: string | undefined;
41
43
  messages?: TranslationMessages | undefined;
44
+ namespaces?: string[] | undefined;
45
+ resources?: I18nResourceSnapshot | undefined;
46
+ versions?: Record<string, string> | undefined;
42
47
  t?: Translator | undefined;
43
48
  p?: PriceFormatter | undefined;
44
49
  changeLocale?: ((locale: string) => void | Promise<void>) | undefined;
@@ -69,7 +74,7 @@ declare function convertCurrency(cents: number, fromCurrency: CurrencyInfo, toCu
69
74
  declare function formatCurrencyAmount(cents: number, currency: CurrencyInfo, locale: string, options?: FormatPriceOptions): string;
70
75
  declare function formatPrice(cents: number, fromCurrency: string | CurrencyInfo, state: GlobalizationState, options?: FormatPriceOptions): string;
71
76
  declare function getI18nText(field: I18nTextField, locale: string, fallbackLocale?: string): string;
72
- declare function createTranslator(messages: TranslationMessages | undefined): Translator;
77
+ declare function createTranslator(messages: TranslationMessages | undefined, locale?: string): Translator;
73
78
  declare function createPriceFormatter(state: GlobalizationState, defaultFromCurrency?: string | CurrencyInfo): PriceFormatter;
74
79
  declare function withGlobalizationHelpers(state: GlobalizationState, handlers?: Pick<GlobalizationState, 'changeLocale' | 'changeCurrency'>): GlobalizationState;
75
80
  declare function buildGlobalizationUrl(url: string | URL, updates: {
@@ -77,4 +82,4 @@ declare function buildGlobalizationUrl(url: string | URL, updates: {
77
82
  currency?: string | null | undefined;
78
83
  }): string;
79
84
 
80
- export { type CurrencyInfo, type CurrencyInfoInput, DEFAULT_CURRENCY, type FormatPriceOptions, type GlobalizationState, type I18nTextField, type LanguageInfo, type PriceFormatter, type TextDirection, type TranslationMessages, type Translator, bankersRound, buildGlobalizationUrl, convertCurrency, createPriceFormatter, createTranslator, findCurrency, formatCurrencyAmount, formatPrice, fromCents, getBaseCurrency, getI18nText, getTextDirection, normalizeCurrencies, normalizeCurrencyInfo, resolveCurrencyInfo, toCents, withGlobalizationHelpers };
85
+ export { type CurrencyInfo, type CurrencyInfoInput, DEFAULT_CURRENCY, type FormatPriceOptions, type GlobalizationState, type I18nResourceSnapshot, type I18nTextField, type LanguageInfo, type PriceFormatter, type TextDirection, type TranslationMessages, type Translator, bankersRound, buildGlobalizationUrl, convertCurrency, createPriceFormatter, createTranslator, findCurrency, formatCurrencyAmount, formatPrice, fromCents, getBaseCurrency, getI18nText, getTextDirection, normalizeCurrencies, normalizeCurrencyInfo, resolveCurrencyInfo, toCents, withGlobalizationHelpers };
@@ -18,12 +18,20 @@ import {
18
18
  resolveCurrencyInfo,
19
19
  toCents,
20
20
  withGlobalizationHelpers
21
- } from "./chunk-46KUIGB6.js";
21
+ } from "./chunk-BVOTSKM2.js";
22
+ import {
23
+ DEFAULT_LOCALE,
24
+ canonicalizeLocale,
25
+ isLocale,
26
+ normalizeLocale
27
+ } from "./chunk-BI7E5CVM.js";
22
28
  export {
23
29
  DEFAULT_CURRENCY,
30
+ DEFAULT_LOCALE,
24
31
  Decimal,
25
32
  bankersRound,
26
33
  buildGlobalizationUrl,
34
+ canonicalizeLocale,
27
35
  convertCurrency,
28
36
  createPriceFormatter,
29
37
  createTranslator,
@@ -34,8 +42,10 @@ export {
34
42
  getBaseCurrency,
35
43
  getI18nText,
36
44
  getTextDirection,
45
+ isLocale,
37
46
  normalizeCurrencies,
38
47
  normalizeCurrencyInfo,
48
+ normalizeLocale,
39
49
  resolveCurrencyInfo,
40
50
  toCents,
41
51
  withGlobalizationHelpers