@plures/praxis 0.2.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.
- package/FRAMEWORK.md +420 -0
- package/LICENSE +21 -0
- package/README.md +1310 -0
- package/dist/adapters/cli.d.ts +43 -0
- package/dist/adapters/cli.d.ts.map +1 -0
- package/dist/adapters/cli.js +126 -0
- package/dist/adapters/cli.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +26 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +233 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/cloud.d.ts +27 -0
- package/dist/cli/commands/cloud.d.ts.map +1 -0
- package/dist/cli/commands/cloud.js +232 -0
- package/dist/cli/commands/cloud.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +25 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +168 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +179 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cloud/auth.d.ts +51 -0
- package/dist/cloud/auth.d.ts.map +1 -0
- package/dist/cloud/auth.js +194 -0
- package/dist/cloud/auth.js.map +1 -0
- package/dist/cloud/billing.d.ts +184 -0
- package/dist/cloud/billing.d.ts.map +1 -0
- package/dist/cloud/billing.js +179 -0
- package/dist/cloud/billing.js.map +1 -0
- package/dist/cloud/client.d.ts +39 -0
- package/dist/cloud/client.d.ts.map +1 -0
- package/dist/cloud/client.js +176 -0
- package/dist/cloud/client.js.map +1 -0
- package/dist/cloud/index.d.ts +44 -0
- package/dist/cloud/index.d.ts.map +1 -0
- package/dist/cloud/index.js +44 -0
- package/dist/cloud/index.js.map +1 -0
- package/dist/cloud/marketplace.d.ts +166 -0
- package/dist/cloud/marketplace.d.ts.map +1 -0
- package/dist/cloud/marketplace.js +159 -0
- package/dist/cloud/marketplace.js.map +1 -0
- package/dist/cloud/provisioning.d.ts +110 -0
- package/dist/cloud/provisioning.d.ts.map +1 -0
- package/dist/cloud/provisioning.js +148 -0
- package/dist/cloud/provisioning.js.map +1 -0
- package/dist/cloud/relay/endpoints.d.ts +62 -0
- package/dist/cloud/relay/endpoints.d.ts.map +1 -0
- package/dist/cloud/relay/endpoints.js +217 -0
- package/dist/cloud/relay/endpoints.js.map +1 -0
- package/dist/cloud/relay/health/index.d.ts +5 -0
- package/dist/cloud/relay/health/index.d.ts.map +1 -0
- package/dist/cloud/relay/health/index.js +9 -0
- package/dist/cloud/relay/health/index.js.map +1 -0
- package/dist/cloud/relay/stats/index.d.ts +5 -0
- package/dist/cloud/relay/stats/index.d.ts.map +1 -0
- package/dist/cloud/relay/stats/index.js +9 -0
- package/dist/cloud/relay/stats/index.js.map +1 -0
- package/dist/cloud/relay/sync/index.d.ts +5 -0
- package/dist/cloud/relay/sync/index.d.ts.map +1 -0
- package/dist/cloud/relay/sync/index.js +9 -0
- package/dist/cloud/relay/sync/index.js.map +1 -0
- package/dist/cloud/relay/usage/index.d.ts +5 -0
- package/dist/cloud/relay/usage/index.d.ts.map +1 -0
- package/dist/cloud/relay/usage/index.js +9 -0
- package/dist/cloud/relay/usage/index.js.map +1 -0
- package/dist/cloud/sponsors.d.ts +81 -0
- package/dist/cloud/sponsors.d.ts.map +1 -0
- package/dist/cloud/sponsors.js +130 -0
- package/dist/cloud/sponsors.js.map +1 -0
- package/dist/cloud/types.d.ts +169 -0
- package/dist/cloud/types.d.ts.map +1 -0
- package/dist/cloud/types.js +7 -0
- package/dist/cloud/types.js.map +1 -0
- package/dist/components/index.d.ts +43 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +17 -0
- package/dist/components/index.js.map +1 -0
- package/dist/core/actors.d.ts +95 -0
- package/dist/core/actors.d.ts.map +1 -0
- package/dist/core/actors.js +158 -0
- package/dist/core/actors.js.map +1 -0
- package/dist/core/component/generator.d.ts +122 -0
- package/dist/core/component/generator.d.ts.map +1 -0
- package/dist/core/component/generator.js +307 -0
- package/dist/core/component/generator.js.map +1 -0
- package/dist/core/engine.d.ts +92 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +199 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/introspection.d.ts +141 -0
- package/dist/core/introspection.d.ts.map +1 -0
- package/dist/core/introspection.js +208 -0
- package/dist/core/introspection.js.map +1 -0
- package/dist/core/logic/generator.d.ts +76 -0
- package/dist/core/logic/generator.d.ts.map +1 -0
- package/dist/core/logic/generator.js +339 -0
- package/dist/core/logic/generator.js.map +1 -0
- package/dist/core/pluresdb/generator.d.ts +58 -0
- package/dist/core/pluresdb/generator.d.ts.map +1 -0
- package/dist/core/pluresdb/generator.js +162 -0
- package/dist/core/pluresdb/generator.js.map +1 -0
- package/dist/core/protocol.d.ts +121 -0
- package/dist/core/protocol.d.ts.map +1 -0
- package/dist/core/protocol.js +46 -0
- package/dist/core/protocol.js.map +1 -0
- package/dist/core/rules.d.ts +120 -0
- package/dist/core/rules.d.ts.map +1 -0
- package/dist/core/rules.js +81 -0
- package/dist/core/rules.js.map +1 -0
- package/dist/core/schema/loader.d.ts +47 -0
- package/dist/core/schema/loader.d.ts.map +1 -0
- package/dist/core/schema/loader.js +189 -0
- package/dist/core/schema/loader.js.map +1 -0
- package/dist/core/schema/normalize.d.ts +72 -0
- package/dist/core/schema/normalize.d.ts.map +1 -0
- package/dist/core/schema/normalize.js +190 -0
- package/dist/core/schema/normalize.js.map +1 -0
- package/dist/core/schema/types.d.ts +370 -0
- package/dist/core/schema/types.d.ts.map +1 -0
- package/dist/core/schema/types.js +161 -0
- package/dist/core/schema/types.js.map +1 -0
- package/dist/dsl/index.d.ts +152 -0
- package/dist/dsl/index.d.ts.map +1 -0
- package/dist/dsl/index.js +132 -0
- package/dist/dsl/index.js.map +1 -0
- package/dist/dsl.d.ts +124 -0
- package/dist/dsl.d.ts.map +1 -0
- package/dist/dsl.js +130 -0
- package/dist/dsl.js.map +1 -0
- package/dist/examples/advanced-todo/index.d.ts +55 -0
- package/dist/examples/advanced-todo/index.d.ts.map +1 -0
- package/dist/examples/advanced-todo/index.js +222 -0
- package/dist/examples/advanced-todo/index.js.map +1 -0
- package/dist/examples/auth-basic/index.d.ts +17 -0
- package/dist/examples/auth-basic/index.d.ts.map +1 -0
- package/dist/examples/auth-basic/index.js +122 -0
- package/dist/examples/auth-basic/index.js.map +1 -0
- package/dist/examples/cart/index.d.ts +19 -0
- package/dist/examples/cart/index.d.ts.map +1 -0
- package/dist/examples/cart/index.js +202 -0
- package/dist/examples/cart/index.js.map +1 -0
- package/dist/examples/hero-ecommerce/index.d.ts +39 -0
- package/dist/examples/hero-ecommerce/index.d.ts.map +1 -0
- package/dist/examples/hero-ecommerce/index.js +506 -0
- package/dist/examples/hero-ecommerce/index.js.map +1 -0
- package/dist/examples/svelte-counter/index.d.ts +31 -0
- package/dist/examples/svelte-counter/index.d.ts.map +1 -0
- package/dist/examples/svelte-counter/index.js +123 -0
- package/dist/examples/svelte-counter/index.js.map +1 -0
- package/dist/flows.d.ts +125 -0
- package/dist/flows.d.ts.map +1 -0
- package/dist/flows.js +160 -0
- package/dist/flows.js.map +1 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/pluresdb.d.ts +56 -0
- package/dist/integrations/pluresdb.d.ts.map +1 -0
- package/dist/integrations/pluresdb.js +46 -0
- package/dist/integrations/pluresdb.js.map +1 -0
- package/dist/integrations/svelte.d.ts +306 -0
- package/dist/integrations/svelte.d.ts.map +1 -0
- package/dist/integrations/svelte.js +447 -0
- package/dist/integrations/svelte.js.map +1 -0
- package/dist/registry.d.ts +94 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +181 -0
- package/dist/registry.js.map +1 -0
- package/dist/runtime/terminal-adapter.d.ts +105 -0
- package/dist/runtime/terminal-adapter.d.ts.map +1 -0
- package/dist/runtime/terminal-adapter.js +113 -0
- package/dist/runtime/terminal-adapter.js.map +1 -0
- package/dist/step.d.ts +34 -0
- package/dist/step.d.ts.map +1 -0
- package/dist/step.js +111 -0
- package/dist/step.js.map +1 -0
- package/dist/types.d.ts +63 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/docs/MONETIZATION.md +394 -0
- package/docs/TERMINAL_NODE.md +588 -0
- package/docs/guides/canvas.md +389 -0
- package/docs/guides/getting-started.md +347 -0
- package/docs/guides/history-state-pattern.md +618 -0
- package/docs/guides/orchestration.md +617 -0
- package/docs/guides/parallel-state-pattern.md +767 -0
- package/docs/guides/svelte-integration.md +691 -0
- package/package.json +96 -0
- package/src/__tests__/actors.test.ts +270 -0
- package/src/__tests__/billing.test.ts +175 -0
- package/src/__tests__/cloud.test.ts +247 -0
- package/src/__tests__/dsl.test.ts +154 -0
- package/src/__tests__/edge-cases.test.ts +475 -0
- package/src/__tests__/engine.test.ts +137 -0
- package/src/__tests__/generators.test.ts +270 -0
- package/src/__tests__/introspection.test.ts +321 -0
- package/src/__tests__/protocol.test.ts +40 -0
- package/src/__tests__/provisioning.test.ts +162 -0
- package/src/__tests__/schema.test.ts +241 -0
- package/src/__tests__/svelte-integration.test.ts +431 -0
- package/src/__tests__/terminal-node.test.ts +352 -0
- package/src/adapters/cli.ts +175 -0
- package/src/cli/commands/auth.ts +271 -0
- package/src/cli/commands/cloud.ts +281 -0
- package/src/cli/commands/generate.ts +225 -0
- package/src/cli/index.ts +190 -0
- package/src/cloud/README.md +383 -0
- package/src/cloud/auth.ts +245 -0
- package/src/cloud/billing.ts +336 -0
- package/src/cloud/client.ts +221 -0
- package/src/cloud/index.ts +121 -0
- package/src/cloud/marketplace.ts +303 -0
- package/src/cloud/provisioning.ts +254 -0
- package/src/cloud/relay/endpoints.ts +307 -0
- package/src/cloud/relay/health/function.json +17 -0
- package/src/cloud/relay/health/index.ts +10 -0
- package/src/cloud/relay/host.json +15 -0
- package/src/cloud/relay/local.settings.json +8 -0
- package/src/cloud/relay/stats/function.json +17 -0
- package/src/cloud/relay/stats/index.ts +10 -0
- package/src/cloud/relay/sync/function.json +17 -0
- package/src/cloud/relay/sync/index.ts +10 -0
- package/src/cloud/relay/usage/function.json +17 -0
- package/src/cloud/relay/usage/index.ts +10 -0
- package/src/cloud/sponsors.ts +213 -0
- package/src/cloud/types.ts +198 -0
- package/src/components/README.md +125 -0
- package/src/components/TerminalNode.svelte +457 -0
- package/src/components/index.ts +46 -0
- package/src/core/actors.ts +205 -0
- package/src/core/component/generator.ts +432 -0
- package/src/core/engine.ts +243 -0
- package/src/core/introspection.ts +329 -0
- package/src/core/logic/generator.ts +420 -0
- package/src/core/pluresdb/generator.ts +229 -0
- package/src/core/protocol.ts +132 -0
- package/src/core/rules.ts +167 -0
- package/src/core/schema/loader.ts +247 -0
- package/src/core/schema/normalize.ts +322 -0
- package/src/core/schema/types.ts +557 -0
- package/src/dsl/index.ts +218 -0
- package/src/dsl.ts +214 -0
- package/src/examples/advanced-todo/App.svelte +506 -0
- package/src/examples/advanced-todo/README.md +371 -0
- package/src/examples/advanced-todo/index.ts +309 -0
- package/src/examples/auth-basic/index.ts +163 -0
- package/src/examples/cart/index.ts +259 -0
- package/src/examples/hero-ecommerce/index.ts +657 -0
- package/src/examples/svelte-counter/index.ts +168 -0
- package/src/flows.ts +268 -0
- package/src/index.ts +154 -0
- package/src/integrations/pluresdb.ts +93 -0
- package/src/integrations/svelte.ts +617 -0
- package/src/registry.ts +223 -0
- package/src/runtime/terminal-adapter.ts +175 -0
- package/src/step.ts +151 -0
- package/src/types.ts +70 -0
- package/templates/basic-app/README.md +147 -0
- package/templates/fullstack-app/README.md +279 -0
package/dist/dsl.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DSL for defining rules and constraints in Praxis.
|
|
3
|
+
* Rules are condition-action pairs that fire when conditions are met.
|
|
4
|
+
* Constraints are invariants that must hold true in valid states.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* DSL builder for creating rules with a fluent interface.
|
|
8
|
+
*/
|
|
9
|
+
export class RuleBuilder {
|
|
10
|
+
rule = {};
|
|
11
|
+
/**
|
|
12
|
+
* Set the rule ID.
|
|
13
|
+
*/
|
|
14
|
+
id(id) {
|
|
15
|
+
this.rule.id = id;
|
|
16
|
+
return this;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Set the rule description.
|
|
20
|
+
*/
|
|
21
|
+
describe(description) {
|
|
22
|
+
this.rule.description = description;
|
|
23
|
+
return this;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Set the rule priority.
|
|
27
|
+
*/
|
|
28
|
+
priority(priority) {
|
|
29
|
+
this.rule.priority = priority;
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Set the event type filter.
|
|
34
|
+
*/
|
|
35
|
+
on(eventType) {
|
|
36
|
+
this.rule.eventType = eventType;
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Set the condition for when the rule should fire.
|
|
41
|
+
*/
|
|
42
|
+
when(condition) {
|
|
43
|
+
this.rule.when = condition;
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Set the action to execute when the rule fires.
|
|
48
|
+
*/
|
|
49
|
+
then(action) {
|
|
50
|
+
this.rule.then = action;
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Build the final rule.
|
|
55
|
+
*/
|
|
56
|
+
build() {
|
|
57
|
+
if (!this.rule.id) {
|
|
58
|
+
throw new Error('Rule must have an id');
|
|
59
|
+
}
|
|
60
|
+
if (!this.rule.when) {
|
|
61
|
+
throw new Error('Rule must have a when condition');
|
|
62
|
+
}
|
|
63
|
+
if (!this.rule.then) {
|
|
64
|
+
throw new Error('Rule must have a then action');
|
|
65
|
+
}
|
|
66
|
+
return this.rule;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* DSL builder for creating constraints with a fluent interface.
|
|
71
|
+
*/
|
|
72
|
+
export class ConstraintBuilder {
|
|
73
|
+
constraint = {};
|
|
74
|
+
/**
|
|
75
|
+
* Set the constraint ID.
|
|
76
|
+
*/
|
|
77
|
+
id(id) {
|
|
78
|
+
this.constraint.id = id;
|
|
79
|
+
return this;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Set the constraint description.
|
|
83
|
+
*/
|
|
84
|
+
describe(description) {
|
|
85
|
+
this.constraint.description = description;
|
|
86
|
+
return this;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Set the constraint check function.
|
|
90
|
+
*/
|
|
91
|
+
check(check) {
|
|
92
|
+
this.constraint.check = check;
|
|
93
|
+
return this;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Set the error message for constraint violations.
|
|
97
|
+
*/
|
|
98
|
+
message(errorMessage) {
|
|
99
|
+
this.constraint.errorMessage = errorMessage;
|
|
100
|
+
return this;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Build the final constraint.
|
|
104
|
+
*/
|
|
105
|
+
build() {
|
|
106
|
+
if (!this.constraint.id) {
|
|
107
|
+
throw new Error('Constraint must have an id');
|
|
108
|
+
}
|
|
109
|
+
if (!this.constraint.check) {
|
|
110
|
+
throw new Error('Constraint must have a check function');
|
|
111
|
+
}
|
|
112
|
+
return this.constraint;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Factory functions for creating rules and constraints using the DSL.
|
|
117
|
+
*/
|
|
118
|
+
/**
|
|
119
|
+
* Create a new rule using the fluent builder API.
|
|
120
|
+
*/
|
|
121
|
+
export function rule() {
|
|
122
|
+
return new RuleBuilder();
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Create a new constraint using the fluent builder API.
|
|
126
|
+
*/
|
|
127
|
+
export function constraint() {
|
|
128
|
+
return new ConstraintBuilder();
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=dsl.js.map
|
package/dist/dsl.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dsl.js","sourceRoot":"","sources":["../src/dsl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advanced Svelte 5 Integration Example
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates the new Svelte 5 runes support with history state pattern.
|
|
5
|
+
* This example shows a todo app with undo/redo and time-travel debugging.
|
|
6
|
+
*/
|
|
7
|
+
interface TodoItem {
|
|
8
|
+
id: string;
|
|
9
|
+
text: string;
|
|
10
|
+
completed: boolean;
|
|
11
|
+
createdAt: number;
|
|
12
|
+
}
|
|
13
|
+
interface TodoContext {
|
|
14
|
+
todos: TodoItem[];
|
|
15
|
+
filter: 'all' | 'active' | 'completed';
|
|
16
|
+
nextId: number;
|
|
17
|
+
}
|
|
18
|
+
declare const TodoAdded: import("../../index.js").FactDefinition<"TodoAdded", {
|
|
19
|
+
id: string;
|
|
20
|
+
text: string;
|
|
21
|
+
}>;
|
|
22
|
+
declare const TodoToggled: import("../../index.js").FactDefinition<"TodoToggled", {
|
|
23
|
+
id: string;
|
|
24
|
+
}>;
|
|
25
|
+
declare const TodoRemoved: import("../../index.js").FactDefinition<"TodoRemoved", {
|
|
26
|
+
id: string;
|
|
27
|
+
}>;
|
|
28
|
+
declare const FilterChanged: import("../../index.js").FactDefinition<"FilterChanged", {
|
|
29
|
+
filter: string;
|
|
30
|
+
}>;
|
|
31
|
+
declare const AllCompleted: import("../../index.js").FactDefinition<"AllCompleted", {}>;
|
|
32
|
+
declare const CompletedCleared: import("../../index.js").FactDefinition<"CompletedCleared", {}>;
|
|
33
|
+
declare const AddTodo: import("../../index.js").EventDefinition<"ADD_TODO", {
|
|
34
|
+
text: string;
|
|
35
|
+
}>;
|
|
36
|
+
declare const ToggleTodo: import("../../index.js").EventDefinition<"TOGGLE_TODO", {
|
|
37
|
+
id: string;
|
|
38
|
+
}>;
|
|
39
|
+
declare const RemoveTodo: import("../../index.js").EventDefinition<"REMOVE_TODO", {
|
|
40
|
+
id: string;
|
|
41
|
+
}>;
|
|
42
|
+
declare const SetFilter: import("../../index.js").EventDefinition<"SET_FILTER", {
|
|
43
|
+
filter: "all" | "active" | "completed";
|
|
44
|
+
}>;
|
|
45
|
+
declare const CompleteAll: import("../../index.js").EventDefinition<"COMPLETE_ALL", {}>;
|
|
46
|
+
declare const ClearCompleted: import("../../index.js").EventDefinition<"CLEAR_COMPLETED", {}>;
|
|
47
|
+
export declare function createTodoEngine(): import("../../index.js").LogicEngine<TodoContext>;
|
|
48
|
+
export declare function getFilteredTodos(todos: TodoItem[], filter: string): TodoItem[];
|
|
49
|
+
export declare function getStats(todos: TodoItem[]): {
|
|
50
|
+
total: number;
|
|
51
|
+
active: number;
|
|
52
|
+
completed: number;
|
|
53
|
+
};
|
|
54
|
+
export { type TodoItem, type TodoContext, AddTodo, ToggleTodo, RemoveTodo, SetFilter, CompleteAll, ClearCompleted, TodoAdded, TodoToggled, TodoRemoved, FilterChanged, AllCompleted, CompletedCleared, };
|
|
55
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/examples/advanced-todo/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,WAAW;IACnB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,WAAW,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,QAAA,MAAM,SAAS;QAAiC,MAAM;UAAQ,MAAM;EAAgB,CAAC;AACrF,QAAA,MAAM,WAAW;QAAmC,MAAM;EAAkB,CAAC;AAC7E,QAAA,MAAM,WAAW;QAAmC,MAAM;EAAkB,CAAC;AAC7E,QAAA,MAAM,aAAa;YAAyC,MAAM;EAAoB,CAAC;AACvF,QAAA,MAAM,YAAY,6DAAiD,CAAC;AACpE,QAAA,MAAM,gBAAgB,iEAAyD,CAAC;AAMhF,QAAA,MAAM,OAAO;UAAmC,MAAM;EAAe,CAAC;AACtE,QAAA,MAAM,UAAU;QAAoC,MAAM;EAAkB,CAAC;AAC7E,QAAA,MAAM,UAAU;QAAoC,MAAM;EAAkB,CAAC;AAC7E,QAAA,MAAM,SAAS;YAAuC,KAAK,GAAG,QAAQ,GAAG,WAAW;EAEnF,CAAC;AACF,QAAA,MAAM,WAAW,8DAAkD,CAAC;AACpE,QAAA,MAAM,cAAc,iEAAwD,CAAC;AA4H7E,wBAAgB,gBAAgB,sDAkB/B;AAMD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,CAS9E;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE;;;;EAMzC;AAsED,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,WAAW,EAEhB,OAAO,EACP,UAAU,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACX,cAAc,EAEd,SAAS,EACT,WAAW,EACX,WAAW,EACX,aAAa,EACb,YAAY,EACZ,gBAAgB,GACjB,CAAC"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advanced Svelte 5 Integration Example
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates the new Svelte 5 runes support with history state pattern.
|
|
5
|
+
* This example shows a todo app with undo/redo and time-travel debugging.
|
|
6
|
+
*/
|
|
7
|
+
import { createPraxisEngine, PraxisRegistry, defineFact, defineEvent, defineRule, findEvent, } from '../../index.js';
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Facts
|
|
10
|
+
// ============================================================================
|
|
11
|
+
const TodoAdded = defineFact('TodoAdded');
|
|
12
|
+
const TodoToggled = defineFact('TodoToggled');
|
|
13
|
+
const TodoRemoved = defineFact('TodoRemoved');
|
|
14
|
+
const FilterChanged = defineFact('FilterChanged');
|
|
15
|
+
const AllCompleted = defineFact('AllCompleted');
|
|
16
|
+
const CompletedCleared = defineFact('CompletedCleared');
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Events
|
|
19
|
+
// ============================================================================
|
|
20
|
+
const AddTodo = defineEvent('ADD_TODO');
|
|
21
|
+
const ToggleTodo = defineEvent('TOGGLE_TODO');
|
|
22
|
+
const RemoveTodo = defineEvent('REMOVE_TODO');
|
|
23
|
+
const SetFilter = defineEvent('SET_FILTER');
|
|
24
|
+
const CompleteAll = defineEvent('COMPLETE_ALL');
|
|
25
|
+
const ClearCompleted = defineEvent('CLEAR_COMPLETED');
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// Rules
|
|
28
|
+
// ============================================================================
|
|
29
|
+
const addTodoRule = defineRule({
|
|
30
|
+
id: 'todo.add',
|
|
31
|
+
description: 'Add a new todo item',
|
|
32
|
+
impl: (state, events) => {
|
|
33
|
+
const event = findEvent(events, AddTodo);
|
|
34
|
+
if (!event || !event.payload.text.trim()) {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
const id = `todo-${state.context.nextId}`;
|
|
38
|
+
const todo = {
|
|
39
|
+
id,
|
|
40
|
+
text: event.payload.text.trim(),
|
|
41
|
+
completed: false,
|
|
42
|
+
createdAt: Date.now(),
|
|
43
|
+
};
|
|
44
|
+
state.context.todos.push(todo);
|
|
45
|
+
state.context.nextId++;
|
|
46
|
+
return [TodoAdded.create({ id, text: todo.text })];
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
const toggleTodoRule = defineRule({
|
|
50
|
+
id: 'todo.toggle',
|
|
51
|
+
description: 'Toggle todo completion status',
|
|
52
|
+
impl: (state, events) => {
|
|
53
|
+
const event = findEvent(events, ToggleTodo);
|
|
54
|
+
if (!event) {
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
const todo = state.context.todos.find((t) => t.id === event.payload.id);
|
|
58
|
+
if (todo) {
|
|
59
|
+
todo.completed = !todo.completed;
|
|
60
|
+
return [TodoToggled.create({ id: todo.id })];
|
|
61
|
+
}
|
|
62
|
+
return [];
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
const removeTodoRule = defineRule({
|
|
66
|
+
id: 'todo.remove',
|
|
67
|
+
description: 'Remove a todo item',
|
|
68
|
+
impl: (state, events) => {
|
|
69
|
+
const event = findEvent(events, RemoveTodo);
|
|
70
|
+
if (!event) {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
const index = state.context.todos.findIndex((t) => t.id === event.payload.id);
|
|
74
|
+
if (index !== -1) {
|
|
75
|
+
state.context.todos.splice(index, 1);
|
|
76
|
+
return [TodoRemoved.create({ id: event.payload.id })];
|
|
77
|
+
}
|
|
78
|
+
return [];
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
const setFilterRule = defineRule({
|
|
82
|
+
id: 'todo.setFilter',
|
|
83
|
+
description: 'Change the filter',
|
|
84
|
+
impl: (state, events) => {
|
|
85
|
+
const event = findEvent(events, SetFilter);
|
|
86
|
+
if (!event) {
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
state.context.filter = event.payload.filter;
|
|
90
|
+
return [FilterChanged.create({ filter: event.payload.filter })];
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
const completeAllRule = defineRule({
|
|
94
|
+
id: 'todo.completeAll',
|
|
95
|
+
description: 'Mark all todos as completed',
|
|
96
|
+
impl: (state, events) => {
|
|
97
|
+
const event = findEvent(events, CompleteAll);
|
|
98
|
+
if (!event) {
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
state.context.todos.forEach((todo) => {
|
|
102
|
+
todo.completed = true;
|
|
103
|
+
});
|
|
104
|
+
return [AllCompleted.create({})];
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
const clearCompletedRule = defineRule({
|
|
108
|
+
id: 'todo.clearCompleted',
|
|
109
|
+
description: 'Remove all completed todos',
|
|
110
|
+
impl: (state, events) => {
|
|
111
|
+
const event = findEvent(events, ClearCompleted);
|
|
112
|
+
if (!event) {
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
const beforeCount = state.context.todos.length;
|
|
116
|
+
state.context.todos = state.context.todos.filter((t) => !t.completed);
|
|
117
|
+
const afterCount = state.context.todos.length;
|
|
118
|
+
if (beforeCount !== afterCount) {
|
|
119
|
+
return [CompletedCleared.create({})];
|
|
120
|
+
}
|
|
121
|
+
return [];
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
// ============================================================================
|
|
125
|
+
// Engine Factory
|
|
126
|
+
// ============================================================================
|
|
127
|
+
export function createTodoEngine() {
|
|
128
|
+
const registry = new PraxisRegistry();
|
|
129
|
+
registry.registerRule(addTodoRule);
|
|
130
|
+
registry.registerRule(toggleTodoRule);
|
|
131
|
+
registry.registerRule(removeTodoRule);
|
|
132
|
+
registry.registerRule(setFilterRule);
|
|
133
|
+
registry.registerRule(completeAllRule);
|
|
134
|
+
registry.registerRule(clearCompletedRule);
|
|
135
|
+
return createPraxisEngine({
|
|
136
|
+
initialContext: {
|
|
137
|
+
todos: [],
|
|
138
|
+
filter: 'all',
|
|
139
|
+
nextId: 1,
|
|
140
|
+
},
|
|
141
|
+
registry,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
// ============================================================================
|
|
145
|
+
// Helper Functions for Svelte
|
|
146
|
+
// ============================================================================
|
|
147
|
+
export function getFilteredTodos(todos, filter) {
|
|
148
|
+
switch (filter) {
|
|
149
|
+
case 'active':
|
|
150
|
+
return todos.filter((t) => !t.completed);
|
|
151
|
+
case 'completed':
|
|
152
|
+
return todos.filter((t) => t.completed);
|
|
153
|
+
default:
|
|
154
|
+
return todos;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
export function getStats(todos) {
|
|
158
|
+
const total = todos.length;
|
|
159
|
+
const active = todos.filter((t) => !t.completed).length;
|
|
160
|
+
const completed = todos.filter((t) => t.completed).length;
|
|
161
|
+
return { total, active, completed };
|
|
162
|
+
}
|
|
163
|
+
// ============================================================================
|
|
164
|
+
// Example Usage (non-Svelte demonstration)
|
|
165
|
+
// ============================================================================
|
|
166
|
+
function runExample() {
|
|
167
|
+
console.log('=== Advanced Todo Example ===\n');
|
|
168
|
+
const engine = createTodoEngine();
|
|
169
|
+
// Add some todos
|
|
170
|
+
console.log('1. Adding todos:');
|
|
171
|
+
engine.step([AddTodo.create({ text: 'Learn Praxis' })]);
|
|
172
|
+
engine.step([AddTodo.create({ text: 'Build awesome app' })]);
|
|
173
|
+
engine.step([AddTodo.create({ text: 'Deploy to production' })]);
|
|
174
|
+
const context1 = engine.getContext();
|
|
175
|
+
console.log(` Total todos: ${context1.todos.length}`);
|
|
176
|
+
context1.todos.forEach((todo) => {
|
|
177
|
+
console.log(` - ${todo.text}`);
|
|
178
|
+
});
|
|
179
|
+
console.log();
|
|
180
|
+
// Toggle a todo
|
|
181
|
+
console.log('2. Completing first todo:');
|
|
182
|
+
const firstId = context1.todos[0].id;
|
|
183
|
+
engine.step([ToggleTodo.create({ id: firstId })]);
|
|
184
|
+
const context2 = engine.getContext();
|
|
185
|
+
const stats = getStats(context2.todos);
|
|
186
|
+
console.log(` Active: ${stats.active}, Completed: ${stats.completed}`);
|
|
187
|
+
console.log();
|
|
188
|
+
// Change filter
|
|
189
|
+
console.log('3. Filtering to active todos:');
|
|
190
|
+
engine.step([SetFilter.create({ filter: 'active' })]);
|
|
191
|
+
const context3 = engine.getContext();
|
|
192
|
+
const filtered = getFilteredTodos(context3.todos, context3.filter);
|
|
193
|
+
console.log(` Filter: ${context3.filter}`);
|
|
194
|
+
console.log(` Showing ${filtered.length} todos:`);
|
|
195
|
+
filtered.forEach((todo) => {
|
|
196
|
+
console.log(` - ${todo.text}`);
|
|
197
|
+
});
|
|
198
|
+
console.log();
|
|
199
|
+
// Complete all
|
|
200
|
+
console.log('4. Completing all todos:');
|
|
201
|
+
engine.step([CompleteAll.create({})]);
|
|
202
|
+
const context4 = engine.getContext();
|
|
203
|
+
const stats4 = getStats(context4.todos);
|
|
204
|
+
console.log(` All completed: ${stats4.completed}/${stats4.total}`);
|
|
205
|
+
console.log();
|
|
206
|
+
// Clear completed
|
|
207
|
+
console.log('5. Clearing completed todos:');
|
|
208
|
+
engine.step([ClearCompleted.create({})]);
|
|
209
|
+
const context5 = engine.getContext();
|
|
210
|
+
console.log(` Remaining todos: ${context5.todos.length}`);
|
|
211
|
+
console.log();
|
|
212
|
+
}
|
|
213
|
+
// Run example if executed directly
|
|
214
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
215
|
+
runExample();
|
|
216
|
+
}
|
|
217
|
+
export {
|
|
218
|
+
// Events
|
|
219
|
+
AddTodo, ToggleTodo, RemoveTodo, SetFilter, CompleteAll, ClearCompleted,
|
|
220
|
+
// Facts
|
|
221
|
+
TodoAdded, TodoToggled, TodoRemoved, FilterChanged, AllCompleted, CompletedCleared, };
|
|
222
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/examples/advanced-todo/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Basic Example
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates basic authentication logic with login/logout using Praxis.
|
|
5
|
+
* Shows how to define facts, events, rules, and constraints.
|
|
6
|
+
*/
|
|
7
|
+
interface AuthContext {
|
|
8
|
+
currentUser: string | null;
|
|
9
|
+
sessions: Array<{
|
|
10
|
+
userId: string;
|
|
11
|
+
timestamp: number;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
declare function createAuthEngine(): import("../../index.js").LogicEngine<AuthContext>;
|
|
15
|
+
declare function runExample(): void;
|
|
16
|
+
export { createAuthEngine, runExample };
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/examples/auth-basic/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,UAAU,WAAW;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD;AAuFD,iBAAS,gBAAgB,sDAgBxB;AAGD,iBAAS,UAAU,SA2BlB;AAOD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Basic Example
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates basic authentication logic with login/logout using Praxis.
|
|
5
|
+
* Shows how to define facts, events, rules, and constraints.
|
|
6
|
+
*/
|
|
7
|
+
import { createPraxisEngine, PraxisRegistry, defineFact, defineEvent, defineRule, defineConstraint, findEvent, filterFacts, } from "../../index.js";
|
|
8
|
+
// Define facts
|
|
9
|
+
const UserLoggedIn = defineFact("UserLoggedIn");
|
|
10
|
+
const UserLoggedOut = defineFact("UserLoggedOut");
|
|
11
|
+
// Define events
|
|
12
|
+
const Login = defineEvent("LOGIN");
|
|
13
|
+
const Logout = defineEvent("LOGOUT");
|
|
14
|
+
// Define rules
|
|
15
|
+
const loginRule = defineRule({
|
|
16
|
+
id: "auth.login",
|
|
17
|
+
description: "Process login event and create UserLoggedIn fact",
|
|
18
|
+
impl: (_state, events) => {
|
|
19
|
+
const loginEvent = findEvent(events, Login);
|
|
20
|
+
if (!loginEvent) {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
// In real app, validate password here
|
|
24
|
+
const userId = loginEvent.payload.username;
|
|
25
|
+
return [UserLoggedIn.create({ userId, timestamp: Date.now() })];
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
const logoutRule = defineRule({
|
|
29
|
+
id: "auth.logout",
|
|
30
|
+
description: "Process logout event and create UserLoggedOut fact",
|
|
31
|
+
impl: (state, events) => {
|
|
32
|
+
const logoutEvent = findEvent(events, Logout);
|
|
33
|
+
if (!logoutEvent || !state.context.currentUser) {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
return [
|
|
37
|
+
UserLoggedOut.create({
|
|
38
|
+
userId: state.context.currentUser,
|
|
39
|
+
timestamp: Date.now(),
|
|
40
|
+
}),
|
|
41
|
+
];
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
const updateContextRule = defineRule({
|
|
45
|
+
id: "auth.updateContext",
|
|
46
|
+
description: "Update context based on login/logout facts",
|
|
47
|
+
impl: (state, _events) => {
|
|
48
|
+
// This rule updates context based on facts (side effect on context)
|
|
49
|
+
const loginFacts = filterFacts(state.facts, UserLoggedIn);
|
|
50
|
+
const logoutFacts = filterFacts(state.facts, UserLoggedOut);
|
|
51
|
+
if (loginFacts.length > 0) {
|
|
52
|
+
const latestLogin = loginFacts[loginFacts.length - 1];
|
|
53
|
+
state.context.currentUser = latestLogin.payload.userId;
|
|
54
|
+
state.context.sessions.push({
|
|
55
|
+
userId: latestLogin.payload.userId,
|
|
56
|
+
timestamp: latestLogin.payload.timestamp,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (logoutFacts.length > 0) {
|
|
60
|
+
state.context.currentUser = null;
|
|
61
|
+
}
|
|
62
|
+
return [];
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
// Define constraints
|
|
66
|
+
const singleSessionConstraint = defineConstraint({
|
|
67
|
+
id: "auth.singleSession",
|
|
68
|
+
description: "Only one user can be logged in at a time",
|
|
69
|
+
impl: (state) => {
|
|
70
|
+
const loginFacts = filterFacts(state.facts, UserLoggedIn);
|
|
71
|
+
const logoutFacts = filterFacts(state.facts, UserLoggedOut);
|
|
72
|
+
const activeLogins = loginFacts.length - logoutFacts.length;
|
|
73
|
+
return activeLogins <= 1 || `Multiple active sessions detected: ${activeLogins}`;
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
// Create and configure the engine
|
|
77
|
+
function createAuthEngine() {
|
|
78
|
+
const registry = new PraxisRegistry();
|
|
79
|
+
registry.registerRule(loginRule);
|
|
80
|
+
registry.registerRule(logoutRule);
|
|
81
|
+
registry.registerRule(updateContextRule);
|
|
82
|
+
registry.registerConstraint(singleSessionConstraint);
|
|
83
|
+
const engine = createPraxisEngine({
|
|
84
|
+
initialContext: {
|
|
85
|
+
currentUser: null,
|
|
86
|
+
sessions: [],
|
|
87
|
+
},
|
|
88
|
+
registry,
|
|
89
|
+
});
|
|
90
|
+
return engine;
|
|
91
|
+
}
|
|
92
|
+
// Example usage
|
|
93
|
+
function runExample() {
|
|
94
|
+
console.log("=== Auth Basic Example ===\n");
|
|
95
|
+
const engine = createAuthEngine();
|
|
96
|
+
// Login
|
|
97
|
+
console.log("1. User logs in:");
|
|
98
|
+
let result = engine.step([Login.create({ username: "alice", password: "secret123" })]);
|
|
99
|
+
console.log(" Context:", engine.getContext());
|
|
100
|
+
console.log(" Facts:", result.state.facts);
|
|
101
|
+
console.log(" Diagnostics:", result.diagnostics);
|
|
102
|
+
console.log();
|
|
103
|
+
// Try to login again (should violate constraint)
|
|
104
|
+
console.log("2. Another user tries to log in:");
|
|
105
|
+
result = engine.step([Login.create({ username: "bob", password: "secret456" })]);
|
|
106
|
+
console.log(" Context:", engine.getContext());
|
|
107
|
+
console.log(" Diagnostics:", result.diagnostics);
|
|
108
|
+
console.log();
|
|
109
|
+
// Logout
|
|
110
|
+
console.log("3. User logs out:");
|
|
111
|
+
result = engine.step([Logout.create({})]);
|
|
112
|
+
console.log(" Context:", engine.getContext());
|
|
113
|
+
console.log(" Facts (last 3):", result.state.facts.slice(-3));
|
|
114
|
+
console.log(" Diagnostics:", result.diagnostics);
|
|
115
|
+
console.log();
|
|
116
|
+
}
|
|
117
|
+
// Run example if executed directly
|
|
118
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
119
|
+
runExample();
|
|
120
|
+
}
|
|
121
|
+
export { createAuthEngine, runExample };
|
|
122
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/examples/auth-basic/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cart Example
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates shopping cart logic with flows and derived state.
|
|
5
|
+
* Shows how to manage complex state with multiple rules and constraints.
|
|
6
|
+
*/
|
|
7
|
+
interface CartContext {
|
|
8
|
+
items: Array<{
|
|
9
|
+
productId: string;
|
|
10
|
+
quantity: number;
|
|
11
|
+
price: number;
|
|
12
|
+
}>;
|
|
13
|
+
total: number;
|
|
14
|
+
discountApplied: boolean;
|
|
15
|
+
}
|
|
16
|
+
declare function createCartEngine(): import("../../index.js").LogicEngine<CartContext>;
|
|
17
|
+
declare function runExample(): void;
|
|
18
|
+
export { createCartEngine, runExample };
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/examples/cart/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,UAAU,WAAW;IACnB,KAAK,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;CAC1B;AA6KD,iBAAS,gBAAgB,sDAcxB;AAGD,iBAAS,UAAU,SAqClB;AAOD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC"}
|