@directive-run/core 0.1.1 → 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/README.md +153 -9
- package/dist/adapter-utils.d.cts +1 -1
- package/dist/adapter-utils.d.ts +1 -1
- package/dist/index.cjs +20 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -35
- package/dist/index.d.ts +9 -35
- package/dist/index.js +20 -20
- package/dist/index.js.map +1 -1
- package/dist/migration.cjs +12 -12
- package/dist/migration.cjs.map +1 -1
- package/dist/migration.js +12 -12
- package/dist/migration.js.map +1 -1
- package/dist/plugins/index.d.cts +1 -1
- package/dist/plugins/index.d.ts +1 -1
- package/dist/{plugins-CcwEXXMS.d.cts → plugins-KKRG7lDP.d.cts} +11 -1
- package/dist/{plugins-CcwEXXMS.d.ts → plugins-KKRG7lDP.d.ts} +11 -1
- package/dist/testing.cjs +3 -3
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.js +3 -3
- package/dist/testing.js.map +1 -1
- package/dist/worker.cjs +3 -3
- package/dist/worker.cjs.map +1 -1
- package/dist/worker.d.cts +1 -1
- package/dist/worker.d.ts +1 -1
- package/dist/worker.js +3 -3
- package/dist/worker.js.map +1 -1
- package/package.json +1 -1
package/dist/migration.cjs
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
'use strict';function m(e){let t={},s={},i={};for(let[n,
|
|
1
|
+
'use strict';function m(e){let t={},s={},i={};for(let[n,c]of Object.entries(e.initialState))t[n]=p(c);for(let n of Object.keys(e.reducers))n.includes("By")||n.includes("Set")||n.includes("With")?(s[n]={payload:"t.object()"},i[n]=`(facts, { payload }) => {
|
|
2
2
|
// TODO: Implement ${n}
|
|
3
3
|
}`):(s[n]={},i[n]=`(facts) => {
|
|
4
4
|
// TODO: Implement ${n}
|
|
5
|
-
}`);let
|
|
6
|
-
${Object.entries(e.initialState).map(([n,
|
|
5
|
+
}`);let a=`(facts) => {
|
|
6
|
+
${Object.entries(e.initialState).map(([n,c])=>` facts.${n} = ${JSON.stringify(c)};`).join(`
|
|
7
7
|
`)}
|
|
8
|
-
}`;return {name:e.name,facts:t,derivations:{},events:s,requirements:{},initCode:
|
|
8
|
+
}`;return {name:e.name,facts:t,derivations:{},events:s,requirements:{},initCode:a,deriveCode:{},eventsCode:i}}function h(e){let t={},s={},i={};for(let[n,c]of Object.entries(e.state))t[n]=p(c);for(let n of Object.keys(e.actions))s[n]={},i[n]=`(facts) => {
|
|
9
9
|
// TODO: Implement ${n}
|
|
10
|
-
}`;let
|
|
11
|
-
${Object.entries(e.state).map(([n,
|
|
10
|
+
}`;let a=`(facts) => {
|
|
11
|
+
${Object.entries(e.state).map(([n,c])=>` facts.${n} = ${JSON.stringify(c)};`).join(`
|
|
12
12
|
`)}
|
|
13
|
-
}`;return {name:"store",facts:t,derivations:{},events:s,requirements:{},initCode:
|
|
13
|
+
}`;return {name:"store",facts:t,derivations:{},events:s,requirements:{},initCode:a,deriveCode:{},eventsCode:i}}function C(e){let t={state:`t.string<${Object.keys(e.states).map(r=>`'${r}'`).join(" | ")}>()`},s={},i={},f={},a={};if(e.context)for(let[r,o]of Object.entries(e.context))t[r]=p(o);for(let r of Object.keys(e.states)){let o=`is${l(r)}`;s[o]="t.boolean()",i[o]=`(facts) => facts.state === '${r}'`;}let n=new Map;for(let[r,o]of Object.entries(e.states))if(o.on)for(let[d,u]of Object.entries(o.on)){n.has(d)||n.set(d,new Map);let g=typeof u=="string"?u:u.target;n.get(d).set(r,g);}for(let[r,o]of n)if(f[r]={},o.size===1){let d=[...o.entries()][0],u=d?d[1]:"unknown";a[r]=`(facts) => {
|
|
14
14
|
facts.state = '${u}';
|
|
15
15
|
}`;}else {let d=[...o.entries()].map(([u,g])=>` case '${u}': facts.state = '${g}'; break;`).join(`
|
|
16
|
-
`);
|
|
16
|
+
`);a[r]=`(facts) => {
|
|
17
17
|
switch (facts.state) {
|
|
18
18
|
${d}
|
|
19
19
|
}
|
|
20
|
-
}`;}let
|
|
21
|
-
${
|
|
20
|
+
}`;}let c=[` facts.state = '${e.initial}';`];if(e.context)for(let[r,o]of Object.entries(e.context))c.push(` facts.${r} = ${JSON.stringify(o)};`);let v=`(facts) => {
|
|
21
|
+
${c.join(`
|
|
22
22
|
`)}
|
|
23
|
-
}`;return {name:e.id,facts:t,derivations:s,events:f,requirements:{},initCode:v,deriveCode:i,eventsCode:
|
|
24
|
-
`)}function p(e){if(e===null)return "t.
|
|
23
|
+
}`;return {name:e.id,facts:t,derivations:s,events:f,requirements:{},initCode:v,deriveCode:i,eventsCode:a}}function y(e){let t=["import { createModule, t } from '@directive-run/core';","",`const ${e.name}Module = createModule('${e.name}', {`," schema: {"," facts: {"];for(let[s,i]of Object.entries(e.facts))t.push(` ${s}: ${i},`);t.push(" },"),t.push(" derivations: {");for(let[s,i]of Object.entries(e.derivations))t.push(` ${s}: ${i},`);t.push(" },"),t.push(" events: {");for(let[s,i]of Object.entries(e.events)){let f=Object.entries(i).map(([a,n])=>`${a}: ${n}`).join(", ");t.push(` ${s}: { ${f} },`);}if(t.push(" },"),t.push(" requirements: {},"),t.push(" },"),t.push(` init: ${e.initCode},`),Object.keys(e.deriveCode).length>0){t.push(" derive: {");for(let[s,i]of Object.entries(e.deriveCode))t.push(` ${s}: ${i},`);t.push(" },");}t.push(" events: {");for(let[s,i]of Object.entries(e.eventsCode))t.push(` ${s}: ${i},`);return t.push(" },"),t.push("});"),t.push(""),t.push(`export { ${e.name}Module };`),t.join(`
|
|
24
|
+
`)}function p(e){if(e===null)return "t.object().nullable()";if(e===void 0)return "t.object().optional()";switch(typeof e){case "number":return "t.number()";case "string":return "t.string()";case "boolean":return "t.boolean()";case "object":return Array.isArray(e)?"t.array(t.object())":"t.object()";default:return "t.object()"}}function l(e){return e.charAt(0).toUpperCase()+e.slice(1)}function $(e){let t=["[ ] Install directive: pnpm add directive","[ ] Create module file(s) for your state","[ ] Define schema with facts, derivations, events","[ ] Implement init function for initial state","[ ] Implement event handlers","[ ] Update imports in consuming code","[ ] Test the new implementation","[ ] Remove old state management code"];return [...{redux:["[ ] Convert reducers to event handlers","[ ] Convert selectors to derivations","[ ] Convert thunks to constraints + resolvers","[ ] Update useSelector to useDerived","[ ] Update useDispatch to system.dispatch"],zustand:["[ ] Convert store state to facts","[ ] Convert store actions to events","[ ] Convert computed getters to derivations","[ ] Update useStore hooks to useDirective hooks"],xstate:["[ ] Convert machine states to a 'state' fact","[ ] Convert state checks to derivations (isActive, etc.)","[ ] Convert events to Directive events","[ ] Convert guards to constraint 'when' conditions","[ ] Convert services/actors to constraints + resolvers","[ ] Update useMachine to useDirective hooks"]}[e]??[],...t]}exports.analyzeReduxSlice=m;exports.analyzeXStateMachine=C;exports.analyzeZustandStore=h;exports.generateMigrationChecklist=$;exports.generateModuleCode=y;//# sourceMappingURL=migration.cjs.map
|
|
25
25
|
//# sourceMappingURL=migration.cjs.map
|
package/dist/migration.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/migration.ts"],"names":["analyzeReduxSlice","config","facts","events","eventsCode","key","value","inferTypeString","reducerName","initCode","analyzeZustandStore","actionName","analyzeXStateMachine","s","derivations","deriveCode","stateName","derivationName","capitalize","eventTransitions","stateConfig","eventName","target","targetState","transitions","firstEntry","toState","cases","from","to","initLines","generateModuleCode","structure","lines","type","schema","schemaStr","k","v","code","str","generateMigrationChecklist","source","common"],"mappings":"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","file":"migration.cjs","sourcesContent":["/**\n * Migration Utilities for Directive\n *\n * Helpers for migrating from Redux, Zustand, or XState to Directive.\n * These utilities help you understand your existing state management\n * and generate equivalent Directive module structures.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Redux slice configuration (simplified) */\nexport interface ReduxSliceConfig {\n\tname: string;\n\tinitialState: Record<string, unknown>;\n\treducers: Record<string, (state: unknown, action?: { payload?: unknown }) => void>;\n}\n\n/** Zustand store configuration (simplified) */\nexport interface ZustandStoreConfig {\n\tstate: Record<string, unknown>;\n\tactions: Record<string, (...args: unknown[]) => void>;\n}\n\n/** XState machine configuration (simplified) */\nexport interface XStateMachineConfig {\n\tid: string;\n\tinitial: string;\n\tstates: Record<string, { on?: Record<string, string | { target: string }> }>;\n\tcontext?: Record<string, unknown>;\n}\n\n/** Generated Directive module structure */\nexport interface DirectiveModuleStructure {\n\tname: string;\n\tfacts: Record<string, string>;\n\tderivations: Record<string, string>;\n\tevents: Record<string, Record<string, string>>;\n\trequirements: Record<string, unknown>;\n\tinitCode: string;\n\tderiveCode: Record<string, string>;\n\teventsCode: Record<string, string>;\n}\n\n// ============================================================================\n// Redux Migration\n// ============================================================================\n\n/**\n * Analyze a Redux slice and generate a Directive module structure.\n *\n * @example\n * ```typescript\n * const reduxConfig = {\n * name: 'counter',\n * initialState: { value: 0, status: 'idle' },\n * reducers: {\n * increment: (state) => { state.value += 1; },\n * decrement: (state) => { state.value -= 1; },\n * },\n * };\n *\n * const structure = analyzeReduxSlice(reduxConfig);\n * console.log(generateModuleCode(structure));\n * ```\n */\nexport function analyzeReduxSlice(config: ReduxSliceConfig): DirectiveModuleStructure {\n\tconst facts: Record<string, string> = {};\n\tconst events: Record<string, Record<string, string>> = {};\n\tconst eventsCode: Record<string, string> = {};\n\n\t// Analyze initial state to generate facts\n\tfor (const [key, value] of Object.entries(config.initialState)) {\n\t\tfacts[key] = inferTypeString(value);\n\t}\n\n\t// Analyze reducers to generate events\n\tfor (const reducerName of Object.keys(config.reducers)) {\n\t\t// Simple heuristic: if reducer name suggests payload, add it\n\t\tconst hasPayload = reducerName.includes(\"By\") || reducerName.includes(\"Set\") || reducerName.includes(\"With\");\n\t\tif (hasPayload) {\n\t\t\tevents[reducerName] = { payload: \"t.any()\" };\n\t\t\teventsCode[reducerName] = `(facts, { payload }) => {\\n // TODO: Implement ${reducerName}\\n }`;\n\t\t} else {\n\t\t\tevents[reducerName] = {};\n\t\t\teventsCode[reducerName] = `(facts) => {\\n // TODO: Implement ${reducerName}\\n }`;\n\t\t}\n\t}\n\n\t// Generate init code\n\tconst initLines = Object.entries(config.initialState)\n\t\t.map(([key, value]) => ` facts.${key} = ${JSON.stringify(value)};`)\n\t\t.join(\"\\n\");\n\tconst initCode = `(facts) => {\\n${initLines}\\n }`;\n\n\treturn {\n\t\tname: config.name,\n\t\tfacts,\n\t\tderivations: {},\n\t\tevents,\n\t\trequirements: {},\n\t\tinitCode,\n\t\tderiveCode: {},\n\t\teventsCode,\n\t};\n}\n\n// ============================================================================\n// Zustand Migration\n// ============================================================================\n\n/**\n * Analyze a Zustand store and generate a Directive module structure.\n *\n * @example\n * ```typescript\n * const zustandConfig = {\n * state: { count: 0, loading: false },\n * actions: {\n * increment: () => {},\n * decrement: () => {},\n * setLoading: (loading: boolean) => {},\n * },\n * };\n *\n * const structure = analyzeZustandStore(zustandConfig);\n * console.log(generateModuleCode(structure));\n * ```\n */\nexport function analyzeZustandStore(config: ZustandStoreConfig): DirectiveModuleStructure {\n\tconst facts: Record<string, string> = {};\n\tconst events: Record<string, Record<string, string>> = {};\n\tconst eventsCode: Record<string, string> = {};\n\n\t// Analyze state\n\tfor (const [key, value] of Object.entries(config.state)) {\n\t\tfacts[key] = inferTypeString(value);\n\t}\n\n\t// Analyze actions\n\tfor (const actionName of Object.keys(config.actions)) {\n\t\tevents[actionName] = {};\n\t\teventsCode[actionName] = `(facts) => {\\n // TODO: Implement ${actionName}\\n }`;\n\t}\n\n\t// Generate init code\n\tconst initLines = Object.entries(config.state)\n\t\t.map(([key, value]) => ` facts.${key} = ${JSON.stringify(value)};`)\n\t\t.join(\"\\n\");\n\tconst initCode = `(facts) => {\\n${initLines}\\n }`;\n\n\treturn {\n\t\tname: \"store\",\n\t\tfacts,\n\t\tderivations: {},\n\t\tevents,\n\t\trequirements: {},\n\t\tinitCode,\n\t\tderiveCode: {},\n\t\teventsCode,\n\t};\n}\n\n// ============================================================================\n// XState Migration\n// ============================================================================\n\n/**\n * Analyze an XState machine and generate a Directive module structure.\n *\n * @example\n * ```typescript\n * const xstateConfig = {\n * id: 'toggle',\n * initial: 'inactive',\n * states: {\n * inactive: { on: { TOGGLE: 'active' } },\n * active: { on: { TOGGLE: 'inactive' } },\n * },\n * };\n *\n * const structure = analyzeXStateMachine(xstateConfig);\n * console.log(generateModuleCode(structure));\n * ```\n */\nexport function analyzeXStateMachine(config: XStateMachineConfig): DirectiveModuleStructure {\n\tconst facts: Record<string, string> = {\n\t\tstate: `t.string<${Object.keys(config.states).map(s => `'${s}'`).join(\" | \")}>()`,\n\t};\n\tconst derivations: Record<string, string> = {};\n\tconst deriveCode: Record<string, string> = {};\n\tconst events: Record<string, Record<string, string>> = {};\n\tconst eventsCode: Record<string, string> = {};\n\n\t// Add context to facts\n\tif (config.context) {\n\t\tfor (const [key, value] of Object.entries(config.context)) {\n\t\t\tfacts[key] = inferTypeString(value);\n\t\t}\n\t}\n\n\t// Generate state derivations (isActive, isInactive, etc.)\n\tfor (const stateName of Object.keys(config.states)) {\n\t\tconst derivationName = `is${capitalize(stateName)}`;\n\t\tderivations[derivationName] = \"t.boolean()\";\n\t\tderiveCode[derivationName] = `(facts) => facts.state === '${stateName}'`;\n\t}\n\n\t// Collect all events and their transitions\n\tconst eventTransitions = new Map<string, Map<string, string>>();\n\tfor (const [stateName, stateConfig] of Object.entries(config.states)) {\n\t\tif (!stateConfig.on) continue;\n\t\tfor (const [eventName, target] of Object.entries(stateConfig.on)) {\n\t\t\tif (!eventTransitions.has(eventName)) {\n\t\t\t\teventTransitions.set(eventName, new Map());\n\t\t\t}\n\t\t\tconst targetState = typeof target === \"string\" ? target : target.target;\n\t\t\teventTransitions.get(eventName)!.set(stateName, targetState);\n\t\t}\n\t}\n\n\t// Generate events and handlers\n\tfor (const [eventName, transitions] of eventTransitions) {\n\t\tevents[eventName] = {};\n\n\t\tif (transitions.size === 1) {\n\t\t\tconst firstEntry = [...transitions.entries()][0];\n\t\t\tconst toState = firstEntry ? firstEntry[1] : \"unknown\";\n\t\t\teventsCode[eventName] = `(facts) => {\\n facts.state = '${toState}';\\n }`;\n\t\t} else {\n\t\t\tconst cases = [...transitions.entries()]\n\t\t\t\t.map(([from, to]) => ` case '${from}': facts.state = '${to}'; break;`)\n\t\t\t\t.join(\"\\n\");\n\t\t\teventsCode[eventName] = `(facts) => {\\n switch (facts.state) {\\n${cases}\\n }\\n }`;\n\t\t}\n\t}\n\n\t// Generate init code\n\tconst initLines = [` facts.state = '${config.initial}';`];\n\tif (config.context) {\n\t\tfor (const [key, value] of Object.entries(config.context)) {\n\t\t\tinitLines.push(` facts.${key} = ${JSON.stringify(value)};`);\n\t\t}\n\t}\n\tconst initCode = `(facts) => {\\n${initLines.join(\"\\n\")}\\n }`;\n\n\treturn {\n\t\tname: config.id,\n\t\tfacts,\n\t\tderivations,\n\t\tevents,\n\t\trequirements: {},\n\t\tinitCode,\n\t\tderiveCode,\n\t\teventsCode,\n\t};\n}\n\n// ============================================================================\n// Code Generation\n// ============================================================================\n\n/**\n * Generate Directive module code from a structure.\n */\nexport function generateModuleCode(structure: DirectiveModuleStructure): string {\n\tconst lines: string[] = [\n\t\t`import { createModule, t } from '@directive-run/core';`,\n\t\t``,\n\t\t`const ${structure.name}Module = createModule('${structure.name}', {`,\n\t\t` schema: {`,\n\t\t` facts: {`,\n\t];\n\n\t// Facts\n\tfor (const [key, type] of Object.entries(structure.facts)) {\n\t\tlines.push(` ${key}: ${type},`);\n\t}\n\tlines.push(` },`);\n\n\t// Derivations\n\tlines.push(` derivations: {`);\n\tfor (const [key, type] of Object.entries(structure.derivations)) {\n\t\tlines.push(` ${key}: ${type},`);\n\t}\n\tlines.push(` },`);\n\n\t// Events\n\tlines.push(` events: {`);\n\tfor (const [key, schema] of Object.entries(structure.events)) {\n\t\tconst schemaStr = Object.entries(schema)\n\t\t\t.map(([k, v]) => `${k}: ${v}`)\n\t\t\t.join(\", \");\n\t\tlines.push(` ${key}: { ${schemaStr} },`);\n\t}\n\tlines.push(` },`);\n\n\t// Requirements\n\tlines.push(` requirements: {},`);\n\tlines.push(` },`);\n\n\t// Init\n\tlines.push(` init: ${structure.initCode},`);\n\n\t// Derive\n\tif (Object.keys(structure.deriveCode).length > 0) {\n\t\tlines.push(` derive: {`);\n\t\tfor (const [key, code] of Object.entries(structure.deriveCode)) {\n\t\t\tlines.push(` ${key}: ${code},`);\n\t\t}\n\t\tlines.push(` },`);\n\t}\n\n\t// Events handlers\n\tlines.push(` events: {`);\n\tfor (const [key, code] of Object.entries(structure.eventsCode)) {\n\t\tlines.push(` ${key}: ${code},`);\n\t}\n\tlines.push(` },`);\n\n\tlines.push(`});`);\n\tlines.push(``);\n\tlines.push(`export { ${structure.name}Module };`);\n\n\treturn lines.join(\"\\n\");\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Infer a t.* type string from a JavaScript value.\n */\nfunction inferTypeString(value: unknown): string {\n\tif (value === null) return \"t.any().nullable()\";\n\tif (value === undefined) return \"t.any().optional()\";\n\n\tswitch (typeof value) {\n\t\tcase \"number\":\n\t\t\treturn \"t.number()\";\n\t\tcase \"string\":\n\t\t\treturn \"t.string()\";\n\t\tcase \"boolean\":\n\t\t\treturn \"t.boolean()\";\n\t\tcase \"object\":\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\treturn \"t.array(t.any())\";\n\t\t\t}\n\t\t\treturn \"t.object()\";\n\t\tdefault:\n\t\t\treturn \"t.any()\";\n\t}\n}\n\n/**\n * Capitalize first letter.\n */\nfunction capitalize(str: string): string {\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n// ============================================================================\n// Migration Checklist Generator\n// ============================================================================\n\n/**\n * Generate a migration checklist for a given state management pattern.\n */\nexport function generateMigrationChecklist(\n\tsource: \"redux\" | \"zustand\" | \"xstate\",\n): string[] {\n\tconst common = [\n\t\t\"[ ] Install directive: pnpm add directive\",\n\t\t\"[ ] Create module file(s) for your state\",\n\t\t\"[ ] Define schema with facts, derivations, events\",\n\t\t\"[ ] Implement init function for initial state\",\n\t\t\"[ ] Implement event handlers\",\n\t\t\"[ ] Update imports in consuming code\",\n\t\t\"[ ] Test the new implementation\",\n\t\t\"[ ] Remove old state management code\",\n\t];\n\n\tconst sourceSpecific: Record<string, string[]> = {\n\t\tredux: [\n\t\t\t\"[ ] Convert reducers to event handlers\",\n\t\t\t\"[ ] Convert selectors to derivations\",\n\t\t\t\"[ ] Convert thunks to constraints + resolvers\",\n\t\t\t\"[ ] Update useSelector to useDerived\",\n\t\t\t\"[ ] Update useDispatch to system.dispatch\",\n\t\t],\n\t\tzustand: [\n\t\t\t\"[ ] Convert store state to facts\",\n\t\t\t\"[ ] Convert store actions to events\",\n\t\t\t\"[ ] Convert computed getters to derivations\",\n\t\t\t\"[ ] Update useStore hooks to useDirective hooks\",\n\t\t],\n\t\txstate: [\n\t\t\t\"[ ] Convert machine states to a 'state' fact\",\n\t\t\t\"[ ] Convert state checks to derivations (isActive, etc.)\",\n\t\t\t\"[ ] Convert events to Directive events\",\n\t\t\t\"[ ] Convert guards to constraint 'when' conditions\",\n\t\t\t\"[ ] Convert services/actors to constraints + resolvers\",\n\t\t\t\"[ ] Update useMachine to useDirective hooks\",\n\t\t],\n\t};\n\n\tconst specific = sourceSpecific[source] ?? [];\n\treturn [...specific, ...common];\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/migration.ts"],"names":["analyzeReduxSlice","config","facts","events","eventsCode","key","value","inferTypeString","reducerName","initCode","analyzeZustandStore","actionName","analyzeXStateMachine","s","derivations","deriveCode","stateName","derivationName","capitalize","eventTransitions","stateConfig","eventName","target","targetState","transitions","firstEntry","toState","cases","from","to","initLines","generateModuleCode","structure","lines","type","schema","schemaStr","k","v","code","str","generateMigrationChecklist","source","common"],"mappings":"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","file":"migration.cjs","sourcesContent":["/**\n * Migration Utilities for Directive\n *\n * Helpers for migrating from Redux, Zustand, or XState to Directive.\n * These utilities help you understand your existing state management\n * and generate equivalent Directive module structures.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Redux slice configuration (simplified) */\nexport interface ReduxSliceConfig {\n\tname: string;\n\tinitialState: Record<string, unknown>;\n\treducers: Record<string, (state: unknown, action?: { payload?: unknown }) => void>;\n}\n\n/** Zustand store configuration (simplified) */\nexport interface ZustandStoreConfig {\n\tstate: Record<string, unknown>;\n\tactions: Record<string, (...args: unknown[]) => void>;\n}\n\n/** XState machine configuration (simplified) */\nexport interface XStateMachineConfig {\n\tid: string;\n\tinitial: string;\n\tstates: Record<string, { on?: Record<string, string | { target: string }> }>;\n\tcontext?: Record<string, unknown>;\n}\n\n/** Generated Directive module structure */\nexport interface DirectiveModuleStructure {\n\tname: string;\n\tfacts: Record<string, string>;\n\tderivations: Record<string, string>;\n\tevents: Record<string, Record<string, string>>;\n\trequirements: Record<string, unknown>;\n\tinitCode: string;\n\tderiveCode: Record<string, string>;\n\teventsCode: Record<string, string>;\n}\n\n// ============================================================================\n// Redux Migration\n// ============================================================================\n\n/**\n * Analyze a Redux slice and generate a Directive module structure.\n *\n * @example\n * ```typescript\n * const reduxConfig = {\n * name: 'counter',\n * initialState: { value: 0, status: 'idle' },\n * reducers: {\n * increment: (state) => { state.value += 1; },\n * decrement: (state) => { state.value -= 1; },\n * },\n * };\n *\n * const structure = analyzeReduxSlice(reduxConfig);\n * console.log(generateModuleCode(structure));\n * ```\n */\nexport function analyzeReduxSlice(config: ReduxSliceConfig): DirectiveModuleStructure {\n\tconst facts: Record<string, string> = {};\n\tconst events: Record<string, Record<string, string>> = {};\n\tconst eventsCode: Record<string, string> = {};\n\n\t// Analyze initial state to generate facts\n\tfor (const [key, value] of Object.entries(config.initialState)) {\n\t\tfacts[key] = inferTypeString(value);\n\t}\n\n\t// Analyze reducers to generate events\n\tfor (const reducerName of Object.keys(config.reducers)) {\n\t\t// Simple heuristic: if reducer name suggests payload, add it\n\t\tconst hasPayload = reducerName.includes(\"By\") || reducerName.includes(\"Set\") || reducerName.includes(\"With\");\n\t\tif (hasPayload) {\n\t\t\tevents[reducerName] = { payload: \"t.object()\" };\n\t\t\teventsCode[reducerName] = `(facts, { payload }) => {\\n // TODO: Implement ${reducerName}\\n }`;\n\t\t} else {\n\t\t\tevents[reducerName] = {};\n\t\t\teventsCode[reducerName] = `(facts) => {\\n // TODO: Implement ${reducerName}\\n }`;\n\t\t}\n\t}\n\n\t// Generate init code\n\tconst initLines = Object.entries(config.initialState)\n\t\t.map(([key, value]) => ` facts.${key} = ${JSON.stringify(value)};`)\n\t\t.join(\"\\n\");\n\tconst initCode = `(facts) => {\\n${initLines}\\n }`;\n\n\treturn {\n\t\tname: config.name,\n\t\tfacts,\n\t\tderivations: {},\n\t\tevents,\n\t\trequirements: {},\n\t\tinitCode,\n\t\tderiveCode: {},\n\t\teventsCode,\n\t};\n}\n\n// ============================================================================\n// Zustand Migration\n// ============================================================================\n\n/**\n * Analyze a Zustand store and generate a Directive module structure.\n *\n * @example\n * ```typescript\n * const zustandConfig = {\n * state: { count: 0, loading: false },\n * actions: {\n * increment: () => {},\n * decrement: () => {},\n * setLoading: (loading: boolean) => {},\n * },\n * };\n *\n * const structure = analyzeZustandStore(zustandConfig);\n * console.log(generateModuleCode(structure));\n * ```\n */\nexport function analyzeZustandStore(config: ZustandStoreConfig): DirectiveModuleStructure {\n\tconst facts: Record<string, string> = {};\n\tconst events: Record<string, Record<string, string>> = {};\n\tconst eventsCode: Record<string, string> = {};\n\n\t// Analyze state\n\tfor (const [key, value] of Object.entries(config.state)) {\n\t\tfacts[key] = inferTypeString(value);\n\t}\n\n\t// Analyze actions\n\tfor (const actionName of Object.keys(config.actions)) {\n\t\tevents[actionName] = {};\n\t\teventsCode[actionName] = `(facts) => {\\n // TODO: Implement ${actionName}\\n }`;\n\t}\n\n\t// Generate init code\n\tconst initLines = Object.entries(config.state)\n\t\t.map(([key, value]) => ` facts.${key} = ${JSON.stringify(value)};`)\n\t\t.join(\"\\n\");\n\tconst initCode = `(facts) => {\\n${initLines}\\n }`;\n\n\treturn {\n\t\tname: \"store\",\n\t\tfacts,\n\t\tderivations: {},\n\t\tevents,\n\t\trequirements: {},\n\t\tinitCode,\n\t\tderiveCode: {},\n\t\teventsCode,\n\t};\n}\n\n// ============================================================================\n// XState Migration\n// ============================================================================\n\n/**\n * Analyze an XState machine and generate a Directive module structure.\n *\n * @example\n * ```typescript\n * const xstateConfig = {\n * id: 'toggle',\n * initial: 'inactive',\n * states: {\n * inactive: { on: { TOGGLE: 'active' } },\n * active: { on: { TOGGLE: 'inactive' } },\n * },\n * };\n *\n * const structure = analyzeXStateMachine(xstateConfig);\n * console.log(generateModuleCode(structure));\n * ```\n */\nexport function analyzeXStateMachine(config: XStateMachineConfig): DirectiveModuleStructure {\n\tconst facts: Record<string, string> = {\n\t\tstate: `t.string<${Object.keys(config.states).map(s => `'${s}'`).join(\" | \")}>()`,\n\t};\n\tconst derivations: Record<string, string> = {};\n\tconst deriveCode: Record<string, string> = {};\n\tconst events: Record<string, Record<string, string>> = {};\n\tconst eventsCode: Record<string, string> = {};\n\n\t// Add context to facts\n\tif (config.context) {\n\t\tfor (const [key, value] of Object.entries(config.context)) {\n\t\t\tfacts[key] = inferTypeString(value);\n\t\t}\n\t}\n\n\t// Generate state derivations (isActive, isInactive, etc.)\n\tfor (const stateName of Object.keys(config.states)) {\n\t\tconst derivationName = `is${capitalize(stateName)}`;\n\t\tderivations[derivationName] = \"t.boolean()\";\n\t\tderiveCode[derivationName] = `(facts) => facts.state === '${stateName}'`;\n\t}\n\n\t// Collect all events and their transitions\n\tconst eventTransitions = new Map<string, Map<string, string>>();\n\tfor (const [stateName, stateConfig] of Object.entries(config.states)) {\n\t\tif (!stateConfig.on) continue;\n\t\tfor (const [eventName, target] of Object.entries(stateConfig.on)) {\n\t\t\tif (!eventTransitions.has(eventName)) {\n\t\t\t\teventTransitions.set(eventName, new Map());\n\t\t\t}\n\t\t\tconst targetState = typeof target === \"string\" ? target : target.target;\n\t\t\teventTransitions.get(eventName)!.set(stateName, targetState);\n\t\t}\n\t}\n\n\t// Generate events and handlers\n\tfor (const [eventName, transitions] of eventTransitions) {\n\t\tevents[eventName] = {};\n\n\t\tif (transitions.size === 1) {\n\t\t\tconst firstEntry = [...transitions.entries()][0];\n\t\t\tconst toState = firstEntry ? firstEntry[1] : \"unknown\";\n\t\t\teventsCode[eventName] = `(facts) => {\\n facts.state = '${toState}';\\n }`;\n\t\t} else {\n\t\t\tconst cases = [...transitions.entries()]\n\t\t\t\t.map(([from, to]) => ` case '${from}': facts.state = '${to}'; break;`)\n\t\t\t\t.join(\"\\n\");\n\t\t\teventsCode[eventName] = `(facts) => {\\n switch (facts.state) {\\n${cases}\\n }\\n }`;\n\t\t}\n\t}\n\n\t// Generate init code\n\tconst initLines = [` facts.state = '${config.initial}';`];\n\tif (config.context) {\n\t\tfor (const [key, value] of Object.entries(config.context)) {\n\t\t\tinitLines.push(` facts.${key} = ${JSON.stringify(value)};`);\n\t\t}\n\t}\n\tconst initCode = `(facts) => {\\n${initLines.join(\"\\n\")}\\n }`;\n\n\treturn {\n\t\tname: config.id,\n\t\tfacts,\n\t\tderivations,\n\t\tevents,\n\t\trequirements: {},\n\t\tinitCode,\n\t\tderiveCode,\n\t\teventsCode,\n\t};\n}\n\n// ============================================================================\n// Code Generation\n// ============================================================================\n\n/**\n * Generate Directive module code from a structure.\n */\nexport function generateModuleCode(structure: DirectiveModuleStructure): string {\n\tconst lines: string[] = [\n\t\t`import { createModule, t } from '@directive-run/core';`,\n\t\t``,\n\t\t`const ${structure.name}Module = createModule('${structure.name}', {`,\n\t\t` schema: {`,\n\t\t` facts: {`,\n\t];\n\n\t// Facts\n\tfor (const [key, type] of Object.entries(structure.facts)) {\n\t\tlines.push(` ${key}: ${type},`);\n\t}\n\tlines.push(` },`);\n\n\t// Derivations\n\tlines.push(` derivations: {`);\n\tfor (const [key, type] of Object.entries(structure.derivations)) {\n\t\tlines.push(` ${key}: ${type},`);\n\t}\n\tlines.push(` },`);\n\n\t// Events\n\tlines.push(` events: {`);\n\tfor (const [key, schema] of Object.entries(structure.events)) {\n\t\tconst schemaStr = Object.entries(schema)\n\t\t\t.map(([k, v]) => `${k}: ${v}`)\n\t\t\t.join(\", \");\n\t\tlines.push(` ${key}: { ${schemaStr} },`);\n\t}\n\tlines.push(` },`);\n\n\t// Requirements\n\tlines.push(` requirements: {},`);\n\tlines.push(` },`);\n\n\t// Init\n\tlines.push(` init: ${structure.initCode},`);\n\n\t// Derive\n\tif (Object.keys(structure.deriveCode).length > 0) {\n\t\tlines.push(` derive: {`);\n\t\tfor (const [key, code] of Object.entries(structure.deriveCode)) {\n\t\t\tlines.push(` ${key}: ${code},`);\n\t\t}\n\t\tlines.push(` },`);\n\t}\n\n\t// Events handlers\n\tlines.push(` events: {`);\n\tfor (const [key, code] of Object.entries(structure.eventsCode)) {\n\t\tlines.push(` ${key}: ${code},`);\n\t}\n\tlines.push(` },`);\n\n\tlines.push(`});`);\n\tlines.push(``);\n\tlines.push(`export { ${structure.name}Module };`);\n\n\treturn lines.join(\"\\n\");\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Infer a t.* type string from a JavaScript value.\n */\nfunction inferTypeString(value: unknown): string {\n\tif (value === null) return \"t.object().nullable()\";\n\tif (value === undefined) return \"t.object().optional()\";\n\n\tswitch (typeof value) {\n\t\tcase \"number\":\n\t\t\treturn \"t.number()\";\n\t\tcase \"string\":\n\t\t\treturn \"t.string()\";\n\t\tcase \"boolean\":\n\t\t\treturn \"t.boolean()\";\n\t\tcase \"object\":\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\treturn \"t.array(t.object())\";\n\t\t\t}\n\t\t\treturn \"t.object()\";\n\t\tdefault:\n\t\t\treturn \"t.object()\";\n\t}\n}\n\n/**\n * Capitalize first letter.\n */\nfunction capitalize(str: string): string {\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n// ============================================================================\n// Migration Checklist Generator\n// ============================================================================\n\n/**\n * Generate a migration checklist for a given state management pattern.\n */\nexport function generateMigrationChecklist(\n\tsource: \"redux\" | \"zustand\" | \"xstate\",\n): string[] {\n\tconst common = [\n\t\t\"[ ] Install directive: pnpm add directive\",\n\t\t\"[ ] Create module file(s) for your state\",\n\t\t\"[ ] Define schema with facts, derivations, events\",\n\t\t\"[ ] Implement init function for initial state\",\n\t\t\"[ ] Implement event handlers\",\n\t\t\"[ ] Update imports in consuming code\",\n\t\t\"[ ] Test the new implementation\",\n\t\t\"[ ] Remove old state management code\",\n\t];\n\n\tconst sourceSpecific: Record<string, string[]> = {\n\t\tredux: [\n\t\t\t\"[ ] Convert reducers to event handlers\",\n\t\t\t\"[ ] Convert selectors to derivations\",\n\t\t\t\"[ ] Convert thunks to constraints + resolvers\",\n\t\t\t\"[ ] Update useSelector to useDerived\",\n\t\t\t\"[ ] Update useDispatch to system.dispatch\",\n\t\t],\n\t\tzustand: [\n\t\t\t\"[ ] Convert store state to facts\",\n\t\t\t\"[ ] Convert store actions to events\",\n\t\t\t\"[ ] Convert computed getters to derivations\",\n\t\t\t\"[ ] Update useStore hooks to useDirective hooks\",\n\t\t],\n\t\txstate: [\n\t\t\t\"[ ] Convert machine states to a 'state' fact\",\n\t\t\t\"[ ] Convert state checks to derivations (isActive, etc.)\",\n\t\t\t\"[ ] Convert events to Directive events\",\n\t\t\t\"[ ] Convert guards to constraint 'when' conditions\",\n\t\t\t\"[ ] Convert services/actors to constraints + resolvers\",\n\t\t\t\"[ ] Update useMachine to useDirective hooks\",\n\t\t],\n\t};\n\n\tconst specific = sourceSpecific[source] ?? [];\n\treturn [...specific, ...common];\n}\n"]}
|
package/dist/migration.js
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
function m(e){let t={},s={},i={};for(let[n,
|
|
1
|
+
function m(e){let t={},s={},i={};for(let[n,c]of Object.entries(e.initialState))t[n]=p(c);for(let n of Object.keys(e.reducers))n.includes("By")||n.includes("Set")||n.includes("With")?(s[n]={payload:"t.object()"},i[n]=`(facts, { payload }) => {
|
|
2
2
|
// TODO: Implement ${n}
|
|
3
3
|
}`):(s[n]={},i[n]=`(facts) => {
|
|
4
4
|
// TODO: Implement ${n}
|
|
5
|
-
}`);let
|
|
6
|
-
${Object.entries(e.initialState).map(([n,
|
|
5
|
+
}`);let a=`(facts) => {
|
|
6
|
+
${Object.entries(e.initialState).map(([n,c])=>` facts.${n} = ${JSON.stringify(c)};`).join(`
|
|
7
7
|
`)}
|
|
8
|
-
}`;return {name:e.name,facts:t,derivations:{},events:s,requirements:{},initCode:
|
|
8
|
+
}`;return {name:e.name,facts:t,derivations:{},events:s,requirements:{},initCode:a,deriveCode:{},eventsCode:i}}function h(e){let t={},s={},i={};for(let[n,c]of Object.entries(e.state))t[n]=p(c);for(let n of Object.keys(e.actions))s[n]={},i[n]=`(facts) => {
|
|
9
9
|
// TODO: Implement ${n}
|
|
10
|
-
}`;let
|
|
11
|
-
${Object.entries(e.state).map(([n,
|
|
10
|
+
}`;let a=`(facts) => {
|
|
11
|
+
${Object.entries(e.state).map(([n,c])=>` facts.${n} = ${JSON.stringify(c)};`).join(`
|
|
12
12
|
`)}
|
|
13
|
-
}`;return {name:"store",facts:t,derivations:{},events:s,requirements:{},initCode:
|
|
13
|
+
}`;return {name:"store",facts:t,derivations:{},events:s,requirements:{},initCode:a,deriveCode:{},eventsCode:i}}function C(e){let t={state:`t.string<${Object.keys(e.states).map(r=>`'${r}'`).join(" | ")}>()`},s={},i={},f={},a={};if(e.context)for(let[r,o]of Object.entries(e.context))t[r]=p(o);for(let r of Object.keys(e.states)){let o=`is${l(r)}`;s[o]="t.boolean()",i[o]=`(facts) => facts.state === '${r}'`;}let n=new Map;for(let[r,o]of Object.entries(e.states))if(o.on)for(let[d,u]of Object.entries(o.on)){n.has(d)||n.set(d,new Map);let g=typeof u=="string"?u:u.target;n.get(d).set(r,g);}for(let[r,o]of n)if(f[r]={},o.size===1){let d=[...o.entries()][0],u=d?d[1]:"unknown";a[r]=`(facts) => {
|
|
14
14
|
facts.state = '${u}';
|
|
15
15
|
}`;}else {let d=[...o.entries()].map(([u,g])=>` case '${u}': facts.state = '${g}'; break;`).join(`
|
|
16
|
-
`);
|
|
16
|
+
`);a[r]=`(facts) => {
|
|
17
17
|
switch (facts.state) {
|
|
18
18
|
${d}
|
|
19
19
|
}
|
|
20
|
-
}`;}let
|
|
21
|
-
${
|
|
20
|
+
}`;}let c=[` facts.state = '${e.initial}';`];if(e.context)for(let[r,o]of Object.entries(e.context))c.push(` facts.${r} = ${JSON.stringify(o)};`);let v=`(facts) => {
|
|
21
|
+
${c.join(`
|
|
22
22
|
`)}
|
|
23
|
-
}`;return {name:e.id,facts:t,derivations:s,events:f,requirements:{},initCode:v,deriveCode:i,eventsCode:
|
|
24
|
-
`)}function p(e){if(e===null)return "t.
|
|
23
|
+
}`;return {name:e.id,facts:t,derivations:s,events:f,requirements:{},initCode:v,deriveCode:i,eventsCode:a}}function y(e){let t=["import { createModule, t } from '@directive-run/core';","",`const ${e.name}Module = createModule('${e.name}', {`," schema: {"," facts: {"];for(let[s,i]of Object.entries(e.facts))t.push(` ${s}: ${i},`);t.push(" },"),t.push(" derivations: {");for(let[s,i]of Object.entries(e.derivations))t.push(` ${s}: ${i},`);t.push(" },"),t.push(" events: {");for(let[s,i]of Object.entries(e.events)){let f=Object.entries(i).map(([a,n])=>`${a}: ${n}`).join(", ");t.push(` ${s}: { ${f} },`);}if(t.push(" },"),t.push(" requirements: {},"),t.push(" },"),t.push(` init: ${e.initCode},`),Object.keys(e.deriveCode).length>0){t.push(" derive: {");for(let[s,i]of Object.entries(e.deriveCode))t.push(` ${s}: ${i},`);t.push(" },");}t.push(" events: {");for(let[s,i]of Object.entries(e.eventsCode))t.push(` ${s}: ${i},`);return t.push(" },"),t.push("});"),t.push(""),t.push(`export { ${e.name}Module };`),t.join(`
|
|
24
|
+
`)}function p(e){if(e===null)return "t.object().nullable()";if(e===void 0)return "t.object().optional()";switch(typeof e){case "number":return "t.number()";case "string":return "t.string()";case "boolean":return "t.boolean()";case "object":return Array.isArray(e)?"t.array(t.object())":"t.object()";default:return "t.object()"}}function l(e){return e.charAt(0).toUpperCase()+e.slice(1)}function $(e){let t=["[ ] Install directive: pnpm add directive","[ ] Create module file(s) for your state","[ ] Define schema with facts, derivations, events","[ ] Implement init function for initial state","[ ] Implement event handlers","[ ] Update imports in consuming code","[ ] Test the new implementation","[ ] Remove old state management code"];return [...{redux:["[ ] Convert reducers to event handlers","[ ] Convert selectors to derivations","[ ] Convert thunks to constraints + resolvers","[ ] Update useSelector to useDerived","[ ] Update useDispatch to system.dispatch"],zustand:["[ ] Convert store state to facts","[ ] Convert store actions to events","[ ] Convert computed getters to derivations","[ ] Update useStore hooks to useDirective hooks"],xstate:["[ ] Convert machine states to a 'state' fact","[ ] Convert state checks to derivations (isActive, etc.)","[ ] Convert events to Directive events","[ ] Convert guards to constraint 'when' conditions","[ ] Convert services/actors to constraints + resolvers","[ ] Update useMachine to useDirective hooks"]}[e]??[],...t]}export{m as analyzeReduxSlice,C as analyzeXStateMachine,h as analyzeZustandStore,$ as generateMigrationChecklist,y as generateModuleCode};//# sourceMappingURL=migration.js.map
|
|
25
25
|
//# sourceMappingURL=migration.js.map
|
package/dist/migration.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/migration.ts"],"names":["analyzeReduxSlice","config","facts","events","eventsCode","key","value","inferTypeString","reducerName","initCode","analyzeZustandStore","actionName","analyzeXStateMachine","s","derivations","deriveCode","stateName","derivationName","capitalize","eventTransitions","stateConfig","eventName","target","targetState","transitions","firstEntry","toState","cases","from","to","initLines","generateModuleCode","structure","lines","type","schema","schemaStr","k","v","code","str","generateMigrationChecklist","source","common"],"mappings":"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","file":"migration.js","sourcesContent":["/**\n * Migration Utilities for Directive\n *\n * Helpers for migrating from Redux, Zustand, or XState to Directive.\n * These utilities help you understand your existing state management\n * and generate equivalent Directive module structures.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Redux slice configuration (simplified) */\nexport interface ReduxSliceConfig {\n\tname: string;\n\tinitialState: Record<string, unknown>;\n\treducers: Record<string, (state: unknown, action?: { payload?: unknown }) => void>;\n}\n\n/** Zustand store configuration (simplified) */\nexport interface ZustandStoreConfig {\n\tstate: Record<string, unknown>;\n\tactions: Record<string, (...args: unknown[]) => void>;\n}\n\n/** XState machine configuration (simplified) */\nexport interface XStateMachineConfig {\n\tid: string;\n\tinitial: string;\n\tstates: Record<string, { on?: Record<string, string | { target: string }> }>;\n\tcontext?: Record<string, unknown>;\n}\n\n/** Generated Directive module structure */\nexport interface DirectiveModuleStructure {\n\tname: string;\n\tfacts: Record<string, string>;\n\tderivations: Record<string, string>;\n\tevents: Record<string, Record<string, string>>;\n\trequirements: Record<string, unknown>;\n\tinitCode: string;\n\tderiveCode: Record<string, string>;\n\teventsCode: Record<string, string>;\n}\n\n// ============================================================================\n// Redux Migration\n// ============================================================================\n\n/**\n * Analyze a Redux slice and generate a Directive module structure.\n *\n * @example\n * ```typescript\n * const reduxConfig = {\n * name: 'counter',\n * initialState: { value: 0, status: 'idle' },\n * reducers: {\n * increment: (state) => { state.value += 1; },\n * decrement: (state) => { state.value -= 1; },\n * },\n * };\n *\n * const structure = analyzeReduxSlice(reduxConfig);\n * console.log(generateModuleCode(structure));\n * ```\n */\nexport function analyzeReduxSlice(config: ReduxSliceConfig): DirectiveModuleStructure {\n\tconst facts: Record<string, string> = {};\n\tconst events: Record<string, Record<string, string>> = {};\n\tconst eventsCode: Record<string, string> = {};\n\n\t// Analyze initial state to generate facts\n\tfor (const [key, value] of Object.entries(config.initialState)) {\n\t\tfacts[key] = inferTypeString(value);\n\t}\n\n\t// Analyze reducers to generate events\n\tfor (const reducerName of Object.keys(config.reducers)) {\n\t\t// Simple heuristic: if reducer name suggests payload, add it\n\t\tconst hasPayload = reducerName.includes(\"By\") || reducerName.includes(\"Set\") || reducerName.includes(\"With\");\n\t\tif (hasPayload) {\n\t\t\tevents[reducerName] = { payload: \"t.any()\" };\n\t\t\teventsCode[reducerName] = `(facts, { payload }) => {\\n // TODO: Implement ${reducerName}\\n }`;\n\t\t} else {\n\t\t\tevents[reducerName] = {};\n\t\t\teventsCode[reducerName] = `(facts) => {\\n // TODO: Implement ${reducerName}\\n }`;\n\t\t}\n\t}\n\n\t// Generate init code\n\tconst initLines = Object.entries(config.initialState)\n\t\t.map(([key, value]) => ` facts.${key} = ${JSON.stringify(value)};`)\n\t\t.join(\"\\n\");\n\tconst initCode = `(facts) => {\\n${initLines}\\n }`;\n\n\treturn {\n\t\tname: config.name,\n\t\tfacts,\n\t\tderivations: {},\n\t\tevents,\n\t\trequirements: {},\n\t\tinitCode,\n\t\tderiveCode: {},\n\t\teventsCode,\n\t};\n}\n\n// ============================================================================\n// Zustand Migration\n// ============================================================================\n\n/**\n * Analyze a Zustand store and generate a Directive module structure.\n *\n * @example\n * ```typescript\n * const zustandConfig = {\n * state: { count: 0, loading: false },\n * actions: {\n * increment: () => {},\n * decrement: () => {},\n * setLoading: (loading: boolean) => {},\n * },\n * };\n *\n * const structure = analyzeZustandStore(zustandConfig);\n * console.log(generateModuleCode(structure));\n * ```\n */\nexport function analyzeZustandStore(config: ZustandStoreConfig): DirectiveModuleStructure {\n\tconst facts: Record<string, string> = {};\n\tconst events: Record<string, Record<string, string>> = {};\n\tconst eventsCode: Record<string, string> = {};\n\n\t// Analyze state\n\tfor (const [key, value] of Object.entries(config.state)) {\n\t\tfacts[key] = inferTypeString(value);\n\t}\n\n\t// Analyze actions\n\tfor (const actionName of Object.keys(config.actions)) {\n\t\tevents[actionName] = {};\n\t\teventsCode[actionName] = `(facts) => {\\n // TODO: Implement ${actionName}\\n }`;\n\t}\n\n\t// Generate init code\n\tconst initLines = Object.entries(config.state)\n\t\t.map(([key, value]) => ` facts.${key} = ${JSON.stringify(value)};`)\n\t\t.join(\"\\n\");\n\tconst initCode = `(facts) => {\\n${initLines}\\n }`;\n\n\treturn {\n\t\tname: \"store\",\n\t\tfacts,\n\t\tderivations: {},\n\t\tevents,\n\t\trequirements: {},\n\t\tinitCode,\n\t\tderiveCode: {},\n\t\teventsCode,\n\t};\n}\n\n// ============================================================================\n// XState Migration\n// ============================================================================\n\n/**\n * Analyze an XState machine and generate a Directive module structure.\n *\n * @example\n * ```typescript\n * const xstateConfig = {\n * id: 'toggle',\n * initial: 'inactive',\n * states: {\n * inactive: { on: { TOGGLE: 'active' } },\n * active: { on: { TOGGLE: 'inactive' } },\n * },\n * };\n *\n * const structure = analyzeXStateMachine(xstateConfig);\n * console.log(generateModuleCode(structure));\n * ```\n */\nexport function analyzeXStateMachine(config: XStateMachineConfig): DirectiveModuleStructure {\n\tconst facts: Record<string, string> = {\n\t\tstate: `t.string<${Object.keys(config.states).map(s => `'${s}'`).join(\" | \")}>()`,\n\t};\n\tconst derivations: Record<string, string> = {};\n\tconst deriveCode: Record<string, string> = {};\n\tconst events: Record<string, Record<string, string>> = {};\n\tconst eventsCode: Record<string, string> = {};\n\n\t// Add context to facts\n\tif (config.context) {\n\t\tfor (const [key, value] of Object.entries(config.context)) {\n\t\t\tfacts[key] = inferTypeString(value);\n\t\t}\n\t}\n\n\t// Generate state derivations (isActive, isInactive, etc.)\n\tfor (const stateName of Object.keys(config.states)) {\n\t\tconst derivationName = `is${capitalize(stateName)}`;\n\t\tderivations[derivationName] = \"t.boolean()\";\n\t\tderiveCode[derivationName] = `(facts) => facts.state === '${stateName}'`;\n\t}\n\n\t// Collect all events and their transitions\n\tconst eventTransitions = new Map<string, Map<string, string>>();\n\tfor (const [stateName, stateConfig] of Object.entries(config.states)) {\n\t\tif (!stateConfig.on) continue;\n\t\tfor (const [eventName, target] of Object.entries(stateConfig.on)) {\n\t\t\tif (!eventTransitions.has(eventName)) {\n\t\t\t\teventTransitions.set(eventName, new Map());\n\t\t\t}\n\t\t\tconst targetState = typeof target === \"string\" ? target : target.target;\n\t\t\teventTransitions.get(eventName)!.set(stateName, targetState);\n\t\t}\n\t}\n\n\t// Generate events and handlers\n\tfor (const [eventName, transitions] of eventTransitions) {\n\t\tevents[eventName] = {};\n\n\t\tif (transitions.size === 1) {\n\t\t\tconst firstEntry = [...transitions.entries()][0];\n\t\t\tconst toState = firstEntry ? firstEntry[1] : \"unknown\";\n\t\t\teventsCode[eventName] = `(facts) => {\\n facts.state = '${toState}';\\n }`;\n\t\t} else {\n\t\t\tconst cases = [...transitions.entries()]\n\t\t\t\t.map(([from, to]) => ` case '${from}': facts.state = '${to}'; break;`)\n\t\t\t\t.join(\"\\n\");\n\t\t\teventsCode[eventName] = `(facts) => {\\n switch (facts.state) {\\n${cases}\\n }\\n }`;\n\t\t}\n\t}\n\n\t// Generate init code\n\tconst initLines = [` facts.state = '${config.initial}';`];\n\tif (config.context) {\n\t\tfor (const [key, value] of Object.entries(config.context)) {\n\t\t\tinitLines.push(` facts.${key} = ${JSON.stringify(value)};`);\n\t\t}\n\t}\n\tconst initCode = `(facts) => {\\n${initLines.join(\"\\n\")}\\n }`;\n\n\treturn {\n\t\tname: config.id,\n\t\tfacts,\n\t\tderivations,\n\t\tevents,\n\t\trequirements: {},\n\t\tinitCode,\n\t\tderiveCode,\n\t\teventsCode,\n\t};\n}\n\n// ============================================================================\n// Code Generation\n// ============================================================================\n\n/**\n * Generate Directive module code from a structure.\n */\nexport function generateModuleCode(structure: DirectiveModuleStructure): string {\n\tconst lines: string[] = [\n\t\t`import { createModule, t } from '@directive-run/core';`,\n\t\t``,\n\t\t`const ${structure.name}Module = createModule('${structure.name}', {`,\n\t\t` schema: {`,\n\t\t` facts: {`,\n\t];\n\n\t// Facts\n\tfor (const [key, type] of Object.entries(structure.facts)) {\n\t\tlines.push(` ${key}: ${type},`);\n\t}\n\tlines.push(` },`);\n\n\t// Derivations\n\tlines.push(` derivations: {`);\n\tfor (const [key, type] of Object.entries(structure.derivations)) {\n\t\tlines.push(` ${key}: ${type},`);\n\t}\n\tlines.push(` },`);\n\n\t// Events\n\tlines.push(` events: {`);\n\tfor (const [key, schema] of Object.entries(structure.events)) {\n\t\tconst schemaStr = Object.entries(schema)\n\t\t\t.map(([k, v]) => `${k}: ${v}`)\n\t\t\t.join(\", \");\n\t\tlines.push(` ${key}: { ${schemaStr} },`);\n\t}\n\tlines.push(` },`);\n\n\t// Requirements\n\tlines.push(` requirements: {},`);\n\tlines.push(` },`);\n\n\t// Init\n\tlines.push(` init: ${structure.initCode},`);\n\n\t// Derive\n\tif (Object.keys(structure.deriveCode).length > 0) {\n\t\tlines.push(` derive: {`);\n\t\tfor (const [key, code] of Object.entries(structure.deriveCode)) {\n\t\t\tlines.push(` ${key}: ${code},`);\n\t\t}\n\t\tlines.push(` },`);\n\t}\n\n\t// Events handlers\n\tlines.push(` events: {`);\n\tfor (const [key, code] of Object.entries(structure.eventsCode)) {\n\t\tlines.push(` ${key}: ${code},`);\n\t}\n\tlines.push(` },`);\n\n\tlines.push(`});`);\n\tlines.push(``);\n\tlines.push(`export { ${structure.name}Module };`);\n\n\treturn lines.join(\"\\n\");\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Infer a t.* type string from a JavaScript value.\n */\nfunction inferTypeString(value: unknown): string {\n\tif (value === null) return \"t.any().nullable()\";\n\tif (value === undefined) return \"t.any().optional()\";\n\n\tswitch (typeof value) {\n\t\tcase \"number\":\n\t\t\treturn \"t.number()\";\n\t\tcase \"string\":\n\t\t\treturn \"t.string()\";\n\t\tcase \"boolean\":\n\t\t\treturn \"t.boolean()\";\n\t\tcase \"object\":\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\treturn \"t.array(t.any())\";\n\t\t\t}\n\t\t\treturn \"t.object()\";\n\t\tdefault:\n\t\t\treturn \"t.any()\";\n\t}\n}\n\n/**\n * Capitalize first letter.\n */\nfunction capitalize(str: string): string {\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n// ============================================================================\n// Migration Checklist Generator\n// ============================================================================\n\n/**\n * Generate a migration checklist for a given state management pattern.\n */\nexport function generateMigrationChecklist(\n\tsource: \"redux\" | \"zustand\" | \"xstate\",\n): string[] {\n\tconst common = [\n\t\t\"[ ] Install directive: pnpm add directive\",\n\t\t\"[ ] Create module file(s) for your state\",\n\t\t\"[ ] Define schema with facts, derivations, events\",\n\t\t\"[ ] Implement init function for initial state\",\n\t\t\"[ ] Implement event handlers\",\n\t\t\"[ ] Update imports in consuming code\",\n\t\t\"[ ] Test the new implementation\",\n\t\t\"[ ] Remove old state management code\",\n\t];\n\n\tconst sourceSpecific: Record<string, string[]> = {\n\t\tredux: [\n\t\t\t\"[ ] Convert reducers to event handlers\",\n\t\t\t\"[ ] Convert selectors to derivations\",\n\t\t\t\"[ ] Convert thunks to constraints + resolvers\",\n\t\t\t\"[ ] Update useSelector to useDerived\",\n\t\t\t\"[ ] Update useDispatch to system.dispatch\",\n\t\t],\n\t\tzustand: [\n\t\t\t\"[ ] Convert store state to facts\",\n\t\t\t\"[ ] Convert store actions to events\",\n\t\t\t\"[ ] Convert computed getters to derivations\",\n\t\t\t\"[ ] Update useStore hooks to useDirective hooks\",\n\t\t],\n\t\txstate: [\n\t\t\t\"[ ] Convert machine states to a 'state' fact\",\n\t\t\t\"[ ] Convert state checks to derivations (isActive, etc.)\",\n\t\t\t\"[ ] Convert events to Directive events\",\n\t\t\t\"[ ] Convert guards to constraint 'when' conditions\",\n\t\t\t\"[ ] Convert services/actors to constraints + resolvers\",\n\t\t\t\"[ ] Update useMachine to useDirective hooks\",\n\t\t],\n\t};\n\n\tconst specific = sourceSpecific[source] ?? [];\n\treturn [...specific, ...common];\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/migration.ts"],"names":["analyzeReduxSlice","config","facts","events","eventsCode","key","value","inferTypeString","reducerName","initCode","analyzeZustandStore","actionName","analyzeXStateMachine","s","derivations","deriveCode","stateName","derivationName","capitalize","eventTransitions","stateConfig","eventName","target","targetState","transitions","firstEntry","toState","cases","from","to","initLines","generateModuleCode","structure","lines","type","schema","schemaStr","k","v","code","str","generateMigrationChecklist","source","common"],"mappings":"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","file":"migration.js","sourcesContent":["/**\n * Migration Utilities for Directive\n *\n * Helpers for migrating from Redux, Zustand, or XState to Directive.\n * These utilities help you understand your existing state management\n * and generate equivalent Directive module structures.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Redux slice configuration (simplified) */\nexport interface ReduxSliceConfig {\n\tname: string;\n\tinitialState: Record<string, unknown>;\n\treducers: Record<string, (state: unknown, action?: { payload?: unknown }) => void>;\n}\n\n/** Zustand store configuration (simplified) */\nexport interface ZustandStoreConfig {\n\tstate: Record<string, unknown>;\n\tactions: Record<string, (...args: unknown[]) => void>;\n}\n\n/** XState machine configuration (simplified) */\nexport interface XStateMachineConfig {\n\tid: string;\n\tinitial: string;\n\tstates: Record<string, { on?: Record<string, string | { target: string }> }>;\n\tcontext?: Record<string, unknown>;\n}\n\n/** Generated Directive module structure */\nexport interface DirectiveModuleStructure {\n\tname: string;\n\tfacts: Record<string, string>;\n\tderivations: Record<string, string>;\n\tevents: Record<string, Record<string, string>>;\n\trequirements: Record<string, unknown>;\n\tinitCode: string;\n\tderiveCode: Record<string, string>;\n\teventsCode: Record<string, string>;\n}\n\n// ============================================================================\n// Redux Migration\n// ============================================================================\n\n/**\n * Analyze a Redux slice and generate a Directive module structure.\n *\n * @example\n * ```typescript\n * const reduxConfig = {\n * name: 'counter',\n * initialState: { value: 0, status: 'idle' },\n * reducers: {\n * increment: (state) => { state.value += 1; },\n * decrement: (state) => { state.value -= 1; },\n * },\n * };\n *\n * const structure = analyzeReduxSlice(reduxConfig);\n * console.log(generateModuleCode(structure));\n * ```\n */\nexport function analyzeReduxSlice(config: ReduxSliceConfig): DirectiveModuleStructure {\n\tconst facts: Record<string, string> = {};\n\tconst events: Record<string, Record<string, string>> = {};\n\tconst eventsCode: Record<string, string> = {};\n\n\t// Analyze initial state to generate facts\n\tfor (const [key, value] of Object.entries(config.initialState)) {\n\t\tfacts[key] = inferTypeString(value);\n\t}\n\n\t// Analyze reducers to generate events\n\tfor (const reducerName of Object.keys(config.reducers)) {\n\t\t// Simple heuristic: if reducer name suggests payload, add it\n\t\tconst hasPayload = reducerName.includes(\"By\") || reducerName.includes(\"Set\") || reducerName.includes(\"With\");\n\t\tif (hasPayload) {\n\t\t\tevents[reducerName] = { payload: \"t.object()\" };\n\t\t\teventsCode[reducerName] = `(facts, { payload }) => {\\n // TODO: Implement ${reducerName}\\n }`;\n\t\t} else {\n\t\t\tevents[reducerName] = {};\n\t\t\teventsCode[reducerName] = `(facts) => {\\n // TODO: Implement ${reducerName}\\n }`;\n\t\t}\n\t}\n\n\t// Generate init code\n\tconst initLines = Object.entries(config.initialState)\n\t\t.map(([key, value]) => ` facts.${key} = ${JSON.stringify(value)};`)\n\t\t.join(\"\\n\");\n\tconst initCode = `(facts) => {\\n${initLines}\\n }`;\n\n\treturn {\n\t\tname: config.name,\n\t\tfacts,\n\t\tderivations: {},\n\t\tevents,\n\t\trequirements: {},\n\t\tinitCode,\n\t\tderiveCode: {},\n\t\teventsCode,\n\t};\n}\n\n// ============================================================================\n// Zustand Migration\n// ============================================================================\n\n/**\n * Analyze a Zustand store and generate a Directive module structure.\n *\n * @example\n * ```typescript\n * const zustandConfig = {\n * state: { count: 0, loading: false },\n * actions: {\n * increment: () => {},\n * decrement: () => {},\n * setLoading: (loading: boolean) => {},\n * },\n * };\n *\n * const structure = analyzeZustandStore(zustandConfig);\n * console.log(generateModuleCode(structure));\n * ```\n */\nexport function analyzeZustandStore(config: ZustandStoreConfig): DirectiveModuleStructure {\n\tconst facts: Record<string, string> = {};\n\tconst events: Record<string, Record<string, string>> = {};\n\tconst eventsCode: Record<string, string> = {};\n\n\t// Analyze state\n\tfor (const [key, value] of Object.entries(config.state)) {\n\t\tfacts[key] = inferTypeString(value);\n\t}\n\n\t// Analyze actions\n\tfor (const actionName of Object.keys(config.actions)) {\n\t\tevents[actionName] = {};\n\t\teventsCode[actionName] = `(facts) => {\\n // TODO: Implement ${actionName}\\n }`;\n\t}\n\n\t// Generate init code\n\tconst initLines = Object.entries(config.state)\n\t\t.map(([key, value]) => ` facts.${key} = ${JSON.stringify(value)};`)\n\t\t.join(\"\\n\");\n\tconst initCode = `(facts) => {\\n${initLines}\\n }`;\n\n\treturn {\n\t\tname: \"store\",\n\t\tfacts,\n\t\tderivations: {},\n\t\tevents,\n\t\trequirements: {},\n\t\tinitCode,\n\t\tderiveCode: {},\n\t\teventsCode,\n\t};\n}\n\n// ============================================================================\n// XState Migration\n// ============================================================================\n\n/**\n * Analyze an XState machine and generate a Directive module structure.\n *\n * @example\n * ```typescript\n * const xstateConfig = {\n * id: 'toggle',\n * initial: 'inactive',\n * states: {\n * inactive: { on: { TOGGLE: 'active' } },\n * active: { on: { TOGGLE: 'inactive' } },\n * },\n * };\n *\n * const structure = analyzeXStateMachine(xstateConfig);\n * console.log(generateModuleCode(structure));\n * ```\n */\nexport function analyzeXStateMachine(config: XStateMachineConfig): DirectiveModuleStructure {\n\tconst facts: Record<string, string> = {\n\t\tstate: `t.string<${Object.keys(config.states).map(s => `'${s}'`).join(\" | \")}>()`,\n\t};\n\tconst derivations: Record<string, string> = {};\n\tconst deriveCode: Record<string, string> = {};\n\tconst events: Record<string, Record<string, string>> = {};\n\tconst eventsCode: Record<string, string> = {};\n\n\t// Add context to facts\n\tif (config.context) {\n\t\tfor (const [key, value] of Object.entries(config.context)) {\n\t\t\tfacts[key] = inferTypeString(value);\n\t\t}\n\t}\n\n\t// Generate state derivations (isActive, isInactive, etc.)\n\tfor (const stateName of Object.keys(config.states)) {\n\t\tconst derivationName = `is${capitalize(stateName)}`;\n\t\tderivations[derivationName] = \"t.boolean()\";\n\t\tderiveCode[derivationName] = `(facts) => facts.state === '${stateName}'`;\n\t}\n\n\t// Collect all events and their transitions\n\tconst eventTransitions = new Map<string, Map<string, string>>();\n\tfor (const [stateName, stateConfig] of Object.entries(config.states)) {\n\t\tif (!stateConfig.on) continue;\n\t\tfor (const [eventName, target] of Object.entries(stateConfig.on)) {\n\t\t\tif (!eventTransitions.has(eventName)) {\n\t\t\t\teventTransitions.set(eventName, new Map());\n\t\t\t}\n\t\t\tconst targetState = typeof target === \"string\" ? target : target.target;\n\t\t\teventTransitions.get(eventName)!.set(stateName, targetState);\n\t\t}\n\t}\n\n\t// Generate events and handlers\n\tfor (const [eventName, transitions] of eventTransitions) {\n\t\tevents[eventName] = {};\n\n\t\tif (transitions.size === 1) {\n\t\t\tconst firstEntry = [...transitions.entries()][0];\n\t\t\tconst toState = firstEntry ? firstEntry[1] : \"unknown\";\n\t\t\teventsCode[eventName] = `(facts) => {\\n facts.state = '${toState}';\\n }`;\n\t\t} else {\n\t\t\tconst cases = [...transitions.entries()]\n\t\t\t\t.map(([from, to]) => ` case '${from}': facts.state = '${to}'; break;`)\n\t\t\t\t.join(\"\\n\");\n\t\t\teventsCode[eventName] = `(facts) => {\\n switch (facts.state) {\\n${cases}\\n }\\n }`;\n\t\t}\n\t}\n\n\t// Generate init code\n\tconst initLines = [` facts.state = '${config.initial}';`];\n\tif (config.context) {\n\t\tfor (const [key, value] of Object.entries(config.context)) {\n\t\t\tinitLines.push(` facts.${key} = ${JSON.stringify(value)};`);\n\t\t}\n\t}\n\tconst initCode = `(facts) => {\\n${initLines.join(\"\\n\")}\\n }`;\n\n\treturn {\n\t\tname: config.id,\n\t\tfacts,\n\t\tderivations,\n\t\tevents,\n\t\trequirements: {},\n\t\tinitCode,\n\t\tderiveCode,\n\t\teventsCode,\n\t};\n}\n\n// ============================================================================\n// Code Generation\n// ============================================================================\n\n/**\n * Generate Directive module code from a structure.\n */\nexport function generateModuleCode(structure: DirectiveModuleStructure): string {\n\tconst lines: string[] = [\n\t\t`import { createModule, t } from '@directive-run/core';`,\n\t\t``,\n\t\t`const ${structure.name}Module = createModule('${structure.name}', {`,\n\t\t` schema: {`,\n\t\t` facts: {`,\n\t];\n\n\t// Facts\n\tfor (const [key, type] of Object.entries(structure.facts)) {\n\t\tlines.push(` ${key}: ${type},`);\n\t}\n\tlines.push(` },`);\n\n\t// Derivations\n\tlines.push(` derivations: {`);\n\tfor (const [key, type] of Object.entries(structure.derivations)) {\n\t\tlines.push(` ${key}: ${type},`);\n\t}\n\tlines.push(` },`);\n\n\t// Events\n\tlines.push(` events: {`);\n\tfor (const [key, schema] of Object.entries(structure.events)) {\n\t\tconst schemaStr = Object.entries(schema)\n\t\t\t.map(([k, v]) => `${k}: ${v}`)\n\t\t\t.join(\", \");\n\t\tlines.push(` ${key}: { ${schemaStr} },`);\n\t}\n\tlines.push(` },`);\n\n\t// Requirements\n\tlines.push(` requirements: {},`);\n\tlines.push(` },`);\n\n\t// Init\n\tlines.push(` init: ${structure.initCode},`);\n\n\t// Derive\n\tif (Object.keys(structure.deriveCode).length > 0) {\n\t\tlines.push(` derive: {`);\n\t\tfor (const [key, code] of Object.entries(structure.deriveCode)) {\n\t\t\tlines.push(` ${key}: ${code},`);\n\t\t}\n\t\tlines.push(` },`);\n\t}\n\n\t// Events handlers\n\tlines.push(` events: {`);\n\tfor (const [key, code] of Object.entries(structure.eventsCode)) {\n\t\tlines.push(` ${key}: ${code},`);\n\t}\n\tlines.push(` },`);\n\n\tlines.push(`});`);\n\tlines.push(``);\n\tlines.push(`export { ${structure.name}Module };`);\n\n\treturn lines.join(\"\\n\");\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Infer a t.* type string from a JavaScript value.\n */\nfunction inferTypeString(value: unknown): string {\n\tif (value === null) return \"t.object().nullable()\";\n\tif (value === undefined) return \"t.object().optional()\";\n\n\tswitch (typeof value) {\n\t\tcase \"number\":\n\t\t\treturn \"t.number()\";\n\t\tcase \"string\":\n\t\t\treturn \"t.string()\";\n\t\tcase \"boolean\":\n\t\t\treturn \"t.boolean()\";\n\t\tcase \"object\":\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\treturn \"t.array(t.object())\";\n\t\t\t}\n\t\t\treturn \"t.object()\";\n\t\tdefault:\n\t\t\treturn \"t.object()\";\n\t}\n}\n\n/**\n * Capitalize first letter.\n */\nfunction capitalize(str: string): string {\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n// ============================================================================\n// Migration Checklist Generator\n// ============================================================================\n\n/**\n * Generate a migration checklist for a given state management pattern.\n */\nexport function generateMigrationChecklist(\n\tsource: \"redux\" | \"zustand\" | \"xstate\",\n): string[] {\n\tconst common = [\n\t\t\"[ ] Install directive: pnpm add directive\",\n\t\t\"[ ] Create module file(s) for your state\",\n\t\t\"[ ] Define schema with facts, derivations, events\",\n\t\t\"[ ] Implement init function for initial state\",\n\t\t\"[ ] Implement event handlers\",\n\t\t\"[ ] Update imports in consuming code\",\n\t\t\"[ ] Test the new implementation\",\n\t\t\"[ ] Remove old state management code\",\n\t];\n\n\tconst sourceSpecific: Record<string, string[]> = {\n\t\tredux: [\n\t\t\t\"[ ] Convert reducers to event handlers\",\n\t\t\t\"[ ] Convert selectors to derivations\",\n\t\t\t\"[ ] Convert thunks to constraints + resolvers\",\n\t\t\t\"[ ] Update useSelector to useDerived\",\n\t\t\t\"[ ] Update useDispatch to system.dispatch\",\n\t\t],\n\t\tzustand: [\n\t\t\t\"[ ] Convert store state to facts\",\n\t\t\t\"[ ] Convert store actions to events\",\n\t\t\t\"[ ] Convert computed getters to derivations\",\n\t\t\t\"[ ] Update useStore hooks to useDirective hooks\",\n\t\t],\n\t\txstate: [\n\t\t\t\"[ ] Convert machine states to a 'state' fact\",\n\t\t\t\"[ ] Convert state checks to derivations (isActive, etc.)\",\n\t\t\t\"[ ] Convert events to Directive events\",\n\t\t\t\"[ ] Convert guards to constraint 'when' conditions\",\n\t\t\t\"[ ] Convert services/actors to constraints + resolvers\",\n\t\t\t\"[ ] Update useMachine to useDirective hooks\",\n\t\t],\n\t};\n\n\tconst specific = sourceSpecific[source] ?? [];\n\treturn [...specific, ...common];\n}\n"]}
|
package/dist/plugins/index.d.cts
CHANGED
package/dist/plugins/index.d.ts
CHANGED
|
@@ -1357,6 +1357,12 @@ interface ModuleDef<M extends ModuleSchema = ModuleSchema> {
|
|
|
1357
1357
|
constraints?: TypedConstraintsDef<M>;
|
|
1358
1358
|
resolvers?: TypedResolversDef<M>;
|
|
1359
1359
|
hooks?: ModuleHooks<M>;
|
|
1360
|
+
/**
|
|
1361
|
+
* Events that create time-travel snapshots.
|
|
1362
|
+
* If omitted, ALL events create snapshots (default).
|
|
1363
|
+
* If provided, only listed events create snapshots for undo/redo.
|
|
1364
|
+
*/
|
|
1365
|
+
snapshotEvents?: Array<keyof GetEventsSchema<M> & string>;
|
|
1360
1366
|
/**
|
|
1361
1367
|
* Cross-module dependencies (runtime marker).
|
|
1362
1368
|
* When present, constraints/effects receive `facts.self.*` + `facts.{dep}.*`.
|
|
@@ -1401,6 +1407,8 @@ type EventsAccessor<M extends ModuleSchema> = EventsAccessorFromSchema<M>;
|
|
|
1401
1407
|
interface DebugConfig {
|
|
1402
1408
|
timeTravel?: boolean;
|
|
1403
1409
|
maxSnapshots?: number;
|
|
1410
|
+
/** Only snapshot events from these modules. Omit to snapshot all modules. Multi-module only. */
|
|
1411
|
+
snapshotModules?: string[];
|
|
1404
1412
|
}
|
|
1405
1413
|
/** Time-travel API */
|
|
1406
1414
|
interface TimeTravelAPI {
|
|
@@ -1511,7 +1519,9 @@ interface DistributableSnapshotOptions {
|
|
|
1511
1519
|
*
|
|
1512
1520
|
* // Later, in an API route (no Directive runtime needed)
|
|
1513
1521
|
* const cached = JSON.parse(await redis.get(`entitlements:${userId}`));
|
|
1514
|
-
* if (!cached.data.canUseFeature.api)
|
|
1522
|
+
* if (!cached.data.canUseFeature.api) {
|
|
1523
|
+
* throw new ForbiddenError();
|
|
1524
|
+
* }
|
|
1515
1525
|
* ```
|
|
1516
1526
|
*/
|
|
1517
1527
|
interface DistributableSnapshot<T = Record<string, unknown>> {
|
|
@@ -1357,6 +1357,12 @@ interface ModuleDef<M extends ModuleSchema = ModuleSchema> {
|
|
|
1357
1357
|
constraints?: TypedConstraintsDef<M>;
|
|
1358
1358
|
resolvers?: TypedResolversDef<M>;
|
|
1359
1359
|
hooks?: ModuleHooks<M>;
|
|
1360
|
+
/**
|
|
1361
|
+
* Events that create time-travel snapshots.
|
|
1362
|
+
* If omitted, ALL events create snapshots (default).
|
|
1363
|
+
* If provided, only listed events create snapshots for undo/redo.
|
|
1364
|
+
*/
|
|
1365
|
+
snapshotEvents?: Array<keyof GetEventsSchema<M> & string>;
|
|
1360
1366
|
/**
|
|
1361
1367
|
* Cross-module dependencies (runtime marker).
|
|
1362
1368
|
* When present, constraints/effects receive `facts.self.*` + `facts.{dep}.*`.
|
|
@@ -1401,6 +1407,8 @@ type EventsAccessor<M extends ModuleSchema> = EventsAccessorFromSchema<M>;
|
|
|
1401
1407
|
interface DebugConfig {
|
|
1402
1408
|
timeTravel?: boolean;
|
|
1403
1409
|
maxSnapshots?: number;
|
|
1410
|
+
/** Only snapshot events from these modules. Omit to snapshot all modules. Multi-module only. */
|
|
1411
|
+
snapshotModules?: string[];
|
|
1404
1412
|
}
|
|
1405
1413
|
/** Time-travel API */
|
|
1406
1414
|
interface TimeTravelAPI {
|
|
@@ -1511,7 +1519,9 @@ interface DistributableSnapshotOptions {
|
|
|
1511
1519
|
*
|
|
1512
1520
|
* // Later, in an API route (no Directive runtime needed)
|
|
1513
1521
|
* const cached = JSON.parse(await redis.get(`entitlements:${userId}`));
|
|
1514
|
-
* if (!cached.data.canUseFeature.api)
|
|
1522
|
+
* if (!cached.data.canUseFeature.api) {
|
|
1523
|
+
* throw new ForbiddenError();
|
|
1524
|
+
* }
|
|
1515
1525
|
* ```
|
|
1516
1526
|
*/
|
|
1517
1527
|
interface DistributableSnapshot<T = Record<string, unknown>> {
|