@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,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Praxis Logic Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates logic module code from schema definitions.
|
|
5
|
+
*/
|
|
6
|
+
import type { NormalizedSchema } from '../schema/normalize.js';
|
|
7
|
+
/**
|
|
8
|
+
* Logic generation options
|
|
9
|
+
*/
|
|
10
|
+
export interface LogicGeneratorOptions {
|
|
11
|
+
/** Output directory */
|
|
12
|
+
outputDir: string;
|
|
13
|
+
/** Generate TypeScript */
|
|
14
|
+
typescript?: boolean;
|
|
15
|
+
/** Include documentation comments */
|
|
16
|
+
includeDocs?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generated logic file
|
|
20
|
+
*/
|
|
21
|
+
export interface GeneratedLogicFile {
|
|
22
|
+
/** File path */
|
|
23
|
+
path: string;
|
|
24
|
+
/** File content */
|
|
25
|
+
content: string;
|
|
26
|
+
/** File type */
|
|
27
|
+
type: 'facts' | 'events' | 'rules' | 'engine' | 'index';
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Logic generator class
|
|
31
|
+
*/
|
|
32
|
+
export declare class LogicGenerator {
|
|
33
|
+
private options;
|
|
34
|
+
constructor(options: LogicGeneratorOptions);
|
|
35
|
+
/**
|
|
36
|
+
* Generate all logic files from schema
|
|
37
|
+
*/
|
|
38
|
+
generateLogic(schema: NormalizedSchema): GeneratedLogicFile[];
|
|
39
|
+
/**
|
|
40
|
+
* Generate facts.ts file
|
|
41
|
+
*/
|
|
42
|
+
private generateFactsFile;
|
|
43
|
+
/**
|
|
44
|
+
* Generate events.ts file
|
|
45
|
+
*/
|
|
46
|
+
private generateEventsFile;
|
|
47
|
+
/**
|
|
48
|
+
* Generate rules.ts file
|
|
49
|
+
*/
|
|
50
|
+
private generateRulesFile;
|
|
51
|
+
/**
|
|
52
|
+
* Generate engine.ts file
|
|
53
|
+
*/
|
|
54
|
+
private generateEngineFile;
|
|
55
|
+
/**
|
|
56
|
+
* Generate index.ts file
|
|
57
|
+
*/
|
|
58
|
+
private generateIndexFile;
|
|
59
|
+
/**
|
|
60
|
+
* Generate TypeScript type from payload definition
|
|
61
|
+
*/
|
|
62
|
+
private generatePayloadType;
|
|
63
|
+
/**
|
|
64
|
+
* Map field type to TypeScript type
|
|
65
|
+
*/
|
|
66
|
+
private mapFieldType;
|
|
67
|
+
/**
|
|
68
|
+
* Sanitize identifier for variable names
|
|
69
|
+
*/
|
|
70
|
+
private sanitizeIdentifier;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create a logic generator
|
|
74
|
+
*/
|
|
75
|
+
export declare function createLogicGenerator(outputDir: string, options?: Partial<LogicGeneratorOptions>): LogicGenerator;
|
|
76
|
+
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../src/core/logic/generator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qCAAqC;IACrC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;CACzD;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAwB;gBAE3B,OAAO,EAAE,qBAAqB;IAQ1C;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,kBAAkB,EAAE;IA+B7D;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAuCzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuC1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAuEzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAyF1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAiCpB;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAG3B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACvC,cAAc,CAKhB"}
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Praxis Logic Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates logic module code from schema definitions.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Logic generator class
|
|
8
|
+
*/
|
|
9
|
+
export class LogicGenerator {
|
|
10
|
+
options;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.options = {
|
|
13
|
+
typescript: true,
|
|
14
|
+
includeDocs: true,
|
|
15
|
+
...options,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generate all logic files from schema
|
|
20
|
+
*/
|
|
21
|
+
generateLogic(schema) {
|
|
22
|
+
const files = [];
|
|
23
|
+
// Collect all logic definitions
|
|
24
|
+
const allLogic = schema.logic || [];
|
|
25
|
+
if (allLogic.length === 0) {
|
|
26
|
+
// Generate minimal structure even without logic definitions
|
|
27
|
+
files.push(this.generateFactsFile([]));
|
|
28
|
+
files.push(this.generateEventsFile([]));
|
|
29
|
+
files.push(this.generateRulesFile([]));
|
|
30
|
+
files.push(this.generateEngineFile(schema));
|
|
31
|
+
files.push(this.generateIndexFile());
|
|
32
|
+
return files;
|
|
33
|
+
}
|
|
34
|
+
// Collect all facts, events, and rules from logic definitions
|
|
35
|
+
const allFacts = allLogic.flatMap((logic) => logic.facts || []);
|
|
36
|
+
const allEvents = allLogic.flatMap((logic) => logic.events || []);
|
|
37
|
+
const allRules = allLogic.flatMap((logic) => logic.rules || []);
|
|
38
|
+
// Generate individual files
|
|
39
|
+
files.push(this.generateFactsFile(allFacts));
|
|
40
|
+
files.push(this.generateEventsFile(allEvents));
|
|
41
|
+
files.push(this.generateRulesFile(allRules));
|
|
42
|
+
files.push(this.generateEngineFile(schema));
|
|
43
|
+
files.push(this.generateIndexFile());
|
|
44
|
+
return files;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Generate facts.ts file
|
|
48
|
+
*/
|
|
49
|
+
generateFactsFile(facts) {
|
|
50
|
+
const ext = this.options.typescript ? 'ts' : 'js';
|
|
51
|
+
const lines = [];
|
|
52
|
+
lines.push("import { defineFact } from '@plures/praxis';");
|
|
53
|
+
lines.push('');
|
|
54
|
+
if (this.options.includeDocs) {
|
|
55
|
+
lines.push('/**');
|
|
56
|
+
lines.push(' * Fact definitions');
|
|
57
|
+
lines.push(' */');
|
|
58
|
+
lines.push('');
|
|
59
|
+
}
|
|
60
|
+
if (facts.length === 0) {
|
|
61
|
+
lines.push('// No facts defined in schema');
|
|
62
|
+
lines.push('// Example:');
|
|
63
|
+
lines.push('// export const UserCreated = defineFact<"UserCreated", { userId: string }>("UserCreated");');
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
for (const fact of facts) {
|
|
67
|
+
if (this.options.includeDocs && fact.description) {
|
|
68
|
+
lines.push(`/** ${fact.description} */`);
|
|
69
|
+
}
|
|
70
|
+
const payloadType = this.generatePayloadType(fact.payload);
|
|
71
|
+
lines.push(`export const ${fact.tag} = defineFact<"${fact.tag}", ${payloadType}>("${fact.tag}");`);
|
|
72
|
+
lines.push('');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
path: `${this.options.outputDir}/facts.${ext}`,
|
|
77
|
+
content: lines.join('\n'),
|
|
78
|
+
type: 'facts',
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Generate events.ts file
|
|
83
|
+
*/
|
|
84
|
+
generateEventsFile(events) {
|
|
85
|
+
const ext = this.options.typescript ? 'ts' : 'js';
|
|
86
|
+
const lines = [];
|
|
87
|
+
lines.push("import { defineEvent } from '@plures/praxis';");
|
|
88
|
+
lines.push('');
|
|
89
|
+
if (this.options.includeDocs) {
|
|
90
|
+
lines.push('/**');
|
|
91
|
+
lines.push(' * Event definitions');
|
|
92
|
+
lines.push(' */');
|
|
93
|
+
lines.push('');
|
|
94
|
+
}
|
|
95
|
+
if (events.length === 0) {
|
|
96
|
+
lines.push('// No events defined in schema');
|
|
97
|
+
lines.push('// Example:');
|
|
98
|
+
lines.push('// export const CreateUser = defineEvent<"CREATE_USER", { name: string; email: string }>("CREATE_USER");');
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
for (const event of events) {
|
|
102
|
+
if (this.options.includeDocs && event.description) {
|
|
103
|
+
lines.push(`/** ${event.description} */`);
|
|
104
|
+
}
|
|
105
|
+
const payloadType = this.generatePayloadType(event.payload);
|
|
106
|
+
lines.push(`export const ${event.tag} = defineEvent<"${event.tag}", ${payloadType}>("${event.tag}");`);
|
|
107
|
+
lines.push('');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
path: `${this.options.outputDir}/events.${ext}`,
|
|
112
|
+
content: lines.join('\n'),
|
|
113
|
+
type: 'events',
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Generate rules.ts file
|
|
118
|
+
*/
|
|
119
|
+
generateRulesFile(rules) {
|
|
120
|
+
const ext = this.options.typescript ? 'ts' : 'js';
|
|
121
|
+
const lines = [];
|
|
122
|
+
lines.push("import { defineRule } from '@plures/praxis';");
|
|
123
|
+
lines.push("import * as Facts from './facts.js';");
|
|
124
|
+
lines.push("import * as Events from './events.js';");
|
|
125
|
+
lines.push('');
|
|
126
|
+
if (this.options.includeDocs) {
|
|
127
|
+
lines.push('/**');
|
|
128
|
+
lines.push(' * Rule definitions');
|
|
129
|
+
lines.push(' */');
|
|
130
|
+
lines.push('');
|
|
131
|
+
}
|
|
132
|
+
if (rules.length === 0) {
|
|
133
|
+
lines.push('// No rules defined in schema');
|
|
134
|
+
lines.push('// Example:');
|
|
135
|
+
lines.push('// export const createUserRule = defineRule({');
|
|
136
|
+
lines.push("// id: 'user.create',");
|
|
137
|
+
lines.push("// description: 'Create user on CREATE_USER event',");
|
|
138
|
+
lines.push('// impl: (state, events) => {');
|
|
139
|
+
lines.push('// const event = events.find(Events.CreateUser.is);');
|
|
140
|
+
lines.push('// if (event) {');
|
|
141
|
+
lines.push('// return [Facts.UserCreated.create({ userId: "new-id" })];');
|
|
142
|
+
lines.push('// }');
|
|
143
|
+
lines.push('// return [];');
|
|
144
|
+
lines.push('// },');
|
|
145
|
+
lines.push('// });');
|
|
146
|
+
lines.push('');
|
|
147
|
+
lines.push('export const rules = [];');
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
for (const rule of rules) {
|
|
151
|
+
if (this.options.includeDocs && rule.description) {
|
|
152
|
+
lines.push(`/** ${rule.description} */`);
|
|
153
|
+
}
|
|
154
|
+
lines.push(`export const ${this.sanitizeIdentifier(rule.id)}Rule = defineRule({`);
|
|
155
|
+
lines.push(` id: '${rule.id}',`);
|
|
156
|
+
lines.push(` description: '${rule.description}',`);
|
|
157
|
+
if (rule.priority !== undefined) {
|
|
158
|
+
lines.push(` priority: ${rule.priority},`);
|
|
159
|
+
}
|
|
160
|
+
lines.push(' impl: (state, events) => {');
|
|
161
|
+
lines.push(` // TODO: Implement rule logic for "${rule.id}"`);
|
|
162
|
+
lines.push(' // Condition: ' + (rule.when || 'always'));
|
|
163
|
+
lines.push(' // Action: ' + rule.then);
|
|
164
|
+
lines.push(' return [];');
|
|
165
|
+
lines.push(' },');
|
|
166
|
+
lines.push('});');
|
|
167
|
+
lines.push('');
|
|
168
|
+
}
|
|
169
|
+
// Export all rules as array
|
|
170
|
+
lines.push('export const rules = [');
|
|
171
|
+
for (const rule of rules) {
|
|
172
|
+
lines.push(` ${this.sanitizeIdentifier(rule.id)}Rule,`);
|
|
173
|
+
}
|
|
174
|
+
lines.push('];');
|
|
175
|
+
}
|
|
176
|
+
return {
|
|
177
|
+
path: `${this.options.outputDir}/rules.${ext}`,
|
|
178
|
+
content: lines.join('\n'),
|
|
179
|
+
type: 'rules',
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Generate engine.ts file
|
|
184
|
+
*/
|
|
185
|
+
generateEngineFile(schema) {
|
|
186
|
+
const ext = this.options.typescript ? 'ts' : 'js';
|
|
187
|
+
const lines = [];
|
|
188
|
+
lines.push("import { createPraxisEngine, PraxisRegistry } from '@plures/praxis';");
|
|
189
|
+
lines.push("import { rules } from './rules.js';");
|
|
190
|
+
lines.push('');
|
|
191
|
+
if (this.options.includeDocs) {
|
|
192
|
+
lines.push('/**');
|
|
193
|
+
lines.push(` * ${schema.name} Logic Engine`);
|
|
194
|
+
if (schema.description) {
|
|
195
|
+
lines.push(` * ${schema.description}`);
|
|
196
|
+
}
|
|
197
|
+
lines.push(' */');
|
|
198
|
+
lines.push('');
|
|
199
|
+
}
|
|
200
|
+
// Generate context type from models
|
|
201
|
+
if (this.options.typescript) {
|
|
202
|
+
lines.push('/**');
|
|
203
|
+
lines.push(' * Application context type');
|
|
204
|
+
lines.push(' */');
|
|
205
|
+
lines.push('export interface AppContext {');
|
|
206
|
+
if (schema.models && schema.models.length > 0) {
|
|
207
|
+
for (const model of schema.models) {
|
|
208
|
+
lines.push(` ${model.name.toLowerCase()}s: ${model.name}[];`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
lines.push(' // Add your context properties here');
|
|
213
|
+
}
|
|
214
|
+
lines.push('}');
|
|
215
|
+
lines.push('');
|
|
216
|
+
// Generate model types
|
|
217
|
+
if (schema.models && schema.models.length > 0) {
|
|
218
|
+
for (const model of schema.models) {
|
|
219
|
+
lines.push(`export interface ${model.name} {`);
|
|
220
|
+
for (const field of model.fields) {
|
|
221
|
+
const optional = field.optional ? '?' : '';
|
|
222
|
+
const type = this.mapFieldType(field.type);
|
|
223
|
+
lines.push(` ${field.name}${optional}: ${type};`);
|
|
224
|
+
}
|
|
225
|
+
lines.push('}');
|
|
226
|
+
lines.push('');
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// Create registry and engine
|
|
231
|
+
lines.push('/**');
|
|
232
|
+
lines.push(' * Create the logic engine');
|
|
233
|
+
lines.push(' */');
|
|
234
|
+
lines.push('export function createEngine() {');
|
|
235
|
+
lines.push(' const registry = new PraxisRegistry<AppContext>();');
|
|
236
|
+
lines.push('');
|
|
237
|
+
lines.push(' // Register all rules');
|
|
238
|
+
lines.push(' for (const rule of rules) {');
|
|
239
|
+
lines.push(' registry.registerRule(rule);');
|
|
240
|
+
lines.push(' }');
|
|
241
|
+
lines.push('');
|
|
242
|
+
lines.push(' // Create engine with initial context');
|
|
243
|
+
lines.push(' const initialContext: AppContext = {');
|
|
244
|
+
if (schema.models && schema.models.length > 0) {
|
|
245
|
+
for (const model of schema.models) {
|
|
246
|
+
lines.push(` ${model.name.toLowerCase()}s: [],`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
lines.push(' // Initialize your context here');
|
|
251
|
+
}
|
|
252
|
+
lines.push(' };');
|
|
253
|
+
lines.push('');
|
|
254
|
+
lines.push(' return createPraxisEngine({');
|
|
255
|
+
lines.push(' initialContext,');
|
|
256
|
+
lines.push(' registry,');
|
|
257
|
+
lines.push(' });');
|
|
258
|
+
lines.push('}');
|
|
259
|
+
return {
|
|
260
|
+
path: `${this.options.outputDir}/engine.${ext}`,
|
|
261
|
+
content: lines.join('\n'),
|
|
262
|
+
type: 'engine',
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Generate index.ts file
|
|
267
|
+
*/
|
|
268
|
+
generateIndexFile() {
|
|
269
|
+
const ext = this.options.typescript ? 'ts' : 'js';
|
|
270
|
+
const lines = [];
|
|
271
|
+
lines.push("export * from './facts.js';");
|
|
272
|
+
lines.push("export * from './events.js';");
|
|
273
|
+
lines.push("export * from './rules.js';");
|
|
274
|
+
lines.push("export * from './engine.js';");
|
|
275
|
+
return {
|
|
276
|
+
path: `${this.options.outputDir}/index.${ext}`,
|
|
277
|
+
content: lines.join('\n'),
|
|
278
|
+
type: 'index',
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Generate TypeScript type from payload definition
|
|
283
|
+
*/
|
|
284
|
+
generatePayloadType(payload) {
|
|
285
|
+
const fields = Object.entries(payload)
|
|
286
|
+
.map(([key, type]) => `${key}: ${type}`)
|
|
287
|
+
.join('; ');
|
|
288
|
+
return `{ ${fields} }`;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Map field type to TypeScript type
|
|
292
|
+
*/
|
|
293
|
+
mapFieldType(type) {
|
|
294
|
+
if (typeof type === 'string') {
|
|
295
|
+
switch (type) {
|
|
296
|
+
case 'string':
|
|
297
|
+
return 'string';
|
|
298
|
+
case 'number':
|
|
299
|
+
return 'number';
|
|
300
|
+
case 'boolean':
|
|
301
|
+
return 'boolean';
|
|
302
|
+
case 'date':
|
|
303
|
+
return 'Date';
|
|
304
|
+
case 'array':
|
|
305
|
+
return 'unknown[]';
|
|
306
|
+
case 'object':
|
|
307
|
+
return 'Record<string, unknown>';
|
|
308
|
+
default:
|
|
309
|
+
return 'unknown';
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
if (typeof type === 'object') {
|
|
313
|
+
if ('array' in type) {
|
|
314
|
+
const innerType = this.mapFieldType(type.array);
|
|
315
|
+
return `${innerType}[]`;
|
|
316
|
+
}
|
|
317
|
+
if ('reference' in type) {
|
|
318
|
+
return type.reference;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return 'unknown';
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Sanitize identifier for variable names
|
|
325
|
+
*/
|
|
326
|
+
sanitizeIdentifier(id) {
|
|
327
|
+
return id.replace(/[^a-zA-Z0-9_]/g, '_');
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Create a logic generator
|
|
332
|
+
*/
|
|
333
|
+
export function createLogicGenerator(outputDir, options) {
|
|
334
|
+
return new LogicGenerator({
|
|
335
|
+
outputDir,
|
|
336
|
+
...options,
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../src/core/logic/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PluresDB Config Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates PluresDB configuration from schema definitions.
|
|
5
|
+
*/
|
|
6
|
+
import type { NormalizedSchema } from '../schema/normalize.js';
|
|
7
|
+
/**
|
|
8
|
+
* PluresDB config generation options
|
|
9
|
+
*/
|
|
10
|
+
export interface PluresDBGeneratorOptions {
|
|
11
|
+
/** Output directory */
|
|
12
|
+
outputDir: string;
|
|
13
|
+
/** Database name */
|
|
14
|
+
dbName?: string;
|
|
15
|
+
/** Database version */
|
|
16
|
+
dbVersion?: number;
|
|
17
|
+
/** Enable sync */
|
|
18
|
+
enableSync?: boolean;
|
|
19
|
+
/** Sync endpoint */
|
|
20
|
+
syncEndpoint?: string;
|
|
21
|
+
/** Auto-index strategy: 'all' indexes all string/number/date fields, 'explicit' only indexes fields defined in schema, 'none' disables auto-indexing */
|
|
22
|
+
autoIndex?: 'all' | 'explicit' | 'none';
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Generated PluresDB config file
|
|
26
|
+
*/
|
|
27
|
+
export interface GeneratedPluresDBFile {
|
|
28
|
+
/** File path */
|
|
29
|
+
path: string;
|
|
30
|
+
/** File content */
|
|
31
|
+
content: string;
|
|
32
|
+
/** File type */
|
|
33
|
+
type: 'config' | 'types';
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* PluresDB generator class
|
|
37
|
+
*/
|
|
38
|
+
export declare class PluresDBGenerator {
|
|
39
|
+
private options;
|
|
40
|
+
constructor(options: PluresDBGeneratorOptions);
|
|
41
|
+
/**
|
|
42
|
+
* Generate PluresDB configuration from schema
|
|
43
|
+
*/
|
|
44
|
+
generateConfig(schema: NormalizedSchema): GeneratedPluresDBFile[];
|
|
45
|
+
/**
|
|
46
|
+
* Generate pluresdb-config.ts file
|
|
47
|
+
*/
|
|
48
|
+
private generateConfigFile;
|
|
49
|
+
/**
|
|
50
|
+
* Generate store configuration for a model
|
|
51
|
+
*/
|
|
52
|
+
private generateStoreConfig;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Create a PluresDB generator
|
|
56
|
+
*/
|
|
57
|
+
export declare function createPluresDBGenerator(outputDir: string, options?: Partial<PluresDBGeneratorOptions>): PluresDBGenerator;
|
|
58
|
+
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../src/core/pluresdb/generator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAmB,MAAM,wBAAwB,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wJAAwJ;IACxJ,SAAS,CAAC,EAAE,KAAK,GAAG,UAAU,GAAG,MAAM,CAAC;CACzC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;CAC1B;AAUD;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAA2B;gBAE9B,OAAO,EAAE,wBAAwB;IAS7C;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,qBAAqB,EAAE;IASjE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkG1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAsC5B;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAC1C,iBAAiB,CAKnB"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PluresDB Config Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates PluresDB configuration from schema definitions.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* PluresDB generator class
|
|
8
|
+
*/
|
|
9
|
+
export class PluresDBGenerator {
|
|
10
|
+
options;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.options = {
|
|
13
|
+
dbVersion: 1,
|
|
14
|
+
enableSync: false,
|
|
15
|
+
autoIndex: 'all', // Default to indexing all fields for backward compatibility
|
|
16
|
+
...options,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Generate PluresDB configuration from schema
|
|
21
|
+
*/
|
|
22
|
+
generateConfig(schema) {
|
|
23
|
+
const files = [];
|
|
24
|
+
// Generate the main config file
|
|
25
|
+
files.push(this.generateConfigFile(schema));
|
|
26
|
+
return files;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Generate pluresdb-config.ts file
|
|
30
|
+
*/
|
|
31
|
+
generateConfigFile(schema) {
|
|
32
|
+
const lines = [];
|
|
33
|
+
const dbName = this.options.dbName || schema.name.toLowerCase();
|
|
34
|
+
lines.push('/**');
|
|
35
|
+
lines.push(` * PluresDB Configuration for ${schema.name}`);
|
|
36
|
+
lines.push(' * Generated from Praxis schema');
|
|
37
|
+
lines.push(' */');
|
|
38
|
+
lines.push('');
|
|
39
|
+
// Import statement (for future PluresDB integration)
|
|
40
|
+
lines.push('// import { createPluresDB } from \'@plures/pluresdb\';');
|
|
41
|
+
lines.push('');
|
|
42
|
+
// Generate store definitions
|
|
43
|
+
lines.push('/**');
|
|
44
|
+
lines.push(' * Database store configuration');
|
|
45
|
+
lines.push(' * ');
|
|
46
|
+
// Document indexing behavior based on configuration
|
|
47
|
+
const autoIndexStrategy = this.options.autoIndex || 'all';
|
|
48
|
+
if (autoIndexStrategy === 'all') {
|
|
49
|
+
lines.push(' * Indexing: All string, number, and date fields are auto-indexed by default.');
|
|
50
|
+
lines.push(' * For large datasets, consider using autoIndex: "explicit" to only index');
|
|
51
|
+
lines.push(' * fields explicitly defined in the schema.');
|
|
52
|
+
}
|
|
53
|
+
else if (autoIndexStrategy === 'explicit') {
|
|
54
|
+
lines.push(' * Indexing: Only fields explicitly defined in schema indexes are indexed.');
|
|
55
|
+
}
|
|
56
|
+
else if (autoIndexStrategy === 'none') {
|
|
57
|
+
lines.push(' * Indexing: Auto-indexing disabled. Only explicit schema indexes are used.');
|
|
58
|
+
}
|
|
59
|
+
lines.push(' */');
|
|
60
|
+
lines.push('export const stores = {');
|
|
61
|
+
if (schema.models && schema.models.length > 0) {
|
|
62
|
+
for (const model of schema.models) {
|
|
63
|
+
const storeName = model.name.toLowerCase() + 's';
|
|
64
|
+
const storeConfig = this.generateStoreConfig(model);
|
|
65
|
+
lines.push(` ${storeName}: {`);
|
|
66
|
+
lines.push(` keyPath: '${storeConfig.keyPath}',`);
|
|
67
|
+
if (storeConfig.indexes.length > 0) {
|
|
68
|
+
lines.push(` indexes: [${storeConfig.indexes.map(idx => `'${idx}'`).join(', ')}],`);
|
|
69
|
+
}
|
|
70
|
+
lines.push(' },');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
lines.push(' // No models defined in schema');
|
|
75
|
+
}
|
|
76
|
+
lines.push('};');
|
|
77
|
+
lines.push('');
|
|
78
|
+
// Generate main config
|
|
79
|
+
lines.push('/**');
|
|
80
|
+
lines.push(' * Database configuration');
|
|
81
|
+
lines.push(' */');
|
|
82
|
+
lines.push('export const dbConfig = {');
|
|
83
|
+
lines.push(` name: '${dbName}',`);
|
|
84
|
+
lines.push(` version: ${this.options.dbVersion},`);
|
|
85
|
+
lines.push(' stores,');
|
|
86
|
+
if (this.options.enableSync) {
|
|
87
|
+
lines.push(' sync: {');
|
|
88
|
+
lines.push(' enabled: true,');
|
|
89
|
+
if (this.options.syncEndpoint) {
|
|
90
|
+
lines.push(` endpoint: '${this.options.syncEndpoint}',`);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
lines.push(' endpoint: \'ws://localhost:8080/sync\',');
|
|
94
|
+
}
|
|
95
|
+
lines.push(' conflictResolution: \'last-write-wins\',');
|
|
96
|
+
lines.push(' },');
|
|
97
|
+
}
|
|
98
|
+
lines.push('};');
|
|
99
|
+
lines.push('');
|
|
100
|
+
// Generate initialization function
|
|
101
|
+
lines.push('/**');
|
|
102
|
+
lines.push(' * Initialize PluresDB');
|
|
103
|
+
lines.push(' */');
|
|
104
|
+
lines.push('export function initDB() {');
|
|
105
|
+
lines.push(' // TODO: Implement PluresDB initialization');
|
|
106
|
+
lines.push(' // return createPluresDB(dbConfig);');
|
|
107
|
+
lines.push(' console.log(\'PluresDB config ready:\', dbConfig);');
|
|
108
|
+
lines.push(' return null;');
|
|
109
|
+
lines.push('}');
|
|
110
|
+
return {
|
|
111
|
+
path: `${this.options.outputDir}/pluresdb-config.ts`,
|
|
112
|
+
content: lines.join('\n'),
|
|
113
|
+
type: 'config',
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Generate store configuration for a model
|
|
118
|
+
*/
|
|
119
|
+
generateStoreConfig(model) {
|
|
120
|
+
// Find the ID field (or use 'id' as default)
|
|
121
|
+
const idField = model.fields.find(f => f.name === 'id' || f.name === '_id');
|
|
122
|
+
const keyPath = idField ? idField.name : 'id';
|
|
123
|
+
const indexes = [];
|
|
124
|
+
// Apply auto-indexing based on configuration
|
|
125
|
+
const autoIndexStrategy = this.options.autoIndex || 'all';
|
|
126
|
+
if (autoIndexStrategy === 'all') {
|
|
127
|
+
// Auto-index all string, number, and date fields for query performance
|
|
128
|
+
for (const field of model.fields) {
|
|
129
|
+
if (field.name !== keyPath) {
|
|
130
|
+
if (field.type === 'string' || field.type === 'number' || field.type === 'date') {
|
|
131
|
+
indexes.push(field.name);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// For 'explicit' and 'none', we only add indexes explicitly defined in the schema
|
|
137
|
+
// Always add indexes from schema index definitions (overrides auto-indexing)
|
|
138
|
+
if (model.indexes) {
|
|
139
|
+
for (const indexDef of model.indexes) {
|
|
140
|
+
for (const fieldName of indexDef.fields) {
|
|
141
|
+
if (!indexes.includes(fieldName) && fieldName !== keyPath) {
|
|
142
|
+
indexes.push(fieldName);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
keyPath,
|
|
149
|
+
indexes,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Create a PluresDB generator
|
|
155
|
+
*/
|
|
156
|
+
export function createPluresDBGenerator(outputDir, options) {
|
|
157
|
+
return new PluresDBGenerator({
|
|
158
|
+
outputDir,
|
|
159
|
+
...options,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=generator.js.map
|