@coreframe/scripts 0.1.49 → 0.2.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.
Files changed (130) hide show
  1. package/dist/coreframe.d.ts +233 -41
  2. package/dist/coreframe.js +13 -2
  3. package/package.json +17 -30
  4. package/dist/_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/usingCtx.js +0 -1
  5. package/dist/assets/contracts.d.ts +0 -187
  6. package/dist/assets/contracts.js +0 -1
  7. package/dist/assets/credentials.d.ts +0 -35
  8. package/dist/assets/credentials.js +0 -1
  9. package/dist/assets/images.d.ts +0 -32
  10. package/dist/assets/images.js +0 -1
  11. package/dist/assets/media.d.ts +0 -42
  12. package/dist/assets/media.js +0 -1
  13. package/dist/assets/project.d.ts +0 -54
  14. package/dist/assets/project.js +0 -3
  15. package/dist/assets/storage.d.ts +0 -60
  16. package/dist/assets/storage.js +0 -1
  17. package/dist/assets/workflows.d.ts +0 -69
  18. package/dist/assets/workflows.js +0 -1
  19. package/dist/assets.d.ts +0 -4
  20. package/dist/assets.js +0 -1
  21. package/dist/config.d.ts +0 -49
  22. package/dist/config.js +0 -1
  23. package/dist/db/apply-seed.d.ts +0 -8
  24. package/dist/db/apply-seed.js +0 -1
  25. package/dist/db/client.d.ts +0 -30
  26. package/dist/db/client.js +0 -1
  27. package/dist/db/config.d.ts +0 -24
  28. package/dist/db/config.js +0 -1
  29. package/dist/db/drizzle-kit.d.ts +0 -10
  30. package/dist/db/drizzle-kit.js +0 -2
  31. package/dist/db/ensure.d.ts +0 -9
  32. package/dist/db/ensure.js +0 -2
  33. package/dist/db/error.d.ts +0 -4
  34. package/dist/db/error.js +0 -1
  35. package/dist/db/local-postgres.d.ts +0 -65
  36. package/dist/db/local-postgres.js +0 -1
  37. package/dist/db/migrate-held.d.ts +0 -16
  38. package/dist/db/migrate-held.js +0 -10
  39. package/dist/db/migrate.d.ts +0 -9
  40. package/dist/db/migrate.js +0 -2
  41. package/dist/db/project.d.ts +0 -23
  42. package/dist/db/project.js +0 -1
  43. package/dist/db/reset.d.ts +0 -9
  44. package/dist/db/reset.js +0 -2
  45. package/dist/db/schema-check.d.ts +0 -11
  46. package/dist/db/schema-check.js +0 -2
  47. package/dist/db/schema-push.d.ts +0 -22
  48. package/dist/db/schema-push.js +0 -1
  49. package/dist/db/seed.d.ts +0 -19
  50. package/dist/db/seed.js +0 -2
  51. package/dist/db/setup.d.ts +0 -11
  52. package/dist/db/setup.js +0 -2
  53. package/dist/deploy/access-token-secret.d.ts +0 -39
  54. package/dist/deploy/access-token-secret.js +0 -1
  55. package/dist/deploy/check-migrations.d.ts +0 -4
  56. package/dist/deploy/check-migrations.js +0 -2
  57. package/dist/deploy/checks.d.ts +0 -8
  58. package/dist/deploy/checks.js +0 -1
  59. package/dist/deploy/config.d.ts +0 -68
  60. package/dist/deploy/config.js +0 -1
  61. package/dist/deploy/migrations.d.ts +0 -24
  62. package/dist/deploy/migrations.js +0 -4
  63. package/dist/deploy/pending-migrations.d.ts +0 -9
  64. package/dist/deploy/pending-migrations.js +0 -1
  65. package/dist/deploy/tauri-release.d.ts +0 -106
  66. package/dist/deploy/tauri-release.js +0 -1
  67. package/dist/deploy/version.d.ts +0 -24
  68. package/dist/deploy/version.js +0 -1
  69. package/dist/deploy.d.ts +0 -21
  70. package/dist/deploy.js +0 -3
  71. package/dist/dev-device.d.ts +0 -34
  72. package/dist/dev-device.js +0 -1
  73. package/dist/dev-https.d.ts +0 -17
  74. package/dist/dev-https.js +0 -1
  75. package/dist/dev-lock.d.ts +0 -28
  76. package/dist/dev-lock.js +0 -1
  77. package/dist/dev-timing.d.ts +0 -25
  78. package/dist/dev-timing.js +0 -1
  79. package/dist/dev.d.ts +0 -39
  80. package/dist/dev.js +0 -3
  81. package/dist/environment.d.ts +0 -27
  82. package/dist/environment.js +0 -1
  83. package/dist/i18n/catalogs.d.ts +0 -60
  84. package/dist/i18n/catalogs.js +0 -1
  85. package/dist/i18n/contracts.d.ts +0 -60
  86. package/dist/i18n/contracts.js +0 -1
  87. package/dist/i18n/paths.d.ts +0 -12
  88. package/dist/i18n/paths.js +0 -1
  89. package/dist/i18n/storage.d.ts +0 -117
  90. package/dist/i18n/storage.js +0 -1
  91. package/dist/i18n/workflows.d.ts +0 -46
  92. package/dist/i18n/workflows.js +0 -1
  93. package/dist/managed-dev-protocol.d.ts +0 -135
  94. package/dist/managed-dev-protocol.js +0 -1
  95. package/dist/managed-dev.d.ts +0 -48
  96. package/dist/managed-dev.js +0 -5
  97. package/dist/private-object-store.d.ts +0 -28
  98. package/dist/private-object-store.js +0 -1
  99. package/dist/project.d.ts +0 -5
  100. package/dist/project.js +0 -1
  101. package/dist/recipes/apply.d.ts +0 -26
  102. package/dist/recipes/apply.js +0 -2
  103. package/dist/recipes/list.d.ts +0 -14
  104. package/dist/recipes/list.js +0 -1
  105. package/dist/recipes/manifest.d.ts +0 -14
  106. package/dist/recipes/manifest.js +0 -1
  107. package/dist/recipes/source.d.ts +0 -22
  108. package/dist/recipes/source.js +0 -1
  109. package/dist/runner.d.ts +0 -20
  110. package/dist/runner.js +0 -1
  111. package/dist/staging.d.ts +0 -33
  112. package/dist/staging.js +0 -3
  113. package/dist/tauri-dev-output.d.ts +0 -21
  114. package/dist/tauri-dev-output.js +0 -2
  115. package/dist/typecheck.d.ts +0 -4
  116. package/dist/typecheck.js +0 -2
  117. package/dist/upgrade/check-skill-current.d.ts +0 -11
  118. package/dist/upgrade/check-skill-current.js +0 -2
  119. package/dist/upgrade/ensure-template-remote.d.ts +0 -13
  120. package/dist/upgrade/ensure-template-remote.js +0 -2
  121. package/dist/upgrade/fast-forward-template-files.d.ts +0 -9
  122. package/dist/upgrade/fast-forward-template-files.js +0 -2
  123. package/dist/upgrade/sync-coreframe-packages.d.ts +0 -8
  124. package/dist/upgrade/sync-coreframe-packages.js +0 -4
  125. package/dist/upgrade/template-ref.d.ts +0 -6
  126. package/dist/upgrade/template-ref.js +0 -1
  127. package/dist/user-preferences.d.ts +0 -8
  128. package/dist/user-preferences.js +0 -1
  129. package/dist/worker-environment.d.ts +0 -95
  130. package/dist/worker-environment.js +0 -1
