@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
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Actors System
|
|
3
|
+
*
|
|
4
|
+
* Actors are effectful units that:
|
|
5
|
+
* - Observe Praxis logic state
|
|
6
|
+
* - Perform side effects (network I/O, database operations, timers, etc.)
|
|
7
|
+
* - Feed new events/facts back into the engine
|
|
8
|
+
*
|
|
9
|
+
* Actors provide the bridge between pure logic and the effectful world.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Actor manager
|
|
13
|
+
*
|
|
14
|
+
* Manages the lifecycle of actors and coordinates their interaction with the engine.
|
|
15
|
+
*/
|
|
16
|
+
export class ActorManager {
|
|
17
|
+
actors = new Map();
|
|
18
|
+
activeActors = new Set();
|
|
19
|
+
engine = null;
|
|
20
|
+
/**
|
|
21
|
+
* Register an actor
|
|
22
|
+
*/
|
|
23
|
+
register(actor) {
|
|
24
|
+
if (this.actors.has(actor.id)) {
|
|
25
|
+
throw new Error(`Actor with id "${actor.id}" already registered`);
|
|
26
|
+
}
|
|
27
|
+
this.actors.set(actor.id, actor);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Unregister an actor
|
|
31
|
+
*/
|
|
32
|
+
unregister(actorId) {
|
|
33
|
+
if (this.activeActors.has(actorId)) {
|
|
34
|
+
throw new Error(`Cannot unregister active actor "${actorId}". Stop it first.`);
|
|
35
|
+
}
|
|
36
|
+
this.actors.delete(actorId);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Attach the actor manager to an engine
|
|
40
|
+
*/
|
|
41
|
+
attachEngine(engine) {
|
|
42
|
+
this.engine = engine;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Start an actor
|
|
46
|
+
*/
|
|
47
|
+
async start(actorId) {
|
|
48
|
+
const actor = this.actors.get(actorId);
|
|
49
|
+
if (!actor) {
|
|
50
|
+
throw new Error(`Actor "${actorId}" not found`);
|
|
51
|
+
}
|
|
52
|
+
if (this.activeActors.has(actorId)) {
|
|
53
|
+
throw new Error(`Actor "${actorId}" is already started`);
|
|
54
|
+
}
|
|
55
|
+
if (!this.engine) {
|
|
56
|
+
throw new Error("Actor manager not attached to an engine");
|
|
57
|
+
}
|
|
58
|
+
this.activeActors.add(actorId);
|
|
59
|
+
if (actor.onStart) {
|
|
60
|
+
await actor.onStart(this.engine);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Stop an actor
|
|
65
|
+
*/
|
|
66
|
+
async stop(actorId) {
|
|
67
|
+
const actor = this.actors.get(actorId);
|
|
68
|
+
if (!actor) {
|
|
69
|
+
throw new Error(`Actor "${actorId}" not found`);
|
|
70
|
+
}
|
|
71
|
+
if (!this.activeActors.has(actorId)) {
|
|
72
|
+
return; // Already stopped
|
|
73
|
+
}
|
|
74
|
+
this.activeActors.delete(actorId);
|
|
75
|
+
if (actor.onStop) {
|
|
76
|
+
await actor.onStop();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Start all registered actors
|
|
81
|
+
*/
|
|
82
|
+
async startAll() {
|
|
83
|
+
const actorIds = Array.from(this.actors.keys());
|
|
84
|
+
for (const actorId of actorIds) {
|
|
85
|
+
if (!this.activeActors.has(actorId)) {
|
|
86
|
+
await this.start(actorId);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Stop all active actors
|
|
92
|
+
*/
|
|
93
|
+
async stopAll() {
|
|
94
|
+
const activeIds = Array.from(this.activeActors);
|
|
95
|
+
for (const actorId of activeIds) {
|
|
96
|
+
await this.stop(actorId);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Notify active actors of a state change
|
|
101
|
+
*/
|
|
102
|
+
async notifyStateChange(state) {
|
|
103
|
+
if (!this.engine) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const promises = [];
|
|
107
|
+
for (const actorId of this.activeActors) {
|
|
108
|
+
const actor = this.actors.get(actorId);
|
|
109
|
+
if (actor?.onStateChange) {
|
|
110
|
+
const result = actor.onStateChange(state, this.engine);
|
|
111
|
+
if (result instanceof Promise) {
|
|
112
|
+
promises.push(result);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
await Promise.all(promises);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get all registered actor IDs
|
|
120
|
+
*/
|
|
121
|
+
getActorIds() {
|
|
122
|
+
return Array.from(this.actors.keys());
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Get all active actor IDs
|
|
126
|
+
*/
|
|
127
|
+
getActiveActorIds() {
|
|
128
|
+
return Array.from(this.activeActors);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Check if an actor is active
|
|
132
|
+
*/
|
|
133
|
+
isActive(actorId) {
|
|
134
|
+
return this.activeActors.has(actorId);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Helper to create a simple actor that dispatches events on a timer
|
|
139
|
+
*/
|
|
140
|
+
export function createTimerActor(id, intervalMs, createEvent) {
|
|
141
|
+
let timerId = null;
|
|
142
|
+
return {
|
|
143
|
+
id,
|
|
144
|
+
description: `Timer actor (${intervalMs}ms) - ${id}`,
|
|
145
|
+
onStart: (engine) => {
|
|
146
|
+
timerId = setInterval(() => {
|
|
147
|
+
engine.step([createEvent()]);
|
|
148
|
+
}, intervalMs);
|
|
149
|
+
},
|
|
150
|
+
onStop: () => {
|
|
151
|
+
if (timerId) {
|
|
152
|
+
clearInterval(timerId);
|
|
153
|
+
timerId = null;
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=actors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actors.js","sourceRoot":"","sources":["../../src/core/actors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Praxis Component Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates Svelte components from schema definitions.
|
|
5
|
+
*/
|
|
6
|
+
import type { ComponentDefinition, ModelDefinition } from '../schema/types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Generator configuration
|
|
9
|
+
*/
|
|
10
|
+
export interface GeneratorConfig {
|
|
11
|
+
/** Output directory */
|
|
12
|
+
outputDir: string;
|
|
13
|
+
/** Component framework */
|
|
14
|
+
framework: 'svelte' | 'react' | 'vue';
|
|
15
|
+
/** TypeScript support */
|
|
16
|
+
typescript: boolean;
|
|
17
|
+
/** Include tests */
|
|
18
|
+
includeTests: boolean;
|
|
19
|
+
/** Include documentation */
|
|
20
|
+
includeDocs: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Generation result
|
|
24
|
+
*/
|
|
25
|
+
export interface GenerationResult {
|
|
26
|
+
/** Success status */
|
|
27
|
+
success: boolean;
|
|
28
|
+
/** Generated files */
|
|
29
|
+
files: GeneratedFile[];
|
|
30
|
+
/** Generation errors */
|
|
31
|
+
errors: GenerationError[];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Generated file
|
|
35
|
+
*/
|
|
36
|
+
export interface GeneratedFile {
|
|
37
|
+
/** File path */
|
|
38
|
+
path: string;
|
|
39
|
+
/** File content */
|
|
40
|
+
content: string;
|
|
41
|
+
/** File type */
|
|
42
|
+
type: 'component' | 'test' | 'docs' | 'types';
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Generation error
|
|
46
|
+
*/
|
|
47
|
+
export interface GenerationError {
|
|
48
|
+
/** Error message */
|
|
49
|
+
message: string;
|
|
50
|
+
/** Component name */
|
|
51
|
+
component?: string;
|
|
52
|
+
/** Error code */
|
|
53
|
+
code?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Component generator class
|
|
57
|
+
*/
|
|
58
|
+
export declare class ComponentGenerator {
|
|
59
|
+
private config;
|
|
60
|
+
constructor(config: GeneratorConfig);
|
|
61
|
+
/**
|
|
62
|
+
* Generate component from definition
|
|
63
|
+
*/
|
|
64
|
+
generateComponent(component: ComponentDefinition, model?: ModelDefinition): GenerationResult;
|
|
65
|
+
/**
|
|
66
|
+
* Generate component file
|
|
67
|
+
*/
|
|
68
|
+
private generateComponentFile;
|
|
69
|
+
/**
|
|
70
|
+
* Generate Svelte component code
|
|
71
|
+
*/
|
|
72
|
+
private generateSvelteComponent;
|
|
73
|
+
/**
|
|
74
|
+
* Generate component script
|
|
75
|
+
*/
|
|
76
|
+
private generateScript;
|
|
77
|
+
/**
|
|
78
|
+
* Generate component template
|
|
79
|
+
*/
|
|
80
|
+
private generateTemplate;
|
|
81
|
+
/**
|
|
82
|
+
* Generate form template
|
|
83
|
+
*/
|
|
84
|
+
private generateFormTemplate;
|
|
85
|
+
/**
|
|
86
|
+
* Generate display template
|
|
87
|
+
*/
|
|
88
|
+
private generateDisplayTemplate;
|
|
89
|
+
/**
|
|
90
|
+
* Generate list template
|
|
91
|
+
*/
|
|
92
|
+
private generateListTemplate;
|
|
93
|
+
/**
|
|
94
|
+
* Generate navigation template
|
|
95
|
+
*/
|
|
96
|
+
private generateNavigationTemplate;
|
|
97
|
+
/**
|
|
98
|
+
* Generate component styles
|
|
99
|
+
*/
|
|
100
|
+
private generateStyles;
|
|
101
|
+
/**
|
|
102
|
+
* Generate types file
|
|
103
|
+
*/
|
|
104
|
+
private generateTypesFile;
|
|
105
|
+
/**
|
|
106
|
+
* Map field type to TypeScript type
|
|
107
|
+
*/
|
|
108
|
+
private mapFieldType;
|
|
109
|
+
/**
|
|
110
|
+
* Generate test file
|
|
111
|
+
*/
|
|
112
|
+
private generateTestFile;
|
|
113
|
+
/**
|
|
114
|
+
* Generate documentation file
|
|
115
|
+
*/
|
|
116
|
+
private generateDocsFile;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Create a component generator with default configuration
|
|
120
|
+
*/
|
|
121
|
+
export declare function createComponentGenerator(outputDir: string, options?: Partial<GeneratorConfig>): ComponentGenerator;
|
|
122
|
+
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../src/core/component/generator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE/E;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,SAAS,EAAE,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;IACtC,yBAAyB;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,oBAAoB;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,4BAA4B;IAC5B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,sBAAsB;IACtB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,wBAAwB;IACxB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,EAAE,eAAe;IAInC;;OAEG;IACH,iBAAiB,CACf,SAAS,EAAE,mBAAmB,EAC9B,KAAK,CAAC,EAAE,eAAe,GACtB,gBAAgB;IAwCnB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAe7B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAiB/B;;OAEG;IACH,OAAO,CAAC,cAAc;IA8BtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAc5B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAc/B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAIlC;;OAEG;IACH,OAAO,CAAC,cAAc;IAetB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkCzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAsBpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsBxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CA6CzB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GACjC,kBAAkB,CAWpB"}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Praxis Component Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates Svelte components from schema definitions.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Component generator class
|
|
8
|
+
*/
|
|
9
|
+
export class ComponentGenerator {
|
|
10
|
+
config;
|
|
11
|
+
constructor(config) {
|
|
12
|
+
this.config = config;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Generate component from definition
|
|
16
|
+
*/
|
|
17
|
+
generateComponent(component, model) {
|
|
18
|
+
const files = [];
|
|
19
|
+
const errors = [];
|
|
20
|
+
try {
|
|
21
|
+
// Generate main component file
|
|
22
|
+
const componentFile = this.generateComponentFile(component, model);
|
|
23
|
+
files.push(componentFile);
|
|
24
|
+
// Generate TypeScript types if enabled
|
|
25
|
+
if (this.config.typescript) {
|
|
26
|
+
const typesFile = this.generateTypesFile(component, model);
|
|
27
|
+
files.push(typesFile);
|
|
28
|
+
}
|
|
29
|
+
// Generate tests if enabled
|
|
30
|
+
if (this.config.includeTests) {
|
|
31
|
+
const testFile = this.generateTestFile(component);
|
|
32
|
+
files.push(testFile);
|
|
33
|
+
}
|
|
34
|
+
// Generate docs if enabled
|
|
35
|
+
if (this.config.includeDocs) {
|
|
36
|
+
const docsFile = this.generateDocsFile(component);
|
|
37
|
+
files.push(docsFile);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
errors.push({
|
|
42
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
43
|
+
component: component.name,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
success: errors.length === 0,
|
|
48
|
+
files,
|
|
49
|
+
errors,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Generate component file
|
|
54
|
+
*/
|
|
55
|
+
generateComponentFile(component, model) {
|
|
56
|
+
// Note: ext could be used for file naming in future versions
|
|
57
|
+
// const ext = this.config.typescript ? 'ts' : 'js';
|
|
58
|
+
const content = this.generateSvelteComponent(component, model);
|
|
59
|
+
return {
|
|
60
|
+
path: `${this.config.outputDir}/${component.name}.svelte`,
|
|
61
|
+
content,
|
|
62
|
+
type: 'component',
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Generate Svelte component code
|
|
67
|
+
*/
|
|
68
|
+
generateSvelteComponent(component, model) {
|
|
69
|
+
const script = this.generateScript(component, model);
|
|
70
|
+
const template = this.generateTemplate(component, model);
|
|
71
|
+
const styles = this.generateStyles(component);
|
|
72
|
+
return `<script${this.config.typescript ? ' lang="ts"' : ''}>
|
|
73
|
+
${script}
|
|
74
|
+
</script>
|
|
75
|
+
|
|
76
|
+
${template}
|
|
77
|
+
|
|
78
|
+
${styles ? `<style>\n${styles}\n</style>` : ''}`;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Generate component script
|
|
82
|
+
*/
|
|
83
|
+
generateScript(component, _model // Prefix with _ to indicate intentionally unused
|
|
84
|
+
) {
|
|
85
|
+
const lines = [];
|
|
86
|
+
// Import statements
|
|
87
|
+
lines.push(` import { createPraxisStore } from '@plures/praxis/svelte';`);
|
|
88
|
+
lines.push('');
|
|
89
|
+
// Props
|
|
90
|
+
if (component.props && component.props.length > 0) {
|
|
91
|
+
component.props.forEach((prop) => {
|
|
92
|
+
const typeAnnotation = this.config.typescript ? `: ${prop.type}` : '';
|
|
93
|
+
const defaultValue = prop.default !== undefined ? ` = ${JSON.stringify(prop.default)}` : '';
|
|
94
|
+
lines.push(` export let ${prop.name}${typeAnnotation}${defaultValue};`);
|
|
95
|
+
});
|
|
96
|
+
lines.push('');
|
|
97
|
+
}
|
|
98
|
+
// Component logic placeholder
|
|
99
|
+
lines.push(' // Component logic will be generated based on schema');
|
|
100
|
+
lines.push(' // TODO: Implement component behavior');
|
|
101
|
+
return lines.join('\n');
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Generate component template
|
|
105
|
+
*/
|
|
106
|
+
generateTemplate(component, model) {
|
|
107
|
+
switch (component.type) {
|
|
108
|
+
case 'form':
|
|
109
|
+
return this.generateFormTemplate(component, model);
|
|
110
|
+
case 'display':
|
|
111
|
+
return this.generateDisplayTemplate(component, model);
|
|
112
|
+
case 'list':
|
|
113
|
+
return this.generateListTemplate(component, model);
|
|
114
|
+
case 'navigation':
|
|
115
|
+
return this.generateNavigationTemplate(component);
|
|
116
|
+
default:
|
|
117
|
+
return `<div class="${component.name.toLowerCase()}">\n <!-- ${component.description || component.name} -->\n <p>Component: ${component.name}</p>\n</div>`;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Generate form template
|
|
122
|
+
*/
|
|
123
|
+
generateFormTemplate(component, model) {
|
|
124
|
+
const fields = model?.fields || [];
|
|
125
|
+
const formFields = fields
|
|
126
|
+
.map((field) => {
|
|
127
|
+
return ` <label>\n ${field.name}\n <input type="text" bind:value={data.${field.name}} />\n </label>`;
|
|
128
|
+
})
|
|
129
|
+
.join('\n');
|
|
130
|
+
return `<form class="${component.name.toLowerCase()}">\n${formFields}\n <button type="submit">Submit</button>\n</form>`;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Generate display template
|
|
134
|
+
*/
|
|
135
|
+
generateDisplayTemplate(component, model) {
|
|
136
|
+
const fields = model?.fields || [];
|
|
137
|
+
const displayFields = fields
|
|
138
|
+
.map((field) => {
|
|
139
|
+
return ` <div class="field">\n <strong>${field.name}:</strong> {data.${field.name}}\n </div>`;
|
|
140
|
+
})
|
|
141
|
+
.join('\n');
|
|
142
|
+
return `<div class="${component.name.toLowerCase()}">\n${displayFields}\n</div>`;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Generate list template
|
|
146
|
+
*/
|
|
147
|
+
generateListTemplate(component, _model // Prefix with _ to indicate intentionally unused
|
|
148
|
+
) {
|
|
149
|
+
return `<div class="${component.name.toLowerCase()}">\n {#each items as item}\n <div class="item">{item.name}</div>\n {/each}\n</div>`;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Generate navigation template
|
|
153
|
+
*/
|
|
154
|
+
generateNavigationTemplate(component) {
|
|
155
|
+
return `<nav class="${component.name.toLowerCase()}">\n <ul>\n <li><a href="/">Home</a></li>\n <li><a href="/about">About</a></li>\n </ul>\n</nav>`;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Generate component styles
|
|
159
|
+
*/
|
|
160
|
+
generateStyles(component) {
|
|
161
|
+
if (!component.styling) {
|
|
162
|
+
return '';
|
|
163
|
+
}
|
|
164
|
+
const lines = [];
|
|
165
|
+
const styles = component.styling.styles || {};
|
|
166
|
+
Object.entries(styles).forEach(([key, value]) => {
|
|
167
|
+
lines.push(` ${key}: ${value};`);
|
|
168
|
+
});
|
|
169
|
+
return lines.length > 0 ? lines.join('\n') : '';
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Generate types file
|
|
173
|
+
*/
|
|
174
|
+
generateTypesFile(component, model) {
|
|
175
|
+
const lines = [];
|
|
176
|
+
// Component props type
|
|
177
|
+
if (component.props && component.props.length > 0) {
|
|
178
|
+
lines.push(`export interface ${component.name}Props {`);
|
|
179
|
+
component.props.forEach((prop) => {
|
|
180
|
+
const optional = prop.required ? '' : '?';
|
|
181
|
+
lines.push(` ${prop.name}${optional}: ${prop.type};`);
|
|
182
|
+
});
|
|
183
|
+
lines.push('}');
|
|
184
|
+
lines.push('');
|
|
185
|
+
}
|
|
186
|
+
// Model type if available
|
|
187
|
+
if (model) {
|
|
188
|
+
lines.push(`export interface ${model.name} {`);
|
|
189
|
+
model.fields.forEach((field) => {
|
|
190
|
+
const optional = field.optional ? '?' : '';
|
|
191
|
+
lines.push(` ${field.name}${optional}: ${this.mapFieldType(field.type)};`);
|
|
192
|
+
});
|
|
193
|
+
lines.push('}');
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
path: `${this.config.outputDir}/${component.name}.types.ts`,
|
|
197
|
+
content: lines.join('\n'),
|
|
198
|
+
type: 'types',
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Map field type to TypeScript type
|
|
203
|
+
*/
|
|
204
|
+
mapFieldType(type) {
|
|
205
|
+
if (typeof type === 'string') {
|
|
206
|
+
switch (type) {
|
|
207
|
+
case 'string':
|
|
208
|
+
return 'string';
|
|
209
|
+
case 'number':
|
|
210
|
+
return 'number';
|
|
211
|
+
case 'boolean':
|
|
212
|
+
return 'boolean';
|
|
213
|
+
case 'date':
|
|
214
|
+
return 'Date';
|
|
215
|
+
case 'array':
|
|
216
|
+
return 'unknown[]';
|
|
217
|
+
case 'object':
|
|
218
|
+
return 'Record<string, unknown>';
|
|
219
|
+
default:
|
|
220
|
+
return 'unknown';
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return 'unknown';
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Generate test file
|
|
227
|
+
*/
|
|
228
|
+
generateTestFile(component) {
|
|
229
|
+
const content = `import { describe, it, expect } from 'vitest';
|
|
230
|
+
import { render } from '@testing-library/svelte';
|
|
231
|
+
import ${component.name} from './${component.name}.svelte';
|
|
232
|
+
|
|
233
|
+
describe('${component.name}', () => {
|
|
234
|
+
it('renders correctly', () => {
|
|
235
|
+
const { container } = render(${component.name});
|
|
236
|
+
expect(container).toBeTruthy();
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
// TODO: Add more tests based on component behavior
|
|
240
|
+
});
|
|
241
|
+
`;
|
|
242
|
+
return {
|
|
243
|
+
path: `${this.config.outputDir}/${component.name}.test.ts`,
|
|
244
|
+
content,
|
|
245
|
+
type: 'test',
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Generate documentation file
|
|
250
|
+
*/
|
|
251
|
+
generateDocsFile(component) {
|
|
252
|
+
const lines = [];
|
|
253
|
+
lines.push(`# ${component.name}`);
|
|
254
|
+
lines.push('');
|
|
255
|
+
if (component.description) {
|
|
256
|
+
lines.push(component.description);
|
|
257
|
+
lines.push('');
|
|
258
|
+
}
|
|
259
|
+
lines.push('## Props');
|
|
260
|
+
lines.push('');
|
|
261
|
+
if (component.props && component.props.length > 0) {
|
|
262
|
+
component.props.forEach((prop) => {
|
|
263
|
+
lines.push(`- \`${prop.name}\`: ${prop.type}${prop.required ? ' (required)' : ' (optional)'}`);
|
|
264
|
+
if (prop.description) {
|
|
265
|
+
lines.push(` - ${prop.description}`);
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
lines.push('No props defined.');
|
|
271
|
+
}
|
|
272
|
+
lines.push('');
|
|
273
|
+
lines.push('## Events');
|
|
274
|
+
lines.push('');
|
|
275
|
+
if (component.events && component.events.length > 0) {
|
|
276
|
+
component.events.forEach((event) => {
|
|
277
|
+
lines.push(`- \`${event.name}\`: ${event.payload || 'void'}`);
|
|
278
|
+
if (event.description) {
|
|
279
|
+
lines.push(` - ${event.description}`);
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
lines.push('No events defined.');
|
|
285
|
+
}
|
|
286
|
+
return {
|
|
287
|
+
path: `${this.config.outputDir}/${component.name}.md`,
|
|
288
|
+
content: lines.join('\n'),
|
|
289
|
+
type: 'docs',
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Create a component generator with default configuration
|
|
295
|
+
*/
|
|
296
|
+
export function createComponentGenerator(outputDir, options) {
|
|
297
|
+
const config = {
|
|
298
|
+
outputDir,
|
|
299
|
+
framework: 'svelte',
|
|
300
|
+
typescript: true,
|
|
301
|
+
includeTests: false,
|
|
302
|
+
includeDocs: false,
|
|
303
|
+
...options,
|
|
304
|
+
};
|
|
305
|
+
return new ComponentGenerator(config);
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../src/core/component/generator.ts"],"names":[],"mappings":"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"}
|