@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,91 @@
1
+ /**
2
+ * Base class for all LineFlow errors.
3
+ */
4
+ export class LineFlowError extends Error {
5
+ code;
6
+ constructor(message, code) {
7
+ super(message);
8
+ this.name = this.constructor.name;
9
+ this.code = code;
10
+ Object.setPrototypeOf(this, new.target.prototype);
11
+ }
12
+ }
13
+ /**
14
+ * Thrown when an ID is already registered within a network.
15
+ */
16
+ export class LineFlowDuplicateIdError extends LineFlowError {
17
+ id;
18
+ constructor(id, entity = "line") {
19
+ super(`LineFlow ${entity} with ID "${id}" is already registered in this network.`, "ERR_LINEFLOW_DUPLICATE_ID");
20
+ this.id = id;
21
+ }
22
+ }
23
+ /**
24
+ * Thrown when an operation is performed on a disposed line, scope, or network.
25
+ */
26
+ export class LineFlowDisposedError extends LineFlowError {
27
+ targetId;
28
+ constructor(message, targetId) {
29
+ super(message, "ERR_LINEFLOW_DISPOSED");
30
+ this.targetId = targetId;
31
+ }
32
+ }
33
+ /**
34
+ * Thrown when one or more subscribers throw errors during notification dispatch.
35
+ */
36
+ export class LineFlowSubscriberError extends LineFlowError {
37
+ errors;
38
+ constructor(message, errors) {
39
+ super(`${message} (${errors.length} error${errors.length === 1 ? "" : "s"} occurred).`, "ERR_LINEFLOW_SUBSCRIBER_ERROR");
40
+ this.errors = Object.freeze([...errors]);
41
+ }
42
+ }
43
+ /**
44
+ * Thrown when runtime input validation fails.
45
+ */
46
+ export class LineFlowValidationError extends LineFlowError {
47
+ constructor(message) {
48
+ super(message, "ERR_LINEFLOW_VALIDATION");
49
+ }
50
+ }
51
+ /**
52
+ * Thrown when a Taxi request cannot find a registered handler for the task.
53
+ */
54
+ export class LineFlowMissingHandlerError extends LineFlowError {
55
+ task;
56
+ constructor(task) {
57
+ super(`No handler registered for Taxi task "${task}".`, "ERR_LINEFLOW_MISSING_HANDLER");
58
+ this.task = task;
59
+ }
60
+ }
61
+ /**
62
+ * Thrown when attempting to register a duplicate handler for a Taxi task.
63
+ */
64
+ export class LineFlowDuplicateHandlerError extends LineFlowError {
65
+ task;
66
+ constructor(task) {
67
+ super(`A handler is already registered for Taxi task "${task}".`, "ERR_LINEFLOW_DUPLICATE_HANDLER");
68
+ this.task = task;
69
+ }
70
+ }
71
+ /**
72
+ * Thrown when a React hook requiring a LineFlowProvider is called outside one.
73
+ */
74
+ export class LineFlowProviderNotFoundError extends LineFlowError {
75
+ constructor() {
76
+ super("LineFlow React hook called outside a LineFlowProvider. Wrap your component tree in <LineFlowProvider network={network}> or pass a network explicitly.", "ERR_LINEFLOW_PROVIDER_NOT_FOUND");
77
+ }
78
+ }
79
+ /**
80
+ * Thrown when a circular dependency is detected among derived lines.
81
+ */
82
+ export class LineFlowCycleError extends LineFlowError {
83
+ cycle;
84
+ constructor(cycle) {
85
+ super(`Circular dependency detected in derived lines: ${cycle.join(" -> ")}`, "ERR_LINEFLOW_CYCLE");
86
+ this.cycle = Object.freeze([...cycle]);
87
+ }
88
+ }
89
+ // Backward-compatibility aliases
90
+ export { LineFlowError as LineflowError, LineFlowDuplicateIdError as LineflowDuplicateIdError, LineFlowDisposedError as LineflowDisposedError, LineFlowSubscriberError as LineflowSubscriberError, LineFlowValidationError as LineflowValidationError, LineFlowMissingHandlerError as LineflowMissingHandlerError, LineFlowDuplicateHandlerError as LineflowDuplicateHandlerError, LineFlowProviderNotFoundError as LineflowProviderNotFoundError, LineFlowCycleError as LineflowCycleError, };
91
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/line-flow/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { EventLine, EventLineOptions, Listener, Unsubscribe } from "./types.js";
2
+ export declare class EventLineImpl<T> implements EventLine<T> {
3
+ readonly id: string;
4
+ readonly kind: "event";
5
+ private readonly _listeners;
6
+ private _isDisposed;
7
+ private readonly _onDispose?;
8
+ private _isDispatching;
9
+ private readonly _eventQueue;
10
+ private static readonly MAX_DISPATCH_CYCLES;
11
+ constructor(options: EventLineOptions<T>, onDispose?: () => void);
12
+ get isDisposed(): boolean;
13
+ publish(event: T): void;
14
+ subscribe(listener: Listener<T>): Unsubscribe;
15
+ dispose(): void;
16
+ }
@@ -0,0 +1,81 @@
1
+ import { LineFlowDisposedError, LineFlowSubscriberError, LineFlowValidationError, } from "./errors.js";
2
+ import { notifyListeners, validateId, validateListener } from "./utils.js";
3
+ export class EventLineImpl {
4
+ id;
5
+ kind = "event";
6
+ _listeners = new Set();
7
+ _isDisposed = false;
8
+ _onDispose;
9
+ _isDispatching = false;
10
+ _eventQueue = [];
11
+ static MAX_DISPATCH_CYCLES = 1000;
12
+ constructor(options, onDispose) {
13
+ this.id = validateId(options?.id, "event line");
14
+ this._onDispose = onDispose;
15
+ }
16
+ get isDisposed() {
17
+ return this._isDisposed;
18
+ }
19
+ publish(event) {
20
+ if (this._isDisposed) {
21
+ throw new LineFlowDisposedError(`Cannot publish to disposed event line "${this.id}".`, this.id);
22
+ }
23
+ this._eventQueue.push(event);
24
+ if (this._isDispatching) {
25
+ return;
26
+ }
27
+ this._isDispatching = true;
28
+ const aggregatedErrors = [];
29
+ let cycles = 0;
30
+ try {
31
+ while (this._eventQueue.length > 0 && !this._isDisposed) {
32
+ cycles++;
33
+ if (cycles > EventLineImpl.MAX_DISPATCH_CYCLES) {
34
+ throw new LineFlowValidationError(`Maximum re-entrant dispatch depth exceeded on event line "${this.id}". Possible infinite event loop.`);
35
+ }
36
+ const nextEvent = this._eventQueue.shift();
37
+ try {
38
+ notifyListeners(this._listeners, nextEvent, `event line "${this.id}" dispatch`);
39
+ }
40
+ catch (err) {
41
+ if (err instanceof LineFlowSubscriberError) {
42
+ aggregatedErrors.push(...err.errors);
43
+ }
44
+ else {
45
+ aggregatedErrors.push(err);
46
+ }
47
+ }
48
+ }
49
+ }
50
+ finally {
51
+ this._isDispatching = false;
52
+ this._eventQueue.length = 0;
53
+ }
54
+ if (aggregatedErrors.length > 0) {
55
+ throw new LineFlowSubscriberError(`Error(s) encountered in subscriber(s) during event line "${this.id}" dispatch`, aggregatedErrors);
56
+ }
57
+ }
58
+ subscribe(listener) {
59
+ if (this._isDisposed) {
60
+ throw new LineFlowDisposedError(`Cannot subscribe to disposed event line "${this.id}".`, this.id);
61
+ }
62
+ validateListener(listener);
63
+ this._listeners.add(listener);
64
+ let unsubscribed = false;
65
+ return () => {
66
+ if (unsubscribed)
67
+ return;
68
+ unsubscribed = true;
69
+ this._listeners.delete(listener);
70
+ };
71
+ }
72
+ dispose() {
73
+ if (this._isDisposed)
74
+ return;
75
+ this._isDisposed = true;
76
+ this._eventQueue.length = 0;
77
+ this._listeners.clear();
78
+ this._onDispose?.();
79
+ }
80
+ }
81
+ //# sourceMappingURL=event-line.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-line.js","sourceRoot":"","sources":["../../src/line-flow/event-line.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { createLineFlow, createLineflow } from "./lineflow.js";
2
+ export { LineFlowNetworkImpl, LineflowNetworkImpl } from "./network.js";
3
+ export { StateLineImpl } from "./state-line.js";
4
+ export { EventLineImpl } from "./event-line.js";
5
+ export { DerivedLineImpl } from "./derived-line.js";
6
+ export { InterchangeImpl } from "./interchange.js";
7
+ export { ScopeImpl } from "./scope.js";
8
+ export { BusImpl } from "./bus.js";
9
+ export { TaxiImpl } from "./taxi.js";
10
+ export { LineFlowError, LineFlowDuplicateIdError, LineFlowDisposedError, LineFlowSubscriberError, LineFlowValidationError, LineFlowMissingHandlerError, LineFlowDuplicateHandlerError, LineFlowProviderNotFoundError, LineFlowCycleError, LineflowError, LineflowDuplicateIdError, LineflowDisposedError, LineflowSubscriberError, LineflowValidationError, LineflowMissingHandlerError, LineflowDuplicateHandlerError, LineflowProviderNotFoundError, LineflowCycleError, } from "./errors.js";
11
+ export type { LineKind, EqualityFn, Unsubscribe, Listener, Disposable, ReadableLine, StateLine, EventLine, DerivedLine, AnyLine, AnyStateLine, LineSnapshot, LinesSnapshots, StateLineOptions, EventLineOptions, DeriveLineOptions, InterchangeOptions, Interchange, Bus, BusOptions, Taxi, TaxiOptions, TaxiHandler, TaskContract, TaxiTaskMap, Scope, ScopeOptions, LineFlowOptions, LineFlowNetwork, LineflowOptions, LineflowNetwork, } from "./types.js";
@@ -0,0 +1,11 @@
1
+ export { createLineFlow, createLineflow } from "./lineflow.js";
2
+ export { LineFlowNetworkImpl, LineflowNetworkImpl } from "./network.js";
3
+ export { StateLineImpl } from "./state-line.js";
4
+ export { EventLineImpl } from "./event-line.js";
5
+ export { DerivedLineImpl } from "./derived-line.js";
6
+ export { InterchangeImpl } from "./interchange.js";
7
+ export { ScopeImpl } from "./scope.js";
8
+ export { BusImpl } from "./bus.js";
9
+ export { TaxiImpl } from "./taxi.js";
10
+ export { LineFlowError, LineFlowDuplicateIdError, LineFlowDisposedError, LineFlowSubscriberError, LineFlowValidationError, LineFlowMissingHandlerError, LineFlowDuplicateHandlerError, LineFlowProviderNotFoundError, LineFlowCycleError, LineflowError, LineflowDuplicateIdError, LineflowDisposedError, LineflowSubscriberError, LineflowValidationError, LineflowMissingHandlerError, LineflowDuplicateHandlerError, LineflowProviderNotFoundError, LineflowCycleError, } from "./errors.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/line-flow/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,EAC3B,6BAA6B,EAC7B,6BAA6B,EAC7B,kBAAkB,EAClB,aAAa,EACb,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,EAC3B,6BAA6B,EAC7B,6BAA6B,EAC7B,kBAAkB,GACnB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { Interchange, InterchangeOptions } from "./types.js";
2
+ export declare class InterchangeImpl<TSource, TTarget> implements Interchange {
3
+ readonly id: string;
4
+ private readonly _from;
5
+ private readonly _to;
6
+ private readonly _transform;
7
+ private readonly _equals;
8
+ private readonly _unsubscribe;
9
+ private _isDisposed;
10
+ private _isSyncing;
11
+ private readonly _onDispose?;
12
+ constructor(options: InterchangeOptions<TSource, TTarget>, onDispose?: () => void);
13
+ get isDisposed(): boolean;
14
+ private _sync;
15
+ dispose(): void;
16
+ private static hasDependency;
17
+ }
@@ -0,0 +1,86 @@
1
+ import { LineFlowCycleError, LineFlowValidationError } from "./errors.js";
2
+ import { defaultEquals, validateId } from "./utils.js";
3
+ export class InterchangeImpl {
4
+ id;
5
+ _from;
6
+ _to;
7
+ _transform;
8
+ _equals;
9
+ _unsubscribe;
10
+ _isDisposed = false;
11
+ _isSyncing = false;
12
+ _onDispose;
13
+ constructor(options, onDispose) {
14
+ if (!options || typeof options !== "object") {
15
+ throw new LineFlowValidationError("Interchange options must be provided.");
16
+ }
17
+ if (!options.from ||
18
+ typeof options.from !== "object" ||
19
+ typeof options.from.subscribe !== "function" ||
20
+ typeof options.from.getSnapshot !== "function") {
21
+ throw new LineFlowValidationError("Interchange requires a valid source readable line.");
22
+ }
23
+ if (!options.to ||
24
+ typeof options.to !== "object" ||
25
+ typeof options.to.set !== "function" ||
26
+ typeof options.to.getSnapshot !== "function") {
27
+ throw new LineFlowValidationError("Interchange requires a valid target state line.");
28
+ }
29
+ if (typeof options.transform !== "function") {
30
+ throw new LineFlowValidationError("Interchange requires a transform function.");
31
+ }
32
+ this.id = options.id ? validateId(options.id, "interchange") : `interchange:${options.from.id}->${options.to.id}`;
33
+ // Validate cycle prevention: target state line cannot be an upstream source of from line
34
+ if (InterchangeImpl.hasDependency(options.from, options.to.id)) {
35
+ throw new LineFlowCycleError([options.to.id, options.from.id, options.to.id]);
36
+ }
37
+ this._from = options.from;
38
+ this._to = options.to;
39
+ this._transform = options.transform;
40
+ this._equals = options.equals ?? defaultEquals;
41
+ this._onDispose = onDispose;
42
+ // Perform initial synchronization
43
+ this._sync();
44
+ // Subscribe to future updates from source
45
+ this._unsubscribe = this._from.subscribe(() => {
46
+ this._sync();
47
+ });
48
+ }
49
+ get isDisposed() {
50
+ return this._isDisposed;
51
+ }
52
+ _sync() {
53
+ if (this._isDisposed || this._to.isDisposed || this._isSyncing)
54
+ return;
55
+ this._isSyncing = true;
56
+ try {
57
+ const sourceVal = this._from.getSnapshot();
58
+ const targetVal = this._transform(sourceVal);
59
+ if (!this._equals(this._to.getSnapshot(), targetVal)) {
60
+ this._to.set(targetVal);
61
+ }
62
+ }
63
+ finally {
64
+ this._isSyncing = false;
65
+ }
66
+ }
67
+ dispose() {
68
+ if (this._isDisposed)
69
+ return;
70
+ this._isDisposed = true;
71
+ this._unsubscribe();
72
+ this._onDispose?.();
73
+ }
74
+ static hasDependency(line, targetId) {
75
+ if (line.id === targetId)
76
+ return true;
77
+ if ("sources" in line && Array.isArray(line.sources)) {
78
+ for (const upstream of line.sources) {
79
+ if (InterchangeImpl.hasDependency(upstream, targetId))
80
+ return true;
81
+ }
82
+ }
83
+ return false;
84
+ }
85
+ }
86
+ //# sourceMappingURL=interchange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interchange.js","sourceRoot":"","sources":["../../src/line-flow/interchange.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { LineFlowNetwork, LineFlowOptions } from "./types.js";
2
+ /**
3
+ * Creates an isolated LineFlow network instance.
4
+ *
5
+ * @param options Configuration options including an optional network name.
6
+ * @returns An isolated LineFlowNetwork instance.
7
+ */
8
+ export declare function createLineFlow(options?: LineFlowOptions): LineFlowNetwork;
9
+ /**
10
+ * Backward compatibility alias for createLineFlow.
11
+ */
12
+ export declare const createLineflow: typeof createLineFlow;
@@ -0,0 +1,15 @@
1
+ import { LineFlowNetworkImpl } from "./network.js";
2
+ /**
3
+ * Creates an isolated LineFlow network instance.
4
+ *
5
+ * @param options Configuration options including an optional network name.
6
+ * @returns An isolated LineFlowNetwork instance.
7
+ */
8
+ export function createLineFlow(options) {
9
+ return new LineFlowNetworkImpl(options);
10
+ }
11
+ /**
12
+ * Backward compatibility alias for createLineFlow.
13
+ */
14
+ export const createLineflow = createLineFlow;
15
+ //# sourceMappingURL=lineflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lineflow.js","sourceRoot":"","sources":["../../src/line-flow/lineflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGnD;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,OAAyB;IACtD,OAAO,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { AnyLine, AnyStateLine, Bus, BusOptions, DerivedLine, DeriveLineOptions, EventLine, EventLineOptions, Interchange, InterchangeOptions, LineFlowNetwork, LineFlowOptions, Scope, ScopeOptions, StateLine, StateLineOptions, Taxi, TaxiOptions, TaskContract, TaxiTaskMap } from "./types.js";
2
+ export declare class LineFlowNetworkImpl implements LineFlowNetwork {
3
+ readonly name: string;
4
+ private readonly _lines;
5
+ private readonly _scopes;
6
+ private readonly _interchanges;
7
+ private readonly _buses;
8
+ private readonly _taxis;
9
+ private _isDisposed;
10
+ constructor(options?: LineFlowOptions);
11
+ get isDisposed(): boolean;
12
+ private _assertNotDisposed;
13
+ private _assertIdUnique;
14
+ stateLine<T>(options: StateLineOptions<T>): StateLine<T>;
15
+ eventLine<T = void>(options: EventLineOptions<T>): EventLine<T>;
16
+ deriveLine<T, const TDeps extends readonly AnyStateLine[]>(options: DeriveLineOptions<T, TDeps>): DerivedLine<T>;
17
+ createInterchange<TSource, TTarget>(options: InterchangeOptions<TSource, TTarget>): Interchange;
18
+ createScope(options?: ScopeOptions): Scope;
19
+ bus<TMessageMap extends object = Record<string, unknown>>(options?: BusOptions): Bus<TMessageMap>;
20
+ taxi<TTaskMap extends {
21
+ [K in keyof TTaskMap]: TaskContract;
22
+ } = TaxiTaskMap>(options?: TaxiOptions): Taxi<TTaskMap>;
23
+ getLine(id: string): AnyLine | undefined;
24
+ hasLine(id: string): boolean;
25
+ getAllLines(): readonly AnyLine[];
26
+ dispose(): void;
27
+ }
28
+ export declare const LineflowNetworkImpl: typeof LineFlowNetworkImpl;
@@ -0,0 +1,165 @@
1
+ import { BusImpl } from "./bus.js";
2
+ import { DerivedLineImpl } from "./derived-line.js";
3
+ import { LineFlowDisposedError, LineFlowDuplicateIdError } from "./errors.js";
4
+ import { EventLineImpl } from "./event-line.js";
5
+ import { InterchangeImpl } from "./interchange.js";
6
+ import { ScopeImpl } from "./scope.js";
7
+ import { StateLineImpl } from "./state-line.js";
8
+ import { TaxiImpl } from "./taxi.js";
9
+ import { validateId } from "./utils.js";
10
+ export class LineFlowNetworkImpl {
11
+ name;
12
+ _lines = new Map();
13
+ _scopes = new Map();
14
+ _interchanges = new Map();
15
+ _buses = new Map();
16
+ _taxis = new Map();
17
+ _isDisposed = false;
18
+ constructor(options) {
19
+ this.name = options?.name ?? "default";
20
+ }
21
+ get isDisposed() {
22
+ return this._isDisposed;
23
+ }
24
+ _assertNotDisposed() {
25
+ if (this._isDisposed) {
26
+ throw new LineFlowDisposedError(`LineFlowNetwork "${this.name}" is disposed.`);
27
+ }
28
+ }
29
+ _assertIdUnique(id) {
30
+ if (this._lines.has(id)) {
31
+ throw new LineFlowDuplicateIdError(id, "line");
32
+ }
33
+ }
34
+ stateLine(options) {
35
+ this._assertNotDisposed();
36
+ validateId(options?.id, "state line");
37
+ this._assertIdUnique(options.id);
38
+ const line = new StateLineImpl(options, () => {
39
+ this._lines.delete(options.id);
40
+ });
41
+ this._lines.set(options.id, line);
42
+ return line;
43
+ }
44
+ eventLine(options) {
45
+ this._assertNotDisposed();
46
+ validateId(options?.id, "event line");
47
+ this._assertIdUnique(options.id);
48
+ const line = new EventLineImpl(options, () => {
49
+ this._lines.delete(options.id);
50
+ });
51
+ this._lines.set(options.id, line);
52
+ return line;
53
+ }
54
+ deriveLine(options) {
55
+ this._assertNotDisposed();
56
+ validateId(options?.id, "derived line");
57
+ this._assertIdUnique(options.id);
58
+ const line = new DerivedLineImpl(options, () => {
59
+ this._lines.delete(options.id);
60
+ });
61
+ this._lines.set(options.id, line);
62
+ return line;
63
+ }
64
+ createInterchange(options) {
65
+ this._assertNotDisposed();
66
+ if (options?.id) {
67
+ validateId(options.id, "interchange");
68
+ if (this._interchanges.has(options.id)) {
69
+ throw new LineFlowDuplicateIdError(options.id, "interchange");
70
+ }
71
+ }
72
+ const interchange = new InterchangeImpl(options, () => {
73
+ this._interchanges.delete(interchange.id);
74
+ });
75
+ if (this._interchanges.has(interchange.id)) {
76
+ throw new LineFlowDuplicateIdError(interchange.id, "interchange");
77
+ }
78
+ this._interchanges.set(interchange.id, interchange);
79
+ return interchange;
80
+ }
81
+ createScope(options) {
82
+ this._assertNotDisposed();
83
+ if (options?.id) {
84
+ validateId(options.id, "scope");
85
+ if (this._scopes.has(options.id)) {
86
+ throw new LineFlowDuplicateIdError(options.id, "scope");
87
+ }
88
+ }
89
+ const scope = new ScopeImpl(this, options, () => {
90
+ this._scopes.delete(scope.id);
91
+ });
92
+ this._scopes.set(scope.id, scope);
93
+ return scope;
94
+ }
95
+ bus(options) {
96
+ this._assertNotDisposed();
97
+ if (options?.id) {
98
+ validateId(options.id, "bus");
99
+ if (this._buses.has(options.id)) {
100
+ throw new LineFlowDuplicateIdError(options.id, "bus");
101
+ }
102
+ }
103
+ const busInstance = new BusImpl(options, () => {
104
+ this._buses.delete(busInstance.id);
105
+ });
106
+ this._buses.set(busInstance.id, busInstance);
107
+ return busInstance;
108
+ }
109
+ taxi(options) {
110
+ this._assertNotDisposed();
111
+ if (options?.id) {
112
+ validateId(options.id, "taxi");
113
+ if (this._taxis.has(options.id)) {
114
+ throw new LineFlowDuplicateIdError(options.id, "taxi");
115
+ }
116
+ }
117
+ const taxiInstance = new TaxiImpl(options, () => {
118
+ this._taxis.delete(taxiInstance.id);
119
+ });
120
+ this._taxis.set(taxiInstance.id, taxiInstance);
121
+ return taxiInstance;
122
+ }
123
+ getLine(id) {
124
+ return this._lines.get(id);
125
+ }
126
+ hasLine(id) {
127
+ return this._lines.has(id);
128
+ }
129
+ getAllLines() {
130
+ return Array.from(this._lines.values());
131
+ }
132
+ dispose() {
133
+ if (this._isDisposed)
134
+ return;
135
+ this._isDisposed = true;
136
+ // Dispose all active scopes
137
+ for (const scope of Array.from(this._scopes.values())) {
138
+ scope.dispose();
139
+ }
140
+ this._scopes.clear();
141
+ // Dispose all active interchanges
142
+ for (const interchange of Array.from(this._interchanges.values())) {
143
+ interchange.dispose();
144
+ }
145
+ this._interchanges.clear();
146
+ // Dispose all active buses
147
+ for (const busInstance of Array.from(this._buses.values())) {
148
+ busInstance.dispose();
149
+ }
150
+ this._buses.clear();
151
+ // Dispose all active taxis
152
+ for (const taxiInstance of Array.from(this._taxis.values())) {
153
+ taxiInstance.dispose();
154
+ }
155
+ this._taxis.clear();
156
+ // Dispose all registered lines
157
+ for (const line of Array.from(this._lines.values())) {
158
+ line.dispose();
159
+ }
160
+ this._lines.clear();
161
+ }
162
+ }
163
+ // Backward-compatibility alias
164
+ export const LineflowNetworkImpl = LineFlowNetworkImpl;
165
+ //# sourceMappingURL=network.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/line-flow/network.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type ReactElement } from "react";
2
+ import type { EqualityFn, StateLine } from "../types.js";
3
+ export interface ProviderBridgeOptions<T> {
4
+ equals?: EqualityFn<T> | undefined;
5
+ resetOnUnmount?: T | undefined;
6
+ }
7
+ /**
8
+ * Directionally bridges a React Context value into a LineFlow StateLine.
9
+ *
10
+ * Synchronization occurs in the layout/commit phase to prevent render-phase side-effects.
11
+ * To prevent synchronization loops and redundant notifications, line.set is only invoked
12
+ * if the new Context value differs according to the specified equality policy.
13
+ */
14
+ export declare function useProviderBridge<T>(line: StateLine<T>, value: T, options?: ProviderBridgeOptions<T>): void;
15
+ export interface ProviderBridgeProps<T> extends ProviderBridgeOptions<T> {
16
+ line: StateLine<T>;
17
+ value: T;
18
+ }
19
+ /**
20
+ * Component representation of a Provider Bridge.
21
+ * Mount this component inside the source Context Provider to synchronize its value to a LineFlow StateLine.
22
+ */
23
+ export declare function ProviderBridge<T>({ line, value, equals, resetOnUnmount, }: ProviderBridgeProps<T>): ReactElement | null;
@@ -0,0 +1,40 @@
1
+ import { useEffect, useLayoutEffect } from "react";
2
+ import { LineFlowValidationError } from "../errors.js";
3
+ import { defaultEquals } from "../utils.js";
4
+ const useIsomorphicLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect;
5
+ /**
6
+ * Directionally bridges a React Context value into a LineFlow StateLine.
7
+ *
8
+ * Synchronization occurs in the layout/commit phase to prevent render-phase side-effects.
9
+ * To prevent synchronization loops and redundant notifications, line.set is only invoked
10
+ * if the new Context value differs according to the specified equality policy.
11
+ */
12
+ export function useProviderBridge(line, value, options) {
13
+ if (!line || typeof line.set !== "function" || typeof line.getSnapshot !== "function") {
14
+ throw new LineFlowValidationError("useProviderBridge requires a valid StateLine instance.");
15
+ }
16
+ const equals = options?.equals ?? defaultEquals;
17
+ const hasReset = options && "resetOnUnmount" in options;
18
+ const resetValue = options?.resetOnUnmount;
19
+ useIsomorphicLayoutEffect(() => {
20
+ if (!line.isDisposed && !equals(line.getSnapshot(), value)) {
21
+ line.set(value);
22
+ }
23
+ }, [line, value, equals]);
24
+ useEffect(() => {
25
+ return () => {
26
+ if (hasReset && !line.isDisposed) {
27
+ line.set(resetValue);
28
+ }
29
+ };
30
+ }, [line, hasReset, resetValue]);
31
+ }
32
+ /**
33
+ * Component representation of a Provider Bridge.
34
+ * Mount this component inside the source Context Provider to synchronize its value to a LineFlow StateLine.
35
+ */
36
+ export function ProviderBridge({ line, value, equals, resetOnUnmount, }) {
37
+ useProviderBridge(line, value, { equals, resetOnUnmount });
38
+ return null;
39
+ }
40
+ //# sourceMappingURL=bridge.js.map