@spring-systems/core 0.8.4 → 0.8.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 (109) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/adapters/index.js +1 -56
  3. package/dist/auth/index.d.ts +2 -2
  4. package/dist/auth/index.js +1 -19
  5. package/dist/chunk-3OMNT22N.js +1 -0
  6. package/dist/chunk-4KRUU6MS.js +1 -0
  7. package/dist/chunk-6J2VFOKL.js +1 -0
  8. package/dist/chunk-7P4BJDQR.js +1 -0
  9. package/dist/chunk-AMXSATFF.js +1 -0
  10. package/dist/chunk-BMIRKMVX.js +1 -0
  11. package/dist/chunk-EVDFSWPU.js +1 -0
  12. package/dist/chunk-F3VXVDPQ.js +1 -0
  13. package/dist/chunk-GSQE2NEY.js +1 -0
  14. package/dist/chunk-HUASNNWD.js +1 -0
  15. package/dist/chunk-ICKHSEIX.js +1 -0
  16. package/dist/chunk-JRHMAY5G.js +1 -0
  17. package/dist/chunk-MNLYYTGZ.js +7 -0
  18. package/dist/chunk-OOVZTF74.js +1 -0
  19. package/dist/chunk-PNDXLNCU.js +1 -0
  20. package/dist/chunk-R3XYEEGR.js +1 -0
  21. package/dist/chunk-RKLYBW3O.js +1 -0
  22. package/dist/chunk-RVQHSQYF.js +3 -0
  23. package/dist/chunk-UT6X6RQM.js +1 -0
  24. package/dist/chunk-Y6DB43IE.js +3 -0
  25. package/dist/chunk-YMSSF2ZU.js +1 -0
  26. package/dist/config/index.d.ts +3 -3
  27. package/dist/config/index.js +1 -109
  28. package/dist/devtools/index.d.ts +2 -2
  29. package/dist/devtools/index.js +1 -67
  30. package/dist/errors/index.js +1 -21
  31. package/dist/events/index.js +1 -12
  32. package/dist/{framework-config-types-ClghA-zo.d.ts → framework-config-types-Cmy83YS6.d.ts} +4 -1
  33. package/dist/i18n/index.js +1 -7
  34. package/dist/index.d.ts +2 -2
  35. package/dist/index.js +1 -42
  36. package/dist/instance/index.d.ts +3 -3
  37. package/dist/instance/index.js +1 -37
  38. package/dist/logger/index.d.ts +2 -2
  39. package/dist/logger/index.js +1 -27
  40. package/dist/middleware/index.js +1 -23
  41. package/dist/plugins/index.d.ts +2 -2
  42. package/dist/plugins/index.js +1 -16
  43. package/dist/{runtime-env-config-Bs9HwewE.d.ts → runtime-env-config-B7vf3XX5.d.ts} +1 -1
  44. package/dist/{spring-instance-Bijjj8Mq.d.ts → spring-instance-CZk8Ju5T.d.ts} +1 -1
  45. package/dist/testing/index.d.ts +2 -2
  46. package/dist/testing/index.js +1 -171
  47. package/dist/types/index.js +1 -72
  48. package/dist/utils/index.d.ts +1 -0
  49. package/dist/utils/index.js +1 -772
  50. package/dist/validation/index.js +1 -147
  51. package/package.json +1 -1
  52. package/dist/adapters/index.js.map +0 -1
  53. package/dist/auth/index.js.map +0 -1
  54. package/dist/chunk-EFUBAQCV.js +0 -94
  55. package/dist/chunk-EFUBAQCV.js.map +0 -1
  56. package/dist/chunk-F2SIMWZ5.js +0 -173
  57. package/dist/chunk-F2SIMWZ5.js.map +0 -1
  58. package/dist/chunk-F7WUQJH7.js +0 -399
  59. package/dist/chunk-F7WUQJH7.js.map +0 -1
  60. package/dist/chunk-GON7Q32Q.js +0 -176
  61. package/dist/chunk-GON7Q32Q.js.map +0 -1
  62. package/dist/chunk-GXU75LQX.js +0 -182
  63. package/dist/chunk-GXU75LQX.js.map +0 -1
  64. package/dist/chunk-HFELOXDQ.js +0 -110
  65. package/dist/chunk-HFELOXDQ.js.map +0 -1
  66. package/dist/chunk-KX32MU3I.js +0 -190
  67. package/dist/chunk-KX32MU3I.js.map +0 -1
  68. package/dist/chunk-MEWPYTWC.js +0 -284
  69. package/dist/chunk-MEWPYTWC.js.map +0 -1
  70. package/dist/chunk-N2L4TUC4.js +0 -34
  71. package/dist/chunk-N2L4TUC4.js.map +0 -1
  72. package/dist/chunk-NQQIVCLX.js +0 -47
  73. package/dist/chunk-NQQIVCLX.js.map +0 -1
  74. package/dist/chunk-OSSX443T.js +0 -146
  75. package/dist/chunk-OSSX443T.js.map +0 -1
  76. package/dist/chunk-PT4DIYUK.js +0 -78
  77. package/dist/chunk-PT4DIYUK.js.map +0 -1
  78. package/dist/chunk-QAVWXARR.js +0 -51
  79. package/dist/chunk-QAVWXARR.js.map +0 -1
  80. package/dist/chunk-RRWKDFAB.js +0 -143
  81. package/dist/chunk-RRWKDFAB.js.map +0 -1
  82. package/dist/chunk-RUCXSQEY.js +0 -42
  83. package/dist/chunk-RUCXSQEY.js.map +0 -1
  84. package/dist/chunk-S6RPCN5H.js +0 -64
  85. package/dist/chunk-S6RPCN5H.js.map +0 -1
  86. package/dist/chunk-S7MKRNMI.js +0 -153
  87. package/dist/chunk-S7MKRNMI.js.map +0 -1
  88. package/dist/chunk-SQB4F3EF.js +0 -55
  89. package/dist/chunk-SQB4F3EF.js.map +0 -1
  90. package/dist/chunk-UDT2RPX2.js +0 -43
  91. package/dist/chunk-UDT2RPX2.js.map +0 -1
  92. package/dist/chunk-VRMVN2UM.js +0 -17
  93. package/dist/chunk-VRMVN2UM.js.map +0 -1
  94. package/dist/chunk-XGNQEGV7.js +0 -391
  95. package/dist/chunk-XGNQEGV7.js.map +0 -1
  96. package/dist/config/index.js.map +0 -1
  97. package/dist/devtools/index.js.map +0 -1
  98. package/dist/errors/index.js.map +0 -1
  99. package/dist/events/index.js.map +0 -1
  100. package/dist/i18n/index.js.map +0 -1
  101. package/dist/index.js.map +0 -1
  102. package/dist/instance/index.js.map +0 -1
  103. package/dist/logger/index.js.map +0 -1
  104. package/dist/middleware/index.js.map +0 -1
  105. package/dist/plugins/index.js.map +0 -1
  106. package/dist/testing/index.js.map +0 -1
  107. package/dist/types/index.js.map +0 -1
  108. package/dist/utils/index.js.map +0 -1
  109. package/dist/validation/index.js.map +0 -1
