@coreframe/scripts 0.1.2 → 0.1.4

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.
@@ -0,0 +1 @@
1
+ function e(){var e=typeof SuppressedError==`function`?SuppressedError:function(e,t){var n=Error();return n.name=`SuppressedError`,n.error=e,n.suppressed=t,n},t={},n=[];function r(e,t){if(t!=null){if(Object(t)!==t)throw TypeError(`using declarations can only be used with objects, functions, null, or undefined.`);if(e)var r=t[Symbol.asyncDispose||Symbol.for(`Symbol.asyncDispose`)];if(r===void 0&&(r=t[Symbol.dispose||Symbol.for(`Symbol.dispose`)],e))var i=r;if(typeof r!=`function`)throw TypeError(`Object is not disposable.`);i&&(r=function(){try{i.call(t)}catch(e){return Promise.reject(e)}}),n.push({v:t,d:r,a:e})}else e&&n.push({d:t,a:e});return t}return{e:t,u:r.bind(null,!1),a:r.bind(null,!0),d:function(){var r,i=this.e,a=0;function o(){for(;r=n.pop();)try{if(!r.a&&a===1)return a=0,n.push(r),Promise.resolve().then(o);if(r.d){var e=r.d.call(r.v);if(r.a)return a|=2,Promise.resolve(e).then(o,s)}else a|=1}catch(e){return s(e)}if(a===1)return i===t?Promise.resolve():Promise.reject(i);if(i!==t)throw i}function s(n){return i=i===t?n:new e(n,i),o()}return o()}}}export{e as default};
@@ -79,6 +79,9 @@ declare const coreframeCli: Partial<import("cmd-ts/dist/cjs/argparser").Register
79
79
  } | {
80
80
  command: "seed";
81
81
  args: {};
82
+ } | {
83
+ command: "schema-check";
84
+ args: {};
82
85
  } | {
83
86
  command: "setup";
84
87
  args: {};
@@ -163,6 +166,9 @@ declare const coreframeCli: Partial<import("cmd-ts/dist/cjs/argparser").Register
163
166
  } | {
164
167
  command: "seed";
165
168
  args: {};
169
+ } | {
170
+ command: "schema-check";
171
+ args: {};
166
172
  } | {
167
173
  command: "setup";
168
174
  args: {};
@@ -217,6 +223,9 @@ declare const coreframeCli: Partial<import("cmd-ts/dist/cjs/argparser").Register
217
223
  } | {
218
224
  command: "seed";
219
225
  value: Promise<void>;
226
+ } | {
227
+ command: "schema-check";
228
+ value: Promise<void>;
220
229
  } | {
221
230
  command: "setup";
222
231
  value: Promise<void>;
@@ -272,6 +281,9 @@ declare const coreframeCli: Partial<import("cmd-ts/dist/cjs/argparser").Register
272
281
  } | {
273
282
  command: "seed";
274
283
  value: Promise<void>;
284
+ } | {
285
+ command: "schema-check";
286
+ value: Promise<void>;
275
287
  } | {
276
288
  command: "setup";
277
289
  value: Promise<void>;
package/dist/coreframe.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{runDrizzleKitCommand as e}from"./db/drizzle-kit.js";import{seedLocalDb as t}from"./db/seed.js";import{migrateLocalDb as n}from"./db/migrate.js";import{resetLocalDb as r}from"./db/reset.js";import{setupLocalDb as i}from"./db/setup.js";import{ensureLocalDb as a}from"./db/ensure.js";import{migrateHeldMigrations as o}from"./db/migrate-held.js";import{tauriReleasePlatforms as s}from"./deploy/config.js";import{deployProject as c}from"./deploy.js";import{checkDeployMigrations as l}from"./deploy/check-migrations.js";import{runDevServer as u}from"./dev.js";import{typecheckProject as d}from"./typecheck.js";import{checkUpgradeSkillCurrent as f}from"./upgrade/check-skill-current.js";import{ensureTemplateRemote as p}from"./upgrade/ensure-template-remote.js";import{fastForwardTemplateFiles as m}from"./upgrade/fast-forward-template-files.js";import{array as h,binary as g,command as _,flag as v,multioption as y,oneOf as b,option as x,optional as S,positional as C,rest as w,run as T,string as E,subcommands as D}from"cmd-ts";const O=D({name:`coreframe`,cmds:{deploy:_({name:`deploy`,args:{runMigrations:v({long:`run-migrations`,description:`Run pending deploy-safe database migrations before deploying.`,defaultValue:()=>!1}),skipMigrations:v({long:`skip-migrations`,description:`Deploy without running pending deploy-safe database migrations.`,defaultValue:()=>!1}),skipPostDeployChecks:v({long:`skip-post-deploy-checks`,description:`Skip post-deploy checks after Cloudflare deployment.`,defaultValue:()=>!1}),tauriLocalPlatforms:y({long:`tauri-local-platform`,type:h(b(s)),description:`Build one Tauri release platform locally. Repeat for multiple platforms.`,defaultValue:()=>[]}),tauriWorkflowName:x({long:`tauri-workflow-name`,type:S(E),description:`GitHub Actions workflow file or name for remote Tauri release builds.`}),tauriWorkflowPlatforms:y({long:`tauri-workflow-platform`,type:h(b(s)),description:`Build one Tauri release platform with GitHub Actions. Repeat for multiple platforms.`,defaultValue:()=>[]}),tauriWorkflowRef:x({long:`tauri-workflow-ref`,type:S(E),description:`Git ref used when dispatching remote Tauri release builds.`}),yes:v({long:`yes`,short:`y`,description:`Approve noninteractive deploy prompts.`,defaultValue:()=>!1})},handler:({runMigrations:e,skipMigrations:t,skipPostDeployChecks:n,tauriLocalPlatforms:r,tauriWorkflowName:i,tauriWorkflowPlatforms:a,tauriWorkflowRef:o,yes:s})=>c([...e?[`--run-migrations`]:[],...t?[`--skip-migrations`]:[],...n?[`--skip-post-deploy-checks`]:[],...r.flatMap(e=>[`--tauri-local-platform`,e]),...i?[`--tauri-workflow-name`,i]:[],...a.flatMap(e=>[`--tauri-workflow-platform`,e]),...o?[`--tauri-workflow-ref`,o]:[],...s?[`--yes`]:[]])}),typecheck:_({name:`typecheck`,args:{},handler:d}),dev:_({name:`dev`,args:{platform:C({type:S(b([`web`,`desktop`,`ios`,`android`])),displayName:`platform`,description:`Development target platform. Defaults to web.`})},handler:({platform:e})=>u({platform:e??`web`})}),upgrade:D({name:`upgrade`,cmds:{"ensure-template-remote":_({name:`ensure-template-remote`,args:{remote:x({long:`remote`,type:E,defaultValue:()=>`template`,description:`Remote name to ensure.`}),noFetch:v({long:`no-fetch`,description:`Do not fetch the remote after ensuring it exists.`,defaultValue:()=>!1})},handler:({noFetch:e,remote:t})=>p({fetch:!e,remote:t})}),"check-skill-current":_({name:`check-skill-current`,args:{target:x({long:`target`,type:E,description:`Target Coreframe template git ref.`}),apply:v({long:`apply`,description:`Replace the local upgrade skill with the target version when it differs.`,defaultValue:()=>!1})},handler:({apply:e,target:t})=>{process.exitCode=f({apply:e,target:t})}}),"fast-forward-template-files":_({name:`fast-forward-template-files`,args:{target:x({long:`target`,type:E,description:`Target Coreframe template git ref.`}),base:x({long:`base`,type:S(E),description:`Previous Coreframe template git ref. Defaults to package.json engines.coreframe.`}),apply:v({long:`apply`,description:`Write clean fast-forwards to the worktree.`,defaultValue:()=>!1})},handler:({apply:e,base:t,target:n})=>m({apply:e,base:t,target:n})})}}),db:D({name:`db`,cmds:{ensure:_({name:`ensure`,args:{},handler:a}),generate:_({name:`generate`,args:{args:w({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit generate.`})},handler:({args:t})=>e(`generate`,t)}),migrate:_({name:`migrate`,args:{args:w({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit migrate.`})},handler:({args:t})=>e(`migrate`,t)}),"migrate-held":_({name:`migrate-held`,args:{confirm:x({long:`confirm`,type:S(b([`run-held-migrations`])),description:`Required confirmation value for held migrations.`})},handler:({confirm:e})=>o({argv:e?[`--confirm=${e}`]:[]})}),"migrate-local":_({name:`migrate-local`,args:{},handler:n}),"migrations-check":_({name:`migrations-check`,args:{},handler:l}),reset:_({name:`reset`,args:{},handler:r}),seed:_({name:`seed`,args:{},handler:()=>t()}),setup:_({name:`setup`,args:{},handler:()=>i()}),studio:_({name:`studio`,args:{args:w({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit studio.`})},handler:({args:t})=>e(`studio`,t)})}})}});import.meta.main&&T(g(O),process.argv);export{O as coreframeCli};
2
+ import{runDrizzleKitCommand as e}from"./db/drizzle-kit.js";import{seedLocalDb as t}from"./db/seed.js";import{migrateLocalDb as n}from"./db/migrate.js";import{resetLocalDb as r}from"./db/reset.js";import{setupLocalDb as i}from"./db/setup.js";import{ensureLocalDb as a}from"./db/ensure.js";import{migrateHeldMigrations as o}from"./db/migrate-held.js";import{checkSchemaPush as s}from"./db/schema-check.js";import{tauriReleasePlatforms as c}from"./deploy/config.js";import{deployProject as l}from"./deploy.js";import{checkDeployMigrations as u}from"./deploy/check-migrations.js";import{runDevServer as d}from"./dev.js";import{typecheckProject as f}from"./typecheck.js";import{checkUpgradeSkillCurrent as p}from"./upgrade/check-skill-current.js";import{ensureTemplateRemote as m}from"./upgrade/ensure-template-remote.js";import{fastForwardTemplateFiles as h}from"./upgrade/fast-forward-template-files.js";import{array as g,binary as _,command as v,flag as y,multioption as b,oneOf as x,option as S,optional as C,positional as w,rest as T,run as E,string as D,subcommands as O}from"cmd-ts";const k=O({name:`coreframe`,cmds:{deploy:v({name:`deploy`,args:{runMigrations:y({long:`run-migrations`,description:`Run pending deploy-safe database migrations before deploying.`,defaultValue:()=>!1}),skipMigrations:y({long:`skip-migrations`,description:`Deploy without running pending deploy-safe database migrations.`,defaultValue:()=>!1}),skipPostDeployChecks:y({long:`skip-post-deploy-checks`,description:`Skip post-deploy checks after Cloudflare deployment.`,defaultValue:()=>!1}),tauriLocalPlatforms:b({long:`tauri-local-platform`,type:g(x(c)),description:`Build one Tauri release platform locally. Repeat for multiple platforms.`,defaultValue:()=>[]}),tauriWorkflowName:S({long:`tauri-workflow-name`,type:C(D),description:`GitHub Actions workflow file or name for remote Tauri release builds.`}),tauriWorkflowPlatforms:b({long:`tauri-workflow-platform`,type:g(x(c)),description:`Build one Tauri release platform with GitHub Actions. Repeat for multiple platforms.`,defaultValue:()=>[]}),tauriWorkflowRef:S({long:`tauri-workflow-ref`,type:C(D),description:`Git ref used when dispatching remote Tauri release builds.`}),yes:y({long:`yes`,short:`y`,description:`Approve noninteractive deploy prompts.`,defaultValue:()=>!1})},handler:({runMigrations:e,skipMigrations:t,skipPostDeployChecks:n,tauriLocalPlatforms:r,tauriWorkflowName:i,tauriWorkflowPlatforms:a,tauriWorkflowRef:o,yes:s})=>l([...e?[`--run-migrations`]:[],...t?[`--skip-migrations`]:[],...n?[`--skip-post-deploy-checks`]:[],...r.flatMap(e=>[`--tauri-local-platform`,e]),...i?[`--tauri-workflow-name`,i]:[],...a.flatMap(e=>[`--tauri-workflow-platform`,e]),...o?[`--tauri-workflow-ref`,o]:[],...s?[`--yes`]:[]])}),typecheck:v({name:`typecheck`,args:{},handler:f}),dev:v({name:`dev`,args:{platform:w({type:C(x([`web`,`desktop`,`ios`,`android`])),displayName:`platform`,description:`Development target platform. Defaults to web.`})},handler:({platform:e})=>d({platform:e??`web`})}),upgrade:O({name:`upgrade`,cmds:{"ensure-template-remote":v({name:`ensure-template-remote`,args:{remote:S({long:`remote`,type:D,defaultValue:()=>`template`,description:`Remote name to ensure.`}),noFetch:y({long:`no-fetch`,description:`Do not fetch the remote after ensuring it exists.`,defaultValue:()=>!1})},handler:({noFetch:e,remote:t})=>m({fetch:!e,remote:t})}),"check-skill-current":v({name:`check-skill-current`,args:{target:S({long:`target`,type:D,description:`Target Coreframe template git ref.`}),apply:y({long:`apply`,description:`Replace the local upgrade skill with the target version when it differs.`,defaultValue:()=>!1})},handler:({apply:e,target:t})=>{process.exitCode=p({apply:e,target:t})}}),"fast-forward-template-files":v({name:`fast-forward-template-files`,args:{target:S({long:`target`,type:D,description:`Target Coreframe template git ref.`}),base:S({long:`base`,type:C(D),description:`Previous Coreframe template git ref. Defaults to package.json engines.coreframe.`}),apply:y({long:`apply`,description:`Write clean fast-forwards to the worktree.`,defaultValue:()=>!1})},handler:({apply:e,base:t,target:n})=>h({apply:e,base:t,target:n})})}}),db:O({name:`db`,cmds:{ensure:v({name:`ensure`,args:{},handler:a}),generate:v({name:`generate`,args:{args:T({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit generate.`})},handler:({args:t})=>e(`generate`,t)}),migrate:v({name:`migrate`,args:{args:T({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit migrate.`})},handler:({args:t})=>e(`migrate`,t)}),"migrate-held":v({name:`migrate-held`,args:{confirm:S({long:`confirm`,type:C(x([`run-held-migrations`])),description:`Required confirmation value for held migrations.`})},handler:({confirm:e})=>o({argv:e?[`--confirm=${e}`]:[]})}),"migrate-local":v({name:`migrate-local`,args:{},handler:n}),"migrations-check":v({name:`migrations-check`,args:{},handler:u}),reset:v({name:`reset`,args:{},handler:r}),seed:v({name:`seed`,args:{},handler:()=>t()}),"schema-check":v({name:`schema-check`,args:{},handler:()=>s()}),setup:v({name:`setup`,args:{},handler:()=>i()}),studio:v({name:`studio`,args:{args:T({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit studio.`})},handler:({args:t})=>e(`studio`,t)})}})}});import.meta.main&&E(_(k),process.argv);export{k as coreframeCli};
@@ -1,10 +1,10 @@
1
1
  //#region db/config.d.ts
2
- declare const LOCAL_DB_DIR: string;
3
2
  declare const MIGRATIONS_FOLDER = "drizzle";
4
3
  declare const HELD_MIGRATIONS_FOLDER = "drizzle-hold";
5
4
  declare const NOW: Date;
6
5
  declare const SEED_IDS: {
7
6
  readonly adminUser: "00000000-0000-4000-8000-000000000001";
7
+ readonly adminCredentialAccount: "00000000-0000-4000-8000-000000000101";
8
8
  readonly viewerUser: "00000000-0000-4000-8000-000000000002";
9
9
  readonly inactiveUser: "00000000-0000-4000-8000-000000000003";
10
10
  readonly unicodeUser: "00000000-0000-4000-8000-000000000004";
@@ -17,8 +17,8 @@ declare const SEED_EMAILS: {
17
17
  readonly unicodeUser: "unicode@example.com";
18
18
  readonly longNameUser: "long-name@example.com";
19
19
  };
20
- type SeedProfile = "small" | "large" | "demo" | "test";
20
+ type SeedProfile = "default" | "large";
21
21
  declare function getSeedProfile(argv?: string[]): SeedProfile;
22
22
  declare function generatedUserId(index: number): string;
23
23
  //#endregion
24
- export { HELD_MIGRATIONS_FOLDER, LOCAL_DB_DIR, MIGRATIONS_FOLDER, NOW, SEED_EMAILS, SEED_IDS, SeedProfile, generatedUserId, getSeedProfile };
24
+ export { HELD_MIGRATIONS_FOLDER, MIGRATIONS_FOLDER, NOW, SEED_EMAILS, SEED_IDS, SeedProfile, generatedUserId, getSeedProfile };
package/dist/db/config.js CHANGED
@@ -1 +1 @@
1
- const e=process.env.PGLITE_DATA_DIR??`.pglite`,t=`drizzle`,n=`drizzle-hold`,r=new Date(`2026-01-15T12:00:00.000Z`),i={adminUser:`00000000-0000-4000-8000-000000000001`,viewerUser:`00000000-0000-4000-8000-000000000002`,inactiveUser:`00000000-0000-4000-8000-000000000003`,unicodeUser:`00000000-0000-4000-8000-000000000004`,longNameUser:`00000000-0000-4000-8000-000000000005`},a={adminUser:`admin@example.com`,viewerUser:`viewer@example.com`,inactiveUser:`inactive@example.com`,unicodeUser:`unicode@example.com`,longNameUser:`long-name@example.com`};function o(e=process.argv.slice(2)){if(e.includes(`--large`))return`large`;let t=e.find(e=>e.startsWith(`--profile=`))?.slice(10)??`small`;if(t===`small`||t===`large`||t===`demo`||t===`test`)return t;throw Error(`Unknown seed profile "${t}". Expected small, large, demo, or test.`)}function s(e){return`00000000-0000-4000-8000-${String(1e3+e).padStart(12,`0`)}`}export{n as HELD_MIGRATIONS_FOLDER,e as LOCAL_DB_DIR,t as MIGRATIONS_FOLDER,r as NOW,a as SEED_EMAILS,i as SEED_IDS,s as generatedUserId,o as getSeedProfile};
1
+ const e=`drizzle`,t=`drizzle-hold`,n=new Date(`2026-01-15T12:00:00.000Z`),r={adminUser:`00000000-0000-4000-8000-000000000001`,adminCredentialAccount:`00000000-0000-4000-8000-000000000101`,viewerUser:`00000000-0000-4000-8000-000000000002`,inactiveUser:`00000000-0000-4000-8000-000000000003`,unicodeUser:`00000000-0000-4000-8000-000000000004`,longNameUser:`00000000-0000-4000-8000-000000000005`},i={adminUser:`admin@example.com`,viewerUser:`viewer@example.com`,inactiveUser:`inactive@example.com`,unicodeUser:`unicode@example.com`,longNameUser:`long-name@example.com`};function a(e=process.argv.slice(2)){if(e.includes(`--large`))return`large`;let t=e.find(e=>e.startsWith(`--profile=`))?.slice(10)??`default`;if(t==="default"||t===`large`)return t;throw Error(`Unknown seed profile "${t}". Expected default or large.`)}function o(e){return`00000000-0000-4000-8000-${String(1e3+e).padStart(12,`0`)}`}export{t as HELD_MIGRATIONS_FOLDER,e as MIGRATIONS_FOLDER,n as NOW,i as SEED_EMAILS,r as SEED_IDS,o as generatedUserId,a as getSeedProfile};
@@ -1,9 +1,20 @@
1
+ import { startProjectPostgres } from "./local-postgres.js";
2
+
1
3
  //#region db/drizzle-kit.d.ts
2
4
  type Spawn = (file: string, args: readonly string[], options: {
3
5
  env: NodeJS.ProcessEnv;
4
6
  stdio: "inherit";
5
7
  }) => PromiseLike<unknown>;
6
8
  type DrizzleKitCommand = "generate" | "migrate" | "studio";
7
- declare function runDrizzleKitCommand(command: DrizzleKitCommand, args?: string[], spawn?: Spawn): Promise<void>;
9
+ type RunDrizzleKitCommandOptions = {
10
+ env?: NodeJS.ProcessEnv;
11
+ spawn?: Spawn;
12
+ startProjectPostgres?: typeof startProjectPostgres;
13
+ };
14
+ declare function runDrizzleKitCommand(command: DrizzleKitCommand, args?: string[], {
15
+ env,
16
+ spawn,
17
+ startProjectPostgres
18
+ }?: RunDrizzleKitCommandOptions): Promise<void>;
8
19
  //#endregion
9
20
  export { runDrizzleKitCommand };
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import e from"node:path";import t from"node:process";import n from"nano-spawn";const r=e.resolve(`node_modules`,`.bin`),i=t.platform===`win32`?`drizzle-kit.cmd`:`drizzle-kit`,a=t.env.PATH??t.env.Path??``;async function o(o,s=[],c=n){await c(i,[o,...s],{env:{...t.env,PATH:r+e.delimiter+a},stdio:`inherit`})}import.meta.main&&o(t.argv[2],t.argv.slice(3)).catch(e=>{console.error(e),t.exit(1)});export{o as runDrizzleKitCommand};
2
+ import{startProjectPostgres as e}from"./local-postgres.js";import t from"../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/usingCtx.js";import n from"node:path";import r from"node:process";import i from"nano-spawn";const a=n.resolve(`node_modules`,`.bin`),o=r.platform===`win32`?`drizzle-kit.cmd`:`drizzle-kit`,s={startProjectPostgres:e};async function c(e,c=[],{env:l=r.env,spawn:u=i,startProjectPostgres:d=s.startProjectPostgres}={}){try{var f=t();let r=f.a(await d({env:l})),i=l.PATH??l.Path??``;await u(o,[e,...c],{env:{...r.env,PATH:a+n.delimiter+i},stdio:`inherit`})}catch(e){f.e=e}finally{await f.d()}}import.meta.main&&c(r.argv[2],r.argv.slice(3)).catch(e=>{console.error(e),r.exit(1)});export{c as runDrizzleKitCommand};
@@ -1,20 +1,27 @@
1
1
  import { importProjectModule } from "../project.js";
2
+ import { createLocalPostgresDb, startProjectPostgres } from "./local-postgres.js";
2
3
  import { planLocalSchemaPush } from "./schema-push.js";
3
4
  import { seedLocalDb } from "./seed.js";
4
5
  import { setupLocalDb } from "./setup.js";
5
6
 
6
7
  //#region db/ensure.d.ts
7
8
  type EnsureLocalDbOptions = {
9
+ createLocalPostgresDb?: typeof createLocalPostgresDb;
10
+ env?: NodeJS.ProcessEnv;
8
11
  importProjectModule?: typeof importProjectModule;
9
12
  planLocalSchemaPush?: typeof planLocalSchemaPush;
10
13
  seedLocalDb?: typeof seedLocalDb;
14
+ startProjectPostgres?: typeof startProjectPostgres;
11
15
  setupLocalDb?: typeof setupLocalDb;
12
16
  };
13
17
  declare function ensureLocalDb({
14
- importProjectModule: importModule,
15
- planLocalSchemaPush: planSchemaPush,
16
- seedLocalDb: seed,
17
- setupLocalDb: setup
18
+ createLocalPostgresDb,
19
+ env,
20
+ importProjectModule,
21
+ planLocalSchemaPush,
22
+ seedLocalDb,
23
+ startProjectPostgres,
24
+ setupLocalDb
18
25
  }?: EnsureLocalDbOptions): Promise<void>;
19
26
  //#endregion
20
27
  export { ensureLocalDb };
package/dist/db/ensure.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{importProjectModule as e}from"../project.js";import{LOCAL_DB_DIR as t,SEED_EMAILS as n,SEED_IDS as r}from"./config.js";import{inferSchemaDialect as i,planLocalSchemaPush as a}from"./schema-push.js";import{seedLocalDb as o}from"./seed.js";import{setupLocalDb as s}from"./setup.js";import{eq as c}from"drizzle-orm";async function l(t=e){let[{createLocalDb:n},r]=await Promise.all([t(`src/db/local.ts`),t(`src/db/schema.ts`)]);return{createLocalDb:n,schema:r}}async function u({createLocalDb:e,schema:{users:i}}){let a=e(t);try{let[e]=await a.select({id:i.id}).from(i).where(c(i.email,n.adminUser)).limit(1);return e?.id===r.adminUser}catch{return!1}finally{await a.$client.close()}}async function d({createLocalDb:e,schema:n},r=a){let o=i(n),s=e(t);try{let e=await r(o,n,s);return e.sqlStatements.length===0?(console.log(`Local database schema already in sync`),{appliedStatements:0,plan:e}):(console.log(`Local database schema drift detected; applying ${e.sqlStatements.length} statement(s)`),await e.apply(),console.log(`Local database schema synced`),{appliedStatements:e.sqlStatements.length,plan:e})}finally{await s.$client.close()}}async function f({importProjectModule:t=e,planLocalSchemaPush:n=a,seedLocalDb:r=o,setupLocalDb:i=s}={}){let c=await l(t);await u(c)?console.log(`Local database already set up`):(console.log(`Local database is missing or unseeded; running setup`),await i(),c=await l(t)),(await d(c,n)).appliedStatements>0&&!await u(c)&&(console.log(`Local database seed data missing after schema sync; running seed`),await r())}import.meta.main&&f().catch(e=>{console.error(e),process.exit(1)});export{f as ensureLocalDb};
2
+ import{importProjectModule as e}from"../project.js";import{createLocalPostgresDb as t,startProjectPostgres as n}from"./local-postgres.js";import r from"../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/usingCtx.js";import{SEED_EMAILS as i,SEED_IDS as a}from"./config.js";import{inferSchemaDialect as o,planLocalSchemaPush as s}from"./schema-push.js";import{seedLocalDb as c}from"./seed.js";import{setupLocalDb as l}from"./setup.js";import{eq as u}from"drizzle-orm";const d={createLocalPostgresDb:t,importProjectModule:e,planLocalSchemaPush:s,seedLocalDb:c,startProjectPostgres:n,setupLocalDb:l};async function f(t=e){return{schema:await t(`src/db/schema.ts`)}}async function p(e,{users:t}){let[n]=await e.select({id:t.id}).from(t).where(u(t.email,i.adminUser)).limit(1);return n?.id===a.adminUser}async function m(e,{schema:t},n=s){let r=await n(o(t),t,e);return r.sqlStatements.length===0?(console.log(`Local database schema already in sync`),{appliedStatements:0,plan:r}):(console.log(`Local database schema drift detected; applying ${r.sqlStatements.length} statement(s)`),await r.apply(),console.log(`Local database schema synced`),{appliedStatements:r.sqlStatements.length,plan:r})}async function h({createLocalPostgresDb:e=d.createLocalPostgresDb,env:t=process.env,importProjectModule:n=d.importProjectModule,planLocalSchemaPush:i=d.planLocalSchemaPush,seedLocalDb:a=d.seedLocalDb,startProjectPostgres:o=d.startProjectPostgres,setupLocalDb:s=d.setupLocalDb}={}){try{var c=r();let l=c.a(await o({env:t})).env,u=await f(n),d=await e({env:l});try{if(await g(d,u.schema))console.log(`Local database already set up`);else{console.log(`Local database is missing or unseeded; running setup`),await s(`default`,{env:l});return}(await m(d,u,i)).appliedStatements>0&&!await g(d,u.schema)&&(console.log(`Local database seed data missing after schema sync; running seed`),await a(void 0,{env:l}))}finally{await d.$client.end()}}catch(e){c.e=e}finally{await c.d()}}async function g(e,t){try{return await p(e,t)}catch{return!1}}import.meta.main&&h().catch(e=>{console.error(e),process.exit(1)});export{h as ensureLocalDb};
@@ -0,0 +1,65 @@
1
+ import { CoreframeConfig, readProjectConfig } from "../config.js";
2
+ import { createProjectPostgresDrizzleDatabase } from "./project.js";
3
+ import { rm } from "node:fs/promises";
4
+ import { tmpdir } from "node:os";
5
+ import { LocalPostgresEnv, startPostgres } from "local-postgres";
6
+
7
+ //#region db/local-postgres.d.ts
8
+ declare const LOCAL_POSTGRES_ENV_FLAG = "COREFRAME_LOCAL_POSTGRES";
9
+ type LocalPostgresDb = Awaited<ReturnType<typeof createProjectPostgresDrizzleDatabase>> & {
10
+ $client: {
11
+ end(): Promise<void>;
12
+ };
13
+ select(selection: Record<string, unknown>): {
14
+ from(table: unknown): {
15
+ where(condition: unknown): {
16
+ limit(count: number): Promise<Array<{
17
+ id: string;
18
+ }>>;
19
+ };
20
+ };
21
+ };
22
+ };
23
+ type LocalPostgresOptions = {
24
+ env?: NodeJS.ProcessEnv;
25
+ };
26
+ type ProjectPostgresSidecar = {
27
+ env: NodeJS.ProcessEnv;
28
+ [Symbol.asyncDispose](): Promise<void>;
29
+ };
30
+ type StartProjectPostgresOptions = {
31
+ config?: CoreframeConfig;
32
+ cwd?: string;
33
+ env?: NodeJS.ProcessEnv;
34
+ readProjectConfig?: typeof readProjectConfig;
35
+ startPostgres?: typeof startPostgres;
36
+ };
37
+ type StartTemporaryProjectPostgresOptions = StartProjectPostgresOptions & {
38
+ mkdtemp?: (prefix: string) => Promise<string>;
39
+ rm?: typeof rm;
40
+ tmpdir?: typeof tmpdir;
41
+ };
42
+ declare function startProjectPostgres({
43
+ config,
44
+ cwd,
45
+ env,
46
+ readProjectConfig,
47
+ startPostgres
48
+ }?: StartProjectPostgresOptions): Promise<ProjectPostgresSidecar>;
49
+ declare function startTemporaryProjectPostgres({
50
+ config,
51
+ cwd,
52
+ env,
53
+ mkdtemp,
54
+ readProjectConfig,
55
+ rm,
56
+ startPostgres,
57
+ tmpdir
58
+ }?: StartTemporaryProjectPostgresOptions): Promise<ProjectPostgresSidecar>;
59
+ declare function createLocalPostgresEnv(env: NodeJS.ProcessEnv, postgresEnv: LocalPostgresEnv): NodeJS.ProcessEnv;
60
+ declare function createLocalPostgresDb({
61
+ env
62
+ }?: LocalPostgresOptions): Promise<LocalPostgresDb>;
63
+ declare function getLocalPostgresConnectionString(env?: NodeJS.ProcessEnv): string;
64
+ //#endregion
65
+ export { LOCAL_POSTGRES_ENV_FLAG, LocalPostgresDb, ProjectPostgresSidecar, StartProjectPostgresOptions, StartTemporaryProjectPostgresOptions, createLocalPostgresDb, createLocalPostgresEnv, getLocalPostgresConnectionString, startProjectPostgres, startTemporaryProjectPostgres };
@@ -0,0 +1 @@
1
+ import{readProjectConfig as e}from"../config.js";import{createProjectPostgresDrizzleDatabase as t}from"./project.js";import{mkdtemp as n,rm as r}from"node:fs/promises";import i from"node:path";import{tmpdir as a}from"node:os";import{startPostgres as o}from"local-postgres";const s=`COREFRAME_LOCAL_POSTGRES`,c=`coreframe`,l={name:`coreframe`,password:`coreframe`},u={mkdtemp:n,readProjectConfig:e,rm:r,startPostgres:o,tmpdir:a};async function d({config:e,cwd:t=process.cwd(),env:n=process.env,readProjectConfig:r=u.readProjectConfig,startPostgres:a=u.startPostgres}={}){return n.COREFRAME_LOCAL_POSTGRES===`1`||((e??await r({cwd:t})).database?.dialect??`postgres`)!==`postgres`?g(n):h(n,await a({dataDir:i.resolve(t,`.postgres`),database:c,log:`ignore`,postgres:{strategy:`prefer-local`},superuser:l}))}async function f({config:e,cwd:t=process.cwd(),env:n=process.env,mkdtemp:r=u.mkdtemp,readProjectConfig:a=u.readProjectConfig,rm:o=u.rm,startPostgres:s=u.startPostgres,tmpdir:d=u.tmpdir}={}){let f=(e??await a({cwd:t})).database?.dialect??`postgres`;if(f!==`postgres`)throw Error(`Temporary schema push checks require PostgreSQL, but this project uses ${f}.`);let p=await r(i.join(d(),`coreframe-schema-check-`));try{let e=h(n,await s({dataDir:p,database:c,log:`ignore`,postgres:{strategy:`prefer-local`},superuser:l}));return{env:e.env,async[Symbol.asyncDispose](){try{await e[Symbol.asyncDispose]()}finally{await o(p,{force:!0,recursive:!0})}}}}catch(e){throw await o(p,{force:!0,recursive:!0}),e}}function p(e,t){return{...e,...t,[s]:`1`}}async function m({env:e=process.env}={}){let n=_(e);return t({env:{...e,DATABASE_URL:n}})}function h(e,t){return{env:p(e,t.env),async[Symbol.asyncDispose](){await t[Symbol.asyncDispose]()}}}function g(e){return{env:e,async[Symbol.asyncDispose](){}}}function _(e=process.env){let t=e.DATABASE_URL||v(e);if(!t)throw Error(`DATABASE_URL or PGDATABASE, PGHOST, PGPORT, and PGUSER are required.`);return t}function v(e){let{PGDATABASE:t,PGHOST:n,PGPASSWORD:r,PGPORT:i,PGUSER:a}=e;if(!t||!n||!i||!a)return;let o=new URL(`postgresql://${n}:${i}/${t}`);return o.username=a,r&&(o.password=r),o.href}export{s as LOCAL_POSTGRES_ENV_FLAG,m as createLocalPostgresDb,p as createLocalPostgresEnv,_ as getLocalPostgresConnectionString,d as startProjectPostgres,f as startTemporaryProjectPostgres};
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{collectHeldMigrationFiles as e,formatMigrationList as t}from"../deploy/migrations.js";import{createProjectDeployDatabase as n}from"./project.js";import{readFile as r}from"node:fs/promises";import{createHash as i}from"node:crypto";const a=`--confirm=run-held-migrations`,o=[`-- Held migration:`,`-- Safe after:`,`-- Verification:`];async function s({argv:i=process.argv.slice(2),database:o,env:s=process.env}={}){let d=await e();if(console.log(`Held migration files:`),console.log(t(d)),!i.includes(a))throw Error(`Held migrations require explicit confirmation. Re-run with ${a}.`);if(d.length===0){console.log(`No held migrations to run.`);return}let m=o??await n({env:s});try{await u(m);for(let e of d){let t=await r(e.path,`utf8`);c(t,e.relativePath);let n=l(t),i=await m.execute(f(m.dialect,e.id));if(i.rows.length===1){if(i.rows[0]?.sha256!==n)throw Error(`Held migration ${e.relativePath} changed after it was applied.`);console.log(`Skipping already-applied held migration ${e.relativePath}`);continue}console.log(`Applying held migration ${e.relativePath}`),await h(m,async r=>{await r.execute(t),await r.execute(p(m.dialect,e.id,n))})}}finally{o||await m.close?.()}}function c(e,t){let n=o.filter(t=>!e.includes(t));if(n.length>0)throw Error(`${t} is missing held migration header fields: ${n.join(`, `)}`)}function l(e){return i(`sha256`).update(e).digest(`hex`)}async function u(e){for(let t of d(e.dialect))await e.execute(t)}function d(e){switch(e){case`postgres`:return[`create schema if not exists drizzle`,`create table if not exists drizzle.__held_migrations (
2
+ import{createProjectDeployDatabase as e}from"./project.js";import{collectHeldMigrationFiles as t,formatMigrationList as n}from"../deploy/migrations.js";import{readFile as r}from"node:fs/promises";import{createHash as i}from"node:crypto";const a=`--confirm=run-held-migrations`,o=[`-- Held migration:`,`-- Safe after:`,`-- Verification:`];async function s({argv:i=process.argv.slice(2),database:o,env:s=process.env}={}){let d=await t();if(console.log(`Held migration files:`),console.log(n(d)),!i.includes(a))throw Error(`Held migrations require explicit confirmation. Re-run with ${a}.`);if(d.length===0){console.log(`No held migrations to run.`);return}let m=o??await e({env:s});try{await u(m);for(let e of d){let t=await r(e.path,`utf8`);c(t,e.relativePath);let n=l(t),i=await m.execute(f(m.dialect,e.id));if(i.rows.length===1){if(i.rows[0]?.sha256!==n)throw Error(`Held migration ${e.relativePath} changed after it was applied.`);console.log(`Skipping already-applied held migration ${e.relativePath}`);continue}console.log(`Applying held migration ${e.relativePath}`),await h(m,async r=>{await r.execute(t),await r.execute(p(m.dialect,e.id,n))})}}finally{o||await m.close?.()}}function c(e,t){let n=o.filter(t=>!e.includes(t));if(n.length>0)throw Error(`${t} is missing held migration header fields: ${n.join(`, `)}`)}function l(e){return i(`sha256`).update(e).digest(`hex`)}async function u(e){for(let t of d(e.dialect))await e.execute(t)}function d(e){switch(e){case`postgres`:return[`create schema if not exists drizzle`,`create table if not exists drizzle.__held_migrations (
3
3
  id text primary key,
4
4
  sha256 text not null,
5
5
  applied_at timestamptz not null default now()
@@ -1,4 +1,13 @@
1
+ import { startProjectPostgres } from "./local-postgres.js";
2
+
1
3
  //#region db/migrate.d.ts
2
- declare function migrateLocalDb(): Promise<void>;
4
+ type MigrateLocalDbOptions = {
5
+ env?: NodeJS.ProcessEnv;
6
+ startProjectPostgres?: typeof startProjectPostgres;
7
+ };
8
+ declare function migrateLocalDb({
9
+ env,
10
+ startProjectPostgres
11
+ }?: MigrateLocalDbOptions): Promise<void>;
3
12
  //#endregion
4
13
  export { migrateLocalDb };
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{importProjectModule as e}from"../project.js";import{LOCAL_DB_DIR as t,MIGRATIONS_FOLDER as n}from"./config.js";import{access as r}from"node:fs/promises";import{resolve as i}from"node:path";import{migrate as a}from"drizzle-orm/pglite/migrator";const o=i(n);async function s(){await r(o);let{createLocalDb:n}=await e(`src/db/local.ts`),i=n(t);try{await a(i,{migrationsFolder:o}),console.log(`Applied local migrations from ${o}`)}finally{await i.$client.close()}}import.meta.main&&s().catch(e=>{console.error(e),process.exit(1)});export{s as migrateLocalDb};
2
+ import{createLocalPostgresDb as e,startProjectPostgres as t}from"./local-postgres.js";import n from"../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/usingCtx.js";import{MIGRATIONS_FOLDER as r}from"./config.js";import{access as i}from"node:fs/promises";import{resolve as a}from"node:path";import{migrate as o}from"drizzle-orm/node-postgres/migrator";const s=a(r),c={startProjectPostgres:t};async function l({env:t=process.env,startProjectPostgres:r=c.startProjectPostgres}={}){try{var a=n();await i(s);let c=await e({env:a.a(await r({env:t})).env});try{await o(c,{migrationsFolder:s}),console.log(`Applied local migrations from ${s}`)}finally{await c.$client.end()}}catch(e){a.e=e}finally{await a.d()}}import.meta.main&&l().catch(e=>{console.error(e),process.exit(1)});export{l as migrateLocalDb};
@@ -1,4 +1,4 @@
1
- import { DatabaseClient } from "./client.js";
1
+ import { DatabaseClient, DrizzleExecutor } from "./client.js";
2
2
  import { DatabaseConfig } from "../config.js";
3
3
  import { importProjectModule } from "../project.js";
4
4
 
@@ -9,12 +9,23 @@ type CreateProjectDatabaseOptions = {
9
9
  importProjectDependency?: ImportProjectDependency;
10
10
  importProjectModule?: typeof importProjectModule;
11
11
  };
12
+ type DrizzleDatabase = DrizzleExecutor & {
13
+ $client?: {
14
+ close?(): Promise<void> | void;
15
+ end?(): Promise<void>;
16
+ };
17
+ };
12
18
  type ImportProjectDependency = <T>(specifier: string) => Promise<T>;
13
19
  declare function createProjectDeployDatabase({
14
20
  config,
15
21
  env,
16
22
  importProjectDependency,
17
- importProjectModule: importModule
23
+ importProjectModule
18
24
  }?: CreateProjectDatabaseOptions): Promise<DatabaseClient>;
25
+ declare function createProjectPostgresDrizzleDatabase({
26
+ env,
27
+ importProjectDependency,
28
+ importProjectModule
29
+ }?: CreateProjectDatabaseOptions): Promise<DrizzleDatabase>;
19
30
  //#endregion
20
- export { CreateProjectDatabaseOptions, createProjectDeployDatabase };
31
+ export { CreateProjectDatabaseOptions, createProjectDeployDatabase, createProjectPostgresDrizzleDatabase };
@@ -1 +1 @@
1
- import{readProjectConfig as e}from"../config.js";import{importProjectModule as t}from"../project.js";import{createDatabaseAdapter as n}from"./client.js";import{createRequire as r}from"node:module";import{resolve as i}from"node:path";import{pathToFileURL as a}from"node:url";const o=`src/db/relations.ts`;async function s({config:n,env:r=process.env,importProjectDependency:i=u,importProjectModule:a=t}={}){let o=(n??(await e()).database)?.dialect??`postgres`;if(o===`postgres`)return c({env:r,importModule:a,importProjectDependency:i});if(o===`sqlite`)return l({env:r,importModule:a,importProjectDependency:i});throw Error(`Unsupported database dialect "${o}".`)}async function c({env:e,importModule:t,importProjectDependency:r}){let i=e.DATABASE_URL;if(!i)throw Error(`DATABASE_URL is required to create the deploy database.`);let[{drizzle:a},{relations:s}]=await Promise.all([r(`drizzle-orm/node-postgres`),t(o)]),c=a({connection:{connectionString:i,max:1},relations:s});return n({database:c,dialect:`postgres`,close:()=>c.$client?.end?.()??Promise.resolve()})}async function l({env:e,importModule:t,importProjectDependency:r}){let i=e.TURSO_DATABASE_URL??e.DATABASE_URL;if(!i)throw Error(`TURSO_DATABASE_URL or DATABASE_URL is required to create the deploy database.`);let[{createClient:a},{drizzle:s},{relations:c}]=await Promise.all([r(`@libsql/client`),r(`drizzle-orm/libsql`),t(o)]),l=a({url:i,authToken:e.TURSO_AUTH_TOKEN});return n({database:s({client:l,relations:c}),dialect:`sqlite`,close:async()=>{await l.close?.()}})}async function u(e){return await import(a(r(i(`package.json`)).resolve(e)).href)}export{s as createProjectDeployDatabase};
1
+ import{readProjectConfig as e}from"../config.js";import{importProjectModule as t}from"../project.js";import{createDatabaseAdapter as n}from"./client.js";import{createRequire as r}from"node:module";import{resolve as i}from"node:path";import{pathToFileURL as a}from"node:url";const o=`src/db/relations.ts`,s={importProjectModule:t};async function c({config:t,env:n=process.env,importProjectDependency:r=f,importProjectModule:i=s.importProjectModule}={}){let a=(t??(await e()).database)?.dialect??`postgres`;if(a===`postgres`)return u({env:n,importProjectModule:i,importProjectDependency:r});if(a===`sqlite`)return d({env:n,importProjectModule:i,importProjectDependency:r});throw Error(`Unsupported database dialect "${a}".`)}async function l({env:e=process.env,importProjectDependency:t=f,importProjectModule:n=s.importProjectModule}={}){let r=e.DATABASE_URL;if(!r)throw Error(`DATABASE_URL is required to create the PostgreSQL database.`);let[{drizzle:i},{relations:a}]=await Promise.all([t(`drizzle-orm/node-postgres`),n(o)]);return i({connection:{connectionString:r,max:1},relations:a})}async function u({env:e,importProjectModule:t,importProjectDependency:r}){let i=await l({env:e,importProjectDependency:r,importProjectModule:t});return n({database:i,dialect:`postgres`,close:()=>i.$client?.end?.()??Promise.resolve()})}async function d({env:e,importProjectModule:t,importProjectDependency:r}){let i=e.TURSO_DATABASE_URL??e.DATABASE_URL;if(!i)throw Error(`TURSO_DATABASE_URL or DATABASE_URL is required to create the deploy database.`);let[{createClient:a},{drizzle:s},{relations:c}]=await Promise.all([r(`@libsql/client`),r(`drizzle-orm/libsql`),t(o)]),l=a({url:i,authToken:e.TURSO_AUTH_TOKEN});return n({database:s({client:l,relations:c}),dialect:`sqlite`,close:async()=>{await l.close?.()}})}async function f(e){return await import(a(r(i(`package.json`)).resolve(e)).href)}export{c as createProjectDeployDatabase,l as createProjectPostgresDrizzleDatabase};
@@ -1,4 +1,13 @@
1
+ import { startProjectPostgres } from "./local-postgres.js";
2
+
1
3
  //#region db/reset.d.ts
2
- declare function resetLocalDb(): Promise<void>;
4
+ type ResetLocalDbOptions = {
5
+ env?: NodeJS.ProcessEnv;
6
+ startProjectPostgres?: typeof startProjectPostgres;
7
+ };
8
+ declare function resetLocalDb({
9
+ env,
10
+ startProjectPostgres
11
+ }?: ResetLocalDbOptions): Promise<void>;
3
12
  //#endregion
4
13
  export { resetLocalDb };
package/dist/db/reset.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{LOCAL_DB_DIR as e}from"./config.js";import{rm as t}from"node:fs/promises";import{relative as n,resolve as r}from"node:path";async function i(){let i=r(e),a=n(process.cwd(),i);if(a===``||a.startsWith(`..`))throw Error(`Refusing to reset local database outside the project: ${i}`);await t(i,{force:!0,recursive:!0}),console.log(`Removed local PGlite data at ${i}`)}import.meta.main&&i().catch(e=>{console.error(e),process.exit(1)});export{i as resetLocalDb};
2
+ import{createLocalPostgresDb as e,startProjectPostgres as t}from"./local-postgres.js";import n from"../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/usingCtx.js";import{sql as r}from"drizzle-orm";const i={startProjectPostgres:t};async function a({env:t=process.env,startProjectPostgres:a=i.startProjectPostgres}={}){try{var o=n();let i=await e({env:o.a(await a({env:t})).env});try{await i.execute(r`drop schema if exists public cascade`),await i.execute(r`create schema public`),console.log(`Reset local PostgreSQL schema`)}finally{await i.$client.end()}}catch(e){o.e=e}finally{await o.d()}}import.meta.main&&a().catch(e=>{console.error(e),process.exit(1)});export{a as resetLocalDb};
@@ -0,0 +1,21 @@
1
+ import { importProjectModule } from "../project.js";
2
+ import { createLocalPostgresDb, startTemporaryProjectPostgres } from "./local-postgres.js";
3
+ import { planLocalSchemaPush } from "./schema-push.js";
4
+
5
+ //#region db/schema-check.d.ts
6
+ type CheckSchemaPushOptions = {
7
+ createLocalPostgresDb?: typeof createLocalPostgresDb;
8
+ env?: NodeJS.ProcessEnv;
9
+ importProjectModule?: typeof importProjectModule;
10
+ planLocalSchemaPush?: typeof planLocalSchemaPush;
11
+ startTemporaryProjectPostgres?: typeof startTemporaryProjectPostgres;
12
+ };
13
+ declare function checkSchemaPush({
14
+ createLocalPostgresDb,
15
+ env,
16
+ importProjectModule,
17
+ planLocalSchemaPush,
18
+ startTemporaryProjectPostgres
19
+ }?: CheckSchemaPushOptions): Promise<void>;
20
+ //#endregion
21
+ export { checkSchemaPush };
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{importProjectModule as e}from"../project.js";import{createLocalPostgresDb as t,startTemporaryProjectPostgres as n}from"./local-postgres.js";import r from"../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/usingCtx.js";import{inferSchemaDialect as i,planLocalSchemaPush as a}from"./schema-push.js";const o={createLocalPostgresDb:t,importProjectModule:e,planLocalSchemaPush:a,startTemporaryProjectPostgres:n};async function s({createLocalPostgresDb:e=o.createLocalPostgresDb,env:t=process.env,importProjectModule:n=o.importProjectModule,planLocalSchemaPush:a=o.planLocalSchemaPush,startTemporaryProjectPostgres:s=o.startTemporaryProjectPostgres}={}){try{var l=r();console.log(`Checking Drizzle schema against a throwaway PostgreSQL database`);let o=l.a(await s({env:t})),u=await n(`src/db/schema.ts`),d=await e({env:o.env});try{let e=i(u);if(e!==`postgres`)throw Error(`Temporary schema push checks require PostgreSQL schema, but found ${e}.`);let t=await a(e,u,d);if(t.sqlStatements.length===0){console.log(`Drizzle schema check passed with no changes`);return}console.log(`Applying ${t.sqlStatements.length} statement(s) to throwaway database`),await t.apply(),console.log(`Drizzle schema check passed`)}finally{await c(d)}}catch(e){l.e=e}finally{await l.d()}}function c(e){return e.$client.end()}import.meta.main&&s().catch(e=>{console.error(e),process.exit(1)});export{s as checkSchemaPush};
package/dist/db/seed.d.ts CHANGED
@@ -1,6 +1,14 @@
1
1
  import { SeedProfile } from "./config.js";
2
+ import { startProjectPostgres } from "./local-postgres.js";
2
3
 
3
4
  //#region db/seed.d.ts
4
- declare function seedLocalDb(profile?: SeedProfile): Promise<void>;
5
+ type SeedLocalDbOptions = {
6
+ env?: NodeJS.ProcessEnv;
7
+ startProjectPostgres?: typeof startProjectPostgres;
8
+ };
9
+ declare function seedLocalDb(profile?: SeedProfile, {
10
+ env,
11
+ startProjectPostgres
12
+ }?: SeedLocalDbOptions): Promise<void>;
5
13
  //#endregion
6
14
  export { seedLocalDb };
package/dist/db/seed.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{importProjectModule as e}from"../project.js";import{LOCAL_DB_DIR as t,getSeedProfile as n}from"./config.js";async function r(r=n()){let[{createLocalDb:i},{seedUsers:a}]=await Promise.all([e(`src/db/local.ts`),e(`scripts/db/seeds/users.ts`)]),o=i(t);try{await a(o,r),console.log(`Seeded local database with "${r}" profile`)}finally{await o.$client.close()}}import.meta.main&&r().catch(e=>{console.error(e),process.exit(1)});export{r as seedLocalDb};
2
+ import{importProjectModule as e}from"../project.js";import{createLocalPostgresDb as t,startProjectPostgres as n}from"./local-postgres.js";import r from"../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/usingCtx.js";import{getSeedProfile as i}from"./config.js";const a={startProjectPostgres:n};async function o(n=i(),{env:o=process.env,startProjectPostgres:s=a.startProjectPostgres}={}){try{var c=r();let i=c.a(await s({env:o})),[{seedUsers:a},l]=await Promise.all([e(`scripts/db/seeds/users.ts`),t({env:i.env})]);try{await a(l,n),console.log(`Seeded local database with "${n}" profile`)}finally{await l.$client.end()}}catch(e){c.e=e}finally{await c.d()}}import.meta.main&&o().catch(e=>{console.error(e),process.exit(1)});export{o as seedLocalDb};
@@ -1,6 +1,14 @@
1
1
  import { SeedProfile } from "./config.js";
2
+ import { startProjectPostgres } from "./local-postgres.js";
2
3
 
3
4
  //#region db/setup.d.ts
4
- declare function setupLocalDb(profile?: SeedProfile): Promise<void>;
5
+ type SetupLocalDbOptions = {
6
+ env?: NodeJS.ProcessEnv;
7
+ startProjectPostgres?: typeof startProjectPostgres;
8
+ };
9
+ declare function setupLocalDb(profile?: SeedProfile, {
10
+ env,
11
+ startProjectPostgres
12
+ }?: SetupLocalDbOptions): Promise<void>;
5
13
  //#endregion
6
14
  export { setupLocalDb };
package/dist/db/setup.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{seedLocalDb as e}from"./seed.js";import{migrateLocalDb as t}from"./migrate.js";import{resetLocalDb as n}from"./reset.js";async function r(r=`small`){await n(),await t(),await e(r)}import.meta.main&&r().catch(e=>{console.error(e),process.exit(1)});export{r as setupLocalDb};
2
+ import{startProjectPostgres as e}from"./local-postgres.js";import t from"../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/usingCtx.js";import{seedLocalDb as n}from"./seed.js";import{migrateLocalDb as r}from"./migrate.js";import{resetLocalDb as i}from"./reset.js";const a={startProjectPostgres:e};async function o(e=`default`,{env:o=process.env,startProjectPostgres:s=a.startProjectPostgres}={}){try{var c=t();let a=c.a(await s({env:o})).env;await i({env:a}),await r({env:a}),await n(e,{env:a})}catch(e){c.e=e}finally{await c.d()}}import.meta.main&&o().catch(e=>{console.error(e),process.exit(1)});export{o as setupLocalDb};
package/dist/deploy.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{readProjectConfig as e}from"./config.js";import{collectDeployMigrationFiles as t,formatMigrationList as n,formatMigrationScanFailures as r,scanDeployMigrationFiles as i}from"./deploy/migrations.js";import{createProjectDeployDatabase as a}from"./db/project.js";import{runPostDeployChecks as o}from"./deploy/checks.js";import{resolveDeployConfig as s}from"./deploy/config.js";import{filterPendingMigrations as c,readAppliedMigrationNames as l}from"./deploy/pending-migrations.js";import{parseTauriReleasePlatform as u,prepareTauriRelease as d,resolveTauriReleasePlan as f,restoreTauriReleaseMetadata as p,uploadTauriReleaseToB2 as m,validateTauriReleasePlan as h,writeTauriReleaseMetadata as g}from"./deploy/tauri-release.js";import{nextReleaseVersion as _,readPackageJson as v,releaseName as y,writePackageVersion as b}from"./deploy/version.js";import{writeFile as x}from"node:fs/promises";import S from"nano-spawn";import*as C from"@clack/prompts";const w=`package.json`;async function T(t=process.argv.slice(2),n=process.env){let c=E(t),{packageJson:l,source:u}=await v(w),T=_(l.version),D=y(l.name,T),O=n.DEPLOY_ENV??`production`,A=F(n,D,l.name,T),L=await e(),R=s(L.deploy??{},n),z=f({args:c,config:R.tauriRelease,env:n}),B=!1,V={files:[]};C.intro(`Deploy ${D}`),N(c),P(n,[`POSTHOG_API_KEY`,`POSTHOG_PROJECT_ID`]),await M(),await h(z);let H=await k(await a({config:L.database,env:n})),U=await i(H);if(U.length>0)throw Error(`Pending deploy migrations contain unsafe SQL. Move unsafe statements to held migrations.\n${r(U)}`);let W=await j(c,H);try{await b(w,l,T),V=await g(z,T),C.log.step(`Running pre-deploy build`),await S(`pnpm`,[`build`],{env:I(A),stdio:`inherit`});let e=z.enabled?await d({env:I(A),plan:z,releaseName:D,version:T}):void 0;C.log.step(`Running release build and uploading PostHog source maps`),B=!0,await S(`pnpm`,[`build`],{env:A,stdio:`inherit`}),W&&(C.log.step(`Running deploy-safe database migrations`),await S(`pnpm`,[`db`,`migrate`],{env:A,stdio:`inherit`})),C.log.step(`Deploying Worker and static assets to Cloudflare`),await S(`pnpm`,[`exec`,`wrangler`,`deploy`,`--strict`,`--keep-vars`,`--tag`,D,`--message`,`Deploy ${D}`,`--var`,`POSTHOG_RELEASE:${D}`],{env:A,stdio:`inherit`}),c.skipPostDeployChecks||(C.log.step(`Running post-deploy checks`),await o(R,{environment:O,productionUrl:R.productionUrl,releaseName:D,version:T})),e&&(C.log.step(`Uploading Tauri release artifacts to Backblaze B2`),await m(z,e)),C.outro(`Deployed ${D}`)}catch(e){throw B||(await x(w,u),await p(V)),e}}function E(e){return{runMigrations:e.includes(`--run-migrations`)||e.includes(`--yes`),skipMigrations:e.includes(`--skip-migrations`),skipPostDeployChecks:e.includes(`--skip-post-deploy-checks`),tauriLocalPlatforms:D(e,`--tauri-local-platform`).map(e=>u(e)),tauriWorkflowName:O(e,`--tauri-workflow-name`),tauriWorkflowPlatforms:D(e,`--tauri-workflow-platform`).map(e=>u(e)),tauriWorkflowRef:O(e,`--tauri-workflow-ref`),yes:e.includes(`--yes`)}}function D(e,t){let n=[];for(let r=0;r<e.length;r+=1){let i=e[r];if(i===t){let i=e[r+1];if(!i||i.startsWith(`--`))throw Error(`${t} requires a value.`);n.push(...i.split(`,`).filter(Boolean)),r+=1;continue}i.startsWith(`${t}=`)&&n.push(...i.slice(t.length+1).split(`,`).filter(Boolean))}return n}function O(e,t){let n=D(e,t);if(n.length>1)throw Error(`${t} can only be provided once.`);return n[0]}async function k(e){try{return await A(e)}finally{await e.close?.()}}async function A(e){return c(await t(),await l(e))}async function j(e,t){if(t.length===0)return C.log.info(`No pending deploy migrations.`),!1;if(C.note(n(t),`Pending deploy migrations`),e.runMigrations)return!0;if(e.skipMigrations)return!1;if(!process.stdout.isTTY)throw Error(`Pending migrations require --run-migrations or --skip-migrations in noninteractive deploys.`);let r=await C.confirm({initialValue:!0,message:`Run these deploy-safe database migrations before Cloudflare deploy?`});if(C.isCancel(r))throw C.cancel(`Deploy cancelled.`),Error(`Deploy cancelled.`);return r}async function M(){let{stdout:e}=await S(`git`,[`status`,`--porcelain`],{stdin:`ignore`});if(e.trim().length>0)throw Error(`Deploy requires a clean git tree before the release version is applied.`)}function N(e){if(e.runMigrations&&e.skipMigrations)throw Error(`Use only one of --run-migrations, --skip-migrations, or --yes.`)}function P(e,t){let n=t.filter(t=>!e[t]);if(n.length>0)throw Error(`Missing required deploy environment variables: ${n.join(`, `)}`);return Object.fromEntries(t.map(t=>[t,e[t]]))}function F(e,t,n,r){return{...e,POSTHOG_RELEASE:t,POSTHOG_RELEASE_NAME:e.POSTHOG_RELEASE_NAME??n,POSTHOG_RELEASE_VERSION:e.POSTHOG_RELEASE_VERSION??r}}function I(e){let{POSTHOG_API_KEY:t,POSTHOG_PROJECT_ID:n,...r}=e;return r}import.meta.main&&T().catch(e=>{console.error(e),process.exit(1)});export{T as deployProject,E as parseDeployArgs,e as readProjectConfig};
2
+ import{readProjectConfig as e}from"./config.js";import{createProjectDeployDatabase as t}from"./db/project.js";import{collectDeployMigrationFiles as n,formatMigrationList as r,formatMigrationScanFailures as i,scanDeployMigrationFiles as a}from"./deploy/migrations.js";import{runPostDeployChecks as o}from"./deploy/checks.js";import{resolveDeployConfig as s}from"./deploy/config.js";import{filterPendingMigrations as c,readAppliedMigrationNames as l}from"./deploy/pending-migrations.js";import{parseTauriReleasePlatform as u,prepareTauriRelease as d,resolveTauriReleasePlan as f,restoreTauriReleaseMetadata as p,uploadTauriReleaseToB2 as m,validateTauriReleasePlan as h,writeTauriReleaseMetadata as g}from"./deploy/tauri-release.js";import{nextReleaseVersion as _,readPackageJson as v,releaseName as y,writePackageVersion as b}from"./deploy/version.js";import{writeFile as x}from"node:fs/promises";import S from"nano-spawn";import*as C from"@clack/prompts";const w=`package.json`;async function T(n=process.argv.slice(2),r=process.env){let c=E(n),{packageJson:l,source:u}=await v(w),T=_(l.version),D=y(l.name,T),O=r.DEPLOY_ENV??`production`,A=F(r,D,l.name,T),L=await e(),R=s(L.deploy??{},r),z=f({args:c,config:R.tauriRelease,env:r}),B=!1,V={files:[]};C.intro(`Deploy ${D}`),N(c),P(r,[`POSTHOG_API_KEY`,`POSTHOG_PROJECT_ID`]),await M(),await h(z);let H=await k(await t({config:L.database,env:r})),U=await a(H);if(U.length>0)throw Error(`Pending deploy migrations contain unsafe SQL. Move unsafe statements to held migrations.\n${i(U)}`);let W=await j(c,H);try{await b(w,l,T),V=await g(z,T),C.log.step(`Running pre-deploy build`),await S(`pnpm`,[`build`],{env:I(A),stdio:`inherit`});let e=z.enabled?await d({env:I(A),plan:z,releaseName:D,version:T}):void 0;C.log.step(`Running release build and uploading PostHog source maps`),B=!0,await S(`pnpm`,[`build`],{env:A,stdio:`inherit`}),W&&(C.log.step(`Running deploy-safe database migrations`),await S(`pnpm`,[`db`,`migrate`],{env:A,stdio:`inherit`})),C.log.step(`Deploying Worker and static assets to Cloudflare`),await S(`pnpm`,[`exec`,`wrangler`,`deploy`,`--strict`,`--keep-vars`,`--tag`,D,`--message`,`Deploy ${D}`,`--var`,`POSTHOG_RELEASE:${D}`],{env:A,stdio:`inherit`}),c.skipPostDeployChecks||(C.log.step(`Running post-deploy checks`),await o(R,{environment:O,productionUrl:R.productionUrl,releaseName:D,version:T})),e&&(C.log.step(`Uploading Tauri release artifacts to Backblaze B2`),await m(z,e)),C.outro(`Deployed ${D}`)}catch(e){throw B||(await x(w,u),await p(V)),e}}function E(e){return{runMigrations:e.includes(`--run-migrations`)||e.includes(`--yes`),skipMigrations:e.includes(`--skip-migrations`),skipPostDeployChecks:e.includes(`--skip-post-deploy-checks`),tauriLocalPlatforms:D(e,`--tauri-local-platform`).map(e=>u(e)),tauriWorkflowName:O(e,`--tauri-workflow-name`),tauriWorkflowPlatforms:D(e,`--tauri-workflow-platform`).map(e=>u(e)),tauriWorkflowRef:O(e,`--tauri-workflow-ref`),yes:e.includes(`--yes`)}}function D(e,t){let n=[];for(let r=0;r<e.length;r+=1){let i=e[r];if(i===t){let i=e[r+1];if(!i||i.startsWith(`--`))throw Error(`${t} requires a value.`);n.push(...i.split(`,`).filter(Boolean)),r+=1;continue}i.startsWith(`${t}=`)&&n.push(...i.slice(t.length+1).split(`,`).filter(Boolean))}return n}function O(e,t){let n=D(e,t);if(n.length>1)throw Error(`${t} can only be provided once.`);return n[0]}async function k(e){try{return await A(e)}finally{await e.close?.()}}async function A(e){return c(await n(),await l(e))}async function j(e,t){if(t.length===0)return C.log.info(`No pending deploy migrations.`),!1;if(C.note(r(t),`Pending deploy migrations`),e.runMigrations)return!0;if(e.skipMigrations)return!1;if(!process.stdout.isTTY)throw Error(`Pending migrations require --run-migrations or --skip-migrations in noninteractive deploys.`);let n=await C.confirm({initialValue:!0,message:`Run these deploy-safe database migrations before Cloudflare deploy?`});if(C.isCancel(n))throw C.cancel(`Deploy cancelled.`),Error(`Deploy cancelled.`);return n}async function M(){let{stdout:e}=await S(`git`,[`status`,`--porcelain`],{stdin:`ignore`});if(e.trim().length>0)throw Error(`Deploy requires a clean git tree before the release version is applied.`)}function N(e){if(e.runMigrations&&e.skipMigrations)throw Error(`Use only one of --run-migrations, --skip-migrations, or --yes.`)}function P(e,t){let n=t.filter(t=>!e[t]);if(n.length>0)throw Error(`Missing required deploy environment variables: ${n.join(`, `)}`);return Object.fromEntries(t.map(t=>[t,e[t]]))}function F(e,t,n,r){return{...e,POSTHOG_RELEASE:t,POSTHOG_RELEASE_NAME:e.POSTHOG_RELEASE_NAME??n,POSTHOG_RELEASE_VERSION:e.POSTHOG_RELEASE_VERSION??r}}function I(e){let{POSTHOG_API_KEY:t,POSTHOG_PROJECT_ID:n,...r}=e;return r}import.meta.main&&T().catch(e=>{console.error(e),process.exit(1)});export{T as deployProject,E as parseDeployArgs,e as readProjectConfig};
package/dist/dev.d.ts CHANGED
@@ -1,24 +1,21 @@
1
1
  import { readProjectConfig } from "./config.js";
2
- import { spawn as spawn$1 } from "node:child_process";
2
+ import { startProjectPostgres } from "./db/local-postgres.js";
3
3
 
4
4
  //#region dev.d.ts
5
- type Spawn = typeof spawn$1;
6
5
  type DevServerOptions = {
7
6
  cwd?: string;
8
7
  env?: NodeJS.ProcessEnv;
9
- logPath?: string;
10
8
  platform?: DevPlatform;
11
9
  readProjectConfig?: typeof readProjectConfig;
12
- spawn?: Spawn;
10
+ startProjectPostgres?: typeof startProjectPostgres;
13
11
  };
14
12
  type DevPlatform = "android" | "desktop" | "ios" | "web";
15
13
  declare function runDevServer({
16
14
  cwd,
17
15
  env,
18
- logPath,
19
16
  platform,
20
- readProjectConfig: readConfig,
21
- spawn
17
+ readProjectConfig,
18
+ startProjectPostgres
22
19
  }?: DevServerOptions): Promise<void>;
23
20
  //#endregion
24
21
  export { DevPlatform, DevServerOptions, runDevServer };
package/dist/dev.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{readProjectConfig as e}from"./config.js";import{mkdir as t}from"node:fs/promises";import n from"node:path";import r from"node:process";import{createWriteStream as i}from"node:fs";import{spawn as a}from"node:child_process";const o=n.resolve(`node_modules`,`.bin`),s=r.platform===`win32`?`pnpm.cmd`:`pnpm`,c=r.platform===`win32`?`react-router.cmd`:`react-router`,l=r.platform===`win32`?`turso.cmd`:`turso`;async function u({cwd:t=r.cwd(),env:i=r.env,logPath:u=`.agents/logs/dev-server.log`,platform:_=`web`,readProjectConfig:v=e,spawn:y=a}={}){let b=i.PATH??i.Path??``,x=`TAURI_ENV_PLATFORM`in i?void 0:await f(u),S;try{if(_===`web`){(await v({cwd:t})).database?.dialect===`sqlite`&&(S=g(y,l,[`dev`],{cwd:t,env:i,log:x})),await h(y,s,[`db`,`ensure`],{cwd:t,env:i,log:x}),await d(h(y,c,[`dev`],{cwd:t,env:{...i,CLOUDFLARE_ENV:`development`,PATH:o+n.delimiter+b},log:x}),S);return}await h(y,s,m(_),{cwd:t,env:i,log:x})}finally{await S?.stop(),await p(x)}}async function d(e,t){if(!t){await e;return}await Promise.race([e,t.exited.then(()=>{throw Error(`turso dev exited before the web dev server stopped`)},e=>{throw e})])}async function f(e){return await t(n.dirname(e),{recursive:!0}),i(e,{flags:`w`})}function p(e){return e?new Promise((t,n)=>{e.once(`error`,n),e.end(t)}):Promise.resolve()}function m(e){return[`--dir=tauri`,`tauri`,...e===`desktop`?[]:[e],`dev`]}function h(e,t,n,{cwd:r,env:i,log:a}){return g(e,t,n,{cwd:r,env:i,log:a}).exited}function g(e,t,n,{cwd:i,env:a,log:o}){let s=!1,c=e(t,n,{cwd:i,env:a,stdio:o?[`inherit`,`pipe`,`pipe`]:`inherit`}),l=new Promise((e,i)=>{if(o){if(!c.stdout||!c.stderr){i(Error(`${[t,...n].join(` `)} did not provide output streams`));return}c.stdout.on(`data`,e=>{r.stdout.write(e),o.write(e)}),c.stderr.on(`data`,e=>{r.stderr.write(e),o.write(e)})}c.on(`error`,e=>{s=!0,i(e)}),c.on(`close`,(r,a)=>{if(s=!0,r===0){e();return}let o=[t,...n].join(` `);i(Error(`${o} failed${a?` with signal ${a}`:` with exit code ${r??1}`}`))})});return l.catch(()=>void 0),{exited:l,async stop(){s||c.kill?.(`SIGTERM`);try{await l}catch{}}}}import.meta.main&&u().catch(e=>{console.error(e),r.exit(1)});export{u as runDevServer};
2
+ import{readProjectConfig as e}from"./config.js";import{startProjectPostgres as t}from"./db/local-postgres.js";import n from"./_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/usingCtx.js";import r from"node:path";import i from"node:process";import{supervise as a}from"procband";const o=r.resolve(`node_modules`,`.bin`),s=i.platform===`win32`?`pnpm.cmd`:`pnpm`,c=i.platform===`win32`?`react-router.cmd`:`react-router`,l=i.platform===`win32`?`turso.cmd`:`turso`,u={readProjectConfig:e,startProjectPostgres:t};async function d({cwd:e=i.cwd(),env:t=i.env,platform:d=`web`,readProjectConfig:_=u.readProjectConfig,startProjectPostgres:v=u.startProjectPostgres}={}){let y=t.PATH??t.Path??``,b,x;try{if(d===`web`){let i=await _({cwd:e});if(i.database?.dialect===`sqlite`){let n={command:l,args:[`dev`],cwd:e,env:t};b=a({name:g(n),...n}),x=b.wait().then(e=>h(n,e)),x.catch(()=>void 0);let r={command:s,args:[`db`,`ensure`],cwd:e,env:t};await a({name:g(r),...r}).wait().then(e=>h(r,e))}if(f(i))try{var S=n();let l=S.a(await v({config:i,cwd:e,env:t})).env,u={command:s,args:[`db`,`ensure`],cwd:e,env:l};await a({name:g(u),...u}).wait().then(e=>h(u,e));let d={command:c,args:[`dev`],cwd:e,env:{...l,CLOUDFLARE_ENV:`development`,PATH:o+r.delimiter+y}};await a({name:g(d),...d}).wait().then(e=>h(d,e));return}catch(e){S.e=e}finally{await S.d()}let u={command:c,args:[`dev`],cwd:e,env:{...t,CLOUDFLARE_ENV:`development`,PATH:o+r.delimiter+y}};await p(a({name:g(u),...u}).wait().then(e=>h(u,e)),x);return}let i=m(d),u={command:s,args:i,cwd:e,env:t};await a({name:g(u),...u}).wait().then(e=>h(u,e))}finally{if(b){b.kill(`SIGTERM`);try{await x}catch{}}}}function f(e){return(e.database?.dialect??`postgres`)===`postgres`}async function p(e,t){if(!t){await e;return}await Promise.race([e,t.then(()=>{throw Error(`turso dev exited before the web dev server stopped`)},e=>{throw e})])}function m(e){return[`--dir=tauri`,`tauri`,...e===`desktop`?[]:[e],`dev`]}function h(e,t){if(t.exitCode===0)return;let n=[e.command,...e.args??[]].join(` `);throw Error(`${n} failed${t.signal?` with signal ${t.signal}`:` with exit code ${t.code??t.exitCode}`}`)}function g({command:e,args:t=[]}){return[r.basename(e).replace(/\.[cm]?js$/,``),...t].filter(e=>/^[\w-]+$/.test(e)).join(`-`)}import.meta.main&&d().catch(e=>{console.error(e),i.exit(1)});export{d as runDevServer};
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{join as e}from"node:path";import{existsSync as t,mkdtempSync as n,readFileSync as r,rmSync as i,writeFileSync as a}from"node:fs";import{spawnSync as o}from"node:child_process";import{tmpdir as s}from"node:os";const c=`.agents/skills/coreframe-upgrade/SKILL.md`;function l(e,t={}){return o(`git`,e,t)}function u(e){return e.stderr.toString(`utf8`).trim()||e.stdout.toString(`utf8`).trim()}function d(e,t){let n=l([`show`,`${e}:${t}`],{encoding:`utf8`});if(n.status!==0){let r=u(n);throw Error(`Could not read ${t} at ${e}.${r?` ${r}`:``}`)}return n.stdout.toString()}function f(){let e=l([`rev-parse`,`--show-toplevel`],{encoding:`utf8`});if(e.status!==0){let t=u(e);throw Error(`Could not find git repository root.${t?` ${t}`:``}`)}return e.stdout.toString().trim()}function p(t,r){let o=n(e(s(),`coreframe-upgrade-skill-`)),c=e(o,`SKILL.md`);try{a(c,r);let e=u(l([`--no-pager`,`diff`,`--no-index`,`--color=never`,`--`,t,c]));e&&console.log(e)}finally{i(o,{force:!0,recursive:!0})}}function m({apply:n,target:i}){let o=e(f(),c);if(!t(o))throw Error(`Local ${c} does not exist.`);let s=r(o,`utf8`),l=d(i,c);return s===l?(console.log(`Coreframe upgrade skill matches ${i}:${c}.`),0):n?(a(o,l),console.error(`Updated ${c} from ${i}. Reread it before continuing the upgrade.`),20):(console.error(`Coreframe upgrade skill differs from ${i}:${c}.`),console.error(`Run again with --apply to update it, then reread ${c} before continuing.`),p(o,l),20)}if(import.meta.main){let e=process.argv.indexOf(`--target`),t=e===-1?null:process.argv[e+1];t||(console.error(`Usage: coreframe upgrade check-skill-current --target <git-ref> [--apply]`),process.exit(64));try{process.exit(m({apply:process.argv.includes(`--apply`),target:t}))}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(65)}}export{m as checkUpgradeSkillCurrent};
2
+ import{join as e}from"node:path";import{tmpdir as t}from"node:os";import{existsSync as n,mkdtempSync as r,readFileSync as i,rmSync as a,writeFileSync as o}from"node:fs";import{spawnSync as s}from"node:child_process";const c=`.agents/skills/coreframe-upgrade/SKILL.md`;function l(e,t={}){return s(`git`,e,t)}function u(e){return e.stderr.toString(`utf8`).trim()||e.stdout.toString(`utf8`).trim()}function d(e,t){let n=l([`show`,`${e}:${t}`],{encoding:`utf8`});if(n.status!==0){let r=u(n);throw Error(`Could not read ${t} at ${e}.${r?` ${r}`:``}`)}return n.stdout.toString()}function f(){let e=l([`rev-parse`,`--show-toplevel`],{encoding:`utf8`});if(e.status!==0){let t=u(e);throw Error(`Could not find git repository root.${t?` ${t}`:``}`)}return e.stdout.toString().trim()}function p(n,i){let s=r(e(t(),`coreframe-upgrade-skill-`)),c=e(s,`SKILL.md`);try{o(c,i);let e=u(l([`--no-pager`,`diff`,`--no-index`,`--color=never`,`--`,n,c]));e&&console.log(e)}finally{a(s,{force:!0,recursive:!0})}}function m({apply:t,target:r}){let a=e(f(),c);if(!n(a))throw Error(`Local ${c} does not exist.`);let s=i(a,`utf8`),l=d(r,c);return s===l?(console.log(`Coreframe upgrade skill matches ${r}:${c}.`),0):t?(o(a,l),console.error(`Updated ${c} from ${r}. Reread it before continuing the upgrade.`),20):(console.error(`Coreframe upgrade skill differs from ${r}:${c}.`),console.error(`Run again with --apply to update it, then reread ${c} before continuing.`),p(a,l),20)}if(import.meta.main){let e=process.argv.indexOf(`--target`),t=e===-1?null:process.argv[e+1];t||(console.error(`Usage: coreframe upgrade check-skill-current --target <git-ref> [--apply]`),process.exit(64));try{process.exit(m({apply:process.argv.includes(`--apply`),target:t}))}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(65)}}export{m as checkUpgradeSkillCurrent};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coreframe/scripts",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "bin": {
5
5
  "coreframe": "./bin/coreframe.js"
6
6
  },
@@ -31,6 +31,7 @@
31
31
  "@clack/prompts": "^1.6.0",
32
32
  "cmd-ts": "0.15.0",
33
33
  "drizzle-orm": "1.0.0-rc.4",
34
+ "local-postgres": "0.1.2",
34
35
  "nano-spawn": "^2.1.0",
35
36
  "procband": "^0.3.5",
36
37
  "tinyglobby": "^0.2.17"