@gostack-framework/react 0.0.0-stage → 0.1.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 (138) hide show
  1. package/dist/api.d.ts +83 -0
  2. package/dist/api.js +170 -0
  3. package/dist/api.js.map +1 -0
  4. package/dist/auth.d.ts +60 -0
  5. package/dist/auth.js +136 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/data.d.ts +25 -0
  8. package/dist/data.js +73 -0
  9. package/dist/data.js.map +1 -0
  10. package/dist/examples.d.ts +6 -0
  11. package/dist/examples.js +47 -0
  12. package/dist/examples.js.map +1 -0
  13. package/dist/hooks.d.ts +58 -0
  14. package/dist/hooks.js +109 -0
  15. package/dist/hooks.js.map +1 -0
  16. package/dist/index.d.ts +20 -0
  17. package/dist/index.js +21 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/layouts.d.ts +6 -0
  20. package/dist/layouts.js +34 -0
  21. package/dist/layouts.js.map +1 -0
  22. package/dist/line-flow/bus.d.ts +13 -0
  23. package/dist/line-flow/bus.js +52 -0
  24. package/dist/line-flow/bus.js.map +1 -0
  25. package/dist/line-flow/derived-line.d.ts +21 -0
  26. package/dist/line-flow/derived-line.js +122 -0
  27. package/dist/line-flow/derived-line.js.map +1 -0
  28. package/dist/line-flow/errors.d.ts +62 -0
  29. package/dist/line-flow/errors.js +91 -0
  30. package/dist/line-flow/errors.js.map +1 -0
  31. package/dist/line-flow/event-line.d.ts +16 -0
  32. package/dist/line-flow/event-line.js +81 -0
  33. package/dist/line-flow/event-line.js.map +1 -0
  34. package/dist/line-flow/index.d.ts +11 -0
  35. package/dist/line-flow/index.js +11 -0
  36. package/dist/line-flow/index.js.map +1 -0
  37. package/dist/line-flow/interchange.d.ts +17 -0
  38. package/dist/line-flow/interchange.js +86 -0
  39. package/dist/line-flow/interchange.js.map +1 -0
  40. package/dist/line-flow/lineflow.d.ts +12 -0
  41. package/dist/line-flow/lineflow.js +15 -0
  42. package/dist/line-flow/lineflow.js.map +1 -0
  43. package/dist/line-flow/network.d.ts +28 -0
  44. package/dist/line-flow/network.js +165 -0
  45. package/dist/line-flow/network.js.map +1 -0
  46. package/dist/line-flow/react/bridge.d.ts +23 -0
  47. package/dist/line-flow/react/bridge.js +40 -0
  48. package/dist/line-flow/react/bridge.js.map +1 -0
  49. package/dist/line-flow/react/hooks.d.ts +29 -0
  50. package/dist/line-flow/react/hooks.js +117 -0
  51. package/dist/line-flow/react/hooks.js.map +1 -0
  52. package/dist/line-flow/react/index.d.ts +3 -0
  53. package/dist/line-flow/react/index.js +4 -0
  54. package/dist/line-flow/react/index.js.map +1 -0
  55. package/dist/line-flow/react/provider.d.ts +15 -0
  56. package/dist/line-flow/react/provider.js +25 -0
  57. package/dist/line-flow/react/provider.js.map +1 -0
  58. package/dist/line-flow/scope.d.ts +21 -0
  59. package/dist/line-flow/scope.js +157 -0
  60. package/dist/line-flow/scope.js.map +1 -0
  61. package/dist/line-flow/state-line.d.ts +21 -0
  62. package/dist/line-flow/state-line.js +106 -0
  63. package/dist/line-flow/state-line.js.map +1 -0
  64. package/dist/line-flow/taxi.d.ts +15 -0
  65. package/dist/line-flow/taxi.js +81 -0
  66. package/dist/line-flow/taxi.js.map +1 -0
  67. package/dist/line-flow/types.d.ts +222 -0
  68. package/dist/line-flow/types.js +2 -0
  69. package/dist/line-flow/types.js.map +1 -0
  70. package/dist/line-flow/utils.d.ts +24 -0
  71. package/dist/line-flow/utils.js +53 -0
  72. package/dist/line-flow/utils.js.map +1 -0
  73. package/dist/paramsSerializer.d.ts +87 -0
  74. package/dist/paramsSerializer.js +138 -0
  75. package/dist/paramsSerializer.js.map +1 -0
  76. package/dist/registry.d.ts +10 -0
  77. package/dist/registry.js +115 -0
  78. package/dist/registry.js.map +1 -0
  79. package/dist/runtime.d.ts +80 -0
  80. package/dist/runtime.js +442 -0
  81. package/dist/runtime.js.map +1 -0
  82. package/dist/schemas.d.ts +88 -0
  83. package/dist/schemas.js +146 -0
  84. package/dist/schemas.js.map +1 -0
  85. package/dist/services.d.ts +35 -0
  86. package/dist/services.js +65 -0
  87. package/dist/services.js.map +1 -0
  88. package/dist/shared-types/file.types.d.ts +12 -0
  89. package/dist/shared-types/file.types.js +2 -0
  90. package/dist/shared-types/file.types.js.map +1 -0
  91. package/dist/shared-types/gallery.types.d.ts +22 -0
  92. package/dist/shared-types/gallery.types.js +2 -0
  93. package/dist/shared-types/gallery.types.js.map +1 -0
  94. package/dist/shared-types/governorates.types.d.ts +12 -0
  95. package/dist/shared-types/governorates.types.js +2 -0
  96. package/dist/shared-types/governorates.types.js.map +1 -0
  97. package/dist/shared-types/grade.types.d.ts +7 -0
  98. package/dist/shared-types/grade.types.js +2 -0
  99. package/dist/shared-types/grade.types.js.map +1 -0
  100. package/dist/shared-types/index.d.ts +13 -0
  101. package/dist/shared-types/index.js +14 -0
  102. package/dist/shared-types/index.js.map +1 -0
  103. package/dist/shared-types/metadata.types.d.ts +61 -0
  104. package/dist/shared-types/metadata.types.js +3 -0
  105. package/dist/shared-types/metadata.types.js.map +1 -0
  106. package/dist/shared-types/table.types.d.ts +33 -0
  107. package/dist/shared-types/table.types.js +2 -0
  108. package/dist/shared-types/table.types.js.map +1 -0
  109. package/dist/shared-types/viewCard.types.d.ts +78 -0
  110. package/dist/shared-types/viewCard.types.js +3 -0
  111. package/dist/shared-types/viewCard.types.js.map +1 -0
  112. package/dist/styles.css +347 -0
  113. package/dist/types.d.ts +126 -0
  114. package/dist/types.js +19 -0
  115. package/dist/types.js.map +1 -0
  116. package/dist/utils/conditionCompiler.d.ts +11 -0
  117. package/dist/utils/conditionCompiler.js +18 -0
  118. package/dist/utils/conditionCompiler.js.map +1 -0
  119. package/dist/utils/fileUtils.d.ts +50 -0
  120. package/dist/utils/fileUtils.js +266 -0
  121. package/dist/utils/fileUtils.js.map +1 -0
  122. package/dist/utils/metadataUtils.d.ts +35 -0
  123. package/dist/utils/metadataUtils.js +176 -0
  124. package/dist/utils/metadataUtils.js.map +1 -0
  125. package/dist/utils/normalizeTime.d.ts +1 -0
  126. package/dist/utils/normalizeTime.js +25 -0
  127. package/dist/utils/normalizeTime.js.map +1 -0
  128. package/dist/utils/tableUtils.d.ts +9 -0
  129. package/dist/utils/tableUtils.js +92 -0
  130. package/dist/utils/tableUtils.js.map +1 -0
  131. package/dist/utils/toFormData.d.ts +152 -0
  132. package/dist/utils/toFormData.js +250 -0
  133. package/dist/utils/toFormData.js.map +1 -0
  134. package/dist/utils/wizard.utils.d.ts +420 -0
  135. package/dist/utils/wizard.utils.js +596 -0
  136. package/dist/utils/wizard.utils.js.map +1 -0
  137. package/package.json +49 -3
  138. package/README.md +0 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../../src/line-flow/react/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAqB,MAAM,OAAO,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,yBAAyB,GAC7B,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;AAO9D;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAkB,EAClB,KAAQ,EACR,OAAkC;IAElC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,UAAU,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;QACtF,MAAM,IAAI,uBAAuB,CAAC,wDAAwD,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,aAAa,CAAC;IAChD,MAAM,QAAQ,GAAG,OAAO,IAAI,gBAAgB,IAAI,OAAO,CAAC;IACxD,MAAM,UAAU,GAAG,OAAO,EAAE,cAAc,CAAC;IAE3C,yBAAyB,CAAC,GAAG,EAAE;QAC7B,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAE1B,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACjC,IAAI,CAAC,GAAG,CAAC,UAAe,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AACnC,CAAC;AAOD;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAI,EAChC,IAAI,EACJ,KAAK,EACL,MAAM,EACN,cAAc,GACS;IACvB,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;IAC3D,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { EqualityFn, EventLine, Listener, ReadableLine, StateLine } from "../types.js";
