@strapi/database 5.56.0 → 5.57.0

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 (196) hide show
  1. package/dist/dialects/dialect.d.ts +28 -0
  2. package/dist/dialects/dialect.d.ts.map +1 -1
  3. package/dist/dialects/dialect.js +29 -0
  4. package/dist/dialects/dialect.js.map +1 -1
  5. package/dist/dialects/dialect.mjs +29 -0
  6. package/dist/dialects/dialect.mjs.map +1 -1
  7. package/dist/dialects/mysql/index.d.ts +9 -0
  8. package/dist/dialects/mysql/index.d.ts.map +1 -1
  9. package/dist/dialects/mysql/index.js +37 -0
  10. package/dist/dialects/mysql/index.js.map +1 -1
  11. package/dist/dialects/mysql/index.mjs +37 -0
  12. package/dist/dialects/mysql/index.mjs.map +1 -1
  13. package/dist/dialects/postgresql/index.d.ts +7 -0
  14. package/dist/dialects/postgresql/index.d.ts.map +1 -1
  15. package/dist/dialects/postgresql/index.js +50 -0
  16. package/dist/dialects/postgresql/index.js.map +1 -1
  17. package/dist/dialects/postgresql/index.mjs +50 -0
  18. package/dist/dialects/postgresql/index.mjs.map +1 -1
  19. package/dist/dialects/sqlite/index.d.ts +9 -0
  20. package/dist/dialects/sqlite/index.d.ts.map +1 -1
  21. package/dist/dialects/sqlite/index.js +16 -0
  22. package/dist/dialects/sqlite/index.js.map +1 -1
  23. package/dist/dialects/sqlite/index.mjs +16 -0
  24. package/dist/dialects/sqlite/index.mjs.map +1 -1
  25. package/dist/entity-manager/entity-repository.js +1 -1
  26. package/dist/entity-manager/entity-repository.js.map +1 -1
  27. package/dist/entity-manager/entity-repository.mjs +1 -1
  28. package/dist/entity-manager/entity-repository.mjs.map +1 -1
  29. package/dist/entity-manager/index.d.ts.map +1 -1
  30. package/dist/entity-manager/index.js +38 -36
  31. package/dist/entity-manager/index.js.map +1 -1
  32. package/dist/entity-manager/index.mjs +38 -36
  33. package/dist/entity-manager/index.mjs.map +1 -1
  34. package/dist/entity-manager/morph-relations.d.ts.map +1 -1
  35. package/dist/entity-manager/morph-relations.js +3 -5
  36. package/dist/entity-manager/morph-relations.js.map +1 -1
  37. package/dist/entity-manager/morph-relations.mjs +3 -5
  38. package/dist/entity-manager/morph-relations.mjs.map +1 -1
  39. package/dist/entity-manager/regular-relations.js +3 -3
  40. package/dist/entity-manager/regular-relations.js.map +1 -1
  41. package/dist/entity-manager/regular-relations.mjs +3 -3
  42. package/dist/entity-manager/regular-relations.mjs.map +1 -1
  43. package/dist/entity-manager/relations-orderer.d.ts.map +1 -1
  44. package/dist/entity-manager/relations-orderer.js +4 -5
  45. package/dist/entity-manager/relations-orderer.js.map +1 -1
  46. package/dist/entity-manager/relations-orderer.mjs +2 -3
  47. package/dist/entity-manager/relations-orderer.mjs.map +1 -1
  48. package/dist/fields/biginteger.js +1 -1
  49. package/dist/fields/biginteger.js.map +1 -1
  50. package/dist/fields/biginteger.mjs +1 -1
  51. package/dist/fields/biginteger.mjs.map +1 -1
  52. package/dist/fields/boolean.js +1 -1
  53. package/dist/fields/boolean.js.map +1 -1
  54. package/dist/fields/boolean.mjs +1 -1
  55. package/dist/fields/boolean.mjs.map +1 -1
  56. package/dist/fields/number.js +1 -1
  57. package/dist/fields/number.js.map +1 -1
  58. package/dist/fields/number.mjs +1 -1
  59. package/dist/fields/number.mjs.map +1 -1
  60. package/dist/fields/shared/parsers.js +2 -2
  61. package/dist/fields/shared/parsers.js.map +1 -1
  62. package/dist/fields/shared/parsers.mjs +2 -2
  63. package/dist/fields/shared/parsers.mjs.map +1 -1
  64. package/dist/fields/string.js +1 -1
  65. package/dist/fields/string.js.map +1 -1
  66. package/dist/fields/string.mjs +1 -1
  67. package/dist/fields/string.mjs.map +1 -1
  68. package/dist/index.d.ts +9 -5
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +2 -0
  71. package/dist/index.js.map +1 -1
  72. package/dist/index.mjs +1 -0
  73. package/dist/index.mjs.map +1 -1
  74. package/dist/metadata/attribute-naming.d.ts +31 -0
  75. package/dist/metadata/attribute-naming.d.ts.map +1 -0
  76. package/dist/metadata/attribute-naming.js +39 -0
  77. package/dist/metadata/attribute-naming.js.map +1 -0
  78. package/dist/metadata/attribute-naming.mjs +37 -0
  79. package/dist/metadata/attribute-naming.mjs.map +1 -0
  80. package/dist/metadata/index.d.ts +5 -2
  81. package/dist/metadata/index.d.ts.map +1 -1
  82. package/dist/metadata/index.js +3 -0
  83. package/dist/metadata/index.js.map +1 -1
  84. package/dist/metadata/index.mjs +3 -1
  85. package/dist/metadata/index.mjs.map +1 -1
  86. package/dist/metadata/metadata.d.ts +10 -0
  87. package/dist/metadata/metadata.d.ts.map +1 -1
  88. package/dist/metadata/metadata.js +10 -2
  89. package/dist/metadata/metadata.js.map +1 -1
  90. package/dist/metadata/metadata.mjs +10 -2
  91. package/dist/metadata/metadata.mjs.map +1 -1
  92. package/dist/metadata/relations.d.ts.map +1 -1
  93. package/dist/metadata/relations.js +6 -5
  94. package/dist/metadata/relations.js.map +1 -1
  95. package/dist/metadata/relations.mjs +6 -5
  96. package/dist/metadata/relations.mjs.map +1 -1
  97. package/dist/migrations/common.d.ts +2 -0
  98. package/dist/migrations/common.d.ts.map +1 -1
  99. package/dist/migrations/common.js.map +1 -1
  100. package/dist/migrations/common.mjs.map +1 -1
  101. package/dist/migrations/file-builder.d.ts +97 -0
  102. package/dist/migrations/file-builder.d.ts.map +1 -0
  103. package/dist/migrations/file-builder.js +251 -0
  104. package/dist/migrations/file-builder.js.map +1 -0
  105. package/dist/migrations/file-builder.mjs +240 -0
  106. package/dist/migrations/file-builder.mjs.map +1 -0
  107. package/dist/migrations/index.d.ts +3 -2
  108. package/dist/migrations/index.d.ts.map +1 -1
  109. package/dist/migrations/index.js +6 -0
  110. package/dist/migrations/index.js.map +1 -1
  111. package/dist/migrations/index.mjs +6 -0
  112. package/dist/migrations/index.mjs.map +1 -1
  113. package/dist/migrations/internal-migrations/5.0.0-02-document-id.js +1 -1
  114. package/dist/migrations/internal-migrations/5.0.0-02-document-id.js.map +1 -1
  115. package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs +1 -1
  116. package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs.map +1 -1
  117. package/dist/migrations/resolver.d.ts.map +1 -1
  118. package/dist/migrations/resolver.js +4 -1
  119. package/dist/migrations/resolver.js.map +1 -1
  120. package/dist/migrations/resolver.mjs +4 -1
  121. package/dist/migrations/resolver.mjs.map +1 -1
  122. package/dist/query/helpers/order-by.d.ts.map +1 -1
  123. package/dist/query/helpers/order-by.js +3 -4
  124. package/dist/query/helpers/order-by.js.map +1 -1
  125. package/dist/query/helpers/order-by.mjs +3 -4
  126. package/dist/query/helpers/order-by.mjs.map +1 -1
  127. package/dist/query/helpers/populate/apply.d.ts.map +1 -1
  128. package/dist/query/helpers/populate/apply.js +46 -30
  129. package/dist/query/helpers/populate/apply.js.map +1 -1
  130. package/dist/query/helpers/populate/apply.mjs +46 -30
  131. package/dist/query/helpers/populate/apply.mjs.map +1 -1
  132. package/dist/query/helpers/populate/process.js +3 -3
  133. package/dist/query/helpers/populate/process.js.map +1 -1
  134. package/dist/query/helpers/populate/process.mjs +3 -3
  135. package/dist/query/helpers/populate/process.mjs.map +1 -1
  136. package/dist/query/helpers/search.js +2 -2
  137. package/dist/query/helpers/search.js.map +1 -1
  138. package/dist/query/helpers/search.mjs +2 -2
  139. package/dist/query/helpers/search.mjs.map +1 -1
  140. package/dist/query/helpers/streams/readable.js +3 -3
  141. package/dist/query/helpers/streams/readable.js.map +1 -1
  142. package/dist/query/helpers/streams/readable.mjs +3 -3
  143. package/dist/query/helpers/streams/readable.mjs.map +1 -1
  144. package/dist/query/helpers/transform.d.ts.map +1 -1
  145. package/dist/query/helpers/transform.js +6 -13
  146. package/dist/query/helpers/transform.js.map +1 -1
  147. package/dist/query/helpers/transform.mjs +6 -9
  148. package/dist/query/helpers/transform.mjs.map +1 -1
  149. package/dist/query/helpers/where.js +13 -9
  150. package/dist/query/helpers/where.js.map +1 -1
  151. package/dist/query/helpers/where.mjs +13 -9
  152. package/dist/query/helpers/where.mjs.map +1 -1
  153. package/dist/query/query-builder.d.ts.map +1 -1
  154. package/dist/query/query-builder.js +35 -29
  155. package/dist/query/query-builder.js.map +1 -1
  156. package/dist/query/query-builder.mjs +35 -29
  157. package/dist/query/query-builder.mjs.map +1 -1
  158. package/dist/schema/builder.js +5 -5
  159. package/dist/schema/builder.js.map +1 -1
  160. package/dist/schema/builder.mjs +5 -5
  161. package/dist/schema/builder.mjs.map +1 -1
  162. package/dist/schema/diff.js +12 -12
  163. package/dist/schema/diff.js.map +1 -1
  164. package/dist/schema/diff.mjs +12 -12
  165. package/dist/schema/diff.mjs.map +1 -1
  166. package/dist/schema/index.d.ts +3 -1
  167. package/dist/schema/index.d.ts.map +1 -1
  168. package/dist/schema/index.js +6 -0
  169. package/dist/schema/index.js.map +1 -1
  170. package/dist/schema/index.mjs +6 -0
  171. package/dist/schema/index.mjs.map +1 -1
  172. package/dist/schema/rename-helpers.d.ts +78 -0
  173. package/dist/schema/rename-helpers.d.ts.map +1 -0
  174. package/dist/schema/rename-helpers.js +235 -0
  175. package/dist/schema/rename-helpers.js.map +1 -0
  176. package/dist/schema/rename-helpers.mjs +233 -0
  177. package/dist/schema/rename-helpers.mjs.map +1 -0
  178. package/dist/utils/async-curry.d.ts.map +1 -1
  179. package/dist/utils/async-curry.js +1 -2
  180. package/dist/utils/async-curry.js.map +1 -1
  181. package/dist/utils/async-curry.mjs +1 -2
  182. package/dist/utils/async-curry.mjs.map +1 -1
  183. package/dist/utils/identifiers/hash.d.ts.map +1 -1
  184. package/dist/utils/identifiers/hash.js +1 -2
  185. package/dist/utils/identifiers/hash.js.map +1 -1
  186. package/dist/utils/identifiers/hash.mjs +1 -2
  187. package/dist/utils/identifiers/hash.mjs.map +1 -1
  188. package/dist/utils/identifiers/index.js +8 -10
  189. package/dist/utils/identifiers/index.js.map +1 -1
  190. package/dist/utils/identifiers/index.mjs +8 -6
  191. package/dist/utils/identifiers/index.mjs.map +1 -1
  192. package/dist/validations/relations/bidirectional.js +1 -1
  193. package/dist/validations/relations/bidirectional.js.map +1 -1
  194. package/dist/validations/relations/bidirectional.mjs +1 -1
  195. package/dist/validations/relations/bidirectional.mjs.map +1 -1
  196. package/package.json +6 -5
