@strapi/database 5.12.1 → 5.12.3

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 (321) hide show
  1. package/dist/connection.js +43 -0
  2. package/dist/connection.js.map +1 -0
  3. package/dist/connection.mjs +41 -0
  4. package/dist/connection.mjs.map +1 -0
  5. package/dist/dialects/dialect.js +54 -0
  6. package/dist/dialects/dialect.js.map +1 -0
  7. package/dist/dialects/dialect.mjs +52 -0
  8. package/dist/dialects/dialect.mjs.map +1 -0
  9. package/dist/dialects/index.js +44 -0
  10. package/dist/dialects/index.js.map +1 -0
  11. package/dist/dialects/index.mjs +42 -0
  12. package/dist/dialects/index.mjs.map +1 -0
  13. package/dist/dialects/mysql/constants.js +8 -0
  14. package/dist/dialects/mysql/constants.js.map +1 -0
  15. package/dist/dialects/mysql/constants.mjs +5 -0
  16. package/dist/dialects/mysql/constants.mjs.map +1 -0
  17. package/dist/dialects/mysql/database-inspector.js +35 -0
  18. package/dist/dialects/mysql/database-inspector.js.map +1 -0
  19. package/dist/dialects/mysql/database-inspector.mjs +33 -0
  20. package/dist/dialects/mysql/database-inspector.mjs.map +1 -0
  21. package/dist/dialects/mysql/index.js +75 -0
  22. package/dist/dialects/mysql/index.js.map +1 -0
  23. package/dist/dialects/mysql/index.mjs +73 -0
  24. package/dist/dialects/mysql/index.mjs.map +1 -0
  25. package/dist/dialects/mysql/schema-inspector.js +297 -0
  26. package/dist/dialects/mysql/schema-inspector.js.map +1 -0
  27. package/dist/dialects/mysql/schema-inspector.mjs +295 -0
  28. package/dist/dialects/mysql/schema-inspector.mjs.map +1 -0
  29. package/dist/dialects/postgresql/index.js +62 -0
  30. package/dist/dialects/postgresql/index.js.map +1 -0
  31. package/dist/dialects/postgresql/index.mjs +60 -0
  32. package/dist/dialects/postgresql/index.mjs.map +1 -0
  33. package/dist/dialects/postgresql/schema-inspector.js +316 -0
  34. package/dist/dialects/postgresql/schema-inspector.js.map +1 -0
  35. package/dist/dialects/postgresql/schema-inspector.mjs +314 -0
  36. package/dist/dialects/postgresql/schema-inspector.mjs.map +1 -0
  37. package/dist/dialects/sqlite/index.js +82 -0
  38. package/dist/dialects/sqlite/index.js.map +1 -0
  39. package/dist/dialects/sqlite/index.mjs +80 -0
  40. package/dist/dialects/sqlite/index.mjs.map +1 -0
  41. package/dist/dialects/sqlite/schema-inspector.js +211 -0
  42. package/dist/dialects/sqlite/schema-inspector.js.map +1 -0
  43. package/dist/dialects/sqlite/schema-inspector.mjs +209 -0
  44. package/dist/dialects/sqlite/schema-inspector.mjs.map +1 -0
  45. package/dist/entity-manager/entity-repository.js +139 -0
  46. package/dist/entity-manager/entity-repository.js.map +1 -0
  47. package/dist/entity-manager/entity-repository.mjs +137 -0
  48. package/dist/entity-manager/entity-repository.mjs.map +1 -0
  49. package/dist/entity-manager/index.js +1186 -0
  50. package/dist/entity-manager/index.js.map +1 -0
  51. package/dist/entity-manager/index.mjs +1184 -0
  52. package/dist/entity-manager/index.mjs.map +1 -0
  53. package/dist/entity-manager/morph-relations.js +73 -0
  54. package/dist/entity-manager/morph-relations.js.map +1 -0
  55. package/dist/entity-manager/morph-relations.mjs +69 -0
  56. package/dist/entity-manager/morph-relations.mjs.map +1 -0
  57. package/dist/entity-manager/regular-relations.js +247 -0
  58. package/dist/entity-manager/regular-relations.js.map +1 -0
  59. package/dist/entity-manager/regular-relations.mjs +242 -0
  60. package/dist/entity-manager/regular-relations.mjs.map +1 -0
  61. package/dist/entity-manager/relations-orderer.js +221 -0
  62. package/dist/entity-manager/relations-orderer.js.map +1 -0
  63. package/dist/entity-manager/relations-orderer.mjs +218 -0
  64. package/dist/entity-manager/relations-orderer.mjs.map +1 -0
  65. package/dist/errors/database.js +13 -0
  66. package/dist/errors/database.js.map +1 -0
  67. package/dist/errors/database.mjs +11 -0
  68. package/dist/errors/database.mjs.map +1 -0
  69. package/dist/errors/index.js +18 -0
  70. package/dist/errors/index.js.map +1 -0
  71. package/dist/errors/index.mjs +7 -0
  72. package/dist/errors/index.mjs.map +1 -0
  73. package/dist/errors/invalid-date.js +13 -0
  74. package/dist/errors/invalid-date.js.map +1 -0
  75. package/dist/errors/invalid-date.mjs +11 -0
  76. package/dist/errors/invalid-date.mjs.map +1 -0
  77. package/dist/errors/invalid-datetime.js +13 -0
  78. package/dist/errors/invalid-datetime.js.map +1 -0
  79. package/dist/errors/invalid-datetime.mjs +11 -0
  80. package/dist/errors/invalid-datetime.mjs.map +1 -0
  81. package/dist/errors/invalid-relation.js +13 -0
  82. package/dist/errors/invalid-relation.js.map +1 -0
  83. package/dist/errors/invalid-relation.mjs +11 -0
  84. package/dist/errors/invalid-relation.mjs.map +1 -0
  85. package/dist/errors/invalid-time.js +13 -0
  86. package/dist/errors/invalid-time.js.map +1 -0
  87. package/dist/errors/invalid-time.mjs +11 -0
  88. package/dist/errors/invalid-time.mjs.map +1 -0
  89. package/dist/errors/not-null.js +17 -0
  90. package/dist/errors/not-null.js.map +1 -0
  91. package/dist/errors/not-null.mjs +15 -0
  92. package/dist/errors/not-null.mjs.map +1 -0
  93. package/dist/fields/biginteger.js +9 -0
  94. package/dist/fields/biginteger.js.map +1 -0
  95. package/dist/fields/biginteger.mjs +7 -0
  96. package/dist/fields/biginteger.mjs.map +1 -0
  97. package/dist/fields/boolean.js +48 -0
  98. package/dist/fields/boolean.js.map +1 -0
  99. package/dist/fields/boolean.mjs +46 -0
  100. package/dist/fields/boolean.mjs.map +1 -0
  101. package/dist/fields/date.js +16 -0
  102. package/dist/fields/date.js.map +1 -0
  103. package/dist/fields/date.mjs +14 -0
  104. package/dist/fields/date.mjs.map +1 -0
  105. package/dist/fields/datetime.js +37 -0
  106. package/dist/fields/datetime.js.map +1 -0
  107. package/dist/fields/datetime.mjs +16 -0
  108. package/dist/fields/datetime.mjs.map +1 -0
  109. package/dist/fields/field.js +16 -0
  110. package/dist/fields/field.js.map +1 -0
  111. package/dist/fields/field.mjs +14 -0
  112. package/dist/fields/field.mjs.map +1 -0
  113. package/dist/fields/index.js +45 -0
  114. package/dist/fields/index.js.map +1 -0
  115. package/dist/fields/index.mjs +43 -0
  116. package/dist/fields/index.mjs.map +1 -0
  117. package/dist/fields/json.js +36 -0
  118. package/dist/fields/json.js.map +1 -0
  119. package/dist/fields/json.mjs +34 -0
  120. package/dist/fields/json.mjs.map +1 -0
  121. package/dist/fields/number.js +20 -0
  122. package/dist/fields/number.js.map +1 -0
  123. package/dist/fields/number.mjs +18 -0
  124. package/dist/fields/number.mjs.map +1 -0
  125. package/dist/fields/shared/parsers.js +91 -0
  126. package/dist/fields/shared/parsers.js.map +1 -0
  127. package/dist/fields/shared/parsers.mjs +68 -0
  128. package/dist/fields/shared/parsers.mjs.map +1 -0
  129. package/dist/fields/string.js +16 -0
  130. package/dist/fields/string.js.map +1 -0
  131. package/dist/fields/string.mjs +14 -0
  132. package/dist/fields/string.mjs.map +1 -0
  133. package/dist/fields/time.js +17 -0
  134. package/dist/fields/time.js.map +1 -0
  135. package/dist/fields/time.mjs +15 -0
  136. package/dist/fields/time.mjs.map +1 -0
  137. package/dist/fields/timestamp.js +37 -0
  138. package/dist/fields/timestamp.js.map +1 -0
  139. package/dist/fields/timestamp.mjs +16 -0
  140. package/dist/fields/timestamp.mjs.map +1 -0
  141. package/dist/index.js +33 -8569
  142. package/dist/index.js.map +1 -1
  143. package/dist/index.mjs +16 -8532
  144. package/dist/index.mjs.map +1 -1
  145. package/dist/lifecycles/index.js +73 -0
  146. package/dist/lifecycles/index.js.map +1 -0
  147. package/dist/lifecycles/index.mjs +71 -0
  148. package/dist/lifecycles/index.mjs.map +1 -0
  149. package/dist/lifecycles/subscribers/index.js +10 -0
  150. package/dist/lifecycles/subscribers/index.js.map +1 -0
  151. package/dist/lifecycles/subscribers/index.mjs +8 -0
  152. package/dist/lifecycles/subscribers/index.mjs.map +1 -0
  153. package/dist/lifecycles/subscribers/models-lifecycles.js +13 -0
  154. package/dist/lifecycles/subscribers/models-lifecycles.js.map +1 -0
  155. package/dist/lifecycles/subscribers/models-lifecycles.mjs +11 -0
  156. package/dist/lifecycles/subscribers/models-lifecycles.mjs.map +1 -0
  157. package/dist/lifecycles/subscribers/timestamps.js +55 -0
  158. package/dist/lifecycles/subscribers/timestamps.js.map +1 -0
  159. package/dist/lifecycles/subscribers/timestamps.mjs +53 -0
  160. package/dist/lifecycles/subscribers/timestamps.mjs.map +1 -0
  161. package/dist/metadata/index.js +24 -0
  162. package/dist/metadata/index.js.map +1 -0
  163. package/dist/metadata/index.mjs +16 -0
  164. package/dist/metadata/index.mjs.map +1 -0
  165. package/dist/metadata/metadata.js +100 -0
  166. package/dist/metadata/metadata.js.map +1 -0
  167. package/dist/metadata/metadata.mjs +98 -0
  168. package/dist/metadata/metadata.mjs.map +1 -0
  169. package/dist/metadata/relations.js +545 -0
  170. package/dist/metadata/relations.js.map +1 -0
  171. package/dist/metadata/relations.mjs +536 -0
  172. package/dist/metadata/relations.mjs.map +1 -0
  173. package/dist/migrations/common.js +8 -0
  174. package/dist/migrations/common.js.map +1 -0
  175. package/dist/migrations/common.mjs +6 -0
  176. package/dist/migrations/common.mjs.map +1 -0
  177. package/dist/migrations/index.js +39 -0
  178. package/dist/migrations/index.js.map +1 -0
  179. package/dist/migrations/index.mjs +37 -0
  180. package/dist/migrations/index.mjs.map +1 -0
  181. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js +179 -0
  182. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js.map +1 -0
  183. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs +177 -0
  184. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs.map +1 -0
  185. package/dist/migrations/internal-migrations/5.0.0-02-document-id.js +125 -0
  186. package/dist/migrations/internal-migrations/5.0.0-02-document-id.js.map +1 -0
  187. package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs +123 -0
  188. package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs.map +1 -0
  189. package/dist/migrations/internal-migrations/5.0.0-03-locale.js +41 -0
  190. package/dist/migrations/internal-migrations/5.0.0-03-locale.js.map +1 -0
  191. package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs +39 -0
  192. package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs.map +1 -0
  193. package/dist/migrations/internal-migrations/5.0.0-04-published-at.js +45 -0
  194. package/dist/migrations/internal-migrations/5.0.0-04-published-at.js.map +1 -0
  195. package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs +43 -0
  196. package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs.map +1 -0
  197. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js +43 -0
  198. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js.map +1 -0
  199. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs +41 -0
  200. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs.map +1 -0
  201. package/dist/migrations/internal-migrations/index.js +26 -0
  202. package/dist/migrations/internal-migrations/index.js.map +1 -0
  203. package/dist/migrations/internal-migrations/index.mjs +24 -0
  204. package/dist/migrations/internal-migrations/index.mjs.map +1 -0
  205. package/dist/migrations/internal.js +63 -0
  206. package/dist/migrations/internal.js.map +1 -0
  207. package/dist/migrations/internal.mjs +61 -0
  208. package/dist/migrations/internal.mjs.map +1 -0
  209. package/dist/migrations/logger.js +24 -0
  210. package/dist/migrations/logger.js.map +1 -0
  211. package/dist/migrations/logger.mjs +22 -0
  212. package/dist/migrations/logger.mjs.map +1 -0
  213. package/dist/migrations/storage.js +39 -0
  214. package/dist/migrations/storage.js.map +1 -0
  215. package/dist/migrations/storage.mjs +37 -0
  216. package/dist/migrations/storage.mjs.map +1 -0
  217. package/dist/migrations/users.js +87 -0
  218. package/dist/migrations/users.js.map +1 -0
  219. package/dist/migrations/users.mjs +85 -0
  220. package/dist/migrations/users.mjs.map +1 -0
  221. package/dist/query/helpers/join.js +127 -0
  222. package/dist/query/helpers/join.js.map +1 -0
  223. package/dist/query/helpers/join.mjs +122 -0
  224. package/dist/query/helpers/join.mjs.map +1 -0
  225. package/dist/query/helpers/order-by.js +167 -0
  226. package/dist/query/helpers/order-by.js.map +1 -0
  227. package/dist/query/helpers/order-by.mjs +163 -0
  228. package/dist/query/helpers/order-by.mjs.map +1 -0
  229. package/dist/query/helpers/populate/apply.js +592 -0
  230. package/dist/query/helpers/populate/apply.js.map +1 -0
  231. package/dist/query/helpers/populate/apply.mjs +590 -0
  232. package/dist/query/helpers/populate/apply.mjs.map +1 -0
  233. package/dist/query/helpers/populate/process.js +92 -0
  234. package/dist/query/helpers/populate/process.js.map +1 -0
  235. package/dist/query/helpers/populate/process.mjs +90 -0
  236. package/dist/query/helpers/populate/process.mjs.map +1 -0
  237. package/dist/query/helpers/search.js +67 -0
  238. package/dist/query/helpers/search.js.map +1 -0
  239. package/dist/query/helpers/search.mjs +65 -0
  240. package/dist/query/helpers/search.mjs.map +1 -0
  241. package/dist/query/helpers/streams/readable.js +131 -0
  242. package/dist/query/helpers/streams/readable.js.map +1 -0
  243. package/dist/query/helpers/streams/readable.mjs +129 -0
  244. package/dist/query/helpers/streams/readable.mjs.map +1 -0
  245. package/dist/query/helpers/transform.js +77 -0
  246. package/dist/query/helpers/transform.js.map +1 -0
  247. package/dist/query/helpers/transform.mjs +73 -0
  248. package/dist/query/helpers/transform.mjs.map +1 -0
  249. package/dist/query/helpers/where.js +372 -0
  250. package/dist/query/helpers/where.js.map +1 -0
  251. package/dist/query/helpers/where.mjs +369 -0
  252. package/dist/query/helpers/where.mjs.map +1 -0
  253. package/dist/query/query-builder.js +507 -0
  254. package/dist/query/query-builder.js.map +1 -0
  255. package/dist/query/query-builder.mjs +505 -0
  256. package/dist/query/query-builder.mjs.map +1 -0
  257. package/dist/repairs/index.js +13 -0
  258. package/dist/repairs/index.js.map +1 -0
  259. package/dist/repairs/index.mjs +11 -0
  260. package/dist/repairs/index.mjs.map +1 -0
  261. package/dist/repairs/operations/remove-orphan-morph-types.js +54 -0
  262. package/dist/repairs/operations/remove-orphan-morph-types.js.map +1 -0
  263. package/dist/repairs/operations/remove-orphan-morph-types.mjs +52 -0
  264. package/dist/repairs/operations/remove-orphan-morph-types.mjs.map +1 -0
  265. package/dist/schema/builder.js +354 -0
  266. package/dist/schema/builder.js.map +1 -0
  267. package/dist/schema/builder.mjs +352 -0
  268. package/dist/schema/builder.mjs.map +1 -0
  269. package/dist/schema/diff.js +379 -0
  270. package/dist/schema/diff.js.map +1 -0
  271. package/dist/schema/diff.mjs +377 -0
  272. package/dist/schema/diff.mjs.map +1 -0
  273. package/dist/schema/index.js +93 -0
  274. package/dist/schema/index.js.map +1 -0
  275. package/dist/schema/index.mjs +91 -0
  276. package/dist/schema/index.mjs.map +1 -0
  277. package/dist/schema/schema.js +266 -0
  278. package/dist/schema/schema.js.map +1 -0
  279. package/dist/schema/schema.mjs +264 -0
  280. package/dist/schema/schema.mjs.map +1 -0
  281. package/dist/schema/storage.js +58 -0
  282. package/dist/schema/storage.js.map +1 -0
  283. package/dist/schema/storage.mjs +56 -0
  284. package/dist/schema/storage.mjs.map +1 -0
  285. package/dist/transaction-context.js +65 -0
  286. package/dist/transaction-context.js.map +1 -0
  287. package/dist/transaction-context.mjs +63 -0
  288. package/dist/transaction-context.mjs.map +1 -0
  289. package/dist/utils/async-curry.js +19 -0
  290. package/dist/utils/async-curry.js.map +1 -0
  291. package/dist/utils/async-curry.mjs +17 -0
  292. package/dist/utils/async-curry.mjs.map +1 -0
  293. package/dist/utils/identifiers/hash.js +30 -0
  294. package/dist/utils/identifiers/hash.js.map +1 -0
  295. package/dist/utils/identifiers/hash.mjs +28 -0
  296. package/dist/utils/identifiers/hash.mjs.map +1 -0
  297. package/dist/utils/identifiers/index.js +414 -0
  298. package/dist/utils/identifiers/index.js.map +1 -0
  299. package/dist/utils/identifiers/index.mjs +411 -0
  300. package/dist/utils/identifiers/index.mjs.map +1 -0
  301. package/dist/utils/knex.js +21 -0
  302. package/dist/utils/knex.js.map +1 -0
  303. package/dist/utils/knex.mjs +18 -0
  304. package/dist/utils/knex.mjs.map +1 -0
  305. package/dist/utils/types.js +51 -0
  306. package/dist/utils/types.js.map +1 -0
  307. package/dist/utils/types.mjs +44 -0
  308. package/dist/utils/types.mjs.map +1 -0
  309. package/dist/validations/index.js +12 -0
  310. package/dist/validations/index.js.map +1 -0
  311. package/dist/validations/index.mjs +10 -0
  312. package/dist/validations/index.mjs.map +1 -0
  313. package/dist/validations/relations/bidirectional.js +64 -0
  314. package/dist/validations/relations/bidirectional.js.map +1 -0
  315. package/dist/validations/relations/bidirectional.mjs +62 -0
  316. package/dist/validations/relations/bidirectional.mjs.map +1 -0
  317. package/dist/validations/relations/index.js +13 -0
  318. package/dist/validations/relations/index.js.map +1 -0
  319. package/dist/validations/relations/index.mjs +11 -0
  320. package/dist/validations/relations/index.mjs.map +1 -0
  321. package/package.json +4 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../src/schema/index.ts"],"sourcesContent":["import createDebug from 'debug';\n\nimport createSchemaBuilder from './builder';\nimport createSchemaDiff from './diff';\nimport createSchemaStorage from './storage';\nimport { metadataToSchema } from './schema';\n\nimport type { Schema, SchemaDiff } from './types';\nimport type { Database } from '..';\n\nexport type * from './types';\n\nconst debug = createDebug('strapi::database');\n\nexport interface SchemaProvider {\n builder: ReturnType<typeof createSchemaBuilder>;\n schemaDiff: ReturnType<typeof createSchemaDiff>;\n schemaStorage: ReturnType<typeof createSchemaStorage>;\n sync(): Promise<SchemaDiff['status']>;\n syncSchema(): Promise<SchemaDiff['status']>;\n reset(): Promise<void>;\n create(): Promise<void>;\n drop(): Promise<void>;\n schema: Schema;\n}\n\ninterface State {\n schema?: Schema;\n}\n\nexport const createSchemaProvider = (db: Database): SchemaProvider => {\n const state: State = {};\n\n return {\n get schema() {\n if (!state.schema) {\n debug('Converting metadata to database schema');\n state.schema = metadataToSchema(db.metadata);\n }\n\n return state.schema;\n },\n builder: createSchemaBuilder(db),\n schemaDiff: createSchemaDiff(db),\n schemaStorage: createSchemaStorage(db),\n\n /**\n * Drops the database schema\n */\n async drop() {\n debug('Dropping database schema');\n\n const DBSchema = await db.dialect.schemaInspector.getSchema();\n await this.builder.dropSchema(DBSchema);\n },\n\n /**\n * Creates the database schema\n */\n async create() {\n debug('Created database schema');\n await this.builder.createSchema(this.schema);\n },\n\n /**\n * Resets the database schema\n */\n async reset() {\n debug('Resetting database schema');\n await this.drop();\n await this.create();\n },\n\n async syncSchema(): Promise<SchemaDiff['status']> {\n debug('Synchronizing database schema');\n\n const databaseSchema = await db.dialect.schemaInspector.getSchema();\n const storedSchema = await this.schemaStorage.read();\n\n /*\n 3way diff - DB schema / previous metadataSchema / new metadataSchema\n\n - When something doesn't exist in the previous metadataSchema -> It's not tracked by us and should be ignored\n - If no previous metadataSchema => use new metadataSchema so we start tracking them and ignore everything else\n - Apply this logic to Tables / Columns / Indexes / FKs ...\n - Handle errors (indexes or fks on incompatible stuff ...)\n\n */\n\n const { status, diff } = await this.schemaDiff.diff({\n previousSchema: storedSchema?.schema,\n databaseSchema,\n userSchema: this.schema,\n });\n\n if (status === 'CHANGED') {\n await this.builder.updateSchema(diff);\n }\n\n await this.schemaStorage.add(this.schema);\n\n return status;\n },\n\n // TODO: support options to migrate softly or forcefully\n // TODO: support option to disable auto migration & run a CLI command instead to avoid doing it at startup\n // TODO: Allow keeping extra indexes / extra tables / extra columns (globally or on a per table basis)\n async sync(): Promise<SchemaDiff['status']> {\n if (await db.migrations.shouldRun()) {\n debug('Found migrations to run');\n await db.migrations.up();\n\n return this.syncSchema();\n }\n\n const oldSchema = await this.schemaStorage.read();\n\n if (!oldSchema) {\n debug('Schema not persisted yet');\n return this.syncSchema();\n }\n\n const { hash: oldHash } = oldSchema;\n const hash = await this.schemaStorage.hashSchema(this.schema);\n\n if (oldHash !== hash) {\n debug('Schema changed');\n\n return this.syncSchema();\n }\n\n debug('Schema unchanged');\n\n return 'UNCHANGED';\n },\n };\n};\n"],"names":["debug","createDebug","createSchemaProvider","db","state","schema","metadataToSchema","metadata","builder","createSchemaBuilder","schemaDiff","createSchemaDiff","schemaStorage","createSchemaStorage","drop","DBSchema","dialect","schemaInspector","getSchema","dropSchema","create","createSchema","reset","syncSchema","databaseSchema","storedSchema","read","status","diff","previousSchema","userSchema","updateSchema","add","sync","migrations","shouldRun","up","oldSchema","hash","oldHash","hashSchema"],"mappings":"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"}
@@ -0,0 +1,266 @@
1
+ 'use strict';
2
+
3
+ var types = require('../utils/types.js');
4
+ var index = require('../utils/identifiers/index.js');
5
+
6
+ /**
7
+ * TODO: This needs to be refactored to support incoming names such as
8
+ * (column, table, index) that are of the form string | NameToken[] so
9
+ * that pieces can be passed through and shortened here.
10
+ *
11
+ * Currently, we are potentially shortening twice, although in reality
12
+ * that won't happen since the shortened attribute column names will
13
+ * fit here because they are already shortened to the max identifier
14
+ * length
15
+ *
16
+ * That is the reason we use getName() here and not getColumnName();
17
+ * we just want the exact shortened name for the value without doing
18
+ * any other potential manipulation to it
19
+ * */ const createColumn = (name, attribute)=>{
20
+ const { type, args = [], ...opts } = getColumnType(attribute);
21
+ return {
22
+ name: index.identifiers.getName(name),
23
+ type,
24
+ args,
25
+ defaultTo: null,
26
+ notNullable: false,
27
+ unsigned: false,
28
+ ...opts,
29
+ ...'column' in attribute ? attribute.column ?? {} : {}
30
+ };
31
+ };
32
+ const createTable = (meta)=>{
33
+ const table = {
34
+ name: meta.tableName,
35
+ indexes: meta.indexes || [],
36
+ foreignKeys: meta.foreignKeys || [],
37
+ columns: []
38
+ };
39
+ for (const key of Object.keys(meta.attributes)){
40
+ const attribute = meta.attributes[key];
41
+ // if (types.isRelation(attribute.type)) {
42
+ if (attribute.type === 'relation') {
43
+ if ('morphColumn' in attribute && attribute.morphColumn && attribute.owner) {
44
+ const { idColumn, typeColumn } = attribute.morphColumn;
45
+ const idColumnName = index.identifiers.getName(idColumn.name);
46
+ const typeColumnName = index.identifiers.getName(typeColumn.name);
47
+ table.columns.push(createColumn(idColumnName, {
48
+ type: 'integer',
49
+ column: {
50
+ unsigned: true
51
+ }
52
+ }));
53
+ table.columns.push(createColumn(typeColumnName, {
54
+ type: 'string'
55
+ }));
56
+ } else if ('joinColumn' in attribute && attribute.joinColumn && attribute.owner && attribute.joinColumn.referencedTable) {
57
+ // NOTE: we could pass uniquness for oneToOne to avoid creating more than one to one
58
+ const { name: columnNameFull, referencedColumn, referencedTable, columnType = 'integer' } = attribute.joinColumn;
59
+ const columnName = index.identifiers.getName(columnNameFull);
60
+ const column = createColumn(columnName, {
61
+ // TODO: find the column type automatically, or allow passing all the column params
62
+ type: columnType,
63
+ column: {
64
+ unsigned: true
65
+ }
66
+ });
67
+ table.columns.push(column);
68
+ const fkName = index.identifiers.getFkIndexName([
69
+ table.name,
70
+ columnName
71
+ ]);
72
+ table.foreignKeys.push({
73
+ name: fkName,
74
+ columns: [
75
+ column.name
76
+ ],
77
+ referencedTable,
78
+ referencedColumns: [
79
+ referencedColumn
80
+ ],
81
+ // NOTE: could allow configuration
82
+ onDelete: 'SET NULL'
83
+ });
84
+ table.indexes.push({
85
+ name: fkName,
86
+ columns: [
87
+ column.name
88
+ ]
89
+ });
90
+ }
91
+ } else if (types.isScalarAttribute(attribute)) {
92
+ const columnName = index.identifiers.getName(attribute.columnName || key);
93
+ const column = createColumn(columnName, attribute);
94
+ if (column.unique) {
95
+ table.indexes.push({
96
+ type: 'unique',
97
+ name: index.identifiers.getUniqueIndexName([
98
+ table.name,
99
+ column.name
100
+ ]),
101
+ columns: [
102
+ columnName
103
+ ]
104
+ });
105
+ }
106
+ if (column.primary) {
107
+ table.indexes.push({
108
+ type: 'primary',
109
+ name: index.identifiers.getPrimaryIndexName([
110
+ table.name,
111
+ column.name
112
+ ]),
113
+ columns: [
114
+ columnName
115
+ ]
116
+ });
117
+ }
118
+ table.columns.push(column);
119
+ }
120
+ }
121
+ return table;
122
+ };
123
+ const getColumnType = (attribute)=>{
124
+ if ('columnType' in attribute && attribute.columnType) {
125
+ return attribute.columnType;
126
+ }
127
+ switch(attribute.type){
128
+ case 'increments':
129
+ {
130
+ return {
131
+ type: 'increments',
132
+ args: [
133
+ {
134
+ primary: true,
135
+ primaryKey: true
136
+ }
137
+ ],
138
+ notNullable: true
139
+ };
140
+ }
141
+ // We might want to convert email/password to string types before going into the orm with specific validators & transformers
142
+ case 'password':
143
+ case 'email':
144
+ case 'string':
145
+ case 'enumeration':
146
+ {
147
+ return {
148
+ type: 'string'
149
+ };
150
+ }
151
+ case 'uid':
152
+ {
153
+ return {
154
+ type: 'string'
155
+ };
156
+ }
157
+ case 'richtext':
158
+ case 'text':
159
+ {
160
+ return {
161
+ type: 'text',
162
+ args: [
163
+ 'longtext'
164
+ ]
165
+ };
166
+ }
167
+ case 'blocks':
168
+ case 'json':
169
+ {
170
+ return {
171
+ type: 'jsonb'
172
+ };
173
+ }
174
+ case 'integer':
175
+ {
176
+ return {
177
+ type: 'integer'
178
+ };
179
+ }
180
+ case 'biginteger':
181
+ {
182
+ return {
183
+ type: 'bigInteger'
184
+ };
185
+ }
186
+ case 'float':
187
+ {
188
+ return {
189
+ type: 'double'
190
+ };
191
+ }
192
+ case 'decimal':
193
+ {
194
+ return {
195
+ type: 'decimal',
196
+ args: [
197
+ 10,
198
+ 2
199
+ ]
200
+ };
201
+ }
202
+ case 'date':
203
+ {
204
+ return {
205
+ type: 'date'
206
+ };
207
+ }
208
+ case 'time':
209
+ {
210
+ return {
211
+ type: 'time',
212
+ args: [
213
+ {
214
+ precision: 3
215
+ }
216
+ ]
217
+ };
218
+ }
219
+ case 'datetime':
220
+ {
221
+ return {
222
+ type: 'datetime',
223
+ args: [
224
+ {
225
+ useTz: false,
226
+ precision: 6
227
+ }
228
+ ]
229
+ };
230
+ }
231
+ case 'timestamp':
232
+ {
233
+ return {
234
+ type: 'timestamp',
235
+ args: [
236
+ {
237
+ useTz: false,
238
+ precision: 6
239
+ }
240
+ ]
241
+ };
242
+ }
243
+ case 'boolean':
244
+ {
245
+ return {
246
+ type: 'boolean'
247
+ };
248
+ }
249
+ default:
250
+ {
251
+ throw new Error(`Unknown type ${attribute.type}`);
252
+ }
253
+ }
254
+ };
255
+ const metadataToSchema = (metadata)=>{
256
+ const schema = {
257
+ tables: []
258
+ };
259
+ metadata.forEach((metadata)=>{
260
+ schema.tables.push(createTable(metadata));
261
+ });
262
+ return schema;
263
+ };
264
+
265
+ exports.metadataToSchema = metadataToSchema;
266
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sources":["../../src/schema/schema.ts"],"sourcesContent":["import * as types from '../utils/types';\nimport { identifiers } from '../utils/identifiers';\nimport type { Metadata, Meta } from '../metadata';\nimport type { Column, Schema, Table } from './types';\nimport type { Attribute } from '../types';\n\n/**\n * TODO: This needs to be refactored to support incoming names such as\n * (column, table, index) that are of the form string | NameToken[] so\n * that pieces can be passed through and shortened here.\n *\n * Currently, we are potentially shortening twice, although in reality\n * that won't happen since the shortened attribute column names will\n * fit here because they are already shortened to the max identifier\n * length\n *\n * That is the reason we use getName() here and not getColumnName();\n * we just want the exact shortened name for the value without doing\n * any other potential manipulation to it\n * */\n\nconst createColumn = (name: string, attribute: Attribute): Column => {\n const { type, args = [], ...opts } = getColumnType(attribute);\n\n return {\n name: identifiers.getName(name),\n type,\n args,\n defaultTo: null,\n notNullable: false,\n unsigned: false,\n ...opts,\n ...('column' in attribute ? (attribute.column ?? {}) : {}),\n };\n};\n\nconst createTable = (meta: Meta): Table => {\n const table: Table = {\n name: meta.tableName,\n indexes: meta.indexes || [],\n foreignKeys: meta.foreignKeys || [],\n columns: [],\n };\n\n for (const key of Object.keys(meta.attributes)) {\n const attribute = meta.attributes[key];\n\n // if (types.isRelation(attribute.type)) {\n if (attribute.type === 'relation') {\n if ('morphColumn' in attribute && attribute.morphColumn && attribute.owner) {\n const { idColumn, typeColumn } = attribute.morphColumn;\n\n const idColumnName = identifiers.getName(idColumn.name);\n const typeColumnName = identifiers.getName(typeColumn.name);\n\n table.columns.push(\n createColumn(idColumnName, {\n type: 'integer',\n column: {\n unsigned: true,\n },\n })\n );\n\n table.columns.push(createColumn(typeColumnName, { type: 'string' }));\n } else if (\n 'joinColumn' in attribute &&\n attribute.joinColumn &&\n attribute.owner &&\n attribute.joinColumn.referencedTable\n ) {\n // NOTE: we could pass uniquness for oneToOne to avoid creating more than one to one\n\n const {\n name: columnNameFull,\n referencedColumn,\n referencedTable,\n columnType = 'integer',\n } = attribute.joinColumn;\n\n const columnName = identifiers.getName(columnNameFull);\n\n const column = createColumn(columnName, {\n // TODO: find the column type automatically, or allow passing all the column params\n type: columnType,\n column: {\n unsigned: true,\n },\n });\n\n table.columns.push(column);\n\n const fkName = identifiers.getFkIndexName([table.name, columnName]);\n table.foreignKeys.push({\n name: fkName,\n columns: [column.name],\n referencedTable,\n referencedColumns: [referencedColumn],\n // NOTE: could allow configuration\n onDelete: 'SET NULL',\n });\n\n table.indexes.push({\n name: fkName,\n columns: [column.name],\n });\n }\n } else if (types.isScalarAttribute(attribute)) {\n const columnName = identifiers.getName(attribute.columnName || key);\n\n const column = createColumn(columnName, attribute);\n\n if (column.unique) {\n table.indexes.push({\n type: 'unique',\n name: identifiers.getUniqueIndexName([table.name, column.name]),\n columns: [columnName],\n });\n }\n\n if (column.primary) {\n table.indexes.push({\n type: 'primary',\n name: identifiers.getPrimaryIndexName([table.name, column.name]),\n columns: [columnName],\n });\n }\n\n table.columns.push(column);\n }\n }\n\n return table;\n};\n\nconst getColumnType = (attribute: Attribute) => {\n if ('columnType' in attribute && attribute.columnType) {\n return attribute.columnType;\n }\n\n switch (attribute.type) {\n case 'increments': {\n return {\n type: 'increments',\n args: [{ primary: true, primaryKey: true }],\n notNullable: true,\n };\n }\n\n // We might want to convert email/password to string types before going into the orm with specific validators & transformers\n case 'password':\n case 'email':\n case 'string':\n case 'enumeration': {\n return { type: 'string' };\n }\n case 'uid': {\n return {\n type: 'string',\n };\n }\n case 'richtext':\n case 'text': {\n return {\n type: 'text',\n args: ['longtext'],\n };\n }\n case 'blocks':\n case 'json': {\n return { type: 'jsonb' };\n }\n case 'integer': {\n return { type: 'integer' };\n }\n case 'biginteger': {\n return { type: 'bigInteger' };\n }\n case 'float': {\n return { type: 'double' };\n }\n case 'decimal': {\n return { type: 'decimal', args: [10, 2] };\n }\n case 'date': {\n return { type: 'date' };\n }\n case 'time': {\n return { type: 'time', args: [{ precision: 3 }] };\n }\n case 'datetime': {\n return {\n type: 'datetime',\n args: [\n {\n useTz: false,\n precision: 6,\n },\n ],\n };\n }\n case 'timestamp': {\n return {\n type: 'timestamp',\n args: [\n {\n useTz: false,\n precision: 6,\n },\n ],\n };\n }\n case 'boolean': {\n return { type: 'boolean' };\n }\n default: {\n throw new Error(`Unknown type ${attribute.type}`);\n }\n }\n};\n\nexport const metadataToSchema = (metadata: Metadata): Schema => {\n const schema: Schema = {\n tables: [],\n };\n\n metadata.forEach((metadata) => {\n schema.tables.push(createTable(metadata));\n });\n\n return schema;\n};\n"],"names":["createColumn","name","attribute","type","args","opts","getColumnType","identifiers","getName","defaultTo","notNullable","unsigned","column","createTable","meta","table","tableName","indexes","foreignKeys","columns","key","Object","keys","attributes","morphColumn","owner","idColumn","typeColumn","idColumnName","typeColumnName","push","joinColumn","referencedTable","columnNameFull","referencedColumn","columnType","columnName","fkName","getFkIndexName","referencedColumns","onDelete","types","unique","getUniqueIndexName","primary","getPrimaryIndexName","primaryKey","precision","useTz","Error","metadataToSchema","metadata","schema","tables","forEach"],"mappings":"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"}
@@ -0,0 +1,264 @@
1
+ import { isScalarAttribute } from '../utils/types.mjs';
2
+ import { identifiers } from '../utils/identifiers/index.mjs';
3
+
4
+ /**
5
+ * TODO: This needs to be refactored to support incoming names such as
6
+ * (column, table, index) that are of the form string | NameToken[] so
7
+ * that pieces can be passed through and shortened here.
8
+ *
9
+ * Currently, we are potentially shortening twice, although in reality
10
+ * that won't happen since the shortened attribute column names will
11
+ * fit here because they are already shortened to the max identifier
12
+ * length
13
+ *
14
+ * That is the reason we use getName() here and not getColumnName();
15
+ * we just want the exact shortened name for the value without doing
16
+ * any other potential manipulation to it
17
+ * */ const createColumn = (name, attribute)=>{
18
+ const { type, args = [], ...opts } = getColumnType(attribute);
19
+ return {
20
+ name: identifiers.getName(name),
21
+ type,
22
+ args,
23
+ defaultTo: null,
24
+ notNullable: false,
25
+ unsigned: false,
26
+ ...opts,
27
+ ...'column' in attribute ? attribute.column ?? {} : {}
28
+ };
29
+ };
30
+ const createTable = (meta)=>{
31
+ const table = {
32
+ name: meta.tableName,
33
+ indexes: meta.indexes || [],
34
+ foreignKeys: meta.foreignKeys || [],
35
+ columns: []
36
+ };
37
+ for (const key of Object.keys(meta.attributes)){
38
+ const attribute = meta.attributes[key];
39
+ // if (types.isRelation(attribute.type)) {
40
+ if (attribute.type === 'relation') {
41
+ if ('morphColumn' in attribute && attribute.morphColumn && attribute.owner) {
42
+ const { idColumn, typeColumn } = attribute.morphColumn;
43
+ const idColumnName = identifiers.getName(idColumn.name);
44
+ const typeColumnName = identifiers.getName(typeColumn.name);
45
+ table.columns.push(createColumn(idColumnName, {
46
+ type: 'integer',
47
+ column: {
48
+ unsigned: true
49
+ }
50
+ }));
51
+ table.columns.push(createColumn(typeColumnName, {
52
+ type: 'string'
53
+ }));
54
+ } else if ('joinColumn' in attribute && attribute.joinColumn && attribute.owner && attribute.joinColumn.referencedTable) {
55
+ // NOTE: we could pass uniquness for oneToOne to avoid creating more than one to one
56
+ const { name: columnNameFull, referencedColumn, referencedTable, columnType = 'integer' } = attribute.joinColumn;
57
+ const columnName = identifiers.getName(columnNameFull);
58
+ const column = createColumn(columnName, {
59
+ // TODO: find the column type automatically, or allow passing all the column params
60
+ type: columnType,
61
+ column: {
62
+ unsigned: true
63
+ }
64
+ });
65
+ table.columns.push(column);
66
+ const fkName = identifiers.getFkIndexName([
67
+ table.name,
68
+ columnName
69
+ ]);
70
+ table.foreignKeys.push({
71
+ name: fkName,
72
+ columns: [
73
+ column.name
74
+ ],
75
+ referencedTable,
76
+ referencedColumns: [
77
+ referencedColumn
78
+ ],
79
+ // NOTE: could allow configuration
80
+ onDelete: 'SET NULL'
81
+ });
82
+ table.indexes.push({
83
+ name: fkName,
84
+ columns: [
85
+ column.name
86
+ ]
87
+ });
88
+ }
89
+ } else if (isScalarAttribute(attribute)) {
90
+ const columnName = identifiers.getName(attribute.columnName || key);
91
+ const column = createColumn(columnName, attribute);
92
+ if (column.unique) {
93
+ table.indexes.push({
94
+ type: 'unique',
95
+ name: identifiers.getUniqueIndexName([
96
+ table.name,
97
+ column.name
98
+ ]),
99
+ columns: [
100
+ columnName
101
+ ]
102
+ });
103
+ }
104
+ if (column.primary) {
105
+ table.indexes.push({
106
+ type: 'primary',
107
+ name: identifiers.getPrimaryIndexName([
108
+ table.name,
109
+ column.name
110
+ ]),
111
+ columns: [
112
+ columnName
113
+ ]
114
+ });
115
+ }
116
+ table.columns.push(column);
117
+ }
118
+ }
119
+ return table;
120
+ };
121
+ const getColumnType = (attribute)=>{
122
+ if ('columnType' in attribute && attribute.columnType) {
123
+ return attribute.columnType;
124
+ }
125
+ switch(attribute.type){
126
+ case 'increments':
127
+ {
128
+ return {
129
+ type: 'increments',
130
+ args: [
131
+ {
132
+ primary: true,
133
+ primaryKey: true
134
+ }
135
+ ],
136
+ notNullable: true
137
+ };
138
+ }
139
+ // We might want to convert email/password to string types before going into the orm with specific validators & transformers
140
+ case 'password':
141
+ case 'email':
142
+ case 'string':
143
+ case 'enumeration':
144
+ {
145
+ return {
146
+ type: 'string'
147
+ };
148
+ }
149
+ case 'uid':
150
+ {
151
+ return {
152
+ type: 'string'
153
+ };
154
+ }
155
+ case 'richtext':
156
+ case 'text':
157
+ {
158
+ return {
159
+ type: 'text',
160
+ args: [
161
+ 'longtext'
162
+ ]
163
+ };
164
+ }
165
+ case 'blocks':
166
+ case 'json':
167
+ {
168
+ return {
169
+ type: 'jsonb'
170
+ };
171
+ }
172
+ case 'integer':
173
+ {
174
+ return {
175
+ type: 'integer'
176
+ };
177
+ }
178
+ case 'biginteger':
179
+ {
180
+ return {
181
+ type: 'bigInteger'
182
+ };
183
+ }
184
+ case 'float':
185
+ {
186
+ return {
187
+ type: 'double'
188
+ };
189
+ }
190
+ case 'decimal':
191
+ {
192
+ return {
193
+ type: 'decimal',
194
+ args: [
195
+ 10,
196
+ 2
197
+ ]
198
+ };
199
+ }
200
+ case 'date':
201
+ {
202
+ return {
203
+ type: 'date'
204
+ };
205
+ }
206
+ case 'time':
207
+ {
208
+ return {
209
+ type: 'time',
210
+ args: [
211
+ {
212
+ precision: 3
213
+ }
214
+ ]
215
+ };
216
+ }
217
+ case 'datetime':
218
+ {
219
+ return {
220
+ type: 'datetime',
221
+ args: [
222
+ {
223
+ useTz: false,
224
+ precision: 6
225
+ }
226
+ ]
227
+ };
228
+ }
229
+ case 'timestamp':
230
+ {
231
+ return {
232
+ type: 'timestamp',
233
+ args: [
234
+ {
235
+ useTz: false,
236
+ precision: 6
237
+ }
238
+ ]
239
+ };
240
+ }
241
+ case 'boolean':
242
+ {
243
+ return {
244
+ type: 'boolean'
245
+ };
246
+ }
247
+ default:
248
+ {
249
+ throw new Error(`Unknown type ${attribute.type}`);
250
+ }
251
+ }
252
+ };
253
+ const metadataToSchema = (metadata)=>{
254
+ const schema = {
255
+ tables: []
256
+ };
257
+ metadata.forEach((metadata)=>{
258
+ schema.tables.push(createTable(metadata));
259
+ });
260
+ return schema;
261
+ };
262
+
263
+ export { metadataToSchema };
264
+ //# sourceMappingURL=schema.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.mjs","sources":["../../src/schema/schema.ts"],"sourcesContent":["import * as types from '../utils/types';\nimport { identifiers } from '../utils/identifiers';\nimport type { Metadata, Meta } from '../metadata';\nimport type { Column, Schema, Table } from './types';\nimport type { Attribute } from '../types';\n\n/**\n * TODO: This needs to be refactored to support incoming names such as\n * (column, table, index) that are of the form string | NameToken[] so\n * that pieces can be passed through and shortened here.\n *\n * Currently, we are potentially shortening twice, although in reality\n * that won't happen since the shortened attribute column names will\n * fit here because they are already shortened to the max identifier\n * length\n *\n * That is the reason we use getName() here and not getColumnName();\n * we just want the exact shortened name for the value without doing\n * any other potential manipulation to it\n * */\n\nconst createColumn = (name: string, attribute: Attribute): Column => {\n const { type, args = [], ...opts } = getColumnType(attribute);\n\n return {\n name: identifiers.getName(name),\n type,\n args,\n defaultTo: null,\n notNullable: false,\n unsigned: false,\n ...opts,\n ...('column' in attribute ? (attribute.column ?? {}) : {}),\n };\n};\n\nconst createTable = (meta: Meta): Table => {\n const table: Table = {\n name: meta.tableName,\n indexes: meta.indexes || [],\n foreignKeys: meta.foreignKeys || [],\n columns: [],\n };\n\n for (const key of Object.keys(meta.attributes)) {\n const attribute = meta.attributes[key];\n\n // if (types.isRelation(attribute.type)) {\n if (attribute.type === 'relation') {\n if ('morphColumn' in attribute && attribute.morphColumn && attribute.owner) {\n const { idColumn, typeColumn } = attribute.morphColumn;\n\n const idColumnName = identifiers.getName(idColumn.name);\n const typeColumnName = identifiers.getName(typeColumn.name);\n\n table.columns.push(\n createColumn(idColumnName, {\n type: 'integer',\n column: {\n unsigned: true,\n },\n })\n );\n\n table.columns.push(createColumn(typeColumnName, { type: 'string' }));\n } else if (\n 'joinColumn' in attribute &&\n attribute.joinColumn &&\n attribute.owner &&\n attribute.joinColumn.referencedTable\n ) {\n // NOTE: we could pass uniquness for oneToOne to avoid creating more than one to one\n\n const {\n name: columnNameFull,\n referencedColumn,\n referencedTable,\n columnType = 'integer',\n } = attribute.joinColumn;\n\n const columnName = identifiers.getName(columnNameFull);\n\n const column = createColumn(columnName, {\n // TODO: find the column type automatically, or allow passing all the column params\n type: columnType,\n column: {\n unsigned: true,\n },\n });\n\n table.columns.push(column);\n\n const fkName = identifiers.getFkIndexName([table.name, columnName]);\n table.foreignKeys.push({\n name: fkName,\n columns: [column.name],\n referencedTable,\n referencedColumns: [referencedColumn],\n // NOTE: could allow configuration\n onDelete: 'SET NULL',\n });\n\n table.indexes.push({\n name: fkName,\n columns: [column.name],\n });\n }\n } else if (types.isScalarAttribute(attribute)) {\n const columnName = identifiers.getName(attribute.columnName || key);\n\n const column = createColumn(columnName, attribute);\n\n if (column.unique) {\n table.indexes.push({\n type: 'unique',\n name: identifiers.getUniqueIndexName([table.name, column.name]),\n columns: [columnName],\n });\n }\n\n if (column.primary) {\n table.indexes.push({\n type: 'primary',\n name: identifiers.getPrimaryIndexName([table.name, column.name]),\n columns: [columnName],\n });\n }\n\n table.columns.push(column);\n }\n }\n\n return table;\n};\n\nconst getColumnType = (attribute: Attribute) => {\n if ('columnType' in attribute && attribute.columnType) {\n return attribute.columnType;\n }\n\n switch (attribute.type) {\n case 'increments': {\n return {\n type: 'increments',\n args: [{ primary: true, primaryKey: true }],\n notNullable: true,\n };\n }\n\n // We might want to convert email/password to string types before going into the orm with specific validators & transformers\n case 'password':\n case 'email':\n case 'string':\n case 'enumeration': {\n return { type: 'string' };\n }\n case 'uid': {\n return {\n type: 'string',\n };\n }\n case 'richtext':\n case 'text': {\n return {\n type: 'text',\n args: ['longtext'],\n };\n }\n case 'blocks':\n case 'json': {\n return { type: 'jsonb' };\n }\n case 'integer': {\n return { type: 'integer' };\n }\n case 'biginteger': {\n return { type: 'bigInteger' };\n }\n case 'float': {\n return { type: 'double' };\n }\n case 'decimal': {\n return { type: 'decimal', args: [10, 2] };\n }\n case 'date': {\n return { type: 'date' };\n }\n case 'time': {\n return { type: 'time', args: [{ precision: 3 }] };\n }\n case 'datetime': {\n return {\n type: 'datetime',\n args: [\n {\n useTz: false,\n precision: 6,\n },\n ],\n };\n }\n case 'timestamp': {\n return {\n type: 'timestamp',\n args: [\n {\n useTz: false,\n precision: 6,\n },\n ],\n };\n }\n case 'boolean': {\n return { type: 'boolean' };\n }\n default: {\n throw new Error(`Unknown type ${attribute.type}`);\n }\n }\n};\n\nexport const metadataToSchema = (metadata: Metadata): Schema => {\n const schema: Schema = {\n tables: [],\n };\n\n metadata.forEach((metadata) => {\n schema.tables.push(createTable(metadata));\n });\n\n return schema;\n};\n"],"names":["createColumn","name","attribute","type","args","opts","getColumnType","identifiers","getName","defaultTo","notNullable","unsigned","column","createTable","meta","table","tableName","indexes","foreignKeys","columns","key","Object","keys","attributes","morphColumn","owner","idColumn","typeColumn","idColumnName","typeColumnName","push","joinColumn","referencedTable","columnNameFull","referencedColumn","columnType","columnName","fkName","getFkIndexName","referencedColumns","onDelete","types","unique","getUniqueIndexName","primary","getPrimaryIndexName","primaryKey","precision","useTz","Error","metadataToSchema","metadata","schema","tables","forEach"],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ 'use strict';
2
+
3
+ var crypto = require('crypto');
4
+
5
+ const TABLE_NAME = 'strapi_database_schema';
6
+ var createSchemaStorage = ((db)=>{
7
+ const hasSchemaTable = ()=>db.getSchemaConnection().hasTable(TABLE_NAME);
8
+ const createSchemaTable = ()=>{
9
+ return db.getSchemaConnection().createTable(TABLE_NAME, (t)=>{
10
+ t.increments('id');
11
+ t.json('schema');
12
+ t.datetime('time', {
13
+ useTz: false
14
+ });
15
+ t.string('hash');
16
+ });
17
+ };
18
+ const checkTableExists = async ()=>{
19
+ if (!await hasSchemaTable()) {
20
+ await createSchemaTable();
21
+ }
22
+ };
23
+ return {
24
+ async read () {
25
+ await checkTableExists();
26
+ const res = await db.getConnection().select('*').from(TABLE_NAME).orderBy('time', 'DESC').first();
27
+ if (!res) {
28
+ return null;
29
+ }
30
+ const parsedSchema = typeof res.schema === 'object' ? res.schema : JSON.parse(res.schema);
31
+ return {
32
+ ...res,
33
+ schema: parsedSchema
34
+ };
35
+ },
36
+ hashSchema (schema) {
37
+ return crypto.createHash('md5').update(JSON.stringify(schema)).digest('hex');
38
+ },
39
+ async add (schema) {
40
+ await checkTableExists();
41
+ // NOTE: we can remove this to add history
42
+ await db.getConnection(TABLE_NAME).delete();
43
+ const time = new Date();
44
+ await db.getConnection().insert({
45
+ schema: JSON.stringify(schema),
46
+ hash: this.hashSchema(schema),
47
+ time
48
+ }).into(TABLE_NAME);
49
+ },
50
+ async clear () {
51
+ await checkTableExists();
52
+ await db.getConnection(TABLE_NAME).truncate();
53
+ }
54
+ };
55
+ });
56
+
57
+ module.exports = createSchemaStorage;
58
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sources":["../../src/schema/storage.ts"],"sourcesContent":["import crypto from 'crypto';\n\nimport type { Database } from '..';\nimport type { Schema } from './types';\n\nconst TABLE_NAME = 'strapi_database_schema';\n\nexport default (db: Database) => {\n const hasSchemaTable = () => db.getSchemaConnection().hasTable(TABLE_NAME);\n\n const createSchemaTable = () => {\n return db.getSchemaConnection().createTable(TABLE_NAME, (t) => {\n t.increments('id');\n t.json('schema');\n t.datetime('time', { useTz: false });\n t.string('hash');\n });\n };\n\n const checkTableExists = async () => {\n if (!(await hasSchemaTable())) {\n await createSchemaTable();\n }\n };\n\n return {\n async read(): Promise<{\n id: number;\n time: Date;\n hash: string;\n schema: Schema;\n } | null> {\n await checkTableExists();\n\n const res = await db\n .getConnection()\n .select('*')\n .from(TABLE_NAME)\n .orderBy('time', 'DESC')\n .first();\n\n if (!res) {\n return null;\n }\n\n const parsedSchema = typeof res.schema === 'object' ? res.schema : JSON.parse(res.schema);\n\n return {\n ...res,\n schema: parsedSchema,\n };\n },\n\n hashSchema(schema: Schema) {\n return crypto.createHash('md5').update(JSON.stringify(schema)).digest('hex');\n },\n\n async add(schema: Schema) {\n await checkTableExists();\n\n // NOTE: we can remove this to add history\n await db.getConnection(TABLE_NAME).delete();\n\n const time = new Date();\n\n await db\n .getConnection()\n .insert({\n schema: JSON.stringify(schema),\n hash: this.hashSchema(schema),\n time,\n })\n .into(TABLE_NAME);\n },\n\n async clear() {\n await checkTableExists();\n\n await db.getConnection(TABLE_NAME).truncate();\n },\n };\n};\n"],"names":["TABLE_NAME","db","hasSchemaTable","getSchemaConnection","hasTable","createSchemaTable","createTable","t","increments","json","datetime","useTz","string","checkTableExists","read","res","getConnection","select","from","orderBy","first","parsedSchema","schema","JSON","parse","hashSchema","crypto","createHash","update","stringify","digest","add","delete","time","Date","insert","hash","into","clear","truncate"],"mappings":";;;;AAKA,MAAMA,UAAa,GAAA,wBAAA;AAEnB,0BAAe,CAAA,CAACC,EAAAA,GAAAA;AACd,IAAA,MAAMC,iBAAiB,IAAMD,EAAAA,CAAGE,mBAAmB,EAAA,CAAGC,QAAQ,CAACJ,UAAAA,CAAAA;AAE/D,IAAA,MAAMK,iBAAoB,GAAA,IAAA;AACxB,QAAA,OAAOJ,GAAGE,mBAAmB,EAAA,CAAGG,WAAW,CAACN,YAAY,CAACO,CAAAA,GAAAA;AACvDA,YAAAA,CAAAA,CAAEC,UAAU,CAAC,IAAA,CAAA;AACbD,YAAAA,CAAAA,CAAEE,IAAI,CAAC,QAAA,CAAA;YACPF,CAAEG,CAAAA,QAAQ,CAAC,MAAQ,EAAA;gBAAEC,KAAO,EAAA;AAAM,aAAA,CAAA;AAClCJ,YAAAA,CAAAA,CAAEK,MAAM,CAAC,MAAA,CAAA;AACX,SAAA,CAAA;AACF,KAAA;AAEA,IAAA,MAAMC,gBAAmB,GAAA,UAAA;QACvB,IAAI,CAAE,MAAMX,cAAmB,EAAA,EAAA;YAC7B,MAAMG,iBAAAA,EAAAA;AACR;AACF,KAAA;IAEA,OAAO;QACL,MAAMS,IAAAA,CAAAA,GAAAA;YAMJ,MAAMD,gBAAAA,EAAAA;AAEN,YAAA,MAAME,GAAM,GAAA,MAAMd,EACfe,CAAAA,aAAa,GACbC,MAAM,CAAC,GACPC,CAAAA,CAAAA,IAAI,CAAClB,UACLmB,CAAAA,CAAAA,OAAO,CAAC,MAAA,EAAQ,QAChBC,KAAK,EAAA;AAER,YAAA,IAAI,CAACL,GAAK,EAAA;gBACR,OAAO,IAAA;AACT;AAEA,YAAA,MAAMM,YAAe,GAAA,OAAON,GAAIO,CAAAA,MAAM,KAAK,QAAA,GAAWP,GAAIO,CAAAA,MAAM,GAAGC,IAAAA,CAAKC,KAAK,CAACT,IAAIO,MAAM,CAAA;YAExF,OAAO;AACL,gBAAA,GAAGP,GAAG;gBACNO,MAAQD,EAAAA;AACV,aAAA;AACF,SAAA;AAEAI,QAAAA,UAAAA,CAAAA,CAAWH,MAAc,EAAA;YACvB,OAAOI,MAAAA,CAAOC,UAAU,CAAC,KAAOC,CAAAA,CAAAA,MAAM,CAACL,IAAAA,CAAKM,SAAS,CAACP,MAASQ,CAAAA,CAAAA,CAAAA,MAAM,CAAC,KAAA,CAAA;AACxE,SAAA;AAEA,QAAA,MAAMC,KAAIT,MAAc,EAAA;YACtB,MAAMT,gBAAAA,EAAAA;;AAGN,YAAA,MAAMZ,EAAGe,CAAAA,aAAa,CAAChB,UAAAA,CAAAA,CAAYgC,MAAM,EAAA;AAEzC,YAAA,MAAMC,OAAO,IAAIC,IAAAA,EAAAA;AAEjB,YAAA,MAAMjC,EACHe,CAAAA,aAAa,EACbmB,CAAAA,MAAM,CAAC;gBACNb,MAAQC,EAAAA,IAAAA,CAAKM,SAAS,CAACP,MAAAA,CAAAA;gBACvBc,IAAM,EAAA,IAAI,CAACX,UAAU,CAACH,MAAAA,CAAAA;AACtBW,gBAAAA;AACF,aAAA,CAAA,CACCI,IAAI,CAACrC,UAAAA,CAAAA;AACV,SAAA;QAEA,MAAMsC,KAAAA,CAAAA,GAAAA;YACJ,MAAMzB,gBAAAA,EAAAA;AAEN,YAAA,MAAMZ,EAAGe,CAAAA,aAAa,CAAChB,UAAAA,CAAAA,CAAYuC,QAAQ,EAAA;AAC7C;AACF,KAAA;AACF,CAAA;;;;"}