@strapi/database 5.12.0 → 5.12.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 (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":"metadata.mjs","sources":["../../src/metadata/metadata.ts"],"sourcesContent":["import { cloneDeep, snakeCase } from 'lodash/fp';\nimport { identifiers } from '../utils/identifiers';\nimport * as types from '../utils/types';\nimport { createRelation } from './relations';\nimport type { Attribute, Model } from '../types';\nimport type { ForeignKey, Index } from '../schema/types';\nimport type { Action, SubscriberFn } from '../lifecycles';\n\nexport interface Meta extends Model {\n columnToAttribute: Record<string, string>;\n indexes: Index[];\n foreignKeys: ForeignKey[];\n lifecycles: Partial<Record<Action, SubscriberFn>>;\n}\n\nexport class Metadata extends Map<string, Meta> {\n // TODO: we expose the global identifiers in this way so that in the future we can instantiate our own\n // However, it should NOT be done until all the methods used by metadata can be part of this metadata object\n // and access this one; currently they all access the global identifiers directly.\n get identifiers() {\n return identifiers;\n }\n\n get(key: string): Meta {\n if (!super.has(key)) {\n throw new Error(`Metadata for \"${key}\" not found`);\n }\n\n return super.get(key) as Meta;\n }\n\n add(meta: Meta) {\n return this.set(meta.uid, meta);\n }\n\n /**\n * Validate the DB metadata, throwing an error if a duplicate DB table name is detected\n */\n validate() {\n const seenTables = new Map();\n for (const meta of this.values()) {\n if (seenTables.get(meta.tableName)) {\n throw new Error(\n `DB table \"${meta.tableName}\" already exists. Change the collectionName of the related content type.`\n );\n }\n seenTables.set(meta.tableName, true);\n }\n }\n\n loadModels(models: Model[]) {\n // init pass\n for (const model of cloneDeep(models ?? [])) {\n const tableName = identifiers.getTableName(model.tableName);\n this.add({\n ...model,\n tableName,\n attributes: {\n ...model.attributes,\n },\n lifecycles: model.lifecycles ?? {},\n indexes: model.indexes ?? [],\n foreignKeys: model.foreignKeys ?? [],\n columnToAttribute: {},\n });\n }\n\n // build compos / relations\n for (const meta of this.values()) {\n for (const [attributeName, attribute] of Object.entries(meta.attributes)) {\n try {\n if (attribute.unstable_virtual) {\n continue;\n }\n\n if (types.isRelationalAttribute(attribute)) {\n createRelation(attributeName, attribute, meta, this);\n continue;\n }\n\n createAttribute(attributeName, attribute);\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\n `Error on attribute ${attributeName} in model ${meta.singularName}(${meta.uid}): ${error.message}`\n );\n }\n }\n }\n }\n\n for (const meta of this.values()) {\n const columnToAttribute = Object.keys(meta.attributes).reduce((acc, key) => {\n const attribute = meta.attributes[key];\n if ('columnName' in attribute) {\n return Object.assign(acc, { [attribute.columnName || key]: key });\n }\n\n return Object.assign(acc, { [key]: key });\n }, {});\n\n meta.columnToAttribute = columnToAttribute;\n }\n\n this.validate();\n }\n}\n\nconst createAttribute = (attributeName: string, attribute: Attribute) => {\n // if the attribute has already set its own column name, use that\n // this will prevent us from shortening a name twice\n if ('columnName' in attribute && attribute.columnName) {\n return;\n }\n\n const columnName = identifiers.getColumnName(snakeCase(attributeName));\n\n Object.assign(attribute, { columnName });\n};\n"],"names":["Metadata","Map","identifiers","get","key","has","Error","add","meta","set","uid","validate","seenTables","values","tableName","loadModels","models","model","cloneDeep","getTableName","attributes","lifecycles","indexes","foreignKeys","columnToAttribute","attributeName","attribute","Object","entries","unstable_virtual","types","createRelation","createAttribute","error","singularName","message","keys","reduce","acc","assign","columnName","getColumnName","snakeCase"],"mappings":"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"}
@@ -0,0 +1,545 @@
1
+ 'use strict';
2
+
3
+ var _ = require('lodash/fp');
4
+ var index = require('../utils/identifiers/index.js');
5
+
6
+ const ID = index.identifiers.ID_COLUMN;
7
+ const ORDER = index.identifiers.ORDER_COLUMN;
8
+ const FIELD = index.identifiers.FIELD_COLUMN;
9
+ const hasInversedBy = (attr)=>'inversedBy' in attr;
10
+ const hasMappedBy = (attr)=>'mappedBy' in attr;
11
+ const isOneToAny = (attribute)=>[
12
+ 'oneToOne',
13
+ 'oneToMany'
14
+ ].includes(attribute.relation);
15
+ const isManyToAny = (attribute)=>[
16
+ 'manyToMany',
17
+ 'manyToOne'
18
+ ].includes(attribute.relation);
19
+ const isAnyToOne = (attribute)=>[
20
+ 'oneToOne',
21
+ 'manyToOne'
22
+ ].includes(attribute.relation);
23
+ const isAnyToMany = (attribute)=>[
24
+ 'oneToMany',
25
+ 'manyToMany'
26
+ ].includes(attribute.relation);
27
+ const isBidirectional = (attribute)=>hasInversedBy(attribute) || hasMappedBy(attribute);
28
+ const isOwner = (attribute)=>!isBidirectional(attribute) || hasInversedBy(attribute);
29
+ const shouldUseJoinTable = (attribute)=>!('useJoinTable' in attribute) || attribute.useJoinTable !== false;
30
+ const hasOrderColumn = (attribute)=>isAnyToMany(attribute);
31
+ const hasInverseOrderColumn = (attribute)=>isBidirectional(attribute) && isManyToAny(attribute);
32
+ /**
33
+ * Creates a oneToOne relation metadata
34
+ *
35
+ * if owner then
36
+ * if with join table then
37
+ * create join table
38
+ * else
39
+ * create joinColumn
40
+ * if bidirectional then
41
+ * set inverse attribute joinCol or joinTable info correctly
42
+ * else
43
+ * this property must be set by the owner side
44
+ * verify the owner side is valid // should be done before or at the same time ?
45
+ */ const createOneToOne = (attributeName, attribute, meta, metadata)=>{
46
+ if (isOwner(attribute)) {
47
+ if (shouldUseJoinTable(attribute)) {
48
+ createJoinTable(metadata, {
49
+ attribute,
50
+ attributeName,
51
+ meta
52
+ });
53
+ } else {
54
+ createJoinColumn(metadata, {
55
+ attribute,
56
+ attributeName,
57
+ meta
58
+ });
59
+ }
60
+ }
61
+ };
62
+ /**
63
+ * Creates a oneToMany relation metadata
64
+ *
65
+ * if unidirectional then
66
+ * create join table
67
+ * if bidirectional then
68
+ * cannot be owning side
69
+ * do nothing
70
+ */ const createOneToMany = (attributeName, attribute, meta, metadata)=>{
71
+ if (shouldUseJoinTable(attribute) && !isBidirectional(attribute)) {
72
+ createJoinTable(metadata, {
73
+ attribute,
74
+ attributeName,
75
+ meta
76
+ });
77
+ } else if (isOwner(attribute)) {
78
+ throw new Error('one side of a oneToMany cannot be the owner side in a bidirectional relation');
79
+ }
80
+ };
81
+ /**
82
+ * Creates a manyToOne relation metadata
83
+ *
84
+ * if unidirectional then
85
+ * if with join table then
86
+ * create join table
87
+ * else
88
+ * create join column
89
+ * else
90
+ * must be the owner side
91
+ * if with join table then
92
+ * create join table
93
+ * else
94
+ * create join column
95
+ * set inverse attribute joinCol or joinTable info correctly
96
+ */ const createManyToOne = (attributeName, attribute, meta, metadata)=>{
97
+ if (isBidirectional(attribute) && !isOwner(attribute)) {
98
+ throw new Error('The many side of a manyToOne must be the owning side');
99
+ }
100
+ if (shouldUseJoinTable(attribute)) {
101
+ createJoinTable(metadata, {
102
+ attribute,
103
+ attributeName,
104
+ meta
105
+ });
106
+ } else {
107
+ createJoinColumn(metadata, {
108
+ attribute,
109
+ attributeName,
110
+ meta
111
+ });
112
+ }
113
+ };
114
+ /**
115
+ * Creates a manyToMany relation metadata
116
+ *
117
+ * if unidirectional
118
+ * create join table
119
+ * else
120
+ * if owner then
121
+ * if with join table then
122
+ * create join table
123
+ * else
124
+ * do nothing
125
+ */ const createManyToMany = (attributeName, attribute, meta, metadata)=>{
126
+ if (shouldUseJoinTable(attribute) && (!isBidirectional(attribute) || isOwner(attribute))) {
127
+ createJoinTable(metadata, {
128
+ attribute,
129
+ attributeName,
130
+ meta
131
+ });
132
+ }
133
+ };
134
+ /**
135
+ * Creates a morphToOne relation metadata
136
+ *
137
+ * if with join table then
138
+ * create join table
139
+ * else
140
+ * create join columnsa
141
+ *
142
+ * if bidirectionnal
143
+ * set info in the traget
144
+ */ const createMorphToOne = (attributeName, attribute)=>{
145
+ const idColumnName = index.identifiers.getJoinColumnAttributeIdName('target');
146
+ const typeColumnName = index.identifiers.getMorphColumnTypeName('target');
147
+ Object.assign(attribute, {
148
+ owner: true,
149
+ morphColumn: attribute.morphColumn ?? {
150
+ typeColumn: {
151
+ name: typeColumnName
152
+ },
153
+ idColumn: {
154
+ name: idColumnName,
155
+ referencedColumn: ID
156
+ }
157
+ }
158
+ });
159
+ };
160
+ /**
161
+ * Creates a morphToMany relation metadata
162
+ */ const createMorphToMany = (attributeName, attribute, meta, metadata)=>{
163
+ if ('joinTable' in attribute && attribute.joinTable && !attribute.joinTable.__internal__) {
164
+ return;
165
+ }
166
+ const joinTableName = index.identifiers.getMorphTableName(meta.tableName, attributeName);
167
+ const joinColumnName = index.identifiers.getMorphColumnJoinTableIdName(_.snakeCase(meta.singularName));
168
+ const idColumnName = index.identifiers.getMorphColumnAttributeIdName(attributeName);
169
+ const typeColumnName = index.identifiers.getMorphColumnTypeName(attributeName);
170
+ const fkIndexName = index.identifiers.getFkIndexName(joinTableName);
171
+ metadata.add({
172
+ singularName: joinTableName,
173
+ uid: joinTableName,
174
+ tableName: joinTableName,
175
+ attributes: {
176
+ [ID]: {
177
+ type: 'increments'
178
+ },
179
+ [joinColumnName]: {
180
+ type: 'integer',
181
+ column: {
182
+ unsigned: true
183
+ },
184
+ // This must be set explicitly so that it is used instead of shortening the attribute name, which is already shortened
185
+ columnName: joinColumnName
186
+ },
187
+ [idColumnName]: {
188
+ type: 'integer',
189
+ column: {
190
+ unsigned: true
191
+ }
192
+ },
193
+ [typeColumnName]: {
194
+ type: 'string'
195
+ },
196
+ [FIELD]: {
197
+ type: 'string'
198
+ },
199
+ [ORDER]: {
200
+ type: 'float',
201
+ column: {
202
+ unsigned: true
203
+ }
204
+ }
205
+ },
206
+ indexes: [
207
+ {
208
+ name: fkIndexName,
209
+ columns: [
210
+ joinColumnName
211
+ ]
212
+ },
213
+ {
214
+ name: index.identifiers.getOrderIndexName(joinTableName),
215
+ columns: [
216
+ ORDER
217
+ ]
218
+ },
219
+ {
220
+ name: index.identifiers.getIdColumnIndexName(joinTableName),
221
+ columns: [
222
+ idColumnName
223
+ ]
224
+ }
225
+ ],
226
+ foreignKeys: [
227
+ {
228
+ name: fkIndexName,
229
+ columns: [
230
+ joinColumnName
231
+ ],
232
+ referencedColumns: [
233
+ ID
234
+ ],
235
+ referencedTable: meta.tableName,
236
+ onDelete: 'CASCADE'
237
+ }
238
+ ],
239
+ lifecycles: {},
240
+ columnToAttribute: {}
241
+ });
242
+ const joinTable = {
243
+ __internal__: true,
244
+ name: joinTableName,
245
+ joinColumn: {
246
+ name: joinColumnName,
247
+ referencedColumn: ID
248
+ },
249
+ morphColumn: {
250
+ typeColumn: {
251
+ name: typeColumnName
252
+ },
253
+ idColumn: {
254
+ name: idColumnName,
255
+ referencedColumn: ID
256
+ }
257
+ },
258
+ orderBy: {
259
+ order: 'asc'
260
+ },
261
+ pivotColumns: [
262
+ joinColumnName,
263
+ typeColumnName,
264
+ idColumnName
265
+ ]
266
+ };
267
+ attribute.joinTable = joinTable;
268
+ };
269
+ /**
270
+ * Creates a morphOne relation metadata
271
+ */ const createMorphOne = (attributeName, attribute, meta, metadata)=>{
272
+ const targetMeta = metadata.get(attribute.target);
273
+ if (!targetMeta) {
274
+ throw new Error(`Morph target not found. Looking for ${attribute.target}`);
275
+ }
276
+ if (attribute.morphBy && !_.has(attribute.morphBy, targetMeta.attributes)) {
277
+ throw new Error(`Morph target attribute not found. Looking for ${attribute.morphBy}`);
278
+ }
279
+ };
280
+ /**
281
+ * Creates a morphMany relation metadata
282
+ */ const createMorphMany = (attributeName, attribute, meta, metadata)=>{
283
+ const targetMeta = metadata.get(attribute.target);
284
+ if (!targetMeta) {
285
+ throw new Error(`Morph target not found. Looking for ${attribute.target}`);
286
+ }
287
+ if (attribute.morphBy && !_.has(attribute.morphBy, targetMeta.attributes)) {
288
+ throw new Error(`Morph target attribute not found. Looking for ${attribute.morphBy}`);
289
+ }
290
+ };
291
+ /**
292
+ * Creates a join column info and add them to the attribute meta
293
+ */ const createJoinColumn = (metadata, { attribute, attributeName })=>{
294
+ const targetMeta = metadata.get(attribute.target);
295
+ if (!targetMeta) {
296
+ throw new Error(`Unknown target ${attribute.target}`);
297
+ }
298
+ const joinColumnName = index.identifiers.getJoinColumnAttributeIdName(_.snakeCase(attributeName));
299
+ const joinColumn = {
300
+ name: joinColumnName,
301
+ referencedColumn: ID,
302
+ referencedTable: targetMeta.tableName
303
+ };
304
+ if ('joinColumn' in attribute) {
305
+ Object.assign(joinColumn, attribute.joinColumn);
306
+ }
307
+ Object.assign(attribute, {
308
+ owner: true,
309
+ joinColumn
310
+ });
311
+ if (isBidirectional(attribute)) {
312
+ const inverseAttribute = targetMeta.attributes[attribute.inversedBy];
313
+ Object.assign(inverseAttribute, {
314
+ joinColumn: {
315
+ name: joinColumn.referencedColumn,
316
+ referencedColumn: joinColumnName
317
+ }
318
+ });
319
+ }
320
+ };
321
+ /**
322
+ * Creates a join table and add it to the attribute meta
323
+ */ const createJoinTable = (metadata, { attributeName, attribute, meta })=>{
324
+ if (!shouldUseJoinTable(attribute)) {
325
+ throw new Error('Attempted to create join table when useJoinTable is false');
326
+ }
327
+ const targetMeta = metadata.get(attribute.target);
328
+ if (!targetMeta) {
329
+ throw new Error(`Unknown target ${attribute.target}`);
330
+ }
331
+ // TODO: implement overwrite logic instead
332
+ if ('joinTable' in attribute && attribute.joinTable && !attribute.joinTable.__internal__) {
333
+ return;
334
+ }
335
+ const joinTableName = index.identifiers.getJoinTableName(_.snakeCase(meta.tableName), _.snakeCase(attributeName));
336
+ const joinColumnName = index.identifiers.getJoinColumnAttributeIdName(_.snakeCase(meta.singularName));
337
+ let inverseJoinColumnName = index.identifiers.getJoinColumnAttributeIdName(_.snakeCase(targetMeta.singularName));
338
+ // if relation is self referencing
339
+ if (joinColumnName === inverseJoinColumnName) {
340
+ inverseJoinColumnName = index.identifiers.getInverseJoinColumnAttributeIdName(_.snakeCase(targetMeta.singularName));
341
+ }
342
+ const orderColumnName = index.identifiers.getOrderColumnName(_.snakeCase(targetMeta.singularName));
343
+ // TODO: should this plus the conditional below be rolled into one method?
344
+ let inverseOrderColumnName = index.identifiers.getOrderColumnName(_.snakeCase(meta.singularName));
345
+ // if relation is self referencing
346
+ if (attribute.relation === 'manyToMany' && orderColumnName === inverseOrderColumnName) {
347
+ inverseOrderColumnName = index.identifiers.getInverseOrderColumnName(_.snakeCase(meta.singularName));
348
+ }
349
+ const fkIndexName = index.identifiers.getFkIndexName(joinTableName);
350
+ const invFkIndexName = index.identifiers.getInverseFkIndexName(joinTableName);
351
+ const metadataSchema = {
352
+ singularName: joinTableName,
353
+ uid: joinTableName,
354
+ tableName: joinTableName,
355
+ attributes: {
356
+ [ID]: {
357
+ type: 'increments'
358
+ },
359
+ [joinColumnName]: {
360
+ type: 'integer',
361
+ column: {
362
+ unsigned: true
363
+ },
364
+ // This must be set explicitly so that it is used instead of shortening the attribute name, which is already shortened
365
+ columnName: joinColumnName
366
+ },
367
+ [inverseJoinColumnName]: {
368
+ type: 'integer',
369
+ column: {
370
+ unsigned: true
371
+ },
372
+ // This must be set explicitly so that it is used instead of shortening the attribute name, which is already shortened
373
+ columnName: inverseJoinColumnName
374
+ }
375
+ },
376
+ indexes: [
377
+ {
378
+ name: fkIndexName,
379
+ columns: [
380
+ joinColumnName
381
+ ]
382
+ },
383
+ {
384
+ name: invFkIndexName,
385
+ columns: [
386
+ inverseJoinColumnName
387
+ ]
388
+ },
389
+ {
390
+ name: index.identifiers.getUniqueIndexName(joinTableName),
391
+ columns: [
392
+ joinColumnName,
393
+ inverseJoinColumnName
394
+ ],
395
+ type: 'unique'
396
+ }
397
+ ],
398
+ foreignKeys: [
399
+ {
400
+ name: fkIndexName,
401
+ columns: [
402
+ joinColumnName
403
+ ],
404
+ referencedColumns: [
405
+ ID
406
+ ],
407
+ referencedTable: meta.tableName,
408
+ onDelete: 'CASCADE'
409
+ },
410
+ {
411
+ name: invFkIndexName,
412
+ columns: [
413
+ inverseJoinColumnName
414
+ ],
415
+ referencedColumns: [
416
+ ID
417
+ ],
418
+ referencedTable: targetMeta.tableName,
419
+ onDelete: 'CASCADE'
420
+ }
421
+ ],
422
+ lifecycles: {},
423
+ columnToAttribute: {}
424
+ };
425
+ const joinTable = {
426
+ __internal__: true,
427
+ name: joinTableName,
428
+ joinColumn: {
429
+ name: joinColumnName,
430
+ referencedColumn: ID,
431
+ referencedTable: meta.tableName
432
+ },
433
+ inverseJoinColumn: {
434
+ name: inverseJoinColumnName,
435
+ referencedColumn: ID,
436
+ referencedTable: targetMeta.tableName
437
+ },
438
+ pivotColumns: [
439
+ joinColumnName,
440
+ inverseJoinColumnName
441
+ ]
442
+ };
443
+ // order
444
+ if (isAnyToMany(attribute)) {
445
+ metadataSchema.attributes[orderColumnName] = {
446
+ type: 'float',
447
+ column: {
448
+ unsigned: true,
449
+ defaultTo: null
450
+ },
451
+ columnName: orderColumnName
452
+ };
453
+ metadataSchema.indexes.push({
454
+ name: index.identifiers.getOrderFkIndexName(joinTableName),
455
+ columns: [
456
+ orderColumnName
457
+ ]
458
+ });
459
+ joinTable.orderColumnName = orderColumnName;
460
+ joinTable.orderBy = {
461
+ [orderColumnName]: 'asc'
462
+ };
463
+ }
464
+ // inv order
465
+ if (isBidirectional(attribute) && isManyToAny(attribute)) {
466
+ metadataSchema.attributes[inverseOrderColumnName] = {
467
+ type: 'float',
468
+ column: {
469
+ unsigned: true,
470
+ defaultTo: null
471
+ },
472
+ columnName: inverseOrderColumnName
473
+ };
474
+ metadataSchema.indexes.push({
475
+ name: index.identifiers.getOrderInverseFkIndexName(joinTableName),
476
+ columns: [
477
+ inverseOrderColumnName
478
+ ]
479
+ });
480
+ joinTable.inverseOrderColumnName = inverseOrderColumnName;
481
+ }
482
+ metadata.add(metadataSchema);
483
+ attribute.joinTable = joinTable;
484
+ if (isBidirectional(attribute)) {
485
+ const inverseAttribute = attribute.inversedBy ? targetMeta.attributes[attribute.inversedBy] : null;
486
+ if (!inverseAttribute) {
487
+ throw new Error(`inversedBy attribute ${attribute.inversedBy} not found target ${targetMeta.uid}`);
488
+ }
489
+ if (inverseAttribute.type !== 'relation') {
490
+ throw new Error(`inversedBy attribute ${attribute.inversedBy} targets non relational attribute in ${targetMeta.uid}`);
491
+ }
492
+ inverseAttribute.joinTable = {
493
+ __internal__: true,
494
+ name: joinTableName,
495
+ joinColumn: joinTable.inverseJoinColumn,
496
+ inverseJoinColumn: joinTable.joinColumn,
497
+ pivotColumns: joinTable.pivotColumns
498
+ };
499
+ if (isManyToAny(attribute)) {
500
+ inverseAttribute.joinTable.orderColumnName = inverseOrderColumnName;
501
+ inverseAttribute.joinTable.orderBy = {
502
+ [inverseOrderColumnName]: 'asc'
503
+ };
504
+ }
505
+ if (isAnyToMany(attribute)) {
506
+ inverseAttribute.joinTable.inverseOrderColumnName = orderColumnName;
507
+ }
508
+ }
509
+ };
510
+ /**
511
+ * Creates a relation metadata
512
+ */ const createRelation = (attributeName, attribute, meta, metadata)=>{
513
+ switch(attribute.relation){
514
+ case 'oneToOne':
515
+ return createOneToOne(attributeName, attribute, meta, metadata);
516
+ case 'oneToMany':
517
+ return createOneToMany(attributeName, attribute, meta, metadata);
518
+ case 'manyToOne':
519
+ return createManyToOne(attributeName, attribute, meta, metadata);
520
+ case 'manyToMany':
521
+ return createManyToMany(attributeName, attribute, meta, metadata);
522
+ case 'morphToOne':
523
+ return createMorphToOne(attributeName, attribute);
524
+ case 'morphToMany':
525
+ return createMorphToMany(attributeName, attribute, meta, metadata);
526
+ case 'morphOne':
527
+ return createMorphOne(attributeName, attribute, meta, metadata);
528
+ case 'morphMany':
529
+ return createMorphMany(attributeName, attribute, meta, metadata);
530
+ default:
531
+ {
532
+ throw new Error(`Unknown relation`);
533
+ }
534
+ }
535
+ };
536
+
537
+ exports.createRelation = createRelation;
538
+ exports.hasInverseOrderColumn = hasInverseOrderColumn;
539
+ exports.hasOrderColumn = hasOrderColumn;
540
+ exports.isAnyToMany = isAnyToMany;
541
+ exports.isAnyToOne = isAnyToOne;
542
+ exports.isBidirectional = isBidirectional;
543
+ exports.isManyToAny = isManyToAny;
544
+ exports.isOneToAny = isOneToAny;
545
+ //# sourceMappingURL=relations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.js","sources":["../../src/metadata/relations.ts"],"sourcesContent":["import _, { snakeCase } from 'lodash/fp';\n\nimport { identifiers } from '../utils/identifiers';\nimport type { Meta, Metadata } from './metadata';\nimport type { RelationalAttribute, Relation, MorphJoinTable } from '../types';\n\ninterface JoinColumnOptions {\n attribute: (Relation.OneToOne | Relation.ManyToOne) & Relation.Owner;\n attributeName: string;\n meta: Meta;\n}\n\ninterface JoinTableOptions {\n attribute: RelationalAttribute & Relation.WithTarget & Relation.Bidirectional;\n attributeName: string;\n meta: Meta;\n}\n\nconst ID = identifiers.ID_COLUMN;\nconst ORDER = identifiers.ORDER_COLUMN;\nconst FIELD = identifiers.FIELD_COLUMN;\n\nconst hasInversedBy = (\n attr: RelationalAttribute\n): attr is RelationalAttribute & { inversedBy: boolean } => 'inversedBy' in attr;\nconst hasMappedBy = (\n attr: RelationalAttribute\n): attr is RelationalAttribute & { inversedBy: boolean } => 'mappedBy' in attr;\n\n// TODO: use strapi/utils relations for all of these\nexport const isPolymorphic = (attribute: RelationalAttribute): attribute is Relation.Morph =>\n ['morphOne', 'morphMany', 'morphToOne', 'morphToMany'].includes(attribute.relation);\n\nexport const isOneToAny = (\n attribute: RelationalAttribute\n): attribute is Relation.OneToOne | Relation.OneToMany =>\n ['oneToOne', 'oneToMany'].includes(attribute.relation);\n\nexport const isManyToAny = (\n attribute: RelationalAttribute\n): attribute is Relation.ManyToOne | Relation.ManyToMany =>\n ['manyToMany', 'manyToOne'].includes(attribute.relation);\n\nexport const isAnyToOne = (\n attribute: RelationalAttribute\n): attribute is Relation.OneToOne | Relation.ManyToOne =>\n ['oneToOne', 'manyToOne'].includes(attribute.relation);\n\nexport const isAnyToMany = (\n attribute: RelationalAttribute\n): attribute is Relation.OneToMany | Relation.ManyToMany =>\n ['oneToMany', 'manyToMany'].includes(attribute.relation);\n\nexport const isBidirectional = (\n attribute: RelationalAttribute\n): attribute is Relation.Bidirectional => hasInversedBy(attribute) || hasMappedBy(attribute);\n\nconst isOwner = (\n attribute: RelationalAttribute\n): attribute is RelationalAttribute & Relation.Owner =>\n !isBidirectional(attribute) || hasInversedBy(attribute);\n\nconst shouldUseJoinTable = (attribute: RelationalAttribute) =>\n !('useJoinTable' in attribute) || attribute.useJoinTable !== false;\n\nexport const hasOrderColumn = (attribute: RelationalAttribute) => isAnyToMany(attribute);\nexport const hasInverseOrderColumn = (attribute: RelationalAttribute) =>\n isBidirectional(attribute) && isManyToAny(attribute);\n\n/**\n * Creates a oneToOne relation metadata\n *\n * if owner then\n * if with join table then\n * create join table\n * else\n * create joinColumn\n * if bidirectional then\n * set inverse attribute joinCol or joinTable info correctly\n * else\n * this property must be set by the owner side\n * verify the owner side is valid // should be done before or at the same time ?\n */\nconst createOneToOne = (\n attributeName: string,\n attribute: Relation.OneToOne,\n meta: Meta,\n metadata: Metadata\n) => {\n if (isOwner(attribute)) {\n if (shouldUseJoinTable(attribute)) {\n createJoinTable(metadata, {\n attribute,\n attributeName,\n meta,\n });\n } else {\n createJoinColumn(metadata, {\n attribute,\n attributeName,\n meta,\n });\n }\n } else {\n // TODO: verify other side is valid\n }\n};\n\n/**\n * Creates a oneToMany relation metadata\n *\n * if unidirectional then\n * create join table\n * if bidirectional then\n * cannot be owning side\n * do nothing\n */\nconst createOneToMany = (\n attributeName: string,\n attribute: Relation.OneToMany,\n meta: Meta,\n metadata: Metadata\n) => {\n if (shouldUseJoinTable(attribute) && !isBidirectional(attribute)) {\n createJoinTable(metadata, {\n attribute,\n attributeName,\n meta,\n });\n } else if (isOwner(attribute)) {\n throw new Error('one side of a oneToMany cannot be the owner side in a bidirectional relation');\n }\n};\n\n/**\n * Creates a manyToOne relation metadata\n *\n * if unidirectional then\n * if with join table then\n * create join table\n * else\n * create join column\n * else\n * must be the owner side\n * if with join table then\n * create join table\n * else\n * create join column\n * set inverse attribute joinCol or joinTable info correctly\n */\nconst createManyToOne = (\n attributeName: string,\n attribute: Relation.ManyToOne,\n meta: Meta,\n metadata: Metadata\n) => {\n if (isBidirectional(attribute) && !isOwner(attribute)) {\n throw new Error('The many side of a manyToOne must be the owning side');\n }\n\n if (shouldUseJoinTable(attribute)) {\n createJoinTable(metadata, {\n attribute,\n attributeName,\n meta,\n });\n } else {\n createJoinColumn(metadata, {\n attribute,\n attributeName,\n meta,\n });\n }\n};\n\n/**\n * Creates a manyToMany relation metadata\n *\n * if unidirectional\n * create join table\n * else\n * if owner then\n * if with join table then\n * create join table\n * else\n * do nothing\n */\nconst createManyToMany = (\n attributeName: string,\n attribute: Relation.ManyToMany,\n meta: Meta,\n metadata: Metadata\n) => {\n if (shouldUseJoinTable(attribute) && (!isBidirectional(attribute) || isOwner(attribute))) {\n createJoinTable(metadata, {\n attribute,\n attributeName,\n meta,\n });\n }\n};\n\n/**\n * Creates a morphToOne relation metadata\n *\n * if with join table then\n * create join table\n * else\n * create join columnsa\n *\n * if bidirectionnal\n * set info in the traget\n */\nconst createMorphToOne = (attributeName: string, attribute: Relation.MorphToOne) => {\n const idColumnName = identifiers.getJoinColumnAttributeIdName('target');\n const typeColumnName = identifiers.getMorphColumnTypeName('target');\n\n Object.assign(attribute, {\n owner: true,\n morphColumn: attribute.morphColumn ?? {\n typeColumn: {\n name: typeColumnName,\n },\n idColumn: {\n name: idColumnName,\n referencedColumn: ID,\n },\n },\n });\n};\n\n/**\n * Creates a morphToMany relation metadata\n */\nconst createMorphToMany = (\n attributeName: string,\n attribute: Relation.MorphToMany,\n meta: Meta,\n metadata: Metadata\n) => {\n if ('joinTable' in attribute && attribute.joinTable && !attribute.joinTable.__internal__) {\n return;\n }\n\n const joinTableName = identifiers.getMorphTableName(meta.tableName, attributeName);\n const joinColumnName = identifiers.getMorphColumnJoinTableIdName(snakeCase(meta.singularName));\n const idColumnName = identifiers.getMorphColumnAttributeIdName(attributeName);\n const typeColumnName = identifiers.getMorphColumnTypeName(attributeName);\n\n const fkIndexName = identifiers.getFkIndexName(joinTableName);\n\n metadata.add({\n singularName: joinTableName,\n uid: joinTableName,\n tableName: joinTableName,\n attributes: {\n [ID]: {\n type: 'increments',\n },\n [joinColumnName]: {\n type: 'integer',\n column: {\n unsigned: true,\n },\n // This must be set explicitly so that it is used instead of shortening the attribute name, which is already shortened\n columnName: joinColumnName,\n },\n [idColumnName]: {\n type: 'integer',\n column: {\n unsigned: true,\n },\n },\n [typeColumnName]: {\n type: 'string',\n },\n [FIELD]: {\n type: 'string',\n },\n [ORDER]: {\n type: 'float',\n column: {\n unsigned: true,\n },\n },\n },\n indexes: [\n {\n name: fkIndexName,\n columns: [joinColumnName],\n },\n {\n name: identifiers.getOrderIndexName(joinTableName),\n columns: [ORDER],\n },\n {\n name: identifiers.getIdColumnIndexName(joinTableName),\n columns: [idColumnName],\n },\n ],\n foreignKeys: [\n {\n name: fkIndexName,\n columns: [joinColumnName],\n referencedColumns: [ID],\n referencedTable: meta.tableName,\n onDelete: 'CASCADE',\n },\n ],\n lifecycles: {},\n columnToAttribute: {},\n });\n\n const joinTable: MorphJoinTable = {\n __internal__: true,\n name: joinTableName,\n joinColumn: {\n name: joinColumnName,\n referencedColumn: ID,\n },\n morphColumn: {\n typeColumn: {\n name: typeColumnName,\n },\n idColumn: {\n name: idColumnName,\n referencedColumn: ID,\n },\n },\n orderBy: {\n order: 'asc' as const,\n },\n pivotColumns: [joinColumnName, typeColumnName, idColumnName],\n };\n\n attribute.joinTable = joinTable;\n};\n\n/**\n * Creates a morphOne relation metadata\n */\nconst createMorphOne = (\n attributeName: string,\n attribute: Relation.MorphOne,\n meta: Meta,\n metadata: Metadata\n) => {\n const targetMeta = metadata.get(attribute.target);\n\n if (!targetMeta) {\n throw new Error(`Morph target not found. Looking for ${attribute.target}`);\n }\n\n if (attribute.morphBy && !_.has(attribute.morphBy, targetMeta.attributes)) {\n throw new Error(`Morph target attribute not found. Looking for ${attribute.morphBy}`);\n }\n};\n\n/**\n * Creates a morphMany relation metadata\n */\nconst createMorphMany = (\n attributeName: string,\n attribute: Relation.MorphMany,\n meta: Meta,\n metadata: Metadata\n) => {\n const targetMeta = metadata.get(attribute.target);\n\n if (!targetMeta) {\n throw new Error(`Morph target not found. Looking for ${attribute.target}`);\n }\n\n if (attribute.morphBy && !_.has(attribute.morphBy, targetMeta.attributes)) {\n throw new Error(`Morph target attribute not found. Looking for ${attribute.morphBy}`);\n }\n};\n\n/**\n * Creates a join column info and add them to the attribute meta\n */\nconst createJoinColumn = (metadata: Metadata, { attribute, attributeName }: JoinColumnOptions) => {\n const targetMeta = metadata.get(attribute.target);\n\n if (!targetMeta) {\n throw new Error(`Unknown target ${attribute.target}`);\n }\n\n const joinColumnName = identifiers.getJoinColumnAttributeIdName(snakeCase(attributeName));\n const joinColumn = {\n name: joinColumnName,\n referencedColumn: ID,\n referencedTable: targetMeta.tableName,\n };\n\n if ('joinColumn' in attribute) {\n Object.assign(joinColumn, attribute.joinColumn);\n }\n\n Object.assign(attribute, { owner: true, joinColumn });\n\n if (isBidirectional(attribute)) {\n const inverseAttribute = targetMeta.attributes[attribute.inversedBy];\n\n Object.assign(inverseAttribute, {\n joinColumn: {\n name: joinColumn.referencedColumn,\n referencedColumn: joinColumnName,\n },\n });\n }\n};\n\n/**\n * Creates a join table and add it to the attribute meta\n */\nconst createJoinTable = (\n metadata: Metadata,\n { attributeName, attribute, meta }: JoinTableOptions\n) => {\n if (!shouldUseJoinTable(attribute)) {\n throw new Error('Attempted to create join table when useJoinTable is false');\n }\n\n const targetMeta = metadata.get(attribute.target);\n\n if (!targetMeta) {\n throw new Error(`Unknown target ${attribute.target}`);\n }\n\n // TODO: implement overwrite logic instead\n if ('joinTable' in attribute && attribute.joinTable && !attribute.joinTable.__internal__) {\n return;\n }\n\n const joinTableName = identifiers.getJoinTableName(\n snakeCase(meta.tableName),\n snakeCase(attributeName)\n );\n\n const joinColumnName = identifiers.getJoinColumnAttributeIdName(snakeCase(meta.singularName));\n\n let inverseJoinColumnName = identifiers.getJoinColumnAttributeIdName(\n snakeCase(targetMeta.singularName)\n );\n\n // if relation is self referencing\n if (joinColumnName === inverseJoinColumnName) {\n inverseJoinColumnName = identifiers.getInverseJoinColumnAttributeIdName(\n snakeCase(targetMeta.singularName)\n );\n }\n\n const orderColumnName = identifiers.getOrderColumnName(snakeCase(targetMeta.singularName));\n // TODO: should this plus the conditional below be rolled into one method?\n let inverseOrderColumnName = identifiers.getOrderColumnName(snakeCase(meta.singularName));\n\n // if relation is self referencing\n if (attribute.relation === 'manyToMany' && orderColumnName === inverseOrderColumnName) {\n inverseOrderColumnName = identifiers.getInverseOrderColumnName(snakeCase(meta.singularName));\n }\n\n const fkIndexName = identifiers.getFkIndexName(joinTableName);\n const invFkIndexName = identifiers.getInverseFkIndexName(joinTableName);\n\n const metadataSchema: Meta = {\n singularName: joinTableName,\n uid: joinTableName,\n tableName: joinTableName,\n attributes: {\n [ID]: {\n type: 'increments',\n },\n [joinColumnName]: {\n type: 'integer',\n column: {\n unsigned: true,\n },\n // This must be set explicitly so that it is used instead of shortening the attribute name, which is already shortened\n columnName: joinColumnName,\n },\n [inverseJoinColumnName]: {\n type: 'integer',\n column: {\n unsigned: true,\n },\n // This must be set explicitly so that it is used instead of shortening the attribute name, which is already shortened\n columnName: inverseJoinColumnName,\n },\n // TODO: add extra pivot attributes -> user should use an intermediate entity\n },\n indexes: [\n {\n name: fkIndexName,\n columns: [joinColumnName],\n },\n {\n name: invFkIndexName,\n columns: [inverseJoinColumnName],\n },\n {\n name: identifiers.getUniqueIndexName(joinTableName),\n columns: [joinColumnName, inverseJoinColumnName],\n type: 'unique',\n },\n ],\n foreignKeys: [\n {\n name: fkIndexName,\n columns: [joinColumnName],\n referencedColumns: [ID],\n referencedTable: meta.tableName,\n onDelete: 'CASCADE',\n },\n {\n name: invFkIndexName,\n columns: [inverseJoinColumnName],\n referencedColumns: [ID],\n referencedTable: targetMeta.tableName,\n onDelete: 'CASCADE',\n },\n ],\n lifecycles: {},\n columnToAttribute: {},\n };\n\n const joinTable = {\n __internal__: true,\n name: joinTableName,\n joinColumn: {\n name: joinColumnName,\n referencedColumn: ID,\n referencedTable: meta.tableName,\n },\n inverseJoinColumn: {\n name: inverseJoinColumnName,\n referencedColumn: ID,\n referencedTable: targetMeta.tableName,\n },\n pivotColumns: [joinColumnName, inverseJoinColumnName],\n } as any;\n\n // order\n if (isAnyToMany(attribute)) {\n metadataSchema.attributes[orderColumnName] = {\n type: 'float',\n column: {\n unsigned: true,\n defaultTo: null,\n },\n columnName: orderColumnName,\n };\n metadataSchema.indexes.push({\n name: identifiers.getOrderFkIndexName(joinTableName),\n columns: [orderColumnName],\n });\n joinTable.orderColumnName = orderColumnName;\n joinTable.orderBy = { [orderColumnName]: 'asc' };\n }\n\n // inv order\n if (isBidirectional(attribute) && isManyToAny(attribute)) {\n metadataSchema.attributes[inverseOrderColumnName] = {\n type: 'float',\n column: {\n unsigned: true,\n defaultTo: null,\n },\n columnName: inverseOrderColumnName,\n };\n\n metadataSchema.indexes.push({\n name: identifiers.getOrderInverseFkIndexName(joinTableName),\n columns: [inverseOrderColumnName],\n });\n\n joinTable.inverseOrderColumnName = inverseOrderColumnName;\n }\n\n metadata.add(metadataSchema);\n\n attribute.joinTable = joinTable;\n\n if (isBidirectional(attribute)) {\n const inverseAttribute = attribute.inversedBy\n ? (targetMeta.attributes[attribute.inversedBy] as Relation.Bidirectional)\n : null;\n\n if (!inverseAttribute) {\n throw new Error(\n `inversedBy attribute ${attribute.inversedBy} not found target ${targetMeta.uid}`\n );\n }\n\n if (inverseAttribute.type !== 'relation') {\n throw new Error(\n `inversedBy attribute ${attribute.inversedBy} targets non relational attribute in ${targetMeta.uid}`\n );\n }\n\n inverseAttribute.joinTable = {\n __internal__: true,\n name: joinTableName,\n joinColumn: joinTable.inverseJoinColumn,\n inverseJoinColumn: joinTable.joinColumn,\n pivotColumns: joinTable.pivotColumns,\n } as any;\n\n if (isManyToAny(attribute)) {\n inverseAttribute.joinTable.orderColumnName = inverseOrderColumnName;\n inverseAttribute.joinTable.orderBy = { [inverseOrderColumnName]: 'asc' };\n }\n if (isAnyToMany(attribute)) {\n inverseAttribute.joinTable.inverseOrderColumnName = orderColumnName;\n }\n }\n};\n\n/**\n * Creates a relation metadata\n */\nexport const createRelation = (\n attributeName: string,\n attribute: RelationalAttribute,\n meta: Meta,\n metadata: Metadata\n) => {\n switch (attribute.relation) {\n case 'oneToOne':\n return createOneToOne(attributeName, attribute, meta, metadata);\n case 'oneToMany':\n return createOneToMany(attributeName, attribute, meta, metadata);\n case 'manyToOne':\n return createManyToOne(attributeName, attribute, meta, metadata);\n case 'manyToMany':\n return createManyToMany(attributeName, attribute, meta, metadata);\n case 'morphToOne':\n return createMorphToOne(attributeName, attribute);\n case 'morphToMany':\n return createMorphToMany(attributeName, attribute, meta, metadata);\n case 'morphOne':\n return createMorphOne(attributeName, attribute, meta, metadata);\n case 'morphMany':\n return createMorphMany(attributeName, attribute, meta, metadata);\n default: {\n throw new Error(`Unknown relation`);\n }\n }\n};\n"],"names":["ID","identifiers","ID_COLUMN","ORDER","ORDER_COLUMN","FIELD","FIELD_COLUMN","hasInversedBy","attr","hasMappedBy","isOneToAny","attribute","includes","relation","isManyToAny","isAnyToOne","isAnyToMany","isBidirectional","isOwner","shouldUseJoinTable","useJoinTable","hasOrderColumn","hasInverseOrderColumn","createOneToOne","attributeName","meta","metadata","createJoinTable","createJoinColumn","createOneToMany","Error","createManyToOne","createManyToMany","createMorphToOne","idColumnName","getJoinColumnAttributeIdName","typeColumnName","getMorphColumnTypeName","Object","assign","owner","morphColumn","typeColumn","name","idColumn","referencedColumn","createMorphToMany","joinTable","__internal__","joinTableName","getMorphTableName","tableName","joinColumnName","getMorphColumnJoinTableIdName","snakeCase","singularName","getMorphColumnAttributeIdName","fkIndexName","getFkIndexName","add","uid","attributes","type","column","unsigned","columnName","indexes","columns","getOrderIndexName","getIdColumnIndexName","foreignKeys","referencedColumns","referencedTable","onDelete","lifecycles","columnToAttribute","joinColumn","orderBy","order","pivotColumns","createMorphOne","targetMeta","get","target","morphBy","_","has","createMorphMany","inverseAttribute","inversedBy","getJoinTableName","inverseJoinColumnName","getInverseJoinColumnAttributeIdName","orderColumnName","getOrderColumnName","inverseOrderColumnName","getInverseOrderColumnName","invFkIndexName","getInverseFkIndexName","metadataSchema","getUniqueIndexName","inverseJoinColumn","defaultTo","push","getOrderFkIndexName","getOrderInverseFkIndexName","createRelation"],"mappings":"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"}