@directive-run/core 0.4.0 → 0.4.2
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/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +833 -187
- package/dist/index.d.ts +833 -187
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/migration.cjs.map +1 -1
- package/dist/migration.js.map +1 -1
- package/dist/plugins/index.cjs.map +1 -1
- package/dist/plugins/index.d.cts +85 -18
- package/dist/plugins/index.d.ts +85 -18
- package/dist/plugins/index.js.map +1 -1
- package/dist/testing.cjs +1 -1
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +142 -26
- package/dist/testing.d.ts +142 -26
- package/dist/testing.js +1 -1
- package/dist/testing.js.map +1 -1
- package/dist/worker.cjs +1 -1
- package/dist/worker.cjs.map +1 -1
- package/dist/worker.js +1 -1
- package/dist/worker.js.map +1 -1
- package/package.json +3 -2
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 name: string;\n initialState: Record<string, unknown>;\n reducers: Record<\n string,\n (state: unknown, action?: { payload?: unknown }) => void\n >;\n}\n\n/** Zustand store configuration (simplified) */\nexport interface ZustandStoreConfig {\n state: Record<string, unknown>;\n actions: Record<string, (...args: unknown[]) => void>;\n}\n\n/** XState machine configuration (simplified) */\nexport interface XStateMachineConfig {\n id: string;\n initial: string;\n states: Record<string, { on?: Record<string, string | { target: string }> }>;\n context?: Record<string, unknown>;\n}\n\n/** Generated Directive module structure */\nexport interface DirectiveModuleStructure {\n name: string;\n facts: Record<string, string>;\n derivations: Record<string, string>;\n events: Record<string, Record<string, string>>;\n requirements: Record<string, unknown>;\n initCode: string;\n deriveCode: Record<string, string>;\n eventsCode: 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(\n config: ReduxSliceConfig,\n): DirectiveModuleStructure {\n const facts: Record<string, string> = {};\n const events: Record<string, Record<string, string>> = {};\n const eventsCode: Record<string, string> = {};\n\n // Analyze initial state to generate facts\n for (const [key, value] of Object.entries(config.initialState)) {\n facts[key] = inferTypeString(value);\n }\n\n // Analyze reducers to generate events\n for (const reducerName of Object.keys(config.reducers)) {\n // Simple heuristic: if reducer name suggests payload, add it\n const hasPayload =\n reducerName.includes(\"By\") ||\n reducerName.includes(\"Set\") ||\n reducerName.includes(\"With\");\n if (hasPayload) {\n events[reducerName] = { payload: \"t.object()\" };\n eventsCode[reducerName] =\n `(facts, { payload }) => {\\n // TODO: Implement ${reducerName}\\n }`;\n } else {\n events[reducerName] = {};\n eventsCode[reducerName] =\n `(facts) => {\\n // TODO: Implement ${reducerName}\\n }`;\n }\n }\n\n // Generate init code\n const initLines = Object.entries(config.initialState)\n .map(([key, value]) => ` facts.${key} = ${JSON.stringify(value)};`)\n .join(\"\\n\");\n const initCode = `(facts) => {\\n${initLines}\\n }`;\n\n return {\n name: config.name,\n facts,\n derivations: {},\n events,\n requirements: {},\n initCode,\n deriveCode: {},\n eventsCode,\n };\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(\n config: ZustandStoreConfig,\n): DirectiveModuleStructure {\n const facts: Record<string, string> = {};\n const events: Record<string, Record<string, string>> = {};\n const eventsCode: Record<string, string> = {};\n\n // Analyze state\n for (const [key, value] of Object.entries(config.state)) {\n facts[key] = inferTypeString(value);\n }\n\n // Analyze actions\n for (const actionName of Object.keys(config.actions)) {\n events[actionName] = {};\n eventsCode[actionName] =\n `(facts) => {\\n // TODO: Implement ${actionName}\\n }`;\n }\n\n // Generate init code\n const initLines = Object.entries(config.state)\n .map(([key, value]) => ` facts.${key} = ${JSON.stringify(value)};`)\n .join(\"\\n\");\n const initCode = `(facts) => {\\n${initLines}\\n }`;\n\n return {\n name: \"store\",\n facts,\n derivations: {},\n events,\n requirements: {},\n initCode,\n deriveCode: {},\n eventsCode,\n };\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(\n config: XStateMachineConfig,\n): DirectiveModuleStructure {\n const facts: Record<string, string> = {\n state: `t.string<${Object.keys(config.states)\n .map((s) => `'${s}'`)\n .join(\" | \")}>()`,\n };\n const derivations: Record<string, string> = {};\n const deriveCode: Record<string, string> = {};\n const events: Record<string, Record<string, string>> = {};\n const eventsCode: Record<string, string> = {};\n\n // Add context to facts\n if (config.context) {\n for (const [key, value] of Object.entries(config.context)) {\n facts[key] = inferTypeString(value);\n }\n }\n\n // Generate state derivations (isActive, isInactive, etc.)\n for (const stateName of Object.keys(config.states)) {\n const derivationName = `is${capitalize(stateName)}`;\n derivations[derivationName] = \"t.boolean()\";\n deriveCode[derivationName] = `(facts) => facts.state === '${stateName}'`;\n }\n\n // Collect all events and their transitions\n const eventTransitions = new Map<string, Map<string, string>>();\n for (const [stateName, stateConfig] of Object.entries(config.states)) {\n if (!stateConfig.on) continue;\n for (const [eventName, target] of Object.entries(stateConfig.on)) {\n if (!eventTransitions.has(eventName)) {\n eventTransitions.set(eventName, new Map());\n }\n const targetState = typeof target === \"string\" ? target : target.target;\n eventTransitions.get(eventName)!.set(stateName, targetState);\n }\n }\n\n // Generate events and handlers\n for (const [eventName, transitions] of eventTransitions) {\n events[eventName] = {};\n\n if (transitions.size === 1) {\n const firstEntry = [...transitions.entries()][0];\n const toState = firstEntry ? firstEntry[1] : \"unknown\";\n eventsCode[eventName] =\n `(facts) => {\\n facts.state = '${toState}';\\n }`;\n } else {\n const cases = [...transitions.entries()]\n .map(\n ([from, to]) => ` case '${from}': facts.state = '${to}'; break;`,\n )\n .join(\"\\n\");\n eventsCode[eventName] =\n `(facts) => {\\n switch (facts.state) {\\n${cases}\\n }\\n }`;\n }\n }\n\n // Generate init code\n const initLines = [` facts.state = '${config.initial}';`];\n if (config.context) {\n for (const [key, value] of Object.entries(config.context)) {\n initLines.push(` facts.${key} = ${JSON.stringify(value)};`);\n }\n }\n const initCode = `(facts) => {\\n${initLines.join(\"\\n\")}\\n }`;\n\n return {\n name: config.id,\n facts,\n derivations,\n events,\n requirements: {},\n initCode,\n deriveCode,\n eventsCode,\n };\n}\n\n// ============================================================================\n// Code Generation\n// ============================================================================\n\n/**\n * Generate Directive module code from a structure.\n */\nexport function generateModuleCode(\n structure: DirectiveModuleStructure,\n): string {\n const lines: string[] = [\n `import { createModule, t } from '@directive-run/core';`,\n ``,\n `const ${structure.name}Module = createModule('${structure.name}', {`,\n ` schema: {`,\n ` facts: {`,\n ];\n\n // Facts\n for (const [key, type] of Object.entries(structure.facts)) {\n lines.push(` ${key}: ${type},`);\n }\n lines.push(` },`);\n\n // Derivations\n lines.push(` derivations: {`);\n for (const [key, type] of Object.entries(structure.derivations)) {\n lines.push(` ${key}: ${type},`);\n }\n lines.push(` },`);\n\n // Events\n lines.push(` events: {`);\n for (const [key, schema] of Object.entries(structure.events)) {\n const schemaStr = Object.entries(schema)\n .map(([k, v]) => `${k}: ${v}`)\n .join(\", \");\n lines.push(` ${key}: { ${schemaStr} },`);\n }\n lines.push(` },`);\n\n // Requirements\n lines.push(` requirements: {},`);\n lines.push(` },`);\n\n // Init\n lines.push(` init: ${structure.initCode},`);\n\n // Derive\n if (Object.keys(structure.deriveCode).length > 0) {\n lines.push(` derive: {`);\n for (const [key, code] of Object.entries(structure.deriveCode)) {\n lines.push(` ${key}: ${code},`);\n }\n lines.push(` },`);\n }\n\n // Events handlers\n lines.push(` events: {`);\n for (const [key, code] of Object.entries(structure.eventsCode)) {\n lines.push(` ${key}: ${code},`);\n }\n lines.push(` },`);\n\n lines.push(`});`);\n lines.push(``);\n lines.push(`export { ${structure.name}Module };`);\n\n return 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 if (value === null) return \"t.object().nullable()\";\n if (value === undefined) return \"t.object().optional()\";\n\n switch (typeof value) {\n case \"number\":\n return \"t.number()\";\n case \"string\":\n return \"t.string()\";\n case \"boolean\":\n return \"t.boolean()\";\n case \"object\":\n if (Array.isArray(value)) {\n return \"t.array(t.object())\";\n }\n return \"t.object()\";\n default:\n return \"t.object()\";\n }\n}\n\n/**\n * Capitalize first letter.\n */\nfunction capitalize(str: string): string {\n return 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 source: \"redux\" | \"zustand\" | \"xstate\",\n): string[] {\n const common = [\n \"[ ] Install directive: pnpm add directive\",\n \"[ ] Create module file(s) for your state\",\n \"[ ] Define schema with facts, derivations, events\",\n \"[ ] Implement init function for initial state\",\n \"[ ] Implement event handlers\",\n \"[ ] Update imports in consuming code\",\n \"[ ] Test the new implementation\",\n \"[ ] Remove old state management code\",\n ];\n\n const sourceSpecific: Record<string, string[]> = {\n redux: [\n \"[ ] Convert reducers to event handlers\",\n \"[ ] Convert selectors to derivations\",\n \"[ ] Convert thunks to constraints + resolvers\",\n \"[ ] Update useSelector to useDerived\",\n \"[ ] Update useDispatch to system.dispatch\",\n ],\n zustand: [\n \"[ ] Convert store state to facts\",\n \"[ ] Convert store actions to events\",\n \"[ ] Convert computed getters to derivations\",\n \"[ ] Update useStore hooks to useDirective hooks\",\n ],\n xstate: [\n \"[ ] Convert machine states to a 'state' fact\",\n \"[ ] Convert state checks to derivations (isActive, etc.)\",\n \"[ ] Convert events to Directive events\",\n \"[ ] Convert guards to constraint 'when' conditions\",\n \"[ ] Convert services/actors to constraints + resolvers\",\n \"[ ] Update useMachine to useDirective hooks\",\n ],\n };\n\n const specific = sourceSpecific[source] ?? [];\n return [...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 name: string;\n initialState: Record<string, unknown>;\n reducers: Record<\n string,\n (state: unknown, action?: { payload?: unknown }) => void\n >;\n}\n\n/** Zustand store configuration (simplified) */\nexport interface ZustandStoreConfig {\n state: Record<string, unknown>;\n actions: Record<string, (...args: unknown[]) => void>;\n}\n\n/** XState machine configuration (simplified) */\nexport interface XStateMachineConfig {\n id: string;\n initial: string;\n states: Record<string, { on?: Record<string, string | { target: string }> }>;\n context?: Record<string, unknown>;\n}\n\n/** Generated Directive module structure */\nexport interface DirectiveModuleStructure {\n name: string;\n facts: Record<string, string>;\n derivations: Record<string, string>;\n events: Record<string, Record<string, string>>;\n requirements: Record<string, unknown>;\n initCode: string;\n deriveCode: Record<string, string>;\n eventsCode: 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(\n config: ReduxSliceConfig,\n): DirectiveModuleStructure {\n const facts: Record<string, string> = {};\n const events: Record<string, Record<string, string>> = {};\n const eventsCode: Record<string, string> = {};\n\n // Analyze initial state to generate facts\n for (const [key, value] of Object.entries(config.initialState)) {\n facts[key] = inferTypeString(value);\n }\n\n // Analyze reducers to generate events\n for (const reducerName of Object.keys(config.reducers)) {\n // Simple heuristic: if reducer name suggests payload, add it\n const hasPayload =\n reducerName.includes(\"By\") ||\n reducerName.includes(\"Set\") ||\n reducerName.includes(\"With\");\n if (hasPayload) {\n events[reducerName] = { payload: \"t.object()\" };\n eventsCode[reducerName] =\n `(facts, { payload }) => {\\n // TODO: Implement ${reducerName}\\n }`;\n } else {\n events[reducerName] = {};\n eventsCode[reducerName] =\n `(facts) => {\\n // TODO: Implement ${reducerName}\\n }`;\n }\n }\n\n // Generate init code\n const initLines = Object.entries(config.initialState)\n .map(([key, value]) => ` facts.${key} = ${JSON.stringify(value)};`)\n .join(\"\\n\");\n const initCode = `(facts) => {\\n${initLines}\\n }`;\n\n return {\n name: config.name,\n facts,\n derivations: {},\n events,\n requirements: {},\n initCode,\n deriveCode: {},\n eventsCode,\n };\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(\n config: ZustandStoreConfig,\n): DirectiveModuleStructure {\n const facts: Record<string, string> = {};\n const events: Record<string, Record<string, string>> = {};\n const eventsCode: Record<string, string> = {};\n\n // Analyze state\n for (const [key, value] of Object.entries(config.state)) {\n facts[key] = inferTypeString(value);\n }\n\n // Analyze actions\n for (const actionName of Object.keys(config.actions)) {\n events[actionName] = {};\n eventsCode[actionName] =\n `(facts) => {\\n // TODO: Implement ${actionName}\\n }`;\n }\n\n // Generate init code\n const initLines = Object.entries(config.state)\n .map(([key, value]) => ` facts.${key} = ${JSON.stringify(value)};`)\n .join(\"\\n\");\n const initCode = `(facts) => {\\n${initLines}\\n }`;\n\n return {\n name: \"store\",\n facts,\n derivations: {},\n events,\n requirements: {},\n initCode,\n deriveCode: {},\n eventsCode,\n };\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(\n config: XStateMachineConfig,\n): DirectiveModuleStructure {\n const facts: Record<string, string> = {\n state: `t.string<${Object.keys(config.states)\n .map((s) => `'${s}'`)\n .join(\" | \")}>()`,\n };\n const derivations: Record<string, string> = {};\n const deriveCode: Record<string, string> = {};\n const events: Record<string, Record<string, string>> = {};\n const eventsCode: Record<string, string> = {};\n\n // Add context to facts\n if (config.context) {\n for (const [key, value] of Object.entries(config.context)) {\n facts[key] = inferTypeString(value);\n }\n }\n\n // Generate state derivations (isActive, isInactive, etc.)\n for (const stateName of Object.keys(config.states)) {\n const derivationName = `is${capitalize(stateName)}`;\n derivations[derivationName] = \"t.boolean()\";\n deriveCode[derivationName] = `(facts) => facts.state === '${stateName}'`;\n }\n\n // Collect all events and their transitions\n const eventTransitions = new Map<string, Map<string, string>>();\n for (const [stateName, stateConfig] of Object.entries(config.states)) {\n if (!stateConfig.on) continue;\n for (const [eventName, target] of Object.entries(stateConfig.on)) {\n if (!eventTransitions.has(eventName)) {\n eventTransitions.set(eventName, new Map());\n }\n const targetState = typeof target === \"string\" ? target : target.target;\n eventTransitions.get(eventName)!.set(stateName, targetState);\n }\n }\n\n // Generate events and handlers\n for (const [eventName, transitions] of eventTransitions) {\n events[eventName] = {};\n\n if (transitions.size === 1) {\n const firstEntry = [...transitions.entries()][0];\n const toState = firstEntry ? firstEntry[1] : \"unknown\";\n eventsCode[eventName] =\n `(facts) => {\\n facts.state = '${toState}';\\n }`;\n } else {\n const cases = [...transitions.entries()]\n .map(\n ([from, to]) => ` case '${from}': facts.state = '${to}'; break;`,\n )\n .join(\"\\n\");\n eventsCode[eventName] =\n `(facts) => {\\n switch (facts.state) {\\n${cases}\\n }\\n }`;\n }\n }\n\n // Generate init code\n const initLines = [` facts.state = '${config.initial}';`];\n if (config.context) {\n for (const [key, value] of Object.entries(config.context)) {\n initLines.push(` facts.${key} = ${JSON.stringify(value)};`);\n }\n }\n const initCode = `(facts) => {\\n${initLines.join(\"\\n\")}\\n }`;\n\n return {\n name: config.id,\n facts,\n derivations,\n events,\n requirements: {},\n initCode,\n deriveCode,\n eventsCode,\n };\n}\n\n// ============================================================================\n// Code Generation\n// ============================================================================\n\n/**\n * Generate Directive module code from a structure.\n */\nexport function generateModuleCode(\n structure: DirectiveModuleStructure,\n): string {\n const lines: string[] = [\n `import { createModule, t } from '@directive-run/core';`,\n \"\",\n `const ${structure.name}Module = createModule('${structure.name}', {`,\n \" schema: {\",\n \" facts: {\",\n ];\n\n // Facts\n for (const [key, type] of Object.entries(structure.facts)) {\n lines.push(` ${key}: ${type},`);\n }\n lines.push(\" },\");\n\n // Derivations\n lines.push(\" derivations: {\");\n for (const [key, type] of Object.entries(structure.derivations)) {\n lines.push(` ${key}: ${type},`);\n }\n lines.push(\" },\");\n\n // Events\n lines.push(\" events: {\");\n for (const [key, schema] of Object.entries(structure.events)) {\n const schemaStr = Object.entries(schema)\n .map(([k, v]) => `${k}: ${v}`)\n .join(\", \");\n lines.push(` ${key}: { ${schemaStr} },`);\n }\n lines.push(\" },\");\n\n // Requirements\n lines.push(\" requirements: {},\");\n lines.push(\" },\");\n\n // Init\n lines.push(` init: ${structure.initCode},`);\n\n // Derive\n if (Object.keys(structure.deriveCode).length > 0) {\n lines.push(\" derive: {\");\n for (const [key, code] of Object.entries(structure.deriveCode)) {\n lines.push(` ${key}: ${code},`);\n }\n lines.push(\" },\");\n }\n\n // Events handlers\n lines.push(\" events: {\");\n for (const [key, code] of Object.entries(structure.eventsCode)) {\n lines.push(` ${key}: ${code},`);\n }\n lines.push(\" },\");\n\n lines.push(\"});\");\n lines.push(\"\");\n lines.push(`export { ${structure.name}Module };`);\n\n return 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 if (value === null) return \"t.object().nullable()\";\n if (value === undefined) return \"t.object().optional()\";\n\n switch (typeof value) {\n case \"number\":\n return \"t.number()\";\n case \"string\":\n return \"t.string()\";\n case \"boolean\":\n return \"t.boolean()\";\n case \"object\":\n if (Array.isArray(value)) {\n return \"t.array(t.object())\";\n }\n return \"t.object()\";\n default:\n return \"t.object()\";\n }\n}\n\n/**\n * Capitalize first letter.\n */\nfunction capitalize(str: string): string {\n return 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 source: \"redux\" | \"zustand\" | \"xstate\",\n): string[] {\n const common = [\n \"[ ] Install directive: pnpm add directive\",\n \"[ ] Create module file(s) for your state\",\n \"[ ] Define schema with facts, derivations, events\",\n \"[ ] Implement init function for initial state\",\n \"[ ] Implement event handlers\",\n \"[ ] Update imports in consuming code\",\n \"[ ] Test the new implementation\",\n \"[ ] Remove old state management code\",\n ];\n\n const sourceSpecific: Record<string, string[]> = {\n redux: [\n \"[ ] Convert reducers to event handlers\",\n \"[ ] Convert selectors to derivations\",\n \"[ ] Convert thunks to constraints + resolvers\",\n \"[ ] Update useSelector to useDerived\",\n \"[ ] Update useDispatch to system.dispatch\",\n ],\n zustand: [\n \"[ ] Convert store state to facts\",\n \"[ ] Convert store actions to events\",\n \"[ ] Convert computed getters to derivations\",\n \"[ ] Update useStore hooks to useDirective hooks\",\n ],\n xstate: [\n \"[ ] Convert machine states to a 'state' fact\",\n \"[ ] Convert state checks to derivations (isActive, etc.)\",\n \"[ ] Convert events to Directive events\",\n \"[ ] Convert guards to constraint 'when' conditions\",\n \"[ ] Convert services/actors to constraints + resolvers\",\n \"[ ] Update useMachine to useDirective hooks\",\n ],\n };\n\n const specific = sourceSpecific[source] ?? [];\n return [...specific, ...common];\n}\n"]}
|
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 name: string;\n initialState: Record<string, unknown>;\n reducers: Record<\n string,\n (state: unknown, action?: { payload?: unknown }) => void\n >;\n}\n\n/** Zustand store configuration (simplified) */\nexport interface ZustandStoreConfig {\n state: Record<string, unknown>;\n actions: Record<string, (...args: unknown[]) => void>;\n}\n\n/** XState machine configuration (simplified) */\nexport interface XStateMachineConfig {\n id: string;\n initial: string;\n states: Record<string, { on?: Record<string, string | { target: string }> }>;\n context?: Record<string, unknown>;\n}\n\n/** Generated Directive module structure */\nexport interface DirectiveModuleStructure {\n name: string;\n facts: Record<string, string>;\n derivations: Record<string, string>;\n events: Record<string, Record<string, string>>;\n requirements: Record<string, unknown>;\n initCode: string;\n deriveCode: Record<string, string>;\n eventsCode: 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(\n config: ReduxSliceConfig,\n): DirectiveModuleStructure {\n const facts: Record<string, string> = {};\n const events: Record<string, Record<string, string>> = {};\n const eventsCode: Record<string, string> = {};\n\n // Analyze initial state to generate facts\n for (const [key, value] of Object.entries(config.initialState)) {\n facts[key] = inferTypeString(value);\n }\n\n // Analyze reducers to generate events\n for (const reducerName of Object.keys(config.reducers)) {\n // Simple heuristic: if reducer name suggests payload, add it\n const hasPayload =\n reducerName.includes(\"By\") ||\n reducerName.includes(\"Set\") ||\n reducerName.includes(\"With\");\n if (hasPayload) {\n events[reducerName] = { payload: \"t.object()\" };\n eventsCode[reducerName] =\n `(facts, { payload }) => {\\n // TODO: Implement ${reducerName}\\n }`;\n } else {\n events[reducerName] = {};\n eventsCode[reducerName] =\n `(facts) => {\\n // TODO: Implement ${reducerName}\\n }`;\n }\n }\n\n // Generate init code\n const initLines = Object.entries(config.initialState)\n .map(([key, value]) => ` facts.${key} = ${JSON.stringify(value)};`)\n .join(\"\\n\");\n const initCode = `(facts) => {\\n${initLines}\\n }`;\n\n return {\n name: config.name,\n facts,\n derivations: {},\n events,\n requirements: {},\n initCode,\n deriveCode: {},\n eventsCode,\n };\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(\n config: ZustandStoreConfig,\n): DirectiveModuleStructure {\n const facts: Record<string, string> = {};\n const events: Record<string, Record<string, string>> = {};\n const eventsCode: Record<string, string> = {};\n\n // Analyze state\n for (const [key, value] of Object.entries(config.state)) {\n facts[key] = inferTypeString(value);\n }\n\n // Analyze actions\n for (const actionName of Object.keys(config.actions)) {\n events[actionName] = {};\n eventsCode[actionName] =\n `(facts) => {\\n // TODO: Implement ${actionName}\\n }`;\n }\n\n // Generate init code\n const initLines = Object.entries(config.state)\n .map(([key, value]) => ` facts.${key} = ${JSON.stringify(value)};`)\n .join(\"\\n\");\n const initCode = `(facts) => {\\n${initLines}\\n }`;\n\n return {\n name: \"store\",\n facts,\n derivations: {},\n events,\n requirements: {},\n initCode,\n deriveCode: {},\n eventsCode,\n };\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(\n config: XStateMachineConfig,\n): DirectiveModuleStructure {\n const facts: Record<string, string> = {\n state: `t.string<${Object.keys(config.states)\n .map((s) => `'${s}'`)\n .join(\" | \")}>()`,\n };\n const derivations: Record<string, string> = {};\n const deriveCode: Record<string, string> = {};\n const events: Record<string, Record<string, string>> = {};\n const eventsCode: Record<string, string> = {};\n\n // Add context to facts\n if (config.context) {\n for (const [key, value] of Object.entries(config.context)) {\n facts[key] = inferTypeString(value);\n }\n }\n\n // Generate state derivations (isActive, isInactive, etc.)\n for (const stateName of Object.keys(config.states)) {\n const derivationName = `is${capitalize(stateName)}`;\n derivations[derivationName] = \"t.boolean()\";\n deriveCode[derivationName] = `(facts) => facts.state === '${stateName}'`;\n }\n\n // Collect all events and their transitions\n const eventTransitions = new Map<string, Map<string, string>>();\n for (const [stateName, stateConfig] of Object.entries(config.states)) {\n if (!stateConfig.on) continue;\n for (const [eventName, target] of Object.entries(stateConfig.on)) {\n if (!eventTransitions.has(eventName)) {\n eventTransitions.set(eventName, new Map());\n }\n const targetState = typeof target === \"string\" ? target : target.target;\n eventTransitions.get(eventName)!.set(stateName, targetState);\n }\n }\n\n // Generate events and handlers\n for (const [eventName, transitions] of eventTransitions) {\n events[eventName] = {};\n\n if (transitions.size === 1) {\n const firstEntry = [...transitions.entries()][0];\n const toState = firstEntry ? firstEntry[1] : \"unknown\";\n eventsCode[eventName] =\n `(facts) => {\\n facts.state = '${toState}';\\n }`;\n } else {\n const cases = [...transitions.entries()]\n .map(\n ([from, to]) => ` case '${from}': facts.state = '${to}'; break;`,\n )\n .join(\"\\n\");\n eventsCode[eventName] =\n `(facts) => {\\n switch (facts.state) {\\n${cases}\\n }\\n }`;\n }\n }\n\n // Generate init code\n const initLines = [` facts.state = '${config.initial}';`];\n if (config.context) {\n for (const [key, value] of Object.entries(config.context)) {\n initLines.push(` facts.${key} = ${JSON.stringify(value)};`);\n }\n }\n const initCode = `(facts) => {\\n${initLines.join(\"\\n\")}\\n }`;\n\n return {\n name: config.id,\n facts,\n derivations,\n events,\n requirements: {},\n initCode,\n deriveCode,\n eventsCode,\n };\n}\n\n// ============================================================================\n// Code Generation\n// ============================================================================\n\n/**\n * Generate Directive module code from a structure.\n */\nexport function generateModuleCode(\n structure: DirectiveModuleStructure,\n): string {\n const lines: string[] = [\n `import { createModule, t } from '@directive-run/core';`,\n ``,\n `const ${structure.name}Module = createModule('${structure.name}', {`,\n ` schema: {`,\n ` facts: {`,\n ];\n\n // Facts\n for (const [key, type] of Object.entries(structure.facts)) {\n lines.push(` ${key}: ${type},`);\n }\n lines.push(` },`);\n\n // Derivations\n lines.push(` derivations: {`);\n for (const [key, type] of Object.entries(structure.derivations)) {\n lines.push(` ${key}: ${type},`);\n }\n lines.push(` },`);\n\n // Events\n lines.push(` events: {`);\n for (const [key, schema] of Object.entries(structure.events)) {\n const schemaStr = Object.entries(schema)\n .map(([k, v]) => `${k}: ${v}`)\n .join(\", \");\n lines.push(` ${key}: { ${schemaStr} },`);\n }\n lines.push(` },`);\n\n // Requirements\n lines.push(` requirements: {},`);\n lines.push(` },`);\n\n // Init\n lines.push(` init: ${structure.initCode},`);\n\n // Derive\n if (Object.keys(structure.deriveCode).length > 0) {\n lines.push(` derive: {`);\n for (const [key, code] of Object.entries(structure.deriveCode)) {\n lines.push(` ${key}: ${code},`);\n }\n lines.push(` },`);\n }\n\n // Events handlers\n lines.push(` events: {`);\n for (const [key, code] of Object.entries(structure.eventsCode)) {\n lines.push(` ${key}: ${code},`);\n }\n lines.push(` },`);\n\n lines.push(`});`);\n lines.push(``);\n lines.push(`export { ${structure.name}Module };`);\n\n return 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 if (value === null) return \"t.object().nullable()\";\n if (value === undefined) return \"t.object().optional()\";\n\n switch (typeof value) {\n case \"number\":\n return \"t.number()\";\n case \"string\":\n return \"t.string()\";\n case \"boolean\":\n return \"t.boolean()\";\n case \"object\":\n if (Array.isArray(value)) {\n return \"t.array(t.object())\";\n }\n return \"t.object()\";\n default:\n return \"t.object()\";\n }\n}\n\n/**\n * Capitalize first letter.\n */\nfunction capitalize(str: string): string {\n return 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 source: \"redux\" | \"zustand\" | \"xstate\",\n): string[] {\n const common = [\n \"[ ] Install directive: pnpm add directive\",\n \"[ ] Create module file(s) for your state\",\n \"[ ] Define schema with facts, derivations, events\",\n \"[ ] Implement init function for initial state\",\n \"[ ] Implement event handlers\",\n \"[ ] Update imports in consuming code\",\n \"[ ] Test the new implementation\",\n \"[ ] Remove old state management code\",\n ];\n\n const sourceSpecific: Record<string, string[]> = {\n redux: [\n \"[ ] Convert reducers to event handlers\",\n \"[ ] Convert selectors to derivations\",\n \"[ ] Convert thunks to constraints + resolvers\",\n \"[ ] Update useSelector to useDerived\",\n \"[ ] Update useDispatch to system.dispatch\",\n ],\n zustand: [\n \"[ ] Convert store state to facts\",\n \"[ ] Convert store actions to events\",\n \"[ ] Convert computed getters to derivations\",\n \"[ ] Update useStore hooks to useDirective hooks\",\n ],\n xstate: [\n \"[ ] Convert machine states to a 'state' fact\",\n \"[ ] Convert state checks to derivations (isActive, etc.)\",\n \"[ ] Convert events to Directive events\",\n \"[ ] Convert guards to constraint 'when' conditions\",\n \"[ ] Convert services/actors to constraints + resolvers\",\n \"[ ] Update useMachine to useDirective hooks\",\n ],\n };\n\n const specific = sourceSpecific[source] ?? [];\n return [...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 name: string;\n initialState: Record<string, unknown>;\n reducers: Record<\n string,\n (state: unknown, action?: { payload?: unknown }) => void\n >;\n}\n\n/** Zustand store configuration (simplified) */\nexport interface ZustandStoreConfig {\n state: Record<string, unknown>;\n actions: Record<string, (...args: unknown[]) => void>;\n}\n\n/** XState machine configuration (simplified) */\nexport interface XStateMachineConfig {\n id: string;\n initial: string;\n states: Record<string, { on?: Record<string, string | { target: string }> }>;\n context?: Record<string, unknown>;\n}\n\n/** Generated Directive module structure */\nexport interface DirectiveModuleStructure {\n name: string;\n facts: Record<string, string>;\n derivations: Record<string, string>;\n events: Record<string, Record<string, string>>;\n requirements: Record<string, unknown>;\n initCode: string;\n deriveCode: Record<string, string>;\n eventsCode: 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(\n config: ReduxSliceConfig,\n): DirectiveModuleStructure {\n const facts: Record<string, string> = {};\n const events: Record<string, Record<string, string>> = {};\n const eventsCode: Record<string, string> = {};\n\n // Analyze initial state to generate facts\n for (const [key, value] of Object.entries(config.initialState)) {\n facts[key] = inferTypeString(value);\n }\n\n // Analyze reducers to generate events\n for (const reducerName of Object.keys(config.reducers)) {\n // Simple heuristic: if reducer name suggests payload, add it\n const hasPayload =\n reducerName.includes(\"By\") ||\n reducerName.includes(\"Set\") ||\n reducerName.includes(\"With\");\n if (hasPayload) {\n events[reducerName] = { payload: \"t.object()\" };\n eventsCode[reducerName] =\n `(facts, { payload }) => {\\n // TODO: Implement ${reducerName}\\n }`;\n } else {\n events[reducerName] = {};\n eventsCode[reducerName] =\n `(facts) => {\\n // TODO: Implement ${reducerName}\\n }`;\n }\n }\n\n // Generate init code\n const initLines = Object.entries(config.initialState)\n .map(([key, value]) => ` facts.${key} = ${JSON.stringify(value)};`)\n .join(\"\\n\");\n const initCode = `(facts) => {\\n${initLines}\\n }`;\n\n return {\n name: config.name,\n facts,\n derivations: {},\n events,\n requirements: {},\n initCode,\n deriveCode: {},\n eventsCode,\n };\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(\n config: ZustandStoreConfig,\n): DirectiveModuleStructure {\n const facts: Record<string, string> = {};\n const events: Record<string, Record<string, string>> = {};\n const eventsCode: Record<string, string> = {};\n\n // Analyze state\n for (const [key, value] of Object.entries(config.state)) {\n facts[key] = inferTypeString(value);\n }\n\n // Analyze actions\n for (const actionName of Object.keys(config.actions)) {\n events[actionName] = {};\n eventsCode[actionName] =\n `(facts) => {\\n // TODO: Implement ${actionName}\\n }`;\n }\n\n // Generate init code\n const initLines = Object.entries(config.state)\n .map(([key, value]) => ` facts.${key} = ${JSON.stringify(value)};`)\n .join(\"\\n\");\n const initCode = `(facts) => {\\n${initLines}\\n }`;\n\n return {\n name: \"store\",\n facts,\n derivations: {},\n events,\n requirements: {},\n initCode,\n deriveCode: {},\n eventsCode,\n };\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(\n config: XStateMachineConfig,\n): DirectiveModuleStructure {\n const facts: Record<string, string> = {\n state: `t.string<${Object.keys(config.states)\n .map((s) => `'${s}'`)\n .join(\" | \")}>()`,\n };\n const derivations: Record<string, string> = {};\n const deriveCode: Record<string, string> = {};\n const events: Record<string, Record<string, string>> = {};\n const eventsCode: Record<string, string> = {};\n\n // Add context to facts\n if (config.context) {\n for (const [key, value] of Object.entries(config.context)) {\n facts[key] = inferTypeString(value);\n }\n }\n\n // Generate state derivations (isActive, isInactive, etc.)\n for (const stateName of Object.keys(config.states)) {\n const derivationName = `is${capitalize(stateName)}`;\n derivations[derivationName] = \"t.boolean()\";\n deriveCode[derivationName] = `(facts) => facts.state === '${stateName}'`;\n }\n\n // Collect all events and their transitions\n const eventTransitions = new Map<string, Map<string, string>>();\n for (const [stateName, stateConfig] of Object.entries(config.states)) {\n if (!stateConfig.on) continue;\n for (const [eventName, target] of Object.entries(stateConfig.on)) {\n if (!eventTransitions.has(eventName)) {\n eventTransitions.set(eventName, new Map());\n }\n const targetState = typeof target === \"string\" ? target : target.target;\n eventTransitions.get(eventName)!.set(stateName, targetState);\n }\n }\n\n // Generate events and handlers\n for (const [eventName, transitions] of eventTransitions) {\n events[eventName] = {};\n\n if (transitions.size === 1) {\n const firstEntry = [...transitions.entries()][0];\n const toState = firstEntry ? firstEntry[1] : \"unknown\";\n eventsCode[eventName] =\n `(facts) => {\\n facts.state = '${toState}';\\n }`;\n } else {\n const cases = [...transitions.entries()]\n .map(\n ([from, to]) => ` case '${from}': facts.state = '${to}'; break;`,\n )\n .join(\"\\n\");\n eventsCode[eventName] =\n `(facts) => {\\n switch (facts.state) {\\n${cases}\\n }\\n }`;\n }\n }\n\n // Generate init code\n const initLines = [` facts.state = '${config.initial}';`];\n if (config.context) {\n for (const [key, value] of Object.entries(config.context)) {\n initLines.push(` facts.${key} = ${JSON.stringify(value)};`);\n }\n }\n const initCode = `(facts) => {\\n${initLines.join(\"\\n\")}\\n }`;\n\n return {\n name: config.id,\n facts,\n derivations,\n events,\n requirements: {},\n initCode,\n deriveCode,\n eventsCode,\n };\n}\n\n// ============================================================================\n// Code Generation\n// ============================================================================\n\n/**\n * Generate Directive module code from a structure.\n */\nexport function generateModuleCode(\n structure: DirectiveModuleStructure,\n): string {\n const lines: string[] = [\n `import { createModule, t } from '@directive-run/core';`,\n \"\",\n `const ${structure.name}Module = createModule('${structure.name}', {`,\n \" schema: {\",\n \" facts: {\",\n ];\n\n // Facts\n for (const [key, type] of Object.entries(structure.facts)) {\n lines.push(` ${key}: ${type},`);\n }\n lines.push(\" },\");\n\n // Derivations\n lines.push(\" derivations: {\");\n for (const [key, type] of Object.entries(structure.derivations)) {\n lines.push(` ${key}: ${type},`);\n }\n lines.push(\" },\");\n\n // Events\n lines.push(\" events: {\");\n for (const [key, schema] of Object.entries(structure.events)) {\n const schemaStr = Object.entries(schema)\n .map(([k, v]) => `${k}: ${v}`)\n .join(\", \");\n lines.push(` ${key}: { ${schemaStr} },`);\n }\n lines.push(\" },\");\n\n // Requirements\n lines.push(\" requirements: {},\");\n lines.push(\" },\");\n\n // Init\n lines.push(` init: ${structure.initCode},`);\n\n // Derive\n if (Object.keys(structure.deriveCode).length > 0) {\n lines.push(\" derive: {\");\n for (const [key, code] of Object.entries(structure.deriveCode)) {\n lines.push(` ${key}: ${code},`);\n }\n lines.push(\" },\");\n }\n\n // Events handlers\n lines.push(\" events: {\");\n for (const [key, code] of Object.entries(structure.eventsCode)) {\n lines.push(` ${key}: ${code},`);\n }\n lines.push(\" },\");\n\n lines.push(\"});\");\n lines.push(\"\");\n lines.push(`export { ${structure.name}Module };`);\n\n return 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 if (value === null) return \"t.object().nullable()\";\n if (value === undefined) return \"t.object().optional()\";\n\n switch (typeof value) {\n case \"number\":\n return \"t.number()\";\n case \"string\":\n return \"t.string()\";\n case \"boolean\":\n return \"t.boolean()\";\n case \"object\":\n if (Array.isArray(value)) {\n return \"t.array(t.object())\";\n }\n return \"t.object()\";\n default:\n return \"t.object()\";\n }\n}\n\n/**\n * Capitalize first letter.\n */\nfunction capitalize(str: string): string {\n return 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 source: \"redux\" | \"zustand\" | \"xstate\",\n): string[] {\n const common = [\n \"[ ] Install directive: pnpm add directive\",\n \"[ ] Create module file(s) for your state\",\n \"[ ] Define schema with facts, derivations, events\",\n \"[ ] Implement init function for initial state\",\n \"[ ] Implement event handlers\",\n \"[ ] Update imports in consuming code\",\n \"[ ] Test the new implementation\",\n \"[ ] Remove old state management code\",\n ];\n\n const sourceSpecific: Record<string, string[]> = {\n redux: [\n \"[ ] Convert reducers to event handlers\",\n \"[ ] Convert selectors to derivations\",\n \"[ ] Convert thunks to constraints + resolvers\",\n \"[ ] Update useSelector to useDerived\",\n \"[ ] Update useDispatch to system.dispatch\",\n ],\n zustand: [\n \"[ ] Convert store state to facts\",\n \"[ ] Convert store actions to events\",\n \"[ ] Convert computed getters to derivations\",\n \"[ ] Update useStore hooks to useDirective hooks\",\n ],\n xstate: [\n \"[ ] Convert machine states to a 'state' fact\",\n \"[ ] Convert state checks to derivations (isActive, etc.)\",\n \"[ ] Convert events to Directive events\",\n \"[ ] Convert guards to constraint 'when' conditions\",\n \"[ ] Convert services/actors to constraints + resolvers\",\n \"[ ] Update useMachine to useDirective hooks\",\n ],\n };\n\n const specific = sourceSpecific[source] ?? [];\n return [...specific, ...common];\n}\n"]}
|