@executor-js/cli 0.0.1-beta.0 → 0.0.1-beta.1
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.js +0 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/generate.ts","../src/utils/get-config.ts","../src/generators/drizzle.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { generate } from \"./commands/generate.js\";\n\nprocess.on(\"SIGINT\", () => process.exit(0));\nprocess.on(\"SIGTERM\", () => process.exit(0));\n\nconst program = new Command(\"executor\")\n .version(\"0.0.1\")\n .description(\"Executor CLI\")\n .addCommand(generate)\n .action(() => program.help());\n\nprogram.parse();\n","import { existsSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport { collectSchemas } from \"@executor/sdk\";\nimport { getConfig } from \"../utils/get-config.js\";\nimport { generateDrizzleSchema } from \"../generators/drizzle.js\";\n\nasync function generateAction(opts: {\n cwd: string;\n config?: string;\n output?: string;\n}) {\n const cwd = path.resolve(opts.cwd);\n if (!existsSync(cwd)) {\n console.error(`The directory \"${cwd}\" does not exist.`);\n process.exit(1);\n }\n\n const config = await getConfig({ cwd, configPath: opts.config });\n if (!config) {\n console.error(\n \"No configuration file found. Add an `executor.config.ts` file to \" +\n \"your project or pass the path using the `--config` flag.\",\n );\n process.exit(1);\n }\n\n const schema = collectSchemas(config.plugins);\n\n const result = await generateDrizzleSchema({\n schema,\n dialect: config.dialect,\n file: opts.output,\n });\n\n if (!result.code) {\n console.log(\"Schema is already up to date.\");\n process.exit(0);\n }\n\n const outPath = path.resolve(cwd, result.fileName);\n const outDir = path.dirname(outPath);\n if (!existsSync(outDir)) {\n await fs.mkdir(outDir, { recursive: true });\n }\n\n await fs.writeFile(outPath, result.code);\n console.log(`Schema generated: ${path.relative(cwd, outPath)}`);\n}\n\nexport const generate = new Command(\"generate\")\n .description(\"Generate a drizzle schema file from the executor config\")\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory\",\n process.cwd(),\n )\n .option(\n \"--config <config>\",\n \"path to the executor config file\",\n )\n .option(\n \"--output <output>\",\n \"output file path for the generated schema\",\n )\n .action(generateAction);\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { createJiti } from \"jiti\";\nimport type { ExecutorCliConfig } from \"@executor/sdk\";\n\nconst defaultPaths = [\n \"executor.config.ts\",\n \"executor.config.js\",\n \"src/executor.config.ts\",\n \"src/executor.config.js\",\n];\n\nexport const getConfig = async (opts: {\n cwd: string;\n configPath?: string;\n}): Promise<ExecutorCliConfig | null> => {\n const { cwd, configPath } = opts;\n\n let resolvedPath: string | undefined;\n\n if (configPath) {\n resolvedPath = path.resolve(cwd, configPath);\n if (!existsSync(resolvedPath)) {\n console.error(`Config file not found: ${resolvedPath}`);\n return null;\n }\n } else {\n for (const p of defaultPaths) {\n const candidate = path.resolve(cwd, p);\n if (existsSync(candidate)) {\n resolvedPath = candidate;\n break;\n }\n }\n }\n\n if (!resolvedPath) return null;\n\n const jiti = createJiti(cwd, {\n interopDefault: true,\n moduleCache: false,\n });\n\n const mod = await jiti.import(resolvedPath);\n const config = (mod as { default?: ExecutorCliConfig }).default ?? mod;\n return config as ExecutorCliConfig;\n};\n","// ---------------------------------------------------------------------------\n// Drizzle schema generator — DBSchema → drizzle-orm TS source.\n//\n// Ported from better-auth (packages/cli/src/generators/drizzle.ts) under\n// MIT. Adapted for executor:\n// - Reads our DBSchema shape (modelName optional, key = default)\n// - No auth-specific logic (uuid/serial id modes, usePlural, camelCase)\n// - Always emits text primary keys\n// - Dialect from ExecutorCliConfig, not from adapter.options.provider\n// ---------------------------------------------------------------------------\n\nimport { existsSync } from \"node:fs\";\nimport type { DBSchema, DBFieldAttribute } from \"@executor/storage-core\";\nimport type { SchemaGenerator } from \"./types.js\";\n\ntype Dialect = \"pg\" | \"sqlite\" | \"mysql\";\n\nconst getModelName = (key: string, def: DBSchema[string]): string =>\n def.modelName ?? key;\n\nconst getType = (\n name: string,\n field: DBFieldAttribute,\n dialect: Dialect,\n): string => {\n if (field.references?.field === \"id\") {\n return `text('${name}')`;\n }\n\n const type = field.type;\n\n if (typeof type !== \"string\") {\n // Enum array — e.g. [\"active\", \"inactive\"]\n if (Array.isArray(type) && type.every((x) => typeof x === \"string\")) {\n return {\n sqlite: `text({ enum: [${type.map((x) => `'${x}'`).join(\", \")}] })`,\n pg: `text('${name}', { enum: [${type.map((x) => `'${x}'`).join(\", \")}] })`,\n mysql: `mysqlEnum([${type.map((x) => `'${x}'`).join(\", \")}])`,\n }[dialect];\n }\n throw new TypeError(\n `Invalid field type for field ${name}`,\n );\n }\n\n const typeMap: Record<string, Record<Dialect, string>> = {\n string: {\n sqlite: `text('${name}')`,\n pg: `text('${name}')`,\n mysql: field.unique\n ? `varchar('${name}', { length: 255 })`\n : field.references\n ? `varchar('${name}', { length: 36 })`\n : field.sortable\n ? `varchar('${name}', { length: 255 })`\n : field.index\n ? `varchar('${name}', { length: 255 })`\n : `text('${name}')`,\n },\n boolean: {\n sqlite: `integer('${name}', { mode: 'boolean' })`,\n pg: `boolean('${name}')`,\n mysql: `boolean('${name}')`,\n },\n number: {\n sqlite: `integer('${name}')`,\n pg: field.bigint\n ? `bigint('${name}', { mode: 'number' })`\n : `integer('${name}')`,\n mysql: field.bigint\n ? `bigint('${name}', { mode: 'number' })`\n : `int('${name}')`,\n },\n date: {\n sqlite: `integer('${name}', { mode: 'timestamp_ms' })`,\n pg: `timestamp('${name}')`,\n mysql: `timestamp('${name}', { fsp: 3 })`,\n },\n \"number[]\": {\n sqlite: `text('${name}', { mode: \"json\" })`,\n pg: field.bigint\n ? `bigint('${name}', { mode: 'number' }).array()`\n : `integer('${name}').array()`,\n mysql: `text('${name}', { mode: 'json' })`,\n },\n \"string[]\": {\n sqlite: `text('${name}', { mode: \"json\" })`,\n pg: `text('${name}').array()`,\n mysql: `text('${name}', { mode: \"json\" })`,\n },\n json: {\n sqlite: `text('${name}', { mode: \"json\" })`,\n pg: `jsonb('${name}')`,\n mysql: `json('${name}', { mode: \"json\" })`,\n },\n };\n\n const dbTypeMap = typeMap[type as string];\n if (!dbTypeMap) {\n throw new Error(\n `Unsupported field type '${field.type}' for field '${name}'.`,\n );\n }\n return dbTypeMap[dialect];\n};\n\n// ---------------------------------------------------------------------------\n// Generator\n// ---------------------------------------------------------------------------\n\nexport const generateDrizzleSchema: SchemaGenerator = async ({\n schema,\n dialect,\n file,\n}) => {\n const filePath = file || \"./executor-schema.ts\";\n const fileExist = existsSync(filePath);\n\n let code = generateImport({ dialect, schema });\n\n for (const [tableKey, tableDef] of Object.entries(schema)) {\n const modelName = getModelName(tableKey, tableDef);\n const fields = tableDef.fields;\n\n // Scoped tables get a composite `(scope_id, id)` primary key so two\n // tenants can register rows with the same user-facing id without\n // colliding on a globally-unique PK. Single-column PK stays for\n // unscoped tables (conformance fixtures, the blob store, etc.).\n const hasScopeId = Object.prototype.hasOwnProperty.call(fields, \"scope_id\");\n const id = hasScopeId ? `text('id').notNull()` : `text('id').primaryKey()`;\n\n type TableExtra =\n | { kind: \"uniqueIndex\" | \"index\"; name: string; on: string }\n | { kind: \"primaryKey\"; columns: readonly string[] };\n const extras: TableExtra[] = [];\n\n const assignExtras = (items: TableExtra[]): string => {\n if (!items.length) return \"\";\n const lines: string[] = [`, (table) => [`];\n for (const item of items) {\n if (item.kind === \"primaryKey\") {\n const cols = item.columns.map((c) => `table.${c}`).join(\", \");\n lines.push(` primaryKey({ columns: [${cols}] }),`);\n } else {\n lines.push(` ${item.kind}(\"${item.name}\").on(table.${item.on}),`);\n }\n }\n lines.push(`]`);\n return lines.join(\"\\n\");\n };\n\n if (hasScopeId) {\n extras.push({ kind: \"primaryKey\", columns: [\"scope_id\", \"id\"] });\n }\n\n const tableSchema = `export const ${tableKey} = ${dialect}Table(\"${modelName}\", {\n id: ${id},\n ${Object.entries(fields)\n .filter(([fieldName]) => fieldName !== \"id\")\n .map(([fieldName, attr]) => {\n const physical = attr.fieldName ?? fieldName;\n\n if (attr.index && !attr.unique) {\n extras.push({\n kind: \"index\",\n name: `${tableKey}_${physical}_idx`,\n on: physical,\n });\n } else if (attr.index && attr.unique) {\n extras.push({\n kind: \"uniqueIndex\",\n name: `${tableKey}_${physical}_uidx`,\n on: physical,\n });\n }\n\n let col = getType(physical, attr, dialect);\n\n if (\n attr.defaultValue !== null &&\n typeof attr.defaultValue !== \"undefined\"\n ) {\n if (typeof attr.defaultValue === \"function\") {\n if (\n attr.type === \"date\" &&\n attr.defaultValue.toString().includes(\"new Date()\")\n ) {\n if (dialect === \"sqlite\") {\n col += `.default(sql\\`(cast(unixepoch('subsecond') * 1000 as integer))\\`)`;\n } else {\n col += `.defaultNow()`;\n }\n }\n } else if (typeof attr.defaultValue === \"string\") {\n col += `.default(\"${attr.defaultValue}\")`;\n } else {\n col += `.default(${attr.defaultValue})`;\n }\n }\n\n if (attr.onUpdate && attr.type === \"date\") {\n if (typeof attr.onUpdate === \"function\") {\n col += `.$onUpdate(${attr.onUpdate})`;\n }\n }\n\n return `${physical}: ${col}${attr.required !== false ? \".notNull()\" : \"\"}${\n attr.unique ? \".unique()\" : \"\"\n }${\n attr.references\n ? `.references(()=> ${attr.references.model}.${attr.references.field ?? \"id\"}, { onDelete: '${\n attr.references.onDelete || \"cascade\"\n }' })`\n : \"\"\n }`;\n })\n .join(\",\\n \")}\n}${assignExtras(extras)});`;\n\n code += `\\n${tableSchema}\\n`;\n }\n\n // ---------------------------------------------------------------------------\n // Relations — scan FKs in both directions\n // ---------------------------------------------------------------------------\n\n let relationsString = \"\";\n for (const [tableKey, tableDef] of Object.entries(schema)) {\n const modelName = tableKey;\n\n type Relation = {\n key: string;\n model: string;\n type: \"one\" | \"many\";\n reference?: {\n field: string;\n references: string;\n fieldName: string;\n };\n };\n\n const oneRelations: Relation[] = [];\n const manyRelations: Relation[] = [];\n const manyRelationsSet = new Set<string>();\n\n // Find all FKs in THIS table → \"one\" relations\n for (const [fieldName, field] of Object.entries(tableDef.fields)) {\n if (!field.references) continue;\n const referencedModel = field.references.model;\n const physical = field.fieldName ?? fieldName;\n const fieldRef = `${tableKey}.${physical}`;\n const referenceRef = `${referencedModel}.${field.references.field || \"id\"}`;\n\n oneRelations.push({\n key: referencedModel,\n model: referencedModel,\n type: \"one\",\n reference: {\n field: fieldRef,\n references: referenceRef,\n fieldName,\n },\n });\n }\n\n // Find all OTHER tables that reference THIS table → \"many\" relations\n for (const [otherKey, otherDef] of Object.entries(schema)) {\n if (otherKey === tableKey) continue;\n const hasFK = Object.values(otherDef.fields).some(\n (field) => field.references?.model === tableKey,\n );\n if (!hasFK) continue;\n\n const relationKey = `${otherKey}s`;\n if (!manyRelationsSet.has(relationKey)) {\n manyRelationsSet.add(relationKey);\n manyRelations.push({\n key: relationKey,\n model: otherKey,\n type: \"many\",\n });\n }\n }\n\n // Detect duplicates\n const relationsByModel = new Map<string, Relation[]>();\n for (const rel of oneRelations) {\n if (!rel.reference) continue;\n const arr = relationsByModel.get(rel.key) ?? [];\n arr.push(rel);\n relationsByModel.set(rel.key, arr);\n }\n\n const duplicateRelations: Relation[] = [];\n const singleRelations: Relation[] = [];\n\n for (const [, rels] of relationsByModel.entries()) {\n if (rels.length > 1) {\n duplicateRelations.push(...rels);\n } else {\n singleRelations.push(rels[0]!);\n }\n }\n\n // Duplicate relations get field-specific exports\n for (const rel of duplicateRelations) {\n if (!rel.reference) continue;\n const relExportName = `${modelName}${rel.reference.fieldName.charAt(0).toUpperCase() + rel.reference.fieldName.slice(1)}Relations`;\n const block = `export const ${relExportName} = relations(${modelName}, ({ one }) => ({\n ${rel.key}: one(${rel.model}, {\n fields: [${rel.reference.field}],\n references: [${rel.reference.references}],\n })\n}))`;\n relationsString += `\\n${block}\\n`;\n }\n\n // Combined single relations\n const hasOne = singleRelations.length > 0;\n const hasMany = manyRelations.length > 0;\n\n if (hasOne || hasMany) {\n const destructured = [\n hasOne ? \"one\" : \"\",\n hasMany ? \"many\" : \"\",\n ]\n .filter(Boolean)\n .join(\", \");\n\n const body = [\n ...singleRelations\n .filter((r) => r.reference)\n .map(\n (r) =>\n ` ${r.key}: one(${r.model}, {\\n fields: [${r.reference!.field}],\\n references: [${r.reference!.references}],\\n })`,\n ),\n ...manyRelations.map(\n ({ key, model }) => ` ${key}: many(${model})`,\n ),\n ].join(\",\\n\");\n\n const block = `export const ${modelName}Relations = relations(${modelName}, ({ ${destructured} }) => ({\n${body}\n}))`;\n relationsString += `\\n${block}\\n`;\n }\n }\n\n code += `\\n${relationsString}`;\n\n return {\n code,\n fileName: filePath,\n overwrite: fileExist,\n };\n};\n\n// ---------------------------------------------------------------------------\n// Import generation — only emit what's actually used\n// ---------------------------------------------------------------------------\n\nfunction generateImport({\n dialect,\n schema,\n}: {\n dialect: Dialect;\n schema: DBSchema;\n}) {\n const rootImports: string[] = [];\n const coreImports: string[] = [];\n\n let hasBigint = false;\n let hasJson = false;\n let hasBoolean = false;\n let hasNumber = false;\n let hasDate = false;\n let hasIndex = false;\n let hasUniqueIndex = false;\n let hasReferences = false;\n let hasCompositePrimaryKey = false;\n\n for (const [tableKey, table] of Object.entries(schema)) {\n for (const field of Object.values(table.fields)) {\n if (field.bigint) hasBigint = true;\n if (field.type === \"json\") hasJson = true;\n if (field.type === \"boolean\") hasBoolean = true;\n if (field.type === \"number\" || field.type === \"number[]\") hasNumber = true;\n if (field.type === \"date\") hasDate = true;\n if (field.index && !field.unique) hasIndex = true;\n if (field.index && field.unique) hasUniqueIndex = true;\n if (field.references) hasReferences = true;\n }\n // Scoped tables get a composite (scope_id, id) PK — see generator\n // body where `primaryKey({ columns: [...] })` is emitted.\n if (Object.prototype.hasOwnProperty.call(table.fields, \"scope_id\")) {\n hasCompositePrimaryKey = true;\n }\n // Keep the generator silent about tableKey in this pass — we only\n // need the existence check above. Referenced here to satisfy lint.\n void tableKey;\n }\n\n coreImports.push(`${dialect}Table`);\n coreImports.push(\"text\");\n\n if (hasBoolean && dialect !== \"sqlite\") coreImports.push(\"boolean\");\n if (hasDate) {\n if (dialect === \"pg\") coreImports.push(\"timestamp\");\n // sqlite uses integer for timestamps, pg uses timestamp\n }\n if (hasNumber || dialect === \"sqlite\") {\n if (dialect === \"pg\") coreImports.push(\"integer\");\n else if (dialect === \"mysql\") coreImports.push(\"int\");\n else coreImports.push(\"integer\");\n }\n if (hasBigint && dialect !== \"sqlite\") coreImports.push(\"bigint\");\n if (hasJson) {\n if (dialect === \"pg\") coreImports.push(\"jsonb\");\n else if (dialect === \"mysql\") coreImports.push(\"json\");\n // sqlite uses text for JSON\n }\n if (hasIndex) coreImports.push(\"index\");\n if (hasUniqueIndex) coreImports.push(\"uniqueIndex\");\n if (hasCompositePrimaryKey) coreImports.push(\"primaryKey\");\n\n // sqlite needs integer for boolean + date\n if (dialect === \"sqlite\" && (hasBoolean || hasDate)) {\n if (!coreImports.includes(\"integer\")) coreImports.push(\"integer\");\n }\n // sqlite needs real for number\n if (dialect === \"sqlite\" && hasNumber) {\n // better-auth uses integer for numbers on sqlite; we use real()\n // for floating-point fidelity.\n }\n\n // Has any timestamp with defaultNow function?\n const hasSqliteTimestamp =\n dialect === \"sqlite\" &&\n Object.values(schema).some((table) =>\n Object.values(table.fields).some(\n (field) =>\n field.type === \"date\" &&\n field.defaultValue &&\n typeof field.defaultValue === \"function\" &&\n field.defaultValue.toString().includes(\"new Date()\"),\n ),\n );\n\n if (hasSqliteTimestamp) {\n rootImports.push(\"sql\");\n }\n\n if (hasReferences || dialect === \"mysql\") {\n // mysql might need varchar for FK fields\n }\n\n // `relations` is only imported when the schema has any references that\n // produce relation blocks (see relationsString generation).\n if (hasReferences) rootImports.push(\"relations\");\n\n const filteredCore = coreImports\n .map((x) => x.trim())\n .filter((x) => x !== \"\");\n\n // Deduplicate\n const uniqueCore = [...new Set(filteredCore)];\n const uniqueRoot = [...new Set(rootImports)];\n\n return `${uniqueRoot.length > 0 ? `import { ${uniqueRoot.join(\", \")} } from \"drizzle-orm\";\\n` : \"\"}import { ${uniqueCore.join(\", \")} } from \"drizzle-orm/${dialect}-core\";\\n`;\n}\n"],"mappings":"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","names":["Command","existsSync","path","existsSync","path","existsSync","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/generate.ts","../src/utils/get-config.ts","../src/generators/drizzle.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { generate } from \"./commands/generate.js\";\n\nprocess.on(\"SIGINT\", () => process.exit(0));\nprocess.on(\"SIGTERM\", () => process.exit(0));\n\nconst program = new Command(\"executor\")\n .version(\"0.0.1\")\n .description(\"Executor CLI\")\n .addCommand(generate)\n .action(() => program.help());\n\nprogram.parse();\n","import { existsSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport { collectSchemas } from \"@executor/sdk\";\nimport { getConfig } from \"../utils/get-config.js\";\nimport { generateDrizzleSchema } from \"../generators/drizzle.js\";\n\nasync function generateAction(opts: {\n cwd: string;\n config?: string;\n output?: string;\n}) {\n const cwd = path.resolve(opts.cwd);\n if (!existsSync(cwd)) {\n console.error(`The directory \"${cwd}\" does not exist.`);\n process.exit(1);\n }\n\n const config = await getConfig({ cwd, configPath: opts.config });\n if (!config) {\n console.error(\n \"No configuration file found. Add an `executor.config.ts` file to \" +\n \"your project or pass the path using the `--config` flag.\",\n );\n process.exit(1);\n }\n\n const schema = collectSchemas(config.plugins);\n\n const result = await generateDrizzleSchema({\n schema,\n dialect: config.dialect,\n file: opts.output,\n });\n\n if (!result.code) {\n console.log(\"Schema is already up to date.\");\n process.exit(0);\n }\n\n const outPath = path.resolve(cwd, result.fileName);\n const outDir = path.dirname(outPath);\n if (!existsSync(outDir)) {\n await fs.mkdir(outDir, { recursive: true });\n }\n\n await fs.writeFile(outPath, result.code);\n console.log(`Schema generated: ${path.relative(cwd, outPath)}`);\n}\n\nexport const generate = new Command(\"generate\")\n .description(\"Generate a drizzle schema file from the executor config\")\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory\",\n process.cwd(),\n )\n .option(\n \"--config <config>\",\n \"path to the executor config file\",\n )\n .option(\n \"--output <output>\",\n \"output file path for the generated schema\",\n )\n .action(generateAction);\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { createJiti } from \"jiti\";\nimport type { ExecutorCliConfig } from \"@executor/sdk\";\n\nconst defaultPaths = [\n \"executor.config.ts\",\n \"executor.config.js\",\n \"src/executor.config.ts\",\n \"src/executor.config.js\",\n];\n\nexport const getConfig = async (opts: {\n cwd: string;\n configPath?: string;\n}): Promise<ExecutorCliConfig | null> => {\n const { cwd, configPath } = opts;\n\n let resolvedPath: string | undefined;\n\n if (configPath) {\n resolvedPath = path.resolve(cwd, configPath);\n if (!existsSync(resolvedPath)) {\n console.error(`Config file not found: ${resolvedPath}`);\n return null;\n }\n } else {\n for (const p of defaultPaths) {\n const candidate = path.resolve(cwd, p);\n if (existsSync(candidate)) {\n resolvedPath = candidate;\n break;\n }\n }\n }\n\n if (!resolvedPath) return null;\n\n const jiti = createJiti(cwd, {\n interopDefault: true,\n moduleCache: false,\n });\n\n const mod = await jiti.import(resolvedPath);\n const config = (mod as { default?: ExecutorCliConfig }).default ?? mod;\n return config as ExecutorCliConfig;\n};\n","// ---------------------------------------------------------------------------\n// Drizzle schema generator — DBSchema → drizzle-orm TS source.\n//\n// Ported from better-auth (packages/cli/src/generators/drizzle.ts) under\n// MIT. Adapted for executor:\n// - Reads our DBSchema shape (modelName optional, key = default)\n// - No auth-specific logic (uuid/serial id modes, usePlural, camelCase)\n// - Always emits text primary keys\n// - Dialect from ExecutorCliConfig, not from adapter.options.provider\n// ---------------------------------------------------------------------------\n\nimport { existsSync } from \"node:fs\";\nimport type { DBSchema, DBFieldAttribute } from \"@executor/storage-core\";\nimport type { SchemaGenerator } from \"./types.js\";\n\ntype Dialect = \"pg\" | \"sqlite\" | \"mysql\";\n\nconst getModelName = (key: string, def: DBSchema[string]): string =>\n def.modelName ?? key;\n\nconst getType = (\n name: string,\n field: DBFieldAttribute,\n dialect: Dialect,\n): string => {\n if (field.references?.field === \"id\") {\n return `text('${name}')`;\n }\n\n const type = field.type;\n\n if (typeof type !== \"string\") {\n // Enum array — e.g. [\"active\", \"inactive\"]\n if (Array.isArray(type) && type.every((x) => typeof x === \"string\")) {\n return {\n sqlite: `text({ enum: [${type.map((x) => `'${x}'`).join(\", \")}] })`,\n pg: `text('${name}', { enum: [${type.map((x) => `'${x}'`).join(\", \")}] })`,\n mysql: `mysqlEnum([${type.map((x) => `'${x}'`).join(\", \")}])`,\n }[dialect];\n }\n throw new TypeError(\n `Invalid field type for field ${name}`,\n );\n }\n\n const typeMap: Record<string, Record<Dialect, string>> = {\n string: {\n sqlite: `text('${name}')`,\n pg: `text('${name}')`,\n mysql: field.unique\n ? `varchar('${name}', { length: 255 })`\n : field.references\n ? `varchar('${name}', { length: 36 })`\n : field.sortable\n ? `varchar('${name}', { length: 255 })`\n : field.index\n ? `varchar('${name}', { length: 255 })`\n : `text('${name}')`,\n },\n boolean: {\n sqlite: `integer('${name}', { mode: 'boolean' })`,\n pg: `boolean('${name}')`,\n mysql: `boolean('${name}')`,\n },\n number: {\n sqlite: `integer('${name}')`,\n pg: field.bigint\n ? `bigint('${name}', { mode: 'number' })`\n : `integer('${name}')`,\n mysql: field.bigint\n ? `bigint('${name}', { mode: 'number' })`\n : `int('${name}')`,\n },\n date: {\n sqlite: `integer('${name}', { mode: 'timestamp_ms' })`,\n pg: `timestamp('${name}')`,\n mysql: `timestamp('${name}', { fsp: 3 })`,\n },\n \"number[]\": {\n sqlite: `text('${name}', { mode: \"json\" })`,\n pg: field.bigint\n ? `bigint('${name}', { mode: 'number' }).array()`\n : `integer('${name}').array()`,\n mysql: `text('${name}', { mode: 'json' })`,\n },\n \"string[]\": {\n sqlite: `text('${name}', { mode: \"json\" })`,\n pg: `text('${name}').array()`,\n mysql: `text('${name}', { mode: \"json\" })`,\n },\n json: {\n sqlite: `text('${name}', { mode: \"json\" })`,\n pg: `jsonb('${name}')`,\n mysql: `json('${name}', { mode: \"json\" })`,\n },\n };\n\n const dbTypeMap = typeMap[type as string];\n if (!dbTypeMap) {\n throw new Error(\n `Unsupported field type '${field.type}' for field '${name}'.`,\n );\n }\n return dbTypeMap[dialect];\n};\n\n// ---------------------------------------------------------------------------\n// Generator\n// ---------------------------------------------------------------------------\n\nexport const generateDrizzleSchema: SchemaGenerator = async ({\n schema,\n dialect,\n file,\n}) => {\n const filePath = file || \"./executor-schema.ts\";\n const fileExist = existsSync(filePath);\n\n let code = generateImport({ dialect, schema });\n\n for (const [tableKey, tableDef] of Object.entries(schema)) {\n const modelName = getModelName(tableKey, tableDef);\n const fields = tableDef.fields;\n\n // Scoped tables get a composite `(scope_id, id)` primary key so two\n // tenants can register rows with the same user-facing id without\n // colliding on a globally-unique PK. Single-column PK stays for\n // unscoped tables (conformance fixtures, the blob store, etc.).\n const hasScopeId = Object.prototype.hasOwnProperty.call(fields, \"scope_id\");\n const id = hasScopeId ? `text('id').notNull()` : `text('id').primaryKey()`;\n\n type TableExtra =\n | { kind: \"uniqueIndex\" | \"index\"; name: string; on: string }\n | { kind: \"primaryKey\"; columns: readonly string[] };\n const extras: TableExtra[] = [];\n\n const assignExtras = (items: TableExtra[]): string => {\n if (!items.length) return \"\";\n const lines: string[] = [`, (table) => [`];\n for (const item of items) {\n if (item.kind === \"primaryKey\") {\n const cols = item.columns.map((c) => `table.${c}`).join(\", \");\n lines.push(` primaryKey({ columns: [${cols}] }),`);\n } else {\n lines.push(` ${item.kind}(\"${item.name}\").on(table.${item.on}),`);\n }\n }\n lines.push(`]`);\n return lines.join(\"\\n\");\n };\n\n if (hasScopeId) {\n extras.push({ kind: \"primaryKey\", columns: [\"scope_id\", \"id\"] });\n }\n\n const tableSchema = `export const ${tableKey} = ${dialect}Table(\"${modelName}\", {\n id: ${id},\n ${Object.entries(fields)\n .filter(([fieldName]) => fieldName !== \"id\")\n .map(([fieldName, attr]) => {\n const physical = attr.fieldName ?? fieldName;\n\n if (attr.index && !attr.unique) {\n extras.push({\n kind: \"index\",\n name: `${tableKey}_${physical}_idx`,\n on: physical,\n });\n } else if (attr.index && attr.unique) {\n extras.push({\n kind: \"uniqueIndex\",\n name: `${tableKey}_${physical}_uidx`,\n on: physical,\n });\n }\n\n let col = getType(physical, attr, dialect);\n\n if (\n attr.defaultValue !== null &&\n typeof attr.defaultValue !== \"undefined\"\n ) {\n if (typeof attr.defaultValue === \"function\") {\n if (\n attr.type === \"date\" &&\n attr.defaultValue.toString().includes(\"new Date()\")\n ) {\n if (dialect === \"sqlite\") {\n col += `.default(sql\\`(cast(unixepoch('subsecond') * 1000 as integer))\\`)`;\n } else {\n col += `.defaultNow()`;\n }\n }\n } else if (typeof attr.defaultValue === \"string\") {\n col += `.default(\"${attr.defaultValue}\")`;\n } else {\n col += `.default(${attr.defaultValue})`;\n }\n }\n\n if (attr.onUpdate && attr.type === \"date\") {\n if (typeof attr.onUpdate === \"function\") {\n col += `.$onUpdate(${attr.onUpdate})`;\n }\n }\n\n return `${physical}: ${col}${attr.required !== false ? \".notNull()\" : \"\"}${\n attr.unique ? \".unique()\" : \"\"\n }${\n attr.references\n ? `.references(()=> ${attr.references.model}.${attr.references.field ?? \"id\"}, { onDelete: '${\n attr.references.onDelete || \"cascade\"\n }' })`\n : \"\"\n }`;\n })\n .join(\",\\n \")}\n}${assignExtras(extras)});`;\n\n code += `\\n${tableSchema}\\n`;\n }\n\n // ---------------------------------------------------------------------------\n // Relations — scan FKs in both directions\n // ---------------------------------------------------------------------------\n\n let relationsString = \"\";\n for (const [tableKey, tableDef] of Object.entries(schema)) {\n const modelName = tableKey;\n\n type Relation = {\n key: string;\n model: string;\n type: \"one\" | \"many\";\n reference?: {\n field: string;\n references: string;\n fieldName: string;\n };\n };\n\n const oneRelations: Relation[] = [];\n const manyRelations: Relation[] = [];\n const manyRelationsSet = new Set<string>();\n\n // Find all FKs in THIS table → \"one\" relations\n for (const [fieldName, field] of Object.entries(tableDef.fields)) {\n if (!field.references) continue;\n const referencedModel = field.references.model;\n const physical = field.fieldName ?? fieldName;\n const fieldRef = `${tableKey}.${physical}`;\n const referenceRef = `${referencedModel}.${field.references.field || \"id\"}`;\n\n oneRelations.push({\n key: referencedModel,\n model: referencedModel,\n type: \"one\",\n reference: {\n field: fieldRef,\n references: referenceRef,\n fieldName,\n },\n });\n }\n\n // Find all OTHER tables that reference THIS table → \"many\" relations\n for (const [otherKey, otherDef] of Object.entries(schema)) {\n if (otherKey === tableKey) continue;\n const hasFK = Object.values(otherDef.fields).some(\n (field) => field.references?.model === tableKey,\n );\n if (!hasFK) continue;\n\n const relationKey = `${otherKey}s`;\n if (!manyRelationsSet.has(relationKey)) {\n manyRelationsSet.add(relationKey);\n manyRelations.push({\n key: relationKey,\n model: otherKey,\n type: \"many\",\n });\n }\n }\n\n // Detect duplicates\n const relationsByModel = new Map<string, Relation[]>();\n for (const rel of oneRelations) {\n if (!rel.reference) continue;\n const arr = relationsByModel.get(rel.key) ?? [];\n arr.push(rel);\n relationsByModel.set(rel.key, arr);\n }\n\n const duplicateRelations: Relation[] = [];\n const singleRelations: Relation[] = [];\n\n for (const [, rels] of relationsByModel.entries()) {\n if (rels.length > 1) {\n duplicateRelations.push(...rels);\n } else {\n singleRelations.push(rels[0]!);\n }\n }\n\n // Duplicate relations get field-specific exports\n for (const rel of duplicateRelations) {\n if (!rel.reference) continue;\n const relExportName = `${modelName}${rel.reference.fieldName.charAt(0).toUpperCase() + rel.reference.fieldName.slice(1)}Relations`;\n const block = `export const ${relExportName} = relations(${modelName}, ({ one }) => ({\n ${rel.key}: one(${rel.model}, {\n fields: [${rel.reference.field}],\n references: [${rel.reference.references}],\n })\n}))`;\n relationsString += `\\n${block}\\n`;\n }\n\n // Combined single relations\n const hasOne = singleRelations.length > 0;\n const hasMany = manyRelations.length > 0;\n\n if (hasOne || hasMany) {\n const destructured = [\n hasOne ? \"one\" : \"\",\n hasMany ? \"many\" : \"\",\n ]\n .filter(Boolean)\n .join(\", \");\n\n const body = [\n ...singleRelations\n .filter((r) => r.reference)\n .map(\n (r) =>\n ` ${r.key}: one(${r.model}, {\\n fields: [${r.reference!.field}],\\n references: [${r.reference!.references}],\\n })`,\n ),\n ...manyRelations.map(\n ({ key, model }) => ` ${key}: many(${model})`,\n ),\n ].join(\",\\n\");\n\n const block = `export const ${modelName}Relations = relations(${modelName}, ({ ${destructured} }) => ({\n${body}\n}))`;\n relationsString += `\\n${block}\\n`;\n }\n }\n\n code += `\\n${relationsString}`;\n\n return {\n code,\n fileName: filePath,\n overwrite: fileExist,\n };\n};\n\n// ---------------------------------------------------------------------------\n// Import generation — only emit what's actually used\n// ---------------------------------------------------------------------------\n\nfunction generateImport({\n dialect,\n schema,\n}: {\n dialect: Dialect;\n schema: DBSchema;\n}) {\n const rootImports: string[] = [];\n const coreImports: string[] = [];\n\n let hasBigint = false;\n let hasJson = false;\n let hasBoolean = false;\n let hasNumber = false;\n let hasDate = false;\n let hasIndex = false;\n let hasUniqueIndex = false;\n let hasReferences = false;\n let hasCompositePrimaryKey = false;\n\n for (const [tableKey, table] of Object.entries(schema)) {\n for (const field of Object.values(table.fields)) {\n if (field.bigint) hasBigint = true;\n if (field.type === \"json\") hasJson = true;\n if (field.type === \"boolean\") hasBoolean = true;\n if (field.type === \"number\" || field.type === \"number[]\") hasNumber = true;\n if (field.type === \"date\") hasDate = true;\n if (field.index && !field.unique) hasIndex = true;\n if (field.index && field.unique) hasUniqueIndex = true;\n if (field.references) hasReferences = true;\n }\n // Scoped tables get a composite (scope_id, id) PK — see generator\n // body where `primaryKey({ columns: [...] })` is emitted.\n if (Object.prototype.hasOwnProperty.call(table.fields, \"scope_id\")) {\n hasCompositePrimaryKey = true;\n }\n // Keep the generator silent about tableKey in this pass — we only\n // need the existence check above. Referenced here to satisfy lint.\n void tableKey;\n }\n\n coreImports.push(`${dialect}Table`);\n coreImports.push(\"text\");\n\n if (hasBoolean && dialect !== \"sqlite\") coreImports.push(\"boolean\");\n if (hasDate) {\n if (dialect === \"pg\") coreImports.push(\"timestamp\");\n // sqlite uses integer for timestamps, pg uses timestamp\n }\n if (hasNumber || dialect === \"sqlite\") {\n if (dialect === \"pg\") coreImports.push(\"integer\");\n else if (dialect === \"mysql\") coreImports.push(\"int\");\n else coreImports.push(\"integer\");\n }\n if (hasBigint && dialect !== \"sqlite\") coreImports.push(\"bigint\");\n if (hasJson) {\n if (dialect === \"pg\") coreImports.push(\"jsonb\");\n else if (dialect === \"mysql\") coreImports.push(\"json\");\n // sqlite uses text for JSON\n }\n if (hasIndex) coreImports.push(\"index\");\n if (hasUniqueIndex) coreImports.push(\"uniqueIndex\");\n if (hasCompositePrimaryKey) coreImports.push(\"primaryKey\");\n\n // sqlite needs integer for boolean + date\n if (dialect === \"sqlite\" && (hasBoolean || hasDate)) {\n if (!coreImports.includes(\"integer\")) coreImports.push(\"integer\");\n }\n // sqlite needs real for number\n if (dialect === \"sqlite\" && hasNumber) {\n // better-auth uses integer for numbers on sqlite; we use real()\n // for floating-point fidelity.\n }\n\n // Has any timestamp with defaultNow function?\n const hasSqliteTimestamp =\n dialect === \"sqlite\" &&\n Object.values(schema).some((table) =>\n Object.values(table.fields).some(\n (field) =>\n field.type === \"date\" &&\n field.defaultValue &&\n typeof field.defaultValue === \"function\" &&\n field.defaultValue.toString().includes(\"new Date()\"),\n ),\n );\n\n if (hasSqliteTimestamp) {\n rootImports.push(\"sql\");\n }\n\n if (hasReferences || dialect === \"mysql\") {\n // mysql might need varchar for FK fields\n }\n\n // `relations` is only imported when the schema has any references that\n // produce relation blocks (see relationsString generation).\n if (hasReferences) rootImports.push(\"relations\");\n\n const filteredCore = coreImports\n .map((x) => x.trim())\n .filter((x) => x !== \"\");\n\n // Deduplicate\n const uniqueCore = [...new Set(filteredCore)];\n const uniqueRoot = [...new Set(rootImports)];\n\n return `${uniqueRoot.length > 0 ? `import { ${uniqueRoot.join(\", \")} } from \"drizzle-orm\";\\n` : \"\"}import { ${uniqueCore.join(\", \")} } from \"drizzle-orm/${dialect}-core\";\\n`;\n}\n"],"mappings":"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","names":["Command","existsSync","path","existsSync","path","existsSync","Command"]}
|
package/package.json
CHANGED