@spring-systems/core 0.8.0

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 (101) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/LICENSE +8 -0
  3. package/README.md +77 -0
  4. package/dist/adapters/index.d.ts +246 -0
  5. package/dist/adapters/index.js +56 -0
  6. package/dist/adapters/index.js.map +1 -0
  7. package/dist/auth/index.d.ts +17 -0
  8. package/dist/auth/index.js +19 -0
  9. package/dist/auth/index.js.map +1 -0
  10. package/dist/chunk-5D6XE7NJ.js +16 -0
  11. package/dist/chunk-5D6XE7NJ.js.map +1 -0
  12. package/dist/chunk-EFUBAQCV.js +94 -0
  13. package/dist/chunk-EFUBAQCV.js.map +1 -0
  14. package/dist/chunk-F2SIMWZ5.js +173 -0
  15. package/dist/chunk-F2SIMWZ5.js.map +1 -0
  16. package/dist/chunk-F7WUQJH7.js +399 -0
  17. package/dist/chunk-F7WUQJH7.js.map +1 -0
  18. package/dist/chunk-GON7Q32Q.js +176 -0
  19. package/dist/chunk-GON7Q32Q.js.map +1 -0
  20. package/dist/chunk-GXU75LQX.js +182 -0
  21. package/dist/chunk-GXU75LQX.js.map +1 -0
  22. package/dist/chunk-HFELOXDQ.js +110 -0
  23. package/dist/chunk-HFELOXDQ.js.map +1 -0
  24. package/dist/chunk-KX32MU3I.js +190 -0
  25. package/dist/chunk-KX32MU3I.js.map +1 -0
  26. package/dist/chunk-MEWPYTWC.js +284 -0
  27. package/dist/chunk-MEWPYTWC.js.map +1 -0
  28. package/dist/chunk-N2L4TUC4.js +34 -0
  29. package/dist/chunk-N2L4TUC4.js.map +1 -0
  30. package/dist/chunk-NQQIVCLX.js +47 -0
  31. package/dist/chunk-NQQIVCLX.js.map +1 -0
  32. package/dist/chunk-OSSX443T.js +146 -0
  33. package/dist/chunk-OSSX443T.js.map +1 -0
  34. package/dist/chunk-PT4DIYUK.js +78 -0
  35. package/dist/chunk-PT4DIYUK.js.map +1 -0
  36. package/dist/chunk-QAVWXARR.js +51 -0
  37. package/dist/chunk-QAVWXARR.js.map +1 -0
  38. package/dist/chunk-RRWKDFAB.js +143 -0
  39. package/dist/chunk-RRWKDFAB.js.map +1 -0
  40. package/dist/chunk-RUCXSQEY.js +42 -0
  41. package/dist/chunk-RUCXSQEY.js.map +1 -0
  42. package/dist/chunk-S6RPCN5H.js +64 -0
  43. package/dist/chunk-S6RPCN5H.js.map +1 -0
  44. package/dist/chunk-S7MKRNMI.js +153 -0
  45. package/dist/chunk-S7MKRNMI.js.map +1 -0
  46. package/dist/chunk-SQB4F3EF.js +55 -0
  47. package/dist/chunk-SQB4F3EF.js.map +1 -0
  48. package/dist/chunk-U5OH3GAI.js +399 -0
  49. package/dist/chunk-U5OH3GAI.js.map +1 -0
  50. package/dist/chunk-UDT2RPX2.js +43 -0
  51. package/dist/chunk-UDT2RPX2.js.map +1 -0
  52. package/dist/config/index.d.ts +63 -0
  53. package/dist/config/index.js +109 -0
  54. package/dist/config/index.js.map +1 -0
  55. package/dist/devtools/index.d.ts +54 -0
  56. package/dist/devtools/index.js +67 -0
  57. package/dist/devtools/index.js.map +1 -0
  58. package/dist/errors/index.d.ts +39 -0
  59. package/dist/errors/index.js +21 -0
  60. package/dist/errors/index.js.map +1 -0
  61. package/dist/events/index.d.ts +153 -0
  62. package/dist/events/index.js +12 -0
  63. package/dist/events/index.js.map +1 -0
  64. package/dist/form-types-D3MdGpjA.d.ts +290 -0
  65. package/dist/framework-config-types-DeUbx4bu.d.ts +574 -0
  66. package/dist/i18n/index.d.ts +37 -0
  67. package/dist/i18n/index.js +7 -0
  68. package/dist/i18n/index.js.map +1 -0
  69. package/dist/index.d.ts +9 -0
  70. package/dist/index.js +42 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/instance/index.d.ts +112 -0
  73. package/dist/instance/index.js +37 -0
  74. package/dist/instance/index.js.map +1 -0
  75. package/dist/logger/index.d.ts +44 -0
  76. package/dist/logger/index.js +27 -0
  77. package/dist/logger/index.js.map +1 -0
  78. package/dist/middleware/index.d.ts +91 -0
  79. package/dist/middleware/index.js +23 -0
  80. package/dist/middleware/index.js.map +1 -0
  81. package/dist/middleware-registry-DT002qRd.d.ts +60 -0
  82. package/dist/middleware-types-DVG9C1qJ.d.ts +85 -0
  83. package/dist/plugins/index.d.ts +104 -0
  84. package/dist/plugins/index.js +16 -0
  85. package/dist/plugins/index.js.map +1 -0
  86. package/dist/runtime-env-config-CajOEJCP.d.ts +148 -0
  87. package/dist/security-sanitize-Bb0PExM6.d.ts +9 -0
  88. package/dist/spring-instance-EbUh4mQb.d.ts +119 -0
  89. package/dist/testing/index.d.ts +129 -0
  90. package/dist/testing/index.js +171 -0
  91. package/dist/testing/index.js.map +1 -0
  92. package/dist/types/index.d.ts +85 -0
  93. package/dist/types/index.js +72 -0
  94. package/dist/types/index.js.map +1 -0
  95. package/dist/utils/index.d.ts +143 -0
  96. package/dist/utils/index.js +786 -0
  97. package/dist/utils/index.js.map +1 -0
  98. package/dist/validation/index.d.ts +48 -0
  99. package/dist/validation/index.js +147 -0
  100. package/dist/validation/index.js.map +1 -0
  101. package/package.json +142 -0
