equipped 5.3.1 → 5.3.2

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 (191) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/cjs/cache/adapters/in-memory/index.cjs +155 -155
  3. package/dist/cjs/cache/adapters/in-memory/index.cjs.map +1 -1
  4. package/dist/cjs/cache/adapters/in-memory/index.min.cjs +3 -3
  5. package/dist/cjs/cache/adapters/in-memory/index.min.cjs.map +1 -1
  6. package/dist/cjs/dbs/adapters/mongodb/index.cjs.map +1 -1
  7. package/dist/cjs/dbs/adapters/mongodb/index.min.cjs +2 -2
  8. package/dist/cjs/dbs/adapters/mongodb/index.min.cjs.map +1 -1
  9. package/dist/cjs/dbs/index.cjs +181 -179
  10. package/dist/cjs/dbs/index.cjs.map +1 -1
  11. package/dist/cjs/dbs/index.min.cjs +3 -3
  12. package/dist/cjs/dbs/index.min.cjs.map +1 -1
  13. package/dist/cjs/events/adapters/kafka/index.cjs.map +1 -1
  14. package/dist/cjs/events/adapters/kafka/index.min.cjs +2 -2
  15. package/dist/cjs/events/adapters/kafka/index.min.cjs.map +1 -1
  16. package/dist/cjs/events/adapters/rabbitmq/index.cjs +179 -179
  17. package/dist/cjs/events/adapters/rabbitmq/index.cjs.map +1 -1
  18. package/dist/cjs/events/adapters/rabbitmq/index.min.cjs +3 -3
  19. package/dist/cjs/events/adapters/rabbitmq/index.min.cjs.map +1 -1
  20. package/dist/cjs/orm/adapters/mongodb/index.cjs +144 -144
  21. package/dist/cjs/orm/adapters/mongodb/index.cjs.map +1 -1
  22. package/dist/cjs/orm/adapters/mongodb/index.min.cjs +1 -1
  23. package/dist/cjs/orm/adapters/mongodb/index.min.cjs.map +1 -1
  24. package/dist/cjs/orm/adapters/postgresql/index.cjs +144 -215
  25. package/dist/cjs/orm/adapters/postgresql/index.cjs.map +1 -1
  26. package/dist/cjs/orm/adapters/postgresql/index.min.cjs +11 -11
  27. package/dist/cjs/orm/adapters/postgresql/index.min.cjs.map +1 -1
  28. package/dist/cjs/server/adapters/express/index.cjs +291 -225
  29. package/dist/cjs/server/adapters/express/index.cjs.map +1 -1
  30. package/dist/cjs/server/adapters/express/index.min.cjs +7 -7
  31. package/dist/cjs/server/adapters/express/index.min.cjs.map +1 -1
  32. package/dist/cjs/server/adapters/fastify/index.cjs +276 -210
  33. package/dist/cjs/server/adapters/fastify/index.cjs.map +1 -1
  34. package/dist/cjs/server/adapters/fastify/index.min.cjs +7 -7
  35. package/dist/cjs/server/adapters/fastify/index.min.cjs.map +1 -1
  36. package/dist/cjs/server/index.cjs +81 -15
  37. package/dist/cjs/server/index.cjs.map +1 -1
  38. package/dist/cjs/server/index.min.cjs +7 -7
  39. package/dist/cjs/server/index.min.cjs.map +1 -1
  40. package/dist/cjs/utilities/index.cjs +0 -5
  41. package/dist/cjs/utilities/index.cjs.map +1 -1
  42. package/dist/cjs/utilities/index.min.cjs +2 -2
  43. package/dist/cjs/utilities/index.min.cjs.map +1 -1
  44. package/dist/esm/cache/adapters/in-memory/index.min.mjs +1 -1
  45. package/dist/esm/cache/adapters/in-memory/index.min.mjs.map +1 -1
  46. package/dist/esm/cache/adapters/in-memory/index.mjs +6 -3
  47. package/dist/esm/cache/adapters/in-memory/index.mjs.map +1 -1
  48. package/dist/esm/cache/adapters/redis/index.min.mjs +1 -1
  49. package/dist/esm/cache/adapters/redis/index.mjs +5 -3
  50. package/dist/esm/cache/index.min.mjs +1 -1
  51. package/dist/esm/cache/index.mjs +2 -2
  52. package/dist/esm/{chunk-5PZACGPI.mjs → chunk-26BOI6IL.mjs} +7 -5
  53. package/dist/esm/{chunk-5PZACGPI.mjs.map → chunk-26BOI6IL.mjs.map} +1 -1
  54. package/dist/esm/{chunk-7SQ5JQYR.min.mjs → chunk-AODOD22O.min.mjs} +2 -2
  55. package/dist/esm/chunk-APSDCRY5.min.mjs +32 -0
  56. package/dist/esm/chunk-APSDCRY5.min.mjs.map +1 -0
  57. package/dist/esm/{chunk-A4P7P6BU.mjs → chunk-CEYT5YBA.mjs} +157 -347
  58. package/dist/esm/chunk-CEYT5YBA.mjs.map +1 -0
  59. package/dist/esm/chunk-CU2HU5UE.min.mjs +2 -0
  60. package/dist/esm/chunk-CU2HU5UE.min.mjs.map +1 -0
  61. package/dist/esm/chunk-DAK7OKSH.min.mjs +2 -0
  62. package/dist/esm/{chunk-MQXTTWPS.min.mjs.map → chunk-DAK7OKSH.min.mjs.map} +1 -1
  63. package/dist/esm/{chunk-IRYCN6PI.min.mjs → chunk-DAUQA32Q.min.mjs} +2 -2
  64. package/dist/esm/{chunk-BWUFPMVG.mjs → chunk-FQYRVHQT.mjs} +2 -2
  65. package/dist/esm/chunk-NEF3UYFA.mjs +144 -0
  66. package/dist/esm/chunk-NEF3UYFA.mjs.map +1 -0
  67. package/dist/esm/chunk-NNFUYHQ7.mjs +135 -0
  68. package/dist/esm/chunk-NNFUYHQ7.mjs.map +1 -0
  69. package/dist/esm/{chunk-7CP7ZE2O.mjs → chunk-PCEHFZ6G.mjs} +9 -5
  70. package/dist/esm/{chunk-7CP7ZE2O.mjs.map → chunk-PCEHFZ6G.mjs.map} +1 -1
  71. package/dist/esm/{chunk-P4PRHHIY.min.mjs → chunk-QCCDJLBH.min.mjs} +2 -2
  72. package/dist/esm/{chunk-3TP7NINX.mjs → chunk-RIXTQQUU.mjs} +2 -2
  73. package/dist/esm/{chunk-LKS5ZE45.mjs → chunk-RPPYCWXW.mjs} +2 -2
  74. package/dist/esm/{chunk-HXFNN6RI.mjs → chunk-T2O72JBW.mjs} +3 -3
  75. package/dist/esm/{chunk-TSVHZZE4.mjs → chunk-VQO4MSEC.mjs} +5 -5
  76. package/dist/esm/{chunk-676VIABN.min.mjs → chunk-X7VNAGLR.min.mjs} +2 -2
  77. package/dist/esm/chunk-XTXAEBXY.min.mjs +2 -0
  78. package/dist/esm/{chunk-7NF7PV6S.min.mjs.map → chunk-XTXAEBXY.min.mjs.map} +1 -1
  79. package/dist/esm/{chunk-2GGMLKRP.min.mjs → chunk-YDQW6ETS.min.mjs} +2 -2
  80. package/dist/esm/chunk-ZDBDR3IB.min.mjs +2 -0
  81. package/dist/esm/chunk-ZDBDR3IB.min.mjs.map +1 -0
  82. package/dist/esm/dbs/adapters/mongodb/index.min.mjs +1 -1
  83. package/dist/esm/dbs/adapters/mongodb/index.min.mjs.map +1 -1
  84. package/dist/esm/dbs/adapters/mongodb/index.mjs +8 -5
  85. package/dist/esm/dbs/adapters/mongodb/index.mjs.map +1 -1
  86. package/dist/esm/dbs/index.min.mjs +1 -1
  87. package/dist/esm/dbs/index.mjs +5 -3
  88. package/dist/esm/errors/index.min.mjs +1 -1
  89. package/dist/esm/errors/index.mjs +1 -1
  90. package/dist/esm/events/adapters/kafka/index.min.mjs +1 -1
  91. package/dist/esm/events/adapters/kafka/index.mjs +4 -2
  92. package/dist/esm/events/adapters/rabbitmq/index.min.mjs +1 -1
  93. package/dist/esm/events/adapters/rabbitmq/index.min.mjs.map +1 -1
  94. package/dist/esm/events/adapters/rabbitmq/index.mjs +7 -3
  95. package/dist/esm/events/adapters/rabbitmq/index.mjs.map +1 -1
  96. package/dist/esm/index.min.mjs +1 -1
  97. package/dist/esm/index.mjs +1 -1
  98. package/dist/esm/instance/index.min.mjs +1 -1
  99. package/dist/esm/instance/index.mjs +1 -1
  100. package/dist/esm/{introspection-YJF3QAUK.mjs → introspection-FGDVYTPP.mjs} +3 -3
  101. package/dist/esm/introspection-UDWDS6DV.min.mjs +2 -0
  102. package/dist/esm/jobs/adapters/redis/index.min.mjs +1 -1
  103. package/dist/esm/jobs/adapters/redis/index.min.mjs.map +1 -1
  104. package/dist/esm/jobs/adapters/redis/index.mjs +10 -6
  105. package/dist/esm/jobs/adapters/redis/index.mjs.map +1 -1
  106. package/dist/esm/orm/adapters/in-memory/index.min.mjs +1 -1
  107. package/dist/esm/orm/adapters/in-memory/index.mjs +4 -3
  108. package/dist/esm/orm/adapters/json/index.min.mjs +1 -1
  109. package/dist/esm/orm/adapters/json/index.min.mjs.map +1 -1
  110. package/dist/esm/orm/adapters/json/index.mjs +6 -5
  111. package/dist/esm/orm/adapters/json/index.mjs.map +1 -1
  112. package/dist/esm/orm/adapters/mongodb/index.min.mjs +1 -1
  113. package/dist/esm/orm/adapters/mongodb/index.min.mjs.map +1 -1
  114. package/dist/esm/orm/adapters/mongodb/index.mjs +6 -4
  115. package/dist/esm/orm/adapters/mongodb/index.mjs.map +1 -1
  116. package/dist/esm/orm/adapters/postgresql/index.min.mjs +2 -2
  117. package/dist/esm/orm/adapters/postgresql/index.min.mjs.map +1 -1
  118. package/dist/esm/orm/adapters/postgresql/index.mjs +8 -5
  119. package/dist/esm/orm/adapters/postgresql/index.mjs.map +1 -1
  120. package/dist/esm/orm/index.min.mjs +1 -1
  121. package/dist/esm/orm/index.mjs +3 -3
  122. package/dist/esm/server/adapters/express/index.min.mjs +1 -1
  123. package/dist/esm/server/adapters/express/index.min.mjs.map +1 -1
  124. package/dist/esm/server/adapters/express/index.mjs +7 -3
  125. package/dist/esm/server/adapters/express/index.mjs.map +1 -1
  126. package/dist/esm/server/adapters/fastify/index.min.mjs +1 -1
  127. package/dist/esm/server/adapters/fastify/index.min.mjs.map +1 -1
  128. package/dist/esm/server/adapters/fastify/index.mjs +7 -3
  129. package/dist/esm/server/adapters/fastify/index.mjs.map +1 -1
  130. package/dist/esm/server/index.min.mjs +1 -1
  131. package/dist/esm/server/index.mjs +1 -1
  132. package/dist/esm/utilities/index.min.mjs +1 -1
  133. package/dist/esm/utilities/index.mjs +5 -4
  134. package/dist/esm/validations/index.min.mjs +1 -1
  135. package/dist/esm/validations/index.mjs +1 -1
  136. package/dist/types/{base-BDTBLZ9a.d.ts → base-qDndMBf8.d.ts} +2 -2
  137. package/dist/types/cache/adapters/in-memory/index.js +7 -4
  138. package/dist/types/cache/adapters/redis/index.js +5 -3
  139. package/dist/types/cache/index.js +2 -2
  140. package/dist/types/{chunk-4DH3POYM.js → chunk-35CDCTLR.js} +4 -4
  141. package/dist/types/{chunk-J3TGB5YQ.js → chunk-4YQA5GPT.js} +8 -4
  142. package/dist/types/{chunk-YLJNBL6J.js → chunk-AQIV47BY.js} +6 -4
  143. package/dist/types/{chunk-TT5EORDK.js → chunk-BKDWUJRG.js} +156 -346
  144. package/dist/types/{chunk-5Z26ZURE.js → chunk-DA2VYP7D.js} +1 -1
  145. package/dist/types/{chunk-LPB5LS7A.js → chunk-GDMGPX4C.js} +1 -1
  146. package/dist/types/chunk-H5V6ADFD.js +134 -0
  147. package/dist/types/{chunk-IZDJDGOV.js → chunk-OOKJEMQI.js} +2 -2
  148. package/dist/types/chunk-PPD4WDG6.js +143 -0
  149. package/dist/types/{chunk-55CTVK7R.js → chunk-T7K7PO6G.js} +1 -1
  150. package/dist/types/dbs/adapters/mongodb/index.js +8 -5
  151. package/dist/types/dbs/index.js +5 -3
  152. package/dist/types/errors/index.js +1 -1
  153. package/dist/types/events/adapters/kafka/index.js +4 -2
  154. package/dist/types/events/adapters/rabbitmq/index.js +7 -3
  155. package/dist/types/index.js +1 -1
  156. package/dist/types/instance/index.js +1 -1
  157. package/dist/types/{introspection-EHGM4RMO.js → introspection-FSNS33CQ.js} +2 -2
  158. package/dist/types/jobs/adapters/redis/index.js +10 -6
  159. package/dist/types/orm/adapters/in-memory/index.js +4 -3
  160. package/dist/types/orm/adapters/json/index.js +6 -5
  161. package/dist/types/orm/adapters/mongodb/index.js +6 -4
  162. package/dist/types/orm/adapters/postgresql/index.js +8 -5
  163. package/dist/types/orm/index.js +3 -3
  164. package/dist/types/server/adapters/express/index.d.ts +1 -1
  165. package/dist/types/server/adapters/express/index.js +7 -3
  166. package/dist/types/server/adapters/fastify/index.d.ts +1 -1
  167. package/dist/types/server/adapters/fastify/index.js +7 -3
  168. package/dist/types/server/index.d.ts +2 -2
  169. package/dist/types/server/index.js +1 -1
  170. package/dist/types/utilities/index.d.ts +1 -2
  171. package/dist/types/utilities/index.js +5 -4
  172. package/dist/types/validations/index.js +1 -1
  173. package/package.json +1 -1
  174. package/dist/esm/chunk-7NF7PV6S.min.mjs +0 -2
  175. package/dist/esm/chunk-A4P7P6BU.mjs.map +0 -1
  176. package/dist/esm/chunk-IN5YKIJ7.min.mjs +0 -32
  177. package/dist/esm/chunk-IN5YKIJ7.min.mjs.map +0 -1
  178. package/dist/esm/chunk-MQXTTWPS.min.mjs +0 -2
  179. package/dist/esm/introspection-THKMXV5V.min.mjs +0 -2
  180. /package/dist/esm/{chunk-7SQ5JQYR.min.mjs.map → chunk-AODOD22O.min.mjs.map} +0 -0
  181. /package/dist/esm/{chunk-IRYCN6PI.min.mjs.map → chunk-DAUQA32Q.min.mjs.map} +0 -0
  182. /package/dist/esm/{chunk-BWUFPMVG.mjs.map → chunk-FQYRVHQT.mjs.map} +0 -0
  183. /package/dist/esm/{chunk-P4PRHHIY.min.mjs.map → chunk-QCCDJLBH.min.mjs.map} +0 -0
  184. /package/dist/esm/{chunk-3TP7NINX.mjs.map → chunk-RIXTQQUU.mjs.map} +0 -0
  185. /package/dist/esm/{chunk-LKS5ZE45.mjs.map → chunk-RPPYCWXW.mjs.map} +0 -0
  186. /package/dist/esm/{chunk-HXFNN6RI.mjs.map → chunk-T2O72JBW.mjs.map} +0 -0
  187. /package/dist/esm/{chunk-TSVHZZE4.mjs.map → chunk-VQO4MSEC.mjs.map} +0 -0
  188. /package/dist/esm/{chunk-676VIABN.min.mjs.map → chunk-X7VNAGLR.min.mjs.map} +0 -0
  189. /package/dist/esm/{chunk-2GGMLKRP.min.mjs.map → chunk-YDQW6ETS.min.mjs.map} +0 -0
  190. /package/dist/esm/{introspection-THKMXV5V.min.mjs.map → introspection-FGDVYTPP.mjs.map} +0 -0
  191. /package/dist/esm/{introspection-YJF3QAUK.mjs.map → introspection-UDWDS6DV.min.mjs.map} +0 -0
