schema-seed 0.1.9 → 0.1.12

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 CHANGED
@@ -128,6 +128,9 @@ export default defineConfig({
128
128
 
129
129
  ## CLI Reference
130
130
 
131
+ ### `seed`
132
+ Seed the database with generated data.
133
+
131
134
  | Flag | Description | Default |
132
135
  | :--- | :--- | :--- |
133
136
  | `--db <url>` | Database connection string | - |
@@ -141,6 +144,30 @@ export default defineConfig({
141
144
  | `--with-parents` | Automatically seed required parent tables | `false` |
142
145
  | `--confirm <str>` | Require a confirmation string (for safety) | - |
143
146
  | `--allow-production`| Allow running against production hosts | `false` |
147
+ | `--out <path>` | Output the seeding report to a JSON file | - |
148
+
149
+ ### `reset`
150
+ Truncate all tables in the database. Useful for clearing data before a fresh seed or test run.
151
+
152
+ ```bash
153
+ schema-seed reset --db "postgres://..."
154
+ ```
155
+
156
+ | Flag | Description |
157
+ | :--- | :--- |
158
+ | `--db <url>` | Database connection string |
159
+ | `--allow-production`| Allow running against production hosts |
160
+
161
+ ### `introspect`
162
+ Introspect the database schema and print it as a JSON object. This is useful for debugging or generating a schema snapshot.
163
+
164
+ ```bash
165
+ schema-seed introspect --db "postgres://..." > schema.json
166
+ ```
167
+
168
+ | Flag | Description |
169
+ | :--- | :--- |
170
+ | `--db <url>` | Database connection string |
144
171
 
145
172
  ## Safety Features
146
173
 
package/dist/bin.js CHANGED
@@ -116,7 +116,10 @@ var commonOptions = (cmd) => {
116
116
  commonOptions(program.command("seed")).description("Seed the database").action(async (options) => {
117
117
  try {
118
118
  const config = await loadConfig(options.config);
119
- const mergedOptions = { ...config, ...options };
119
+ const cleanOptions = Object.fromEntries(
120
+ Object.entries(options).filter(([_, v]) => v !== void 0)
121
+ );
122
+ const mergedOptions = { ...config, ...cleanOptions };
120
123
  if (options.rows === void 0 && config.rows === void 0) {
121
124
  mergedOptions.rows = 10;
122
125
  }
@@ -175,10 +178,95 @@ program.command("preview").description("Preview the seeding plan without executi
175
178
  await seedCmd?.parseAsync(["--dry-run", ...process.argv.slice(3)], { from: "user" });
176
179
  });
177
180
  program.command("reset").description("Truncate all tables").option("--db <url>", "Database connection string").option("--allow-production", "Allow running against production databases").action(async (options) => {
178
- console.log("Resetting database...");
181
+ try {
182
+ const config = await loadConfig();
183
+ const mergedOptions = { ...config, ...options };
184
+ let dbUrl = mergedOptions.db;
185
+ if (mergedOptions.dbType === "mongodb" && mergedOptions.mongodb?.uri) {
186
+ dbUrl = mergedOptions.mongodb.uri;
187
+ }
188
+ if (!dbUrl) {
189
+ console.error("\u274C Error: Database connection string is required.");
190
+ process.exit(1);
191
+ }
192
+ const dbType = mergedOptions.dbType || inferDbType(dbUrl);
193
+ const adapter = await getAdapter(dbType, dbUrl);
194
+ if (mergedOptions.allowProduction !== true) {
195
+ const prodKeywords = ["prod", "production", "live", "cloud", "aws", "azure", "gcp"];
196
+ if (prodKeywords.some((kw) => dbUrl.toLowerCase().includes(kw))) {
197
+ console.error("\u274C Error: Refusing to reset a potential production database.");
198
+ console.error(" Use --allow-production to override.");
199
+ process.exit(1);
200
+ }
201
+ }
202
+ await adapter.connect();
203
+ if (dbType === "mongodb") {
204
+ const mongoAdapter = adapter;
205
+ let collections = [];
206
+ if (mergedOptions.mongodb?.collections) {
207
+ collections = Object.keys(mergedOptions.mongodb.collections);
208
+ } else if (mongoAdapter.introspectCollections) {
209
+ const introspected = await mongoAdapter.introspectCollections();
210
+ collections = introspected.map((c) => c.name);
211
+ }
212
+ if (collections.length === 0) {
213
+ console.warn("\u26A0\uFE0F No collections found to reset.");
214
+ } else {
215
+ console.log(`\u{1F5D1}\uFE0F Resetting ${collections.length} collections...`);
216
+ if (mongoAdapter.truncateCollections) {
217
+ await mongoAdapter.truncateCollections(collections);
218
+ console.log("\u2705 Database reset complete.");
219
+ } else {
220
+ console.error("\u274C Error: Adapter does not support truncation.");
221
+ }
222
+ }
223
+ } else {
224
+ const sqlAdapter = adapter;
225
+ console.log("\u{1F50D} Introspecting database...");
226
+ const schema = await sqlAdapter.introspectSchema();
227
+ const tableNames = Object.keys(schema.tables);
228
+ if (tableNames.length === 0) {
229
+ console.warn("\u26A0\uFE0F No tables found to reset.");
230
+ } else {
231
+ console.log(`\u{1F5D1}\uFE0F Resetting ${tableNames.length} tables...`);
232
+ await sqlAdapter.truncateTables(tableNames);
233
+ console.log("\u2705 Database reset complete.");
234
+ }
235
+ }
236
+ await adapter.disconnect();
237
+ } catch (err) {
238
+ console.error(`
239
+ \u274C Error: ${err.message}`);
240
+ process.exit(1);
241
+ }
179
242
  });
180
243
  program.command("introspect").description("Introspect the database schema and print as JSON").option("--db <url>", "Database connection string").action(async (options) => {
181
- console.log("Introspecting database...");
244
+ try {
245
+ const config = await loadConfig();
246
+ const mergedOptions = { ...config, ...options };
247
+ let dbUrl = mergedOptions.db;
248
+ if (mergedOptions.dbType === "mongodb" && mergedOptions.mongodb?.uri) {
249
+ dbUrl = mergedOptions.mongodb.uri;
250
+ }
251
+ if (!dbUrl) {
252
+ console.error("\u274C Error: Database connection string is required.");
253
+ process.exit(1);
254
+ }
255
+ const dbType = mergedOptions.dbType || inferDbType(dbUrl);
256
+ const adapter = await getAdapter(dbType, dbUrl);
257
+ await adapter.connect();
258
+ if (dbType === "mongodb") {
259
+ console.error("\u274C Introspection not yet supported for MongoDB CLI output.");
260
+ } else {
261
+ const schema = await adapter.introspectSchema();
262
+ console.log(JSON.stringify(schema, null, 2));
263
+ }
264
+ await adapter.disconnect();
265
+ } catch (err) {
266
+ console.error(`
267
+ \u274C Error: ${err.message}`);
268
+ process.exit(1);
269
+ }
182
270
  });
183
271
  program.parse();
184
272
  //# sourceMappingURL=bin.js.map
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bin.ts","../src/config.mts"],"sourcesContent":["import 'dotenv/config'\nimport { Command } from 'commander'\nimport {\n version,\n runSeedSql,\n runSeedMongo,\n createSeedPlan,\n reportToConsole,\n reportToJson\n} from 'schema-seed-core'\nimport { generators, inferGenerator } from 'schema-seed-generators'\nimport { loadConfig } from './config.mjs'\nimport { writeFileSync, existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { createInterface } from 'node:readline/promises'\nimport { createRequire } from 'node:module'\nimport { pathToFileURL } from 'node:url'\n\nconst program = new Command()\n\nprogram\n .name('schema-seed')\n .description('CLI to seed your database with realistic data')\n .version(version)\n\nasync function getAdapter(dbType: string, dbUrl: string) {\n const unscopedName = `schema-seed-adapter-${dbType}`\n const scopedName = `@alinazar-111/schema-seed-adapter-${dbType}`\n\n const tryImport = async (name: string) => {\n try {\n const cwd = process.cwd()\n // Use createRequire to resolve the package from the current working directory\n const require = createRequire(resolve(cwd, 'index.js'))\n const packagePath = require.resolve(name)\n const url = pathToFileURL(packagePath).href\n return await import(url)\n } catch (err: any) {\n try {\n // Fallback to standard import (for globally installed adapters)\n return await import(name)\n } catch (err2: any) {\n return null\n }\n }\n }\n\n const module = (await tryImport(unscopedName)) || (await tryImport(scopedName))\n\n if (!module) {\n const installCmd = existsSync(resolve(process.cwd(), 'pnpm-lock.yaml'))\n ? `pnpm add ${unscopedName}`\n : `npm install ${unscopedName}`\n throw new Error(`Adapter package not found. Please install it: ${installCmd}`)\n }\n\n try {\n const adapterName = dbType.charAt(0).toUpperCase() + dbType.slice(1) + 'Adapter'\n const AdapterClass = module[adapterName] || module.Adapter || module.default\n\n if (!AdapterClass) {\n const factoryMethod = `create${dbType.charAt(0).toUpperCase() + dbType.slice(1)}Adapter`\n if (typeof module[factoryMethod] === 'function') {\n return module[factoryMethod](dbUrl)\n }\n throw new Error(`Could not find adapter class or factory in ${unscopedName}`)\n }\n\n return new AdapterClass(dbUrl)\n } catch (err: any) {\n throw new Error(`Failed to load adapter ${unscopedName}: ${err.message}`)\n }\n}\n\nfunction inferDbType(dbUrl: string): string {\n if (dbUrl.startsWith('postgres://') || dbUrl.startsWith('postgresql://')) return 'postgres'\n if (dbUrl.startsWith('mysql://')) return 'mysql'\n if (dbUrl.startsWith('sqlite://') || dbUrl.endsWith('.db')) return 'sqlite'\n if (dbUrl.startsWith('mongodb://')) return 'mongodb'\n if (dbUrl.startsWith('sqlserver://')) return 'mssql'\n return 'postgres' // Default\n}\n\nasync function confirmAction(expected: string): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout\n })\n const answer = await rl.question(`⚠️ Type \"${expected}\" to confirm: `)\n rl.close()\n return answer === expected\n}\n\nconst commonOptions = (cmd: Command) => {\n return cmd\n .option('--db <url>', 'Database connection string')\n .option('--dbType <type>', 'Database type (postgres, mysql, sqlite, mssql, oracle, mongodb)')\n .option('--config <path>', 'Path to config file')\n .option('--table <names...>', 'Specific tables to seed')\n .option('--all', 'Seed all tables')\n .option('--rows <number>', 'Number of rows per table', (v) => parseInt(v))\n .option('--rows-per-table <json>', 'JSON mapping of table names to row counts', (v) => JSON.parse(v))\n .option('--seed <string>', 'Random seed')\n .option('--dry-run', 'Do not execute any writes')\n .option('--truncate', 'Truncate tables before seeding')\n .option('--allow-production', 'Allow running against production databases')\n .option('--confirm <string>', 'Require typed confirmation string to proceed')\n .option('--with-parents', 'Include parent tables for foreign keys')\n .option('--out <path>', 'Output report to JSON file')\n}\n\ncommonOptions(program.command('seed'))\n .description('Seed the database')\n .action(async (options) => {\n try {\n const config = await loadConfig(options.config)\n\n // Merge options: CLI flags override config file\n const mergedOptions = { ...config, ...options }\n\n // Handle rows default (commander default was overriding config)\n if (options.rows === undefined && (config as any).rows === undefined) {\n mergedOptions.rows = 10\n }\n\n if (options.rowsPerTable) {\n mergedOptions.rows = options.rowsPerTable\n }\n\n if (mergedOptions.confirm && !mergedOptions.dryRun) {\n const confirmed = await confirmAction(mergedOptions.confirm)\n if (!confirmed) {\n console.error('❌ Confirmation failed. Aborting.')\n process.exit(1)\n }\n }\n\n let dbUrl = mergedOptions.db\n if (mergedOptions.dbType === 'mongodb' && mergedOptions.mongodb?.uri) {\n dbUrl = mergedOptions.mongodb.uri\n }\n\n if (!dbUrl) {\n console.error('❌ Error: Database connection string is required.')\n console.error(' Provide it via --db flag or in your seed.config.ts file.')\n if (Object.keys(config).length === 0) {\n console.error(' (No config file was found in the current directory)')\n }\n process.exit(1)\n }\n\n const dbType = mergedOptions.dbType || inferDbType(dbUrl)\n const adapter = await getAdapter(dbType, dbUrl)\n\n let report;\n if (dbType === 'mongodb') {\n report = await runSeedMongo(adapter as any, mergedOptions as any, {\n dryRun: mergedOptions.dryRun,\n allowProduction: mergedOptions.allowProduction\n }, { generators, inferGenerator })\n } else {\n await adapter.connect()\n const schema = await (adapter as any).introspectSchema()\n const plan = createSeedPlan(schema, mergedOptions, (adapter as any).capabilities?.deferrableConstraints)\n\n report = await runSeedSql(adapter as any, schema, plan, mergedOptions, {\n generators,\n inferGenerator,\n overrides: mergedOptions.overrides\n })\n }\n\n reportToConsole(report)\n\n if (options.out) {\n writeFileSync(resolve(process.cwd(), options.out), reportToJson(report))\n }\n } catch (err: any) {\n console.error(`\\n❌ Error: ${err.message}`)\n process.exit(1)\n }\n })\n\nprogram.command('preview')\n .description('Preview the seeding plan without executing')\n .action(async (options) => {\n // Same as seed --dry-run\n const seedCmd = program.commands.find(c => c.name() === 'seed')\n await seedCmd?.parseAsync(['--dry-run', ...process.argv.slice(3)], { from: 'user' })\n })\n\nprogram.command('reset')\n .description('Truncate all tables')\n .option('--db <url>', 'Database connection string')\n .option('--allow-production', 'Allow running against production databases')\n .action(async (options) => {\n console.log('Resetting database...')\n // Implementation would call adapter.truncateTables()\n })\n\nprogram.command('introspect')\n .description('Introspect the database schema and print as JSON')\n .option('--db <url>', 'Database connection string')\n .action(async (options) => {\n console.log('Introspecting database...')\n // Implementation would call adapter.introspectSchema()\n })\n\nprogram.parse()\n","import { createJiti } from 'jiti'\nimport { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { type SeedOptions } from 'schema-seed-core'\nimport { type MongoSeedConfig } from 'schema-seed-core/mongo'\n\nexport type Config = (SeedOptions & {\n db?: string\n dbType?: string\n overrides?: Record<string, any>\n}) | MongoSeedConfig\n\nexport async function loadConfig(configPath?: string): Promise<Config> {\n const jiti = createJiti(import.meta.url)\n\n if (configPath) {\n const fullPath = resolve(process.cwd(), configPath)\n if (!existsSync(fullPath)) {\n throw new Error(`Config file not found at ${fullPath}`)\n }\n const module = await jiti.import(fullPath) as any\n console.log(`✅ Loaded config from ${configPath}`)\n return module.default || module\n }\n\n const defaultPaths = [\n resolve(process.cwd(), 'seed.config.ts'),\n resolve(process.cwd(), 'seed.config.js'),\n resolve(process.cwd(), 'seed.config.mjs'),\n ]\n\n for (const path of defaultPaths) {\n if (existsSync(path)) {\n try {\n const module = await jiti.import(path) as any\n console.log(`✅ Loaded config from ${path}`)\n return module.default || module\n } catch (err: any) {\n throw new Error(`Failed to load config file ${path}: ${err.message}`)\n }\n }\n }\n\n return {}\n}\n"],"mappings":"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","names":["existsSync","resolve","require"]}
1
+ {"version":3,"sources":["../src/bin.ts","../src/config.mts"],"sourcesContent":["import 'dotenv/config'\nimport { Command } from 'commander'\nimport {\n version,\n runSeedSql,\n runSeedMongo,\n createSeedPlan,\n reportToConsole,\n reportToJson\n} from 'schema-seed-core'\nimport { generators, inferGenerator } from 'schema-seed-generators'\nimport { loadConfig } from './config.mjs'\nimport { writeFileSync, existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { createInterface } from 'node:readline/promises'\nimport { createRequire } from 'node:module'\nimport { pathToFileURL } from 'node:url'\n\nconst program = new Command()\n\nprogram\n .name('schema-seed')\n .description('CLI to seed your database with realistic data')\n .version(version)\n\nasync function getAdapter(dbType: string, dbUrl: string) {\n const unscopedName = `schema-seed-adapter-${dbType}`\n const scopedName = `@alinazar-111/schema-seed-adapter-${dbType}`\n\n const tryImport = async (name: string) => {\n try {\n const cwd = process.cwd()\n // Use createRequire to resolve the package from the current working directory\n const require = createRequire(resolve(cwd, 'index.js'))\n const packagePath = require.resolve(name)\n const url = pathToFileURL(packagePath).href\n return await import(url)\n } catch (err: any) {\n try {\n // Fallback to standard import (for globally installed adapters)\n return await import(name)\n } catch (err2: any) {\n return null\n }\n }\n }\n\n const module = (await tryImport(unscopedName)) || (await tryImport(scopedName))\n\n if (!module) {\n const installCmd = existsSync(resolve(process.cwd(), 'pnpm-lock.yaml'))\n ? `pnpm add ${unscopedName}`\n : `npm install ${unscopedName}`\n throw new Error(`Adapter package not found. Please install it: ${installCmd}`)\n }\n\n try {\n const adapterName = dbType.charAt(0).toUpperCase() + dbType.slice(1) + 'Adapter'\n const AdapterClass = module[adapterName] || module.Adapter || module.default\n\n if (!AdapterClass) {\n const factoryMethod = `create${dbType.charAt(0).toUpperCase() + dbType.slice(1)}Adapter`\n if (typeof module[factoryMethod] === 'function') {\n return module[factoryMethod](dbUrl)\n }\n throw new Error(`Could not find adapter class or factory in ${unscopedName}`)\n }\n\n return new AdapterClass(dbUrl)\n } catch (err: any) {\n throw new Error(`Failed to load adapter ${unscopedName}: ${err.message}`)\n }\n}\n\nfunction inferDbType(dbUrl: string): string {\n if (dbUrl.startsWith('postgres://') || dbUrl.startsWith('postgresql://')) return 'postgres'\n if (dbUrl.startsWith('mysql://')) return 'mysql'\n if (dbUrl.startsWith('sqlite://') || dbUrl.endsWith('.db')) return 'sqlite'\n if (dbUrl.startsWith('mongodb://')) return 'mongodb'\n if (dbUrl.startsWith('sqlserver://')) return 'mssql'\n return 'postgres' // Default\n}\n\nasync function confirmAction(expected: string): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout\n })\n const answer = await rl.question(`⚠️ Type \"${expected}\" to confirm: `)\n rl.close()\n return answer === expected\n}\n\nconst commonOptions = (cmd: Command) => {\n return cmd\n .option('--db <url>', 'Database connection string')\n .option('--dbType <type>', 'Database type (postgres, mysql, sqlite, mssql, oracle, mongodb)')\n .option('--config <path>', 'Path to config file')\n .option('--table <names...>', 'Specific tables to seed')\n .option('--all', 'Seed all tables')\n .option('--rows <number>', 'Number of rows per table', (v) => parseInt(v))\n .option('--rows-per-table <json>', 'JSON mapping of table names to row counts', (v) => JSON.parse(v))\n .option('--seed <string>', 'Random seed')\n .option('--dry-run', 'Do not execute any writes')\n .option('--truncate', 'Truncate tables before seeding')\n .option('--allow-production', 'Allow running against production databases')\n .option('--confirm <string>', 'Require typed confirmation string to proceed')\n .option('--with-parents', 'Include parent tables for foreign keys')\n .option('--out <path>', 'Output report to JSON file')\n}\n\ncommonOptions(program.command('seed'))\n .description('Seed the database')\n .action(async (options) => {\n try {\n const config = await loadConfig(options.config)\n\n // Merge options: CLI flags override config file\n // Merge options: CLI flags override config file\n const cleanOptions = Object.fromEntries(\n Object.entries(options).filter(([_, v]) => v !== undefined)\n )\n const mergedOptions: any = { ...config, ...cleanOptions }\n\n // Handle rows default (commander default was overriding config)\n if (options.rows === undefined && (config as any).rows === undefined) {\n mergedOptions.rows = 10\n }\n\n if (options.rowsPerTable) {\n mergedOptions.rows = options.rowsPerTable\n }\n\n if (mergedOptions.confirm && !mergedOptions.dryRun) {\n const confirmed = await confirmAction(mergedOptions.confirm)\n if (!confirmed) {\n console.error('❌ Confirmation failed. Aborting.')\n process.exit(1)\n }\n }\n\n let dbUrl = mergedOptions.db\n if (mergedOptions.dbType === 'mongodb' && mergedOptions.mongodb?.uri) {\n dbUrl = mergedOptions.mongodb.uri\n }\n\n if (!dbUrl) {\n console.error('❌ Error: Database connection string is required.')\n console.error(' Provide it via --db flag or in your seed.config.ts file.')\n if (Object.keys(config).length === 0) {\n console.error(' (No config file was found in the current directory)')\n }\n process.exit(1)\n }\n\n const dbType = mergedOptions.dbType || inferDbType(dbUrl)\n const adapter = await getAdapter(dbType, dbUrl)\n\n let report;\n if (dbType === 'mongodb') {\n report = await runSeedMongo(adapter as any, mergedOptions as any, {\n dryRun: mergedOptions.dryRun,\n allowProduction: mergedOptions.allowProduction\n }, { generators, inferGenerator })\n } else {\n await adapter.connect()\n const schema = await (adapter as any).introspectSchema()\n const plan = createSeedPlan(schema, mergedOptions, (adapter as any).capabilities?.deferrableConstraints)\n\n report = await runSeedSql(adapter as any, schema, plan, mergedOptions, {\n generators,\n inferGenerator,\n overrides: mergedOptions.overrides\n })\n }\n\n reportToConsole(report)\n\n if (options.out) {\n writeFileSync(resolve(process.cwd(), options.out), reportToJson(report))\n }\n } catch (err: any) {\n console.error(`\\n❌ Error: ${err.message}`)\n process.exit(1)\n }\n })\n\nprogram.command('preview')\n .description('Preview the seeding plan without executing')\n .action(async (options) => {\n // Same as seed --dry-run\n const seedCmd = program.commands.find(c => c.name() === 'seed')\n await seedCmd?.parseAsync(['--dry-run', ...process.argv.slice(3)], { from: 'user' })\n })\n\nprogram.command('reset')\n .description('Truncate all tables')\n .option('--db <url>', 'Database connection string')\n .option('--allow-production', 'Allow running against production databases')\n .action(async (options) => {\n try {\n const config = await loadConfig()\n const mergedOptions = { ...config, ...options }\n\n let dbUrl = mergedOptions.db\n if (mergedOptions.dbType === 'mongodb' && mergedOptions.mongodb?.uri) {\n dbUrl = mergedOptions.mongodb.uri\n }\n\n if (!dbUrl) {\n console.error('❌ Error: Database connection string is required.')\n process.exit(1)\n }\n\n const dbType = mergedOptions.dbType || inferDbType(dbUrl)\n const adapter = await getAdapter(dbType, dbUrl)\n\n if (mergedOptions.allowProduction !== true) {\n // Basic production check\n const prodKeywords = ['prod', 'production', 'live', 'cloud', 'aws', 'azure', 'gcp']\n if (prodKeywords.some(kw => dbUrl.toLowerCase().includes(kw))) {\n console.error('❌ Error: Refusing to reset a potential production database.')\n console.error(' Use --allow-production to override.')\n process.exit(1)\n }\n }\n\n await adapter.connect()\n\n if (dbType === 'mongodb') {\n const mongoAdapter = adapter as any\n let collections: string[] = []\n\n if (mergedOptions.mongodb?.collections) {\n collections = Object.keys(mergedOptions.mongodb.collections)\n } else if (mongoAdapter.introspectCollections) {\n const introspected = await mongoAdapter.introspectCollections()\n collections = introspected.map((c: any) => c.name)\n }\n\n if (collections.length === 0) {\n console.warn('⚠️ No collections found to reset.')\n } else {\n console.log(`🗑️ Resetting ${collections.length} collections...`)\n if (mongoAdapter.truncateCollections) {\n await mongoAdapter.truncateCollections(collections)\n console.log('✅ Database reset complete.')\n } else {\n console.error('❌ Error: Adapter does not support truncation.')\n }\n }\n } else {\n const sqlAdapter = adapter as any\n console.log('🔍 Introspecting database...')\n const schema = await sqlAdapter.introspectSchema()\n const tableNames = Object.keys(schema.tables)\n\n if (tableNames.length === 0) {\n console.warn('⚠️ No tables found to reset.')\n } else {\n console.log(`🗑️ Resetting ${tableNames.length} tables...`)\n await sqlAdapter.truncateTables(tableNames)\n console.log('✅ Database reset complete.')\n }\n }\n\n await adapter.disconnect()\n } catch (err: any) {\n console.error(`\\n❌ Error: ${err.message}`)\n process.exit(1)\n }\n })\n\nprogram.command('introspect')\n .description('Introspect the database schema and print as JSON')\n .option('--db <url>', 'Database connection string')\n .action(async (options) => {\n try {\n const config = await loadConfig()\n const mergedOptions = { ...config, ...options }\n\n let dbUrl = mergedOptions.db\n if (mergedOptions.dbType === 'mongodb' && mergedOptions.mongodb?.uri) {\n dbUrl = mergedOptions.mongodb.uri\n }\n\n if (!dbUrl) {\n console.error('❌ Error: Database connection string is required.')\n process.exit(1)\n }\n\n const dbType = mergedOptions.dbType || inferDbType(dbUrl)\n const adapter = await getAdapter(dbType, dbUrl)\n\n await adapter.connect()\n\n if (dbType === 'mongodb') {\n console.error('❌ Introspection not yet supported for MongoDB CLI output.')\n } else {\n const schema = await (adapter as any).introspectSchema()\n console.log(JSON.stringify(schema, null, 2))\n }\n\n await adapter.disconnect()\n } catch (err: any) {\n console.error(`\\n❌ Error: ${err.message}`)\n process.exit(1)\n }\n })\n\nprogram.parse()\n","import { createJiti } from 'jiti'\nimport { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { type SeedOptions } from 'schema-seed-core'\nimport { type MongoSeedConfig } from 'schema-seed-core/mongo'\n\nexport type Config = (SeedOptions & {\n db?: string\n dbType?: string\n overrides?: Record<string, any>\n}) | MongoSeedConfig\n\nexport async function loadConfig(configPath?: string): Promise<Config> {\n const jiti = createJiti(import.meta.url)\n\n if (configPath) {\n const fullPath = resolve(process.cwd(), configPath)\n if (!existsSync(fullPath)) {\n throw new Error(`Config file not found at ${fullPath}`)\n }\n const module = await jiti.import(fullPath) as any\n console.log(`✅ Loaded config from ${configPath}`)\n return module.default || module\n }\n\n const defaultPaths = [\n resolve(process.cwd(), 'seed.config.ts'),\n resolve(process.cwd(), 'seed.config.js'),\n resolve(process.cwd(), 'seed.config.mjs'),\n ]\n\n for (const path of defaultPaths) {\n if (existsSync(path)) {\n try {\n const module = await jiti.import(path) as any\n console.log(`✅ Loaded config from ${path}`)\n return module.default || module\n } catch (err: any) {\n throw new Error(`Failed to load config file ${path}: ${err.message}`)\n }\n }\n }\n\n return {}\n}\n"],"mappings":";;;AAAA,OAAO;AACP,SAAS,eAAe;AACxB;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP,SAAS,YAAY,sBAAsB;;;ACV3C,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AAUxB,eAAsB,WAAW,YAAsC;AACnE,QAAM,OAAO,WAAW,YAAY,GAAG;AAEvC,MAAI,YAAY;AACZ,UAAM,WAAW,QAAQ,QAAQ,IAAI,GAAG,UAAU;AAClD,QAAI,CAAC,WAAW,QAAQ,GAAG;AACvB,YAAM,IAAI,MAAM,4BAA4B,QAAQ,EAAE;AAAA,IAC1D;AACA,UAAM,SAAS,MAAM,KAAK,OAAO,QAAQ;AACzC,YAAQ,IAAI,6BAAwB,UAAU,EAAE;AAChD,WAAO,OAAO,WAAW;AAAA,EAC7B;AAEA,QAAM,eAAe;AAAA,IACjB,QAAQ,QAAQ,IAAI,GAAG,gBAAgB;AAAA,IACvC,QAAQ,QAAQ,IAAI,GAAG,gBAAgB;AAAA,IACvC,QAAQ,QAAQ,IAAI,GAAG,iBAAiB;AAAA,EAC5C;AAEA,aAAW,QAAQ,cAAc;AAC7B,QAAI,WAAW,IAAI,GAAG;AAClB,UAAI;AACA,cAAM,SAAS,MAAM,KAAK,OAAO,IAAI;AACrC,gBAAQ,IAAI,6BAAwB,IAAI,EAAE;AAC1C,eAAO,OAAO,WAAW;AAAA,MAC7B,SAAS,KAAU;AACf,cAAM,IAAI,MAAM,8BAA8B,IAAI,KAAK,IAAI,OAAO,EAAE;AAAA,MACxE;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO,CAAC;AACZ;;;ADhCA,SAAS,eAAe,cAAAA,mBAAkB;AAC1C,SAAS,WAAAC,gBAAe;AACxB,SAAS,uBAAuB;AAChC,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAE9B,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACK,KAAK,aAAa,EAClB,YAAY,+CAA+C,EAC3D,QAAQ,OAAO;AAEpB,eAAe,WAAW,QAAgB,OAAe;AACrD,QAAM,eAAe,uBAAuB,MAAM;AAClD,QAAM,aAAa,qCAAqC,MAAM;AAE9D,QAAM,YAAY,OAAO,SAAiB;AACtC,QAAI;AACA,YAAM,MAAM,QAAQ,IAAI;AAExB,YAAMC,WAAU,cAAcD,SAAQ,KAAK,UAAU,CAAC;AACtD,YAAM,cAAcC,SAAQ,QAAQ,IAAI;AACxC,YAAM,MAAM,cAAc,WAAW,EAAE;AACvC,aAAO,MAAM,OAAO;AAAA,IACxB,SAAS,KAAU;AACf,UAAI;AAEA,eAAO,MAAM,OAAO;AAAA,MACxB,SAAS,MAAW;AAChB,eAAO;AAAA,MACX;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,SAAU,MAAM,UAAU,YAAY,KAAO,MAAM,UAAU,UAAU;AAE7E,MAAI,CAAC,QAAQ;AACT,UAAM,aAAaF,YAAWC,SAAQ,QAAQ,IAAI,GAAG,gBAAgB,CAAC,IAChE,YAAY,YAAY,KACxB,eAAe,YAAY;AACjC,UAAM,IAAI,MAAM,iDAAiD,UAAU,EAAE;AAAA,EACjF;AAEA,MAAI;AACA,UAAM,cAAc,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC,IAAI;AACvE,UAAM,eAAe,OAAO,WAAW,KAAK,OAAO,WAAW,OAAO;AAErE,QAAI,CAAC,cAAc;AACf,YAAM,gBAAgB,SAAS,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC,CAAC;AAC/E,UAAI,OAAO,OAAO,aAAa,MAAM,YAAY;AAC7C,eAAO,OAAO,aAAa,EAAE,KAAK;AAAA,MACtC;AACA,YAAM,IAAI,MAAM,8CAA8C,YAAY,EAAE;AAAA,IAChF;AAEA,WAAO,IAAI,aAAa,KAAK;AAAA,EACjC,SAAS,KAAU;AACf,UAAM,IAAI,MAAM,0BAA0B,YAAY,KAAK,IAAI,OAAO,EAAE;AAAA,EAC5E;AACJ;AAEA,SAAS,YAAY,OAAuB;AACxC,MAAI,MAAM,WAAW,aAAa,KAAK,MAAM,WAAW,eAAe,EAAG,QAAO;AACjF,MAAI,MAAM,WAAW,UAAU,EAAG,QAAO;AACzC,MAAI,MAAM,WAAW,WAAW,KAAK,MAAM,SAAS,KAAK,EAAG,QAAO;AACnE,MAAI,MAAM,WAAW,YAAY,EAAG,QAAO;AAC3C,MAAI,MAAM,WAAW,cAAc,EAAG,QAAO;AAC7C,SAAO;AACX;AAEA,eAAe,cAAc,UAAoC;AAC7D,QAAM,KAAK,gBAAgB;AAAA,IACvB,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,EACpB,CAAC;AACD,QAAM,SAAS,MAAM,GAAG,SAAS,uBAAa,QAAQ,gBAAgB;AACtE,KAAG,MAAM;AACT,SAAO,WAAW;AACtB;AAEA,IAAM,gBAAgB,CAAC,QAAiB;AACpC,SAAO,IACF,OAAO,cAAc,4BAA4B,EACjD,OAAO,mBAAmB,iEAAiE,EAC3F,OAAO,mBAAmB,qBAAqB,EAC/C,OAAO,sBAAsB,yBAAyB,EACtD,OAAO,SAAS,iBAAiB,EACjC,OAAO,mBAAmB,4BAA4B,CAAC,MAAM,SAAS,CAAC,CAAC,EACxE,OAAO,2BAA2B,6CAA6C,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,EACnG,OAAO,mBAAmB,aAAa,EACvC,OAAO,aAAa,2BAA2B,EAC/C,OAAO,cAAc,gCAAgC,EACrD,OAAO,sBAAsB,4CAA4C,EACzE,OAAO,sBAAsB,8CAA8C,EAC3E,OAAO,kBAAkB,wCAAwC,EACjE,OAAO,gBAAgB,4BAA4B;AAC5D;AAEA,cAAc,QAAQ,QAAQ,MAAM,CAAC,EAChC,YAAY,mBAAmB,EAC/B,OAAO,OAAO,YAAY;AACvB,MAAI;AACA,UAAM,SAAS,MAAM,WAAW,QAAQ,MAAM;AAI9C,UAAM,eAAe,OAAO;AAAA,MACxB,OAAO,QAAQ,OAAO,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,MAAM,MAAS;AAAA,IAC9D;AACA,UAAM,gBAAqB,EAAE,GAAG,QAAQ,GAAG,aAAa;AAGxD,QAAI,QAAQ,SAAS,UAAc,OAAe,SAAS,QAAW;AAClE,oBAAc,OAAO;AAAA,IACzB;AAEA,QAAI,QAAQ,cAAc;AACtB,oBAAc,OAAO,QAAQ;AAAA,IACjC;AAEA,QAAI,cAAc,WAAW,CAAC,cAAc,QAAQ;AAChD,YAAM,YAAY,MAAM,cAAc,cAAc,OAAO;AAC3D,UAAI,CAAC,WAAW;AACZ,gBAAQ,MAAM,uCAAkC;AAChD,gBAAQ,KAAK,CAAC;AAAA,MAClB;AAAA,IACJ;AAEA,QAAI,QAAQ,cAAc;AAC1B,QAAI,cAAc,WAAW,aAAa,cAAc,SAAS,KAAK;AAClE,cAAQ,cAAc,QAAQ;AAAA,IAClC;AAEA,QAAI,CAAC,OAAO;AACR,cAAQ,MAAM,uDAAkD;AAChE,cAAQ,MAAM,6DAA6D;AAC3E,UAAI,OAAO,KAAK,MAAM,EAAE,WAAW,GAAG;AAClC,gBAAQ,MAAM,wDAAwD;AAAA,MAC1E;AACA,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,UAAM,SAAS,cAAc,UAAU,YAAY,KAAK;AACxD,UAAM,UAAU,MAAM,WAAW,QAAQ,KAAK;AAE9C,QAAI;AACJ,QAAI,WAAW,WAAW;AACtB,eAAS,MAAM,aAAa,SAAgB,eAAsB;AAAA,QAC9D,QAAQ,cAAc;AAAA,QACtB,iBAAiB,cAAc;AAAA,MACnC,GAAG,EAAE,YAAY,eAAe,CAAC;AAAA,IACrC,OAAO;AACH,YAAM,QAAQ,QAAQ;AACtB,YAAM,SAAS,MAAO,QAAgB,iBAAiB;AACvD,YAAM,OAAO,eAAe,QAAQ,eAAgB,QAAgB,cAAc,qBAAqB;AAEvG,eAAS,MAAM,WAAW,SAAgB,QAAQ,MAAM,eAAe;AAAA,QACnE;AAAA,QACA;AAAA,QACA,WAAW,cAAc;AAAA,MAC7B,CAAC;AAAA,IACL;AAEA,oBAAgB,MAAM;AAEtB,QAAI,QAAQ,KAAK;AACb,oBAAcA,SAAQ,QAAQ,IAAI,GAAG,QAAQ,GAAG,GAAG,aAAa,MAAM,CAAC;AAAA,IAC3E;AAAA,EACJ,SAAS,KAAU;AACf,YAAQ,MAAM;AAAA,gBAAc,IAAI,OAAO,EAAE;AACzC,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ,CAAC;AAEL,QAAQ,QAAQ,SAAS,EACpB,YAAY,4CAA4C,EACxD,OAAO,OAAO,YAAY;AAEvB,QAAM,UAAU,QAAQ,SAAS,KAAK,OAAK,EAAE,KAAK,MAAM,MAAM;AAC9D,QAAM,SAAS,WAAW,CAAC,aAAa,GAAG,QAAQ,KAAK,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,OAAO,CAAC;AACvF,CAAC;AAEL,QAAQ,QAAQ,OAAO,EAClB,YAAY,qBAAqB,EACjC,OAAO,cAAc,4BAA4B,EACjD,OAAO,sBAAsB,4CAA4C,EACzE,OAAO,OAAO,YAAY;AACvB,MAAI;AACA,UAAM,SAAS,MAAM,WAAW;AAChC,UAAM,gBAAgB,EAAE,GAAG,QAAQ,GAAG,QAAQ;AAE9C,QAAI,QAAQ,cAAc;AAC1B,QAAI,cAAc,WAAW,aAAa,cAAc,SAAS,KAAK;AAClE,cAAQ,cAAc,QAAQ;AAAA,IAClC;AAEA,QAAI,CAAC,OAAO;AACR,cAAQ,MAAM,uDAAkD;AAChE,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,UAAM,SAAS,cAAc,UAAU,YAAY,KAAK;AACxD,UAAM,UAAU,MAAM,WAAW,QAAQ,KAAK;AAE9C,QAAI,cAAc,oBAAoB,MAAM;AAExC,YAAM,eAAe,CAAC,QAAQ,cAAc,QAAQ,SAAS,OAAO,SAAS,KAAK;AAClF,UAAI,aAAa,KAAK,QAAM,MAAM,YAAY,EAAE,SAAS,EAAE,CAAC,GAAG;AAC3D,gBAAQ,MAAM,kEAA6D;AAC3E,gBAAQ,MAAM,wCAAwC;AACtD,gBAAQ,KAAK,CAAC;AAAA,MAClB;AAAA,IACJ;AAEA,UAAM,QAAQ,QAAQ;AAEtB,QAAI,WAAW,WAAW;AACtB,YAAM,eAAe;AACrB,UAAI,cAAwB,CAAC;AAE7B,UAAI,cAAc,SAAS,aAAa;AACpC,sBAAc,OAAO,KAAK,cAAc,QAAQ,WAAW;AAAA,MAC/D,WAAW,aAAa,uBAAuB;AAC3C,cAAM,eAAe,MAAM,aAAa,sBAAsB;AAC9D,sBAAc,aAAa,IAAI,CAAC,MAAW,EAAE,IAAI;AAAA,MACrD;AAEA,UAAI,YAAY,WAAW,GAAG;AAC1B,gBAAQ,KAAK,8CAAoC;AAAA,MACrD,OAAO;AACH,gBAAQ,IAAI,8BAAkB,YAAY,MAAM,iBAAiB;AACjE,YAAI,aAAa,qBAAqB;AAClC,gBAAM,aAAa,oBAAoB,WAAW;AAClD,kBAAQ,IAAI,iCAA4B;AAAA,QAC5C,OAAO;AACH,kBAAQ,MAAM,oDAA+C;AAAA,QACjE;AAAA,MACJ;AAAA,IACJ,OAAO;AACH,YAAM,aAAa;AACnB,cAAQ,IAAI,qCAA8B;AAC1C,YAAM,SAAS,MAAM,WAAW,iBAAiB;AACjD,YAAM,aAAa,OAAO,KAAK,OAAO,MAAM;AAE5C,UAAI,WAAW,WAAW,GAAG;AACzB,gBAAQ,KAAK,yCAA+B;AAAA,MAChD,OAAO;AACH,gBAAQ,IAAI,8BAAkB,WAAW,MAAM,YAAY;AAC3D,cAAM,WAAW,eAAe,UAAU;AAC1C,gBAAQ,IAAI,iCAA4B;AAAA,MAC5C;AAAA,IACJ;AAEA,UAAM,QAAQ,WAAW;AAAA,EAC7B,SAAS,KAAU;AACf,YAAQ,MAAM;AAAA,gBAAc,IAAI,OAAO,EAAE;AACzC,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ,CAAC;AAEL,QAAQ,QAAQ,YAAY,EACvB,YAAY,kDAAkD,EAC9D,OAAO,cAAc,4BAA4B,EACjD,OAAO,OAAO,YAAY;AACvB,MAAI;AACA,UAAM,SAAS,MAAM,WAAW;AAChC,UAAM,gBAAgB,EAAE,GAAG,QAAQ,GAAG,QAAQ;AAE9C,QAAI,QAAQ,cAAc;AAC1B,QAAI,cAAc,WAAW,aAAa,cAAc,SAAS,KAAK;AAClE,cAAQ,cAAc,QAAQ;AAAA,IAClC;AAEA,QAAI,CAAC,OAAO;AACR,cAAQ,MAAM,uDAAkD;AAChE,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,UAAM,SAAS,cAAc,UAAU,YAAY,KAAK;AACxD,UAAM,UAAU,MAAM,WAAW,QAAQ,KAAK;AAE9C,UAAM,QAAQ,QAAQ;AAEtB,QAAI,WAAW,WAAW;AACtB,cAAQ,MAAM,gEAA2D;AAAA,IAC7E,OAAO;AACH,YAAM,SAAS,MAAO,QAAgB,iBAAiB;AACvD,cAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC/C;AAEA,UAAM,QAAQ,WAAW;AAAA,EAC7B,SAAS,KAAU;AACf,YAAQ,MAAM;AAAA,gBAAc,IAAI,OAAO,EAAE;AACzC,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ,CAAC;AAEL,QAAQ,MAAM;","names":["existsSync","resolve","require"]}
package/dist/index.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,66 +1,67 @@
1
1
  {
2
- "name": "schema-seed",
3
- "version": "0.1.9",
4
- "type": "module",
5
- "description": "CLI for schema-seed",
6
- "author": "Ali Nazar",
7
- "license": "MIT",
8
- "private": false,
9
- "repository": {
10
- "type": "git",
11
- "url": "https://github.com/alinazar-111/schema-seed.git"
12
- },
13
- "homepage": "https://github.com/alinazar-111/schema-seed#readme",
14
- "bugs": {
15
- "url": "https://github.com/alinazar-111/schema-seed/issues"
16
- },
17
- "keywords": [
18
- "database",
19
- "seeding",
20
- "test-data",
21
- "cli",
22
- "schema-seed"
23
- ],
24
- "main": "./dist/index.js",
25
- "module": "./dist/index.js",
26
- "exports": {
27
- ".": {
28
- "import": "./dist/index.js"
2
+ "name": "schema-seed",
3
+ "version": "0.1.12",
4
+ "type": "module",
5
+ "description": "CLI for schema-seed",
6
+ "author": "Ali Nazar",
7
+ "license": "MIT",
8
+ "private": false,
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/alinazar-111/schema-seed.git"
12
+ },
13
+ "homepage": "https://github.com/alinazar-111/schema-seed#readme",
14
+ "bugs": {
15
+ "url": "https://github.com/alinazar-111/schema-seed/issues"
16
+ },
17
+ "keywords": [
18
+ "database",
19
+ "seeding",
20
+ "test-data",
21
+ "cli",
22
+ "schema-seed"
23
+ ],
24
+ "main": "./dist/index.js",
25
+ "module": "./dist/index.js",
26
+ "exports": {
27
+ ".": {
28
+ "import": "./dist/index.js"
29
+ }
30
+ },
31
+ "bin": {
32
+ "schema-seed": "./dist/bin.js"
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "README.md",
37
+ "LICENSE"
38
+ ],
39
+ "scripts": {
40
+ "build": "tsup",
41
+ "clean": "rm -rf dist",
42
+ "dev": "tsup --watch",
43
+ "lint": "eslint .",
44
+ "test": "vitest run --passWithNoTests",
45
+ "typecheck": "tsc --noEmit",
46
+ "prepublishOnly": "pnpm build"
47
+ },
48
+ "dependencies": {
49
+ "schema-seed-core": "^0.1.12",
50
+ "schema-seed-generators": "^0.1.12",
51
+ "commander": "^12.1.0",
52
+ "dotenv": "^17.2.3",
53
+ "jiti": "^2.6.1"
54
+ },
55
+ "devDependencies": {
56
+ "schema-seed-adapter-mongodb": "workspace:*",
57
+ "schema-seed-adapter-mysql": "workspace:*",
58
+ "schema-seed-adapter-postgres": "workspace:*",
59
+ "schema-seed-adapter-sqlite": "workspace:*",
60
+ "schema-seed-adapter-mssql": "workspace:*",
61
+ "schema-seed-adapter-oracle": "workspace:*",
62
+ "@types/node": "^20.19.27",
63
+ "tsup": "^8.3.5",
64
+ "typescript": "^5.7.2",
65
+ "vitest": "^2.1.8"
29
66
  }
30
- },
31
- "bin": {
32
- "schema-seed": "./dist/bin.js"
33
- },
34
- "files": [
35
- "dist",
36
- "README.md",
37
- "LICENSE"
38
- ],
39
- "dependencies": {
40
- "commander": "^12.1.0",
41
- "dotenv": "^17.2.3",
42
- "jiti": "^2.6.1",
43
- "schema-seed-core": "0.1.9",
44
- "schema-seed-generators": "0.1.9"
45
- },
46
- "devDependencies": {
47
- "@types/node": "^20.19.27",
48
- "tsup": "^8.3.5",
49
- "typescript": "^5.7.2",
50
- "vitest": "^2.1.8",
51
- "schema-seed-adapter-mongodb": "0.1.9",
52
- "schema-seed-adapter-mysql": "0.1.9",
53
- "schema-seed-adapter-postgres": "0.1.9",
54
- "schema-seed-adapter-sqlite": "0.1.9",
55
- "schema-seed-adapter-mssql": "0.1.9",
56
- "schema-seed-adapter-oracle": "0.1.9"
57
- },
58
- "scripts": {
59
- "build": "tsup",
60
- "clean": "rm -rf dist",
61
- "dev": "tsup --watch",
62
- "lint": "eslint .",
63
- "test": "vitest run --passWithNoTests",
64
- "typecheck": "tsc --noEmit"
65
- }
66
67
  }