@@ -1,55 +0,0 @@
1
- import {
2
- registerMiddleware
3
- } from "./chunk-MEWPYTWC.js";
4
- import {
5
- logWarn
6
- } from "./chunk-KX32MU3I.js";
7
-
8
- // src/middleware/audit-middleware.ts
9
- async function invokeAuditHandler(handler, event) {
10
- try {
11
- await Promise.resolve(handler(event));
12
- } catch (err) {
13
- logWarn(
14
- "AuditMiddleware",
15
- `Handler error for ${event.action} ${event.entity}#${event.entityId}: ${err instanceof Error ? err.message : String(err)}`
16
- );
17
- }
18
- }
19
- function createAuditMiddleware(handler, options) {
20
- const saveMiddleware = async (ctx, next) => {
21
- await next();
22
- if (ctx.aborted) return;
23
- await invokeAuditHandler(handler, {
24
- action: ctx.isNew ? "create" : "update",
25
- entity: ctx.entity,
26
- entityId: ctx.id,
27
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
28
- url: ctx.url,
29
- fields: ctx.fields
30
- });
31
- };
32
- const deleteMiddleware = async (ctx, next) => {
33
- await next();
34
- if (ctx.aborted) return;
35
- await invokeAuditHandler(handler, {
36
- action: "delete",
37
- entity: ctx.entity,
38
- entityId: ctx.id,
39
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
40
- url: ctx.url,
41
- fields: {}
42
- });
43
- };
44
- const unregisterSave = registerMiddleware("form:afterSave", saveMiddleware, options);
45
- const unregisterDelete = registerMiddleware("form:afterDelete", deleteMiddleware, options);
46
- return () => {
47
- unregisterSave();
48
- unregisterDelete();
49
- };
50
- }
51
-
52
- export {
53
- createAuditMiddleware
54
- };
55
- //# sourceMappingURL=chunk-SQB4F3EF.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/middleware/audit-middleware.ts"],"sourcesContent":["/**\n * Audit middleware — standardized audit event creation for form mutations.\n *\n * Provides a typed `AuditEvent` and factory functions that hook into\n * `form:afterSave` and `form:afterDelete` to produce audit events for every\n * successful create, update, or delete operation.\n *\n * @example\n * ```ts\n * import { createAuditMiddleware } from \"@spring-systems/core/middleware\";\n *\n * // Send audit events to your backend:\n * const unregister = createAuditMiddleware(async (event) => {\n * await fetch(\"/api/audit\", {\n * method: \"POST\",\n * headers: { \"Content-Type\": \"application/json\" },\n * body: JSON.stringify(event),\n * });\n * });\n *\n * // Or log to console during development:\n * createAuditMiddleware((event) => {\n * console.log(`[Audit] ${event.action} ${event.entity}#${event.entityId}`, event);\n * });\n * ```\n *\n * @module audit-middleware\n */\n\nimport { logWarn } from \"../logger/logger\";\nimport type { MiddlewareOptions } from \"./middleware-registry\";\nimport { registerMiddleware } from \"./middleware-registry\";\nimport type { FormDeleteContext, FormSaveContext, MiddlewareFn } from \"./middleware-types\";\n\nexport interface AuditEvent {\n /** Mutation type */\n action: \"create\" | \"update\" | \"delete\";\n /** Entity type name (e.g. \"partner\", \"user\") */\n entity: string;\n /** Entity record identifier */\n entityId: string;\n /** ISO 8601 timestamp of the event */\n timestamp: string;\n /** API endpoint URL used for the operation */\n url: string;\n /** Field values included in the save payload (empty object for deletes) */\n fields: Record<string, unknown>;\n}\n\nexport type AuditEventHandler = (event: AuditEvent) => void | Promise<void>;\n\nasync function invokeAuditHandler(handler: AuditEventHandler, event: AuditEvent): Promise<void> {\n try {\n await Promise.resolve(handler(event));\n } catch (err: unknown) {\n logWarn(\n \"AuditMiddleware\",\n `Handler error for ${event.action} ${event.entity}#${event.entityId}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/**\n * Create and register audit middleware that emits `AuditEvent` for every\n * successful form save (create or update) and delete operation.\n *\n * The middleware hooks into both `form:afterSave` and `form:afterDelete` slots.\n * Aborted operations are silently skipped.\n *\n * @param handler - Callback that receives the audit event. Can be sync or async.\n * Async errors are caught and logged to prevent audit failures\n * from breaking the operation flow.\n * @param options - Optional middleware options (e.g. `{ priority: 10 }`)\n * @returns An unregister function that removes both audit middleware registrations.\n */\nexport function createAuditMiddleware(\n handler: AuditEventHandler,\n options?: MiddlewareOptions,\n): () => void {\n const saveMiddleware: MiddlewareFn<FormSaveContext> = async (ctx, next) => {\n await next();\n\n if (ctx.aborted) return;\n\n await invokeAuditHandler(handler, {\n action: ctx.isNew ? \"create\" : \"update\",\n entity: ctx.entity,\n entityId: ctx.id,\n timestamp: new Date().toISOString(),\n url: ctx.url,\n fields: ctx.fields,\n });\n };\n\n const deleteMiddleware: MiddlewareFn<FormDeleteContext> = async (ctx, next) => {\n await next();\n\n if (ctx.aborted) return;\n\n await invokeAuditHandler(handler, {\n action: \"delete\",\n entity: ctx.entity,\n entityId: ctx.id,\n timestamp: new Date().toISOString(),\n url: ctx.url,\n fields: {},\n });\n };\n\n const unregisterSave = registerMiddleware(\"form:afterSave\", saveMiddleware, options);\n const unregisterDelete = registerMiddleware(\"form:afterDelete\", deleteMiddleware, options);\n\n return () => {\n unregisterSave();\n unregisterDelete();\n };\n}\n"],"mappings":";;;;;;;;AAmDA,eAAe,mBAAmB,SAA4B,OAAkC;AAC5F,MAAI;AACA,UAAM,QAAQ,QAAQ,QAAQ,KAAK,CAAC;AAAA,EACxC,SAAS,KAAc;AACnB;AAAA,MACI;AAAA,MACA,qBAAqB,MAAM,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,QAAQ,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC5H;AAAA,EACJ;AACJ;AAeO,SAAS,sBACZ,SACA,SACU;AACV,QAAM,iBAAgD,OAAO,KAAK,SAAS;AACvE,UAAM,KAAK;AAEX,QAAI,IAAI,QAAS;AAEjB,UAAM,mBAAmB,SAAS;AAAA,MAC9B,QAAQ,IAAI,QAAQ,WAAW;AAAA,MAC/B,QAAQ,IAAI;AAAA,MACZ,UAAU,IAAI;AAAA,MACd,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,KAAK,IAAI;AAAA,MACT,QAAQ,IAAI;AAAA,IAChB,CAAC;AAAA,EACL;AAEA,QAAM,mBAAoD,OAAO,KAAK,SAAS;AAC3E,UAAM,KAAK;AAEX,QAAI,IAAI,QAAS;AAEjB,UAAM,mBAAmB,SAAS;AAAA,MAC9B,QAAQ;AAAA,MACR,QAAQ,IAAI;AAAA,MACZ,UAAU,IAAI;AAAA,MACd,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,KAAK,IAAI;AAAA,MACT,QAAQ,CAAC;AAAA,IACb,CAAC;AAAA,EACL;AAEA,QAAM,iBAAiB,mBAAmB,kBAAkB,gBAAgB,OAAO;AACnF,QAAM,mBAAmB,mBAAmB,oBAAoB,kBAAkB,OAAO;AAEzF,SAAO,MAAM;AACT,mBAAe;AACf,qBAAiB;AAAA,EACrB;AACJ;","names":[]}
@@ -1,43 +0,0 @@
1
- // src/config/runtime-env-config.ts
2
- var RUNTIME_ENV_KEYS = ["IMAGE_TAG", "ENVIRONMENT", "BUILD_NUM", "BUILD_DATE"];
3
- var extraKeys = [];
4
- function registerRuntimeEnvKeys(...keys) {
5
- for (const key of keys) {
6
- if (!extraKeys.includes(key) && !RUNTIME_ENV_KEYS.includes(key)) {
7
- extraKeys.push(key);
8
- }
9
- }
10
- }
11
- function getRuntimeEnvKeys() {
12
- if (extraKeys.length === 0) return RUNTIME_ENV_KEYS;
13
- return [...RUNTIME_ENV_KEYS, ...extraKeys];
14
- }
15
- function clearRuntimeEnvKeys() {
16
- extraKeys.length = 0;
17
- }
18
- function getEnv() {
19
- if (typeof window === "undefined") {
20
- return {};
21
- }
22
- return window.__RUNTIME_ENV__ ?? {};
23
- }
24
- function getRuntimeVar(key) {
25
- const env = getEnv();
26
- const v = env[key];
27
- return typeof v === "string" ? v : "";
28
- }
29
- function getImageTag() {
30
- const v = getEnv().IMAGE_TAG;
31
- if (!v) return "";
32
- return v;
33
- }
34
-
35
- export {
36
- RUNTIME_ENV_KEYS,
37
- registerRuntimeEnvKeys,
38
- getRuntimeEnvKeys,
39
- clearRuntimeEnvKeys,
40
- getRuntimeVar,
41
- getImageTag
42
- };
43
- //# sourceMappingURL=chunk-UDT2RPX2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config/runtime-env-config.ts"],"sourcesContent":["/**\n * Runtime environment variable keys injected on the client.\n * Values are read from `window.__RUNTIME_ENV__`.\n *\n * Consumers can register additional keys via `registerRuntimeEnvKeys()`.\n * @module runtime-env-config\n */\n\n/** Default framework runtime env keys. */\nexport const RUNTIME_ENV_KEYS = [\"IMAGE_TAG\", \"ENVIRONMENT\", \"BUILD_NUM\", \"BUILD_DATE\"] as const;\nexport type RuntimeEnvKey = (typeof RUNTIME_ENV_KEYS)[number];\nexport type RuntimeEnv = Partial<Record<string, string>>;\n\nconst extraKeys: string[] = [];\n\n/**\n * Register additional runtime environment keys.\n * Call this before runtime env payload is consumed by the app bootstrap.\n */\nexport function registerRuntimeEnvKeys(...keys: string[]): void {\n for (const key of keys) {\n if (!extraKeys.includes(key) && !(RUNTIME_ENV_KEYS as readonly string[]).includes(key)) {\n extraKeys.push(key);\n }\n }\n}\n\n/** Returns all registered runtime env keys (defaults + consumer-registered). */\nexport function getRuntimeEnvKeys(): readonly string[] {\n if (extraKeys.length === 0) return RUNTIME_ENV_KEYS;\n return [...RUNTIME_ENV_KEYS, ...extraKeys];\n}\n\n/** Clear consumer-registered runtime env keys. For testing only. */\nexport function clearRuntimeEnvKeys(): void {\n extraKeys.length = 0;\n}\n\ndeclare global {\n interface Window {\n __RUNTIME_ENV__?: RuntimeEnv;\n }\n}\n\nfunction getEnv(): RuntimeEnv {\n if (typeof window === \"undefined\") {\n return {};\n }\n return window.__RUNTIME_ENV__ ?? {};\n}\n\nexport function getRuntimeVar(key: string): string {\n const env = getEnv();\n const v = env[key];\n return typeof v === \"string\" ? v : \"\";\n}\n\nexport function getImageTag(): string {\n const v = getEnv().IMAGE_TAG;\n if (!v) return \"\";\n return v;\n}\n"],"mappings":";AASO,IAAM,mBAAmB,CAAC,aAAa,eAAe,aAAa,YAAY;AAItF,IAAM,YAAsB,CAAC;AAMtB,SAAS,0BAA0B,MAAsB;AAC5D,aAAW,OAAO,MAAM;AACpB,QAAI,CAAC,UAAU,SAAS,GAAG,KAAK,CAAE,iBAAuC,SAAS,GAAG,GAAG;AACpF,gBAAU,KAAK,GAAG;AAAA,IACtB;AAAA,EACJ;AACJ;AAGO,SAAS,oBAAuC;AACnD,MAAI,UAAU,WAAW,EAAG,QAAO;AACnC,SAAO,CAAC,GAAG,kBAAkB,GAAG,SAAS;AAC7C;AAGO,SAAS,sBAA4B;AACxC,YAAU,SAAS;AACvB;AAQA,SAAS,SAAqB;AAC1B,MAAI,OAAO,WAAW,aAAa;AAC/B,WAAO,CAAC;AAAA,EACZ;AACA,SAAO,OAAO,mBAAmB,CAAC;AACtC;AAEO,SAAS,cAAc,KAAqB;AAC/C,QAAM,MAAM,OAAO;AACnB,QAAM,IAAI,IAAI,GAAG;AACjB,SAAO,OAAO,MAAM,WAAW,IAAI;AACvC;AAEO,SAAS,cAAsB;AAClC,QAAM,IAAI,OAAO,EAAE;AACnB,MAAI,CAAC,EAAG,QAAO;AACf,SAAO;AACX;","names":[]}
@@ -1,17 +0,0 @@
1
- // src/config/constants.ts
2
- var emptyGuid = "00000000-0000-0000-0000-000000000000";
3
- var DIALOG_CONTENT_SELECTOR = ".spring-dialog-content";
4
- var DND_TOUCH_CONSTRAINT = { delay: 200, tolerance: 5 };
5
- var STORAGE_KEYS = {
6
- LANGUAGE: "language",
7
- COLOR_THEME: "colorTheme",
8
- DARK_MODE: "darkMode"
9
- };
10
-
11
- export {
12
- emptyGuid,
13
- DIALOG_CONTENT_SELECTOR,
14
- DND_TOUCH_CONSTRAINT,
15
- STORAGE_KEYS
16
- };
17
- //# sourceMappingURL=chunk-VRMVN2UM.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config/constants.ts"],"sourcesContent":["/** Empty GUID for new records */\nexport const emptyGuid = \"00000000-0000-0000-0000-000000000000\";\n\n/** Generic interface for select options */\nexport interface CodeList {\n id_public: string;\n name: string;\n code?: string;\n version?: number;\n}\n\n/** Interface for persons (full_name) */\nexport interface CodeListFullName {\n id_public: string;\n full_name: string;\n first_name: string;\n last_name?: string;\n}\n\nexport interface CodeListNumber {\n id_public: number;\n name: string;\n}\n\nexport type Operator = \"=\" | \">\" | \">=\" | \"<\" | \"<=\" | \"!=\" | \"in\" | \"between\";\n\n/** CSS selector for an open dialog (detection in shortcut hooks) */\nexport const DIALOG_CONTENT_SELECTOR = \".spring-dialog-content\";\n\n/** DnD TouchSensor activation constraint (delay + tolerance) */\nexport const DND_TOUCH_CONSTRAINT = { delay: 200, tolerance: 5 } as const;\n\nexport const STORAGE_KEYS = {\n LANGUAGE: \"language\",\n COLOR_THEME: \"colorTheme\",\n DARK_MODE: \"darkMode\",\n} as const;\n\n/** Union type of all storage key values. */\nexport type StorageKey = (typeof STORAGE_KEYS)[keyof typeof STORAGE_KEYS];\n"],"mappings":";AACO,IAAM,YAAY;AA0BlB,IAAM,0BAA0B;AAGhC,IAAM,uBAAuB,EAAE,OAAO,KAAK,WAAW,EAAE;AAExD,IAAM,eAAe;AAAA,EACxB,UAAU;AAAA,EACV,aAAa;AAAA,EACb,WAAW;AACf;","names":[]}
@@ -1,391 +0,0 @@
1
- import {
2
- getFrameworkConfig
3
- } from "./chunk-F7WUQJH7.js";
4
-
5
- // src/config/config-presets.ts
6
- var developmentPreset = {
7
- limits: {
8
- maxFileSize: 100 * 1024 * 1024
9
- // 100MB for testing large files
10
- }
11
- };
12
- var stagingPreset = {
13
- limits: {
14
- maxFileSize: 50 * 1024 * 1024
15
- // 50MB
16
- }
17
- };
18
- var productionPreset = {
19
- limits: {
20
- maxFileSize: 25 * 1024 * 1024
21
- // 25MB
22
- }
23
- };
24
- var presets = {
25
- development: developmentPreset,
26
- staging: stagingPreset,
27
- production: productionPreset
28
- };
29
- function getConfigPreset(env) {
30
- const preset = presets[env];
31
- return {
32
- ...preset,
33
- limits: preset.limits ? { ...preset.limits } : void 0
34
- };
35
- }
36
- function getAutoConfigPreset(options) {
37
- const importMetaEnv = options?.env ?? import.meta.env;
38
- const processTargetEnv = typeof process !== "undefined" ? process.env?.TARGET_ENV : void 0;
39
- const processNodeEnv = typeof process !== "undefined" ? process.env?.NODE_ENV : void 0;
40
- const targetEnv = options?.targetEnv ?? processTargetEnv ?? (typeof importMetaEnv?.TARGET_ENV === "string" ? importMetaEnv.TARGET_ENV : "") ?? "";
41
- const nodeEnv = options?.nodeEnv ?? processNodeEnv ?? (typeof importMetaEnv?.NODE_ENV === "string" ? importMetaEnv.NODE_ENV : "") ?? "";
42
- const mode = options?.mode ?? (typeof importMetaEnv?.MODE === "string" ? importMetaEnv.MODE : "");
43
- const isProdFlag = options?.prod ?? importMetaEnv?.PROD === true;
44
- if (targetEnv === "prod" || nodeEnv === "production" || mode === "production" || isProdFlag) {
45
- return getConfigPreset("production");
46
- }
47
- if (targetEnv === "staging") return getConfigPreset("staging");
48
- return getConfigPreset("development");
49
- }
50
-
51
- // src/config/layout-presets.ts
52
- var KNOWN_VARIANTS = /* @__PURE__ */ new Set(["admin", "website", "minimal", "custom"]);
53
- function isKnownVariant(value) {
54
- return KNOWN_VARIANTS.has(value);
55
- }
56
- var LAYOUT_PRESETS = {
57
- admin: { variant: "admin", requiresAuth: true },
58
- website: { variant: "website", requiresAuth: false },
59
- minimal: { variant: "minimal", requiresAuth: false },
60
- custom: { variant: "custom", requiresAuth: false }
61
- };
62
- function resolveLayoutConfig(name) {
63
- const config = getFrameworkConfig();
64
- const configured = config.layouts?.[name];
65
- if (configured) {
66
- const variant = configured.variant && isKnownVariant(configured.variant) ? configured.variant : "admin";
67
- const preset = LAYOUT_PRESETS[variant];
68
- return { ...preset, ...configured, variant };
69
- }
70
- if (isKnownVariant(name)) {
71
- return { ...LAYOUT_PRESETS[name], variant: name };
72
- }
73
- return { ...LAYOUT_PRESETS.admin, variant: "admin" };
74
- }
75
-
76
- // src/config/theme.ts
77
- var DEFAULT_THEME = {
78
- colorPrimary: "#2563EB",
79
- colorPrimaryLight: "#2563eb1f",
80
- colorPrimaryDark: "#1d4ed8",
81
- colorSecondaryDark: "#1e3a5f",
82
- colorDanger: "#b91c1c",
83
- colorSuccess: "#15803d",
84
- colorSuccessLight: "#e5f3ec",
85
- colorBg: "#dfebfb",
86
- colorBgLight: "#eff6ff",
87
- colorPanel: "white",
88
- colorBorder: "#a2a3b8",
89
- colorActive: "#ffbf49",
90
- colorDisabledBg: "#e4e4e4",
91
- colorText: "black",
92
- colorTextMuted: "#666666",
93
- colorTextDisabled: "#636363",
94
- colorTextSecondary: "white",
95
- colorPanelSecondary: "white",
96
- colorPanelDashboard: "#dfebfb",
97
- colorPanelDashboardSecondary: "#cbdbf2",
98
- colorPanelAlt: "#f9fafb",
99
- colorChartBg: "#201f25",
100
- colorDarkLightSecondary: "#eff6ff",
101
- fontSizeXxs: "10px",
102
- fontSizeXs: "11px",
103
- fontSizeSm: "12px",
104
- fontSizeMd: "13px",
105
- fontSizeLg: "14px",
106
- fontSizeXl: "16px",
107
- fontSize2xl: "22px",
108
- radiusXs: "1px",
109
- radiusSm: "3px",
110
- radiusMd: "6px",
111
- radiusLg: "12px",
112
- radiusXl: "16px",
113
- radiusDialog: "8px",
114
- radiusPanel: "10px",
115
- shadowXs: "0 1px 2px rgba(0, 0, 0, 0.06)",
116
- shadowSm: "0 2px 6px rgba(0, 0, 0, 0.06)",
117
- shadowMd: "0 4px 12px rgba(0, 0, 0, 0.15)",
118
- shadowLg: "0 4px 16px rgba(0, 0, 0, 0.12)",
119
- shadowPopup: "0 12px 32px rgba(0, 0, 0, 0.18), 0 6px 12px rgba(0, 0, 0, 0.12)",
120
- shadowNavbar: "0 2px 8px rgba(0, 0, 0, 0.08), 0 4px 16px rgba(0, 0, 0, 0.12)",
121
- shadowInset: "inset 0 2px 4px rgba(0, 0, 0, 0.04)",
122
- shadowBottom: "0 -2px 5px rgba(0, 0, 0, 0.2)",
123
- shadowDnd: "0 4px 12px rgba(0, 0, 0, 0.25)",
124
- shadowDndLg: "0 4px 12px rgba(0, 0, 0, 0.15), 0 8px 24px rgba(0, 0, 0, 0.2)",
125
- shadowDragSm: "0 2px 8px rgba(0, 0, 0, 0.2)",
126
- shadowSubtle: "0 2px 4px rgba(0, 0, 0, 0.15)",
127
- shadowRingWhite: "inset 0 0 0 2px rgba(255, 255, 255, 0.5)",
128
- transitionFast: "0.15s ease",
129
- transitionNormal: "0.3s ease",
130
- opacityGhost: "0.35",
131
- opacitySubtle: "0.4",
132
- opacityDisabled: "0.5",
133
- opacityMuted: "0.6",
134
- opacityOverlay: "0.7",
135
- opacityHover: "0.8",
136
- opacityHigh: "0.85",
137
- opacityNearOpaque: "0.9",
138
- sizeInputHeight: "27px",
139
- fontFamilyBase: "Verdana, Geneva, sans-serif"
140
- };
141
- var CAMEL_TO_CSS = {
142
- colorPrimary: "--spring-color-primary",
143
- colorPrimaryLight: "--spring-color-primary-light",
144
- colorPrimaryDark: "--spring-color-primary-dark",
145
- colorSecondaryDark: "--spring-color-secondary-dark",
146
- colorDanger: "--spring-color-danger",
147
- colorSuccess: "--spring-color-success",
148
- colorSuccessLight: "--spring-color-success-light",
149
- colorBg: "--spring-color-bg",
150
- colorBgLight: "--spring-color-bg-light",
151
- colorPanel: "--spring-color-panel",
152
- colorBorder: "--spring-color-border",
153
- colorActive: "--spring-color-active",
154
- colorDisabledBg: "--spring-color-disabled-bg",
155
- colorText: "--spring-color-text",
156
- colorTextMuted: "--spring-color-text-muted",
157
- colorTextDisabled: "--spring-color-text-disabled",
158
- colorTextSecondary: "--spring-color-text-secondary",
159
- colorPanelSecondary: "--spring-color-panel-secondary",
160
- colorPanelDashboard: "--spring-color-panel-dashboard",
161
- colorPanelDashboardSecondary: "--spring-color-panel-dashboard-secondary",
162
- colorPanelAlt: "--spring-color-panel-alt",
163
- colorChartBg: "--spring-color-chart-bg",
164
- colorDarkLightSecondary: "--spring-color-dark-light-secondary",
165
- fontSizeXxs: "--spring-font-size-xxs",
166
- fontSizeXs: "--spring-font-size-xs",
167
- fontSizeSm: "--spring-font-size-sm",
168
- fontSizeMd: "--spring-font-size-md",
169
- fontSizeLg: "--spring-font-size-lg",
170
- fontSizeXl: "--spring-font-size-xl",
171
- fontSize2xl: "--spring-font-size-2xl",
172
- radiusXs: "--spring-radius-xs",
173
- radiusSm: "--spring-radius-sm",
174
- radiusMd: "--spring-radius-md",
175
- radiusLg: "--spring-radius-lg",
176
- radiusXl: "--spring-radius-xl",
177
- radiusDialog: "--spring-radius-dialog",
178
- radiusPanel: "--spring-radius-panel",
179
- shadowXs: "--spring-shadow-xs",
180
- shadowSm: "--spring-shadow-sm",
181
- shadowMd: "--spring-shadow-md",
182
- shadowLg: "--spring-shadow-lg",
183
- shadowPopup: "--spring-shadow-popup",
184
- shadowNavbar: "--spring-shadow-navbar",
185
- shadowInset: "--spring-shadow-inset",
186
- shadowBottom: "--spring-shadow-bottom",
187
- shadowDnd: "--spring-shadow-dnd",
188
- shadowDndLg: "--spring-shadow-dnd-lg",
189
- shadowDragSm: "--spring-shadow-drag-sm",
190
- shadowSubtle: "--spring-shadow-subtle",
191
- shadowRingWhite: "--spring-shadow-ring-white",
192
- transitionFast: "--spring-transition-fast",
193
- transitionNormal: "--spring-transition-normal",
194
- opacityGhost: "--spring-opacity-ghost",
195
- opacitySubtle: "--spring-opacity-subtle",
196
- opacityDisabled: "--spring-opacity-disabled",
197
- opacityMuted: "--spring-opacity-muted",
198
- opacityOverlay: "--spring-opacity-overlay",
199
- opacityHover: "--spring-opacity-hover",
200
- opacityHigh: "--spring-opacity-high",
201
- opacityNearOpaque: "--spring-opacity-near-opaque",
202
- sizeInputHeight: "--spring-size-input-height",
203
- fontFamilyBase: "--spring-font-family-base"
204
- };
205
- var componentTokenMap = {
206
- button: {
207
- borderRadius: "--spring-button-border-radius",
208
- paddingX: "--spring-button-padding-x",
209
- paddingY: "--spring-button-padding-y",
210
- fontSize: "--spring-button-font-size",
211
- primaryBg: "--spring-button-primary-bg",
212
- primaryColor: "--spring-button-primary-color",
213
- primaryHoverFilter: "--spring-button-primary-hover-filter",
214
- outlineBorderColor: "--spring-button-outline-border-color",
215
- ghostHoverBg: "--spring-button-ghost-hover-bg",
216
- minWidth: "--spring-button-min-width",
217
- smPaddingX: "--spring-button-sm-padding-x",
218
- smPaddingY: "--spring-button-sm-padding-y",
219
- smFontSize: "--spring-button-sm-font-size",
220
- smMinWidth: "--spring-button-sm-min-width",
221
- lgPaddingX: "--spring-button-lg-padding-x",
222
- lgPaddingY: "--spring-button-lg-padding-y",
223
- lgFontSize: "--spring-button-lg-font-size",
224
- lgMinWidth: "--spring-button-lg-min-width"
225
- },
226
- list: {
227
- rowHeight: "--spring-list-row-height",
228
- headerBg: "--spring-list-header-bg",
229
- headerColor: "--spring-list-header-color",
230
- stripedBg: "--spring-list-striped-bg",
231
- selectedBg: "--spring-list-selected-bg",
232
- hoverBg: "--spring-list-hover-bg",
233
- borderColor: "--spring-list-border-color",
234
- fontSize: "--spring-list-font-size"
235
- },
236
- form: {
237
- fieldSpacing: "--spring-form-field-spacing",
238
- labelColor: "--spring-form-label-color",
239
- labelFontSize: "--spring-form-label-font-size",
240
- inputHeight: "--spring-form-input-height",
241
- inputBg: "--spring-form-input-bg",
242
- inputBorderColor: "--spring-form-input-border-color",
243
- inputFocusBorderColor: "--spring-form-input-focus-border-color",
244
- inputFontSize: "--spring-form-input-font-size",
245
- inputBorderRadius: "--spring-form-input-border-radius"
246
- },
247
- dialog: {
248
- backdropColor: "--spring-dialog-backdrop-color",
249
- maxWidth: "--spring-dialog-max-width",
250
- borderRadius: "--spring-dialog-border-radius",
251
- padding: "--spring-dialog-padding",
252
- shadowColor: "--spring-dialog-shadow-color"
253
- },
254
- page: {
255
- headerBg: "--spring-page-header-bg",
256
- headerBorderColor: "--spring-page-header-border-color",
257
- navigationBg: "--spring-page-navigation-bg",
258
- navigationWidth: "--spring-page-navigation-width",
259
- contentBg: "--spring-page-content-bg"
260
- },
261
- panel: {
262
- bg: "--spring-panel-bg",
263
- borderColor: "--spring-panel-border-color",
264
- borderRadius: "--spring-panel-border-radius",
265
- padding: "--spring-panel-padding"
266
- }
267
- };
268
- var DEFAULT_DARK_THEME = {
269
- colorPrimary: "#7c78d8",
270
- colorPrimaryLight: "#7c78d81f",
271
- colorPrimaryDark: "#9d9ae0",
272
- colorSecondaryDark: "#c8c6f0",
273
- colorDanger: "#ef4444",
274
- colorSuccess: "#22c55e",
275
- colorSuccessLight: "#1a3a2a",
276
- colorBg: "#1a1b2e",
277
- colorBgLight: "#222340",
278
- colorPanel: "#2a2b45",
279
- colorBorder: "#4a4b6a",
280
- colorActive: "#f59e0b",
281
- colorDisabledBg: "#3a3b55",
282
- colorText: "#e4e4f0",
283
- colorTextMuted: "#a0a0b8",
284
- colorTextDisabled: "#6a6a80",
285
- colorTextSecondary: "#f0f0ff",
286
- colorPanelSecondary: "#32334d",
287
- colorPanelDashboard: "#1e1f35",
288
- colorPanelDashboardSecondary: "#262742",
289
- colorPanelAlt: "#32334d",
290
- colorChartBg: "#1a1b2e",
291
- colorDarkLightSecondary: "#2e2f4a",
292
- shadowXs: "0 1px 2px rgba(0, 0, 0, 0.2)",
293
- shadowSm: "0 2px 6px rgba(0, 0, 0, 0.25)",
294
- shadowMd: "0 4px 12px rgba(0, 0, 0, 0.4)",
295
- shadowLg: "0 4px 16px rgba(0, 0, 0, 0.35)",
296
- shadowPopup: "0 12px 32px rgba(0, 0, 0, 0.5), 0 6px 12px rgba(0, 0, 0, 0.35)",
297
- shadowNavbar: "0 2px 8px rgba(0, 0, 0, 0.25), 0 4px 16px rgba(0, 0, 0, 0.3)",
298
- shadowInset: "inset 0 2px 4px rgba(0, 0, 0, 0.15)",
299
- shadowBottom: "0 -2px 5px rgba(0, 0, 0, 0.4)",
300
- shadowDnd: "0 4px 12px rgba(0, 0, 0, 0.5)",
301
- shadowDndLg: "0 4px 12px rgba(0, 0, 0, 0.35), 0 8px 24px rgba(0, 0, 0, 0.45)",
302
- shadowDragSm: "0 2px 8px rgba(0, 0, 0, 0.45)",
303
- shadowSubtle: "0 2px 4px rgba(0, 0, 0, 0.35)",
304
- shadowRingWhite: "inset 0 0 0 2px rgba(255, 255, 255, 0.3)"
305
- };
306
- function createTheme(overrides) {
307
- return { ...DEFAULT_THEME, ...overrides };
308
- }
309
- function getResolvedTheme() {
310
- if (typeof document === "undefined") {
311
- return { ...DEFAULT_THEME };
312
- }
313
- const style = getComputedStyle(document.documentElement);
314
- const result = { ...DEFAULT_THEME };
315
- for (const [key, cssVar] of Object.entries(CAMEL_TO_CSS)) {
316
- const value = style.getPropertyValue(cssVar).trim();
317
- if (value) {
318
- result[key] = value;
319
- }
320
- }
321
- return result;
322
- }
323
- function themeToCSS(theme, componentTokens) {
324
- const lines = Object.entries(theme).filter(([key]) => key in CAMEL_TO_CSS).map(([key, value]) => ` ${CAMEL_TO_CSS[key]}: ${value};`);
325
- if (componentTokens) {
326
- for (const [group, tokens] of Object.entries(componentTokens)) {
327
- const map = componentTokenMap[group];
328
- if (!map) continue;
329
- for (const [key, value] of Object.entries(tokens)) {
330
- const cssVar = map[key];
331
- if (cssVar && value) {
332
- lines.push(` ${cssVar}: ${value};`);
333
- }
334
- }
335
- }
336
- }
337
- return `:root {
338
- ${lines.join("\n")}
339
- }`;
340
- }
341
- function themeToCSSDark(darkOverrides) {
342
- const lines = [];
343
- for (const [key, value] of Object.entries(darkOverrides)) {
344
- const cssVar = CAMEL_TO_CSS[key];
345
- if (cssVar && value) {
346
- lines.push(` ${cssVar}: ${value};`);
347
- }
348
- }
349
- if (lines.length === 0) return "";
350
- return `[data-spring-theme="dark"] {
351
- ${lines.join("\n")}
352
- }`;
353
- }
354
- function themeToCSSVariables(theme, componentTokens) {
355
- const result = {};
356
- for (const [key, value] of Object.entries(theme)) {
357
- const cssVar = CAMEL_TO_CSS[key];
358
- if (cssVar) {
359
- result[cssVar] = value;
360
- }
361
- }
362
- if (componentTokens) {
363
- for (const [group, tokens] of Object.entries(componentTokens)) {
364
- const map = componentTokenMap[group];
365
- if (!map) continue;
366
- for (const [key, value] of Object.entries(tokens)) {
367
- const cssVar = map[key];
368
- if (cssVar && value) {
369
- result[cssVar] = value;
370
- }
371
- }
372
- }
373
- }
374
- return result;
375
- }
376
-
377
- export {
378
- getConfigPreset,
379
- getAutoConfigPreset,
380
- LAYOUT_PRESETS,
381
- resolveLayoutConfig,
382
- DEFAULT_THEME,
383
- CAMEL_TO_CSS,
384
- DEFAULT_DARK_THEME,
385
- createTheme,
386
- getResolvedTheme,
387
- themeToCSS,
388
- themeToCSSDark,
389
- themeToCSSVariables
390
- };
391
- //# sourceMappingURL=chunk-XGNQEGV7.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config/config-presets.ts","../src/config/layout-presets.ts","../src/config/theme.ts"],"sourcesContent":["/**\n * Environment-specific configuration presets for enterprise deployments.\n *\n * Provides sensible defaults per environment (development, staging, production)\n * that can be used as a base for `configureFramework()`.\n *\n * @example\n * ```ts\n * import { configureFramework } from \"@spring-systems/core/config\";\n * import { getConfigPreset } from \"@spring-systems/core/config\";\n *\n * // Use production preset as base, override app-specific settings\n * const preset = getConfigPreset(\"production\");\n * configureFramework({\n * ...preset,\n * app: { ...preset.app, name: \"My SPRING\" },\n * });\n * ```\n *\n * @module config-presets\n */\n\nimport type { FrameworkConfigOverrides } from \"./framework-config-types\";\n\n/** Supported environment names for config presets. */\nexport type ConfigEnvironment = \"development\" | \"staging\" | \"production\";\nexport interface AutoConfigPresetOptions {\n targetEnv?: string;\n nodeEnv?: string;\n mode?: string;\n prod?: boolean;\n env?: Record<string, unknown>;\n}\n\n/**\n * Development preset — verbose logging, relaxed limits, debug-friendly.\n */\nconst developmentPreset = {\n limits: {\n maxFileSize: 100 * 1024 * 1024, // 100MB for testing large files\n },\n} satisfies FrameworkConfigOverrides;\n\n/**\n * Staging preset — production-like but with more verbose error reporting.\n */\nconst stagingPreset = {\n limits: {\n maxFileSize: 50 * 1024 * 1024, // 50MB\n },\n} satisfies FrameworkConfigOverrides;\n\n/**\n * Production preset — strict security, optimized limits, minimal logging.\n */\nconst productionPreset = {\n limits: {\n maxFileSize: 25 * 1024 * 1024, // 25MB\n },\n} satisfies FrameworkConfigOverrides;\n\nconst presets = {\n development: developmentPreset,\n staging: stagingPreset,\n production: productionPreset,\n} satisfies Record<ConfigEnvironment, FrameworkConfigOverrides>;\n\n/**\n * Get environment-specific configuration defaults.\n * Use as a base for `configureFramework()` — merge with app-specific overrides.\n */\nexport function getConfigPreset(env: ConfigEnvironment): FrameworkConfigOverrides {\n const preset = presets[env];\n return {\n ...preset,\n limits: preset.limits ? { ...preset.limits } : undefined,\n };\n}\n\n/**\n * Auto-detect environment from NODE_ENV / TARGET_ENV and return the matching preset.\n * Falls back to \"development\" if not recognized.\n */\nexport function getAutoConfigPreset(options?: AutoConfigPresetOptions): FrameworkConfigOverrides {\n const importMetaEnv = options?.env ?? (import.meta as ImportMeta & { env?: Record<string, unknown> }).env;\n const processTargetEnv = typeof process !== \"undefined\" ? process.env?.TARGET_ENV : undefined;\n const processNodeEnv = typeof process !== \"undefined\" ? process.env?.NODE_ENV : undefined;\n const targetEnv =\n options?.targetEnv ??\n processTargetEnv ??\n (typeof importMetaEnv?.TARGET_ENV === \"string\" ? importMetaEnv.TARGET_ENV : \"\") ??\n \"\";\n const nodeEnv =\n options?.nodeEnv ??\n processNodeEnv ??\n (typeof importMetaEnv?.NODE_ENV === \"string\" ? importMetaEnv.NODE_ENV : \"\") ??\n \"\";\n const mode = options?.mode ?? (typeof importMetaEnv?.MODE === \"string\" ? importMetaEnv.MODE : \"\");\n const isProdFlag = options?.prod ?? (importMetaEnv?.PROD === true);\n\n if (targetEnv === \"prod\" || nodeEnv === \"production\" || mode === \"production\" || isProdFlag) {\n return getConfigPreset(\"production\");\n }\n if (targetEnv === \"staging\") return getConfigPreset(\"staging\");\n return getConfigPreset(\"development\");\n}\n","/**\n * Default layout presets and resolution logic.\n * @module layout-presets\n */\n\nimport { getFrameworkConfig } from \"./framework-config\";\nimport type { LayoutConfig, LayoutVariant } from \"./framework-config-types\";\n\nconst KNOWN_VARIANTS = new Set<string>([\"admin\", \"website\", \"minimal\", \"custom\"]);\n\nfunction isKnownVariant(value: string): value is LayoutVariant {\n return KNOWN_VARIANTS.has(value);\n}\n\n/** Default configurations for each layout variant (without navigation). */\nexport const LAYOUT_PRESETS: Record<LayoutVariant, Omit<LayoutConfig, \"navigation\">> = {\n admin: { variant: \"admin\", requiresAuth: true },\n website: { variant: \"website\", requiresAuth: false },\n minimal: { variant: \"minimal\", requiresAuth: false },\n custom: { variant: \"custom\", requiresAuth: false },\n};\n\n/**\n * Resolve a layout configuration by name.\n *\n * Looks up `config.layouts[name]` first, then falls back to\n * the preset matching the name (if it's a known variant),\n * and finally defaults to the admin preset.\n */\nexport function resolveLayoutConfig(name: string): LayoutConfig {\n const config = getFrameworkConfig();\n const configured = config.layouts?.[name];\n\n if (configured) {\n const variant = configured.variant && isKnownVariant(configured.variant)\n ? configured.variant\n : \"admin\";\n const preset = LAYOUT_PRESETS[variant];\n return { ...preset, ...configured, variant };\n }\n\n // If name matches a known variant, use the preset directly\n if (isKnownVariant(name)) {\n return { ...LAYOUT_PRESETS[name], variant: name };\n }\n\n // Fallback to admin\n return { ...LAYOUT_PRESETS.admin, variant: \"admin\" };\n}\n","/**\n * Theme variable contract for the SPRING framework.\n * Projects override these via CSS `@theme` in their globals.css.\n * @module theme\n */\n\n/** Template literal type for SPRING CSS custom properties. */\nexport type SpringCssVariable = `--spring-${string}`;\n\nexport interface SpringThemeVariables {\n colorPrimary: string;\n colorPrimaryLight: string;\n colorPrimaryDark: string;\n colorSecondaryDark: string;\n colorDanger: string;\n colorSuccess: string;\n colorSuccessLight: string;\n colorBg: string;\n colorBgLight: string;\n colorPanel: string;\n colorBorder: string;\n colorActive: string;\n colorDisabledBg: string;\n colorText: string;\n colorTextMuted: string;\n colorTextDisabled: string;\n colorTextSecondary: string;\n colorPanelSecondary: string;\n colorPanelDashboard: string;\n colorPanelDashboardSecondary: string;\n colorPanelAlt: string;\n colorChartBg: string;\n colorDarkLightSecondary: string;\n fontSizeXxs: string;\n fontSizeXs: string;\n fontSizeSm: string;\n fontSizeMd: string;\n fontSizeLg: string;\n fontSizeXl: string;\n fontSize2xl: string;\n radiusXs: string;\n radiusSm: string;\n radiusMd: string;\n radiusLg: string;\n radiusXl: string;\n radiusDialog: string;\n radiusPanel: string;\n shadowXs: string;\n shadowSm: string;\n shadowMd: string;\n shadowLg: string;\n shadowPopup: string;\n shadowNavbar: string;\n shadowInset: string;\n shadowBottom: string;\n shadowDnd: string;\n shadowDndLg: string;\n shadowDragSm: string;\n shadowSubtle: string;\n shadowRingWhite: string;\n transitionFast: string;\n transitionNormal: string;\n opacityGhost: string;\n opacitySubtle: string;\n opacityDisabled: string;\n opacityMuted: string;\n opacityOverlay: string;\n opacityHover: string;\n opacityHigh: string;\n opacityNearOpaque: string;\n sizeInputHeight: string;\n fontFamilyBase: string;\n}\n\nexport const DEFAULT_THEME = {\n colorPrimary: \"#2563EB\",\n colorPrimaryLight: \"#2563eb1f\",\n colorPrimaryDark: \"#1d4ed8\",\n colorSecondaryDark: \"#1e3a5f\",\n colorDanger: \"#b91c1c\",\n colorSuccess: \"#15803d\",\n colorSuccessLight: \"#e5f3ec\",\n colorBg: \"#dfebfb\",\n colorBgLight: \"#eff6ff\",\n colorPanel: \"white\",\n colorBorder: \"#a2a3b8\",\n colorActive: \"#ffbf49\",\n colorDisabledBg: \"#e4e4e4\",\n colorText: \"black\",\n colorTextMuted: \"#666666\",\n colorTextDisabled: \"#636363\",\n colorTextSecondary: \"white\",\n colorPanelSecondary: \"white\",\n colorPanelDashboard: \"#dfebfb\",\n colorPanelDashboardSecondary: \"#cbdbf2\",\n colorPanelAlt: \"#f9fafb\",\n colorChartBg: \"#201f25\",\n colorDarkLightSecondary: \"#eff6ff\",\n fontSizeXxs: \"10px\",\n fontSizeXs: \"11px\",\n fontSizeSm: \"12px\",\n fontSizeMd: \"13px\",\n fontSizeLg: \"14px\",\n fontSizeXl: \"16px\",\n fontSize2xl: \"22px\",\n radiusXs: \"1px\",\n radiusSm: \"3px\",\n radiusMd: \"6px\",\n radiusLg: \"12px\",\n radiusXl: \"16px\",\n radiusDialog: \"8px\",\n radiusPanel: \"10px\",\n shadowXs: \"0 1px 2px rgba(0, 0, 0, 0.06)\",\n shadowSm: \"0 2px 6px rgba(0, 0, 0, 0.06)\",\n shadowMd: \"0 4px 12px rgba(0, 0, 0, 0.15)\",\n shadowLg: \"0 4px 16px rgba(0, 0, 0, 0.12)\",\n shadowPopup: \"0 12px 32px rgba(0, 0, 0, 0.18), 0 6px 12px rgba(0, 0, 0, 0.12)\",\n shadowNavbar: \"0 2px 8px rgba(0, 0, 0, 0.08), 0 4px 16px rgba(0, 0, 0, 0.12)\",\n shadowInset: \"inset 0 2px 4px rgba(0, 0, 0, 0.04)\",\n shadowBottom: \"0 -2px 5px rgba(0, 0, 0, 0.2)\",\n shadowDnd: \"0 4px 12px rgba(0, 0, 0, 0.25)\",\n shadowDndLg: \"0 4px 12px rgba(0, 0, 0, 0.15), 0 8px 24px rgba(0, 0, 0, 0.2)\",\n shadowDragSm: \"0 2px 8px rgba(0, 0, 0, 0.2)\",\n shadowSubtle: \"0 2px 4px rgba(0, 0, 0, 0.15)\",\n shadowRingWhite: \"inset 0 0 0 2px rgba(255, 255, 255, 0.5)\",\n transitionFast: \"0.15s ease\",\n transitionNormal: \"0.3s ease\",\n opacityGhost: \"0.35\",\n opacitySubtle: \"0.4\",\n opacityDisabled: \"0.5\",\n opacityMuted: \"0.6\",\n opacityOverlay: \"0.7\",\n opacityHover: \"0.8\",\n opacityHigh: \"0.85\",\n opacityNearOpaque: \"0.9\",\n sizeInputHeight: \"27px\",\n fontFamilyBase: \"Verdana, Geneva, sans-serif\",\n} as const satisfies SpringThemeVariables;\n\nexport const CAMEL_TO_CSS = {\n colorPrimary: \"--spring-color-primary\",\n colorPrimaryLight: \"--spring-color-primary-light\",\n colorPrimaryDark: \"--spring-color-primary-dark\",\n colorSecondaryDark: \"--spring-color-secondary-dark\",\n colorDanger: \"--spring-color-danger\",\n colorSuccess: \"--spring-color-success\",\n colorSuccessLight: \"--spring-color-success-light\",\n colorBg: \"--spring-color-bg\",\n colorBgLight: \"--spring-color-bg-light\",\n colorPanel: \"--spring-color-panel\",\n colorBorder: \"--spring-color-border\",\n colorActive: \"--spring-color-active\",\n colorDisabledBg: \"--spring-color-disabled-bg\",\n colorText: \"--spring-color-text\",\n colorTextMuted: \"--spring-color-text-muted\",\n colorTextDisabled: \"--spring-color-text-disabled\",\n colorTextSecondary: \"--spring-color-text-secondary\",\n colorPanelSecondary: \"--spring-color-panel-secondary\",\n colorPanelDashboard: \"--spring-color-panel-dashboard\",\n colorPanelDashboardSecondary: \"--spring-color-panel-dashboard-secondary\",\n colorPanelAlt: \"--spring-color-panel-alt\",\n colorChartBg: \"--spring-color-chart-bg\",\n colorDarkLightSecondary: \"--spring-color-dark-light-secondary\",\n fontSizeXxs: \"--spring-font-size-xxs\",\n fontSizeXs: \"--spring-font-size-xs\",\n fontSizeSm: \"--spring-font-size-sm\",\n fontSizeMd: \"--spring-font-size-md\",\n fontSizeLg: \"--spring-font-size-lg\",\n fontSizeXl: \"--spring-font-size-xl\",\n fontSize2xl: \"--spring-font-size-2xl\",\n radiusXs: \"--spring-radius-xs\",\n radiusSm: \"--spring-radius-sm\",\n radiusMd: \"--spring-radius-md\",\n radiusLg: \"--spring-radius-lg\",\n radiusXl: \"--spring-radius-xl\",\n radiusDialog: \"--spring-radius-dialog\",\n radiusPanel: \"--spring-radius-panel\",\n shadowXs: \"--spring-shadow-xs\",\n shadowSm: \"--spring-shadow-sm\",\n shadowMd: \"--spring-shadow-md\",\n shadowLg: \"--spring-shadow-lg\",\n shadowPopup: \"--spring-shadow-popup\",\n shadowNavbar: \"--spring-shadow-navbar\",\n shadowInset: \"--spring-shadow-inset\",\n shadowBottom: \"--spring-shadow-bottom\",\n shadowDnd: \"--spring-shadow-dnd\",\n shadowDndLg: \"--spring-shadow-dnd-lg\",\n shadowDragSm: \"--spring-shadow-drag-sm\",\n shadowSubtle: \"--spring-shadow-subtle\",\n shadowRingWhite: \"--spring-shadow-ring-white\",\n transitionFast: \"--spring-transition-fast\",\n transitionNormal: \"--spring-transition-normal\",\n opacityGhost: \"--spring-opacity-ghost\",\n opacitySubtle: \"--spring-opacity-subtle\",\n opacityDisabled: \"--spring-opacity-disabled\",\n opacityMuted: \"--spring-opacity-muted\",\n opacityOverlay: \"--spring-opacity-overlay\",\n opacityHover: \"--spring-opacity-hover\",\n opacityHigh: \"--spring-opacity-high\",\n opacityNearOpaque: \"--spring-opacity-near-opaque\",\n sizeInputHeight: \"--spring-size-input-height\",\n fontFamilyBase: \"--spring-font-family-base\",\n} as const satisfies Record<keyof SpringThemeVariables, string>;\n\ntype ThemeKey = keyof typeof CAMEL_TO_CSS;\ntype ComponentTokenGroup = keyof typeof componentTokenMap;\n\n/** Per-component theme tokens. Values can reference --spring-* variables. */\nexport interface SpringComponentTokens {\n button?: {\n borderRadius?: string;\n paddingX?: string;\n paddingY?: string;\n fontSize?: string;\n primaryBg?: string;\n primaryColor?: string;\n primaryHoverFilter?: string;\n outlineBorderColor?: string;\n ghostHoverBg?: string;\n minWidth?: string;\n /** Small size overrides */\n smPaddingX?: string;\n smPaddingY?: string;\n smFontSize?: string;\n smMinWidth?: string;\n /** Large size overrides */\n lgPaddingX?: string;\n lgPaddingY?: string;\n lgFontSize?: string;\n lgMinWidth?: string;\n };\n list?: {\n rowHeight?: string;\n headerBg?: string;\n headerColor?: string;\n stripedBg?: string;\n selectedBg?: string;\n hoverBg?: string;\n borderColor?: string;\n fontSize?: string;\n };\n form?: {\n fieldSpacing?: string;\n labelColor?: string;\n labelFontSize?: string;\n inputHeight?: string;\n inputBg?: string;\n inputBorderColor?: string;\n inputFocusBorderColor?: string;\n inputFontSize?: string;\n inputBorderRadius?: string;\n };\n dialog?: {\n backdropColor?: string;\n maxWidth?: string;\n borderRadius?: string;\n padding?: string;\n shadowColor?: string;\n };\n page?: {\n headerBg?: string;\n headerBorderColor?: string;\n navigationBg?: string;\n navigationWidth?: string;\n contentBg?: string;\n };\n panel?: {\n bg?: string;\n borderColor?: string;\n borderRadius?: string;\n padding?: string;\n };\n}\n\nconst componentTokenMap = {\n button: {\n borderRadius: \"--spring-button-border-radius\",\n paddingX: \"--spring-button-padding-x\",\n paddingY: \"--spring-button-padding-y\",\n fontSize: \"--spring-button-font-size\",\n primaryBg: \"--spring-button-primary-bg\",\n primaryColor: \"--spring-button-primary-color\",\n primaryHoverFilter: \"--spring-button-primary-hover-filter\",\n outlineBorderColor: \"--spring-button-outline-border-color\",\n ghostHoverBg: \"--spring-button-ghost-hover-bg\",\n minWidth: \"--spring-button-min-width\",\n smPaddingX: \"--spring-button-sm-padding-x\",\n smPaddingY: \"--spring-button-sm-padding-y\",\n smFontSize: \"--spring-button-sm-font-size\",\n smMinWidth: \"--spring-button-sm-min-width\",\n lgPaddingX: \"--spring-button-lg-padding-x\",\n lgPaddingY: \"--spring-button-lg-padding-y\",\n lgFontSize: \"--spring-button-lg-font-size\",\n lgMinWidth: \"--spring-button-lg-min-width\",\n },\n list: {\n rowHeight: \"--spring-list-row-height\",\n headerBg: \"--spring-list-header-bg\",\n headerColor: \"--spring-list-header-color\",\n stripedBg: \"--spring-list-striped-bg\",\n selectedBg: \"--spring-list-selected-bg\",\n hoverBg: \"--spring-list-hover-bg\",\n borderColor: \"--spring-list-border-color\",\n fontSize: \"--spring-list-font-size\",\n },\n form: {\n fieldSpacing: \"--spring-form-field-spacing\",\n labelColor: \"--spring-form-label-color\",\n labelFontSize: \"--spring-form-label-font-size\",\n inputHeight: \"--spring-form-input-height\",\n inputBg: \"--spring-form-input-bg\",\n inputBorderColor: \"--spring-form-input-border-color\",\n inputFocusBorderColor: \"--spring-form-input-focus-border-color\",\n inputFontSize: \"--spring-form-input-font-size\",\n inputBorderRadius: \"--spring-form-input-border-radius\",\n },\n dialog: {\n backdropColor: \"--spring-dialog-backdrop-color\",\n maxWidth: \"--spring-dialog-max-width\",\n borderRadius: \"--spring-dialog-border-radius\",\n padding: \"--spring-dialog-padding\",\n shadowColor: \"--spring-dialog-shadow-color\",\n },\n page: {\n headerBg: \"--spring-page-header-bg\",\n headerBorderColor: \"--spring-page-header-border-color\",\n navigationBg: \"--spring-page-navigation-bg\",\n navigationWidth: \"--spring-page-navigation-width\",\n contentBg: \"--spring-page-content-bg\",\n },\n panel: {\n bg: \"--spring-panel-bg\",\n borderColor: \"--spring-panel-border-color\",\n borderRadius: \"--spring-panel-border-radius\",\n padding: \"--spring-panel-padding\",\n },\n} as const satisfies Record<string, Record<string, string>>;\n\n/**\n * Default dark theme overrides.\n * Only includes color tokens that change between light and dark modes.\n * Non-color tokens (fonts, spacing, shadows) inherit from the light theme.\n *\n * @example\n * ```ts\n * // Generate dark mode CSS\n * const css = themeToCSSDark(DEFAULT_DARK_THEME);\n * // Produces [data-spring-theme=\"dark\"] { ... }\n * ```\n */\nexport const DEFAULT_DARK_THEME = {\n colorPrimary: \"#7c78d8\",\n colorPrimaryLight: \"#7c78d81f\",\n colorPrimaryDark: \"#9d9ae0\",\n colorSecondaryDark: \"#c8c6f0\",\n colorDanger: \"#ef4444\",\n colorSuccess: \"#22c55e\",\n colorSuccessLight: \"#1a3a2a\",\n colorBg: \"#1a1b2e\",\n colorBgLight: \"#222340\",\n colorPanel: \"#2a2b45\",\n colorBorder: \"#4a4b6a\",\n colorActive: \"#f59e0b\",\n colorDisabledBg: \"#3a3b55\",\n colorText: \"#e4e4f0\",\n colorTextMuted: \"#a0a0b8\",\n colorTextDisabled: \"#6a6a80\",\n colorTextSecondary: \"#f0f0ff\",\n colorPanelSecondary: \"#32334d\",\n colorPanelDashboard: \"#1e1f35\",\n colorPanelDashboardSecondary: \"#262742\",\n colorPanelAlt: \"#32334d\",\n colorChartBg: \"#1a1b2e\",\n colorDarkLightSecondary: \"#2e2f4a\",\n shadowXs: \"0 1px 2px rgba(0, 0, 0, 0.2)\",\n shadowSm: \"0 2px 6px rgba(0, 0, 0, 0.25)\",\n shadowMd: \"0 4px 12px rgba(0, 0, 0, 0.4)\",\n shadowLg: \"0 4px 16px rgba(0, 0, 0, 0.35)\",\n shadowPopup: \"0 12px 32px rgba(0, 0, 0, 0.5), 0 6px 12px rgba(0, 0, 0, 0.35)\",\n shadowNavbar: \"0 2px 8px rgba(0, 0, 0, 0.25), 0 4px 16px rgba(0, 0, 0, 0.3)\",\n shadowInset: \"inset 0 2px 4px rgba(0, 0, 0, 0.15)\",\n shadowBottom: \"0 -2px 5px rgba(0, 0, 0, 0.4)\",\n shadowDnd: \"0 4px 12px rgba(0, 0, 0, 0.5)\",\n shadowDndLg: \"0 4px 12px rgba(0, 0, 0, 0.35), 0 8px 24px rgba(0, 0, 0, 0.45)\",\n shadowDragSm: \"0 2px 8px rgba(0, 0, 0, 0.45)\",\n shadowSubtle: \"0 2px 4px rgba(0, 0, 0, 0.35)\",\n shadowRingWhite: \"inset 0 0 0 2px rgba(255, 255, 255, 0.3)\",\n} as const satisfies Partial<SpringThemeVariables>;\n\nexport function createTheme(overrides: Partial<SpringThemeVariables>): SpringThemeVariables {\n return { ...DEFAULT_THEME, ...overrides };\n}\n\n/**\n * Read the resolved theme from the DOM (computed CSS variable values).\n * Falls back to DEFAULT_THEME when running on the server or in tests.\n */\nexport function getResolvedTheme(): SpringThemeVariables {\n if (typeof document === \"undefined\") {\n return { ...DEFAULT_THEME };\n }\n const style = getComputedStyle(document.documentElement);\n const result = { ...DEFAULT_THEME };\n for (const [key, cssVar] of Object.entries(CAMEL_TO_CSS)) {\n const value = style.getPropertyValue(cssVar).trim();\n if (value) {\n (result as Record<string, string>)[key] = value;\n }\n }\n return result;\n}\n\nexport function themeToCSS(theme: SpringThemeVariables, componentTokens?: SpringComponentTokens): string {\n const lines = Object.entries(theme)\n .filter(([key]) => key in CAMEL_TO_CSS)\n .map(([key, value]) => ` ${CAMEL_TO_CSS[key as ThemeKey]}: ${value};`);\n\n if (componentTokens) {\n for (const [group, tokens] of Object.entries(componentTokens)) {\n const map = componentTokenMap[group as ComponentTokenGroup];\n if (!map) continue;\n for (const [key, value] of Object.entries(tokens as Record<string, string>)) {\n const cssVar = (map as Record<string, string>)[key];\n if (cssVar && value) {\n lines.push(` ${cssVar}: ${value};`);\n }\n }\n }\n }\n\n return `:root {\\n${lines.join(\"\\n\")}\\n}`;\n}\n\n/**\n * Generate dark mode CSS. Uses `[data-spring-theme=\"dark\"]` selector.\n * The \"system\" preference is resolved by a matchMedia listener in theme-store.ts\n * that sets the attribute — no duplicated @media block needed.\n * Only includes variables that are explicitly set in the dark theme (partial overrides).\n */\nexport function themeToCSSDark(darkOverrides: Partial<SpringThemeVariables>): string {\n const lines: string[] = [];\n for (const [key, value] of Object.entries(darkOverrides)) {\n const cssVar = CAMEL_TO_CSS[key as ThemeKey];\n if (cssVar && value) {\n lines.push(` ${cssVar}: ${value};`);\n }\n }\n if (lines.length === 0) return \"\";\n\n return `[data-spring-theme=\"dark\"] {\\n${lines.join(\"\\n\")}\\n}`;\n}\n\nexport function themeToCSSVariables(\n theme: SpringThemeVariables,\n componentTokens?: SpringComponentTokens,\n): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(theme)) {\n const cssVar = CAMEL_TO_CSS[key as ThemeKey];\n if (cssVar) {\n result[cssVar] = value;\n }\n }\n\n if (componentTokens) {\n for (const [group, tokens] of Object.entries(componentTokens)) {\n const map = componentTokenMap[group as ComponentTokenGroup];\n if (!map) continue;\n for (const [key, value] of Object.entries(tokens as Record<string, string>)) {\n const cssVar = (map as Record<string, string>)[key];\n if (cssVar && value) {\n result[cssVar] = value;\n }\n }\n }\n }\n\n return result;\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/devtools/inspect.ts"],"sourcesContent":["/**\n * Lightweight dev-mode introspection utility for SpringInstance.\n * Zero production cost — all functions are no-ops when `__DEV__` is false.\n *\n * Usage in browser console: `window.__SPRING_INSPECT__()`\n *\n * @module devtools/inspect\n */\n\nimport { tryGetSpringInstance } from \"../instance/current-instance\";\nimport type { SpringInstance } from \"../instance/spring-instance\";\nimport { __DEV__ } from \"../utils/dev-warnings\";\n\ninterface InspectResult {\n id: string;\n state: string;\n config: {\n appName: string;\n defaultRoute: string;\n apiTimeoutMs: number | undefined;\n languages: number;\n };\n plugins: ReadonlyArray<{ name: string; version?: string }>;\n capabilities: Record<string, unknown>;\n middleware: string[];\n slots: string[];\n fieldTypes: string[];\n columnTypes: string[];\n validators: string[];\n adapters: {\n route: boolean;\n ui: boolean;\n http: boolean;\n telemetry: boolean;\n };\n auth: {\n authenticated: boolean;\n hasToken: boolean;\n };\n}\n\nfunction collectRegistryKeys(instance: SpringInstance, uiKey: symbol): string[] {\n const registry = instance.ui[uiKey];\n if (registry instanceof Map) return Array.from(registry.keys()) as string[];\n return [];\n}\n\n/**\n * Inspect the current SpringInstance state. Returns a structured summary\n * of all framework registrations, adapters, and configuration.\n *\n * Only works in dev mode — returns `undefined` in production.\n */\nexport function inspectInstance(instance?: SpringInstance): InspectResult | undefined {\n if (!__DEV__) return undefined;\n\n const inst = instance ?? tryGetSpringInstance();\n if (!inst) {\n console.warn(\"[SPRING DevTools] No SpringInstance found. Is SpringProvider mounted?\");\n return undefined;\n }\n\n const config = inst.core.config;\n const loadedPlugins = (inst.ui[Symbol.for(\"spring:loadedPlugins\")] ?? []) as ReadonlyArray<{ name: string; version?: string }>;\n const capabilities = (inst.ui[Symbol.for(\"spring:capabilities\")] ?? {}) as Record<string, unknown>;\n\n const middlewareSlots = Array.from(inst.core.middlewareRegistry.entries())\n .filter(([, list]) => list.length > 0)\n .map(([slot, list]) => `${slot} (${list.length})`);\n\n const result: InspectResult = {\n id: inst.id,\n state: inst.state,\n config: {\n appName: config.app.name,\n defaultRoute: config.app.defaultRoute,\n apiTimeoutMs: config.api?.timeoutMs,\n languages: config.i18n.languages.length,\n },\n plugins: loadedPlugins,\n capabilities,\n middleware: middlewareSlots,\n slots: collectRegistryKeys(inst, Symbol.for(\"spring:slotRegistry\")),\n fieldTypes: collectRegistryKeys(inst, Symbol.for(\"spring:fieldRendererRegistry\")),\n columnTypes: collectRegistryKeys(inst, Symbol.for(\"spring:columnRendererRegistry\")),\n validators: Array.from(inst.core.validatorRegistry.keys()),\n adapters: {\n route: !!inst.ui[Symbol.for(\"spring:routeAdapter\")],\n ui: !!inst.ui[Symbol.for(\"spring:uiAdapter\")],\n http: !!inst.ui[Symbol.for(\"spring:httpAdapter\")],\n telemetry: !!inst.ui[Symbol.for(\"spring:telemetryAdapter\")],\n },\n auth: {\n authenticated: inst.core.authenticated,\n hasToken: !!inst.api.authToken,\n },\n };\n\n console.info(`SPRING Instance: ${inst.id} [${inst.state}]`);\n console.info(\"App:\", config.app.name);\n console.info(\"Plugins:\", loadedPlugins.length > 0 ? loadedPlugins : \"(none)\");\n console.info(\"Middleware:\", middlewareSlots.length > 0 ? middlewareSlots : \"(none)\");\n console.info(\"Slots:\", result.slots.length > 0 ? result.slots : \"(none)\");\n console.info(\"Capabilities:\", Object.keys(capabilities).length > 0 ? capabilities : \"(none)\");\n console.info(\"Adapters:\", result.adapters);\n console.info(\"Auth:\", result.auth);\n\n return result;\n}\n\n// Register global shortcut for browser console\nif (__DEV__ && typeof window !== \"undefined\") {\n (window as unknown as Record<string, unknown>).__SPRING_INSPECT__ = inspectInstance;\n}\n"],"mappings":";;;;;;;AAyCA,SAAS,oBAAoB,UAA0B,OAAyB;AAC5E,QAAM,WAAW,SAAS,GAAG,KAAK;AAClC,MAAI,oBAAoB,IAAK,QAAO,MAAM,KAAK,SAAS,KAAK,CAAC;AAC9D,SAAO,CAAC;AACZ;AAQO,SAAS,gBAAgB,UAAsD;AAClF,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,OAAO,YAAY,qBAAqB;AAC9C,MAAI,CAAC,MAAM;AACP,YAAQ,KAAK,uEAAuE;AACpF,WAAO;AAAA,EACX;AAEA,QAAM,SAAS,KAAK,KAAK;AACzB,QAAM,gBAAiB,KAAK,GAAG,uBAAO,IAAI,sBAAsB,CAAC,KAAK,CAAC;AACvE,QAAM,eAAgB,KAAK,GAAG,uBAAO,IAAI,qBAAqB,CAAC,KAAK,CAAC;AAErE,QAAM,kBAAkB,MAAM,KAAK,KAAK,KAAK,mBAAmB,QAAQ,CAAC,EACpE,OAAO,CAAC,CAAC,EAAE,IAAI,MAAM,KAAK,SAAS,CAAC,EACpC,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,GAAG,IAAI,KAAK,KAAK,MAAM,GAAG;AAErD,QAAM,SAAwB;AAAA,IAC1B,IAAI,KAAK;AAAA,IACT,OAAO,KAAK;AAAA,IACZ,QAAQ;AAAA,MACJ,SAAS,OAAO,IAAI;AAAA,MACpB,cAAc,OAAO,IAAI;AAAA,MACzB,cAAc,OAAO,KAAK;AAAA,MAC1B,WAAW,OAAO,KAAK,UAAU;AAAA,IACrC;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,OAAO,oBAAoB,MAAM,uBAAO,IAAI,qBAAqB,CAAC;AAAA,IAClE,YAAY,oBAAoB,MAAM,uBAAO,IAAI,8BAA8B,CAAC;AAAA,IAChF,aAAa,oBAAoB,MAAM,uBAAO,IAAI,+BAA+B,CAAC;AAAA,IAClF,YAAY,MAAM,KAAK,KAAK,KAAK,kBAAkB,KAAK,CAAC;AAAA,IACzD,UAAU;AAAA,MACN,OAAO,CAAC,CAAC,KAAK,GAAG,uBAAO,IAAI,qBAAqB,CAAC;AAAA,MAClD,IAAI,CAAC,CAAC,KAAK,GAAG,uBAAO,IAAI,kBAAkB,CAAC;AAAA,MAC5C,MAAM,CAAC,CAAC,KAAK,GAAG,uBAAO,IAAI,oBAAoB,CAAC;AAAA,MAChD,WAAW,CAAC,CAAC,KAAK,GAAG,uBAAO,IAAI,yBAAyB,CAAC;AAAA,IAC9D;AAAA,IACA,MAAM;AAAA,MACF,eAAe,KAAK,KAAK;AAAA,MACzB,UAAU,CAAC,CAAC,KAAK,IAAI;AAAA,IACzB;AAAA,EACJ;AAEA,UAAQ,KAAK,oBAAoB,KAAK,EAAE,KAAK,KAAK,KAAK,GAAG;AAC1D,UAAQ,KAAK,QAAQ,OAAO,IAAI,IAAI;AACpC,UAAQ,KAAK,YAAY,cAAc,SAAS,IAAI,gBAAgB,QAAQ;AAC5E,UAAQ,KAAK,eAAe,gBAAgB,SAAS,IAAI,kBAAkB,QAAQ;AACnF,UAAQ,KAAK,UAAU,OAAO,MAAM,SAAS,IAAI,OAAO,QAAQ,QAAQ;AACxE,UAAQ,KAAK,iBAAiB,OAAO,KAAK,YAAY,EAAE,SAAS,IAAI,eAAe,QAAQ;AAC5F,UAAQ,KAAK,aAAa,OAAO,QAAQ;AACzC,UAAQ,KAAK,SAAS,OAAO,IAAI;AAEjC,SAAO;AACX;AAGA,IAAI,WAAW,OAAO,WAAW,aAAa;AAC1C,EAAC,OAA8C,qBAAqB;AACxE;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// @spring-systems/core\n// Core types, utilities, and configuration for Spring Systems SPRING.\n// Use sub-path imports for tree-shaking: @spring-systems/core/config, /utils, /types, etc.\n//\n// Convenience re-exports for the most commonly used APIs:\nexport {\n configureCapabilities,\n configureFramework,\n getCapabilities,\n getCapability,\n getFrameworkConfig,\n hasCapability,\n} from \"./config\";\nexport { eventBus } from \"./events/event-bus\";\nexport { getMiddlewareRunner, registerMiddleware } from \"./middleware\";\n\ndeclare const __VERSION__: string;\nexport const SPRING_CORE_VERSION: string = typeof __VERSION__ !== \"undefined\" ? __VERSION__ : \"0.0.0-dev\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBO,IAAM,sBAA8B,OAAqC,UAAc;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}