{"version":3,"sources":["../../../../../src/orm/adapters/json/index.ts"],"sourcesContent":["import { open, readFile, rename, unlink, writeFile } from 'node:fs/promises'\n\nimport { v } from 'valleyed'\n\nimport { configurable } from '../../../utilities/configurable'\nimport type { FilterGroup } from '../../filter'\nimport type { DiscoveredSchema } from '../../migrations/introspection-types'\nimport type { AddFieldChange, AddForeignKeyChange, AddIndexChange, AnyFieldSpec, CreateTableChange, DropFieldChange, DropForeignKeyChange, DropIndexChange, DropTableChange, ModifyFieldChange, RenameFieldChange, RenameTableChange } from '../../migrations/types'\nimport { OrmAdapter, type AggregateSpec } from '../../orm-adapter'\nimport type { IterationQueryOptions, QueryOptions } from '../../query-options'\nimport type { AnySchema } from '../../schema'\nimport type { AnyUpdateOp } from '../../updates'\nimport { InMemoryAdapter, type InMemoryRepoConfig } from '../in-memory'\n\nexport type JsonAdapterConfig = InMemoryRepoConfig\n\nconst jsonConnectionPipe = () =>\n\tv.object({\n\t\tfilePath: v.string(),\n\t})\n\nexport class JsonAdapter extends configurable(jsonConnectionPipe, OrmAdapter) {\n\treadonly schemaConfigPipe = v.object({ table: v.string() })\n\n\treadonly #inMemory = InMemoryAdapter.create({})\n\n\treadonly supportedFieldTypes = this.#inMemory.supportedFieldTypes\n\treadonly queryableOps = this.#inMemory.queryableOps\n\treadonly updateOps = this.#inMemory.updateOps\n\treadonly aggregateOps = this.#inMemory.aggregateOps\n\n\t#writeQueue: Promise<void> = Promise.resolve()\n\n\tprotected constructor(config: typeof JsonAdapter.Config) {\n\t\tsuper(config)\n\t}\n\n\tget stores() {\n\t\treturn this.#inMemory.stores\n\t}\n\n\t#serialize(): string {\n\t\tconst obj: Record<string, unknown> = {}\n\n\t\tconst migrations = [...this.#inMemory.migrations.values()]\n\t\tif (migrations.length > 0) obj['__migrations'] = migrations\n\n\t\tconst tables: Record<string, unknown> = {}\n\t\tfor (const [name, meta] of this.#inMemory.tables.entries()) {\n\t\t\ttables[name] = { pk: meta.pk, fields: Object.fromEntries(meta.fields.entries()) }\n\t\t}\n\t\tif (Object.keys(tables).length > 0) obj['__tables'] = tables\n\n\t\tconst indexes: Record<string, unknown> = {}\n\t\tfor (const [name, meta] of this.#inMemory.indexes.entries()) {\n\t\t\tindexes[name] = { table: meta.table, on: [...meta.on], unique: meta.unique }\n\t\t}\n\t\tif (Object.keys(indexes).length > 0) obj['__indexes'] = indexes\n\n\t\tconst foreignKeys: Record<string, unknown> = {}\n\t\tfor (const [name, meta] of this.#inMemory.foreignKeys.entries()) {\n\t\t\tforeignKeys[name] = {\n\t\t\t\ttable: meta.table,\n\t\t\t\ton: meta.on,\n\t\t\t\treferences: meta.references,\n\t\t\t\t...(meta.onDelete ? { onDelete: meta.onDelete } : {}),\n\t\t\t\t...(meta.onUpdate ? { onUpdate: meta.onUpdate } : {}),\n\t\t\t}\n\t\t}\n\t\tif (Object.keys(foreignKeys).length > 0) obj['__foreignKeys'] = foreignKeys\n\n\t\tfor (const [name, store] of this.stores.entries()) {\n\t\t\tconst records: Record<string, Record<string, unknown>> = {}\n\t\t\tfor (const [pk, doc] of store.entries()) {\n\t\t\t\trecords[pk] = doc\n\t\t\t}\n\t\t\tobj[name] = records\n\t\t}\n\n\t\treturn JSON.stringify(obj)\n\t}\n\n\tasync #atomicWrite(): Promise<void> {\n\t\tconst data = this.#serialize()\n\t\tconst tmpPath = this.config.filePath + '.tmp.' + process.pid + '.' + Date.now()\n\t\tawait writeFile(tmpPath, data, 'utf-8')\n\t\tawait rename(tmpPath, this.config.filePath)\n\t}\n\n\t#persistToDisk(): Promise<void> {\n\t\tconst next = this.#writeQueue.then(() => this.#atomicWrite())\n\t\tthis.#writeQueue = next.catch(() => {})\n\t\treturn next\n\t}\n\n\tasync connect(): Promise<void> {\n\t\tlet raw: string\n\t\ttry {\n\t\t\traw = await readFile(this.config.filePath, 'utf-8')\n\t\t} catch {\n\t\t\treturn\n\t\t}\n\t\tconst data = JSON.parse(raw) as Record<string, unknown>\n\n\t\tthis.#inMemory.migrations.clear()\n\t\tif (Array.isArray(data['__migrations'])) {\n\t\t\tfor (const m of data['__migrations'] as Array<{ id: string; appliedAt: number }>) {\n\t\t\t\tthis.#inMemory.migrations.set(m.id, { id: m.id, appliedAt: m.appliedAt })\n\t\t\t}\n\t\t}\n\n\t\tthis.#inMemory.tables.clear()\n\t\tif (data['__tables'] && typeof data['__tables'] === 'object') {\n\t\t\tfor (const [name, meta] of Object.entries(data['__tables'] as Record<string, any>)) {\n\t\t\t\tconst fields = new Map<string, AnyFieldSpec>()\n\t\t\t\tif (meta.fields) {\n\t\t\t\t\tfor (const [fieldName, fspec] of Object.entries(meta.fields as Record<string, AnyFieldSpec>)) {\n\t\t\t\t\t\tfields.set(fieldName, fspec)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.#inMemory.tables.set(name, { pk: meta.pk, fields })\n\t\t\t}\n\t\t}\n\n\t\tthis.#inMemory.indexes.clear()\n\t\tif (data['__indexes'] && typeof data['__indexes'] === 'object') {\n\t\t\tfor (const [name, meta] of Object.entries(data['__indexes'] as Record<string, any>)) {\n\t\t\t\tthis.#inMemory.indexes.set(name, { table: meta.table, on: meta.on, unique: meta.unique })\n\t\t\t}\n\t\t}\n\n\t\tthis.#inMemory.foreignKeys.clear()\n\t\tif (data['__foreignKeys'] && typeof data['__foreignKeys'] === 'object') {\n\t\t\tfor (const [name, meta] of Object.entries(data['__foreignKeys'] as Record<string, any>)) {\n\t\t\t\tthis.#inMemory.foreignKeys.set(name, meta)\n\t\t\t}\n\t\t}\n\n\t\tthis.stores.clear()\n\t\tfor (const [name, records] of Object.entries(data)) {\n\t\t\tif (name.startsWith('__')) continue\n\t\t\tconst store = new Map<string, Record<string, unknown>>()\n\t\t\tfor (const [pk, doc] of Object.entries(records as Record<string, Record<string, unknown>>)) {\n\t\t\t\tstore.set(pk, doc)\n\t\t\t}\n\t\t\tthis.stores.set(name, store)\n\t\t}\n\t}\n\n\tasync disconnect(): Promise<void> {\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync findByPk(schema: AnySchema, config: unknown, pk: unknown) {\n\t\treturn this.#inMemory.findByPk(schema, config, pk)\n\t}\n\n\tasync createMany(schema: AnySchema, config: unknown, data: Record<string, unknown>[]) {\n\t\tconst result = await this.#inMemory.createMany(schema, config, data)\n\t\tawait this.#persistToDisk()\n\t\treturn result\n\t}\n\n\tasync updateByPk(schema: AnySchema, config: unknown, pk: unknown, ops: AnyUpdateOp[]) {\n\t\tconst result = await this.#inMemory.updateByPk(schema, config, pk, ops)\n\t\tif (result) await this.#persistToDisk()\n\t\treturn result\n\t}\n\n\tasync deleteByPk(schema: AnySchema, config: unknown, pk: unknown) {\n\t\tconst result = await this.#inMemory.deleteByPk(schema, config, pk)\n\t\tif (result) await this.#persistToDisk()\n\t\treturn result\n\t}\n\n\tasync findMany(schema: AnySchema, config: unknown, group: FilterGroup, options?: QueryOptions) {\n\t\treturn this.#inMemory.findMany(schema, config, group, options)\n\t}\n\n\tasync count(schema: AnySchema, config: unknown, group: FilterGroup) {\n\t\treturn this.#inMemory.count(schema, config, group)\n\t}\n\n\titerateMany(schema: AnySchema, config: unknown, group: FilterGroup, options?: IterationQueryOptions) {\n\t\treturn this.#inMemory.iterateMany(schema, config, group, options)\n\t}\n\n\tasync updateMany(schema: AnySchema, config: unknown, group: FilterGroup, data: Record<string, unknown>) {\n\t\tconst result = await this.#inMemory.updateMany(schema, config, group, data)\n\t\tif (result.length) await this.#persistToDisk()\n\t\treturn result\n\t}\n\n\tasync deleteMany(schema: AnySchema, config: unknown, filter: FilterGroup) {\n\t\tconst result = await this.#inMemory.deleteMany(schema, config, filter)\n\t\tif (result.length) await this.#persistToDisk()\n\t\treturn result\n\t}\n\n\tasync upsertOne(schema: AnySchema, config: unknown, filter: FilterGroup, create: Record<string, unknown>, ops: AnyUpdateOp[]) {\n\t\tconst result = await this.#inMemory.upsertOne(schema, config, filter, create, ops)\n\t\tawait this.#persistToDisk()\n\t\treturn result\n\t}\n\n\tasync aggregate(schema: AnySchema, config: unknown, spec: AggregateSpec) {\n\t\treturn this.#inMemory.aggregate(schema, config, spec)\n\t}\n\n\tasync session<T>(fn: () => Promise<T>): Promise<T> {\n\t\treturn this.#inMemory.session(async () => {\n\t\t\tconst result = await fn()\n\t\t\tawait this.#persistToDisk()\n\t\t\treturn result\n\t\t})\n\t}\n\n\tasync loadMigrations(): Promise<{ id: string; appliedAt: number }[]> {\n\t\tawait this.connect()\n\t\treturn this.#inMemory.loadMigrations()\n\t}\n\n\tasync recordMigration(id: string, appliedAt: number): Promise<void> {\n\t\tawait this.#inMemory.recordMigration(id, appliedAt)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync acquireMigrationLock<T>(fn: () => Promise<T>): Promise<T> {\n\t\tconst lockPath = this.config.filePath + '.lock'\n\t\tconst deadline = Date.now() + 30_000\n\t\twhile (true) {\n\t\t\ttry {\n\t\t\t\tconst handle = await open(lockPath, 'wx')\n\t\t\t\tawait handle.close()\n\t\t\t\tbreak\n\t\t\t} catch (err: any) {\n\t\t\t\tif (err.code !== 'EEXIST') throw err\n\t\t\t\tif (Date.now() > deadline) throw new Error('Timed out waiting for migration lock')\n\t\t\t\tawait new Promise((r) => setTimeout(r, 50))\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\treturn await fn()\n\t\t} finally {\n\t\t\tawait unlink(lockPath).catch(() => {})\n\t\t}\n\t}\n\n\tasync applyCreateTable(change: CreateTableChange<any>): Promise<void> {\n\t\tawait this.#inMemory.applyCreateTable(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync applyDropTable(change: DropTableChange): Promise<void> {\n\t\tawait this.#inMemory.applyDropTable(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync applyAddField(change: AddFieldChange<any>): Promise<void> {\n\t\tawait this.#inMemory.applyAddField(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync applyDropField(change: DropFieldChange): Promise<void> {\n\t\tawait this.#inMemory.applyDropField(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync applyModifyField(change: ModifyFieldChange<any>): Promise<void> {\n\t\tawait this.#inMemory.applyModifyField(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync applyRenameTable(change: RenameTableChange): Promise<void> {\n\t\tawait this.#inMemory.applyRenameTable(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync applyRenameField(change: RenameFieldChange): Promise<void> {\n\t\tawait this.#inMemory.applyRenameField(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync applyAddIndex(change: AddIndexChange): Promise<void> {\n\t\tawait this.#inMemory.applyAddIndex(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync applyDropIndex(change: DropIndexChange): Promise<void> {\n\t\tawait this.#inMemory.applyDropIndex(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync applyAddForeignKey(change: AddForeignKeyChange): Promise<void> {\n\t\tawait this.#inMemory.applyAddForeignKey(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync applyDropForeignKey(change: DropForeignKeyChange): Promise<void> {\n\t\tawait this.#inMemory.applyDropForeignKey(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync introspect(): Promise<DiscoveredSchema[]> {\n\t\treturn this.#inMemory.introspect()\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, test, expect, beforeEach, afterEach } = import.meta.vitest\n\tconst { FilterGroup } = await import('../../filter')\n\tconst { OrderBy } = await import('../../query-options')\n\tconst { Schema } = await import('../../schema')\n\tconst { IncOp, PatchOp, PullOp, PushOp } = await import('../../updates')\n\tconst { v } = await import('valleyed')\n\tconst { mkdtemp, rm } = await import('node:fs/promises')\n\tconst { tmpdir } = await import('node:os')\n\tconst { join } = await import('node:path')\n\tconst { Migrator } = await import('../../migrations/migrator')\n\tconst { Repo } = await import('../../repo/repo')\n\tconst { OrmMigrationError } = await import('../../errors/migration')\n\ttype Migration<A extends import('../base').OrmAdapterLike<any>> = import('../../migrations/types').Migration<A>\n\n\tlet tmpDir: string\n\tlet filePath: string\n\n\tbeforeEach(async () => {\n\t\ttmpDir = await mkdtemp(join(tmpdir(), 'json-adapter-'))\n\t\tfilePath = join(tmpDir, 'test.json')\n\t})\n\n\tafterEach(async () => {\n\t\tawait rm(tmpDir, { recursive: true, force: true })\n\t})\n\n\tdescribe('json adapter — class construction', () => {\n\t\ttest('JsonAdapter.create({ filePath }) produces a working adapter', () => {\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\texpect(adapter).toBeInstanceOf(JsonAdapter)\n\t\t\texpect(adapter.schemaConfigPipe).toBeDefined()\n\t\t\texpect(adapter.supportedFieldTypes).toEqual(['string', 'number', 'boolean', 'null', 'object', 'array', 'date'])\n\t\t})\n\n\t\ttest('auto-wired Instance hooks register connect/disconnect keyed by class', async () => {\n\t\t\tconst { Instance: Inst } = await import('../../../instance')\n\t\t\tconst onSpy = (await import('vitest')).vi.spyOn(Inst, 'on').mockImplementation(() => {})\n\n\t\t\tJsonAdapter.create({ filePath })\n\n\t\t\texpect(onSpy).toHaveBeenCalledWith('start', expect.any(Function), expect.objectContaining({ class: JsonAdapter }))\n\t\t\texpect(onSpy).toHaveBeenCalledWith('close', expect.any(Function), expect.objectContaining({ class: JsonAdapter }))\n\n\t\t\tonSpy.mockRestore()\n\t\t})\n\t})\n\n\tdescribe('json adapter — surface parity with in-memory', () => {\n\t\ttest('CRUD: create, find, update, delete round-trip', async () => {\n\t\t\tconst schema = Schema.from('users')\n\t\t\t\t.pk('id', v.string(), () => 'u')\n\t\t\t\t.field('name', v.string())\n\t\t\t\t.field('age', v.number())\n\t\t\t\t.build()\n\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\n\t\t\tconst use = adapter.use(schema, { table: 'users' })\n\n\t\t\tconst created = await use.createMany([\n\t\t\t\t{ id: 'u1', name: 'Alice', age: 30 },\n\t\t\t\t{ id: 'u2', name: 'Bob', age: 20 },\n\t\t\t])\n\t\t\texpect(created).toHaveLength(2)\n\n\t\t\tconst found = await use.findOne(FilterGroup.create().eq('id', 'u1'))\n\t\t\texpect(found).toEqual({ id: 'u1', name: 'Alice', age: 30 })\n\n\t\t\tconst many = await use.findMany(FilterGroup.create().gt('age', 19), {\n\t\t\t\torderBy: [new OrderBy('age', 'asc')],\n\t\t\t})\n\t\t\texpect(many).toEqual([\n\t\t\t\t{ id: 'u2', name: 'Bob', age: 20 },\n\t\t\t\t{ id: 'u1', name: 'Alice', age: 30 },\n\t\t\t])\n\n\t\t\tawait use.updateOne(FilterGroup.create().eq('id', 'u1'), { age: 31 })\n\t\t\tconst updated = await use.findOne(FilterGroup.create().eq('id', 'u1'))\n\t\t\texpect(updated?.age).toBe(31)\n\n\t\t\tconst deleted = await use.deleteOne(FilterGroup.create().eq('id', 'u2'))\n\t\t\texpect(deleted).toEqual({ id: 'u2', name: 'Bob', age: 20 })\n\n\t\t\tconst remaining = await use.findMany(FilterGroup.create())\n\t\t\texpect(remaining).toHaveLength(1)\n\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('supports nested filters, ordering, select, offset and limit', async () => {\n\t\t\tconst schema = Schema.from('users')\n\t\t\t\t.pk('id', v.string(), () => 'u')\n\t\t\t\t.field('name', v.string())\n\t\t\t\t.field('age', v.number())\n\t\t\t\t.build()\n\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tconst use = adapter.use(schema, { table: 'users' })\n\n\t\t\tawait use.createMany([\n\t\t\t\t{ id: 'u1', name: 'Alice', age: 30 },\n\t\t\t\t{ id: 'u2', name: 'Bob', age: 20 },\n\t\t\t\t{ id: 'u3', name: 'Carol', age: 40 },\n\t\t\t])\n\n\t\t\tconst builtGroup = FilterGroup.create().and([\n\t\t\t\t(q) => q.gt('age', 19),\n\t\t\t\t(q) => q.or([(g) => g.eq('name', 'Alice'), (g) => g.eq('name', 'Carol')]),\n\t\t\t])\n\t\t\tconst options = { orderBy: [new OrderBy('age', 'desc')], offset: 1, limit: 1, select: ['id', 'name'] as const }\n\t\t\tconst rows = await use.findMany(builtGroup, options)\n\t\t\texpect(rows).toEqual([{ id: 'u1', name: 'Alice' }])\n\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('count delegates to the in-memory store and persists separately from query options', async () => {\n\t\t\tconst schema = Schema.from('count_users')\n\t\t\t\t.pk('id', v.string(), () => 'u')\n\t\t\t\t.field('name', v.string())\n\t\t\t\t.build()\n\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tconst use = adapter.use(schema, { table: 'count_users' })\n\t\t\tawait use.createMany([\n\t\t\t\t{ id: 'u1', name: 'Alice' },\n\t\t\t\t{ id: 'u2', name: 'Bob' },\n\t\t\t\t{ id: 'u3', name: 'Alice' },\n\t\t\t])\n\n\t\t\tawait expect(use.count(FilterGroup.create().eq('name', 'Alice'))).resolves.toBe(2)\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('iterateMany with batchSize matches findMany through in-memory delegation', async () => {\n\t\t\tconst schema = Schema.from('json_iter_users')\n\t\t\t\t.pk('id', v.string(), () => 'u')\n\t\t\t\t.field('name', v.string())\n\t\t\t\t.field('age', v.number())\n\t\t\t\t.build()\n\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tconst use = adapter.use(schema, { table: 'json_iter_users' })\n\t\t\tawait use.createMany([\n\t\t\t\t{ id: 'u1', name: 'Alice', age: 30 },\n\t\t\t\t{ id: 'u2', name: 'Bob', age: 20 },\n\t\t\t\t{ id: 'u3', name: 'Carol', age: 40 },\n\t\t\t\t{ id: 'u4', name: 'Dan', age: 50 },\n\t\t\t])\n\n\t\t\tconst filter = FilterGroup.create().gt('age', 19)\n\t\t\tconst options = {\n\t\t\t\torderBy: [new OrderBy('age', 'desc')],\n\t\t\t\toffset: 1,\n\t\t\t\tlimit: 2,\n\t\t\t\tselect: ['id', 'name'],\n\t\t\t}\n\t\t\tconst expected = await use.findMany(filter, options)\n\t\t\tconst rows: Record<string, unknown>[] = []\n\t\t\tfor await (const row of use.iterateMany(filter, { ...options, batchSize: 2 })) {\n\t\t\t\trows.push(row)\n\t\t\t}\n\t\t\texpect(rows).toEqual(expected)\n\t\t\texpect(rows).toEqual([\n\t\t\t\t{ id: 'u3', name: 'Carol' },\n\t\t\t\t{ id: 'u1', name: 'Alice' },\n\t\t\t])\n\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('supports update operators and rollback on failed session', async () => {\n\t\t\tconst schema = Schema.from('docs')\n\t\t\t\t.pk('id', v.string(), () => 'd1')\n\t\t\t\t.field('count', v.number())\n\t\t\t\t.field('tags', v.array(v.string()))\n\t\t\t\t.field('meta', v.object({ a: v.number() }))\n\t\t\t\t.build()\n\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tconst use = adapter.use(schema, { table: 'docs' })\n\n\t\t\tawait use.createOne({ id: 'd1', count: 1, tags: ['x'], meta: { a: 1 } })\n\n\t\t\tawait adapter.session(async () => {\n\t\t\t\tawait use.updateOne(FilterGroup.create().eq('id', 'd1'), {\n\t\t\t\t\tcount: new IncOp('count', 2),\n\t\t\t\t\ttags: new PushOp('tags', 'y'),\n\t\t\t\t\tmeta: new PatchOp('meta', { a: 9 }),\n\t\t\t\t})\n\t\t\t})\n\n\t\t\tawait expect(\n\t\t\t\tadapter.session(async () => {\n\t\t\t\t\tawait use.updateOne(FilterGroup.create().eq('id', 'd1'), { tags: new PullOp('tags', 'x') })\n\t\t\t\t\tthrow new Error('boom')\n\t\t\t\t}),\n\t\t\t).rejects.toThrow('boom')\n\n\t\t\tconst row = await use.findOne(FilterGroup.create().eq('id', 'd1'))\n\t\t\texpect(row).toEqual({ id: 'd1', count: 3, tags: ['x', 'y'], meta: { a: 9 } })\n\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('upsertOne inserts when missing and updates when existing', async () => {\n\t\t\tconst schema = Schema.from('items')\n\t\t\t\t.pk('id', v.string(), () => 'i')\n\t\t\t\t.field('val', v.number())\n\t\t\t\t.build()\n\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tconst use = adapter.use(schema, { table: 'items' })\n\n\t\t\tconst inserted = await use.upsertOne(FilterGroup.create().eq('id', 'i1'), { id: 'i1', val: 10 }, [])\n\t\t\texpect(inserted).toEqual({ id: 'i1', val: 10 })\n\n\t\t\tconst updated = await use.upsertOne(FilterGroup.create().eq('id', 'i1'), { id: 'i1', val: 10 }, [new IncOp('val', 5)])\n\t\t\texpect(updated).toEqual({ id: 'i1', val: 15 })\n\n\t\t\tawait adapter.disconnect()\n\t\t})\n\t})\n\n\tdescribe('json adapter — persistence', () => {\n\t\ttest('state persists across adapter restarts', async () => {\n\t\t\tconst schema = Schema.from('users')\n\t\t\t\t.pk('id', v.string(), () => 'u')\n\t\t\t\t.field('name', v.string())\n\t\t\t\t.build()\n\n\t\t\tconst a1 = JsonAdapter.create({ filePath })\n\t\t\tawait a1.connect()\n\t\t\tconst use1 = a1.use(schema, { table: 'users' })\n\t\t\tawait use1.createMany([\n\t\t\t\t{ id: 'u1', name: 'Alice' },\n\t\t\t\t{ id: 'u2', name: 'Bob' },\n\t\t\t])\n\t\t\tawait a1.disconnect()\n\n\t\t\tconst a2 = JsonAdapter.create({ filePath })\n\t\t\tawait a2.connect()\n\t\t\tconst use2 = a2.use(schema, { table: 'users' })\n\t\t\tconst rows = await use2.findMany(FilterGroup.create())\n\t\t\texpect(rows).toHaveLength(2)\n\t\t\texpect(rows.map((r) => r.name).sort()).toEqual(['Alice', 'Bob'])\n\t\t\tawait a2.disconnect()\n\t\t})\n\n\t\ttest('failed session does not persist rolled-back state to disk', async () => {\n\t\t\tconst schema = Schema.from('docs')\n\t\t\t\t.pk('id', v.string(), () => 'd')\n\t\t\t\t.field('val', v.number())\n\t\t\t\t.build()\n\n\t\t\tconst a1 = JsonAdapter.create({ filePath })\n\t\t\tawait a1.connect()\n\t\t\tconst use1 = a1.use(schema, { table: 'docs' })\n\t\t\tawait use1.createOne({ id: 'd1', val: 1 })\n\t\t\tawait a1.disconnect()\n\n\t\t\tconst a2 = JsonAdapter.create({ filePath })\n\t\t\tawait a2.connect()\n\t\t\tconst use2 = a2.use(schema, { table: 'docs' })\n\t\t\tawait expect(\n\t\t\t\ta2.session(async () => {\n\t\t\t\t\tawait use2.updateOne(FilterGroup.create().eq('id', 'd1'), { val: 999 })\n\t\t\t\t\tthrow new Error('rollback')\n\t\t\t\t}),\n\t\t\t).rejects.toThrow('rollback')\n\t\t\tawait a2.disconnect()\n\n\t\t\tconst a3 = JsonAdapter.create({ filePath })\n\t\t\tawait a3.connect()\n\t\t\tconst use3 = a3.use(schema, { table: 'docs' })\n\t\t\tconst row = await use3.findOne(FilterGroup.create().eq('id', 'd1'))\n\t\t\texpect(row?.val).toBe(1)\n\t\t\tawait a3.disconnect()\n\t\t})\n\t})\n\n\tdescribe('json adapter — atomic writes', () => {\n\t\ttest('file is valid JSON after every write', async () => {\n\t\t\tconst { readFile: rf } = await import('node:fs/promises')\n\t\t\tconst schema = Schema.from('items')\n\t\t\t\t.pk('id', v.string(), () => 'i')\n\t\t\t\t.field('val', v.number())\n\t\t\t\t.build()\n\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tconst use = adapter.use(schema, { table: 'items' })\n\n\t\t\tfor (let i = 0; i < 10; i++) {\n\t\t\t\tawait use.createOne({ id: `i${i}`, val: i })\n\t\t\t\tconst raw = await rf(filePath, 'utf-8')\n\t\t\t\texpect(() => JSON.parse(raw)).not.toThrow()\n\t\t\t}\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('no .tmp files remain after writes complete', async () => {\n\t\t\tconst { readdir } = await import('node:fs/promises')\n\t\t\tconst schema = Schema.from('items')\n\t\t\t\t.pk('id', v.string(), () => 'i')\n\t\t\t\t.field('val', v.number())\n\t\t\t\t.build()\n\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tconst use = adapter.use(schema, { table: 'items' })\n\n\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\tawait use.createOne({ id: `i${i}`, val: i })\n\t\t\t}\n\t\t\tawait adapter.disconnect()\n\n\t\t\tconst files = await readdir(tmpDir)\n\t\t\tconst tmpFiles = files.filter((f) => f.includes('.tmp.'))\n\t\t\texpect(tmpFiles).toHaveLength(0)\n\t\t})\n\t})\n\n\tdescribe('json adapter — aggregate delegation', () => {\n\t\tconst orderSchema = Schema.from('orders')\n\t\t\t.pk('id', v.string(), () => 'o')\n\t\t\t.field('amount', v.number())\n\t\t\t.field('region', v.string())\n\t\t\t.build()\n\n\t\tconst orderSeed = [\n\t\t\t{ id: 'o1', amount: 100, region: 'us' },\n\t\t\t{ id: 'o2', amount: 200, region: 'eu' },\n\t\t\t{ id: 'o3', amount: 150, region: 'us' },\n\t\t]\n\n\t\tasync function makeSeededAdapter() {\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tconst use = adapter.use(orderSchema, { table: 'orders' })\n\t\t\tawait use.createMany(orderSeed)\n\t\t\treturn adapter\n\t\t}\n\n\t\ttest('aggregateOps matches in-memory adapter', () => {\n\t\t\tconst json = JsonAdapter.create({ filePath })\n\t\t\tconst inMem = InMemoryAdapter.create({})\n\t\t\texpect(json.aggregateOps).toEqual(inMem.aggregateOps)\n\t\t\texpect(json.aggregateOps).toEqual(['count', 'countDistinct', 'sum', 'avg', 'min', 'max'])\n\t\t})\n\n\t\ttest('count returns identical result to in-memory', async () => {\n\t\t\tconst adapter = await makeSeededAdapter()\n\t\t\tconst result = await adapter.aggregate(orderSchema, { table: 'orders' }, {\n\t\t\t\taggregates: [{ fn: 'count', alias: 'total' }],\n\t\t\t\tgroupBy: [],\n\t\t\t})\n\t\t\texpect(result).toEqual([{ total: 3 }])\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('countDistinct returns identical result to in-memory', async () => {\n\t\t\tconst adapter = await makeSeededAdapter()\n\t\t\tconst result = await adapter.aggregate(orderSchema, { table: 'orders' }, {\n\t\t\t\taggregates: [{ fn: 'countDistinct', field: 'region', alias: 'uniqueRegions' }],\n\t\t\t\tgroupBy: [],\n\t\t\t})\n\t\t\texpect(result).toEqual([{ uniqueRegions: 2 }])\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('sum, avg, min, max return identical results to in-memory', async () => {\n\t\t\tconst adapter = await makeSeededAdapter()\n\t\t\tconst result = await adapter.aggregate(orderSchema, { table: 'orders' }, {\n\t\t\t\taggregates: [\n\t\t\t\t\t{ fn: 'sum', field: 'amount', alias: 'totalAmount' },\n\t\t\t\t\t{ fn: 'avg', field: 'amount', alias: 'avgAmount' },\n\t\t\t\t\t{ fn: 'min', field: 'amount', alias: 'minAmount' },\n\t\t\t\t\t{ fn: 'max', field: 'amount', alias: 'maxAmount' },\n\t\t\t\t],\n\t\t\t\tgroupBy: [],\n\t\t\t})\n\t\t\texpect(result).toEqual([{ totalAmount: 450, avgAmount: 150, minAmount: 100, maxAmount: 200 }])\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('groupBy returns identical results to in-memory', async () => {\n\t\t\tconst adapter = await makeSeededAdapter()\n\t\t\tconst result = await adapter.aggregate(orderSchema, { table: 'orders' }, {\n\t\t\t\taggregates: [\n\t\t\t\t\t{ fn: 'count', alias: 'cnt' },\n\t\t\t\t\t{ fn: 'sum', field: 'amount', alias: 'total' },\n\t\t\t\t],\n\t\t\t\tgroupBy: ['region'],\n\t\t\t})\n\t\t\tconst sorted = result.sort((a, b) => String(a.region).localeCompare(String(b.region)))\n\t\t\texpect(sorted).toEqual([\n\t\t\t\t{ region: 'eu', cnt: 1, total: 200 },\n\t\t\t\t{ region: 'us', cnt: 2, total: 250 },\n\t\t\t])\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('where pre-filter returns identical results to in-memory', async () => {\n\t\t\tconst adapter = await makeSeededAdapter()\n\t\t\tconst result = await adapter.aggregate(orderSchema, { table: 'orders' }, {\n\t\t\t\twhere: FilterGroup.create().gt('amount', 100),\n\t\t\t\taggregates: [{ fn: 'count', alias: 'cnt' }],\n\t\t\t\tgroupBy: [],\n\t\t\t})\n\t\t\texpect(result).toEqual([{ cnt: 2 }])\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('having post-filter returns identical results to in-memory', async () => {\n\t\t\tconst adapter = await makeSeededAdapter()\n\t\t\tconst result = await adapter.aggregate(orderSchema, { table: 'orders' }, {\n\t\t\t\taggregates: [{ fn: 'count', alias: 'cnt' }],\n\t\t\t\tgroupBy: ['region'],\n\t\t\t\thaving: FilterGroup.create().gt('cnt', 1),\n\t\t\t})\n\t\t\texpect(result).toEqual([{ region: 'us', cnt: 2 }])\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('aggregate delegates to same in-memory instance used by CRUD', async () => {\n\t\t\tconst schema = Schema.from('items')\n\t\t\t\t.pk('id', v.string(), () => 'i')\n\t\t\t\t.field('val', v.number())\n\t\t\t\t.build()\n\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tconst use = adapter.use(schema, { table: 'items' })\n\n\t\t\tawait use.createMany([\n\t\t\t\t{ id: 'i1', val: 10 },\n\t\t\t\t{ id: 'i2', val: 20 },\n\t\t\t])\n\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\taggregates: [{ fn: 'sum', field: 'val', alias: 'total' }],\n\t\t\t\tgroupBy: [],\n\t\t\t}\n\t\t\tconst result = await adapter.aggregate(schema, { table: 'items' }, spec)\n\t\t\texpect(result).toEqual([{ total: 30 }])\n\n\t\t\tawait use.createOne({ id: 'i3', val: 30 })\n\t\t\tconst result2 = await adapter.aggregate(schema, { table: 'items' }, spec)\n\t\t\texpect(result2).toEqual([{ total: 60 }])\n\n\t\t\tawait adapter.disconnect()\n\t\t})\n\t})\n\n\tdescribe('json adapter — concurrent writes serialize', () => {\n\t\ttest('parallel writes from same process all persist', async () => {\n\t\t\tconst schema = Schema.from('items')\n\t\t\t\t.pk('id', v.string(), () => 'i')\n\t\t\t\t.field('val', v.number())\n\t\t\t\t.build()\n\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tconst use = adapter.use(schema, { table: 'items' })\n\n\t\t\tawait Promise.all(Array.from({ length: 20 }, (_, i) => use.createOne({ id: `i${i}`, val: i })))\n\n\t\t\tconst rows = await use.findMany(FilterGroup.create())\n\t\t\texpect(rows).toHaveLength(20)\n\t\t\tawait adapter.disconnect()\n\n\t\t\tconst a2 = JsonAdapter.create({ filePath })\n\t\t\tawait a2.connect()\n\t\t\tconst use2 = a2.use(schema, { table: 'items' })\n\t\t\tconst reloaded = await use2.findMany(FilterGroup.create())\n\t\t\texpect(reloaded).toHaveLength(20)\n\t\t\tawait a2.disconnect()\n\t\t})\n\t})\n\n\tdescribe('json adapter — migration storage', () => {\n\t\ttest('recordMigration + loadMigrations round-trip', async () => {\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\n\t\t\tawait adapter.recordMigration('m-001', 1000)\n\t\t\tawait adapter.recordMigration('m-002', 2000)\n\n\t\t\tconst loaded = await adapter.loadMigrations()\n\t\t\texpect(loaded).toHaveLength(2)\n\t\t\texpect(loaded).toEqual([\n\t\t\t\t{ id: 'm-001', appliedAt: 1000 },\n\t\t\t\t{ id: 'm-002', appliedAt: 2000 },\n\t\t\t])\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('migration tracker persists across adapter restarts', async () => {\n\t\t\tconst a1 = JsonAdapter.create({ filePath })\n\t\t\tawait a1.connect()\n\t\t\tawait a1.recordMigration('m-001', 1000)\n\t\t\tawait a1.disconnect()\n\n\t\t\tconst a2 = JsonAdapter.create({ filePath })\n\t\t\tawait a2.connect()\n\t\t\tconst loaded = await a2.loadMigrations()\n\t\t\texpect(loaded).toEqual([{ id: 'm-001', appliedAt: 1000 }])\n\t\t\tawait a2.disconnect()\n\t\t})\n\n\t\ttest('__migrations key in JSON file stores tracker data', async () => {\n\t\t\tconst { readFile: rf } = await import('node:fs/promises')\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tawait adapter.recordMigration('m-001', 1000)\n\t\t\tawait adapter.disconnect()\n\n\t\t\tconst raw = JSON.parse(await rf(filePath, 'utf-8'))\n\t\t\texpect(raw['__migrations']).toEqual([{ id: 'm-001', appliedAt: 1000 }])\n\t\t})\n\t})\n\n\tdescribe('json adapter — apply* methods', () => {\n\t\ttest('applyCreateTable persists table metadata', async () => {\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tawait adapter.applyCreateTable({\n\t\t\t\tkind: 'createTable',\n\t\t\t\tname: 'users',\n\t\t\t\tpk: { name: 'id', type: 'string' },\n\t\t\t\tfields: [{ name: 'email', type: 'string', unique: true }],\n\t\t\t})\n\t\t\tawait adapter.disconnect()\n\n\t\t\tconst a2 = JsonAdapter.create({ filePath })\n\t\t\tawait a2.connect()\n\t\t\tconst schemas = await a2.introspect()\n\t\t\texpect(schemas).toHaveLength(1)\n\t\t\texpect(schemas[0].name).toBe('users')\n\t\t\texpect(schemas[0].pk).toEqual({ name: 'id', type: 'string' })\n\t\t\texpect(schemas[0].fields).toEqual([{ name: 'email', type: 'string', nullable: false, unique: true }])\n\t\t\tawait a2.disconnect()\n\t\t})\n\n\t\ttest('applyAddIndex and applyDropIndex persist across restarts', async () => {\n\t\t\tconst a1 = JsonAdapter.create({ filePath })\n\t\t\tawait a1.connect()\n\t\t\tawait a1.applyCreateTable({ kind: 'createTable', name: 'users', pk: { name: 'id', type: 'string' }, fields: [] })\n\t\t\tawait a1.applyAddIndex({ kind: 'addIndex', table: 'users', on: ['email'], unique: true })\n\t\t\tawait a1.disconnect()\n\n\t\t\tconst a2 = JsonAdapter.create({ filePath })\n\t\t\tawait a2.connect()\n\t\t\tconst schemas = await a2.introspect()\n\t\t\texpect(schemas[0].indexes).toEqual([{ name: 'users_email_idx', on: ['email'], unique: true }])\n\t\t\tawait a2.applyDropIndex({ kind: 'dropIndex', name: 'users_email_idx' })\n\t\t\tawait a2.disconnect()\n\n\t\t\tconst a3 = JsonAdapter.create({ filePath })\n\t\t\tawait a3.connect()\n\t\t\tconst schemas2 = await a3.introspect()\n\t\t\texpect(schemas2[0].indexes).toEqual([])\n\t\t\tawait a3.disconnect()\n\t\t})\n\n\t\ttest('applyAddForeignKey and applyDropForeignKey persist across restarts', async () => {\n\t\t\tconst a1 = JsonAdapter.create({ filePath })\n\t\t\tawait a1.connect()\n\t\t\tawait a1.applyCreateTable({ kind: 'createTable', name: 'users', pk: { name: 'id', type: 'string' }, fields: [] })\n\t\t\tawait a1.applyCreateTable({ kind: 'createTable', name: 'posts', pk: { name: 'id', type: 'string' }, fields: [] })\n\t\t\tawait a1.applyAddForeignKey({ kind: 'addForeignKey', table: 'posts', on: 'authorId', references: { table: 'users', column: 'id' }, onDelete: 'cascade' })\n\t\t\tawait a1.disconnect()\n\n\t\t\tconst a2 = JsonAdapter.create({ filePath })\n\t\t\tawait a2.connect()\n\t\t\tconst schemas = await a2.introspect()\n\t\t\tconst posts = schemas.find((s) => s.name === 'posts')!\n\t\t\texpect(posts.foreignKeys).toEqual([{\n\t\t\t\tname: 'posts_authorId_fk',\n\t\t\t\ton: 'authorId',\n\t\t\t\treferences: { table: 'users', column: 'id' },\n\t\t\t\tonDelete: 'cascade',\n\t\t\t}])\n\t\t\tawait a2.applyDropForeignKey({ kind: 'dropForeignKey', table: 'posts', name: 'posts_authorId_fk' })\n\t\t\tawait a2.disconnect()\n\n\t\t\tconst a3 = JsonAdapter.create({ filePath })\n\t\t\tawait a3.connect()\n\t\t\tconst schemas2 = await a3.introspect()\n\t\t\tconst posts2 = schemas2.find((s) => s.name === 'posts')!\n\t\t\texpect(posts2.foreignKeys).toEqual([])\n\t\t\tawait a3.disconnect()\n\t\t})\n\t})\n\n\tdescribe('json adapter — acquireMigrationLock', () => {\n\t\ttest('file lock serialises concurrent calls', async () => {\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\n\t\t\tconst order: string[] = []\n\t\t\tlet resolveGate!: () => void\n\t\t\tconst gate = new Promise<void>((r) => { resolveGate = r })\n\n\t\t\tconst p1 = adapter.acquireMigrationLock(async () => {\n\t\t\t\torder.push('p1-start')\n\t\t\t\tawait gate\n\t\t\t\torder.push('p1-end')\n\t\t\t})\n\t\t\tawait new Promise((r) => setTimeout(r, 100))\n\t\t\tconst p2 = adapter.acquireMigrationLock(async () => {\n\t\t\t\torder.push('p2')\n\t\t\t})\n\n\t\t\tawait new Promise((r) => setTimeout(r, 100))\n\t\t\texpect(order).toEqual(['p1-start'])\n\n\t\t\tresolveGate()\n\t\t\tawait Promise.all([p1, p2])\n\t\t\texpect(order).toEqual(['p1-start', 'p1-end', 'p2'])\n\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('lock file is cleaned up after successful execution', async () => {\n\t\t\tconst { access } = await import('node:fs/promises')\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\n\t\t\tawait adapter.acquireMigrationLock(async () => { /* no-op */ })\n\n\t\t\tawait expect(access(filePath + '.lock')).rejects.toThrow()\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('lock file is cleaned up after failed execution', async () => {\n\t\t\tconst { access } = await import('node:fs/promises')\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\n\t\t\tawait expect(\n\t\t\t\tadapter.acquireMigrationLock(async () => { throw new Error('boom') }),\n\t\t\t).rejects.toThrow('boom')\n\n\t\t\tawait expect(access(filePath + '.lock')).rejects.toThrow()\n\t\t\tawait adapter.disconnect()\n\t\t})\n\t})\n\n\tdescribe('json adapter — end-to-end migrations via Migrator', () => {\n\t\tconst UserSchema = Schema.from('users')\n\t\t\t.pk('id', v.string(), () => `u-${Math.random().toString(36).slice(2)}`)\n\t\t\t.field('email', v.string())\n\t\t\t.build()\n\n\t\tfunction makeEnv() {\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tconst repo = new Repo({ adapter, resolve: (s) => ({ table: s.name }) })\n\t\t\treturn { adapter, repo }\n\t\t}\n\n\t\ttest('end-to-end migration run covering every declarative variant + execute', async () => {\n\t\t\tconst { adapter, repo } = makeEnv()\n\t\t\tawait adapter.connect()\n\n\t\t\tconst migrations: Migration<typeof adapter>[] = [\n\t\t\t\t{\n\t\t\t\t\tid: '0001-create',\n\t\t\t\t\tchanges: [\n\t\t\t\t\t\t{ kind: 'createTable', name: 'users', pk: { name: 'id', type: 'string' }, fields: [{ name: 'email', type: 'string' }] },\n\t\t\t\t\t\t{ kind: 'createTable', name: 'posts', pk: { name: 'id', type: 'string' }, fields: [{ name: 'title', type: 'string' }, { name: 'authorId', type: 'string' }] },\n\t\t\t\t\t\t{ kind: 'addIndex', table: 'users', on: ['email'], unique: true },\n\t\t\t\t\t\t{ kind: 'addForeignKey', table: 'posts', on: 'authorId', references: { table: 'users', column: 'id' } },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: '0002-evolve',\n\t\t\t\t\tchanges: [\n\t\t\t\t\t\t{ kind: 'addField', table: 'users', field: { name: 'age', type: 'number', nullable: true } },\n\t\t\t\t\t\t{ kind: 'modifyField', table: 'users', name: 'email', to: { name: 'email', type: 'string', unique: true, nullable: true } },\n\t\t\t\t\t\t{ kind: 'renameField', table: 'posts', from: 'title', to: 'headline' },\n\t\t\t\t\t\t{ kind: 'renameTable', from: 'posts', to: 'articles' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: '0003-cleanup',\n\t\t\t\t\tchanges: [\n\t\t\t\t\t\t{ kind: 'dropField', table: 'users', name: 'age' },\n\t\t\t\t\t\t{ kind: 'dropForeignKey', table: 'posts', name: 'posts_authorId_fk' },\n\t\t\t\t\t\t{ kind: 'dropIndex', name: 'users_email_idx' },\n\t\t\t\t\t\t{ kind: 'dropTable', name: 'articles' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: '0004-seed',\n\t\t\t\t\tchanges: [{\n\t\t\t\t\t\tkind: 'execute',\n\t\t\t\t\t\tup: async (r) => {\n\t\t\t\t\t\t\tawait r.on(UserSchema).one().create({ id: 'seed-1', email: 'test@example.com' })\n\t\t\t\t\t\t},\n\t\t\t\t\t}],\n\t\t\t\t},\n\t\t\t]\n\n\t\t\tconst migrator = Migrator.from(repo, adapter).migrations(migrations).build()\n\t\t\tconst result = await migrator.up()\n\t\t\texpect(result.ran).toEqual(['0001-create', '0002-evolve', '0003-cleanup', '0004-seed'])\n\n\t\t\tconst recorded = await adapter.loadMigrations()\n\t\t\texpect(recorded).toHaveLength(4)\n\n\t\t\tconst row = await repo.on(UserSchema).one().id('seed-1').find()\n\t\t\texpect(row).not.toBeNull()\n\t\t\texpect(row!.email).toBe('test@example.com')\n\n\t\t\t// Verify via re-reading the file\n\t\t\tawait adapter.disconnect()\n\t\t\tconst { adapter: a2, repo: r2 } = makeEnv()\n\t\t\tawait a2.connect()\n\t\t\tconst recorded2 = await a2.loadMigrations()\n\t\t\texpect(recorded2).toHaveLength(4)\n\n\t\t\tconst row2 = await r2.on(UserSchema).one().id('seed-1').find()\n\t\t\texpect(row2!.email).toBe('test@example.com')\n\t\t\tawait a2.disconnect()\n\t\t})\n\n\t\ttest('file lock serialises concurrent migrator.up() runs', async () => {\n\t\t\tconst order: string[] = []\n\t\t\tlet resolveGate!: () => void\n\t\t\tconst gate = new Promise<void>((r) => { resolveGate = r })\n\n\t\t\tconst migrations: Migration<JsonAdapter>[] = [\n\t\t\t\t{\n\t\t\t\t\tid: '0001',\n\t\t\t\t\tchanges: [{\n\t\t\t\t\t\tkind: 'execute',\n\t\t\t\t\t\tup: async () => {\n\t\t\t\t\t\t\torder.push('0001-start')\n\t\t\t\t\t\t\tawait gate\n\t\t\t\t\t\t\torder.push('0001-end')\n\t\t\t\t\t\t},\n\t\t\t\t\t}],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: '0002',\n\t\t\t\t\tchanges: [{ kind: 'execute', up: async () => { order.push('0002') } }],\n\t\t\t\t},\n\t\t\t]\n\n\t\t\tconst adapter1 = JsonAdapter.create({ filePath })\n\t\t\tawait adapter1.connect()\n\t\t\tconst repo1 = new Repo({ adapter: adapter1, resolve: (s) => ({ table: s.name }) })\n\t\t\tconst migrator1 = Migrator.from(repo1, adapter1).migrations(migrations).build()\n\n\t\t\tconst adapter2 = JsonAdapter.create({ filePath })\n\t\t\tawait adapter2.connect()\n\t\t\tconst repo2 = new Repo({ adapter: adapter2, resolve: (s) => ({ table: s.name }) })\n\t\t\tconst migrator2 = Migrator.from(repo2, adapter2).migrations(migrations).build()\n\n\t\t\tconst p1 = migrator1.up()\n\t\t\tconst p2 = migrator2.up()\n\n\t\t\tawait new Promise((r) => setTimeout(r, 200))\n\t\t\texpect(order).toEqual(['0001-start'])\n\n\t\t\tresolveGate()\n\t\t\tawait Promise.all([p1, p2])\n\n\t\t\texpect(order).toEqual(['0001-start', '0001-end', '0002'])\n\n\t\t\tawait adapter1.disconnect()\n\t\t\tawait adapter2.disconnect()\n\t\t})\n\n\t\ttest('tx:true rollback leaves file unchanged on failure', async () => {\n\t\t\tconst { adapter } = makeEnv()\n\t\t\tawait adapter.connect()\n\n\t\t\tawait adapter.applyCreateTable({ kind: 'createTable', name: 'users', pk: { name: 'id', type: 'string' }, fields: [] })\n\t\t\tawait adapter.disconnect()\n\n\t\t\tconst { adapter: a2, repo: r2 } = makeEnv()\n\t\t\tawait a2.connect()\n\n\t\t\tconst m: Migration<typeof a2> = {\n\t\t\t\tid: '0001-will-fail',\n\t\t\t\tchanges: [\n\t\t\t\t\t{ kind: 'addIndex', table: 'users', on: ['email'] },\n\t\t\t\t\t{\n\t\t\t\t\t\tkind: 'execute',\n\t\t\t\t\t\tup: async (r) => {\n\t\t\t\t\t\t\tawait r.on(UserSchema).one().create({ id: 'partial', email: 'fail@test.com' })\n\t\t\t\t\t\t\tthrow new Error('mid-migration boom')\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t}\n\t\t\tconst migrator = Migrator.from(r2, a2).migrations([m]).build()\n\t\t\tawait expect(migrator.up()).rejects.toThrow(OrmMigrationError)\n\t\t\tawait a2.disconnect()\n\n\t\t\tconst { adapter: a3, repo: r3 } = makeEnv()\n\t\t\tawait a3.connect()\n\t\t\tconst recorded = await a3.loadMigrations()\n\t\t\texpect(recorded).toHaveLength(0)\n\t\t\tconst schemas = await a3.introspect()\n\t\t\tconst users = schemas.find((s) => s.name === 'users')!\n\t\t\texpect(users.indexes).toEqual([])\n\t\t\tconst row = await r3.on(UserSchema).one().id('partial').find()\n\t\t\texpect(row).toBeNull()\n\t\t\tawait a3.disconnect()\n\t\t})\n\n\t\ttest('introspect() round-trip: apply* then introspect returns matching descriptors', async () => {\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\n\t\t\tawait adapter.applyCreateTable({\n\t\t\t\tkind: 'createTable',\n\t\t\t\tname: 'users',\n\t\t\t\tpk: { name: 'id', type: 'string' },\n\t\t\t\tfields: [\n\t\t\t\t\t{ name: 'email', type: 'string', unique: true },\n\t\t\t\t\t{ name: 'age', type: 'number', nullable: true },\n\t\t\t\t],\n\t\t\t})\n\t\t\tawait adapter.applyAddIndex({ kind: 'addIndex', table: 'users', on: ['email'], unique: true })\n\t\t\tawait adapter.applyCreateTable({\n\t\t\t\tkind: 'createTable',\n\t\t\t\tname: 'posts',\n\t\t\t\tpk: { name: 'id', type: 'string' },\n\t\t\t\tfields: [{ name: 'authorId', type: 'string' }],\n\t\t\t})\n\t\t\tawait adapter.applyAddForeignKey({\n\t\t\t\tkind: 'addForeignKey',\n\t\t\t\ttable: 'posts',\n\t\t\t\ton: 'authorId',\n\t\t\t\treferences: { table: 'users', column: 'id' },\n\t\t\t\tonDelete: 'cascade',\n\t\t\t})\n\t\t\tawait adapter.disconnect()\n\n\t\t\tconst a2 = JsonAdapter.create({ filePath })\n\t\t\tawait a2.connect()\n\t\t\tconst schemas = await a2.introspect()\n\n\t\t\tconst users = schemas.find((s) => s.name === 'users')!\n\t\t\texpect(users.pk).toEqual({ name: 'id', type: 'string' })\n\t\t\texpect(users.fields).toEqual([\n\t\t\t\t{ name: 'email', type: 'string', nullable: false, unique: true },\n\t\t\t\t{ name: 'age', type: 'number', nullable: true },\n\t\t\t])\n\t\t\texpect(users.indexes).toEqual([{ name: 'users_email_idx', on: ['email'], unique: true }])\n\n\t\t\tconst posts = schemas.find((s) => s.name === 'posts')!\n\t\t\texpect(posts.pk).toEqual({ name: 'id', type: 'string' })\n\t\t\texpect(posts.fields).toEqual([{ name: 'authorId', type: 'string', nullable: false }])\n\t\t\texpect(posts.foreignKeys).toEqual([{\n\t\t\t\tname: 'posts_authorId_fk',\n\t\t\t\ton: 'authorId',\n\t\t\t\treferences: { table: 'users', column: 'id' },\n\t\t\t\tonDelete: 'cascade',\n\t\t\t}])\n\n\t\t\tawait a2.disconnect()\n\t\t})\n\n\t\ttest('metadata keys do not leak into data stores', async () => {\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tawait adapter.recordMigration('m-001', 1000)\n\t\t\tawait adapter.applyCreateTable({ kind: 'createTable', name: 'users', pk: { name: 'id', type: 'string' }, fields: [] })\n\n\t\t\texpect(adapter.stores.has('__migrations')).toBe(false)\n\t\t\texpect(adapter.stores.has('__tables')).toBe(false)\n\t\t\tawait adapter.disconnect()\n\n\t\t\tconst a2 = JsonAdapter.create({ filePath })\n\t\t\tawait a2.connect()\n\t\t\texpect(a2.stores.has('__migrations')).toBe(false)\n\t\t\texpect(a2.stores.has('__tables')).toBe(false)\n\t\t\tawait a2.disconnect()\n\t\t})\n\t})\n}\n"],"mappings":"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","names":["v"]}