@@ -0,0 +1 @@
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 @media (prefers-color-scheme: dark) { ... }\n * // and [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 for programmatic toggling.\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 const darkCSS = lines.join(\"\\n\");\n return [\n `@media (prefers-color-scheme: dark) {\\n :root {\\n${darkCSS}\\n }\\n}`,\n `[data-spring-theme=\"dark\"] {\\n${darkCSS}\\n}`,\n ].join(\"\\n\\n\");\n}\n\nexport function themeToCSSVariables(theme: SpringThemeVariables, componentTokens?: SpringComponentTokens): 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":[]}
@@ -0,0 +1,43 @@
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
@@ -0,0 +1 @@
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":[]}
@@ -0,0 +1,63 @@
1
+ export { C as ConfigValidationResult, D as DEFAULT_FRAMEWORK_CONFIG, R as RUNTIME_ENV_KEYS, e as RuntimeEnv, f as RuntimeEnvKey, i as applyFallbackConfig, j as clearCapabilities, k as clearFrameworkConfig, l as clearRuntimeEnvKeys, c as configureCapabilities, a as configureFramework, m as createFrameworkConfig, n as getApiDefaultPageSize, o as getApiTimeoutMs, p as getAutocompleteDebounceMs, g as getCapabilities, b as getCapability, d as getFrameworkConfig, q as getIdleSessionTimeoutMs, r as getImageTag, s as getMaxFileSize, t as getRegisteredCapabilityNames, u as getRuntimeEnvKeys, v as getRuntimeVar, w as getSecureSessionCookieName, x as getSessionCookieName, y as getSignalrIdleTimeoutMs, z as getSignalrKeepAliveIntervalMs, A as getSignalrReconnectDelaysMs, B as getSignalrServerTimeoutMs, h as hasCapability, E as registerRuntimeEnvKeys, F as validateFrameworkConfig } from '../runtime-env-config-CajOEJCP.js';
2
+ import { F as FrameworkConfigOverrides, L as LayoutVariant, b as LayoutConfig } from '../framework-config-types-DeUbx4bu.js';
3
+ export { C as CAMEL_TO_CSS, c as CapabilityMap, d as CodeList, e as CodeListFullName, f as CodeListNumber, D as DEFAULT_DARK_THEME, g as DEFAULT_THEME, h as DIALOG_CONTENT_SELECTOR, i as DND_TOUCH_CONSTRAINT, j as DateFormatConfig, a as FrameworkConfig, N as NavigationMenuItem, O as Operator, S as STORAGE_KEYS, k as SpringComponentTokens, l as SpringCssVariable, m as SpringThemeVariables, n as StorageKey, o as createTheme, p as emptyGuid, q as getResolvedTheme, t as themeToCSS, r as themeToCSSDark, s as themeToCSSVariables } from '../framework-config-types-DeUbx4bu.js';
4
+
5
+ /**
6
+ * Environment-specific configuration presets for enterprise deployments.
7
+ *
8
+ * Provides sensible defaults per environment (development, staging, production)
9
+ * that can be used as a base for `configureFramework()`.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import { configureFramework } from "@spring-systems/core/config";
14
+ * import { getConfigPreset } from "@spring-systems/core/config";
15
+ *
16
+ * // Use production preset as base, override app-specific settings
17
+ * const preset = getConfigPreset("production");
18
+ * configureFramework({
19
+ * ...preset,
20
+ * app: { ...preset.app, name: "My SPRING" },
21
+ * });
22
+ * ```
23
+ *
24
+ * @module config-presets
25
+ */
26
+
27
+ /** Supported environment names for config presets. */
28
+ type ConfigEnvironment = "development" | "staging" | "production";
29
+ interface AutoConfigPresetOptions {
30
+ targetEnv?: string;
31
+ nodeEnv?: string;
32
+ mode?: string;
33
+ prod?: boolean;
34
+ env?: Record<string, unknown>;
35
+ }
36
+ /**
37
+ * Get environment-specific configuration defaults.
38
+ * Use as a base for `configureFramework()` — merge with app-specific overrides.
39
+ */
40
+ declare function getConfigPreset(env: ConfigEnvironment): FrameworkConfigOverrides;
41
+ /**
42
+ * Auto-detect environment from NODE_ENV / TARGET_ENV and return the matching preset.
43
+ * Falls back to "development" if not recognized.
44
+ */
45
+ declare function getAutoConfigPreset(options?: AutoConfigPresetOptions): FrameworkConfigOverrides;
46
+
47
+ /**
48
+ * Default layout presets and resolution logic.
49
+ * @module layout-presets
50
+ */
51
+
52
+ /** Default configurations for each layout variant (without navigation). */
53
+ declare const LAYOUT_PRESETS: Record<LayoutVariant, Omit<LayoutConfig, "navigation">>;
54
+ /**
55
+ * Resolve a layout configuration by name.
56
+ *
57
+ * Looks up `config.layouts[name]` first, then falls back to
58
+ * the preset matching the name (if it's a known variant),
59
+ * and finally defaults to the admin preset.
60
+ */
61
+ declare function resolveLayoutConfig(name: string): LayoutConfig;
62
+
63
+ export { type AutoConfigPresetOptions, type ConfigEnvironment, FrameworkConfigOverrides, LAYOUT_PRESETS, LayoutConfig, LayoutVariant, getAutoConfigPreset, getConfigPreset, resolveLayoutConfig };
@@ -0,0 +1,109 @@
1
+ import {
2
+ CAMEL_TO_CSS,
3
+ DEFAULT_DARK_THEME,
4
+ DEFAULT_THEME,
5
+ LAYOUT_PRESETS,
6
+ createTheme,
7
+ getAutoConfigPreset,
8
+ getConfigPreset,
9
+ getResolvedTheme,
10
+ resolveLayoutConfig,
11
+ themeToCSS,
12
+ themeToCSSDark,
13
+ themeToCSSVariables
14
+ } from "../chunk-U5OH3GAI.js";
15
+ import {
16
+ RUNTIME_ENV_KEYS,
17
+ clearRuntimeEnvKeys,
18
+ getImageTag,
19
+ getRuntimeEnvKeys,
20
+ getRuntimeVar,
21
+ registerRuntimeEnvKeys
22
+ } from "../chunk-UDT2RPX2.js";
23
+ import {
24
+ clearCapabilities,
25
+ configureCapabilities,
26
+ getCapabilities,
27
+ getCapability,
28
+ getRegisteredCapabilityNames,
29
+ hasCapability
30
+ } from "../chunk-S7MKRNMI.js";
31
+ import {
32
+ DIALOG_CONTENT_SELECTOR,
33
+ DND_TOUCH_CONSTRAINT,
34
+ STORAGE_KEYS,
35
+ emptyGuid
36
+ } from "../chunk-5D6XE7NJ.js";
37
+ import {
38
+ DEFAULT_FRAMEWORK_CONFIG,
39
+ applyFallbackConfig,
40
+ clearFrameworkConfig,
41
+ configureFramework,
42
+ createFrameworkConfig,
43
+ getApiDefaultPageSize,
44
+ getApiTimeoutMs,
45
+ getAutocompleteDebounceMs,
46
+ getFrameworkConfig,
47
+ getIdleSessionTimeoutMs,
48
+ getMaxFileSize,
49
+ getSecureSessionCookieName,
50
+ getSessionCookieName,
51
+ getSignalrIdleTimeoutMs,
52
+ getSignalrKeepAliveIntervalMs,
53
+ getSignalrReconnectDelaysMs,
54
+ getSignalrServerTimeoutMs,
55
+ validateFrameworkConfig
56
+ } from "../chunk-F7WUQJH7.js";
57
+ import "../chunk-RUCXSQEY.js";
58
+ import "../chunk-KX32MU3I.js";
59
+ import "../chunk-EFUBAQCV.js";
60
+ import "../chunk-PT4DIYUK.js";
61
+ export {
62
+ CAMEL_TO_CSS,
63
+ DEFAULT_DARK_THEME,
64
+ DEFAULT_FRAMEWORK_CONFIG,
65
+ DEFAULT_THEME,
66
+ DIALOG_CONTENT_SELECTOR,
67
+ DND_TOUCH_CONSTRAINT,
68
+ LAYOUT_PRESETS,
69
+ RUNTIME_ENV_KEYS,
70
+ STORAGE_KEYS,
71
+ applyFallbackConfig,
72
+ clearCapabilities,
73
+ clearFrameworkConfig,
74
+ clearRuntimeEnvKeys,
75
+ configureCapabilities,
76
+ configureFramework,
77
+ createFrameworkConfig,
78
+ createTheme,
79
+ emptyGuid,
80
+ getApiDefaultPageSize,
81
+ getApiTimeoutMs,
82
+ getAutoConfigPreset,
83
+ getAutocompleteDebounceMs,
84
+ getCapabilities,
85
+ getCapability,
86
+ getConfigPreset,
87
+ getFrameworkConfig,
88
+ getIdleSessionTimeoutMs,
89
+ getImageTag,
90
+ getMaxFileSize,
91
+ getRegisteredCapabilityNames,
92
+ getResolvedTheme,
93
+ getRuntimeEnvKeys,
94
+ getRuntimeVar,
95
+ getSecureSessionCookieName,
96
+ getSessionCookieName,
97
+ getSignalrIdleTimeoutMs,
98
+ getSignalrKeepAliveIntervalMs,
99
+ getSignalrReconnectDelaysMs,
100
+ getSignalrServerTimeoutMs,
101
+ hasCapability,
102
+ registerRuntimeEnvKeys,
103
+ resolveLayoutConfig,
104
+ themeToCSS,
105
+ themeToCSSDark,
106
+ themeToCSSVariables,
107
+ validateFrameworkConfig
108
+ };
109
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,54 @@
1
+ import { d as SpringInstance } from '../spring-instance-EbUh4mQb.js';
2
+ import '../framework-config-types-DeUbx4bu.js';
3
+ import '../middleware-types-DVG9C1qJ.js';
4
+ import '../form-types-D3MdGpjA.js';
5
+ import '../security-sanitize-Bb0PExM6.js';
6
+
7
+ /**
8
+ * Lightweight dev-mode introspection utility for SpringInstance.
9
+ * Zero production cost — all functions are no-ops when `__DEV__` is false.
10
+ *
11
+ * Usage in browser console: `window.__SPRING_INSPECT__()`
12
+ *
13
+ * @module devtools/inspect
14
+ */
15
+
16
+ interface InspectResult {
17
+ id: string;
18
+ state: string;
19
+ config: {
20
+ appName: string;
21
+ defaultRoute: string;
22
+ apiTimeoutMs: number | undefined;
23
+ languages: number;
24
+ };
25
+ plugins: ReadonlyArray<{
26
+ name: string;
27
+ version?: string;
28
+ }>;
29
+ capabilities: Record<string, unknown>;
30
+ middleware: string[];
31
+ slots: string[];
32
+ fieldTypes: string[];
33
+ columnTypes: string[];
34
+ validators: string[];
35
+ adapters: {
36
+ route: boolean;
37
+ ui: boolean;
38
+ http: boolean;
39
+ telemetry: boolean;
40
+ };
41
+ auth: {
42
+ authenticated: boolean;
43
+ hasToken: boolean;
44
+ };
45
+ }
46
+ /**
47
+ * Inspect the current SpringInstance state. Returns a structured summary
48
+ * of all framework registrations, adapters, and configuration.
49
+ *
50
+ * Only works in dev mode — returns `undefined` in production.
51
+ */
52
+ declare function inspectInstance(instance?: SpringInstance): InspectResult | undefined;
53
+
54
+ export { inspectInstance };
@@ -0,0 +1,67 @@
1
+ import {
2
+ __DEV__,
3
+ tryGetSpringInstance
4
+ } from "../chunk-EFUBAQCV.js";
5
+ import "../chunk-PT4DIYUK.js";
6
+
7
+ // src/devtools/inspect.ts
8
+ function collectRegistryKeys(instance, uiKey) {
9
+ const registry = instance.ui[uiKey];
10
+ if (registry instanceof Map) return Array.from(registry.keys());
11
+ return [];
12
+ }
13
+ function inspectInstance(instance) {
14
+ if (!__DEV__) return void 0;
15
+ const inst = instance ?? tryGetSpringInstance();
16
+ if (!inst) {
17
+ console.warn("[SPRING DevTools] No SpringInstance found. Is SpringProvider mounted?");
18
+ return void 0;
19
+ }
20
+ const config = inst.core.config;
21
+ const loadedPlugins = inst.ui[/* @__PURE__ */ Symbol.for("spring:loadedPlugins")] ?? [];
22
+ const capabilities = inst.ui[/* @__PURE__ */ Symbol.for("spring:capabilities")] ?? {};
23
+ const middlewareSlots = Array.from(inst.core.middlewareRegistry.entries()).filter(([, list]) => list.length > 0).map(([slot, list]) => `${slot} (${list.length})`);
24
+ const result = {
25
+ id: inst.id,
26
+ state: inst.state,
27
+ config: {
28
+ appName: config.app.name,
29
+ defaultRoute: config.app.defaultRoute,
30
+ apiTimeoutMs: config.api?.timeoutMs,
31
+ languages: config.i18n.languages.length
32
+ },
33
+ plugins: loadedPlugins,
34
+ capabilities,
35
+ middleware: middlewareSlots,
36
+ slots: collectRegistryKeys(inst, /* @__PURE__ */ Symbol.for("spring:slotRegistry")),
37
+ fieldTypes: collectRegistryKeys(inst, /* @__PURE__ */ Symbol.for("spring:fieldRendererRegistry")),
38
+ columnTypes: collectRegistryKeys(inst, /* @__PURE__ */ Symbol.for("spring:columnRendererRegistry")),
39
+ validators: Array.from(inst.core.validatorRegistry.keys()),
40
+ adapters: {
41
+ route: !!inst.ui[/* @__PURE__ */ Symbol.for("spring:routeAdapter")],
42
+ ui: !!inst.ui[/* @__PURE__ */ Symbol.for("spring:uiAdapter")],
43
+ http: !!inst.ui[/* @__PURE__ */ Symbol.for("spring:httpAdapter")],
44
+ telemetry: !!inst.ui[/* @__PURE__ */ Symbol.for("spring:telemetryAdapter")]
45
+ },
46
+ auth: {
47
+ authenticated: inst.core.authenticated,
48
+ hasToken: !!inst.api.authToken
49
+ }
50
+ };
51
+ console.info(`SPRING Instance: ${inst.id} [${inst.state}]`);
52
+ console.info("App:", config.app.name);
53
+ console.info("Plugins:", loadedPlugins.length > 0 ? loadedPlugins : "(none)");
54
+ console.info("Middleware:", middlewareSlots.length > 0 ? middlewareSlots : "(none)");
55
+ console.info("Slots:", result.slots.length > 0 ? result.slots : "(none)");
56
+ console.info("Capabilities:", Object.keys(capabilities).length > 0 ? capabilities : "(none)");
57
+ console.info("Adapters:", result.adapters);
58
+ console.info("Auth:", result.auth);
59
+ return result;
60
+ }
61
+ if (__DEV__ && typeof window !== "undefined") {
62
+ window.__SPRING_INSPECT__ = inspectInstance;
63
+ }
64
+ export {
65
+ inspectInstance
66
+ };
67
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
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":[]}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Custom error classes for the SPRING framework.
3
+ * Provides structured, typed errors for better error handling by consumers.
4
+ * @module errors
5
+ */
6
+ declare class SpringError extends Error {
7
+ readonly code: string;
8
+ constructor(message: string, code: string);
9
+ }
10
+ declare class SpringConfigError extends SpringError {
11
+ constructor(message: string);
12
+ }
13
+ declare class SpringValidationError extends SpringError {
14
+ readonly field?: string | undefined;
15
+ constructor(message: string, field?: string | undefined);
16
+ }
17
+ declare class SpringSlotError extends SpringError {
18
+ readonly slotName: string;
19
+ constructor(slotName: string, message: string);
20
+ }
21
+ declare class SpringApiError extends SpringError {
22
+ readonly statusCode: number;
23
+ readonly endpoint: string;
24
+ constructor(message: string, statusCode: number, endpoint: string, code?: "API_ERROR");
25
+ }
26
+ declare class SpringPluginError extends SpringError {
27
+ readonly pluginName: string;
28
+ constructor(message: string, pluginName: string, code?: "PLUGIN_ERROR");
29
+ }
30
+ declare class SpringAdapterError extends SpringError {
31
+ readonly adapterName: string;
32
+ constructor(message: string, adapterName: string, code?: "ADAPTER_ERROR");
33
+ }
34
+ declare class SpringMiddlewareError extends SpringError {
35
+ readonly slot: string;
36
+ constructor(message: string, slot: string, code?: "MIDDLEWARE_ERROR");
37
+ }
38
+
39
+ export { SpringAdapterError, SpringApiError, SpringConfigError, SpringError, SpringMiddlewareError, SpringPluginError, SpringSlotError, SpringValidationError };
@@ -0,0 +1,21 @@
1
+ import {
2
+ SpringAdapterError,
3
+ SpringApiError,
4
+ SpringConfigError,
5
+ SpringError,
6
+ SpringMiddlewareError,
7
+ SpringPluginError,
8
+ SpringSlotError,
9
+ SpringValidationError
10
+ } from "../chunk-PT4DIYUK.js";
11
+ export {
12
+ SpringAdapterError,
13
+ SpringApiError,
14
+ SpringConfigError,
15
+ SpringError,
16
+ SpringMiddlewareError,
17
+ SpringPluginError,
18
+ SpringSlotError,
19
+ SpringValidationError
20
+ };
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Typed event map for the framework event bus.
3
+ * Each key is an event name, and the value is the payload type.
4
+ * @module event-types
5
+ */
6
+ interface FrameworkEventMap {
7
+ /** Emitted on user logout. */
8
+ "auth:logout": void;
9
+ /** Reserved — will be emitted when login tracking is implemented. */
10
+ "auth:login": {
11
+ userId: string;
12
+ };
13
+ /** Reserved — will be emitted by session expiry detection. */
14
+ "auth:session-expired": void;
15
+ /** Reserved — will be emitted by route adapter on navigation. */
16
+ "navigation:route-changed": {
17
+ route: string;
18
+ previousRoute: string;
19
+ };
20
+ /** Reserved — will be emitted when a tab is opened in multi-tab layout. */
21
+ "navigation:tab-opened": {
22
+ route: string;
23
+ };
24
+ /** Reserved — will be emitted when a tab is closed in multi-tab layout. */
25
+ "navigation:tab-closed": {
26
+ route: string;
27
+ };
28
+ /** Emitted before form data is loaded from the API. */
29
+ "form:before-load": {
30
+ entity: string;
31
+ id: string;
32
+ };
33
+ /** Emitted after form data is loaded (or initialized for new records). */
34
+ "form:after-load": {
35
+ entity: string;
36
+ id: string;
37
+ };
38
+ /** Emitted before form data is saved to the API. */
39
+ "form:before-save": {
40
+ entity: string;
41
+ id: string;
42
+ };
43
+ /** Emitted after form data is saved. */
44
+ "form:after-save": {
45
+ entity: string;
46
+ id: string;
47
+ isNew: boolean;
48
+ };
49
+ /** Emitted before a record is deleted via the API. */
50
+ "form:before-delete": {
51
+ entity: string;
52
+ id: string;
53
+ };
54
+ /** Emitted after a record is successfully deleted. */
55
+ "form:after-delete": {
56
+ entity: string;
57
+ id: string;
58
+ };
59
+ /** Emitted before list data is loaded from the API. */
60
+ "list:before-load": {
61
+ apiUrl: string;
62
+ };
63
+ /** Emitted after list data is loaded. */
64
+ "list:after-load": {
65
+ apiUrl: string;
66
+ count: number;
67
+ };
68
+ /** Reserved — will be emitted by filter UI on change. */
69
+ "list:filter-changed": {
70
+ apiUrl: string;
71
+ };
72
+ /** Emitted when a dialog is opened via openDialog(). */
73
+ "dialog:opened": {
74
+ dialogId: string;
75
+ };
76
+ /** Emitted when a dialog is closed via closeDialog(). */
77
+ "dialog:closed": {
78
+ dialogId: string;
79
+ };
80
+ /** Emitted when all dialogs are cleared (e.g., on logout). */
81
+ "dialog:all-cleared": void;
82
+ /** Reserved — will be emitted when UI language is switched. */
83
+ "content:language-changed": {
84
+ code: string;
85
+ };
86
+ /** Reserved — will be emitted when translations are loaded. */
87
+ "content:loaded": {
88
+ code: string;
89
+ };
90
+ }
91
+
92
+ /**
93
+ * Typed event bus for framework-wide communication.
94
+ * Handlers that throw are caught and logged — they never block other handlers.
95
+ * @module event-bus
96
+ */
97
+
98
+ type EventHandler<T> = (payload: T) => void | Promise<void>;
99
+ /**
100
+ * Register a handler for an event. Returns an unsubscribe function.
101
+ *
102
+ * @param event - Event name from FrameworkEventMap (e.g. "auth:logout", "form:saved")
103
+ * @param handler - Callback invoked with the event payload; may be sync or async
104
+ * @returns An unsubscribe function that removes this handler.
105
+ */
106
+ declare function on<K extends keyof FrameworkEventMap>(event: K, handler: EventHandler<FrameworkEventMap[K]>): () => void;
107
+ /**
108
+ * Register a one-time handler. Automatically removed after the first call.
109
+ *
110
+ * @param event - Event name from FrameworkEventMap
111
+ * @param handler - Callback invoked once with the event payload, then auto-removed
112
+ * @returns An unsubscribe function that removes this handler before it fires.
113
+ */
114
+ declare function once<K extends keyof FrameworkEventMap>(event: K, handler: EventHandler<FrameworkEventMap[K]>): () => void;
115
+ /**
116
+ * Emit an event synchronously. Handlers are called in registration order.
117
+ * Handler errors are caught and logged but do not stop other handlers.
118
+ *
119
+ * @param event - Event name to emit
120
+ * @param payload - Event payload matching the type defined in FrameworkEventMap (omit for void events)
121
+ */
122
+ declare function emit<K extends keyof FrameworkEventMap>(event: K, ...[payload]: FrameworkEventMap[K] extends void ? [undefined?] : [FrameworkEventMap[K]]): void;
123
+ /**
124
+ * Emit an event and await all handlers (including async ones).
125
+ * Handler errors are caught and logged but do not stop other handlers.
126
+ *
127
+ * @param event - Event name to emit
128
+ * @param payload - Event payload matching the type defined in FrameworkEventMap (omit for void events)
129
+ * @returns Resolves when all handlers have completed.
130
+ */
131
+ declare function emitAsync<K extends keyof FrameworkEventMap>(event: K, ...[payload]: FrameworkEventMap[K] extends void ? [undefined?] : [FrameworkEventMap[K]]): Promise<void>;
132
+ /**
133
+ * Remove all handlers for all events on both listener maps
134
+ * (active instance map and fallback map).
135
+ */
136
+ declare function clear(): void;
137
+ /**
138
+ * Remove all event listeners from both the SpringInstance (if active)
139
+ * and the fallback listener map. Useful for full teardown in tests
140
+ * or when disposing the entire framework.
141
+ */
142
+ declare function clearAll(): void;
143
+ /** Singleton event bus facade — delegates to the current SpringInstance's event listeners */
144
+ declare const eventBus: {
145
+ on: typeof on;
146
+ once: typeof once;
147
+ emit: typeof emit;
148
+ emitAsync: typeof emitAsync;
149
+ clear: typeof clear;
150
+ clearAll: typeof clearAll;
151
+ };
152
+
153
+ export { type FrameworkEventMap, eventBus };