@@ -1 +1 @@
1
- {"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"]}
1
+ {"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"]}
@@ -1,2 +1,2 @@
1
- import{E as C,f as A,g as _,j as v,l as O,m as q,n as D,o as F,p as B,q as S,r as E,s as R}from "../../../chunk-7SQ5JQYR.min.mjs";import{a as d,m as k}from "../../../chunk-IN5YKIJ7.min.mjs";import"../../../chunk-DSUJ5FUL.min.mjs";import"../../../chunk-AQY7QVYI.min.mjs";import{AsyncLocalStorage as U}from"async_hooks";import{MongoClient as L}from"mongodb";import{v as x}from"valleyed";function m(s,o){let e=[];for(let r of s.children){let a=T(r,o);a&&e.push(a)}return e.length===0?{}:e.length===1?e[0]:{$and:e}}function b(s,o,e){let r=m(s,e),a=o?.orderBy??[],n=a.length>0?Object.fromEntries(a.map(c=>[h(c.field,e),c.direction==="desc"?-1:1])):void 0,t=o?.select??[],i=t.length>0?Object.fromEntries(t.map(c=>[h(c,e),1])):void 0;return{filter:r,sort:n,limit:o?.limit,skip:o?.offset,projection:i}}function h(s,o){return s==="id"&&o==="_id"?"_id":s}function P(s,o){let e=h(s.field,o);switch(s.op){case"eq":return{[e]:{$eq:s.value}};case"ne":return{[e]:{$ne:s.value}};case"gt":return{[e]:{$gt:s.value}};case"gte":return{[e]:{$gte:s.value}};case"lt":return{[e]:{$lt:s.value}};case"lte":return{[e]:{$lte:s.value}};case"in":return{[e]:{$in:s.value}};case"notIn":return{[e]:{$nin:s.value}};case"like":return{[e]:{$regex:new RegExp(String(s.value),"i")}};case"exists":return{[e]:{$exists:!0,$ne:null}};case"notExists":return{[e]:{$eq:null}};case"contains":return{[e]:{$all:Array.isArray(s.value)?s.value:[s.value]}};case"notContains":return{[e]:{$not:{$all:Array.isArray(s.value)?s.value:[s.value]}}};default:return{[e]:{$eq:s.value}}}}function T(s,o){return s instanceof A?P(s,o):s instanceof _?G(s,o):null}function G(s,o){let e=s.children.map(r=>T(r,o)).filter(r=>r!==null);return e.length===0?null:e.length===1?e[0]:{[s.op==="or"?"$or":"$and"]:e}}function w(s){let o={},e={},r={},a={},n={},t={},i={},c={};for(let[u,p]of Object.entries(s))if(p instanceof O)e[u]=p.value;else if(p instanceof q)r[u]=p.value;else if(p instanceof D)a[u]=p.value;else if(p instanceof F)n[u]=p.value;else if(p instanceof B)t[u]="";else if(p instanceof S)i[u]=p.value;else if(p instanceof E)c[u]=p.value;else if(p instanceof R){let y=p.value;for(let[g,f]of Object.entries(y))o[`${u}.${g}`]=f}else o[u]=p;let l={};return Object.keys(o).length&&(l.$set=o),Object.keys(e).length&&(l.$inc=e),Object.keys(r).length&&(l.$mul=r),Object.keys(a).length&&(l.$min=a),Object.keys(n).length&&(l.$max=n),Object.keys(t).length&&(l.$unset=t),Object.keys(i).length&&(l.$push=i),Object.keys(c).length&&(l.$pull=c),l}function M(s){return w(C(s))}function I(s,o){let e=[];if(s.where){let t=m(s.where,o);Object.keys(t).length>0&&e.push({$match:t})}let r=s.groupBy.length>0?Object.fromEntries(s.groupBy.map(t=>[t,`$${h(t,o)}`])):null,a={};for(let t of s.aggregates){let i=t.field?`$${h(t.field,o)}`:void 0;switch(t.fn){case"count":a[t.alias]={$sum:1};break;case"countDistinct":a[t.alias]={$addToSet:i};break;case"sum":case"avg":case"min":case"max":a[t.alias]={[`$${t.fn}`]:i};break}}e.push({$group:{_id:r,...a}});let n={_id:0};for(let t of s.groupBy)n[t]=`$_id.${t}`;for(let t of s.aggregates)t.fn==="countDistinct"?n[t.alias]={$size:`$${t.alias}`}:n[t.alias]=1;if(e.push({$project:n}),s.having){let t=m(s.having,"");Object.keys(t).length>0&&e.push({$match:t})}return e}var N=()=>x.object({db:x.string(),col:x.string()}),z=()=>x.object({uri:x.string()}),$="equipped_migrations",j=class extends k(z,v){schemaConfigPipe=N();queryableOps=["eq","ne","gt","gte","lt","lte","in","notIn","like","exists","notExists","contains","notContains"];updateOps=["set","inc","mul","min","max","unset","push","pull","patch"];aggregateOps=["count","countDistinct","sum","avg","min","max"];supportedFieldTypes=["string","number","boolean","null","object","array","date"];client;#e=new U;constructor(o,e){super(o),this.client=new L(o.uri,{...e,ignoreUndefined:!0})}#t(o){return this.client.db(o.db).collection(o.col)}async connect(){try{await this.client.connect()}catch(o){throw new d("Failed to connect MongoDB client",{adapter:"mongodb"},o)}}async disconnect(){try{await this.client.close()}catch(o){throw new d("Failed to disconnect MongoDB client",{adapter:"mongodb"},o)}}async findByPk(o,e,r){let a=e;try{let n=o.pkField.name;return await this.#t(a).findOne({[n]:r},{session:this.#e.getStore()})}catch(n){throw new d("MongoDB findByPk failed",{adapter:"mongodb",operation:"findByPk",collection:a.col},n)}}async createMany(o,e,r){let a=e;try{let n=this.#t(a),t=r.map(i=>i);return await n.insertMany(t,{session:this.#e.getStore()}),r}catch(n){throw new d("MongoDB createMany failed",{adapter:"mongodb",operation:"createMany",collection:a.col},n)}}async updateByPk(o,e,r,a){let n=e;try{let t=o.pkField.name,i=this.#t(n),c=M(a);return Object.keys(c).length===0?await i.findOne({[t]:r},{session:this.#e.getStore()}):await i.findOneAndUpdate({[t]:r},c,{returnDocument:"after",session:this.#e.getStore()})}catch(t){throw new d("MongoDB updateByPk failed",{adapter:"mongodb",operation:"updateByPk",collection:n.col},t)}}async deleteByPk(o,e,r){let a=e;try{let n=o.pkField.name;return await this.#t(a).findOneAndDelete({[n]:r},{session:this.#e.getStore()})}catch(n){throw new d("MongoDB deleteByPk failed",{adapter:"mongodb",operation:"deleteByPk",collection:a.col},n)}}async raw(o,e,r){let a=e;try{return await this.#t(a).aggregate(r,{session:this.#e.getStore()}).toArray()}catch(n){throw n instanceof d?n:new d("MongoDB raw failed",{adapter:"mongodb",operation:"raw",collection:a.col},n)}}async aggregate(o,e,r){let a=e;try{let n=o.pkField.name,t=this.#t(a),i=I(r,n);return await t.aggregate(i,{session:this.#e.getStore()}).toArray()}catch(n){throw n instanceof d?n:new d("MongoDB aggregate failed",{adapter:"mongodb",operation:"aggregate",collection:a.col},n)}}async findMany(o,e,r,a){let n=e;try{let t=o.pkField.name,{filter:i,sort:c,limit:l,skip:u,projection:p}=b(r,a,t),g=this.#t(n).find(i,{session:this.#e.getStore(),projection:p});return c&&(g=g.sort(c)),l&&(g=g.limit(l)),u&&(g=g.skip(u)),await g.toArray()}catch(t){throw new d("MongoDB findMany failed",{adapter:"mongodb",operation:"findMany",collection:n.col},t)}}async count(o,e,r){let a=e;try{let n=o.pkField.name;return await this.#t(a).countDocuments(m(r,n),{session:this.#e.getStore()})}catch(n){throw new d("MongoDB count failed",{adapter:"mongodb",operation:"count",collection:a.col},n)}}async*iterateMany(o,e,r,a){let n=e,t;try{let i=o.pkField.name,{filter:c,sort:l,limit:u,skip:p,projection:y}=b(r,a,i);t=this.#t(n).find(c,{session:this.#e.getStore(),projection:y}),l&&(t=t.sort(l)),u&&(t=t.limit(u)),p&&(t=t.skip(p)),a?.batchSize!==void 0&&(t=t.batchSize(a.batchSize));for await(let f of t)yield f}catch(i){throw new d("MongoDB iterateMany failed",{adapter:"mongodb",operation:"iterateMany",collection:n.col},i)}finally{await t?.close()}}async updateMany(o,e,r,a){let n=e;try{let t=o.pkField.name,i=this.#t(n),c=this.#e.getStore(),l=m(r,t),p=(await i.find(l,{session:c,projection:{[t]:1}}).toArray()).map(f=>f[t]),y={[t]:{$in:p}},g=w(a);return Object.keys(g).length>0&&await i.updateMany(y,g,{session:c}),await i.find({[t]:{$in:p}},{session:c}).toArray()}catch(t){throw new d("MongoDB updateMany failed",{adapter:"mongodb",operation:"updateMany",collection:n.col},t)}}async deleteMany(o,e,r){let a=e;try{let n=o.pkField.name,t=this.#t(a),i=this.#e.getStore(),c=m(r,n),l=await t.find(c,{session:i}).toArray();return l.length>0&&await t.deleteMany(c,{session:i}),l}catch(n){throw new d("MongoDB deleteMany failed",{adapter:"mongodb",operation:"deleteMany",collection:a.col},n)}}async upsertOne(o,e,r,a,n){let t=e;try{let i=o.pkField.name,c=this.#t(t),l=m(r,i),u=M(n);return await c.findOneAndUpdate(l,{...u,$setOnInsert:a},{returnDocument:"after",session:this.#e.getStore(),upsert:!0})}catch(i){throw new d("MongoDB upsertOne failed",{adapter:"mongodb",operation:"upsertOne",collection:t.col},i)}}async session(o){if(this.#e.getStore())return o();try{let e=await this.client.startSession();try{return await e.withTransaction(async()=>this.#e.run(e,o))}finally{await e.endSession()}}catch(e){throw e instanceof d?e:new d("MongoDB session failed",{adapter:"mongodb",operation:"session"},e)}}async loadMigrations(){return(await this.client.db().collection($).find({}).toArray()).map(r=>({id:String(r._id),appliedAt:r.appliedAt}))}async recordMigration(o,e){await this.client.db().collection($).insertOne({_id:o,appliedAt:e})}async applyAddIndex(o){let e=this.client.db(),r={};for(let n of o.on)r[n]=1;let a=o.name??`${o.table}_${o.on.join("_")}_idx`;await e.collection(o.table).createIndex(r,{unique:o.unique??!1,name:a})}async applyDropIndex(o){let e=this.client.db(),r=await e.listCollections().toArray();for(let a of r)if((await e.collection(a.name).listIndexes().toArray()).some(t=>t.name===o.name)){await e.collection(a.name).dropIndex(o.name);return}}async introspect(){let o=this.client.db(),e=await o.listCollections().toArray(),r=[];for(let a of e){if(a.name===$)continue;let t=(await o.collection(a.name).listIndexes().toArray()).filter(i=>i.name!=="_id_").map(i=>({name:i.name,on:Object.keys(i.key),unique:!!i.unique}));r.push({name:a.name,pk:void 0,fields:[],indexes:t,foreignKeys:[]})}return r}};export{j as MongoDbAdapter};
1
+ import{a as k}from "../../../chunk-CU2HU5UE.min.mjs";import{E as C,f as A,g as _,j as v,l as O,m as q,n as D,o as F,p as B,q as S,r as E,s as R}from "../../../chunk-AODOD22O.min.mjs";import{a as d}from "../../../chunk-APSDCRY5.min.mjs";import"../../../chunk-DSUJ5FUL.min.mjs";import"../../../chunk-AQY7QVYI.min.mjs";import{AsyncLocalStorage as U}from"async_hooks";import{MongoClient as L}from"mongodb";import{v as x}from"valleyed";function m(s,o){let e=[];for(let r of s.children){let a=T(r,o);a&&e.push(a)}return e.length===0?{}:e.length===1?e[0]:{$and:e}}function b(s,o,e){let r=m(s,e),a=o?.orderBy??[],n=a.length>0?Object.fromEntries(a.map(c=>[h(c.field,e),c.direction==="desc"?-1:1])):void 0,t=o?.select??[],i=t.length>0?Object.fromEntries(t.map(c=>[h(c,e),1])):void 0;return{filter:r,sort:n,limit:o?.limit,skip:o?.offset,projection:i}}function h(s,o){return s==="id"&&o==="_id"?"_id":s}function P(s,o){let e=h(s.field,o);switch(s.op){case"eq":return{[e]:{$eq:s.value}};case"ne":return{[e]:{$ne:s.value}};case"gt":return{[e]:{$gt:s.value}};case"gte":return{[e]:{$gte:s.value}};case"lt":return{[e]:{$lt:s.value}};case"lte":return{[e]:{$lte:s.value}};case"in":return{[e]:{$in:s.value}};case"notIn":return{[e]:{$nin:s.value}};case"like":return{[e]:{$regex:new RegExp(String(s.value),"i")}};case"exists":return{[e]:{$exists:!0,$ne:null}};case"notExists":return{[e]:{$eq:null}};case"contains":return{[e]:{$all:Array.isArray(s.value)?s.value:[s.value]}};case"notContains":return{[e]:{$not:{$all:Array.isArray(s.value)?s.value:[s.value]}}};default:return{[e]:{$eq:s.value}}}}function T(s,o){return s instanceof A?P(s,o):s instanceof _?G(s,o):null}function G(s,o){let e=s.children.map(r=>T(r,o)).filter(r=>r!==null);return e.length===0?null:e.length===1?e[0]:{[s.op==="or"?"$or":"$and"]:e}}function w(s){let o={},e={},r={},a={},n={},t={},i={},c={};for(let[u,p]of Object.entries(s))if(p instanceof O)e[u]=p.value;else if(p instanceof q)r[u]=p.value;else if(p instanceof D)a[u]=p.value;else if(p instanceof F)n[u]=p.value;else if(p instanceof B)t[u]="";else if(p instanceof S)i[u]=p.value;else if(p instanceof E)c[u]=p.value;else if(p instanceof R){let y=p.value;for(let[g,f]of Object.entries(y))o[`${u}.${g}`]=f}else o[u]=p;let l={};return Object.keys(o).length&&(l.$set=o),Object.keys(e).length&&(l.$inc=e),Object.keys(r).length&&(l.$mul=r),Object.keys(a).length&&(l.$min=a),Object.keys(n).length&&(l.$max=n),Object.keys(t).length&&(l.$unset=t),Object.keys(i).length&&(l.$push=i),Object.keys(c).length&&(l.$pull=c),l}function M(s){return w(C(s))}function I(s,o){let e=[];if(s.where){let t=m(s.where,o);Object.keys(t).length>0&&e.push({$match:t})}let r=s.groupBy.length>0?Object.fromEntries(s.groupBy.map(t=>[t,`$${h(t,o)}`])):null,a={};for(let t of s.aggregates){let i=t.field?`$${h(t.field,o)}`:void 0;switch(t.fn){case"count":a[t.alias]={$sum:1};break;case"countDistinct":a[t.alias]={$addToSet:i};break;case"sum":case"avg":case"min":case"max":a[t.alias]={[`$${t.fn}`]:i};break}}e.push({$group:{_id:r,...a}});let n={_id:0};for(let t of s.groupBy)n[t]=`$_id.${t}`;for(let t of s.aggregates)t.fn==="countDistinct"?n[t.alias]={$size:`$${t.alias}`}:n[t.alias]=1;if(e.push({$project:n}),s.having){let t=m(s.having,"");Object.keys(t).length>0&&e.push({$match:t})}return e}var N=()=>x.object({db:x.string(),col:x.string()}),z=()=>x.object({uri:x.string()}),$="equipped_migrations",j=class extends k(z,v){schemaConfigPipe=N();queryableOps=["eq","ne","gt","gte","lt","lte","in","notIn","like","exists","notExists","contains","notContains"];updateOps=["set","inc","mul","min","max","unset","push","pull","patch"];aggregateOps=["count","countDistinct","sum","avg","min","max"];supportedFieldTypes=["string","number","boolean","null","object","array","date"];client;#e=new U;constructor(o,e){super(o),this.client=new L(o.uri,{...e,ignoreUndefined:!0})}#t(o){return this.client.db(o.db).collection(o.col)}async connect(){try{await this.client.connect()}catch(o){throw new d("Failed to connect MongoDB client",{adapter:"mongodb"},o)}}async disconnect(){try{await this.client.close()}catch(o){throw new d("Failed to disconnect MongoDB client",{adapter:"mongodb"},o)}}async findByPk(o,e,r){let a=e;try{let n=o.pkField.name;return await this.#t(a).findOne({[n]:r},{session:this.#e.getStore()})}catch(n){throw new d("MongoDB findByPk failed",{adapter:"mongodb",operation:"findByPk",collection:a.col},n)}}async createMany(o,e,r){let a=e;try{let n=this.#t(a),t=r.map(i=>i);return await n.insertMany(t,{session:this.#e.getStore()}),r}catch(n){throw new d("MongoDB createMany failed",{adapter:"mongodb",operation:"createMany",collection:a.col},n)}}async updateByPk(o,e,r,a){let n=e;try{let t=o.pkField.name,i=this.#t(n),c=M(a);return Object.keys(c).length===0?await i.findOne({[t]:r},{session:this.#e.getStore()}):await i.findOneAndUpdate({[t]:r},c,{returnDocument:"after",session:this.#e.getStore()})}catch(t){throw new d("MongoDB updateByPk failed",{adapter:"mongodb",operation:"updateByPk",collection:n.col},t)}}async deleteByPk(o,e,r){let a=e;try{let n=o.pkField.name;return await this.#t(a).findOneAndDelete({[n]:r},{session:this.#e.getStore()})}catch(n){throw new d("MongoDB deleteByPk failed",{adapter:"mongodb",operation:"deleteByPk",collection:a.col},n)}}async raw(o,e,r){let a=e;try{return await this.#t(a).aggregate(r,{session:this.#e.getStore()}).toArray()}catch(n){throw n instanceof d?n:new d("MongoDB raw failed",{adapter:"mongodb",operation:"raw",collection:a.col},n)}}async aggregate(o,e,r){let a=e;try{let n=o.pkField.name,t=this.#t(a),i=I(r,n);return await t.aggregate(i,{session:this.#e.getStore()}).toArray()}catch(n){throw n instanceof d?n:new d("MongoDB aggregate failed",{adapter:"mongodb",operation:"aggregate",collection:a.col},n)}}async findMany(o,e,r,a){let n=e;try{let t=o.pkField.name,{filter:i,sort:c,limit:l,skip:u,projection:p}=b(r,a,t),g=this.#t(n).find(i,{session:this.#e.getStore(),projection:p});return c&&(g=g.sort(c)),l&&(g=g.limit(l)),u&&(g=g.skip(u)),await g.toArray()}catch(t){throw new d("MongoDB findMany failed",{adapter:"mongodb",operation:"findMany",collection:n.col},t)}}async count(o,e,r){let a=e;try{let n=o.pkField.name;return await this.#t(a).countDocuments(m(r,n),{session:this.#e.getStore()})}catch(n){throw new d("MongoDB count failed",{adapter:"mongodb",operation:"count",collection:a.col},n)}}async*iterateMany(o,e,r,a){let n=e,t;try{let i=o.pkField.name,{filter:c,sort:l,limit:u,skip:p,projection:y}=b(r,a,i);t=this.#t(n).find(c,{session:this.#e.getStore(),projection:y}),l&&(t=t.sort(l)),u&&(t=t.limit(u)),p&&(t=t.skip(p)),a?.batchSize!==void 0&&(t=t.batchSize(a.batchSize));for await(let f of t)yield f}catch(i){throw new d("MongoDB iterateMany failed",{adapter:"mongodb",operation:"iterateMany",collection:n.col},i)}finally{await t?.close()}}async updateMany(o,e,r,a){let n=e;try{let t=o.pkField.name,i=this.#t(n),c=this.#e.getStore(),l=m(r,t),p=(await i.find(l,{session:c,projection:{[t]:1}}).toArray()).map(f=>f[t]),y={[t]:{$in:p}},g=w(a);return Object.keys(g).length>0&&await i.updateMany(y,g,{session:c}),await i.find({[t]:{$in:p}},{session:c}).toArray()}catch(t){throw new d("MongoDB updateMany failed",{adapter:"mongodb",operation:"updateMany",collection:n.col},t)}}async deleteMany(o,e,r){let a=e;try{let n=o.pkField.name,t=this.#t(a),i=this.#e.getStore(),c=m(r,n),l=await t.find(c,{session:i}).toArray();return l.length>0&&await t.deleteMany(c,{session:i}),l}catch(n){throw new d("MongoDB deleteMany failed",{adapter:"mongodb",operation:"deleteMany",collection:a.col},n)}}async upsertOne(o,e,r,a,n){let t=e;try{let i=o.pkField.name,c=this.#t(t),l=m(r,i),u=M(n);return await c.findOneAndUpdate(l,{...u,$setOnInsert:a},{returnDocument:"after",session:this.#e.getStore(),upsert:!0})}catch(i){throw new d("MongoDB upsertOne failed",{adapter:"mongodb",operation:"upsertOne",collection:t.col},i)}}async session(o){if(this.#e.getStore())return o();try{let e=await this.client.startSession();try{return await e.withTransaction(async()=>this.#e.run(e,o))}finally{await e.endSession()}}catch(e){throw e instanceof d?e:new d("MongoDB session failed",{adapter:"mongodb",operation:"session"},e)}}async loadMigrations(){return(await this.client.db().collection($).find({}).toArray()).map(r=>({id:String(r._id),appliedAt:r.appliedAt}))}async recordMigration(o,e){await this.client.db().collection($).insertOne({_id:o,appliedAt:e})}async applyAddIndex(o){let e=this.client.db(),r={};for(let n of o.on)r[n]=1;let a=o.name??`${o.table}_${o.on.join("_")}_idx`;await e.collection(o.table).createIndex(r,{unique:o.unique??!1,name:a})}async applyDropIndex(o){let e=this.client.db(),r=await e.listCollections().toArray();for(let a of r)if((await e.collection(a.name).listIndexes().toArray()).some(t=>t.name===o.name)){await e.collection(a.name).dropIndex(o.name);return}}async introspect(){let o=this.client.db(),e=await o.listCollections().toArray(),r=[];for(let a of e){if(a.name===$)continue;let t=(await o.collection(a.name).listIndexes().toArray()).filter(i=>i.name!=="_id_").map(i=>({name:i.name,on:Object.keys(i.key),unique:!!i.unique}));r.push({name:a.name,pk:void 0,fields:[],indexes:t,foreignKeys:[]})}return r}};export{j as MongoDbAdapter};
2
2
  //# sourceMappingURL=index.min.mjs.map