@omerdlw/base-framework 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +121 -52
- package/dist/atoms/index.d.ts +0 -1
- package/dist/atoms/index.d.ts.map +1 -1
- package/dist/atoms/index.js +1 -64
- package/dist/atoms/index.js.map +1 -1
- package/dist/error/index.js +22 -25
- package/dist/error/index.js.map +1 -1
- package/dist/hooks/index.d.ts +2 -9
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +97 -540
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/types.d.ts +3 -45
- package/dist/hooks/types.d.ts.map +1 -1
- package/dist/hooks/use-controllable-state.d.ts +1 -1
- package/dist/hooks/use-controllable-state.d.ts.map +1 -1
- package/dist/hooks/use-global-event.d.ts +0 -2
- package/dist/hooks/use-global-event.d.ts.map +1 -1
- package/dist/hooks/use-hotkey.d.ts +1 -1
- package/dist/hooks/use-hotkey.d.ts.map +1 -1
- package/dist/index.js +11283 -11772
- package/dist/index.js.map +1 -1
- package/dist/kernel/adapters.d.ts.map +1 -1
- package/dist/kernel/index.d.ts +1 -0
- package/dist/kernel/index.d.ts.map +1 -1
- package/dist/kernel/index.js +10 -81
- package/dist/kernel/index.js.map +1 -1
- package/dist/kernel/installed.d.ts.map +1 -1
- package/dist/kernel/page-controller.d.ts.map +1 -1
- package/dist/kernel/provider.d.ts.map +1 -1
- package/dist/modules/ambient/constants.d.ts +1 -1
- package/dist/modules/ambient/constants.d.ts.map +1 -1
- package/dist/modules/ambient/index.js +180 -326
- package/dist/modules/ambient/index.js.map +1 -1
- package/dist/modules/ambient/module.d.ts.map +1 -1
- package/dist/modules/background/constants.d.ts +4 -2
- package/dist/modules/background/constants.d.ts.map +1 -1
- package/dist/modules/background/context.d.ts +3 -0
- package/dist/modules/background/context.d.ts.map +1 -1
- package/dist/modules/background/hooks.d.ts +1 -1
- package/dist/modules/background/index.d.ts +2 -2
- package/dist/modules/background/index.d.ts.map +1 -1
- package/dist/modules/background/index.js +1172 -1270
- package/dist/modules/background/index.js.map +1 -1
- package/dist/modules/background/overlay.d.ts +1 -1
- package/dist/modules/background/overlay.d.ts.map +1 -1
- package/dist/modules/background/types.d.ts +1 -1
- package/dist/modules/background/types.d.ts.map +1 -1
- package/dist/modules/context-menu/constants.d.ts +1 -1
- package/dist/modules/context-menu/constants.d.ts.map +1 -1
- package/dist/modules/context-menu/context.d.ts.map +1 -1
- package/dist/modules/context-menu/hooks.d.ts.map +1 -1
- package/dist/modules/context-menu/index.js +133 -238
- package/dist/modules/context-menu/index.js.map +1 -1
- package/dist/modules/controls/constants.d.ts +1 -1
- package/dist/modules/controls/constants.d.ts.map +1 -1
- package/dist/modules/controls/hooks.d.ts +1 -1
- package/dist/modules/controls/index.js +28 -162
- package/dist/modules/controls/index.js.map +1 -1
- package/dist/modules/controls/types.d.ts +1 -1
- package/dist/modules/controls/types.d.ts.map +1 -1
- package/dist/modules/dock/cards.d.ts +2 -2
- package/dist/modules/dock/constants.d.ts +1 -1
- package/dist/modules/dock/constants.d.ts.map +1 -1
- package/dist/modules/dock/context.d.ts +10 -6
- package/dist/modules/dock/context.d.ts.map +1 -1
- package/dist/modules/dock/hooks.d.ts +5 -5
- package/dist/modules/dock/hooks.d.ts.map +1 -1
- package/dist/modules/dock/index.d.ts +1 -1
- package/dist/modules/dock/index.d.ts.map +1 -1
- package/dist/modules/dock/index.js +2060 -2080
- package/dist/modules/dock/index.js.map +1 -1
- package/dist/modules/dock/runtime/dock.d.ts.map +1 -1
- package/dist/modules/dock/types.d.ts +1 -1
- package/dist/modules/dock/types.d.ts.map +1 -1
- package/dist/modules/index.js +10789 -11027
- package/dist/modules/index.js.map +1 -1
- package/dist/modules/loading/constants.d.ts +4 -2
- package/dist/modules/loading/constants.d.ts.map +1 -1
- package/dist/modules/loading/context.d.ts +3 -0
- package/dist/modules/loading/context.d.ts.map +1 -1
- package/dist/modules/loading/hooks.d.ts +1 -1
- package/dist/modules/loading/hooks.d.ts.map +1 -1
- package/dist/modules/loading/index.d.ts +2 -2
- package/dist/modules/loading/index.d.ts.map +1 -1
- package/dist/modules/loading/index.js +118 -222
- package/dist/modules/loading/index.js.map +1 -1
- package/dist/modules/loading/types.d.ts +1 -1
- package/dist/modules/loading/types.d.ts.map +1 -1
- package/dist/modules/media/constants.d.ts +2 -1
- package/dist/modules/media/constants.d.ts.map +1 -1
- package/dist/modules/media/context.d.ts +3 -0
- package/dist/modules/media/context.d.ts.map +1 -1
- package/dist/modules/media/index.d.ts +2 -2
- package/dist/modules/media/index.d.ts.map +1 -1
- package/dist/modules/media/index.js +61 -218
- package/dist/modules/media/index.js.map +1 -1
- package/dist/modules/modal/constants.d.ts +1 -1
- package/dist/modules/modal/constants.d.ts.map +1 -1
- package/dist/modules/modal/context.d.ts.map +1 -1
- package/dist/modules/modal/hooks.d.ts +2 -2
- package/dist/modules/modal/index.js +20 -366
- package/dist/modules/modal/index.js.map +1 -1
- package/dist/modules/notification/constants.d.ts +4 -2
- package/dist/modules/notification/constants.d.ts.map +1 -1
- package/dist/modules/notification/context.d.ts +4 -0
- package/dist/modules/notification/context.d.ts.map +1 -1
- package/dist/modules/notification/hooks.d.ts +1 -1
- package/dist/modules/notification/index.d.ts +2 -3
- package/dist/modules/notification/index.d.ts.map +1 -1
- package/dist/modules/notification/index.js +70 -154
- package/dist/modules/notification/index.js.map +1 -1
- package/dist/modules/notification/module.d.ts.map +1 -1
- package/dist/provider.js +255 -257
- package/dist/provider.js.map +1 -1
- package/dist/theme.d.ts +1 -0
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +2 -2
- package/dist/theme.js.map +1 -1
- package/dist/utils/index.d.ts +5 -6
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -57
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/number.d.ts +0 -1
- package/dist/utils/number.d.ts.map +1 -1
- package/dist/utils/object.d.ts +0 -2
- package/dist/utils/object.d.ts.map +1 -1
- package/dist/utils/string.d.ts +0 -3
- package/dist/utils/string.d.ts.map +1 -1
- package/dist/utils/timing.d.ts +0 -1
- package/dist/utils/timing.d.ts.map +1 -1
- package/docs/README.md +124 -0
- package/docs/architecture-and-rules.md +129 -0
- package/docs/core-engine.md +196 -0
- package/docs/custom-modules.md +267 -0
- package/docs/getting-started.md +199 -0
- package/docs/modules/README.md +176 -0
- package/docs/modules/ambient.md +150 -0
- package/docs/modules/background.md +195 -0
- package/docs/modules/context-menu.md +248 -0
- package/docs/modules/controls.md +159 -0
- package/docs/modules/dock.md +734 -0
- package/docs/modules/error-boundary.md +160 -0
- package/docs/modules/kernel.md +266 -0
- package/docs/modules/loading.md +157 -0
- package/docs/modules/media.md +196 -0
- package/docs/modules/modal.md +229 -0
- package/docs/modules/notification.md +161 -0
- package/docs/modules/result.md +135 -0
- package/docs/testing.md +160 -0
- package/docs/theming.md +185 -0
- package/package.json +50 -2
- package/templates/AGENTS.md +165 -0
- package/dist/hooks/use-async-action.d.ts +0 -3
- package/dist/hooks/use-async-action.d.ts.map +0 -1
- package/dist/hooks/use-debounce.d.ts +0 -2
- package/dist/hooks/use-debounce.d.ts.map +0 -1
- package/dist/hooks/use-intersection-observer.d.ts +0 -4
- package/dist/hooks/use-intersection-observer.d.ts.map +0 -1
- package/dist/hooks/use-media-query.d.ts +0 -2
- package/dist/hooks/use-media-query.d.ts.map +0 -1
- package/dist/hooks/use-mounted.d.ts +0 -2
- package/dist/hooks/use-mounted.d.ts.map +0 -1
- package/dist/hooks/use-server-action.d.ts +0 -4
- package/dist/hooks/use-server-action.d.ts.map +0 -1
- package/dist/hooks/use-storage-state.d.ts +0 -5
- package/dist/hooks/use-storage-state.d.ts.map +0 -1
- package/dist/modules/theme.d.ts +0 -3
- package/dist/modules/theme.d.ts.map +0 -1
- package/dist/utils/json.d.ts +0 -3
- package/dist/utils/json.d.ts.map +0 -1
package/dist/provider.js
CHANGED
|
@@ -4,8 +4,6 @@ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
|
|
|
4
4
|
import { usePathname } from 'next/navigation';
|
|
5
5
|
import { Icon as Icon$1 } from '@iconify-icon/react';
|
|
6
6
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
7
|
-
import 'clsx';
|
|
8
|
-
import 'tailwind-merge';
|
|
9
7
|
|
|
10
8
|
// src/error/constants.ts
|
|
11
9
|
var ERROR_MESSAGES = Object.freeze({
|
|
@@ -396,6 +394,58 @@ function Button({
|
|
|
396
394
|
);
|
|
397
395
|
}
|
|
398
396
|
Button.displayName = "Button";
|
|
397
|
+
|
|
398
|
+
// src/kernel/constants.ts
|
|
399
|
+
var DEFAULT_SOURCE = "dynamic";
|
|
400
|
+
var REGISTRY_SOURCES = Object.freeze({
|
|
401
|
+
STATIC: "static",
|
|
402
|
+
DYNAMIC: "dynamic",
|
|
403
|
+
USER: "user"
|
|
404
|
+
});
|
|
405
|
+
var REGISTRY_LIFECYCLES = Object.freeze({
|
|
406
|
+
IMMEDIATE: "immediate",
|
|
407
|
+
GRACEFUL: "graceful",
|
|
408
|
+
PERSISTENT: "persistent",
|
|
409
|
+
ROUTE: "route"
|
|
410
|
+
});
|
|
411
|
+
var REGISTRY_VALIDATION_MODES = Object.freeze({
|
|
412
|
+
WARN: "warn",
|
|
413
|
+
STRICT: "strict"
|
|
414
|
+
});
|
|
415
|
+
var REGISTRY_METADATA_KEYS = Object.freeze([
|
|
416
|
+
"cleanup",
|
|
417
|
+
"cleanupDelayMs",
|
|
418
|
+
"instanceId",
|
|
419
|
+
"lifecycle",
|
|
420
|
+
"priority",
|
|
421
|
+
"source",
|
|
422
|
+
"scope",
|
|
423
|
+
"validation"
|
|
424
|
+
]);
|
|
425
|
+
var REGISTRY_SOURCE_PRIORITY = Object.freeze({
|
|
426
|
+
[REGISTRY_SOURCES.STATIC]: 100,
|
|
427
|
+
[REGISTRY_SOURCES.DYNAMIC]: 200,
|
|
428
|
+
[REGISTRY_SOURCES.USER]: 300
|
|
429
|
+
});
|
|
430
|
+
var REGISTRY_SOURCE_RANK = Object.freeze({
|
|
431
|
+
[REGISTRY_SOURCES.STATIC]: 10,
|
|
432
|
+
[REGISTRY_SOURCES.DYNAMIC]: 20,
|
|
433
|
+
[REGISTRY_SOURCES.USER]: 30
|
|
434
|
+
});
|
|
435
|
+
var REGISTRY_LIFECYCLE_VALUES = new Set(
|
|
436
|
+
Object.values(REGISTRY_LIFECYCLES)
|
|
437
|
+
);
|
|
438
|
+
var REGISTRY_METADATA_KEY_SET = new Set(
|
|
439
|
+
REGISTRY_METADATA_KEYS
|
|
440
|
+
);
|
|
441
|
+
var REGISTRY_SCOPE_KINDS = Object.freeze({
|
|
442
|
+
APP: "app",
|
|
443
|
+
SESSION: "session",
|
|
444
|
+
ROUTE: "route",
|
|
445
|
+
INSTANCE: "instance",
|
|
446
|
+
WORKSPACE: "workspace"
|
|
447
|
+
});
|
|
448
|
+
var DEFAULT_REGISTRY_SCOPE = REGISTRY_SCOPE_KINDS.APP;
|
|
399
449
|
function getOrCreateGlobalContext(name, defaultValue) {
|
|
400
450
|
const sym = /* @__PURE__ */ Symbol.for(`@omerdlw/base-framework/context/${name}`);
|
|
401
451
|
const store = globalThis;
|
|
@@ -405,28 +455,6 @@ function getOrCreateGlobalContext(name, defaultValue) {
|
|
|
405
455
|
return store[sym];
|
|
406
456
|
}
|
|
407
457
|
|
|
408
|
-
// src/theme.tsx
|
|
409
|
-
function defineThemeSpec(id) {
|
|
410
|
-
return Object.freeze({ id });
|
|
411
|
-
}
|
|
412
|
-
var EMPTY = /* @__PURE__ */ new Map();
|
|
413
|
-
var ThemeContext = getOrCreateGlobalContext("ThemeContext", EMPTY);
|
|
414
|
-
function useTheme(spec) {
|
|
415
|
-
const config = useContext(ThemeContext).get(spec.id);
|
|
416
|
-
if (!config) {
|
|
417
|
-
throw new Error(
|
|
418
|
-
`Theme "${spec.id}" is missing. Add its theme file to src/config/ and list it in src/config/index.ts.`
|
|
419
|
-
);
|
|
420
|
-
}
|
|
421
|
-
return {
|
|
422
|
-
slots: config.slots,
|
|
423
|
-
styles: config.styles ?? {}
|
|
424
|
-
};
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
// src/error/theme.ts
|
|
428
|
-
var errorTheme = defineThemeSpec("error");
|
|
429
|
-
|
|
430
458
|
// src/utils/string.ts
|
|
431
459
|
function trimToNull(value) {
|
|
432
460
|
if (value === null || value === void 0) return null;
|
|
@@ -583,239 +611,6 @@ function createStore(initialState, { freezeSnapshots = true } = {}) {
|
|
|
583
611
|
}
|
|
584
612
|
});
|
|
585
613
|
}
|
|
586
|
-
var ActionButton = Button;
|
|
587
|
-
function DefaultErrorFallback({
|
|
588
|
-
error,
|
|
589
|
-
message,
|
|
590
|
-
resetError,
|
|
591
|
-
title
|
|
592
|
-
}) {
|
|
593
|
-
const theme = useTheme(errorTheme);
|
|
594
|
-
return /* @__PURE__ */ jsxs("div", { className: theme.slots.screen, children: [
|
|
595
|
-
/* @__PURE__ */ jsx("div", { className: theme.slots.icon, children: /* @__PURE__ */ jsx(Icon, { icon: "solar:danger-circle-bold", size: 30 }) }),
|
|
596
|
-
/* @__PURE__ */ jsx("h3", { className: theme.slots.title, children: message || toUserMessage(error, { fallback: ERROR_MESSAGES.FALLBACK_MSG }) }),
|
|
597
|
-
/* @__PURE__ */ jsx(
|
|
598
|
-
ActionButton,
|
|
599
|
-
{
|
|
600
|
-
className: theme.slots.retryButton,
|
|
601
|
-
onClick: resetError,
|
|
602
|
-
type: "button",
|
|
603
|
-
children: "Try again"
|
|
604
|
-
}
|
|
605
|
-
)
|
|
606
|
-
] });
|
|
607
|
-
}
|
|
608
|
-
var ErrorBoundaryCore = class extends React.Component {
|
|
609
|
-
constructor(props) {
|
|
610
|
-
super(props);
|
|
611
|
-
this.state = {
|
|
612
|
-
error: null,
|
|
613
|
-
errorInfo: null,
|
|
614
|
-
hasError: false,
|
|
615
|
-
lastResetKey: props.resetKey
|
|
616
|
-
};
|
|
617
|
-
}
|
|
618
|
-
static getDerivedStateFromError(error) {
|
|
619
|
-
return { error, hasError: true };
|
|
620
|
-
}
|
|
621
|
-
static getDerivedStateFromProps(props, state) {
|
|
622
|
-
if (props.resetKey !== state.lastResetKey) {
|
|
623
|
-
return {
|
|
624
|
-
error: null,
|
|
625
|
-
errorInfo: null,
|
|
626
|
-
hasError: false,
|
|
627
|
-
lastResetKey: props.resetKey
|
|
628
|
-
};
|
|
629
|
-
}
|
|
630
|
-
return null;
|
|
631
|
-
}
|
|
632
|
-
componentDidCatch(error, errorInfo) {
|
|
633
|
-
this.setState({ errorInfo });
|
|
634
|
-
const { message, name, onError, silent, title, variant } = this.props;
|
|
635
|
-
const context = createErrorContext({ errorInfo, name, title, variant });
|
|
636
|
-
try {
|
|
637
|
-
onError?.(error, errorInfo, context);
|
|
638
|
-
} catch (callbackError) {
|
|
639
|
-
report("ErrorBoundary onError callback", callbackError, "warn");
|
|
640
|
-
}
|
|
641
|
-
if (!silent) {
|
|
642
|
-
globalEvents.emit(EVENT_TYPES.APP_ERROR, {
|
|
643
|
-
error,
|
|
644
|
-
errorInfo,
|
|
645
|
-
message: message || toUserMessage(error),
|
|
646
|
-
resetError: this.resetError
|
|
647
|
-
});
|
|
648
|
-
}
|
|
649
|
-
try {
|
|
650
|
-
const reporter = getErrorReporter();
|
|
651
|
-
reporter?.captureError?.(error, context);
|
|
652
|
-
} catch (reportingError) {
|
|
653
|
-
report("ErrorBoundary reporting", reportingError, "warn");
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
resetError = () => {
|
|
657
|
-
this.setState({
|
|
658
|
-
error: null,
|
|
659
|
-
errorInfo: null,
|
|
660
|
-
hasError: false
|
|
661
|
-
});
|
|
662
|
-
this.props.onReset?.();
|
|
663
|
-
};
|
|
664
|
-
render() {
|
|
665
|
-
if (!this.state.hasError) return this.props.children;
|
|
666
|
-
const { fallback, message, title } = this.props;
|
|
667
|
-
const { error } = this.state;
|
|
668
|
-
if (typeof fallback === "function") {
|
|
669
|
-
return fallback({ error, resetError: this.resetError });
|
|
670
|
-
}
|
|
671
|
-
if (fallback) {
|
|
672
|
-
return fallback;
|
|
673
|
-
}
|
|
674
|
-
return /* @__PURE__ */ jsx(
|
|
675
|
-
DefaultErrorFallback,
|
|
676
|
-
{
|
|
677
|
-
error,
|
|
678
|
-
message,
|
|
679
|
-
resetError: this.resetError,
|
|
680
|
-
title
|
|
681
|
-
}
|
|
682
|
-
);
|
|
683
|
-
}
|
|
684
|
-
};
|
|
685
|
-
function GlobalError({ children, fallback, onReset }) {
|
|
686
|
-
const pathname = usePathname();
|
|
687
|
-
return /* @__PURE__ */ jsx(
|
|
688
|
-
ErrorBoundaryCore,
|
|
689
|
-
{
|
|
690
|
-
fallback,
|
|
691
|
-
message: ERROR_MESSAGES.GLOBAL_MSG,
|
|
692
|
-
onReset,
|
|
693
|
-
resetKey: pathname,
|
|
694
|
-
title: ERROR_MESSAGES.GLOBAL_TITLE,
|
|
695
|
-
variant: "full",
|
|
696
|
-
children
|
|
697
|
-
}
|
|
698
|
-
);
|
|
699
|
-
}
|
|
700
|
-
function ModuleError({
|
|
701
|
-
children,
|
|
702
|
-
fallback,
|
|
703
|
-
name,
|
|
704
|
-
onReset
|
|
705
|
-
}) {
|
|
706
|
-
return /* @__PURE__ */ jsx(
|
|
707
|
-
ErrorBoundaryCore,
|
|
708
|
-
{
|
|
709
|
-
fallback,
|
|
710
|
-
message: ERROR_MESSAGES.MODULE_MSG,
|
|
711
|
-
name,
|
|
712
|
-
onReset,
|
|
713
|
-
title: name ? `${name} Error` : ERROR_MESSAGES.MODULE_TITLE,
|
|
714
|
-
variant: "module",
|
|
715
|
-
children
|
|
716
|
-
}
|
|
717
|
-
);
|
|
718
|
-
}
|
|
719
|
-
function GlobalErrorListener() {
|
|
720
|
-
const lastError = useRef(0);
|
|
721
|
-
const count = useRef(0);
|
|
722
|
-
const shown = useRef(/* @__PURE__ */ new Set());
|
|
723
|
-
const handleError = useCallback((error, source = "runtime") => {
|
|
724
|
-
if (shouldIgnoreError(error)) return;
|
|
725
|
-
const now = Date.now();
|
|
726
|
-
if (count.current >= ERROR_LISTENER_CONFIG.maxErrors) return;
|
|
727
|
-
if (now - lastError.current < ERROR_LISTENER_CONFIG.throttle) return;
|
|
728
|
-
const message = getErrorMessage(error);
|
|
729
|
-
const key = message || String(error);
|
|
730
|
-
if (shown.current.has(key)) return;
|
|
731
|
-
shown.current.add(key);
|
|
732
|
-
lastError.current = now;
|
|
733
|
-
count.current += 1;
|
|
734
|
-
try {
|
|
735
|
-
const reporter = getErrorReporter();
|
|
736
|
-
reporter?.captureError?.(error, {
|
|
737
|
-
globalListener: true,
|
|
738
|
-
source
|
|
739
|
-
});
|
|
740
|
-
} catch (reportingError) {
|
|
741
|
-
report("GlobalError reporting", reportingError, "warn");
|
|
742
|
-
}
|
|
743
|
-
globalEvents.emit(EVENT_TYPES.APP_ERROR, {
|
|
744
|
-
error,
|
|
745
|
-
message: toUserMessage(error)
|
|
746
|
-
});
|
|
747
|
-
}, []);
|
|
748
|
-
useEffect(() => {
|
|
749
|
-
const removeSink = setReportSink((scope, error, level) => {
|
|
750
|
-
try {
|
|
751
|
-
getErrorReporter().captureError(error, { level, scope });
|
|
752
|
-
} catch {
|
|
753
|
-
}
|
|
754
|
-
});
|
|
755
|
-
const onError = (event) => handleError(event.error || event.message, "window.onerror");
|
|
756
|
-
const onRejection = (event) => handleError(event.reason, "unhandledrejection");
|
|
757
|
-
window.addEventListener("error", onError);
|
|
758
|
-
window.addEventListener("unhandledrejection", onRejection);
|
|
759
|
-
return () => {
|
|
760
|
-
removeSink();
|
|
761
|
-
window.removeEventListener("error", onError);
|
|
762
|
-
window.removeEventListener("unhandledrejection", onRejection);
|
|
763
|
-
};
|
|
764
|
-
}, [handleError]);
|
|
765
|
-
return null;
|
|
766
|
-
}
|
|
767
|
-
|
|
768
|
-
// src/kernel/constants.ts
|
|
769
|
-
var DEFAULT_SOURCE = "dynamic";
|
|
770
|
-
var REGISTRY_SOURCES = Object.freeze({
|
|
771
|
-
STATIC: "static",
|
|
772
|
-
DYNAMIC: "dynamic",
|
|
773
|
-
USER: "user"
|
|
774
|
-
});
|
|
775
|
-
var REGISTRY_LIFECYCLES = Object.freeze({
|
|
776
|
-
IMMEDIATE: "immediate",
|
|
777
|
-
GRACEFUL: "graceful",
|
|
778
|
-
PERSISTENT: "persistent",
|
|
779
|
-
ROUTE: "route"
|
|
780
|
-
});
|
|
781
|
-
var REGISTRY_VALIDATION_MODES = Object.freeze({
|
|
782
|
-
WARN: "warn",
|
|
783
|
-
STRICT: "strict"
|
|
784
|
-
});
|
|
785
|
-
var REGISTRY_METADATA_KEYS = Object.freeze([
|
|
786
|
-
"cleanup",
|
|
787
|
-
"cleanupDelayMs",
|
|
788
|
-
"instanceId",
|
|
789
|
-
"lifecycle",
|
|
790
|
-
"priority",
|
|
791
|
-
"source",
|
|
792
|
-
"scope",
|
|
793
|
-
"validation"
|
|
794
|
-
]);
|
|
795
|
-
var REGISTRY_SOURCE_PRIORITY = Object.freeze({
|
|
796
|
-
[REGISTRY_SOURCES.STATIC]: 100,
|
|
797
|
-
[REGISTRY_SOURCES.DYNAMIC]: 200,
|
|
798
|
-
[REGISTRY_SOURCES.USER]: 300
|
|
799
|
-
});
|
|
800
|
-
var REGISTRY_SOURCE_RANK = Object.freeze({
|
|
801
|
-
[REGISTRY_SOURCES.STATIC]: 10,
|
|
802
|
-
[REGISTRY_SOURCES.DYNAMIC]: 20,
|
|
803
|
-
[REGISTRY_SOURCES.USER]: 30
|
|
804
|
-
});
|
|
805
|
-
var REGISTRY_LIFECYCLE_VALUES = new Set(
|
|
806
|
-
Object.values(REGISTRY_LIFECYCLES)
|
|
807
|
-
);
|
|
808
|
-
var REGISTRY_METADATA_KEY_SET = new Set(
|
|
809
|
-
REGISTRY_METADATA_KEYS
|
|
810
|
-
);
|
|
811
|
-
var REGISTRY_SCOPE_KINDS = Object.freeze({
|
|
812
|
-
APP: "app",
|
|
813
|
-
SESSION: "session",
|
|
814
|
-
ROUTE: "route",
|
|
815
|
-
INSTANCE: "instance",
|
|
816
|
-
WORKSPACE: "workspace"
|
|
817
|
-
});
|
|
818
|
-
var DEFAULT_REGISTRY_SCOPE = REGISTRY_SCOPE_KINDS.APP;
|
|
819
614
|
|
|
820
615
|
// src/kernel/utils.ts
|
|
821
616
|
function hasOwnProperty(target, key) {
|
|
@@ -1933,6 +1728,209 @@ function Compose({ providers, children }) {
|
|
|
1933
1728
|
createElement(Fragment$1, null, children)
|
|
1934
1729
|
);
|
|
1935
1730
|
}
|
|
1731
|
+
|
|
1732
|
+
// src/theme.tsx
|
|
1733
|
+
function defineThemeSpec(id) {
|
|
1734
|
+
return Object.freeze({ id });
|
|
1735
|
+
}
|
|
1736
|
+
var EMPTY = /* @__PURE__ */ new Map();
|
|
1737
|
+
var ThemeContext = getOrCreateGlobalContext("ThemeContext", EMPTY);
|
|
1738
|
+
function useTheme(spec) {
|
|
1739
|
+
const config = useContext(ThemeContext).get(spec.id);
|
|
1740
|
+
if (!config) {
|
|
1741
|
+
throw new Error(
|
|
1742
|
+
`Theme "${spec.id}" is missing. Ensure its theme configuration is provided to <ThemeProvider themes={[...]}> (e.g. in src/config/ or your theme setup).`
|
|
1743
|
+
);
|
|
1744
|
+
}
|
|
1745
|
+
return {
|
|
1746
|
+
slots: config.slots,
|
|
1747
|
+
styles: config.styles ?? {}
|
|
1748
|
+
};
|
|
1749
|
+
}
|
|
1750
|
+
|
|
1751
|
+
// src/error/theme.ts
|
|
1752
|
+
var errorTheme = defineThemeSpec("error");
|
|
1753
|
+
var ActionButton = Button;
|
|
1754
|
+
function DefaultErrorFallback({
|
|
1755
|
+
error,
|
|
1756
|
+
message,
|
|
1757
|
+
resetError,
|
|
1758
|
+
title
|
|
1759
|
+
}) {
|
|
1760
|
+
const theme = useTheme(errorTheme);
|
|
1761
|
+
return /* @__PURE__ */ jsxs("div", { className: theme.slots.screen, children: [
|
|
1762
|
+
/* @__PURE__ */ jsx("div", { className: theme.slots.icon, children: /* @__PURE__ */ jsx(Icon, { icon: "solar:danger-circle-bold", size: 30 }) }),
|
|
1763
|
+
/* @__PURE__ */ jsx("h3", { className: theme.slots.title, children: message || toUserMessage(error, { fallback: ERROR_MESSAGES.FALLBACK_MSG }) }),
|
|
1764
|
+
/* @__PURE__ */ jsx(
|
|
1765
|
+
ActionButton,
|
|
1766
|
+
{
|
|
1767
|
+
className: theme.slots.retryButton,
|
|
1768
|
+
onClick: resetError,
|
|
1769
|
+
type: "button",
|
|
1770
|
+
children: "Try again"
|
|
1771
|
+
}
|
|
1772
|
+
)
|
|
1773
|
+
] });
|
|
1774
|
+
}
|
|
1775
|
+
var ErrorBoundaryCore = class extends React.Component {
|
|
1776
|
+
constructor(props) {
|
|
1777
|
+
super(props);
|
|
1778
|
+
this.state = {
|
|
1779
|
+
error: null,
|
|
1780
|
+
errorInfo: null,
|
|
1781
|
+
hasError: false,
|
|
1782
|
+
lastResetKey: props.resetKey
|
|
1783
|
+
};
|
|
1784
|
+
}
|
|
1785
|
+
static getDerivedStateFromError(error) {
|
|
1786
|
+
return { error, hasError: true };
|
|
1787
|
+
}
|
|
1788
|
+
static getDerivedStateFromProps(props, state) {
|
|
1789
|
+
if (props.resetKey !== state.lastResetKey) {
|
|
1790
|
+
return {
|
|
1791
|
+
error: null,
|
|
1792
|
+
errorInfo: null,
|
|
1793
|
+
hasError: false,
|
|
1794
|
+
lastResetKey: props.resetKey
|
|
1795
|
+
};
|
|
1796
|
+
}
|
|
1797
|
+
return null;
|
|
1798
|
+
}
|
|
1799
|
+
componentDidCatch(error, errorInfo) {
|
|
1800
|
+
this.setState({ errorInfo });
|
|
1801
|
+
const { message, name, onError, silent, title, variant } = this.props;
|
|
1802
|
+
const context = createErrorContext({ errorInfo, name, title, variant });
|
|
1803
|
+
try {
|
|
1804
|
+
onError?.(error, errorInfo, context);
|
|
1805
|
+
} catch (callbackError) {
|
|
1806
|
+
report("ErrorBoundary onError callback", callbackError, "warn");
|
|
1807
|
+
}
|
|
1808
|
+
if (!silent) {
|
|
1809
|
+
globalEvents.emit(EVENT_TYPES.APP_ERROR, {
|
|
1810
|
+
error,
|
|
1811
|
+
errorInfo,
|
|
1812
|
+
message: message || toUserMessage(error),
|
|
1813
|
+
resetError: this.resetError
|
|
1814
|
+
});
|
|
1815
|
+
}
|
|
1816
|
+
try {
|
|
1817
|
+
const reporter = getErrorReporter();
|
|
1818
|
+
reporter?.captureError?.(error, context);
|
|
1819
|
+
} catch (reportingError) {
|
|
1820
|
+
report("ErrorBoundary reporting", reportingError, "warn");
|
|
1821
|
+
}
|
|
1822
|
+
}
|
|
1823
|
+
resetError = () => {
|
|
1824
|
+
this.setState({
|
|
1825
|
+
error: null,
|
|
1826
|
+
errorInfo: null,
|
|
1827
|
+
hasError: false
|
|
1828
|
+
});
|
|
1829
|
+
this.props.onReset?.();
|
|
1830
|
+
};
|
|
1831
|
+
render() {
|
|
1832
|
+
if (!this.state.hasError) return this.props.children;
|
|
1833
|
+
const { fallback, message, title } = this.props;
|
|
1834
|
+
const { error } = this.state;
|
|
1835
|
+
if (typeof fallback === "function") {
|
|
1836
|
+
return fallback({ error, resetError: this.resetError });
|
|
1837
|
+
}
|
|
1838
|
+
if (fallback) {
|
|
1839
|
+
return fallback;
|
|
1840
|
+
}
|
|
1841
|
+
return /* @__PURE__ */ jsx(
|
|
1842
|
+
DefaultErrorFallback,
|
|
1843
|
+
{
|
|
1844
|
+
error,
|
|
1845
|
+
message,
|
|
1846
|
+
resetError: this.resetError,
|
|
1847
|
+
title
|
|
1848
|
+
}
|
|
1849
|
+
);
|
|
1850
|
+
}
|
|
1851
|
+
};
|
|
1852
|
+
function GlobalError({ children, fallback, onReset }) {
|
|
1853
|
+
const pathname = usePathname();
|
|
1854
|
+
return /* @__PURE__ */ jsx(
|
|
1855
|
+
ErrorBoundaryCore,
|
|
1856
|
+
{
|
|
1857
|
+
fallback,
|
|
1858
|
+
message: ERROR_MESSAGES.GLOBAL_MSG,
|
|
1859
|
+
onReset,
|
|
1860
|
+
resetKey: pathname,
|
|
1861
|
+
title: ERROR_MESSAGES.GLOBAL_TITLE,
|
|
1862
|
+
variant: "full",
|
|
1863
|
+
children
|
|
1864
|
+
}
|
|
1865
|
+
);
|
|
1866
|
+
}
|
|
1867
|
+
function ModuleError({
|
|
1868
|
+
children,
|
|
1869
|
+
fallback,
|
|
1870
|
+
name,
|
|
1871
|
+
onReset
|
|
1872
|
+
}) {
|
|
1873
|
+
return /* @__PURE__ */ jsx(
|
|
1874
|
+
ErrorBoundaryCore,
|
|
1875
|
+
{
|
|
1876
|
+
fallback,
|
|
1877
|
+
message: ERROR_MESSAGES.MODULE_MSG,
|
|
1878
|
+
name,
|
|
1879
|
+
onReset,
|
|
1880
|
+
title: name ? `${name} Error` : ERROR_MESSAGES.MODULE_TITLE,
|
|
1881
|
+
variant: "module",
|
|
1882
|
+
children
|
|
1883
|
+
}
|
|
1884
|
+
);
|
|
1885
|
+
}
|
|
1886
|
+
function GlobalErrorListener() {
|
|
1887
|
+
const lastError = useRef(0);
|
|
1888
|
+
const count = useRef(0);
|
|
1889
|
+
const shown = useRef(/* @__PURE__ */ new Set());
|
|
1890
|
+
const handleError = useCallback((error, source = "runtime") => {
|
|
1891
|
+
if (shouldIgnoreError(error)) return;
|
|
1892
|
+
const now = Date.now();
|
|
1893
|
+
if (count.current >= ERROR_LISTENER_CONFIG.maxErrors) return;
|
|
1894
|
+
if (now - lastError.current < ERROR_LISTENER_CONFIG.throttle) return;
|
|
1895
|
+
const message = getErrorMessage(error);
|
|
1896
|
+
const key = message || String(error);
|
|
1897
|
+
if (shown.current.has(key)) return;
|
|
1898
|
+
shown.current.add(key);
|
|
1899
|
+
lastError.current = now;
|
|
1900
|
+
count.current += 1;
|
|
1901
|
+
try {
|
|
1902
|
+
const reporter = getErrorReporter();
|
|
1903
|
+
reporter?.captureError?.(error, {
|
|
1904
|
+
globalListener: true,
|
|
1905
|
+
source
|
|
1906
|
+
});
|
|
1907
|
+
} catch (reportingError) {
|
|
1908
|
+
report("GlobalError reporting", reportingError, "warn");
|
|
1909
|
+
}
|
|
1910
|
+
globalEvents.emit(EVENT_TYPES.APP_ERROR, {
|
|
1911
|
+
error,
|
|
1912
|
+
message: toUserMessage(error)
|
|
1913
|
+
});
|
|
1914
|
+
}, []);
|
|
1915
|
+
useEffect(() => {
|
|
1916
|
+
const removeSink = setReportSink((scope, error, level) => {
|
|
1917
|
+
try {
|
|
1918
|
+
getErrorReporter().captureError(error, { level, scope });
|
|
1919
|
+
} catch {
|
|
1920
|
+
}
|
|
1921
|
+
});
|
|
1922
|
+
const onError = (event) => handleError(event.error || event.message, "window.onerror");
|
|
1923
|
+
const onRejection = (event) => handleError(event.reason, "unhandledrejection");
|
|
1924
|
+
window.addEventListener("error", onError);
|
|
1925
|
+
window.addEventListener("unhandledrejection", onRejection);
|
|
1926
|
+
return () => {
|
|
1927
|
+
removeSink();
|
|
1928
|
+
window.removeEventListener("error", onError);
|
|
1929
|
+
window.removeEventListener("unhandledrejection", onRejection);
|
|
1930
|
+
};
|
|
1931
|
+
}, [handleError]);
|
|
1932
|
+
return null;
|
|
1933
|
+
}
|
|
1936
1934
|
function CoreProvider({
|
|
1937
1935
|
children,
|
|
1938
1936
|
modules,
|