devsess 0.3.3 → 0.3.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.
@@ -38,11 +38,10 @@ export declare const openLitePglite: (opts: PgliteMigrations & {
38
38
  * Prepares a PGlite database scoped to a dev session: the data dir lives at
39
39
  * `<session>/pglite` and the migration dump at `<session>/pglite.dump`. Builds
40
40
  * the dump from `migrationsFolder` if missing, hydrates the client, and runs
41
- * pending migrations. Returns the open client plus the resolved paths so the
42
- * caller can pass them to the app (e.g. as `DATABASE_LITE_PATH`).
41
+ * pending migrations. Closes the client before returning paths for another
42
+ * process (e.g. `DATABASE_LITE_PATH`). Use `openLitePglite` for an in-process client.
43
43
  */
44
44
  export declare const prepareSessionPglite: (session: DevSession, opts: PgliteMigrations) => Effect.Effect<{
45
- client: PGlite;
46
45
  dataDir: string;
47
46
  dumpPath: string;
48
47
  }, PgliteError | import("effect/PlatformError").PlatformError, FileSystem | Path>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pglite/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAG9C,OAAO,EAAQ,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;;;;AAElD,qBAAa,WAAY,SAAQ,iBAAgC;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;CAAG;AAQL,MAAM,MAAM,gBAAgB,GAAG;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAwBF,eAAO,MAAM,oBAAoB,SAAU;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CACjB,kGAsBE,CAAC;AAeJ,eAAO,MAAM,gBAAgB,WAAY,MAAM,QAAQ,MAAM,uGAuB1D,CAAC;AAEJ,eAAO,MAAM,aAAa,WAAY,MAAM,cAAc,gBAAgB,4CAavE,CAAC;AAYJ,eAAO,MAAM,mBAAmB,WACvB,MAAM,eACD,IAAI,CAAC,gBAAgB,EAAE,iBAAiB,GAAG,kBAAkB,CAAC,8CA4DzE,CAAC;AAEJ,eAAO,MAAM,yBAAyB,qBAAsB,MAAM,yGA8B/D,CAAC;AAEJ,eAAO,MAAM,eAAe,SACrB,gBAAgB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,uGAO3C,CAAC;AAEJ,eAAO,MAAM,gBAAgB,SACtB,gBAAgB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,uGAQ3C,CAAC;AAEJ,eAAO,MAAM,cAAc,SACpB,gBAAgB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,yGAwB5D,CAAC;AAEJ;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,YACvB,UAAU,QACb,gBAAgB;;;;iFAWpB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pglite/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAG9C,OAAO,EAAQ,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;;;;AAElD,qBAAa,WAAY,SAAQ,iBAAgC;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;CAAG;AAQL,MAAM,MAAM,gBAAgB,GAAG;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAwBF,eAAO,MAAM,oBAAoB,SAAU;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CACjB,kGAsBE,CAAC;AAeJ,eAAO,MAAM,gBAAgB,WAAY,MAAM,QAAQ,MAAM,uGAuB1D,CAAC;AAEJ,eAAO,MAAM,aAAa,WAAY,MAAM,cAAc,gBAAgB,4CAavE,CAAC;AAYJ,eAAO,MAAM,mBAAmB,WACvB,MAAM,eACD,IAAI,CAAC,gBAAgB,EAAE,iBAAiB,GAAG,kBAAkB,CAAC,8CA4DzE,CAAC;AAEJ,eAAO,MAAM,yBAAyB,qBAAsB,MAAM,yGA8B/D,CAAC;AAEJ,eAAO,MAAM,eAAe,SACrB,gBAAgB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,uGAO3C,CAAC;AAEJ,eAAO,MAAM,gBAAgB,SACtB,gBAAgB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,uGAQ3C,CAAC;AAEJ,eAAO,MAAM,cAAc,SACpB,gBAAgB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,yGAwB5D,CAAC;AAEJ;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,YACvB,UAAU,QACb,gBAAgB;;;iFAYpB,CAAC"}
@@ -201,7 +201,8 @@ var prepareSessionPglite = (session, opts) => Effect.gen(function* () {
201
201
  dataDir,
202
202
  dumpPath
203
203
  });
204
- return { client, dataDir, dumpPath };
204
+ yield* closePglite(client);
205
+ return { dataDir, dumpPath };
205
206
  });