@@ -1 +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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"}
1
+ {"version":3,"file":"relations.js","sources":["../../src/metadata/relations.ts"],"sourcesContent":["import _, { snakeCase } from 'lodash';\n\nimport { identifiers } from '../utils/identifiers';\nimport { attributeNaming } from './attribute-naming';\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(targetMeta.attributes, attribute.morphBy)) {\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(targetMeta.attributes, attribute.morphBy)) {\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 = attributeNaming.joinColumnName(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 = attributeNaming.joinTableName(meta.tableName, attributeName);\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","attributeNaming","inverseAttribute","inversedBy","inverseJoinColumnName","getInverseJoinColumnAttributeIdName","orderColumnName","getOrderColumnName","inverseOrderColumnName","getInverseOrderColumnName","invFkIndexName","getInverseFkIndexName","metadataSchema","getUniqueIndexName","inverseJoinColumn","defaultTo","push","getOrderFkIndexName","getOrderInverseFkIndexName","createRelation"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
- import _, { snakeCase } from 'lodash/fp';
1
+ import _, { snakeCase } from 'lodash';
2
2
  import { identifiers } from '../utils/identifiers/index.mjs';
3
+ import { attributeNaming } from './attribute-naming.mjs';
3
4
 
4
5
  const ID = identifiers.ID_COLUMN;
5
6
  const ORDER = identifiers.ORDER_COLUMN;
@@ -267,7 +268,7 @@ const hasInverseOrderColumn = (attribute)=>isBidirectional(attribute) && isManyT
267
268
  if (!targetMeta) {
268
269
  throw new Error(`Morph target not found. Looking for ${attribute.target}`);
269
270
  }
270
- if (attribute.morphBy && !_.has(attribute.morphBy, targetMeta.attributes)) {
271
+ if (attribute.morphBy && !_.has(targetMeta.attributes, attribute.morphBy)) {
271
272
  throw new Error(`Morph target attribute not found. Looking for ${attribute.morphBy}`);
272
273
  }
273
274
  };
@@ -278,7 +279,7 @@ const hasInverseOrderColumn = (attribute)=>isBidirectional(attribute) && isManyT
278
279
  if (!targetMeta) {
279
280
  throw new Error(`Morph target not found. Looking for ${attribute.target}`);
280
281
  }
281
- if (attribute.morphBy && !_.has(attribute.morphBy, targetMeta.attributes)) {
282
+ if (attribute.morphBy && !_.has(targetMeta.attributes, attribute.morphBy)) {
282
283
  throw new Error(`Morph target attribute not found. Looking for ${attribute.morphBy}`);
283
284
  }
284
285
  };
@@ -289,7 +290,7 @@ const hasInverseOrderColumn = (attribute)=>isBidirectional(attribute) && isManyT
289
290
  if (!targetMeta) {
290
291
  throw new Error(`Unknown target ${attribute.target}`);
291
292
  }
292
- const joinColumnName = identifiers.getJoinColumnAttributeIdName(snakeCase(attributeName));
293
+ const joinColumnName = attributeNaming.joinColumnName(attributeName);
293
294
  const joinColumn = {
294
295
  name: joinColumnName,
295
296
  referencedColumn: ID,
@@ -326,7 +327,7 @@ const hasInverseOrderColumn = (attribute)=>isBidirectional(attribute) && isManyT
326
327
  if ('joinTable' in attribute && attribute.joinTable && !attribute.joinTable.__internal__) {
327
328
  return;
328
329
  }
329
- const joinTableName = identifiers.getJoinTableName(snakeCase(meta.tableName), snakeCase(attributeName));
330
+ const joinTableName = attributeNaming.joinTableName(meta.tableName, attributeName);
330
331
  const joinColumnName = identifiers.getJoinColumnAttributeIdName(snakeCase(meta.singularName));
331
332
  let inverseJoinColumnName = identifiers.getJoinColumnAttributeIdName(snakeCase(targetMeta.singularName));
332
333
  // if relation is self referencing
@@ -1 +1 @@
1
- {"version":3,"file":"relations.mjs","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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"}
1
+ {"version":3,"file":"relations.mjs","sources":["../../src/metadata/relations.ts"],"sourcesContent":["import _, { snakeCase } from 'lodash';\n\nimport { identifiers } from '../utils/identifiers';\nimport { attributeNaming } from './attribute-naming';\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(targetMeta.attributes, attribute.morphBy)) {\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(targetMeta.attributes, attribute.morphBy)) {\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 = attributeNaming.joinColumnName(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 = attributeNaming.joinTableName(meta.tableName, attributeName);\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","attributeNaming","inverseAttribute","inversedBy","inverseJoinColumnName","getInverseJoinColumnAttributeIdName","orderColumnName","getOrderColumnName","inverseOrderColumnName","getInverseOrderColumnName","invFkIndexName","getInverseFkIndexName","metadataSchema","getUniqueIndexName","inverseJoinColumn","defaultTo","push","getOrderFkIndexName","getOrderInverseFkIndexName","createRelation"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { Knex } from 'knex';
2
2
  import type { Database } from '..';
3
+ import type { MigrationFileBuilder } from './file-builder';
3
4
  export interface UserMigrationProvider {
4
5
  shouldRun(): Promise<boolean>;
5
6
  up(): Promise<void>;
@@ -15,6 +16,7 @@ export interface MigrationProvider {
15
16
  providers: {
16
17
  internal: InternalMigrationProvider;
17
18
  };
19
+ createFileBuilder(): MigrationFileBuilder;
18
20
  shouldRun(): Promise<boolean>;
19
21
  up(): Promise<void>;
20
22
  down(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/migrations/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAEnC,MAAM,WAAW,qBAAqB;IACpC,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IACrC,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AACD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE;QAAE,QAAQ,EAAE,yBAAyB,CAAA;KAAE,CAAC;IACnD,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,MAAM,MAAM,OAAO,GAAG;IAAE,EAAE,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEvC,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AAE7E,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,uBAAuB,KAAK;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,iBAAiB,CAAC;IACtB,IAAI,EAAE,iBAAiB,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAElF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,WAAW,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,IAAI,QAAQ,MAAM,IAAI,WAAW,iCAEhE,CAAC"}
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/migrations/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,MAAM,WAAW,qBAAqB;IACpC,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IACrC,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AACD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE;QAAE,QAAQ,EAAE,yBAAyB,CAAA;KAAE,CAAC;IACnD,iBAAiB,IAAI,oBAAoB,CAAC;IAC1C,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,MAAM,MAAM,OAAO,GAAG;IAAE,EAAE,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEvC,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AAE7E,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,uBAAuB,KAAK;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,iBAAiB,CAAC;IACtB,IAAI,EAAE,iBAAiB,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAElF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,WAAW,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,IAAI,QAAQ,MAAM,IAAI,WAAW,iCAEhE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sources":["../../src/migrations/common.ts"],"sourcesContent":["import type { Knex } from 'knex';\n\nimport type { Database } from '..';\n\nexport interface UserMigrationProvider {\n shouldRun(): Promise<boolean>;\n up(): Promise<void>;\n down(): Promise<void>;\n}\n\nexport interface InternalMigrationProvider {\n register(migration: Migration): void;\n shouldRun(): Promise<boolean>;\n up(): Promise<void>;\n down(): Promise<void>;\n}\nexport interface MigrationProvider {\n providers: { internal: InternalMigrationProvider };\n shouldRun(): Promise<boolean>;\n up(): Promise<void>;\n down(): Promise<void>;\n}\n\nexport type Context = { db: Database };\n\nexport type MigrationResolverParams = {\n name: string;\n path?: string;\n context: Context;\n};\n\nexport type MigrationRunnerFn = () => Promise<void> | Promise<Promise<void>>;\n\nexport type MigrationResolver = (params: MigrationResolverParams) => {\n name: string;\n path?: string;\n up: MigrationRunnerFn;\n down: MigrationRunnerFn;\n};\n\nexport type MigrationFn = (knex: Knex.Transaction, db: Database) => Promise<void>;\n\nexport type Migration = {\n name: string;\n up: MigrationFn;\n down: MigrationFn;\n};\n\nexport const wrapTransaction = (db: Database) => (fn: MigrationFn) => () => {\n return db.transaction(({ trx }) => Promise.resolve(fn(trx, db)));\n};\n"],"names":["wrapTransaction","db","fn","transaction","trx","Promise","resolve"],"mappings":";;AAgDO,MAAMA,eAAAA,GAAkB,CAACC,EAAAA,GAAiB,CAACC,EAAAA,GAAoB,IAAA;AACpE,YAAA,OAAOD,EAAAA,CAAGE,WAAW,CAAC,CAAC,EAAEC,GAAG,EAAE,GAAKC,OAAAA,CAAQC,OAAO,CAACJ,EAAAA,CAAGE,GAAAA,EAAKH,EAAAA,CAAAA,CAAAA,CAAAA;QAC7D;;;;"}
1
+ {"version":3,"file":"common.js","sources":["../../src/migrations/common.ts"],"sourcesContent":["import type { Knex } from 'knex';\n\nimport type { Database } from '..';\nimport type { MigrationFileBuilder } from './file-builder';\n\nexport interface UserMigrationProvider {\n shouldRun(): Promise<boolean>;\n up(): Promise<void>;\n down(): Promise<void>;\n}\n\nexport interface InternalMigrationProvider {\n register(migration: Migration): void;\n shouldRun(): Promise<boolean>;\n up(): Promise<void>;\n down(): Promise<void>;\n}\nexport interface MigrationProvider {\n providers: { internal: InternalMigrationProvider };\n createFileBuilder(): MigrationFileBuilder;\n shouldRun(): Promise<boolean>;\n up(): Promise<void>;\n down(): Promise<void>;\n}\n\nexport type Context = { db: Database };\n\nexport type MigrationResolverParams = {\n name: string;\n path?: string;\n context: Context;\n};\n\nexport type MigrationRunnerFn = () => Promise<void> | Promise<Promise<void>>;\n\nexport type MigrationResolver = (params: MigrationResolverParams) => {\n name: string;\n path?: string;\n up: MigrationRunnerFn;\n down: MigrationRunnerFn;\n};\n\nexport type MigrationFn = (knex: Knex.Transaction, db: Database) => Promise<void>;\n\nexport type Migration = {\n name: string;\n up: MigrationFn;\n down: MigrationFn;\n};\n\nexport const wrapTransaction = (db: Database) => (fn: MigrationFn) => () => {\n return db.transaction(({ trx }) => Promise.resolve(fn(trx, db)));\n};\n"],"names":["wrapTransaction","db","fn","transaction","trx","Promise","resolve"],"mappings":";;AAkDO,MAAMA,eAAAA,GAAkB,CAACC,EAAAA,GAAiB,CAACC,EAAAA,GAAoB,IAAA;AACpE,YAAA,OAAOD,EAAAA,CAAGE,WAAW,CAAC,CAAC,EAAEC,GAAG,EAAE,GAAKC,OAAAA,CAAQC,OAAO,CAACJ,EAAAA,CAAGE,GAAAA,EAAKH,EAAAA,CAAAA,CAAAA,CAAAA;QAC7D;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"common.mjs","sources":["../../src/migrations/common.ts"],"sourcesContent":["import type { Knex } from 'knex';\n\nimport type { Database } from '..';\n\nexport interface UserMigrationProvider {\n shouldRun(): Promise<boolean>;\n up(): Promise<void>;\n down(): Promise<void>;\n}\n\nexport interface InternalMigrationProvider {\n register(migration: Migration): void;\n shouldRun(): Promise<boolean>;\n up(): Promise<void>;\n down(): Promise<void>;\n}\nexport interface MigrationProvider {\n providers: { internal: InternalMigrationProvider };\n shouldRun(): Promise<boolean>;\n up(): Promise<void>;\n down(): Promise<void>;\n}\n\nexport type Context = { db: Database };\n\nexport type MigrationResolverParams = {\n name: string;\n path?: string;\n context: Context;\n};\n\nexport type MigrationRunnerFn = () => Promise<void> | Promise<Promise<void>>;\n\nexport type MigrationResolver = (params: MigrationResolverParams) => {\n name: string;\n path?: string;\n up: MigrationRunnerFn;\n down: MigrationRunnerFn;\n};\n\nexport type MigrationFn = (knex: Knex.Transaction, db: Database) => Promise<void>;\n\nexport type Migration = {\n name: string;\n up: MigrationFn;\n down: MigrationFn;\n};\n\nexport const wrapTransaction = (db: Database) => (fn: MigrationFn) => () => {\n return db.transaction(({ trx }) => Promise.resolve(fn(trx, db)));\n};\n"],"names":["wrapTransaction","db","fn","transaction","trx","Promise","resolve"],"mappings":"AAgDO,MAAMA,eAAAA,GAAkB,CAACC,EAAAA,GAAiB,CAACC,EAAAA,GAAoB,IAAA;AACpE,YAAA,OAAOD,EAAAA,CAAGE,WAAW,CAAC,CAAC,EAAEC,GAAG,EAAE,GAAKC,OAAAA,CAAQC,OAAO,CAACJ,EAAAA,CAAGE,GAAAA,EAAKH,EAAAA,CAAAA,CAAAA,CAAAA;QAC7D;;;;"}
1
+ {"version":3,"file":"common.mjs","sources":["../../src/migrations/common.ts"],"sourcesContent":["import type { Knex } from 'knex';\n\nimport type { Database } from '..';\nimport type { MigrationFileBuilder } from './file-builder';\n\nexport interface UserMigrationProvider {\n shouldRun(): Promise<boolean>;\n up(): Promise<void>;\n down(): Promise<void>;\n}\n\nexport interface InternalMigrationProvider {\n register(migration: Migration): void;\n shouldRun(): Promise<boolean>;\n up(): Promise<void>;\n down(): Promise<void>;\n}\nexport interface MigrationProvider {\n providers: { internal: InternalMigrationProvider };\n createFileBuilder(): MigrationFileBuilder;\n shouldRun(): Promise<boolean>;\n up(): Promise<void>;\n down(): Promise<void>;\n}\n\nexport type Context = { db: Database };\n\nexport type MigrationResolverParams = {\n name: string;\n path?: string;\n context: Context;\n};\n\nexport type MigrationRunnerFn = () => Promise<void> | Promise<Promise<void>>;\n\nexport type MigrationResolver = (params: MigrationResolverParams) => {\n name: string;\n path?: string;\n up: MigrationRunnerFn;\n down: MigrationRunnerFn;\n};\n\nexport type MigrationFn = (knex: Knex.Transaction, db: Database) => Promise<void>;\n\nexport type Migration = {\n name: string;\n up: MigrationFn;\n down: MigrationFn;\n};\n\nexport const wrapTransaction = (db: Database) => (fn: MigrationFn) => () => {\n return db.transaction(({ trx }) => Promise.resolve(fn(trx, db)));\n};\n"],"names":["wrapTransaction","db","fn","transaction","trx","Promise","resolve"],"mappings":"AAkDO,MAAMA,eAAAA,GAAkB,CAACC,EAAAA,GAAiB,CAACC,EAAAA,GAAoB,IAAA;AACpE,YAAA,OAAOD,EAAAA,CAAGE,WAAW,CAAC,CAAC,EAAEC,GAAG,EAAE,GAAKC,OAAAA,CAAQC,OAAO,CAACJ,EAAAA,CAAGE,GAAAA,EAAKH,EAAAA,CAAAA,CAAAA,CAAAA;QAC7D;;;;"}
@@ -0,0 +1,97 @@
1
+ import type { Database } from '..';
2
+ export interface BuiltMigrationFile {
3
+ filename: string;
4
+ content: string;
5
+ }
6
+ export interface RenameColumnOperation {
7
+ table: string;
8
+ from: string;
9
+ to: string;
10
+ comment?: string;
11
+ }
12
+ export interface RenameTableOperation {
13
+ from: string;
14
+ to: string;
15
+ comment?: string;
16
+ }
17
+ export interface UpdateRowsOperation {
18
+ table: string;
19
+ where: Record<string, string>;
20
+ set: Record<string, string>;
21
+ guardColumn?: string;
22
+ comment?: string;
23
+ }
24
+ /**
25
+ * One logical operation per generated file: the composed `origin -> final`
26
+ * attribute renames of every model that received hops, keyed by model uid.
27
+ * Dispatched at runtime to the handlers registered on `db.schema` (e.g. admin
28
+ * field permissions); the database package itself stores nothing by attribute
29
+ * name.
30
+ */
31
+ export interface AttributeRenamesOperation {
32
+ renames: Record<string, Record<string, string>>;
33
+ comment?: string;
34
+ }
35
+ export type MigrationFileOperation = ({
36
+ kind: 'renameColumn';
37
+ } & RenameColumnOperation) | ({
38
+ kind: 'renameTable';
39
+ } & RenameTableOperation) | ({
40
+ kind: 'updateRows';
41
+ } & UpdateRowsOperation) | ({
42
+ kind: 'attributeRenames';
43
+ } & AttributeRenamesOperation);
44
+ export type MigrationFileFormat = 'javascript' | 'typescript';
45
+ /**
46
+ * Produces a sortable, filesystem-safe UTC timestamp (e.g. `2026.06.11T15.16.00.123`).
47
+ *
48
+ * Based on the migration generator's format but keeps milliseconds: generated
49
+ * migrations can be written multiple times in the same second, so second
50
+ * precision would produce colliding filenames. UTC (not local time) so that
51
+ * files generated by developers in different time zones still sort in the
52
+ * order they were created.
53
+ */
54
+ export declare const getFormattedTimestamp: (date?: Date) => string;
55
+ export declare const getOperationComment: (op: MigrationFileOperation) => string;
56
+ export declare const renderMigrationFileOperation: (op: MigrationFileOperation) => string;
57
+ export declare const renderMigrationFile: ({ timestamp, operations, format, }: {
58
+ timestamp: string;
59
+ operations: MigrationFileOperation[];
60
+ format?: MigrationFileFormat;
61
+ }) => string;
62
+ interface BuildOptions {
63
+ name: string;
64
+ /**
65
+ * Module format of the generated file. `typescript` emits an ES module with
66
+ * typed `up`/`down` signatures and a `.ts` extension so the app's `tsc` build
67
+ * compiles it into `dist/database/migrations`, which is where migrations are
68
+ * discovered when `useTypescriptMigrations` is enabled. Defaults to
69
+ * `javascript` (CommonJS).
70
+ */
71
+ format?: MigrationFileFormat;
72
+ }
73
+ interface WriteOptions extends BuildOptions {
74
+ /**
75
+ * Directory the migration file is written to. Defaults to the database's
76
+ * configured migrations directory. The Content-Type Builder passes the app's
77
+ * source `database/migrations` explicitly so the file is never written into
78
+ * build output (e.g. `dist/` when `useTypescriptMigrations` is enabled).
79
+ */
80
+ dir?: string;
81
+ }
82
+ interface MigrationFileBuilderDeps {
83
+ db: Database;
84
+ }
85
+ export declare const createMigrationFileBuilder: ({ db }: MigrationFileBuilderDeps) => {
86
+ renameColumn(op: RenameColumnOperation): void;
87
+ renameTable(op: RenameTableOperation): void;
88
+ updateRows(op: UpdateRowsOperation): void;
89
+ attributeRenames(op: AttributeRenamesOperation): void;
90
+ hasChanges(): boolean;
91
+ getOperations(): MigrationFileOperation[];
92
+ build({ name, format }: BuildOptions, date?: Date): BuiltMigrationFile | null;
93
+ writeFiles(options: WriteOptions): Promise<string | null>;
94
+ };
95
+ export type MigrationFileBuilder = ReturnType<typeof createMigrationFileBuilder>;
96
+ export {};
97
+ //# sourceMappingURL=file-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-builder.d.ts","sourceRoot":"","sources":["../../src/migrations/file-builder.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAEnC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,sBAAsB,GAC9B,CAAC;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GAAG,qBAAqB,CAAC,GAClD,CAAC;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GAAG,oBAAoB,CAAC,GAChD,CAAC;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GAAG,mBAAmB,CAAC,GAC9C,CAAC;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,GAAG,yBAAyB,CAAC,CAAC;AAE/D,MAAM,MAAM,mBAAmB,GAAG,YAAY,GAAG,YAAY,CAAC;AAO9D;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,GAAI,OAAM,IAAiB,KAAG,MAE/D,CAAC;AA+HF,eAAO,MAAM,mBAAmB,GAAI,IAAI,sBAAsB,KAAG,MAEhE,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAI,IAAI,sBAAsB,KAAG,MAkCzE,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,oCAIjC;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,sBAAsB,EAAE,CAAC;IACrC,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B,KAAG,MAGH,CAAC;AAEF,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B;AAED,UAAU,YAAa,SAAQ,YAAY;IACzC;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAID,UAAU,wBAAwB;IAChC,EAAE,EAAE,QAAQ,CAAC;CACd;AAED,eAAO,MAAM,0BAA0B,GAAI,QAAQ,wBAAwB;qBAUtD,qBAAqB,GAAG,IAAI;oBAI7B,oBAAoB,GAAG,IAAI;mBAI5B,mBAAmB,GAAG,IAAI;yBAIpB,yBAAyB,GAAG,IAAI;kBAIvC,OAAO;qBAIJ,sBAAsB,EAAE;4BAKN,YAAY,SACvC,IAAI,GACT,kBAAkB,GAAG,IAAI;wBAYF,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CA+BlE,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAC"}