@@ -1,65 +0,0 @@
1
- import { DrizzleExecutor } from "./client.js";
2
- import { CoreframeConfig } from "../config.js";
3
- import { createProjectPostgresDrizzleDatabase } from "./project.js";
4
- import { LocalPostgresEnv, PostgresOutputTarget } from "local-postgres";
5
-
6
- //#region db/local-postgres.d.ts
7
- declare const LOCAL_POSTGRES_ENV_FLAG = "COREFRAME_LOCAL_POSTGRES";
8
- type LocalPostgresDb = Awaited<ReturnType<typeof createProjectPostgresDrizzleDatabase>> & {
9
- $client: {
10
- end(): Promise<void>;
11
- };
12
- transaction<Result>(run: (database: DrizzleExecutor) => Promise<Result>): Promise<Result>;
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
- failIfRunning?: boolean;
35
- postgresOutput?: PostgresOutputTarget;
36
- };
37
- type StartTemporaryProjectPostgresOptions = StartProjectPostgresOptions;
38
- declare class ProjectPostgresAlreadyRunningError extends Error {
39
- readonly dataDir: string;
40
- readonly pid: number;
41
- constructor(dataDir: string, pid: number, options?: ErrorOptions);
42
- }
43
- declare function startProjectPostgres({
44
- config,
45
- cwd,
46
- env,
47
- failIfRunning,
48
- postgresOutput
49
- }?: StartProjectPostgresOptions): Promise<ProjectPostgresSidecar>;
50
- declare function stopProjectPostgres({
51
- dataDir,
52
- pid
53
- }: ProjectPostgresAlreadyRunningError): Promise<void>;
54
- declare function startTemporaryProjectPostgres({
55
- config,
56
- cwd,
57
- env
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, ProjectPostgresAlreadyRunningError, ProjectPostgresSidecar, StartProjectPostgresOptions, StartTemporaryProjectPostgresOptions, createLocalPostgresDb, createLocalPostgresEnv, getLocalPostgresConnectionString, startProjectPostgres, startTemporaryProjectPostgres, stopProjectPostgres };
@@ -1 +0,0 @@
1
- import{readProjectConfig as e}from"../config.js";import{fs as t,os as n}from"../environment.js";import{createProjectPostgresDrizzleDatabase as r}from"./project.js";import i from"node:path";import{startPostgres as a}from"local-postgres";import{PostgresDataDirInUseError as o,stopPostgresDataDir as s}from"local-postgres/core";const c=`COREFRAME_LOCAL_POSTGRES`,l=`coreframe`,u=2e3,d=4e3,f=new Map,p={name:`coreframe`,password:`coreframe`};var m=class extends Error{dataDir;pid;constructor(e,t,n){super(`PostgreSQL is already running for this project (PID ${t}). Stop the other top-level \`coreframe dev\` process before starting another.`,n),this.name=`ProjectPostgresAlreadyRunningError`,this.dataDir=e,this.pid=t}};async function h({config:n,cwd:r=process.cwd(),env:o=process.env,failIfRunning:s=!1,postgresOutput:c}={}){if(o.COREFRAME_LOCAL_POSTGRES===`1`||((n??await e({cwd:r})).database?.dialect??`postgres`)!==`postgres`)return w(o);let d=i.resolve(r,`.coreframe/postgres`),f=await T(d);if(f){if(s)throw new m(d,f.pid);return w(E(o,d,f))}let h=i.join(d,`postgres.log`);await t.rm(h,{force:!0});let g;try{g=await a({dataDir:d,database:l,postgresOutput:c??{filePath:h},postgres:{strategy:`prefer-local`},stopTimeoutMs:u,superuser:p})}catch(e){throw await D(e,c?void 0:h)}return b(o,g)}async function g({dataDir:e,pid:t}){let n=`${e}\0${t}`,r=f.get(n);if(r){await r;return}let i=S(e,t);f.set(n,i);try{await i}finally{f.get(n)===i&&f.delete(n)}}async function _({config:r,cwd:o=process.cwd(),env:s=process.env}={}){let c=(r??await e({cwd:o})).database?.dialect??`postgres`;if(c!==`postgres`)throw Error(`Temporary schema push checks require PostgreSQL, but this project uses ${c}.`);let d=await t.mkdtemp(i.join(n.tmpdir(),`coreframe-schema-check-`));try{let e=b(s,await a({dataDir:d,database:l,postgresOutput:`ignore`,postgres:{strategy:`prefer-local`},stopTimeoutMs:u,superuser:p}));return{env:e.env,async[Symbol.asyncDispose](){await e[Symbol.asyncDispose](),await t.rm(d,{force:!0,recursive:!0})}}}catch(e){throw await C(d,e),e}}function v(e,t){return{...e,...t,[c]:`1`}}async function y({env:e=process.env}={}){let t=k(e);return r({env:{...e,DATABASE_URL:t}})}function b(e,t){let n;return{env:v(e,t.env),async[Symbol.asyncDispose](){n??=x(t),await n}}}async function x(e){let t;try{await e[Symbol.asyncDispose]()}catch(e){t=e}if(e.pid===void 0){if(t)throw t;return}try{await s({dataDir:e.dataDir,expectedPid:e.pid,mode:`immediate`,timeoutMs:d})}catch(n){throw t?AggregateError([t,n],`Failed to stop PostgreSQL process ${e.pid}.`):n}}async function S(e,t){try{await s({dataDir:e,expectedPid:t,mode:`fast`,timeoutMs:d})}catch(n){try{await s({dataDir:e,expectedPid:t,mode:`immediate`,timeoutMs:d})}catch(e){throw AggregateError([n,e],`Failed to stop PostgreSQL process ${t}.`)}}}async function C(e,n){try{await s({dataDir:e,mode:`immediate`,timeoutMs:d})}catch(t){throw AggregateError([n,t],`Temporary PostgreSQL failed to start and could not be stopped for ${e}.`)}await t.rm(e,{force:!0,recursive:!0})}function w(e){return{env:e,async[Symbol.asyncDispose](){}}}async function T(e){let r;try{r=await t.readFile(i.join(e,`postmaster.pid`),`utf8`)}catch{return}let[a,,,o,,s]=r.split(/\r?\n/),c=Number(a);if(!Number.isSafeInteger(c)||c<=0)return;try{n.kill(c,0)}catch(e){if(!O(e)||e.code!==`EPERM`)return}let l=Number(o);if(!Number.isSafeInteger(l)||l<=0||l>65535||!s)throw Error(`Cannot read connection details for PostgreSQL process ${c} from ${e}.`);return{host:s,pid:c,port:l}}function E(e,t,{host:n,port:r}){let i=new URL(`postgresql://${n}:${r}/${l}`);return i.username=p.name,i.password=p.password,v(e,{DATABASE_URL:i.href,PGDATA:t,PGDATABASE:l,PGHOST:n,PGPASSWORD:p.password,PGPORT:String(r),PGUSER:p.name})}async function D(e,n){if(e instanceof o)return new m(e.dataDir,e.pid,{cause:e});let r=e instanceof Error?e.message:String(e),i;if(n)try{i=(await t.readFile(n,`utf8`)).trim()||void 0}catch{}let a=i?`\n\nPostgreSQL output:\n${i}`:``,s=n?`\n\nPostgreSQL log: ${n}`:``;return Error(`Local PostgreSQL failed to start: ${r}${a}${s}`,{cause:e})}function O(e){return e instanceof Error}function k(e=process.env){let t=e.DATABASE_URL||A(e);if(!t)throw Error(`DATABASE_URL or PGDATABASE, PGHOST, PGPORT, and PGUSER are required.`);return t}function A(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{c as LOCAL_POSTGRES_ENV_FLAG,m as ProjectPostgresAlreadyRunningError,y as createLocalPostgresDb,v as createLocalPostgresEnv,k as getLocalPostgresConnectionString,h as startProjectPostgres,_ as startTemporaryProjectPostgres,g as stopProjectPostgres};
@@ -1,16 +0,0 @@
1
- import { DatabaseDialect } from "./client.js";
2
-
3
- //#region db/migrate-held.d.ts
4
- type MigrateHeldOptions = {
5
- argv?: string[];
6
- env?: NodeJS.ProcessEnv;
7
- };
8
- declare function migrateHeldMigrations({
9
- argv,
10
- env
11
- }?: MigrateHeldOptions): Promise<void>;
12
- declare function validateHeldMigrationHeader(sql: string, relativePath: string): void;
13
- declare function heldMigrationSelectQuery(dialect: DatabaseDialect, id: string): string;
14
- declare function heldMigrationInsertQuery(dialect: DatabaseDialect, id: string, sha256: string): string;
15
- //#endregion
16
- export { heldMigrationInsertQuery, heldMigrationSelectQuery, migrateHeldMigrations, validateHeldMigrationHeader };
@@ -1,10 +0,0 @@
1
- #!/usr/bin/env node
2
- import{createProjectDeployDatabase as e}from"./project.js";import{collectHeldMigrationFiles as t,formatMigrationList as n}from"../deploy/migrations.js";import{createHash as r}from"node:crypto";import{readFile as i}from"node:fs/promises";const a=`--confirm=run-held-migrations`,o=[`-- Held migration:`,`-- Safe after:`,`-- Verification:`];async function s({argv:r=process.argv.slice(2),env:o=process.env}={}){let s=await t();if(console.log(`Held migration files:`),console.log(n(s)),!r.includes(a))throw Error(`Held migrations require explicit confirmation. Re-run with ${a}.`);if(s.length===0){console.log(`No held migrations to run.`);return}let d=await e({env:o});try{await u(d);for(let e of s){let t=await i(e.path,`utf8`);c(t,e.relativePath);let n=l(t),r=await d.execute(f(d.dialect,e.id));if(r.rows.length===1){if(r.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(d,async r=>{await r.execute(t),await r.execute(p(d.dialect,e.id,n))})}}finally{await d.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 r(`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
- id text primary key,
4
- sha256 text not null,
5
- applied_at timestamptz not null default now()
6
- )`];case`sqlite`:return[`create table if not exists __held_migrations (
7
- id text primary key,
8
- sha256 text not null,
9
- applied_at text not null default current_timestamp
10
- )`]}}function f(e,t){return`select sha256 from ${m(e)} where id = ${g(t)}`}function p(e,t,n){return`insert into ${m(e)} (id, sha256) values (${g(t)}, ${g(n)})`}function m(e){switch(e){case`postgres`:return`drizzle.__held_migrations`;case`sqlite`:return`__held_migrations`}}async function h(e,t){if(e.transaction){await e.transaction(t);return}await e.execute(`begin`);try{await t(e),await e.execute(`commit`)}catch(t){throw await e.execute(`rollback`),t}}function g(e){return`'${e.replaceAll(`'`,`''`)}'`}export{p as heldMigrationInsertQuery,f as heldMigrationSelectQuery,s as migrateHeldMigrations,c as validateHeldMigrationHeader};
@@ -1,9 +0,0 @@
1
- //#region db/migrate.d.ts
2
- type MigrateLocalDbOptions = {
3
- env?: NodeJS.ProcessEnv;
4
- };
5
- declare function migrateLocalDb({
6
- env
7
- }?: MigrateLocalDbOptions): Promise<void>;
8
- //#endregion
9
- export { migrateLocalDb };
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
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);async function c({env:r=process.env}={}){try{var a=n();await i(s);let c=await e({env:a.a(await t({env:r})).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()}}export{c as migrateLocalDb};
@@ -1,23 +0,0 @@
1
- import { DatabaseClient, DrizzleExecutor } from "./client.js";
2
- import { DatabaseConfig } from "../config.js";
3
-
4
- //#region db/project.d.ts
5
- type CreateProjectDatabaseOptions = {
6
- config?: DatabaseConfig;
7
- env?: NodeJS.ProcessEnv;
8
- };
9
- type DrizzleDatabase = DrizzleExecutor & {
10
- $client?: {
11
- close?(): Promise<void> | void;
12
- end?(): Promise<void>;
13
- };
14
- };
15
- declare function createProjectDeployDatabase({
16
- config,
17
- env
18
- }?: CreateProjectDatabaseOptions): Promise<DatabaseClient>;
19
- declare function createProjectPostgresDrizzleDatabase({
20
- env
21
- }?: CreateProjectDatabaseOptions): Promise<DrizzleDatabase>;
22
- //#endregion
23
- export { CreateProjectDatabaseOptions, createProjectDeployDatabase, createProjectPostgresDrizzleDatabase };
@@ -1 +0,0 @@
1
- import{readProjectConfig as e}from"../config.js";import{importProjectDependency as t,importProjectModule as n}from"../project.js";import{createDatabaseAdapter as r}from"./client.js";const i=`src/db/relations.ts`;async function a({config:t,env:n=process.env}={}){let r=(t??(await e()).database)?.dialect??`postgres`;if(r===`postgres`)return s({env:n});if(r===`sqlite`)return c({env:n});throw Error(`Unsupported database dialect "${r}".`)}async function o({env:e=process.env}={}){let r=e.DATABASE_URL;if(!r)throw Error(`DATABASE_URL is required to create the PostgreSQL database.`);let[{drizzle:a},{relations:o}]=await Promise.all([t(`drizzle-orm/node-postgres`),n(i)]);return a({connection:{connectionString:r,max:1},relations:o})}async function s({env:e}){let t=await o({env:e});return r({database:t,dialect:`postgres`,close:()=>t.$client?.end?.()??Promise.resolve()})}async function c({env:e}){let a=e.TURSO_DATABASE_URL??e.DATABASE_URL;if(!a)throw Error(`TURSO_DATABASE_URL or DATABASE_URL is required to create the deploy database.`);let[{createClient:o},{drizzle:s},{relations:c}]=await Promise.all([t(`@libsql/client`),t(`drizzle-orm/libsql`),n(i)]),l=o({url:a,authToken:e.TURSO_AUTH_TOKEN});return r({database:s({client:l,relations:c}),dialect:`sqlite`,close:async()=>{await l.close?.()}})}export{a as createProjectDeployDatabase,o as createProjectPostgresDrizzleDatabase};
@@ -1,9 +0,0 @@
1
- //#region db/reset.d.ts
2
- type ResetLocalDbOptions = {
3
- env?: NodeJS.ProcessEnv;
4
- };
5
- declare function resetLocalDb({
6
- env
7
- }?: ResetLocalDbOptions): Promise<void>;
8
- //#endregion
9
- export { resetLocalDb };
package/dist/db/reset.js DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
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";async function i({env:i=process.env}={}){try{var a=n();let o=await e({env:a.a(await t({env:i})).env});try{await o.transaction(async e=>{await e.execute(r`drop schema if exists public cascade`),await e.execute(r`drop schema if exists drizzle cascade`),await e.execute(r`create schema public`)}),console.log(`Reset local PostgreSQL schema`)}finally{await o.$client.end()}}catch(e){a.e=e}finally{await a.d()}}export{i as resetLocalDb};
@@ -1,11 +0,0 @@
1
- //#region db/schema-check.d.ts
2
- type CheckSchemaPushOptions = {
3
- env?: NodeJS.ProcessEnv;
4
- seed?: boolean;
5
- };
6
- declare function checkSchemaPush({
7
- env,
8
- seed
9
- }?: CheckSchemaPushOptions): Promise<void>;
10
- //#endregion
11
- export { checkSchemaPush };
@@ -1,2 +0,0 @@
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";import{runProjectSeed as o}from"./seed.js";async function s({env:s=process.env,seed:l=!1}={}){try{var u=r();console.log(`Checking Drizzle schema against a throwaway PostgreSQL database`);let d=u.a(await n({env:s})),f=await e(`src/db/schema.ts`),p=await t({env:d.env});try{let e=i(f);if(e!==`postgres`)throw Error(`Temporary schema push checks require PostgreSQL schema, but found ${e}.`);let t=await a(e,f,p);t.sqlStatements.length===0?console.log(`Drizzle schema check passed with no changes`):(console.log(`Applying ${t.sqlStatements.length} statement(s) to throwaway database`),await t.apply(),console.log(`Drizzle schema check passed`)),l&&(console.log(`Seeding throwaway database`),await o(`default`,{env:d.env}),console.log(`Throwaway database seed check passed`))}finally{await c(p)}}catch(e){u.e=e}finally{await u.d()}}function c(e){return e.$client.end()}export{s as checkSchemaPush};
@@ -1,22 +0,0 @@
1
- import { DatabaseDialect } from "./client.js";
2
-
3
- //#region db/schema-push.d.ts
4
- type SchemaPushPlan = {
5
- sqlStatements: string[];
6
- hints: Array<{
7
- hint: string;
8
- statement?: string;
9
- }>;
10
- apply(): Promise<void>;
11
- };
12
- type SchemaPushModule = {
13
- pushSchema(schema: Record<string, unknown>, db: never, migrationsConfig?: {
14
- table?: string;
15
- schema?: string;
16
- }): Promise<SchemaPushPlan>;
17
- };
18
- type ImportSchemaPushModule = (dialect: DatabaseDialect) => Promise<SchemaPushModule>;
19
- declare function planLocalSchemaPush(dialect: DatabaseDialect, schema: Record<string, unknown>, db: unknown, importModule?: ImportSchemaPushModule): Promise<SchemaPushPlan>;
20
- declare function inferSchemaDialect(schema: Record<string, unknown>): DatabaseDialect;
21
- //#endregion
22
- export { SchemaPushModule, SchemaPushPlan, inferSchemaDialect, planLocalSchemaPush };
@@ -1 +0,0 @@
1
- import{resolve as e}from"node:path";import{pathToFileURL as t}from"node:url";import{resolve as n}from"import-meta-resolve";import{is as r}from"drizzle-orm";import{PgMaterializedView as i,PgTable as a,PgView as o}from"drizzle-orm/pg-core";import{SQLiteTable as s,SQLiteView as c}from"drizzle-orm/sqlite-core";const l={postgres:`drizzle-kit/payload/postgres`,sqlite:`drizzle-kit/payload/sqlite`};async function u(e,t,n,r=f){let{pushSchema:i}=await r(e);return i(t,n)}function d(e){let t=!1,n=!1;for(let r of Object.values(e))t||=p(r),n||=m(r);if(t&&n)throw Error(`Local database schema mixes PostgreSQL and SQLite entities.`);if(t)return`postgres`;if(n)return`sqlite`;throw Error(`Could not infer local database dialect from src/db/schema.ts.`)}async function f(r){return await import(n(l[r],t(e(`package.json`)).href))}function p(e){return r(e,a)||r(e,o)||r(e,i)}function m(e){return r(e,s)||r(e,c)}export{d as inferSchemaDialect,u as planLocalSchemaPush};
package/dist/db/seed.d.ts DELETED
@@ -1,19 +0,0 @@
1
- import { SeedProfile } from "./config.js";
2
-
3
- //#region db/seed.d.ts
4
- type SeedLocalDbOptions = {
5
- env?: NodeJS.ProcessEnv;
6
- };
7
- type RunProjectSeedOptions = {
8
- env: NodeJS.ProcessEnv;
9
- seedEntryPoint?: string;
10
- };
11
- declare function seedLocalDb(profile?: SeedProfile, {
12
- env
13
- }?: SeedLocalDbOptions): Promise<void>;
14
- declare function runProjectSeed(profile: SeedProfile | undefined, {
15
- env,
16
- seedEntryPoint
17
- }: RunProjectSeedOptions): Promise<void>;
18
- //#endregion
19
- export { runProjectSeed, seedLocalDb };
package/dist/db/seed.js DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import{readProjectConfig as e}from"../config.js";import{importProjectModule as t}from"../project.js";import{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";async function a(t=i(),{env:a=process.env}={}){try{var c=r();let i=await e(),l=s(i);await o(t,{env:c.a(await n({config:i,env:a})).env,seedEntryPoint:l}),console.log(`Seeded local database with "${t}" profile`)}catch(e){c.e=e}finally{await c.d()}}async function o(n=i(),{env:r,seedEntryPoint:a}){a??=s(await e()),await l(r,async()=>{await c(await t(a),a)({env:r,profile:n})})}function s(e){let t=e.database?.seed;if(!t)throw Error(`coreframe.config.ts must configure database.seed before running db seed.`);return t}function c(e,t){let n=e.default??e.seed??e.seedLocalDb;if(!n)throw Error(`${t} must export a default seed function, seed function, or seedLocalDb function.`);return n}async function l(e,t){let n=new Map;for(let[t,r]of Object.entries(e))n.set(t,process.env[t]),r===void 0?delete process.env[t]:process.env[t]=r;try{await t()}finally{for(let[e,t]of n)t===void 0?delete process.env[e]:process.env[e]=t}}export{o as runProjectSeed,a as seedLocalDb};
@@ -1,11 +0,0 @@
1
- import { SeedProfile } from "./config.js";
2
-
3
- //#region db/setup.d.ts
4
- type SetupLocalDbOptions = {
5
- env?: NodeJS.ProcessEnv;
6
- };
7
- declare function setupLocalDb(profile?: SeedProfile, {
8
- env
9
- }?: SetupLocalDbOptions): Promise<void>;
10
- //#endregion
11
- export { setupLocalDb };
package/dist/db/setup.js DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
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";async function a(a=`default`,{env:o=process.env}={}){try{var s=t();let c=s.a(await e({env:o})).env;await i({env:c}),await r({env:c}),await n(a,{env:c})}catch(e){s.e=e}finally{await s.d()}}export{a as setupLocalDb};
@@ -1,39 +0,0 @@
1
- import { DeployEnvironment } from "./config.js";
2
-
3
- //#region deploy/access-token-secret.d.ts
4
- declare const accessTokenSigningSecretName = "COREFRAME_ACCESS_TOKEN_SECRET";
5
- type SecretNamesReader = (environment: DeployEnvironment, cwd: string) => Promise<readonly string[]>;
6
- type SecretWriter = (environment: DeployEnvironment, name: string, value: string, cwd: string) => Promise<void>;
7
- type AccessTokenSigningSecretOptions = {
8
- cwd?: string;
9
- environment: DeployEnvironment;
10
- generateSecret?: () => string;
11
- listSecretNames?: SecretNamesReader;
12
- };
13
- type PreparedAccessTokenSigningSecret = {
14
- provisioned: boolean;
15
- value?: string;
16
- };
17
- declare function prepareAccessTokenSigningSecret({
18
- cwd,
19
- environment,
20
- generateSecret,
21
- listSecretNames
22
- }: AccessTokenSigningSecretOptions): Promise<PreparedAccessTokenSigningSecret>;
23
- declare function verifyAccessTokenSigningSecret({
24
- cwd,
25
- environment,
26
- listSecretNames
27
- }: Omit<AccessTokenSigningSecretOptions, "generateSecret">): Promise<void>;
28
- declare function rotateAccessTokenSigningSecret({
29
- cwd,
30
- environment,
31
- generateSecret,
32
- listSecretNames,
33
- writeSecret
34
- }: AccessTokenSigningSecretOptions & {
35
- writeSecret?: SecretWriter;
36
- }): Promise<void>;
37
- declare function generateAccessTokenSigningSecret(): string;
38
- //#endregion
39
- export { PreparedAccessTokenSigningSecret, accessTokenSigningSecretName, generateAccessTokenSigningSecret, prepareAccessTokenSigningSecret, rotateAccessTokenSigningSecret, verifyAccessTokenSigningSecret };
@@ -1 +0,0 @@
1
- import{randomBytes as e}from"node:crypto";import t,{SubprocessError as n}from"nano-spawn";const r=`COREFRAME_ACCESS_TOKEN_SECRET`;async function i({cwd:e=process.cwd(),environment:t,generateSecret:n=s,listSecretNames:i=c}){try{if((await i(t,e)).includes(`COREFRAME_ACCESS_TOKEN_SECRET`))return{provisioned:!1}}catch(e){if(!u(e))throw Error(`Could not inspect the ${t} Worker before provisioning ${r}. Refusing to risk replacing an existing signing secret.`,{cause:e})}return{provisioned:!0,value:n()}}async function a({cwd:e=process.cwd(),environment:t,listSecretNames:n=c}){if(!(await n(t,e)).includes(`COREFRAME_ACCESS_TOKEN_SECRET`))throw Error(`Cloudflare deployed the ${t} Worker without ${r}.`)}async function o({cwd:e=process.cwd(),environment:t,generateSecret:n=s,listSecretNames:i=c,writeSecret:o=l}){await o(t,r,n(),e),await a({cwd:e,environment:t,listSecretNames:i})}function s(){return e(32).toString(`base64url`)}async function c(e,n){let{stdout:r}=await t(`pnpm`,[`exec`,`wrangler`,`secret`,`list`,`--env`,e,`--format`,`json`],{cwd:n,stdin:`ignore`}),i=JSON.parse(r);if(!Array.isArray(i))throw Error(`Wrangler returned an invalid Worker secret list.`);return i.flatMap(e=>e&&typeof e==`object`&&`name`in e&&typeof e.name==`string`?[e.name]:[])}async function l(e,n,r,i){await t(`pnpm`,[`exec`,`wrangler`,`secret`,`put`,n,`--env`,e],{cwd:i,stdin:{string:r},stdout:`inherit`,stderr:`inherit`})}function u(e){return e instanceof n&&e.stderr.includes(`not found`)&&e.stderr.includes("If this is a new Worker, run `wrangler deploy` first")}export{r as accessTokenSigningSecretName,s as generateAccessTokenSigningSecret,i as prepareAccessTokenSigningSecret,o as rotateAccessTokenSigningSecret,a as verifyAccessTokenSigningSecret};
@@ -1,4 +0,0 @@
1
- //#region deploy/check-migrations.d.ts
2
- declare function checkDeployMigrations(): Promise<void>;
3
- //#endregion
4
- export { checkDeployMigrations };
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import{collectDeployMigrationFiles as e,formatMigrationList as t,formatMigrationScanFailures as n,scanDeployMigrationFiles as r}from"./migrations.js";async function i(){let i=await e();console.log(`Deploy migration files:`),console.log(t(i));let a=await r(i);if(a.length>0)throw Error(`Deploy migrations contain unsafe SQL. Move unsafe statements to held migrations.\n${n(a)}`);console.log(`Deploy migrations passed safety checks.`)}export{i as checkDeployMigrations};
@@ -1,8 +0,0 @@
1
- import { DeployContext, ResolvedDeployConfig } from "./config.js";
2
-
3
- //#region deploy/checks.d.ts
4
- declare function runAfterWorkerDeploy(config: ResolvedDeployConfig, context: DeployContext): Promise<void>;
5
- declare function runPostDeployChecks(config: ResolvedDeployConfig, context: DeployContext): Promise<void>;
6
- declare function runDeploySmokeChecks(config: ResolvedDeployConfig, context: DeployContext, request?: typeof fetch, log?: (message: string) => void): Promise<void>;
7
- //#endregion
8
- export { runAfterWorkerDeploy, runDeploySmokeChecks, runPostDeployChecks };
@@ -1 +0,0 @@
1
- async function e(e,t){try{await e.afterWorkerDeploy?.(t)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Worker deployment succeeded, but deploy.afterWorkerDeploy failed: ${t}`,{cause:e})}}async function t(e,t){await n(e,t),await e.afterDeploy?.(t)}async function n(e,t,n=fetch,i=console.log){for(let a of e.smokeChecks){let e=a.url??new URL(a.path??`/`,t.url).toString(),o=await n(e);if(!r(o.status,a.expectedStatus??`2xx`))throw Error(`${a.name} smoke check failed: ${e} returned ${o.status}.`);i(`${a.name} smoke check passed: ${o.status} ${e}`)}}function r(e,t){return t===`2xx`?e>=200&&e<300:Array.isArray(t)?t.includes(e):e===t}export{e as runAfterWorkerDeploy,n as runDeploySmokeChecks,t as runPostDeployChecks};
@@ -1,68 +0,0 @@
1
- //#region deploy/config.d.ts
2
- declare const deployEnvironments: readonly ["staging", "production"];
3
- type DeployEnvironment = (typeof deployEnvironments)[number];
4
- type DeployContext = {
5
- environment: DeployEnvironment;
6
- releaseName: string;
7
- url: string;
8
- version: string;
9
- };
10
- declare const tauriReleasePlatforms: readonly ["macos", "windows", "linux", "ios", "android"];
11
- type TauriReleasePlatform = (typeof tauriReleasePlatforms)[number];
12
- type TauriReleasePlatformConfig = {
13
- artifactGlobs?: string[];
14
- buildArgs?: string[];
15
- targetTriple?: string;
16
- updatePlatform?: string;
17
- };
18
- type TauriReleaseConfig = {
19
- artifactDownloadDir?: string;
20
- b2Bucket?: string;
21
- latestManifestPath?: string;
22
- localPlatforms?: TauriReleasePlatform[];
23
- platform?: Partial<Record<TauriReleasePlatform, TauriReleasePlatformConfig>>;
24
- publicBaseUrl?: string;
25
- publicPathPrefix?: string;
26
- releaseNotesPath?: string;
27
- releasePath?: string;
28
- releaseUploadDir?: string;
29
- workflowPlatforms?: TauriReleasePlatform[];
30
- workflowName?: string;
31
- workflowPollIntervalMs?: number;
32
- workflowRef?: string;
33
- workflowTimeoutMs?: number;
34
- };
35
- type DeploySmokeCheck = {
36
- name: string;
37
- path?: string;
38
- url?: string;
39
- expectedStatus?: "2xx" | number | number[];
40
- };
41
- type DeployEnvironmentConfig = {
42
- url?: string;
43
- };
44
- type StagingHostnameConfig = {
45
- managedLabelPrefix: string;
46
- parentHostname: string;
47
- workerService: string;
48
- };
49
- type DeployConfig = {
50
- afterDeploy?: (context: DeployContext) => Promise<void> | void;
51
- afterWorkerDeploy?: (context: DeployContext) => Promise<void> | void;
52
- environments?: Partial<Record<DeployEnvironment, DeployEnvironmentConfig>>;
53
- smokeChecks?: DeploySmokeCheck[];
54
- stagingHostname?: StagingHostnameConfig;
55
- tauriRelease?: TauriReleaseConfig;
56
- };
57
- type ResolvedDeployConfig = {
58
- afterDeploy?: (context: DeployContext) => Promise<void> | void;
59
- afterWorkerDeploy?: (context: DeployContext) => Promise<void> | void;
60
- environment: DeployEnvironment;
61
- smokeChecks: DeploySmokeCheck[];
62
- stagingHostname?: StagingHostnameConfig;
63
- tauriRelease: TauriReleaseConfig;
64
- url?: string;
65
- };
66
- declare function resolveDeployConfig(config: DeployConfig, environment: DeployEnvironment, env?: NodeJS.ProcessEnv): ResolvedDeployConfig;
67
- //#endregion
68
- export { DeployConfig, DeployContext, DeployEnvironment, DeployEnvironmentConfig, DeploySmokeCheck, ResolvedDeployConfig, StagingHostnameConfig, TauriReleaseConfig, TauriReleasePlatform, TauriReleasePlatformConfig, deployEnvironments, resolveDeployConfig, tauriReleasePlatforms };
@@ -1 +0,0 @@
1
- const e=[`staging`,`production`],t=[`macos`,`windows`,`linux`,`ios`,`android`];function n(e,t,n=process.env){return{afterDeploy:e.afterDeploy,afterWorkerDeploy:e.afterWorkerDeploy,environment:t,smokeChecks:e.smokeChecks??[{name:`home`,path:`/`}],stagingHostname:e.stagingHostname,tauriRelease:e.tauriRelease??{},url:n.DEPLOY_URL||(t===`staging`&&e.stagingHostname?void 0:e.environments?.[t]?.url)}}export{e as deployEnvironments,n as resolveDeployConfig,t as tauriReleasePlatforms};
@@ -1,24 +0,0 @@
1
- //#region deploy/migrations.d.ts
2
- type MigrationFile = {
3
- id: string;
4
- path: string;
5
- relativePath: string;
6
- };
7
- type MigrationRisk = {
8
- code: string;
9
- line: number;
10
- match: string;
11
- reason: string;
12
- };
13
- type MigrationScanResult = {
14
- migration: MigrationFile;
15
- risks: MigrationRisk[];
16
- };
17
- declare function collectDeployMigrationFiles(cwd?: string): Promise<MigrationFile[]>;
18
- declare function collectHeldMigrationFiles(cwd?: string): Promise<MigrationFile[]>;
19
- declare function scanDeployMigrationFiles(migrations: MigrationFile[]): Promise<MigrationScanResult[]>;
20
- declare function scanMigrationSql(sql: string): MigrationRisk[];
21
- declare function formatMigrationScanFailures(results: MigrationScanResult[]): string;
22
- declare function formatMigrationList(migrations: MigrationFile[]): string;
23
- //#endregion
24
- export { MigrationFile, MigrationRisk, MigrationScanResult, collectDeployMigrationFiles, collectHeldMigrationFiles, formatMigrationList, formatMigrationScanFailures, scanDeployMigrationFiles, scanMigrationSql };
@@ -1,4 +0,0 @@
1
- import{HELD_MIGRATIONS_FOLDER as e,MIGRATIONS_FOLDER as t}from"../db/config.js";import{access as n,readFile as r,readdir as i}from"node:fs/promises";import{basename as a,join as o,relative as s,resolve as c}from"node:path";const l=[{code:`drop-schema-object`,pattern:/\bdrop\s+(?:table|view|materialized\s+view|index|sequence|type|schema|function|trigger|policy)\b/giu,reason:`drops schema that the currently deployed app may still depend on`},{code:`drop-column`,pattern:/\balter\s+table\b[^;]*?\bdrop\s+column\b/giu,reason:`removes a column that the currently deployed app may still read or write`},{code:`drop-constraint`,pattern:/\balter\s+table\b[^;]*?\bdrop\s+constraint\b/giu,reason:`removes a constraint outside the staged contract phase`},{code:`truncate`,pattern:/\btruncate\b/giu,reason:`removes data outside the deploy-safe migration path`},{code:`rename-table-or-column`,pattern:/\balter\s+table\b[^;]*?\brename(?:\s+column)?\b/giu,reason:`renames schema in a way old and new app versions cannot both address`},{code:`rewrite-column-type`,pattern:/\balter\s+table\b[^;]*?\balter\s+column\b[^;]*?\btype\b/giu,reason:`rewrites a column type outside a staged expand/contract rollout`},{code:`set-not-null`,pattern:/\balter\s+table\b[^;]*?\balter\s+column\b[^;]*?\bset\s+not\s+null\b/giu,reason:`enforces NOT NULL before a separate backfill and verification step`},{code:`set-default`,pattern:/\balter\s+table\b[^;]*?\balter\s+column\b[^;]*?\bset\s+default\b/giu,reason:`changes default write behavior while old app code may still be running`},{code:`broad-update`,pattern:/\bupdate\b/giu,reason:`changes data outside a separately reviewed backfill or held migration`},{code:`broad-delete`,pattern:/\bdelete\s+from\b/giu,reason:`removes data outside a held migration`}];async function u(e=process.cwd()){return _(c(e,t),e)}async function d(t=process.cwd()){return v(c(t,e),t)}async function f(e){return(await Promise.all(e.map(async e=>({migration:e,risks:p(await r(e.path,`utf8`))})))).filter(e=>e.risks.length>0)}function p(e){let t=S(e),n=g(t),r=[];for(let n of l)for(let i of t.matchAll(n.pattern))r.push(T(e,i,n.code,n.reason));for(let i of t.matchAll(/\balter\s+table\s+(?:if\s+exists\s+|only\s+)?(?<table>(?:"[^"]+"|\w+)(?:\s*\.\s*(?:"[^"]+"|\w+))?)\s+add\s+column\b[^;]*?\bnot\s+null\b/giu))n.has(w(i.groups?.table))||r.push(T(e,i,`add-not-null-column`,`adds a required column to an existing table before a separate compatibility rollout`));for(let i of t.matchAll(/\balter\s+table\s+(?:if\s+exists\s+|only\s+)?(?<table>(?:"[^"]+"|\w+)(?:\s*\.\s*(?:"[^"]+"|\w+))?)\s+add\s+constraint\b[^;]*?\b(?:foreign\s+key|unique|primary\s+key|check)\b/giu))n.has(w(i.groups?.table))||r.push(T(e,i,`add-constraint`,`enforces a constraint on an existing table before a separate validation step`));for(let i of t.matchAll(/\bcreate\s+unique\s+index(?:\s+concurrently)?(?:\s+if\s+not\s+exists)?\s+(?:"[^"]+"|\w+)\s+on\s+(?<table>(?:"[^"]+"|\w+)(?:\s*\.\s*(?:"[^"]+"|\w+))?)/giu))n.has(w(i.groups?.table))||r.push(T(e,i,`create-unique-index`,`adds uniqueness to existing data before a separate dedupe and validation step`));return r.sort((e,t)=>e.line-t.line||e.code.localeCompare(t.code))}function m(e){return e.flatMap(e=>e.risks.map(t=>`${e.migration.relativePath}:${t.line} ${t.code}: ${t.reason} (${t.match.trim()})`)).join(`
2
- `)}function h(e){return e.length===0?`No migration files found.`:e.map(e=>`- ${e.relativePath}`).join(`
3
- `)}function g(e){let t=new Set;for(let n of e.matchAll(/\bcreate\s+(?:temporary\s+|temp\s+)?table\s+(?:if\s+not\s+exists\s+)?(?<table>(?:"[^"]+"|\w+)(?:\s*\.\s*(?:"[^"]+"|\w+))?)/giu))t.add(w(n.groups?.table));return t}async function _(e,t){let n=await y(e),r=[];for(let i of n){let n=o(e,i.name);if(i.isDirectory()){let e=o(n,`migration.sql`);await b(e)&&r.push(x(e,t,i.name));continue}i.isFile()&&i.name.endsWith(`.sql`)&&r.push(x(n,t,i.name.replace(/\.sql$/u,``)))}return r.sort((e,t)=>e.id.localeCompare(t.id))}async function v(e,t){return(await y(e)).filter(e=>e.isFile()&&e.name.endsWith(`.sql`)).map(n=>x(o(e,n.name),t,n.name.replace(/\.sql$/u,``))).sort((e,t)=>e.id.localeCompare(t.id))}async function y(e){try{return await i(e,{withFileTypes:!0})}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return[];throw e}}async function b(e){try{return await n(e),!0}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return!1;throw e}}function x(e,t,n=a(e,`.sql`)){return{id:n,path:e,relativePath:s(t,e)}}function S(e){return e.replace(/--[^\n\r]*/gu,C).replace(/\/\*[\s\S]*?\*\//gu,C).replace(/\$([A-Za-z_][A-Za-z0-9_]*)?\$[\s\S]*?\$\1\$/gu,C).replace(/'(?:''|[^'])*'/gu,C)}function C(e){return e.replace(/[^\n\r]/gu,` `)}function w(e){return(e??``).split(`.`).map(e=>e.trim().replace(/^"|"$/gu,``).toLowerCase()).at(-1)??``}function T(e,t,n,r){return{code:n,line:E(e,t.index??0),match:e.slice(t.index??0,(t.index??0)+t[0].length),reason:r}}function E(e,t){let n=1;for(let r=0;r<t;r+=1)e[r]===`
4
- `&&(n+=1);return n}export{u as collectDeployMigrationFiles,d as collectHeldMigrationFiles,h as formatMigrationList,m as formatMigrationScanFailures,f as scanDeployMigrationFiles,p as scanMigrationSql};
@@ -1,9 +0,0 @@
1
- import { DatabaseClient, DatabaseDialect } from "../db/client.js";
2
- import { MigrationFile } from "./migrations.js";
3
-
4
- //#region deploy/pending-migrations.d.ts
5
- declare function filterPendingMigrations(migrations: MigrationFile[], appliedNames: Iterable<string>): MigrationFile[];
6
- declare function readAppliedMigrationNames(database: DatabaseClient): Promise<Set<string>>;
7
- declare function appliedMigrationsQuery(dialect: DatabaseDialect): "select name from drizzle.__drizzle_migrations where name is not null" | "select name from __drizzle_migrations where name is not null";
8
- //#endregion
9
- export { appliedMigrationsQuery, filterPendingMigrations, readAppliedMigrationNames };
@@ -1 +0,0 @@
1
- function e(e,t){let n=new Set(t);return e.filter(e=>!n.has(e.id))}async function t(e){try{let t=await e.execute(n(e.dialect));return new Set(t.rows.flatMap(e=>e.name?[e.name]:[]))}catch(e){if(r(e))return new Set;throw e}}function n(e){switch(e){case`postgres`:return`select name from drizzle.__drizzle_migrations where name is not null`;case`sqlite`:return`select name from __drizzle_migrations where name is not null`}}function r(e){return e instanceof Error&&(`code`in e&&(e.code===`42P01`||e.code===`3F000`)||e.message.includes(`no such table`)||e.message.includes(`no such schema`))}export{n as appliedMigrationsQuery,e as filterPendingMigrations,t as readAppliedMigrationNames};
@@ -1,106 +0,0 @@
1
- import { TauriReleaseConfig, TauriReleasePlatform } from "./config.js";
2
-
3
- //#region deploy/tauri-release.d.ts
4
- type TauriReleaseArgs = {
5
- tauriLocalPlatforms: TauriReleasePlatform[];
6
- tauriWorkflowPlatforms: TauriReleasePlatform[];
7
- tauriWorkflowName?: string;
8
- tauriWorkflowRef?: string;
9
- };
10
- type TauriReleasePlan = {
11
- artifactDownloadDir: string;
12
- b2ApplicationKey?: string;
13
- b2ApplicationKeyId?: string;
14
- b2Bucket?: string;
15
- enabled: boolean;
16
- latestManifestPath: string;
17
- localPlatforms: TauriReleasePlatform[];
18
- platform: Record<TauriReleasePlatform, ResolvedTauriReleasePlatformConfig>;
19
- publicBaseUrl?: string;
20
- publicPathPrefix: string;
21
- releaseNotesPath?: string;
22
- releasePath: string;
23
- releaseUploadDir: string;
24
- signingPrivateKey?: string;
25
- workflowName: string;
26
- workflowPlatforms: TauriReleasePlatform[];
27
- workflowPollIntervalMs: number;
28
- workflowRef?: string;
29
- workflowTimeoutMs: number;
30
- };
31
- type TauriReleaseMetadataSnapshot = {
32
- files: {
33
- path: string;
34
- source: string;
35
- }[];
36
- };
37
- type PreparedTauriRelease = {
38
- manifestPath: string;
39
- uploadDir: string;
40
- };
41
- type ResolvedTauriReleasePlatformConfig = {
42
- artifactGlobs: string[];
43
- buildArgs: string[];
44
- targetTriple: string;
45
- updatePlatform: string;
46
- };
47
- type TauriUpdateManifest = {
48
- notes?: string;
49
- platforms: Record<string, {
50
- signature: string;
51
- url: string;
52
- }>;
53
- pub_date: string;
54
- version: string;
55
- };
56
- declare function parseTauriReleasePlatformList(value: string | undefined): ("macos" | "windows" | "linux" | "ios" | "android")[];
57
- declare function parseTauriReleasePlatform(value: string): TauriReleasePlatform;
58
- declare function resolveTauriReleasePlan({
59
- args,
60
- config,
61
- env
62
- }: {
63
- args: TauriReleaseArgs;
64
- config?: TauriReleaseConfig;
65
- env: NodeJS.ProcessEnv;
66
- }): TauriReleasePlan;
67
- declare function validateTauriReleasePlan(plan: TauriReleasePlan, cwd?: string): Promise<void>;
68
- declare function validateTauriReleaseIdentifier(tauriConfigSource: string, tauriConfigPath?: string): string;
69
- declare function writeTauriReleaseMetadata(plan: TauriReleasePlan, version: string, cwd?: string): Promise<TauriReleaseMetadataSnapshot>;
70
- declare function restoreTauriReleaseMetadata(snapshot: TauriReleaseMetadataSnapshot): Promise<void>;
71
- declare function prepareTauriRelease({
72
- env,
73
- plan,
74
- releaseName,
75
- version
76
- }: {
77
- env: NodeJS.ProcessEnv;
78
- plan: TauriReleasePlan;
79
- releaseName: string;
80
- version: string;
81
- }): Promise<PreparedTauriRelease | undefined>;
82
- declare function uploadTauriReleaseToB2(plan: TauriReleasePlan, release: PreparedTauriRelease): Promise<void>;
83
- declare function createTauriUpdateManifest({
84
- artifacts,
85
- notes,
86
- pubDate,
87
- version
88
- }: {
89
- artifacts: {
90
- signature: string;
91
- updatePlatform: string;
92
- url: string;
93
- }[];
94
- notes?: string;
95
- pubDate?: Date;
96
- version: string;
97
- }): TauriUpdateManifest;
98
- declare function createTauriReleaseUpload({
99
- plan,
100
- version
101
- }: {
102
- plan: TauriReleasePlan;
103
- version: string;
104
- }): Promise<PreparedTauriRelease>;
105
- //#endregion
106
- export { PreparedTauriRelease, TauriReleaseArgs, TauriReleaseMetadataSnapshot, TauriReleasePlan, createTauriReleaseUpload, createTauriUpdateManifest, parseTauriReleasePlatform, parseTauriReleasePlatformList, prepareTauriRelease, resolveTauriReleasePlan, restoreTauriReleaseMetadata, uploadTauriReleaseToB2, validateTauriReleaseIdentifier, validateTauriReleasePlan, writeTauriReleaseMetadata };
@@ -1 +0,0 @@
1
- import{tauriReleasePlatforms as e}from"./config.js";import{randomUUID as t}from"node:crypto";import{access as n,cp as r,mkdir as i,readFile as a,rm as o,stat as s,writeFile as c}from"node:fs/promises";import{basename as l,dirname as u,join as d,relative as f,resolve as p,sep as m}from"node:path";import h from"nano-spawn";import{constants as g}from"node:fs";import{setTimeout as _}from"node:timers/promises";import{glob as v}from"tinyglobby";const y={android:{artifactGlobs:[`src-tauri/target/**/*.sig`,`src-tauri/gen/android/**/*.sig`],buildArgs:[`tauri`,`android`,`build`,`--target`,`aarch64-linux-android`],targetTriple:`aarch64-linux-android`,updatePlatform:`android-aarch64`},ios:{artifactGlobs:[`src-tauri/target/**/*.sig`,`src-tauri/gen/apple/**/*.sig`],buildArgs:[`tauri`,`ios`,`build`,`--target`,`aarch64-apple-ios`],targetTriple:`aarch64-apple-ios`,updatePlatform:`ios-aarch64`},linux:{artifactGlobs:[`src-tauri/target/x86_64-unknown-linux-gnu/release/bundle/**/*.sig`,`src-tauri/target/release/bundle/**/*.sig`,`src-tauri/target/**/release/bundle/**/*.sig`],buildArgs:[`tauri`,`build`,`--target`,`x86_64-unknown-linux-gnu`,`--`,`--locked`],targetTriple:`x86_64-unknown-linux-gnu`,updatePlatform:`linux-x86_64`},macos:{artifactGlobs:[`src-tauri/target/aarch64-apple-darwin/release/bundle/**/*.sig`,`src-tauri/target/release/bundle/**/*.sig`,`src-tauri/target/**/release/bundle/**/*.sig`],buildArgs:[`tauri`,`build`,`--target`,`aarch64-apple-darwin`,`--`,`--locked`],targetTriple:`aarch64-apple-darwin`,updatePlatform:`darwin-aarch64`},windows:{artifactGlobs:[`src-tauri/target/x86_64-pc-windows-msvc/release/bundle/**/*.sig`,`src-tauri/target/release/bundle/**/*.sig`,`src-tauri/target/**/release/bundle/**/*.sig`],buildArgs:[`tauri`,`build`,`--target`,`x86_64-pc-windows-msvc`,`--`,`--locked`],targetTriple:`x86_64-pc-windows-msvc`,updatePlatform:`windows-x86_64`}};function b(e){return e?e.split(/[,\s]+/u).filter(Boolean).map(e=>x(e)):[]}function x(t){if(X(t))return t;throw Error(`Invalid Tauri release platform "${t}". Expected one of: ${e.join(`, `)}.`)}function S({args:e,config:t={},env:n}){let r=Y([...t.localPlatforms??[],...b(n.TAURI_RELEASE_LOCAL_PLATFORMS),...e.tauriLocalPlatforms]),i=Y([...t.workflowPlatforms??[],...b(n.TAURI_RELEASE_WORKFLOW_PLATFORMS),...e.tauriWorkflowPlatforms]),a=r.filter(e=>i.includes(e));if(a.length>0)throw Error(`Build each Tauri release platform either locally or through the workflow, not both: ${a.join(`, `)}.`);return{artifactDownloadDir:n.TAURI_RELEASE_ARTIFACT_DOWNLOAD_DIR??t.artifactDownloadDir??`.coreframe/tauri-artifacts`,b2ApplicationKey:n.B2_APPLICATION_KEY??n.B2_SECRET_ACCESS_KEY,b2ApplicationKeyId:n.B2_APPLICATION_KEY_ID??n.B2_KEY_ID??n.B2_ACCESS_KEY_ID,b2Bucket:t.b2Bucket??n.B2_BUCKET,enabled:r.length>0||i.length>0,latestManifestPath:n.TAURI_RELEASE_LATEST_MANIFEST_PATH??t.latestManifestPath??`latest.json`,localPlatforms:r,platform:L(t.platform,n),publicBaseUrl:t.publicBaseUrl??n.TAURI_RELEASE_PUBLIC_BASE_URL??n.UPDATE_PUBLIC_BASE_URL,publicPathPrefix:n.TAURI_RELEASE_PUBLIC_PATH_PREFIX??t.publicPathPrefix??n.UPDATE_PUBLIC_PATH_PREFIX??``,releaseNotesPath:n.TAURI_RELEASE_NOTES_FILE??t.releaseNotesPath,releasePath:n.TAURI_RELEASE_PATH??t.releasePath??"releases/${version}",releaseUploadDir:n.TAURI_RELEASE_UPLOAD_DIR??t.releaseUploadDir??`release-upload`,signingPrivateKey:n.TAURI_SIGNING_PRIVATE_KEY,workflowName:e.tauriWorkflowName??n.TAURI_RELEASE_WORKFLOW_NAME??t.workflowName??`tauri-release-artifacts.yml`,workflowPlatforms:i,workflowPollIntervalMs:J(n.TAURI_RELEASE_WORKFLOW_POLL_SECONDS,`TAURI_RELEASE_WORKFLOW_POLL_SECONDS`)*1e3||t.workflowPollIntervalMs||15e3,workflowRef:e.tauriWorkflowRef??n.TAURI_RELEASE_WORKFLOW_REF??t.workflowRef,workflowTimeoutMs:J(n.TAURI_RELEASE_WORKFLOW_TIMEOUT_MINUTES,`TAURI_RELEASE_WORKFLOW_TIMEOUT_MINUTES`)*6e4||t.workflowTimeoutMs||36e5}}async function C(e,t=process.cwd()){if(!e.enabled)return;let n=[[`TAURI_RELEASE_PUBLIC_BASE_URL`,e.publicBaseUrl],[`B2_APPLICATION_KEY_ID`,e.b2ApplicationKeyId],[`B2_APPLICATION_KEY`,e.b2ApplicationKey],[`B2_BUCKET`,e.b2Bucket]].flatMap(([e,t])=>t?[]:[e]);if(n.length>0)throw Error(`Missing required Tauri release configuration: ${n.join(`, `)}`);try{new URL(e.publicBaseUrl)}catch{throw Error(`Invalid TAURI_RELEASE_PUBLIC_BASE_URL: ${e.publicBaseUrl}`)}let r=d(t,`src-tauri/tauri.conf.json`);if(!await Z(r))throw Error(`Tauri release platforms were requested, but src-tauri/tauri.conf.json does not exist.`);if(w(await a(r,`utf8`),r),e.localPlatforms.length>0&&!e.signingPrivateKey)throw Error(`TAURI_SIGNING_PRIVATE_KEY is required for local Tauri release builds.`);e.workflowPlatforms.length>0&&await h(`gh`,[`workflow`,`view`,e.workflowName,`--ref`,e.workflowRef??await H()],{stdin:`ignore`}),await h(`b2`,[`version`],{stdin:`ignore`})}function w(e,t=`src-tauri/tauri.conf.json`){let n=JSON.parse(e).identifier;if(typeof n!=`string`||n===`com.example`||n.startsWith(`com.example.`))throw Error(`${t} must use an organization-owned reverse-domain identifier before building release artifacts.`);return n}async function T(e,t,n=process.cwd()){if(!e.enabled)return{files:[]};let r=d(n,`src-tauri/tauri.conf.json`),i=d(n,`src-tauri/Cargo.toml`),o=d(n,`src-tauri/Cargo.lock`),s=await a(r,`utf8`),l=await a(i,`utf8`),u=z(l,i),f=[{path:r,source:s},{path:i,source:l}],p=[],m=JSON.parse(s);if(m.version=t,m.bundle={...m.bundle??{},createUpdaterArtifacts:!0},p.push({path:r,source:`${JSON.stringify(m,null,2)}\n`}),p.push({path:i,source:B(l,u,t,i)}),await Z(o)){let e=await a(o,`utf8`);f.push({path:o,source:e}),p.push({path:o,source:V(e,u,t,o)})}for(let e of p)await c(e.path,e.source);return{files:f}}async function E(e){for(let t of e.files)await c(t.path,t.source)}async function D({env:e,plan:t,releaseName:n,version:r}){if(!t.enabled)return;await U(t.artifactDownloadDir),await U(t.releaseUploadDir);let i=t.workflowPlatforms.length>0?await j({plan:t,releaseName:n,version:r}):void 0;for(let n of t.localPlatforms)await P(n,t,e);if(i){let e=await M(t,i.runNameMarker);await h(`gh`,[`run`,`download`,String(e),`--dir`,t.artifactDownloadDir],{stdio:`inherit`})}return A({plan:t,version:r})}async function O(e,t){await h(`b2`,[`account`,`authorize`,e.b2ApplicationKeyId,e.b2ApplicationKey],{stdin:`ignore`});let n=(await v(`**/*`,{cwd:t.uploadDir,onlyFiles:!0})).sort((e,n)=>e===t.manifestPath?1:n===t.manifestPath?-1:e.localeCompare(n));for(let r of n)await h(`b2`,[`file`,`upload`,e.b2Bucket,d(t.uploadDir,r),r],{stdin:`ignore`}),console.log(`Uploaded ${r}`)}function k({artifacts:e,notes:t,pubDate:n=new Date,version:r}){return{...t?{notes:t}:{},platforms:Object.fromEntries(e.map(e=>[e.updatePlatform,{signature:e.signature,url:e.url}])),pub_date:n.toISOString(),version:r}}async function A({plan:e,version:t}){let n=q(e.publicPathPrefix,G(e.releasePath,t)),o=q(e.publicPathPrefix,e.latestManifestPath),s=[...e.localPlatforms,...e.workflowPlatforms],f=[];for(let o of s){let s=e.platform[o],c=e.localPlatforms.includes(o)?`.`:d(e.artifactDownloadDir,`tauri-${o}-${t}`),p=await F({globs:e.localPlatforms.includes(o)?s.artifactGlobs:[`**/*.sig`],sourceRoot:c,version:t}),m=q(n,s.updatePlatform),h=q(m,l(p.artifactPath)),g=q(m,l(p.signaturePath)),_=d(e.releaseUploadDir,...h.split(`/`)),v=d(e.releaseUploadDir,...g.split(`/`)),y=(await a(p.signaturePath,`utf8`)).trim();await i(u(_),{recursive:!0}),await r(p.artifactPath,_),await r(p.signaturePath,v),f.push({signature:y,updatePlatform:s.updatePlatform,url:K(e.publicBaseUrl,h)})}let p=k({artifacts:f,notes:e.releaseNotesPath?await a(e.releaseNotesPath,`utf8`):void 0,version:t}),m=d(e.releaseUploadDir,...o.split(`/`));return await i(u(m),{recursive:!0}),await c(m,`${JSON.stringify(p,null,2)}\n`),{manifestPath:o,uploadDir:e.releaseUploadDir}}async function j({plan:n,releaseName:r,version:i}){let a=n.workflowRef??await H(),o=`coreframe-${Date.now()}-${t().slice(0,8)}`;return await h(`gh`,[`workflow`,`run`,n.workflowName,`--ref`,a,`-f`,`release_name=${r}`,`-f`,`run_id=${o}`,`-f`,`version=${i}`,...e.flatMap(e=>[`-f`,`${e}=${n.workflowPlatforms.includes(e)?`true`:`false`}`])],{stdin:`ignore`}),{runNameMarker:o}}async function M(e,t){let n=Date.now()+e.workflowTimeoutMs;for(;Date.now()<n;){let n=await N(e,t);if(n?.status===`completed`){if(n.conclusion===`success`)return n.databaseId;throw Error(`Tauri release workflow ${n.databaseId} finished with ${n.conclusion}.`)}await _(e.workflowPollIntervalMs)}throw Error(`Timed out waiting for Tauri release workflow after ${Math.round(e.workflowTimeoutMs/6e4)} minutes.`)}async function N(e,t){let{stdout:n}=await h(`gh`,[`run`,`list`,`--workflow`,e.workflowName,`--event`,`workflow_dispatch`,`--json`,`conclusion,databaseId,displayTitle,status`,`--limit`,`50`],{stdin:`ignore`});return JSON.parse(n).find(e=>e.displayTitle.includes(t))}async function P(e,t,n){await h(`pnpm`,t.platform[e].buildArgs,{env:n,stdio:`inherit`})}async function F({globs:e,sourceRoot:t,version:n}){let r=await v(e,{cwd:t,absolute:!0,onlyFiles:!0}),i=[];for(let e of r){let t=e.replace(/\.sig$/u,``);await Q(t)&&i.push({artifactPath:t,signaturePath:e})}if(i.length===0)throw Error(`Could not find a Tauri updater artifact and .sig pair under ${t}.`);return i.sort((e,t)=>{let r=I(e.artifactPath,n);return I(t.artifactPath,n)-r||e.artifactPath.localeCompare(t.artifactPath)})[0]}function I(e,t){let n=0;return e.includes(t)&&(n+=100),/\.(app\.tar\.gz|AppImage\.tar\.gz|zip)$/u.test(e)&&(n+=10),/\.(exe|msi|dmg|AppImage|deb|rpm|apk|aab|ipa)$/u.test(e)&&(n+=5),n}function L(t={},n){return Object.fromEntries(e.map(e=>{let r=t[e]??{},i={...y[e],...r},a=n[`TAURI_RELEASE_${e.toUpperCase()}_TARGET_TRIPLE`],o=n[`TAURI_RELEASE_${e.toUpperCase()}_UPDATE_PLATFORM`],s=a??i.targetTriple,c=r.buildArgs?r.buildArgs:R(e,s);return[e,{...i,artifactGlobs:i.artifactGlobs??y[e].artifactGlobs,buildArgs:c,targetTriple:s,updatePlatform:o??i.updatePlatform}]}))}function R(e,t){return e===`android`?[`tauri`,`android`,`build`,`--target`,t]:e===`ios`?[`tauri`,`ios`,`build`,`--target`,t]:[`tauri`,`build`,`--target`,t,`--`,`--locked`]}function z(e,t){let n=/^\[package\][\s\S]*?^name = "(?<name>[^"]+)"/mu.exec(e);if(!n?.groups?.name)throw Error(`${t} is missing a [package] name.`);return n.groups.name}function B(e,t,n,r){let i=RegExp(`(^\\[package\\][\\s\\S]*?^name = "${$(t)}"[\\s\\S]*?^version = ")[^"]+(")`,`mu`),a=e.replace(i,`$1${n}$2`);if(a===e)throw Error(`${r} is missing a package version for ${t}.`);return a}function V(e,t,n,r){let i=RegExp(`(\\[\\[package\\]\\]\\nname = "${$(t)}"\\nversion = ")[^"]+(")`,`u`),a=e.replace(i,`$1${n}$2`);if(a===e)throw Error(`${r} is missing a package lock entry for ${t}.`);return a}async function H(){let{stdout:e}=await h(`git`,[`rev-parse`,`--abbrev-ref`,`HEAD`],{stdin:`ignore`}),t=e.trim();if(t!==`HEAD`)return t;let{stdout:n}=await h(`git`,[`rev-parse`,`HEAD`],{stdin:`ignore`});return n.trim()}async function U(e){W(e),await o(e,{force:!0,recursive:!0}),await i(e,{recursive:!0})}function W(e){let t=p(e),n=f(process.cwd(),t).split(m).join(`/`);if(n===``||n===`.`||n.startsWith(`../`)||n===`src-tauri`||n.startsWith(`src-tauri/`)||n===`tauri`||n.startsWith(`tauri/`))throw Error(`Refusing to reset unsafe Tauri release directory: ${e}`)}function G(e,t){return e.replaceAll("${version}",t)}function K(e,t){let n=new URL(e),r=q(n.pathname.replace(/\/+$/u,``),t);return n.pathname=r.startsWith(`/`)?r:`/${r}`,n.toString()}function q(...e){return e.flatMap(e=>e.split(`/`)).map(e=>e.trim()).filter(Boolean).join(`/`)}function J(e,t){if(!e)return 0;let n=Number(e);if(!Number.isInteger(n)||n<=0)throw Error(`${t} must be a positive integer.`);return n}function Y(e){return[...new Set(e)]}function X(t){return e.includes(t)}async function Z(e){try{return await n(e,g.F_OK),!0}catch{return!1}}async function Q(e){try{return(await s(e)).isFile()}catch{return!1}}function $(e){return e.replace(/[.*+?^${}()|[\]\\]/gu,`\\$&`)}export{A as createTauriReleaseUpload,k as createTauriUpdateManifest,x as parseTauriReleasePlatform,b as parseTauriReleasePlatformList,D as prepareTauriRelease,S as resolveTauriReleasePlan,E as restoreTauriReleaseMetadata,O as uploadTauriReleaseToB2,w as validateTauriReleaseIdentifier,C as validateTauriReleasePlan,T as writeTauriReleaseMetadata};
@@ -1,24 +0,0 @@
1
- import { DeployEnvironment } from "./config.js";
2
-
3
- //#region deploy/version.d.ts
4
- type PackageJson = {
5
- name?: string;
6
- version?: string;
7
- [key: string]: unknown;
8
- };
9
- type ReleasePackageJson = PackageJson & {
10
- name: string;
11
- version: string;
12
- };
13
- declare function nextReleaseVersion(currentVersion: string, now?: Date): string;
14
- declare function releaseName(packageName: string, version: string): string;
15
- declare function stagingReleaseVersion(currentVersion: string, revision: string): string;
16
- declare function resolveReleaseVersion(environment: DeployEnvironment, currentVersion: string, revision: string, now?: Date): string;
17
- declare function formatReleaseDate(date: Date): string;
18
- declare function readPackageJson(path?: string): Promise<{
19
- packageJson: ReleasePackageJson;
20
- source: string;
21
- }>;
22
- declare function writePackageVersion(path: string, packageJson: PackageJson, version: string): Promise<void>;
23
- //#endregion
24
- export { formatReleaseDate, nextReleaseVersion, readPackageJson, releaseName, resolveReleaseVersion, stagingReleaseVersion, writePackageVersion };
@@ -1 +0,0 @@
1
- import{readFile as e,writeFile as t}from"node:fs/promises";function n(e,t=new Date){let n=l(e),r=o(t),i=n.minor===r?n.patch+1:0;return`${n.major}.${r}.${i}`}function r(e,t){return`${e}@${t}`}function i(e,t){return`${e}-staging.${t}`}function a(e,t,r,a=new Date){return e===`production`?n(t,a):i(t,r)}function o(e){return`${String(e.getFullYear())}${String(e.getMonth()+1).padStart(2,`0`)}${String(e.getDate()).padStart(2,`0`)}`}async function s(t=`package.json`){let n=await e(t,`utf8`),r=JSON.parse(n);if(!r.name)throw Error(`${t} is missing a package name.`);if(!r.version)throw Error(`${t} is missing a package version.`);return{packageJson:r,source:n}}async function c(e,n,r){await t(e,`${JSON.stringify({...n,version:r},null,2)}\n`)}function l(e){let t=/^(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)$/u.exec(e);if(!t?.groups)throw Error(`Invalid package version "${e}". Expected major.minor.patch.`);return{major:Number(t.groups.major),minor:t.groups.minor,patch:Number(t.groups.patch)}}export{o as formatReleaseDate,n as nextReleaseVersion,s as readPackageJson,r as releaseName,a as resolveReleaseVersion,i as stagingReleaseVersion,c as writePackageVersion};