206
207
  export {
207
208
  PgliteError,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/pglite/index.ts"],"sourcesContent":["import { PGlite } from '@electric-sql/pglite';\nimport { drizzle } from 'drizzle-orm/pglite';\nimport { migrate } from 'drizzle-orm/pglite/migrator';\nimport { Data, Effect } from 'effect';\nimport { FileSystem } from 'effect/FileSystem';\nimport { Path } from 'effect/Path';\nimport type { DevSession } from '../dev-sessions';\n\nexport class PgliteError extends Data.TaggedError('PgliteError')<{\n\tmessage: string;\n\tcause?: unknown;\n}> {}\n\nconst IN_MEMORY_DATA_DIR = 'memory://';\n\n/** Drizzle's own defaults, used whenever a caller doesn't override them. */\nconst DEFAULT_MIGRATIONS_TABLE = '__drizzle_migrations';\nconst DEFAULT_MIGRATIONS_SCHEMA = 'drizzle';\n\nexport type PgliteMigrations = {\n\tmigrationsFolder: string;\n\tmigrationsTable?: string;\n\tmigrationsSchema?: string;\n};\n\n/** Double-quotes an identifier part for safe interpolation into SQL. */\nconst quoteIdentifierPart = (part: string) => `\"${part.replaceAll('\"', '\"\"')}\"`;\n\nconst qualifiedMigrationsTable = (\n\tmigrations: Pick<PgliteMigrations, 'migrationsTable' | 'migrationsSchema'>,\n) =>\n\t`${quoteIdentifierPart(migrations.migrationsSchema ?? DEFAULT_MIGRATIONS_SCHEMA)}.${quoteIdentifierPart(migrations.migrationsTable ?? DEFAULT_MIGRATIONS_TABLE)}`;\n\n/**\n * A persisted data dir that already exists holds a hydrated database, so it is\n * opened as-is rather than re-seeded from the dump. In-memory clients have\n * nothing to reuse.\n */\nconst shouldReuseExistingDatabase = (dataDir: string | undefined) =>\n\tEffect.gen(function* () {\n\t\tif (!dataDir || dataDir === IN_MEMORY_DATA_DIR) {\n\t\t\treturn false;\n\t\t}\n\t\tconst fs = yield* FileSystem;\n\t\treturn yield* fs.exists(dataDir);\n\t});\n\nexport const createPgliteFromDump = (opts: {\n\tdataDir?: string;\n\tdumpPath: string;\n}) =>\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem;\n\n\t\tif (yield* shouldReuseExistingDatabase(opts.dataDir)) {\n\t\t\treturn new PGlite(opts.dataDir);\n\t\t}\n\n\t\tif (!(yield* fs.exists(opts.dumpPath))) {\n\t\t\treturn yield* new PgliteError({\n\t\t\t\tmessage: `Dump file not found at ${opts.dumpPath}`,\n\t\t\t});\n\t\t}\n\n\t\tconst buffer = yield* fs.readFile(opts.dumpPath);\n\t\tconst file = new Blob([new Uint8Array(buffer)]);\n\n\t\tconst client = new PGlite(opts.dataDir, {\n\t\t\tloadDataDir: file,\n\t\t});\n\n\t\treturn client;\n\t});\n\nconst toUint8Array = (input: File | Blob) =>\n\tEffect.gen(function* () {\n\t\tconst buf = yield* Effect.tryPromise({\n\t\t\ttry: () => input.arrayBuffer(),\n\t\t\tcatch: (error) =>\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage: 'Failed to convert dump to Uint8Array',\n\t\t\t\t\tcause: error,\n\t\t\t\t}),\n\t\t});\n\t\treturn new Uint8Array(buf);\n\t});\n\nexport const dumpPgliteToFile = (client: PGlite, dest: string) =>\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem;\n\t\tconst path = yield* Path;\n\n\t\tconst destDir = path.dirname(dest);\n\t\tconst dirExists = yield* fs.exists(destDir);\n\n\t\tif (!dirExists) {\n\t\t\tyield* fs.makeDirectory(destDir, { recursive: true });\n\t\t}\n\n\t\tconst dump = yield* Effect.tryPromise({\n\t\t\ttry: () => client.dumpDataDir(),\n\t\t\tcatch: (error) =>\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage: 'Failed to dump PGlite database',\n\t\t\t\t\tcause: error,\n\t\t\t\t}),\n\t\t});\n\n\t\tconst data = yield* toUint8Array(dump);\n\t\tyield* fs.writeFile(dest, data);\n\t});\n\nexport const migratePglite = (client: PGlite, migrations: PgliteMigrations) =>\n\tEffect.tryPromise({\n\t\ttry: () =>\n\t\t\tmigrate(drizzle(client), {\n\t\t\t\tmigrationsFolder: migrations.migrationsFolder,\n\t\t\t\tmigrationsTable: migrations.migrationsTable,\n\t\t\t\tmigrationsSchema: migrations.migrationsSchema,\n\t\t\t}),\n\t\tcatch: (error) =>\n\t\t\tnew PgliteError({\n\t\t\t\tmessage: `Failed to migrate pglite from ${migrations.migrationsFolder}`,\n\t\t\t\tcause: error,\n\t\t\t}),\n\t});\n\nconst closePglite = (client: PGlite) =>\n\tEffect.tryPromise({\n\t\ttry: () => client.close(),\n\t\tcatch: (error) =>\n\t\t\tnew PgliteError({\n\t\t\t\tmessage: 'Failed to close PGlite client',\n\t\t\t\tcause: error,\n\t\t\t}),\n\t});\n\nexport const getDbMigrationCount = (\n\tclient: PGlite,\n\tmigrations?: Pick<PgliteMigrations, 'migrationsTable' | 'migrationsSchema'>,\n) =>\n\tEffect.gen(function* () {\n\t\tconst qualifiedTable = qualifiedMigrationsTable(migrations ?? {});\n\n\t\tyield* Effect.tryPromise({\n\t\t\ttry: () => client.waitReady,\n\t\t\tcatch: (error) =>\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage: 'Failed to wait for PGlite ready',\n\t\t\t\t\tcause: error,\n\t\t\t\t}),\n\t\t});\n\n\t\tconst existsResult = yield* Effect.tryPromise({\n\t\t\ttry: () =>\n\t\t\t\tclient.query<{ exists: boolean }>(\n\t\t\t\t\t'SELECT to_regclass($1) IS NOT NULL AS \"exists\"',\n\t\t\t\t\t[qualifiedTable],\n\t\t\t\t),\n\t\t\tcatch: (error) =>\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage: 'Failed to check drizzle migrations table',\n\t\t\t\t\tcause: error,\n\t\t\t\t}),\n\t\t});\n\n\t\tconst existsRow = existsResult.rows[0];\n\t\tif (!existsRow) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage: 'Missing row from drizzle migrations existence check',\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tif (!existsRow.exists) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst countResult = yield* Effect.tryPromise({\n\t\t\ttry: () =>\n\t\t\t\tclient.query<{ c: number }>(\n\t\t\t\t\t`SELECT count(*)::int AS c FROM ${qualifiedTable}`,\n\t\t\t\t),\n\t\t\tcatch: (error) =>\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage: 'Failed to count drizzle migrations',\n\t\t\t\t\tcause: error,\n\t\t\t\t}),\n\t\t});\n\n\t\tconst countRow = countResult.rows[0];\n\t\tif (!countRow) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage: 'Missing row from drizzle migrations count query',\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\treturn countRow.c;\n\t});\n\nexport const getExpectedMigrationCount = (migrationsFolder: string) =>\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem;\n\t\tconst path = yield* Path;\n\t\tconst journalPath = path.join(migrationsFolder, 'meta/_journal.json');\n\t\tconst journalExists = yield* fs.exists(journalPath);\n\t\tif (!journalExists) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage: `Migration journal not found at ${journalPath}`,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tconst content = yield* fs.readFileString(journalPath);\n\t\tconst journal = yield* Effect.try({\n\t\t\ttry: () => JSON.parse(content) as { entries: unknown[] },\n\t\t\tcatch: (cause) =>\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage: `Failed to parse migration journal at ${journalPath}`,\n\t\t\t\t\tcause,\n\t\t\t\t}),\n\t\t});\n\t\tif (!Array.isArray(journal.entries)) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage: `Migration journal at ${journalPath} is missing an \"entries\" array`,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\treturn journal.entries.length;\n\t});\n\nexport const buildPgliteDump = (\n\topts: PgliteMigrations & { dumpPath: string },\n) =>\n\tEffect.gen(function* () {\n\t\tconst client = new PGlite(IN_MEMORY_DATA_DIR);\n\t\tyield* migratePglite(client, opts);\n\t\tyield* dumpPgliteToFile(client, opts.dumpPath);\n\t\tyield* closePglite(client);\n\t});\n\nexport const ensurePgliteDump = (\n\topts: PgliteMigrations & { dumpPath: string },\n) =>\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem;\n\t\tconst dumpExists = yield* fs.exists(opts.dumpPath);\n\t\tif (!dumpExists) {\n\t\t\tyield* buildPgliteDump(opts);\n\t\t}\n\t});\n\nexport const openLitePglite = (\n\topts: PgliteMigrations & { dataDir: string; dumpPath: string },\n) =>\n\tEffect.gen(function* () {\n\t\tyield* ensurePgliteDump(opts);\n\t\tconst client = yield* createPgliteFromDump({\n\t\t\tdataDir: opts.dataDir,\n\t\t\tdumpPath: opts.dumpPath,\n\t\t});\n\t\tconst expected = yield* getExpectedMigrationCount(opts.migrationsFolder);\n\t\tconst actual = yield* getDbMigrationCount(client, opts);\n\t\t/** Schema is present but nothing is journaled — it predates journaled migrations. */\n\t\tconst predatesMigrationJournal = expected > 0 && actual === 0;\n\t\tif (predatesMigrationJournal) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`Stale local pglite at ${opts.dataDir} (schema present, no migration journal) — ` +\n\t\t\t\t\t\t'it was built by an older scheme. Remove it and the dump, then restart:\\n' +\n\t\t\t\t\t\t` rm -rf ${opts.dataDir} ${opts.dumpPath}`,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tyield* migratePglite(client, opts);\n\t\treturn client;\n\t});\n\n/**\n * Prepares a PGlite database scoped to a dev session: the data dir lives at\n * `<session>/pglite` and the migration dump at `<session>/pglite.dump`. Builds\n * the dump from `migrationsFolder` if missing, hydrates the client, and runs\n * pending migrations. Returns the open client plus the resolved paths so the\n * caller can pass them to the app (e.g. as `DATABASE_LITE_PATH`).\n */\nexport const prepareSessionPglite = (\n\tsession: DevSession,\n\topts: PgliteMigrations,\n) =>\n\tEffect.gen(function* () {\n\t\tconst dataDir = yield* session.path('pglite');\n\t\tconst dumpPath = yield* session.path('pglite.dump');\n\t\tconst client = yield* openLitePglite({\n\t\t\t...opts,\n\t\t\tdataDir,\n\t\t\tdumpPath,\n\t\t});\n\t\treturn { client, dataDir, dumpPath };\n\t});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/pglite/index.ts"],"sourcesContent":["import { PGlite } from '@electric-sql/pglite';\nimport { drizzle } from 'drizzle-orm/pglite';\nimport { migrate } from 'drizzle-orm/pglite/migrator';\nimport { Data, Effect } from 'effect';\nimport { FileSystem } from 'effect/FileSystem';\nimport { Path } from 'effect/Path';\nimport type { DevSession } from '../dev-sessions';\n\nexport class PgliteError extends Data.TaggedError('PgliteError')<{\n\tmessage: string;\n\tcause?: unknown;\n}> {}\n\nconst IN_MEMORY_DATA_DIR = 'memory://';\n\n/** Drizzle's own defaults, used whenever a caller doesn't override them. */\nconst DEFAULT_MIGRATIONS_TABLE = '__drizzle_migrations';\nconst DEFAULT_MIGRATIONS_SCHEMA = 'drizzle';\n\nexport type PgliteMigrations = {\n\tmigrationsFolder: string;\n\tmigrationsTable?: string;\n\tmigrationsSchema?: string;\n};\n\n/** Double-quotes an identifier part for safe interpolation into SQL. */\nconst quoteIdentifierPart = (part: string) => `\"${part.replaceAll('\"', '\"\"')}\"`;\n\nconst qualifiedMigrationsTable = (\n\tmigrations: Pick<PgliteMigrations, 'migrationsTable' | 'migrationsSchema'>,\n) =>\n\t`${quoteIdentifierPart(migrations.migrationsSchema ?? DEFAULT_MIGRATIONS_SCHEMA)}.${quoteIdentifierPart(migrations.migrationsTable ?? DEFAULT_MIGRATIONS_TABLE)}`;\n\n/**\n * A persisted data dir that already exists holds a hydrated database, so it is\n * opened as-is rather than re-seeded from the dump. In-memory clients have\n * nothing to reuse.\n */\nconst shouldReuseExistingDatabase = (dataDir: string | undefined) =>\n\tEffect.gen(function* () {\n\t\tif (!dataDir || dataDir === IN_MEMORY_DATA_DIR) {\n\t\t\treturn false;\n\t\t}\n\t\tconst fs = yield* FileSystem;\n\t\treturn yield* fs.exists(dataDir);\n\t});\n\nexport const createPgliteFromDump = (opts: {\n\tdataDir?: string;\n\tdumpPath: string;\n}) =>\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem;\n\n\t\tif (yield* shouldReuseExistingDatabase(opts.dataDir)) {\n\t\t\treturn new PGlite(opts.dataDir);\n\t\t}\n\n\t\tif (!(yield* fs.exists(opts.dumpPath))) {\n\t\t\treturn yield* new PgliteError({\n\t\t\t\tmessage: `Dump file not found at ${opts.dumpPath}`,\n\t\t\t});\n\t\t}\n\n\t\tconst buffer = yield* fs.readFile(opts.dumpPath);\n\t\tconst file = new Blob([new Uint8Array(buffer)]);\n\n\t\tconst client = new PGlite(opts.dataDir, {\n\t\t\tloadDataDir: file,\n\t\t});\n\n\t\treturn client;\n\t});\n\nconst toUint8Array = (input: File | Blob) =>\n\tEffect.gen(function* () {\n\t\tconst buf = yield* Effect.tryPromise({\n\t\t\ttry: () => input.arrayBuffer(),\n\t\t\tcatch: (error) =>\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage: 'Failed to convert dump to Uint8Array',\n\t\t\t\t\tcause: error,\n\t\t\t\t}),\n\t\t});\n\t\treturn new Uint8Array(buf);\n\t});\n\nexport const dumpPgliteToFile = (client: PGlite, dest: string) =>\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem;\n\t\tconst path = yield* Path;\n\n\t\tconst destDir = path.dirname(dest);\n\t\tconst dirExists = yield* fs.exists(destDir);\n\n\t\tif (!dirExists) {\n\t\t\tyield* fs.makeDirectory(destDir, { recursive: true });\n\t\t}\n\n\t\tconst dump = yield* Effect.tryPromise({\n\t\t\ttry: () => client.dumpDataDir(),\n\t\t\tcatch: (error) =>\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage: 'Failed to dump PGlite database',\n\t\t\t\t\tcause: error,\n\t\t\t\t}),\n\t\t});\n\n\t\tconst data = yield* toUint8Array(dump);\n\t\tyield* fs.writeFile(dest, data);\n\t});\n\nexport const migratePglite = (client: PGlite, migrations: PgliteMigrations) =>\n\tEffect.tryPromise({\n\t\ttry: () =>\n\t\t\tmigrate(drizzle(client), {\n\t\t\t\tmigrationsFolder: migrations.migrationsFolder,\n\t\t\t\tmigrationsTable: migrations.migrationsTable,\n\t\t\t\tmigrationsSchema: migrations.migrationsSchema,\n\t\t\t}),\n\t\tcatch: (error) =>\n\t\t\tnew PgliteError({\n\t\t\t\tmessage: `Failed to migrate pglite from ${migrations.migrationsFolder}`,\n\t\t\t\tcause: error,\n\t\t\t}),\n\t});\n\nconst closePglite = (client: PGlite) =>\n\tEffect.tryPromise({\n\t\ttry: () => client.close(),\n\t\tcatch: (error) =>\n\t\t\tnew PgliteError({\n\t\t\t\tmessage: 'Failed to close PGlite client',\n\t\t\t\tcause: error,\n\t\t\t}),\n\t});\n\nexport const getDbMigrationCount = (\n\tclient: PGlite,\n\tmigrations?: Pick<PgliteMigrations, 'migrationsTable' | 'migrationsSchema'>,\n) =>\n\tEffect.gen(function* () {\n\t\tconst qualifiedTable = qualifiedMigrationsTable(migrations ?? {});\n\n\t\tyield* Effect.tryPromise({\n\t\t\ttry: () => client.waitReady,\n\t\t\tcatch: (error) =>\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage: 'Failed to wait for PGlite ready',\n\t\t\t\t\tcause: error,\n\t\t\t\t}),\n\t\t});\n\n\t\tconst existsResult = yield* Effect.tryPromise({\n\t\t\ttry: () =>\n\t\t\t\tclient.query<{ exists: boolean }>(\n\t\t\t\t\t'SELECT to_regclass($1) IS NOT NULL AS \"exists\"',\n\t\t\t\t\t[qualifiedTable],\n\t\t\t\t),\n\t\t\tcatch: (error) =>\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage: 'Failed to check drizzle migrations table',\n\t\t\t\t\tcause: error,\n\t\t\t\t}),\n\t\t});\n\n\t\tconst existsRow = existsResult.rows[0];\n\t\tif (!existsRow) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage: 'Missing row from drizzle migrations existence check',\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tif (!existsRow.exists) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst countResult = yield* Effect.tryPromise({\n\t\t\ttry: () =>\n\t\t\t\tclient.query<{ c: number }>(\n\t\t\t\t\t`SELECT count(*)::int AS c FROM ${qualifiedTable}`,\n\t\t\t\t),\n\t\t\tcatch: (error) =>\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage: 'Failed to count drizzle migrations',\n\t\t\t\t\tcause: error,\n\t\t\t\t}),\n\t\t});\n\n\t\tconst countRow = countResult.rows[0];\n\t\tif (!countRow) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage: 'Missing row from drizzle migrations count query',\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\treturn countRow.c;\n\t});\n\nexport const getExpectedMigrationCount = (migrationsFolder: string) =>\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem;\n\t\tconst path = yield* Path;\n\t\tconst journalPath = path.join(migrationsFolder, 'meta/_journal.json');\n\t\tconst journalExists = yield* fs.exists(journalPath);\n\t\tif (!journalExists) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage: `Migration journal not found at ${journalPath}`,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tconst content = yield* fs.readFileString(journalPath);\n\t\tconst journal = yield* Effect.try({\n\t\t\ttry: () => JSON.parse(content) as { entries: unknown[] },\n\t\t\tcatch: (cause) =>\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage: `Failed to parse migration journal at ${journalPath}`,\n\t\t\t\t\tcause,\n\t\t\t\t}),\n\t\t});\n\t\tif (!Array.isArray(journal.entries)) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage: `Migration journal at ${journalPath} is missing an \"entries\" array`,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\treturn journal.entries.length;\n\t});\n\nexport const buildPgliteDump = (\n\topts: PgliteMigrations & { dumpPath: string },\n) =>\n\tEffect.gen(function* () {\n\t\tconst client = new PGlite(IN_MEMORY_DATA_DIR);\n\t\tyield* migratePglite(client, opts);\n\t\tyield* dumpPgliteToFile(client, opts.dumpPath);\n\t\tyield* closePglite(client);\n\t});\n\nexport const ensurePgliteDump = (\n\topts: PgliteMigrations & { dumpPath: string },\n) =>\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem;\n\t\tconst dumpExists = yield* fs.exists(opts.dumpPath);\n\t\tif (!dumpExists) {\n\t\t\tyield* buildPgliteDump(opts);\n\t\t}\n\t});\n\nexport const openLitePglite = (\n\topts: PgliteMigrations & { dataDir: string; dumpPath: string },\n) =>\n\tEffect.gen(function* () {\n\t\tyield* ensurePgliteDump(opts);\n\t\tconst client = yield* createPgliteFromDump({\n\t\t\tdataDir: opts.dataDir,\n\t\t\tdumpPath: opts.dumpPath,\n\t\t});\n\t\tconst expected = yield* getExpectedMigrationCount(opts.migrationsFolder);\n\t\tconst actual = yield* getDbMigrationCount(client, opts);\n\t\t/** Schema is present but nothing is journaled — it predates journaled migrations. */\n\t\tconst predatesMigrationJournal = expected > 0 && actual === 0;\n\t\tif (predatesMigrationJournal) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew PgliteError({\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`Stale local pglite at ${opts.dataDir} (schema present, no migration journal) — ` +\n\t\t\t\t\t\t'it was built by an older scheme. Remove it and the dump, then restart:\\n' +\n\t\t\t\t\t\t` rm -rf ${opts.dataDir} ${opts.dumpPath}`,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tyield* migratePglite(client, opts);\n\t\treturn client;\n\t});\n\n/**\n * Prepares a PGlite database scoped to a dev session: the data dir lives at\n * `<session>/pglite` and the migration dump at `<session>/pglite.dump`. Builds\n * the dump from `migrationsFolder` if missing, hydrates the client, and runs\n * pending migrations. Closes the client before returning paths for another\n * process (e.g. `DATABASE_LITE_PATH`). Use `openLitePglite` for an in-process client.\n */\nexport const prepareSessionPglite = (\n\tsession: DevSession,\n\topts: PgliteMigrations,\n) =>\n\tEffect.gen(function* () {\n\t\tconst dataDir = yield* session.path('pglite');\n\t\tconst dumpPath = yield* session.path('pglite.dump');\n\t\tconst client = yield* openLitePglite({\n\t\t\t...opts,\n\t\t\tdataDir,\n\t\t\tdumpPath,\n\t\t});\n\t\tyield* closePglite(client);\n\t\treturn { dataDir, dumpPath };\n\t});\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devsess",
3
- "version": "0.3.3",
3
+ "version": "0.3.4",
4
4
  "description": "Isolated, managed dev servers — each worktree gets its own session, with its own port and its own database",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/fdarian/devsess#readme",