2
+ /**
3
+ * Subscribes to a LineFlow readable line (StateLine or DerivedLine) and returns its current snapshot.
4
+ * Synchronizes with React's concurrent renderer using useSyncExternalStore.
5
+ */
6
+ export declare function useLineFlowValue<T>(line: ReadableLine<T>): T;
7
+ /**
8
+ * Subscribes to a slice of state from a readable line using a selector function.
9
+ * Prevents unnecessary re-renders when the selected value is unchanged according to the equality function.
10
+ *
11
+ * Implements the canonical closure-based memoization pattern to guarantee stability across
12
+ * concurrent renders, StrictMode checks, and inline selector re-creations without render-phase ref mutations.
13
+ */
14
+ export declare function useLineFlowSelector<T, S>(line: ReadableLine<T>, selector: (state: T) => S, equals?: EqualityFn<S>): S;
15
+ /**
16
+ * Returns stable updater functions { set, update } for a StateLine.
17
+ * Unlike useLineFlowValue, using this hook does NOT subscribe the component to state changes,
18
+ * preventing re-renders when the line value updates.
19
+ */
20
+ export declare function useLineFlowSet<T>(line: StateLine<T>): {
21
+ set: (value: T) => void;
22
+ update: (updater: (prev: T) => T) => void;
23
+ };
24
+ /**
25
+ * Subscribes to events published on an EventLine.
26
+ * Automatically cleans up the subscription on unmount or when the line changes.
27
+ * Preserves fresh listener callback identity without causing resubscription.
28
+ */
29
+ export declare function useLineFlowEvent<T>(line: EventLine<T>, listener: Listener<T>): void;
@@ -0,0 +1,117 @@
1
+ import { useCallback, useEffect, useMemo, useRef, useSyncExternalStore } from "react";
2
+ import { LineFlowValidationError } from "../errors.js";
3
+ import { defaultEquals, validateListener } from "../utils.js";
4
+ /**
5
+ * Subscribes to a LineFlow readable line (StateLine or DerivedLine) and returns its current snapshot.
6
+ * Synchronizes with React's concurrent renderer using useSyncExternalStore.
7
+ */
8
+ export function useLineFlowValue(line) {
9
+ if (!line || typeof line.getSnapshot !== "function" || typeof line.subscribe !== "function") {
10
+ throw new LineFlowValidationError("useLineFlowValue requires a valid readable line.");
11
+ }
12
+ const subscribe = useCallback((onStoreChange) => line.subscribe(onStoreChange), [line]);
13
+ const getSnapshot = useCallback(() => line.getSnapshot(), [line]);
14
+ return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
15
+ }
16
+ /**
17
+ * Subscribes to a slice of state from a readable line using a selector function.
18
+ * Prevents unnecessary re-renders when the selected value is unchanged according to the equality function.
19
+ *
20
+ * Implements the canonical closure-based memoization pattern to guarantee stability across
21
+ * concurrent renders, StrictMode checks, and inline selector re-creations without render-phase ref mutations.
22
+ */
23
+ export function useLineFlowSelector(line, selector, equals = defaultEquals) {
24
+ if (!line || typeof line.getSnapshot !== "function" || typeof line.subscribe !== "function") {
25
+ throw new LineFlowValidationError("useLineFlowSelector requires a valid readable line.");
26
+ }
27
+ if (typeof selector !== "function") {
28
+ throw new LineFlowValidationError("useLineFlowSelector requires a selector function.");
29
+ }
30
+ const instRef = useRef(null);
31
+ let inst;
32
+ if (instRef.current === null) {
33
+ inst = {
34
+ hasValue: false,
35
+ value: null,
36
+ };
37
+ instRef.current = inst;
38
+ }
39
+ else {
40
+ inst = instRef.current;
41
+ }
42
+ const [getSelection, getServerSelection] = useMemo(() => {
43
+ let hasMemo = false;
44
+ let memoizedSnapshot;
45
+ let memoizedSelection;
46
+ const memoizedSelector = (nextSnapshot) => {
47
+ if (!hasMemo) {
48
+ hasMemo = true;
49
+ memoizedSnapshot = nextSnapshot;
50
+ const nextSelection = selector(nextSnapshot);
51
+ if (equals !== undefined && inst.hasValue) {
52
+ const currentSelection = inst.value;
53
+ if (equals(currentSelection, nextSelection)) {
54
+ memoizedSelection = currentSelection;
55
+ return currentSelection;
56
+ }
57
+ }
58
+ memoizedSelection = nextSelection;
59
+ return nextSelection;
60
+ }
61
+ const prevSnapshot = memoizedSnapshot;
62
+ const prevSelection = memoizedSelection;
63
+ if (Object.is(prevSnapshot, nextSnapshot)) {
64
+ return prevSelection;
65
+ }
66
+ const nextSelection = selector(nextSnapshot);
67
+ if (equals !== undefined && equals(prevSelection, nextSelection)) {
68
+ memoizedSnapshot = nextSnapshot;
69
+ return prevSelection;
70
+ }
71
+ memoizedSnapshot = nextSnapshot;
72
+ memoizedSelection = nextSelection;
73
+ return nextSelection;
74
+ };
75
+ const getSnapshotWithSelector = () => memoizedSelector(line.getSnapshot());
76
+ return [getSnapshotWithSelector, getSnapshotWithSelector];
77
+ }, [line, selector, equals]);
78
+ const subscribe = useCallback((onStoreChange) => line.subscribe(onStoreChange), [line]);
79
+ const value = useSyncExternalStore(subscribe, getSelection, getServerSelection);
80
+ useEffect(() => {
81
+ inst.hasValue = true;
82
+ inst.value = value;
83
+ }, [value]);
84
+ return value;
85
+ }
86
+ /**
87
+ * Returns stable updater functions { set, update } for a StateLine.
88
+ * Unlike useLineFlowValue, using this hook does NOT subscribe the component to state changes,
89
+ * preventing re-renders when the line value updates.
90
+ */
91
+ export function useLineFlowSet(line) {
92
+ if (!line || typeof line.set !== "function") {
93
+ throw new LineFlowValidationError("useLineFlowSet requires a valid StateLine.");
94
+ }
95
+ const set = useCallback((value) => line.set(value), [line]);
96
+ const update = useCallback((updater) => line.update(updater), [line]);
97
+ return useMemo(() => ({ set, update }), [set, update]);
98
+ }
99
+ /**
100
+ * Subscribes to events published on an EventLine.
101
+ * Automatically cleans up the subscription on unmount or when the line changes.
102
+ * Preserves fresh listener callback identity without causing resubscription.
103
+ */
104
+ export function useLineFlowEvent(line, listener) {
105
+ if (!line || typeof line.subscribe !== "function") {
106
+ throw new LineFlowValidationError("useLineFlowEvent requires a valid EventLine.");
107
+ }
108
+ validateListener(listener);
109
+ const listenerRef = useRef(listener);
110
+ listenerRef.current = listener;
111
+ useEffect(() => {
112
+ return line.subscribe((event) => {
113
+ listenerRef.current(event);
114
+ });
115
+ }, [line]);
116
+ }
117
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/line-flow/react/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { LineFlowProvider, LineFlowProvider as LineflowProvider, useLineFlowNetwork, useLineFlowNetwork as useLineflowNetwork, type LineFlowProviderProps, type LineFlowProviderProps as LineflowProviderProps, } from "./provider.js";
2
+ export { useLineFlowValue, useLineFlowValue as useLineflowValue, useLineFlowSelector, useLineFlowSelector as useLineflowSelector, useLineFlowSet, useLineFlowSet as useLineflowSet, useLineFlowEvent, useLineFlowEvent as useLineflowEvent, } from "./hooks.js";
3
+ export { useProviderBridge, ProviderBridge, type ProviderBridgeOptions, type ProviderBridgeProps, } from "./bridge.js";
@@ -0,0 +1,4 @@
1
+ export { LineFlowProvider, LineFlowProvider as LineflowProvider, useLineFlowNetwork, useLineFlowNetwork as useLineflowNetwork, } from "./provider.js";
2
+ export { useLineFlowValue, useLineFlowValue as useLineflowValue, useLineFlowSelector, useLineFlowSelector as useLineflowSelector, useLineFlowSet, useLineFlowSet as useLineflowSet, useLineFlowEvent, useLineFlowEvent as useLineflowEvent, } from "./hooks.js";
3
+ export { useProviderBridge, ProviderBridge, } from "./bridge.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/line-flow/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,IAAI,gBAAgB,EACpC,kBAAkB,EAClB,kBAAkB,IAAI,kBAAkB,GAGzC,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,IAAI,gBAAgB,EACpC,mBAAmB,EACnB,mBAAmB,IAAI,mBAAmB,EAC1C,cAAc,EACd,cAAc,IAAI,cAAc,EAChC,gBAAgB,EAChB,gBAAgB,IAAI,gBAAgB,GACrC,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,iBAAiB,EACjB,cAAc,GAGf,MAAM,aAAa,CAAC"}
@@ -0,0 +1,15 @@
1
+ import React, { type ReactNode } from "react";
2
+ import type { LineFlowNetwork } from "../types.js";
3
+ export interface LineFlowProviderProps {
4
+ network: LineFlowNetwork;
5
+ children: ReactNode;
6
+ }
7
+ /**
8
+ * LineFlowProvider makes a LineFlowNetwork instance available to all descendant components.
9
+ */
10
+ export declare function LineFlowProvider({ network, children, }: LineFlowProviderProps): React.JSX.Element;
11
+ /**
12
+ * Hook to access the current LineFlowNetwork from context.
13
+ * Throws LineFlowProviderNotFoundError if called outside a LineFlowProvider.
14
+ */
15
+ export declare function useLineFlowNetwork(): LineFlowNetwork;
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext } from "react";
3
+ import { LineFlowProviderNotFoundError, LineFlowValidationError } from "../errors.js";
4
+ const LineFlowContext = createContext(null);
5
+ /**
6
+ * LineFlowProvider makes a LineFlowNetwork instance available to all descendant components.
7
+ */
8
+ export function LineFlowProvider({ network, children, }) {
9
+ if (!network || typeof network.stateLine !== "function") {
10
+ throw new LineFlowValidationError("LineFlowProvider requires a valid LineFlowNetwork instance passed via the 'network' prop.");
11
+ }
12
+ return (_jsx(LineFlowContext.Provider, { value: network, children: children }));
13
+ }
14
+ /**
15
+ * Hook to access the current LineFlowNetwork from context.
16
+ * Throws LineFlowProviderNotFoundError if called outside a LineFlowProvider.
17
+ */
18
+ export function useLineFlowNetwork() {
19
+ const network = useContext(LineFlowContext);
20
+ if (!network) {
21
+ throw new LineFlowProviderNotFoundError();
22
+ }
23
+ return network;
24
+ }
25
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/line-flow/react/provider.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,aAAa,EAAE,UAAU,EAAkB,MAAM,OAAO,CAAC;AACzE,OAAO,EAAE,6BAA6B,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAGtF,MAAM,eAAe,GAAG,aAAa,CAAyB,IAAI,CAAC,CAAC;AAOpE;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAC/B,OAAO,EACP,QAAQ,GACc;IACtB,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;QACxD,MAAM,IAAI,uBAAuB,CAC/B,2FAA2F,CAC5F,CAAC;IACJ,CAAC;IAED,OAAO,CACL,KAAC,eAAe,CAAC,QAAQ,IAAC,KAAK,EAAE,OAAO,YACrC,QAAQ,GACgB,CAC5B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,6BAA6B,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { AnyStateLine, Bus, BusOptions, DerivedLine, DeriveLineOptions, Disposable, EventLine, EventLineOptions, LineFlowNetwork, Scope, ScopeOptions, StateLine, StateLineOptions, Taxi, TaxiOptions, TaskContract, TaxiTaskMap, Unsubscribe } from "./types.js";
2
+ export declare class ScopeImpl implements Scope {
3
+ readonly id: string;
4
+ private readonly _network;
5
+ private readonly _disposables;
6
+ private readonly _childScopes;
7
+ private _isDisposed;
8
+ private readonly _onDispose?;
9
+ constructor(network: LineFlowNetwork, options?: ScopeOptions, onDispose?: () => void);
10
+ get isDisposed(): boolean;
11
+ registerDisposable(disposable: Disposable): Unsubscribe;
12
+ stateLine<T>(options: StateLineOptions<T>): StateLine<T>;
13
+ eventLine<T = void>(options: EventLineOptions<T>): EventLine<T>;
14
+ deriveLine<T, const TDeps extends readonly AnyStateLine[]>(options: DeriveLineOptions<T, TDeps>): DerivedLine<T>;
15
+ bus<TMessageMap extends object = Record<string, unknown>>(options?: BusOptions): Bus<TMessageMap>;
16
+ taxi<TTaskMap extends {
17
+ [K in keyof TTaskMap]: TaskContract;
18
+ } = TaxiTaskMap>(options?: TaxiOptions): Taxi<TTaskMap>;
19
+ createChildScope(id: string): Scope;
20
+ dispose(): void;
21
+ }
@@ -0,0 +1,157 @@
1
+ import { LineFlowDisposedError, LineFlowDuplicateIdError, LineFlowValidationError } from "./errors.js";
2
+ import { validateId } from "./utils.js";
3
+ export class ScopeImpl {
4
+ id;
5
+ _network;
6
+ _disposables = new Set();
7
+ _childScopes = new Map();
8
+ _isDisposed = false;
9
+ _onDispose;
10
+ constructor(network, options, onDispose) {
11
+ this._network = network;
12
+ this.id = options?.id ? validateId(options.id, "scope") : `scope:${Math.random().toString(36).slice(2, 9)}`;
13
+ this._onDispose = onDispose;
14
+ }
15
+ get isDisposed() {
16
+ return this._isDisposed;
17
+ }
18
+ registerDisposable(disposable) {
19
+ if (this._isDisposed) {
20
+ throw new LineFlowDisposedError(`Cannot register disposable on disposed scope "${this.id}".`, this.id);
21
+ }
22
+ if (!disposable) {
23
+ throw new LineFlowValidationError("Disposable must be defined.");
24
+ }
25
+ let disposeFn;
26
+ if (typeof disposable === "function") {
27
+ disposeFn = disposable;
28
+ }
29
+ else if (typeof disposable === "object" && typeof disposable.dispose === "function") {
30
+ disposeFn = () => disposable.dispose();
31
+ }
32
+ else {
33
+ throw new LineFlowValidationError("Disposable must be a function or an object with a dispose() method.");
34
+ }
35
+ this._disposables.add(disposeFn);
36
+ let removed = false;
37
+ return () => {
38
+ if (removed)
39
+ return;
40
+ removed = true;
41
+ this._disposables.delete(disposeFn);
42
+ };
43
+ }
44
+ stateLine(options) {
45
+ if (this._isDisposed) {
46
+ throw new LineFlowDisposedError(`Cannot create state line in disposed scope "${this.id}".`, this.id);
47
+ }
48
+ const line = this._network.stateLine(options);
49
+ const unregister = this.registerDisposable(() => {
50
+ line.dispose();
51
+ });
52
+ // If the line is independently disposed, remove from scope disposables
53
+ const origDispose = line.dispose.bind(line);
54
+ line.dispose = () => {
55
+ unregister();
56
+ origDispose();
57
+ };
58
+ return line;
59
+ }
60
+ eventLine(options) {
61
+ if (this._isDisposed) {
62
+ throw new LineFlowDisposedError(`Cannot create event line in disposed scope "${this.id}".`, this.id);
63
+ }
64
+ const line = this._network.eventLine(options);
65
+ const unregister = this.registerDisposable(() => {
66
+ line.dispose();
67
+ });
68
+ const origDispose = line.dispose.bind(line);
69
+ line.dispose = () => {
70
+ unregister();
71
+ origDispose();
72
+ };
73
+ return line;
74
+ }
75
+ deriveLine(options) {
76
+ if (this._isDisposed) {
77
+ throw new LineFlowDisposedError(`Cannot create derived line in disposed scope "${this.id}".`, this.id);
78
+ }
79
+ const line = this._network.deriveLine(options);
80
+ const unregister = this.registerDisposable(() => {
81
+ line.dispose();
82
+ });
83
+ const origDispose = line.dispose.bind(line);
84
+ line.dispose = () => {
85
+ unregister();
86
+ origDispose();
87
+ };
88
+ return line;
89
+ }
90
+ bus(options) {
91
+ if (this._isDisposed) {
92
+ throw new LineFlowDisposedError(`Cannot create bus in disposed scope "${this.id}".`, this.id);
93
+ }
94
+ const busInstance = this._network.bus(options);
95
+ const unregister = this.registerDisposable(() => {
96
+ busInstance.dispose();
97
+ });
98
+ const origDispose = busInstance.dispose.bind(busInstance);
99
+ busInstance.dispose = () => {
100
+ unregister();
101
+ origDispose();
102
+ };
103
+ return busInstance;
104
+ }
105
+ taxi(options) {
106
+ if (this._isDisposed) {
107
+ throw new LineFlowDisposedError(`Cannot create taxi in disposed scope "${this.id}".`, this.id);
108
+ }
109
+ const taxiInstance = this._network.taxi(options);
110
+ const unregister = this.registerDisposable(() => {
111
+ taxiInstance.dispose();
112
+ });
113
+ const origDispose = taxiInstance.dispose.bind(taxiInstance);
114
+ taxiInstance.dispose = () => {
115
+ unregister();
116
+ origDispose();
117
+ };
118
+ return taxiInstance;
119
+ }
120
+ createChildScope(id) {
121
+ if (this._isDisposed) {
122
+ throw new LineFlowDisposedError(`Cannot create child scope in disposed parent scope "${this.id}".`, this.id);
123
+ }
124
+ validateId(id, "child scope");
125
+ if (this._childScopes.has(id)) {
126
+ throw new LineFlowDuplicateIdError(id, "child scope");
127
+ }
128
+ const child = new ScopeImpl(this._network, { id }, () => {
129
+ this._childScopes.delete(id);
130
+ });
131
+ this._childScopes.set(id, child);
132
+ return child;
133
+ }
134
+ dispose() {
135
+ if (this._isDisposed)
136
+ return;
137
+ this._isDisposed = true;
138
+ // Dispose all child scopes first
139
+ for (const child of Array.from(this._childScopes.values())) {
140
+ child.dispose();
141
+ }
142
+ this._childScopes.clear();
143
+ // Dispose all registered resources
144
+ const list = Array.from(this._disposables);
145
+ this._disposables.clear();
146
+ for (const disposeFn of list) {
147
+ try {
148
+ disposeFn();
149
+ }
150
+ catch {
151
+ // Continue disposing remaining resources
152
+ }
153
+ }
154
+ this._onDispose?.();
155
+ }
156
+ }
157
+ //# sourceMappingURL=scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/line-flow/scope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Listener, StateLine, StateLineOptions, Unsubscribe } from "./types.js";
2
+ export declare class StateLineImpl<T> implements StateLine<T> {
3
+ readonly id: string;
4
+ readonly kind: "state";
5
+ private _snapshot;
6
+ private readonly _equals;
7
+ private readonly _listeners;
8
+ private _isDisposed;
9
+ private readonly _onDispose?;
10
+ private _isDispatching;
11
+ private readonly _pendingSnapshots;
12
+ private static readonly MAX_DISPATCH_CYCLES;
13
+ constructor(options: StateLineOptions<T>, onDispose?: () => void);
14
+ get isDisposed(): boolean;
15
+ getSnapshot(): T;
16
+ private _commitAndNotify;
17
+ set(value: T): void;
18
+ update(updater: (prev: T) => T): void;
19
+ subscribe(listener: Listener<T>): Unsubscribe;
20
+ dispose(): void;
21
+ }
@@ -0,0 +1,106 @@
1
+ import { LineFlowDisposedError, LineFlowSubscriberError, LineFlowValidationError, } from "./errors.js";
2
+ import { defaultEquals, notifyListeners, validateId, validateListener } from "./utils.js";
3
+ export class StateLineImpl {
4
+ id;
5
+ kind = "state";
6
+ _snapshot;
7
+ _equals;
8
+ _listeners = new Set();
9
+ _isDisposed = false;
10
+ _onDispose;
11
+ _isDispatching = false;
12
+ _pendingSnapshots = [];
13
+ static MAX_DISPATCH_CYCLES = 1000;
14
+ constructor(options, onDispose) {
15
+ this.id = validateId(options?.id, "state line");
16
+ this._snapshot = options.initialValue;
17
+ this._equals = options.equals ?? defaultEquals;
18
+ this._onDispose = onDispose;
19
+ }
20
+ get isDisposed() {
21
+ return this._isDisposed;
22
+ }
23
+ getSnapshot() {
24
+ return this._snapshot;
25
+ }
26
+ _commitAndNotify(next) {
27
+ if (this._equals(this._snapshot, next)) {
28
+ return;
29
+ }
30
+ // Commit snapshot before notifying
31
+ this._snapshot = next;
32
+ this._pendingSnapshots.push(next);
33
+ if (this._isDispatching) {
34
+ return;
35
+ }
36
+ this._isDispatching = true;
37
+ const aggregatedErrors = [];
38
+ let cycles = 0;
39
+ try {
40
+ while (this._pendingSnapshots.length > 0 && !this._isDisposed) {
41
+ cycles++;
42
+ if (cycles > StateLineImpl.MAX_DISPATCH_CYCLES) {
43
+ throw new LineFlowValidationError(`Maximum re-entrant dispatch depth exceeded on state line "${this.id}". Possible infinite update loop.`);
44
+ }
45
+ const snapshotToDispatch = this._pendingSnapshots.shift();
46
+ try {
47
+ notifyListeners(this._listeners, snapshotToDispatch, `state line "${this.id}" update`);
48
+ }
49
+ catch (err) {
50
+ if (err instanceof LineFlowSubscriberError) {
51
+ aggregatedErrors.push(...err.errors);
52
+ }
53
+ else {
54
+ aggregatedErrors.push(err);
55
+ }
56
+ }
57
+ }
58
+ }
59
+ finally {
60
+ this._isDispatching = false;
61
+ this._pendingSnapshots.length = 0;
62
+ }
63
+ if (aggregatedErrors.length > 0) {
64
+ throw new LineFlowSubscriberError(`Error(s) encountered in subscriber(s) during state line "${this.id}" update`, aggregatedErrors);
65
+ }
66
+ }
67
+ set(value) {
68
+ if (this._isDisposed) {
69
+ throw new LineFlowDisposedError(`Cannot call set() on disposed state line "${this.id}".`, this.id);
70
+ }
71
+ this._commitAndNotify(value);
72
+ }
73
+ update(updater) {
74
+ if (this._isDisposed) {
75
+ throw new LineFlowDisposedError(`Cannot call update() on disposed state line "${this.id}".`, this.id);
76
+ }
77
+ if (typeof updater !== "function") {
78
+ throw new LineFlowValidationError(`update() on state line "${this.id}" requires an updater function.`);
79
+ }
80
+ const next = updater(this._snapshot);
81
+ this._commitAndNotify(next);
82
+ }
83
+ subscribe(listener) {
84
+ if (this._isDisposed) {
85
+ throw new LineFlowDisposedError(`Cannot subscribe to disposed state line "${this.id}".`, this.id);
86
+ }
87
+ validateListener(listener);
88
+ this._listeners.add(listener);
89
+ let unsubscribed = false;
90
+ return () => {
91
+ if (unsubscribed)
92
+ return;
93
+ unsubscribed = true;
94
+ this._listeners.delete(listener);
95
+ };
96
+ }
97
+ dispose() {
98
+ if (this._isDisposed)
99
+ return;
100
+ this._isDisposed = true;
101
+ this._pendingSnapshots.length = 0;
102
+ this._listeners.clear();
103
+ this._onDispose?.();
104
+ }
105
+ }
106
+ //# sourceMappingURL=state-line.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-line.js","sourceRoot":"","sources":["../../src/line-flow/state-line.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Taxi, TaxiHandler, TaxiOptions, TaxiTaskMap, Unsubscribe } from "./types.js";
2
+ export declare class TaxiImpl<TTaskMap extends TaxiTaskMap = TaxiTaskMap> implements Taxi<TTaskMap> {
3
+ readonly id: string;
4
+ private readonly _handlers;
5
+ private _isDisposed;
6
+ private readonly _onDispose?;
7
+ constructor(options?: TaxiOptions, onDispose?: () => void);
8
+ get isDisposed(): boolean;
9
+ register<K extends keyof TTaskMap & string>(task: K, handler: TaxiHandler<TTaskMap[K]["request"], TTaskMap[K]["response"]>): Unsubscribe;
10
+ request<K extends keyof TTaskMap & string>(task: K, req: TTaskMap[K]["request"], options?: {
11
+ signal?: AbortSignal;
12
+ }): Promise<TTaskMap[K]["response"]>;
13
+ hasHandler<K extends keyof TTaskMap & string>(task: K): boolean;
14
+ dispose(): void;
15
+ }
@@ -0,0 +1,81 @@
1
+ import { LineFlowDisposedError, LineFlowDuplicateHandlerError, LineFlowMissingHandlerError, LineFlowValidationError, } from "./errors.js";
2
+ import { validateId } from "./utils.js";
3
+ export class TaxiImpl {
4
+ id;
5
+ _handlers = new Map();
6
+ _isDisposed = false;
7
+ _onDispose;
8
+ constructor(options, onDispose) {
9
+ this.id = options?.id ? validateId(options.id, "taxi") : `taxi:${Math.random().toString(36).slice(2, 9)}`;
10
+ this._onDispose = onDispose;
11
+ }
12
+ get isDisposed() {
13
+ return this._isDisposed;
14
+ }
15
+ register(task, handler) {
16
+ if (this._isDisposed) {
17
+ throw new LineFlowDisposedError(`Cannot register handler on disposed Taxi "${this.id}".`, this.id);
18
+ }
19
+ validateId(task, "task");
20
+ if (typeof handler !== "function") {
21
+ throw new LineFlowValidationError(`Handler for Taxi task "${task}" must be a function.`);
22
+ }
23
+ if (this._handlers.has(task)) {
24
+ throw new LineFlowDuplicateHandlerError(task);
25
+ }
26
+ this._handlers.set(task, handler);
27
+ let unregistered = false;
28
+ return () => {
29
+ if (unregistered)
30
+ return;
31
+ unregistered = true;
32
+ if (this._handlers.get(task) === handler) {
33
+ this._handlers.delete(task);
34
+ }
35
+ };
36
+ }
37
+ async request(task, req, options) {
38
+ if (this._isDisposed) {
39
+ throw new LineFlowDisposedError(`Cannot request task from disposed Taxi "${this.id}".`, this.id);
40
+ }
41
+ validateId(task, "task");
42
+ const signal = options?.signal;
43
+ if (signal?.aborted) {
44
+ throw signal.reason ?? new Error("The operation was aborted.");
45
+ }
46
+ const handler = this._handlers.get(task);
47
+ if (!handler) {
48
+ throw new LineFlowMissingHandlerError(task);
49
+ }
50
+ if (!signal) {
51
+ return handler(req);
52
+ }
53
+ // Handle AbortSignal race
54
+ return new Promise((resolve, reject) => {
55
+ const onAbort = () => {
56
+ reject(signal.reason ?? new Error("The operation was aborted."));
57
+ };
58
+ signal.addEventListener("abort", onAbort, { once: true });
59
+ Promise.resolve()
60
+ .then(() => handler(req, signal))
61
+ .then((result) => {
62
+ signal.removeEventListener("abort", onAbort);
63
+ resolve(result);
64
+ }, (err) => {
65
+ signal.removeEventListener("abort", onAbort);
66
+ reject(err);
67
+ });
68
+ });
69
+ }
70
+ hasHandler(task) {
71
+ return this._handlers.has(task);
72
+ }
73
+ dispose() {
74
+ if (this._isDisposed)
75
+ return;
76
+ this._isDisposed = true;
77
+ this._handlers.clear();
78
+ this._onDispose?.();
79
+ }
80
+ }
81
+ //# sourceMappingURL=taxi.js.map