@lssm/app.cli-database 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,52 @@
1
+ # @lssm/app.cli-database
2
+
3
+ Prisma wrapper and CLI tools for managing database schemas, migrations, and seeding within the LSSM monorepo.
4
+
5
+ ## Purpose
6
+
7
+ To abstract and standardize Prisma usage across multiple services and verticals. It provides a unified CLI (`database`) to handle common database tasks like migrations (`dbs:migrate`), client generation (`dbs:generate`), and seeding (`dbs:seed`).
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ npm install @lssm/app.cli-database
13
+ # or
14
+ bun add @lssm/app.cli-database
15
+ ```
16
+
17
+ ## Key Concepts
18
+
19
+ - **Unified Config**: Centralizes Prisma configuration.
20
+ - **CLI Wrapper**: Wraps standard Prisma commands for consistent execution in the monorepo environment.
21
+ - **Seeding**: Standardized seeding entry point.
22
+
23
+ ## Exports
24
+
25
+ - `cli`: The command-line interface.
26
+ - `prisma`: Re-exports `@prisma/client`.
27
+
28
+ ## Usage
29
+
30
+ ### CLI Commands
31
+
32
+ Run via package scripts:
33
+
34
+ ```bash
35
+ # Generate Prisma Client
36
+ bun database generate
37
+
38
+ # Run migrations
39
+ bun database migrate:dev
40
+
41
+ # Seed database
42
+ bun database seed
43
+ ```
44
+
45
+ ### In Code
46
+
47
+ ```ts
48
+ import { PrismaClient } from '@lssm/app.cli-database';
49
+
50
+ const prisma = new PrismaClient();
51
+ const users = await prisma.user.findMany();
52
+ ```
@@ -0,0 +1 @@
1
+ import{createRequire as e}from"node:module";var t=e(import.meta.url);export{t as __require};
package/dist/cli.d.mts ADDED
@@ -0,0 +1 @@
1
+ export { };
package/dist/cli.mjs ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import{runImport as e}from"./commands/import.mjs";import{runCheck as t}from"./commands/check.mjs";import{runGenerate as n}from"./commands/generate.mjs";import{runMigrate as r}from"./commands/migrate.mjs";import{runSeed as i}from"./commands/seed.mjs";import a from"minimist";async function o(){let o=a(process.argv.slice(2)),[s]=o._;switch(s){case`import`:await e(o);break;case`check`:await t(o);break;case`generate`:await n(o);break;case`migrate:dev`:case`migrate:deploy`:case`migrate:status`:await r(s,o);break;case`seed`:await i(o);break;default:console.error(`Usage: database <import|check|generate|migrate:dev|migrate:deploy|migrate:status|seed>`),process.exit(1)}}o().catch(e=>{console.error(e),process.exit(1)});export{};
3
+ //# sourceMappingURL=cli.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.mjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport mri from 'minimist';\nimport { runImport } from './commands/import.js';\nimport { runCheck } from './commands/check.js';\nimport { runGenerate } from './commands/generate.js';\nimport { runMigrate } from './commands/migrate.js';\nimport { runSeed } from './commands/seed.js';\n\nasync function main() {\n const argv = mri(process.argv.slice(2));\n const [cmd] = argv._ as string[];\n\n switch (cmd) {\n case 'import':\n await runImport(argv);\n break;\n case 'check':\n await runCheck(argv);\n break;\n case 'generate':\n await runGenerate(argv);\n break;\n case 'migrate:dev':\n case 'migrate:deploy':\n case 'migrate:status':\n await runMigrate(cmd, argv);\n break;\n case 'seed':\n await runSeed(argv);\n break;\n default:\n console.error(\n 'Usage: database <import|check|generate|migrate:dev|migrate:deploy|migrate:status|seed>'\n );\n process.exit(1);\n }\n}\n\nmain().catch((err) => {\n console.error(err);\n process.exit(1);\n});\n"],"mappings":";kRAQA,eAAe,GAAO,CACpB,IAAM,EAAO,EAAI,QAAQ,KAAK,MAAM,EAAE,CAAC,CACjC,CAAC,GAAO,EAAK,EAEnB,OAAQ,EAAR,CACE,IAAK,SACH,MAAM,EAAU,EAAK,CACrB,MACF,IAAK,QACH,MAAM,EAAS,EAAK,CACpB,MACF,IAAK,WACH,MAAM,EAAY,EAAK,CACvB,MACF,IAAK,cACL,IAAK,iBACL,IAAK,iBACH,MAAM,EAAW,EAAK,EAAK,CAC3B,MACF,IAAK,OACH,MAAM,EAAQ,EAAK,CACnB,MACF,QACE,QAAQ,MACN,yFACD,CACD,QAAQ,KAAK,EAAE,EAIrB,GAAM,CAAC,MAAO,GAAQ,CACpB,QAAQ,MAAM,EAAI,CAClB,QAAQ,KAAK,EAAE,EACf"}
@@ -0,0 +1,2 @@
1
+ import e from"node:fs";import t from"node:path";import n from"node:crypto";function r(e){return n.createHash(`sha256`).update(e).digest(`hex`)}async function i(n){let i=n.target||process.cwd(),a=t.join(i,`prisma`,`schema`,`imported`,`imported.lock.json`);e.existsSync(a)||(console.error(`No imported.lock.json found. Run: database import`),process.exit(1));let o=JSON.parse(e.readFileSync(a,`utf8`)),s=!0;for(let t of o.entries){if(!e.existsSync(t.sourcePath)){console.error(`Missing source: ${t.sourcePath}`),s=!1;continue}r(e.readFileSync(t.sourcePath,`utf8`))!==t.sha256&&(console.error(`Drift detected for ${t.moduleName} (${t.sourcePath})`),s=!1)}s||process.exit(2),console.log(`Imported schemas are in sync with lock.`)}export{i as runCheck};
2
+ //# sourceMappingURL=check.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.mjs","names":[],"sources":["../../src/commands/check.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport { type ImportLock } from '../lib/types.js';\n\nfunction sha256(content: string) {\n return crypto.createHash('sha256').update(content).digest('hex');\n}\n\nexport async function runCheck(argv: any) {\n const target = (argv.target as string) || process.cwd();\n const lockPath = path.join(\n target,\n 'prisma',\n 'schema',\n 'imported',\n 'imported.lock.json'\n );\n if (!fs.existsSync(lockPath)) {\n console.error('No imported.lock.json found. Run: database import');\n process.exit(1);\n }\n const lock = JSON.parse(fs.readFileSync(lockPath, 'utf8')) as ImportLock;\n let ok = true;\n for (const e of lock.entries) {\n if (!fs.existsSync(e.sourcePath)) {\n console.error(`Missing source: ${e.sourcePath}`);\n ok = false;\n continue;\n }\n const raw = fs.readFileSync(e.sourcePath, 'utf8');\n const digest = sha256(raw);\n if (digest !== e.sha256) {\n console.error(`Drift detected for ${e.moduleName} (${e.sourcePath})`);\n ok = false;\n }\n }\n if (!ok) {\n process.exit(2);\n }\n console.log('Imported schemas are in sync with lock.');\n}\n"],"mappings":"2EAKA,SAAS,EAAO,EAAiB,CAC/B,OAAO,EAAO,WAAW,SAAS,CAAC,OAAO,EAAQ,CAAC,OAAO,MAAM,CAGlE,eAAsB,EAAS,EAAW,CACxC,IAAM,EAAU,EAAK,QAAqB,QAAQ,KAAK,CACjD,EAAW,EAAK,KACpB,EACA,SACA,SACA,WACA,qBACD,CACI,EAAG,WAAW,EAAS,GAC1B,QAAQ,MAAM,oDAAoD,CAClE,QAAQ,KAAK,EAAE,EAEjB,IAAM,EAAO,KAAK,MAAM,EAAG,aAAa,EAAU,OAAO,CAAC,CACtD,EAAK,GACT,IAAK,IAAM,KAAK,EAAK,QAAS,CAC5B,GAAI,CAAC,EAAG,WAAW,EAAE,WAAW,CAAE,CAChC,QAAQ,MAAM,mBAAmB,EAAE,aAAa,CAChD,EAAK,GACL,SAGa,EADH,EAAG,aAAa,EAAE,WAAY,OAAO,CACvB,GACX,EAAE,SACf,QAAQ,MAAM,sBAAsB,EAAE,WAAW,IAAI,EAAE,WAAW,GAAG,CACrE,EAAK,IAGJ,GACH,QAAQ,KAAK,EAAE,CAEjB,QAAQ,IAAI,0CAA0C"}
@@ -0,0 +1,2 @@
1
+ import{execa as e}from"execa";async function t(t){await e(`prisma`,[`generate`],{stdio:`inherit`})}export{t as runGenerate};
2
+ //# sourceMappingURL=generate.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.mjs","names":[],"sources":["../../src/commands/generate.ts"],"sourcesContent":["import { execa } from 'execa';\n\nexport async function runGenerate(argv: any) {\n await execa('prisma', ['generate'], { stdio: 'inherit' });\n}\n"],"mappings":"8BAEA,eAAsB,EAAY,EAAW,CAC3C,MAAM,EAAM,SAAU,CAAC,WAAW,CAAE,CAAE,MAAO,UAAW,CAAC"}
@@ -0,0 +1,2 @@
1
+ import{__require as e}from"../_virtual/rolldown_runtime.mjs";import t from"node:fs";import n from"node:path";import r from"node:crypto";import{pathToFileURL as i}from"node:url";function a(e){return r.createHash(`sha256`).update(e).digest(`hex`)}function o(e){return e.replace(/datasource\s+\w+\s*\{[\s\S]*?\}/g,``).replace(/generator\s+\w+\s*\{[\s\S]*?\}/g,``).trim()}async function s(r){let s=r.target||process.cwd(),c=r.modules||``;async function l(){let e=[n.join(s,`prisma-merger.config.ts`),n.join(s,`prisma-merger.config.mts`),n.join(s,`prisma-merger.config.js`),n.join(s,`prisma-merger.config.mjs`),n.join(s,`prisma-merger.config.cjs`),n.join(s,`prisma-merger.config.json`)];for(let n of e)if(t.existsSync(n))if(n.endsWith(`.json`)){let e=JSON.parse(t.readFileSync(n,`utf8`));if(Array.isArray(e.modules)&&e.modules.length>0)return e.modules}else if(n.endsWith(`.ts`)||n.endsWith(`.mts`)){let e=t.readFileSync(n,`utf8`).match(/modules\s*:\s*\[([\s\S]*?)\]/m);if(Array.isArray(e)&&typeof e[1]==`string`){let t=e[1]||``,n=[],r=/['\"]([^'\"]+)['\"]/g,i;for(;i=r.exec(t);){let e=i[1]??``;e&&n.push(e)}if(n.length>0)return n}}else{let e=await import(i(n).href),t=e.default||e;if(Array.isArray(t.modules)&&t.modules.length>0)return t.modules}return null}let u=c.split(`,`).map(e=>e.trim()).filter(Boolean);if(u.length===0){let e=await l();e&&(u=e)}u.length===0&&(console.error(`No modules specified. Provide --modules or define prisma-merger.config.ts { modules: [...] }`),process.exit(1));let d=n.join(s,`prisma`,`schema`,`imported`);t.mkdirSync(d,{recursive:!0});let f=[];for(let r of u){let i=e.resolve(n.join(r,`package.json`)),s=n.dirname(i),c=n.join(s,`prisma`,`schema.prisma`);t.existsSync(c)||(console.error(`Module ${r} missing prisma/schema.prisma`),process.exit(1));let l=t.readFileSync(c,`utf8`),u=o(l),p=n.join(d,n.basename(r).replace(/^@/,``).replace(/\//g,`_`));t.mkdirSync(p,{recursive:!0});let m=n.join(p,`models.prisma`);t.writeFileSync(m,u,`utf8`);let h=JSON.parse(t.readFileSync(i,`utf8`));f.push({moduleName:r,version:h.version||`0.0.0`,sourcePath:c,sha256:a(l)})}let p={updatedAt:new Date().toISOString(),entries:f};t.writeFileSync(n.join(d,`imported.lock.json`),JSON.stringify(p,null,2)),console.log(`Imported ${f.length} modules into ${d}`)}export{s as runImport};
2
+ //# sourceMappingURL=import.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.mjs","names":["arr: string","mods: string[]","m: RegExpExecArray | null","modules: string[]","entries: ImportLockEntry[]","lock: ImportLock"],"sources":["../../src/commands/import.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport { pathToFileURL } from 'node:url';\nimport { type ImportLock, type ImportLockEntry } from '../lib/types.js';\n\nfunction sha256(content: string) {\n return crypto.createHash('sha256').update(content).digest('hex');\n}\n\nfunction stripDatasourceAndGenerators(schema: string): string {\n // naive strip: remove blocks beginning with 'datasource ' or 'generator '\n return schema\n .replace(/datasource\\s+\\w+\\s*\\{[\\s\\S]*?\\}/g, '')\n .replace(/generator\\s+\\w+\\s*\\{[\\s\\S]*?\\}/g, '')\n .trim();\n}\n\nexport async function runImport(argv: any) {\n const target = (argv.target as string) || process.cwd();\n const modulesArg = (argv.modules as string) || '';\n async function loadModulesFromMergerConfig(): Promise<string[] | null> {\n const candidates = [\n path.join(target, 'prisma-merger.config.ts'),\n path.join(target, 'prisma-merger.config.mts'),\n path.join(target, 'prisma-merger.config.js'),\n path.join(target, 'prisma-merger.config.mjs'),\n path.join(target, 'prisma-merger.config.cjs'),\n path.join(target, 'prisma-merger.config.json'),\n ];\n for (const file of candidates) {\n if (!fs.existsSync(file)) continue;\n if (file.endsWith('.json')) {\n const json = JSON.parse(fs.readFileSync(file, 'utf8')) as {\n modules?: string[];\n };\n if (Array.isArray(json.modules) && json.modules.length > 0)\n return json.modules;\n } else if (file.endsWith('.ts') || file.endsWith('.mts')) {\n // Parse TS config without executing it\n const raw = fs.readFileSync(file, 'utf8');\n const match = raw.match(/modules\\s*:\\s*\\[([\\s\\S]*?)\\]/m);\n if (Array.isArray(match) && typeof match[1] === 'string') {\n const arr: string = match[1] || '';\n const mods: string[] = [];\n const re = /['\\\"]([^'\\\"]+)['\\\"]/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(arr))) {\n const val = m[1] ?? '';\n if (val) mods.push(val);\n }\n if (mods.length > 0) return mods;\n }\n } else {\n const mod = await import(pathToFileURL(file).href);\n const cfg = mod.default || mod;\n if (Array.isArray(cfg.modules) && cfg.modules.length > 0)\n return cfg.modules as string[];\n }\n }\n return null;\n }\n\n let modules: string[] = modulesArg\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n if (modules.length === 0) {\n const fromCfg = await loadModulesFromMergerConfig();\n if (fromCfg) modules = fromCfg;\n }\n if (modules.length === 0) {\n console.error(\n 'No modules specified. Provide --modules or define prisma-merger.config.ts { modules: [...] }'\n );\n process.exit(1);\n }\n\n const importedDir = path.join(target, 'prisma', 'schema', 'imported');\n fs.mkdirSync(importedDir, { recursive: true });\n\n const entries: ImportLockEntry[] = [];\n\n for (const mod of modules) {\n const pkgPath = require.resolve(path.join(mod, 'package.json'));\n const modRoot = path.dirname(pkgPath);\n const schemaPath = path.join(modRoot, 'prisma', 'schema.prisma');\n if (!fs.existsSync(schemaPath)) {\n console.error(`Module ${mod} missing prisma/schema.prisma`);\n process.exit(1);\n }\n const raw = fs.readFileSync(schemaPath, 'utf8');\n const stripped = stripDatasourceAndGenerators(raw);\n const outDir = path.join(\n importedDir,\n path.basename(mod).replace(/^@/, '').replace(/\\//g, '_')\n );\n fs.mkdirSync(outDir, { recursive: true });\n const outFile = path.join(outDir, 'models.prisma');\n fs.writeFileSync(outFile, stripped, 'utf8');\n\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));\n entries.push({\n moduleName: mod,\n version: pkg.version || '0.0.0',\n sourcePath: schemaPath,\n sha256: sha256(raw),\n });\n }\n\n const lock: ImportLock = { updatedAt: new Date().toISOString(), entries };\n fs.writeFileSync(\n path.join(importedDir, 'imported.lock.json'),\n JSON.stringify(lock, null, 2)\n );\n console.log(`Imported ${entries.length} modules into ${importedDir}`);\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{execa as e}from"execa";async function t(t,n){if(t===`migrate:dev`){await e(`prisma`,[`migrate`,`dev`],{stdio:`inherit`});return}if(t===`migrate:deploy`){await e(`prisma`,[`migrate`,`deploy`],{stdio:`inherit`});return}if(t===`migrate:status`){await e(`prisma`,[`migrate`,`status`],{stdio:`inherit`});return}}export{t as runMigrate};
2
+ //# sourceMappingURL=migrate.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.mjs","names":[],"sources":["../../src/commands/migrate.ts"],"sourcesContent":["import { execa } from 'execa';\n\nexport async function runMigrate(cmd: string, argv: any) {\n if (cmd === 'migrate:dev') {\n await execa('prisma', ['migrate', 'dev'], { stdio: 'inherit' });\n return;\n }\n if (cmd === 'migrate:deploy') {\n await execa('prisma', ['migrate', 'deploy'], { stdio: 'inherit' });\n return;\n }\n if (cmd === 'migrate:status') {\n await execa('prisma', ['migrate', 'status'], { stdio: 'inherit' });\n return;\n }\n}\n"],"mappings":"8BAEA,eAAsB,EAAW,EAAa,EAAW,CACvD,GAAI,IAAQ,cAAe,CACzB,MAAM,EAAM,SAAU,CAAC,UAAW,MAAM,CAAE,CAAE,MAAO,UAAW,CAAC,CAC/D,OAEF,GAAI,IAAQ,iBAAkB,CAC5B,MAAM,EAAM,SAAU,CAAC,UAAW,SAAS,CAAE,CAAE,MAAO,UAAW,CAAC,CAClE,OAEF,GAAI,IAAQ,iBAAkB,CAC5B,MAAM,EAAM,SAAU,CAAC,UAAW,SAAS,CAAE,CAAE,MAAO,UAAW,CAAC,CAClE"}
@@ -0,0 +1,2 @@
1
+ import{execa as e}from"execa";async function t(t){try{await e(`prisma`,[`db`,`seed`],{stdio:`inherit`})}catch(e){throw console.warn(`No prisma seed configured or seed failed.`),e}}export{t as runSeed};
2
+ //# sourceMappingURL=seed.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.mjs","names":[],"sources":["../../src/commands/seed.ts"],"sourcesContent":["import { execa } from 'execa';\n\nexport async function runSeed(argv: any) {\n // Delegate to prisma db seed if configured, else no-op\n try {\n await execa('prisma', ['db', 'seed'], { stdio: 'inherit' });\n } catch (e) {\n console.warn('No prisma seed configured or seed failed.');\n throw e;\n }\n}\n"],"mappings":"8BAEA,eAAsB,EAAQ,EAAW,CAEvC,GAAI,CACF,MAAM,EAAM,SAAU,CAAC,KAAM,OAAO,CAAE,CAAE,MAAO,UAAW,CAAC,OACpD,EAAG,CAEV,MADA,QAAQ,KAAK,4CAA4C,CACnD"}
@@ -0,0 +1,4 @@
1
+ import { createPrismaClientFromEnv, getSingletonClient } from "./lib/client.mjs";
2
+ import { ImportLock, ImportLockEntry } from "./lib/types.mjs";
3
+ import { MergedPrismaConfig, defineMergedPrismaConfig } from "./lib/config.mjs";
4
+ export { ImportLock, ImportLockEntry, MergedPrismaConfig, createPrismaClientFromEnv, defineMergedPrismaConfig, getSingletonClient };
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ import{createPrismaClientFromEnv as e,getSingletonClient as t}from"./lib/client.mjs";import{defineMergedPrismaConfig as n}from"./lib/config.mjs";export{e as createPrismaClientFromEnv,n as defineMergedPrismaConfig,t as getSingletonClient};
@@ -0,0 +1,8 @@
1
+ import { PrismaClient } from "@prisma/client";
2
+
3
+ //#region src/lib/client.d.ts
4
+ declare function createPrismaClientFromEnv(envVar: string, fallback?: string): PrismaClient;
5
+ declare function getSingletonClient(envVar?: string): PrismaClient;
6
+ //#endregion
7
+ export { createPrismaClientFromEnv, getSingletonClient };
8
+ //# sourceMappingURL=client.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.mts","names":[],"sources":["../../src/lib/client.ts"],"sourcesContent":[],"mappings":";;;iBAMgB,yBAAA,qCAGb;iBAea,kBAAA,mBAA6C"}
@@ -0,0 +1,2 @@
1
+ import{PrismaClient as e}from"@prisma/client";import{PrismaPg as t}from"@prisma/adapter-pg";const n=global;function r(n,r){let i=process.env[n]||(r?process.env[r]:void 0);if(!i)throw Error(`Missing database URL env: ${n}${r?` (or ${r})`:``}`);return new e({adapter:new t({connectionString:`${i}`.replaceAll(`sslmode=require`,`sslmode=disable`)})})}function i(e=`DATABASE_URL`){return n.__lssm_db||=r(e),n.__lssm_db}export{r as createPrismaClientFromEnv,i as getSingletonClient};
2
+ //# sourceMappingURL=client.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.mjs","names":[],"sources":["../../src/lib/client.ts"],"sourcesContent":["import { PrismaClient } from '@prisma/client';\nimport { PrismaPg } from '@prisma/adapter-pg';\n\ntype GlobalWithDb = typeof globalThis & { __lssm_db?: PrismaClient };\nconst g = global as GlobalWithDb;\n\nexport function createPrismaClientFromEnv(\n envVar: string,\n fallback?: string\n): PrismaClient {\n const raw =\n process.env[envVar] || (fallback ? process.env[fallback] : undefined);\n if (!raw)\n throw new Error(\n `Missing database URL env: ${envVar}${fallback ? ` (or ${fallback})` : ''}`\n );\n const connectionString = `${raw}`.replaceAll(\n 'sslmode=require',\n 'sslmode=disable'\n );\n const adapter = new PrismaPg({ connectionString });\n return new PrismaClient({ adapter });\n}\n\nexport function getSingletonClient(envVar = 'DATABASE_URL'): PrismaClient {\n if (!g.__lssm_db) {\n g.__lssm_db = createPrismaClientFromEnv(envVar);\n }\n return g.__lssm_db;\n}\n"],"mappings":"4FAIA,MAAM,EAAI,OAEV,SAAgB,EACd,EACA,EACc,CACd,IAAM,EACJ,QAAQ,IAAI,KAAY,EAAW,QAAQ,IAAI,GAAY,IAAA,IAC7D,GAAI,CAAC,EACH,MAAU,MACR,6BAA6B,IAAS,EAAW,QAAQ,EAAS,GAAK,KACxE,CAMH,OAAO,IAAI,EAAa,CAAE,QADV,IAAI,EAAS,CAAE,iBAJN,GAAG,IAAM,WAChC,kBACA,kBACD,CACgD,CAAC,CACf,CAAC,CAGtC,SAAgB,EAAmB,EAAS,eAA8B,CAIxE,MAHA,CACE,EAAE,YAAY,EAA0B,EAAO,CAE1C,EAAE"}
@@ -0,0 +1,8 @@
1
+ //#region src/lib/config.d.ts
2
+ interface MergedPrismaConfig {
3
+ modules: string[];
4
+ }
5
+ declare function defineMergedPrismaConfig(config: MergedPrismaConfig): MergedPrismaConfig;
6
+ //#endregion
7
+ export { MergedPrismaConfig, defineMergedPrismaConfig };
8
+ //# sourceMappingURL=config.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.mts","names":[],"sources":["../../src/lib/config.ts"],"sourcesContent":[],"mappings":";UAAiB,kBAAA;EAAA,OAAA,EAAA,MAAA,EAAA;AAIjB;iBAAgB,wBAAA,SACN,qBACP"}
@@ -0,0 +1,2 @@
1
+ function e(e){return e}export{e as defineMergedPrismaConfig};
2
+ //# sourceMappingURL=config.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.mjs","names":[],"sources":["../../src/lib/config.ts"],"sourcesContent":["export interface MergedPrismaConfig {\n modules: string[];\n}\n\nexport function defineMergedPrismaConfig(\n config: MergedPrismaConfig\n): MergedPrismaConfig {\n return config;\n}\n"],"mappings":"AAIA,SAAgB,EACd,EACoB,CACpB,OAAO"}
@@ -0,0 +1,14 @@
1
+ //#region src/lib/types.d.ts
2
+ interface ImportLockEntry {
3
+ moduleName: string;
4
+ version: string;
5
+ sourcePath: string;
6
+ sha256: string;
7
+ }
8
+ interface ImportLock {
9
+ updatedAt: string;
10
+ entries: ImportLockEntry[];
11
+ }
12
+ //#endregion
13
+ export { ImportLock, ImportLockEntry };
14
+ //# sourceMappingURL=types.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../src/lib/types.ts"],"sourcesContent":[],"mappings":";UAAiB,eAAA;EAAA,UAAA,EAAA,MAAe;EAOf,OAAA,EAAA,MAAU;;;;UAAV,UAAA;;WAEN"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@lssm/app.cli-database",
3
+ "version": "1.9.0",
4
+ "type": "module",
5
+ "bin": {
6
+ "database": "dist/cli.js"
7
+ },
8
+ "scripts": {
9
+ "clean": "rm -rf dist",
10
+ "build": "tsdown",
11
+ "dev": "bun run build --watch",
12
+ "lint": "bun run lint:fix",
13
+ "lint:fix": "eslint src --fix",
14
+ "lint:check": "eslint src",
15
+ "prisma:import": "bun database import",
16
+ "prisma:check": "bun database check",
17
+ "dbs:generate": "bun database generate",
18
+ "dbs:migrate": "bun database migrate:dev",
19
+ "dbs:deploy": "bun database migrate:deploy",
20
+ "dbs:status": "bun database migrate:status",
21
+ "dbs:seed": "bun database seed"
22
+ },
23
+ "dependencies": {
24
+ "@prisma/adapter-pg": "^7.0.0",
25
+ "@prisma/client": "^7.0.0",
26
+ "prisma": "^7.0.0",
27
+ "minimist": "^1.2.8"
28
+ },
29
+ "devDependencies": {
30
+ "@lssm/tool.tsdown": "workspace:*",
31
+ "tsdown": "^0.16.6"
32
+ },
33
+ "main": "./dist/index.mjs",
34
+ "module": "./dist/index.mjs",
35
+ "types": "./dist/index.d.mts",
36
+ "files": [
37
+ "dist",
38
+ "README.md"
39
+ ],
40
+ "exports": {
41
+ ".": "./dist/index.mjs",
42
+ "./cli": "./dist/cli.mjs",
43
+ "./*": "./*"
44
+ }
45
+ }