@strapi/database 5.37.1 → 5.38.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 (170) hide show
  1. package/dist/connection.js.map +1 -1
  2. package/dist/connection.mjs.map +1 -1
  3. package/dist/dialects/dialect.js.map +1 -1
  4. package/dist/dialects/dialect.mjs.map +1 -1
  5. package/dist/dialects/index.js.map +1 -1
  6. package/dist/dialects/index.mjs.map +1 -1
  7. package/dist/dialects/mysql/database-inspector.js.map +1 -1
  8. package/dist/dialects/mysql/database-inspector.mjs.map +1 -1
  9. package/dist/dialects/mysql/index.js.map +1 -1
  10. package/dist/dialects/mysql/index.mjs.map +1 -1
  11. package/dist/dialects/mysql/schema-inspector.js.map +1 -1
  12. package/dist/dialects/mysql/schema-inspector.mjs.map +1 -1
  13. package/dist/dialects/postgresql/index.js.map +1 -1
  14. package/dist/dialects/postgresql/index.mjs.map +1 -1
  15. package/dist/dialects/postgresql/schema-inspector.js.map +1 -1
  16. package/dist/dialects/postgresql/schema-inspector.mjs.map +1 -1
  17. package/dist/dialects/sqlite/index.js.map +1 -1
  18. package/dist/dialects/sqlite/index.mjs.map +1 -1
  19. package/dist/dialects/sqlite/schema-inspector.js.map +1 -1
  20. package/dist/dialects/sqlite/schema-inspector.mjs.map +1 -1
  21. package/dist/entity-manager/entity-repository.js.map +1 -1
  22. package/dist/entity-manager/entity-repository.mjs.map +1 -1
  23. package/dist/entity-manager/index.js.map +1 -1
  24. package/dist/entity-manager/index.mjs +4 -4
  25. package/dist/entity-manager/index.mjs.map +1 -1
  26. package/dist/entity-manager/morph-relations.js.map +1 -1
  27. package/dist/entity-manager/morph-relations.mjs.map +1 -1
  28. package/dist/entity-manager/regular-relations.js.map +1 -1
  29. package/dist/entity-manager/regular-relations.mjs +1 -1
  30. package/dist/entity-manager/regular-relations.mjs.map +1 -1
  31. package/dist/entity-manager/relations-orderer.js.map +1 -1
  32. package/dist/entity-manager/relations-orderer.mjs.map +1 -1
  33. package/dist/errors/database.js.map +1 -1
  34. package/dist/errors/database.mjs.map +1 -1
  35. package/dist/errors/invalid-date.js.map +1 -1
  36. package/dist/errors/invalid-date.mjs.map +1 -1
  37. package/dist/errors/invalid-datetime.js.map +1 -1
  38. package/dist/errors/invalid-datetime.mjs.map +1 -1
  39. package/dist/errors/invalid-relation.js.map +1 -1
  40. package/dist/errors/invalid-relation.mjs.map +1 -1
  41. package/dist/errors/invalid-time.js.map +1 -1
  42. package/dist/errors/invalid-time.mjs.map +1 -1
  43. package/dist/errors/not-null.js.map +1 -1
  44. package/dist/errors/not-null.mjs.map +1 -1
  45. package/dist/fields/biginteger.js.map +1 -1
  46. package/dist/fields/biginteger.mjs.map +1 -1
  47. package/dist/fields/boolean.js.map +1 -1
  48. package/dist/fields/boolean.mjs.map +1 -1
  49. package/dist/fields/date.js.map +1 -1
  50. package/dist/fields/date.mjs.map +1 -1
  51. package/dist/fields/datetime.js.map +1 -1
  52. package/dist/fields/datetime.mjs.map +1 -1
  53. package/dist/fields/field.js.map +1 -1
  54. package/dist/fields/field.mjs.map +1 -1
  55. package/dist/fields/index.js.map +1 -1
  56. package/dist/fields/index.mjs.map +1 -1
  57. package/dist/fields/json.js.map +1 -1
  58. package/dist/fields/json.mjs.map +1 -1
  59. package/dist/fields/number.js.map +1 -1
  60. package/dist/fields/number.mjs.map +1 -1
  61. package/dist/fields/shared/parsers.js.map +1 -1
  62. package/dist/fields/shared/parsers.mjs +1 -1
  63. package/dist/fields/shared/parsers.mjs.map +1 -1
  64. package/dist/fields/string.js.map +1 -1
  65. package/dist/fields/string.mjs.map +1 -1
  66. package/dist/fields/time.js.map +1 -1
  67. package/dist/fields/time.mjs.map +1 -1
  68. package/dist/fields/timestamp.js.map +1 -1
  69. package/dist/fields/timestamp.mjs.map +1 -1
  70. package/dist/index.js.map +1 -1
  71. package/dist/index.mjs.map +1 -1
  72. package/dist/lifecycles/index.js.map +1 -1
  73. package/dist/lifecycles/index.mjs.map +1 -1
  74. package/dist/lifecycles/subscribers/index.js.map +1 -1
  75. package/dist/lifecycles/subscribers/index.mjs.map +1 -1
  76. package/dist/lifecycles/subscribers/models-lifecycles.js.map +1 -1
  77. package/dist/lifecycles/subscribers/models-lifecycles.mjs.map +1 -1
  78. package/dist/lifecycles/subscribers/timestamps.js.map +1 -1
  79. package/dist/lifecycles/subscribers/timestamps.mjs.map +1 -1
  80. package/dist/metadata/index.js.map +1 -1
  81. package/dist/metadata/index.mjs.map +1 -1
  82. package/dist/metadata/metadata.js.map +1 -1
  83. package/dist/metadata/metadata.mjs.map +1 -1
  84. package/dist/metadata/relations.js +2 -6
  85. package/dist/metadata/relations.js.map +1 -1
  86. package/dist/metadata/relations.mjs +2 -6
  87. package/dist/metadata/relations.mjs.map +1 -1
  88. package/dist/migrations/common.js.map +1 -1
  89. package/dist/migrations/common.mjs.map +1 -1
  90. package/dist/migrations/index.js.map +1 -1
  91. package/dist/migrations/index.mjs.map +1 -1
  92. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js.map +1 -1
  93. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs.map +1 -1
  94. package/dist/migrations/internal-migrations/5.0.0-02-document-id.js.map +1 -1
  95. package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs.map +1 -1
  96. package/dist/migrations/internal-migrations/5.0.0-03-locale.js.map +1 -1
  97. package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs.map +1 -1
  98. package/dist/migrations/internal-migrations/5.0.0-04-published-at.js.map +1 -1
  99. package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs.map +1 -1
  100. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js.map +1 -1
  101. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs.map +1 -1
  102. package/dist/migrations/internal-migrations/5.0.0-06-add-document-id-indexes.js.map +1 -1
  103. package/dist/migrations/internal-migrations/5.0.0-06-add-document-id-indexes.mjs.map +1 -1
  104. package/dist/migrations/internal-migrations/index.js.map +1 -1
  105. package/dist/migrations/internal-migrations/index.mjs.map +1 -1
  106. package/dist/migrations/internal.js.map +1 -1
  107. package/dist/migrations/internal.mjs.map +1 -1
  108. package/dist/migrations/logger.js.map +1 -1
  109. package/dist/migrations/logger.mjs.map +1 -1
  110. package/dist/migrations/storage.js.map +1 -1
  111. package/dist/migrations/storage.mjs.map +1 -1
  112. package/dist/migrations/users.js.map +1 -1
  113. package/dist/migrations/users.mjs.map +1 -1
  114. package/dist/query/helpers/join.js.map +1 -1
  115. package/dist/query/helpers/join.mjs.map +1 -1
  116. package/dist/query/helpers/order-by.js.map +1 -1
  117. package/dist/query/helpers/order-by.mjs.map +1 -1
  118. package/dist/query/helpers/populate/apply.js +3 -9
  119. package/dist/query/helpers/populate/apply.js.map +1 -1
  120. package/dist/query/helpers/populate/apply.mjs +3 -9
  121. package/dist/query/helpers/populate/apply.mjs.map +1 -1
  122. package/dist/query/helpers/populate/process.js.map +1 -1
  123. package/dist/query/helpers/populate/process.mjs.map +1 -1
  124. package/dist/query/helpers/search.js.map +1 -1
  125. package/dist/query/helpers/search.mjs.map +1 -1
  126. package/dist/query/helpers/streams/readable.js.map +1 -1
  127. package/dist/query/helpers/streams/readable.mjs.map +1 -1
  128. package/dist/query/helpers/transform.js.map +1 -1
  129. package/dist/query/helpers/transform.mjs.map +1 -1
  130. package/dist/query/helpers/where.js.map +1 -1
  131. package/dist/query/helpers/where.mjs.map +1 -1
  132. package/dist/query/query-builder.js.map +1 -1
  133. package/dist/query/query-builder.mjs +4 -4
  134. package/dist/query/query-builder.mjs.map +1 -1
  135. package/dist/repairs/index.js.map +1 -1
  136. package/dist/repairs/index.mjs.map +1 -1
  137. package/dist/repairs/operations/process-unidirectional-join-tables.js.map +1 -1
  138. package/dist/repairs/operations/process-unidirectional-join-tables.mjs.map +1 -1
  139. package/dist/repairs/operations/remove-orphan-morph-types.js.map +1 -1
  140. package/dist/repairs/operations/remove-orphan-morph-types.mjs.map +1 -1
  141. package/dist/schema/builder.js.map +1 -1
  142. package/dist/schema/builder.mjs +1 -1
  143. package/dist/schema/builder.mjs.map +1 -1
  144. package/dist/schema/diff.js.map +1 -1
  145. package/dist/schema/diff.mjs.map +1 -1
  146. package/dist/schema/index.js.map +1 -1
  147. package/dist/schema/index.mjs.map +1 -1
  148. package/dist/schema/schema.js.map +1 -1
  149. package/dist/schema/schema.mjs.map +1 -1
  150. package/dist/schema/storage.js.map +1 -1
  151. package/dist/schema/storage.mjs.map +1 -1
  152. package/dist/transaction-context.js.map +1 -1
  153. package/dist/transaction-context.mjs.map +1 -1
  154. package/dist/utils/async-curry.js.map +1 -1
  155. package/dist/utils/async-curry.mjs.map +1 -1
  156. package/dist/utils/identifiers/hash.js.map +1 -1
  157. package/dist/utils/identifiers/hash.mjs.map +1 -1
  158. package/dist/utils/identifiers/index.js.map +1 -1
  159. package/dist/utils/identifiers/index.mjs.map +1 -1
  160. package/dist/utils/knex.js.map +1 -1
  161. package/dist/utils/knex.mjs.map +1 -1
  162. package/dist/utils/types.js.map +1 -1
  163. package/dist/utils/types.mjs.map +1 -1
  164. package/dist/validations/index.js.map +1 -1
  165. package/dist/validations/index.mjs.map +1 -1
  166. package/dist/validations/relations/bidirectional.js.map +1 -1
  167. package/dist/validations/relations/bidirectional.mjs.map +1 -1
  168. package/dist/validations/relations/index.js.map +1 -1
  169. package/dist/validations/relations/index.mjs.map +1 -1
  170. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sources":["../../src/schema/schema.ts"],"sourcesContent":["import * as types from '../utils/types';\nimport { identifiers } from '../utils/identifiers';\nimport type { Metadata, Meta } from '../metadata';\nimport type { Column, Schema, Table } from './types';\nimport type { Attribute } from '../types';\n\n/**\n * TODO: This needs to be refactored to support incoming names such as\n * (column, table, index) that are of the form string | NameToken[] so\n * that pieces can be passed through and shortened here.\n *\n * Currently, we are potentially shortening twice, although in reality\n * that won't happen since the shortened attribute column names will\n * fit here because they are already shortened to the max identifier\n * length\n *\n * That is the reason we use getName() here and not getColumnName();\n * we just want the exact shortened name for the value without doing\n * any other potential manipulation to it\n * */\n\nconst createColumn = (name: string, attribute: Attribute): Column => {\n const { type, args = [], ...opts } = getColumnType(attribute);\n\n return {\n name: identifiers.getName(name),\n type,\n args,\n defaultTo: null,\n notNullable: false,\n unsigned: false,\n ...opts,\n ...('column' in attribute ? (attribute.column ?? {}) : {}),\n };\n};\n\nconst createTable = (meta: Meta): Table => {\n const table: Table = {\n name: meta.tableName,\n indexes: meta.indexes || [],\n foreignKeys: meta.foreignKeys || [],\n columns: [],\n };\n\n for (const key of Object.keys(meta.attributes)) {\n const attribute = meta.attributes[key];\n\n // if (types.isRelation(attribute.type)) {\n if (attribute.type === 'relation') {\n if ('morphColumn' in attribute && attribute.morphColumn && attribute.owner) {\n const { idColumn, typeColumn } = attribute.morphColumn;\n\n const idColumnName = identifiers.getName(idColumn.name);\n const typeColumnName = identifiers.getName(typeColumn.name);\n\n table.columns.push(\n createColumn(idColumnName, {\n type: 'integer',\n column: {\n unsigned: true,\n },\n })\n );\n\n table.columns.push(createColumn(typeColumnName, { type: 'string' }));\n } else if (\n 'joinColumn' in attribute &&\n attribute.joinColumn &&\n attribute.owner &&\n attribute.joinColumn.referencedTable\n ) {\n // NOTE: we could pass uniquness for oneToOne to avoid creating more than one to one\n\n const {\n name: columnNameFull,\n referencedColumn,\n referencedTable,\n columnType = 'integer',\n } = attribute.joinColumn;\n\n const columnName = identifiers.getName(columnNameFull);\n\n const column = createColumn(columnName, {\n // TODO: find the column type automatically, or allow passing all the column params\n type: columnType,\n column: {\n unsigned: true,\n },\n });\n\n table.columns.push(column);\n\n const fkName = identifiers.getFkIndexName([table.name, columnName]);\n table.foreignKeys.push({\n name: fkName,\n columns: [column.name],\n referencedTable,\n referencedColumns: [referencedColumn],\n // NOTE: could allow configuration\n onDelete: 'SET NULL',\n });\n\n table.indexes.push({\n name: fkName,\n columns: [column.name],\n });\n }\n } else if (types.isScalarAttribute(attribute)) {\n const columnName = identifiers.getName(attribute.columnName || key);\n\n const column = createColumn(columnName, attribute);\n\n if (column.unique) {\n table.indexes.push({\n type: 'unique',\n name: identifiers.getUniqueIndexName([table.name, column.name]),\n columns: [columnName],\n });\n }\n\n if (column.primary) {\n table.indexes.push({\n type: 'primary',\n name: identifiers.getPrimaryIndexName([table.name, column.name]),\n columns: [columnName],\n });\n }\n\n table.columns.push(column);\n }\n }\n\n return table;\n};\n\nconst getColumnType = (attribute: Attribute) => {\n if ('columnType' in attribute && attribute.columnType) {\n return attribute.columnType;\n }\n\n switch (attribute.type) {\n case 'increments': {\n return {\n type: 'increments',\n args: [{ primary: true, primaryKey: true }],\n notNullable: true,\n };\n }\n\n // We might want to convert email/password to string types before going into the orm with specific validators & transformers\n case 'password':\n case 'email':\n case 'string':\n case 'enumeration': {\n return { type: 'string' };\n }\n case 'uid': {\n return {\n type: 'string',\n };\n }\n case 'richtext':\n case 'text': {\n return {\n type: 'text',\n args: ['longtext'],\n };\n }\n case 'blocks':\n case 'json': {\n return { type: 'jsonb' };\n }\n case 'integer': {\n return { type: 'integer' };\n }\n case 'biginteger': {\n return { type: 'bigInteger' };\n }\n case 'float': {\n return { type: 'double' };\n }\n case 'decimal': {\n return { type: 'decimal', args: [10, 2] };\n }\n case 'date': {\n return { type: 'date' };\n }\n case 'time': {\n return { type: 'time', args: [{ precision: 3 }] };\n }\n case 'datetime': {\n return {\n type: 'datetime',\n args: [\n {\n useTz: false,\n precision: 6,\n },\n ],\n };\n }\n case 'timestamp': {\n return {\n type: 'timestamp',\n args: [\n {\n useTz: false,\n precision: 6,\n },\n ],\n };\n }\n case 'boolean': {\n return { type: 'boolean' };\n }\n default: {\n throw new Error(`Unknown type ${attribute.type}`);\n }\n }\n};\n\nexport const metadataToSchema = (metadata: Metadata): Schema => {\n const schema: Schema = {\n tables: [],\n };\n\n metadata.forEach((metadata) => {\n schema.tables.push(createTable(metadata));\n });\n\n return schema;\n};\n"],"names":["createColumn","name","attribute","type","args","opts","getColumnType","identifiers","getName","defaultTo","notNullable","unsigned","column","createTable","meta","table","tableName","indexes","foreignKeys","columns","key","Object","keys","attributes","morphColumn","owner","idColumn","typeColumn","idColumnName","typeColumnName","push","joinColumn","referencedTable","columnNameFull","referencedColumn","columnType","columnName","fkName","getFkIndexName","referencedColumns","onDelete","types","unique","getUniqueIndexName","primary","getPrimaryIndexName","primaryKey","precision","useTz","Error","metadataToSchema","metadata","schema","tables","forEach"],"mappings":";;;;;AAMA;;;;;;;;;;;;;MAeA,MAAMA,YAAe,GAAA,CAACC,IAAcC,EAAAA,SAAAA,GAAAA;IAClC,MAAM,EAAEC,IAAI,EAAEC,IAAAA,GAAO,EAAE,EAAE,GAAGC,IAAM,EAAA,GAAGC,aAAcJ,CAAAA,SAAAA,CAAAA;IAEnD,OAAO;QACLD,IAAMM,EAAAA,iBAAAA,CAAYC,OAAO,CAACP,IAAAA,CAAAA;AAC1BE,QAAAA,IAAAA;AACAC,QAAAA,IAAAA;QACAK,SAAW,EAAA,IAAA;QACXC,WAAa,EAAA,KAAA;QACbC,QAAU,EAAA,KAAA;AACV,QAAA,GAAGN,IAAI;QACP,GAAI,QAAA,IAAYH,YAAaA,SAAUU,CAAAA,MAAM,IAAI,EAAC,GAAK;AACzD,KAAA;AACF,CAAA;AAEA,MAAMC,cAAc,CAACC,IAAAA,GAAAA;AACnB,IAAA,MAAMC,KAAe,GAAA;AACnBd,QAAAA,IAAAA,EAAMa,KAAKE,SAAS;QACpBC,OAASH,EAAAA,IAAAA,CAAKG,OAAO,IAAI,EAAE;QAC3BC,WAAaJ,EAAAA,IAAAA,CAAKI,WAAW,IAAI,EAAE;AACnCC,QAAAA,OAAAA,EAAS;AACX,KAAA;AAEA,IAAA,KAAK,MAAMC,GAAOC,IAAAA,MAAAA,CAAOC,IAAI,CAACR,IAAAA,CAAKS,UAAU,CAAG,CAAA;AAC9C,QAAA,MAAMrB,SAAYY,GAAAA,IAAAA,CAAKS,UAAU,CAACH,GAAI,CAAA;;QAGtC,IAAIlB,SAAAA,CAAUC,IAAI,KAAK,UAAY,EAAA;AACjC,YAAA,IAAI,iBAAiBD,SAAaA,IAAAA,SAAAA,CAAUsB,WAAW,IAAItB,SAAAA,CAAUuB,KAAK,EAAE;AAC1E,gBAAA,MAAM,EAAEC,QAAQ,EAAEC,UAAU,EAAE,GAAGzB,UAAUsB,WAAW;AAEtD,gBAAA,MAAMI,YAAerB,GAAAA,iBAAAA,CAAYC,OAAO,CAACkB,SAASzB,IAAI,CAAA;AACtD,gBAAA,MAAM4B,cAAiBtB,GAAAA,iBAAAA,CAAYC,OAAO,CAACmB,WAAW1B,IAAI,CAAA;AAE1Dc,gBAAAA,KAAAA,CAAMI,OAAO,CAACW,IAAI,CAChB9B,aAAa4B,YAAc,EAAA;oBACzBzB,IAAM,EAAA,SAAA;oBACNS,MAAQ,EAAA;wBACND,QAAU,EAAA;AACZ;AACF,iBAAA,CAAA,CAAA;AAGFI,gBAAAA,KAAAA,CAAMI,OAAO,CAACW,IAAI,CAAC9B,aAAa6B,cAAgB,EAAA;oBAAE1B,IAAM,EAAA;AAAS,iBAAA,CAAA,CAAA;AACnE,aAAA,MAAO,IACL,YAAA,IAAgBD,SAChBA,IAAAA,SAAAA,CAAU6B,UAAU,IACpB7B,SAAUuB,CAAAA,KAAK,IACfvB,SAAAA,CAAU6B,UAAU,CAACC,eAAe,EACpC;;AAGA,gBAAA,MAAM,EACJ/B,IAAAA,EAAMgC,cAAc,EACpBC,gBAAgB,EAChBF,eAAe,EACfG,UAAa,GAAA,SAAS,EACvB,GAAGjC,UAAU6B,UAAU;gBAExB,MAAMK,UAAAA,GAAa7B,iBAAYC,CAAAA,OAAO,CAACyB,cAAAA,CAAAA;gBAEvC,MAAMrB,MAAAA,GAASZ,aAAaoC,UAAY,EAAA;;oBAEtCjC,IAAMgC,EAAAA,UAAAA;oBACNvB,MAAQ,EAAA;wBACND,QAAU,EAAA;AACZ;AACF,iBAAA,CAAA;gBAEAI,KAAMI,CAAAA,OAAO,CAACW,IAAI,CAAClB,MAAAA,CAAAA;gBAEnB,MAAMyB,MAAAA,GAAS9B,iBAAY+B,CAAAA,cAAc,CAAC;AAACvB,oBAAAA,KAAAA,CAAMd,IAAI;AAAEmC,oBAAAA;AAAW,iBAAA,CAAA;gBAClErB,KAAMG,CAAAA,WAAW,CAACY,IAAI,CAAC;oBACrB7B,IAAMoC,EAAAA,MAAAA;oBACNlB,OAAS,EAAA;AAACP,wBAAAA,MAAAA,CAAOX;AAAK,qBAAA;AACtB+B,oBAAAA,eAAAA;oBACAO,iBAAmB,EAAA;AAACL,wBAAAA;AAAiB,qBAAA;;oBAErCM,QAAU,EAAA;AACZ,iBAAA,CAAA;gBAEAzB,KAAME,CAAAA,OAAO,CAACa,IAAI,CAAC;oBACjB7B,IAAMoC,EAAAA,MAAAA;oBACNlB,OAAS,EAAA;AAACP,wBAAAA,MAAAA,CAAOX;AAAK;AACxB,iBAAA,CAAA;AACF;AACF,SAAA,MAAO,IAAIwC,uBAAuB,CAACvC,SAAY,CAAA,EAAA;AAC7C,YAAA,MAAMkC,aAAa7B,iBAAYC,CAAAA,OAAO,CAACN,SAAAA,CAAUkC,UAAU,IAAIhB,GAAAA,CAAAA;YAE/D,MAAMR,MAAAA,GAASZ,aAAaoC,UAAYlC,EAAAA,SAAAA,CAAAA;YAExC,IAAIU,MAAAA,CAAO8B,MAAM,EAAE;gBACjB3B,KAAME,CAAAA,OAAO,CAACa,IAAI,CAAC;oBACjB3B,IAAM,EAAA,QAAA;oBACNF,IAAMM,EAAAA,iBAAAA,CAAYoC,kBAAkB,CAAC;AAAC5B,wBAAAA,KAAAA,CAAMd,IAAI;AAAEW,wBAAAA,MAAAA,CAAOX;AAAK,qBAAA,CAAA;oBAC9DkB,OAAS,EAAA;AAACiB,wBAAAA;AAAW;AACvB,iBAAA,CAAA;AACF;YAEA,IAAIxB,MAAAA,CAAOgC,OAAO,EAAE;gBAClB7B,KAAME,CAAAA,OAAO,CAACa,IAAI,CAAC;oBACjB3B,IAAM,EAAA,SAAA;oBACNF,IAAMM,EAAAA,iBAAAA,CAAYsC,mBAAmB,CAAC;AAAC9B,wBAAAA,KAAAA,CAAMd,IAAI;AAAEW,wBAAAA,MAAAA,CAAOX;AAAK,qBAAA,CAAA;oBAC/DkB,OAAS,EAAA;AAACiB,wBAAAA;AAAW;AACvB,iBAAA,CAAA;AACF;YAEArB,KAAMI,CAAAA,OAAO,CAACW,IAAI,CAAClB,MAAAA,CAAAA;AACrB;AACF;IAEA,OAAOG,KAAAA;AACT,CAAA;AAEA,MAAMT,gBAAgB,CAACJ,SAAAA,GAAAA;AACrB,IAAA,IAAI,YAAgBA,IAAAA,SAAAA,IAAaA,SAAUiC,CAAAA,UAAU,EAAE;AACrD,QAAA,OAAOjC,UAAUiC,UAAU;AAC7B;AAEA,IAAA,OAAQjC,UAAUC,IAAI;QACpB,KAAK,YAAA;AAAc,YAAA;gBACjB,OAAO;oBACLA,IAAM,EAAA,YAAA;oBACNC,IAAM,EAAA;AAAC,wBAAA;4BAAEwC,OAAS,EAAA,IAAA;4BAAME,UAAY,EAAA;AAAK;AAAE,qBAAA;oBAC3CpC,WAAa,EAAA;AACf,iBAAA;AACF;;QAGA,KAAK,UAAA;QACL,KAAK,OAAA;QACL,KAAK,QAAA;QACL,KAAK,aAAA;AAAe,YAAA;gBAClB,OAAO;oBAAEP,IAAM,EAAA;AAAS,iBAAA;AAC1B;QACA,KAAK,KAAA;AAAO,YAAA;gBACV,OAAO;oBACLA,IAAM,EAAA;AACR,iBAAA;AACF;QACA,KAAK,UAAA;QACL,KAAK,MAAA;AAAQ,YAAA;gBACX,OAAO;oBACLA,IAAM,EAAA,MAAA;oBACNC,IAAM,EAAA;AAAC,wBAAA;AAAW;AACpB,iBAAA;AACF;QACA,KAAK,QAAA;QACL,KAAK,MAAA;AAAQ,YAAA;gBACX,OAAO;oBAAED,IAAM,EAAA;AAAQ,iBAAA;AACzB;QACA,KAAK,SAAA;AAAW,YAAA;gBACd,OAAO;oBAAEA,IAAM,EAAA;AAAU,iBAAA;AAC3B;QACA,KAAK,YAAA;AAAc,YAAA;gBACjB,OAAO;oBAAEA,IAAM,EAAA;AAAa,iBAAA;AAC9B;QACA,KAAK,OAAA;AAAS,YAAA;gBACZ,OAAO;oBAAEA,IAAM,EAAA;AAAS,iBAAA;AAC1B;QACA,KAAK,SAAA;AAAW,YAAA;gBACd,OAAO;oBAAEA,IAAM,EAAA,SAAA;oBAAWC,IAAM,EAAA;AAAC,wBAAA,EAAA;AAAI,wBAAA;AAAE;AAAC,iBAAA;AAC1C;QACA,KAAK,MAAA;AAAQ,YAAA;gBACX,OAAO;oBAAED,IAAM,EAAA;AAAO,iBAAA;AACxB;QACA,KAAK,MAAA;AAAQ,YAAA;gBACX,OAAO;oBAAEA,IAAM,EAAA,MAAA;oBAAQC,IAAM,EAAA;AAAC,wBAAA;4BAAE2C,SAAW,EAAA;AAAE;AAAE;AAAC,iBAAA;AAClD;QACA,KAAK,UAAA;AAAY,YAAA;gBACf,OAAO;oBACL5C,IAAM,EAAA,UAAA;oBACNC,IAAM,EAAA;AACJ,wBAAA;4BACE4C,KAAO,EAAA,KAAA;4BACPD,SAAW,EAAA;AACb;AACD;AACH,iBAAA;AACF;QACA,KAAK,WAAA;AAAa,YAAA;gBAChB,OAAO;oBACL5C,IAAM,EAAA,WAAA;oBACNC,IAAM,EAAA;AACJ,wBAAA;4BACE4C,KAAO,EAAA,KAAA;4BACPD,SAAW,EAAA;AACb;AACD;AACH,iBAAA;AACF;QACA,KAAK,SAAA;AAAW,YAAA;gBACd,OAAO;oBAAE5C,IAAM,EAAA;AAAU,iBAAA;AAC3B;AACA,QAAA;AAAS,YAAA;AACP,gBAAA,MAAM,IAAI8C,KAAM,CAAA,CAAC,aAAa,EAAE/C,SAAAA,CAAUC,IAAI,CAAE,CAAA,CAAA;AAClD;AACF;AACF,CAAA;AAEO,MAAM+C,mBAAmB,CAACC,QAAAA,GAAAA;AAC/B,IAAA,MAAMC,MAAiB,GAAA;AACrBC,QAAAA,MAAAA,EAAQ;AACV,KAAA;IAEAF,QAASG,CAAAA,OAAO,CAAC,CAACH,QAAAA,GAAAA;AAChBC,QAAAA,MAAAA,CAAOC,MAAM,CAACvB,IAAI,CAACjB,WAAYsC,CAAAA,QAAAA,CAAAA,CAAAA;AACjC,KAAA,CAAA;IAEA,OAAOC,MAAAA;AACT;;;;"}
1
+ {"version":3,"file":"schema.js","sources":["../../src/schema/schema.ts"],"sourcesContent":["import * as types from '../utils/types';\nimport { identifiers } from '../utils/identifiers';\nimport type { Metadata, Meta } from '../metadata';\nimport type { Column, Schema, Table } from './types';\nimport type { Attribute } from '../types';\n\n/**\n * TODO: This needs to be refactored to support incoming names such as\n * (column, table, index) that are of the form string | NameToken[] so\n * that pieces can be passed through and shortened here.\n *\n * Currently, we are potentially shortening twice, although in reality\n * that won't happen since the shortened attribute column names will\n * fit here because they are already shortened to the max identifier\n * length\n *\n * That is the reason we use getName() here and not getColumnName();\n * we just want the exact shortened name for the value without doing\n * any other potential manipulation to it\n * */\n\nconst createColumn = (name: string, attribute: Attribute): Column => {\n const { type, args = [], ...opts } = getColumnType(attribute);\n\n return {\n name: identifiers.getName(name),\n type,\n args,\n defaultTo: null,\n notNullable: false,\n unsigned: false,\n ...opts,\n ...('column' in attribute ? (attribute.column ?? {}) : {}),\n };\n};\n\nconst createTable = (meta: Meta): Table => {\n const table: Table = {\n name: meta.tableName,\n indexes: meta.indexes || [],\n foreignKeys: meta.foreignKeys || [],\n columns: [],\n };\n\n for (const key of Object.keys(meta.attributes)) {\n const attribute = meta.attributes[key];\n\n // if (types.isRelation(attribute.type)) {\n if (attribute.type === 'relation') {\n if ('morphColumn' in attribute && attribute.morphColumn && attribute.owner) {\n const { idColumn, typeColumn } = attribute.morphColumn;\n\n const idColumnName = identifiers.getName(idColumn.name);\n const typeColumnName = identifiers.getName(typeColumn.name);\n\n table.columns.push(\n createColumn(idColumnName, {\n type: 'integer',\n column: {\n unsigned: true,\n },\n })\n );\n\n table.columns.push(createColumn(typeColumnName, { type: 'string' }));\n } else if (\n 'joinColumn' in attribute &&\n attribute.joinColumn &&\n attribute.owner &&\n attribute.joinColumn.referencedTable\n ) {\n // NOTE: we could pass uniquness for oneToOne to avoid creating more than one to one\n\n const {\n name: columnNameFull,\n referencedColumn,\n referencedTable,\n columnType = 'integer',\n } = attribute.joinColumn;\n\n const columnName = identifiers.getName(columnNameFull);\n\n const column = createColumn(columnName, {\n // TODO: find the column type automatically, or allow passing all the column params\n type: columnType,\n column: {\n unsigned: true,\n },\n });\n\n table.columns.push(column);\n\n const fkName = identifiers.getFkIndexName([table.name, columnName]);\n table.foreignKeys.push({\n name: fkName,\n columns: [column.name],\n referencedTable,\n referencedColumns: [referencedColumn],\n // NOTE: could allow configuration\n onDelete: 'SET NULL',\n });\n\n table.indexes.push({\n name: fkName,\n columns: [column.name],\n });\n }\n } else if (types.isScalarAttribute(attribute)) {\n const columnName = identifiers.getName(attribute.columnName || key);\n\n const column = createColumn(columnName, attribute);\n\n if (column.unique) {\n table.indexes.push({\n type: 'unique',\n name: identifiers.getUniqueIndexName([table.name, column.name]),\n columns: [columnName],\n });\n }\n\n if (column.primary) {\n table.indexes.push({\n type: 'primary',\n name: identifiers.getPrimaryIndexName([table.name, column.name]),\n columns: [columnName],\n });\n }\n\n table.columns.push(column);\n }\n }\n\n return table;\n};\n\nconst getColumnType = (attribute: Attribute) => {\n if ('columnType' in attribute && attribute.columnType) {\n return attribute.columnType;\n }\n\n switch (attribute.type) {\n case 'increments': {\n return {\n type: 'increments',\n args: [{ primary: true, primaryKey: true }],\n notNullable: true,\n };\n }\n\n // We might want to convert email/password to string types before going into the orm with specific validators & transformers\n case 'password':\n case 'email':\n case 'string':\n case 'enumeration': {\n return { type: 'string' };\n }\n case 'uid': {\n return {\n type: 'string',\n };\n }\n case 'richtext':\n case 'text': {\n return {\n type: 'text',\n args: ['longtext'],\n };\n }\n case 'blocks':\n case 'json': {\n return { type: 'jsonb' };\n }\n case 'integer': {\n return { type: 'integer' };\n }\n case 'biginteger': {\n return { type: 'bigInteger' };\n }\n case 'float': {\n return { type: 'double' };\n }\n case 'decimal': {\n return { type: 'decimal', args: [10, 2] };\n }\n case 'date': {\n return { type: 'date' };\n }\n case 'time': {\n return { type: 'time', args: [{ precision: 3 }] };\n }\n case 'datetime': {\n return {\n type: 'datetime',\n args: [\n {\n useTz: false,\n precision: 6,\n },\n ],\n };\n }\n case 'timestamp': {\n return {\n type: 'timestamp',\n args: [\n {\n useTz: false,\n precision: 6,\n },\n ],\n };\n }\n case 'boolean': {\n return { type: 'boolean' };\n }\n default: {\n throw new Error(`Unknown type ${attribute.type}`);\n }\n }\n};\n\nexport const metadataToSchema = (metadata: Metadata): Schema => {\n const schema: Schema = {\n tables: [],\n };\n\n metadata.forEach((metadata) => {\n schema.tables.push(createTable(metadata));\n });\n\n return schema;\n};\n"],"names":["createColumn","name","attribute","type","args","opts","getColumnType","identifiers","getName","defaultTo","notNullable","unsigned","column","createTable","meta","table","tableName","indexes","foreignKeys","columns","key","Object","keys","attributes","morphColumn","owner","idColumn","typeColumn","idColumnName","typeColumnName","push","joinColumn","referencedTable","columnNameFull","referencedColumn","columnType","columnName","fkName","getFkIndexName","referencedColumns","onDelete","types","unique","getUniqueIndexName","primary","getPrimaryIndexName","primaryKey","precision","useTz","Error","metadataToSchema","metadata","schema","tables","forEach"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.mjs","sources":["../../src/schema/schema.ts"],"sourcesContent":["import * as types from '../utils/types';\nimport { identifiers } from '../utils/identifiers';\nimport type { Metadata, Meta } from '../metadata';\nimport type { Column, Schema, Table } from './types';\nimport type { Attribute } from '../types';\n\n/**\n * TODO: This needs to be refactored to support incoming names such as\n * (column, table, index) that are of the form string | NameToken[] so\n * that pieces can be passed through and shortened here.\n *\n * Currently, we are potentially shortening twice, although in reality\n * that won't happen since the shortened attribute column names will\n * fit here because they are already shortened to the max identifier\n * length\n *\n * That is the reason we use getName() here and not getColumnName();\n * we just want the exact shortened name for the value without doing\n * any other potential manipulation to it\n * */\n\nconst createColumn = (name: string, attribute: Attribute): Column => {\n const { type, args = [], ...opts } = getColumnType(attribute);\n\n return {\n name: identifiers.getName(name),\n type,\n args,\n defaultTo: null,\n notNullable: false,\n unsigned: false,\n ...opts,\n ...('column' in attribute ? (attribute.column ?? {}) : {}),\n };\n};\n\nconst createTable = (meta: Meta): Table => {\n const table: Table = {\n name: meta.tableName,\n indexes: meta.indexes || [],\n foreignKeys: meta.foreignKeys || [],\n columns: [],\n };\n\n for (const key of Object.keys(meta.attributes)) {\n const attribute = meta.attributes[key];\n\n // if (types.isRelation(attribute.type)) {\n if (attribute.type === 'relation') {\n if ('morphColumn' in attribute && attribute.morphColumn && attribute.owner) {\n const { idColumn, typeColumn } = attribute.morphColumn;\n\n const idColumnName = identifiers.getName(idColumn.name);\n const typeColumnName = identifiers.getName(typeColumn.name);\n\n table.columns.push(\n createColumn(idColumnName, {\n type: 'integer',\n column: {\n unsigned: true,\n },\n })\n );\n\n table.columns.push(createColumn(typeColumnName, { type: 'string' }));\n } else if (\n 'joinColumn' in attribute &&\n attribute.joinColumn &&\n attribute.owner &&\n attribute.joinColumn.referencedTable\n ) {\n // NOTE: we could pass uniquness for oneToOne to avoid creating more than one to one\n\n const {\n name: columnNameFull,\n referencedColumn,\n referencedTable,\n columnType = 'integer',\n } = attribute.joinColumn;\n\n const columnName = identifiers.getName(columnNameFull);\n\n const column = createColumn(columnName, {\n // TODO: find the column type automatically, or allow passing all the column params\n type: columnType,\n column: {\n unsigned: true,\n },\n });\n\n table.columns.push(column);\n\n const fkName = identifiers.getFkIndexName([table.name, columnName]);\n table.foreignKeys.push({\n name: fkName,\n columns: [column.name],\n referencedTable,\n referencedColumns: [referencedColumn],\n // NOTE: could allow configuration\n onDelete: 'SET NULL',\n });\n\n table.indexes.push({\n name: fkName,\n columns: [column.name],\n });\n }\n } else if (types.isScalarAttribute(attribute)) {\n const columnName = identifiers.getName(attribute.columnName || key);\n\n const column = createColumn(columnName, attribute);\n\n if (column.unique) {\n table.indexes.push({\n type: 'unique',\n name: identifiers.getUniqueIndexName([table.name, column.name]),\n columns: [columnName],\n });\n }\n\n if (column.primary) {\n table.indexes.push({\n type: 'primary',\n name: identifiers.getPrimaryIndexName([table.name, column.name]),\n columns: [columnName],\n });\n }\n\n table.columns.push(column);\n }\n }\n\n return table;\n};\n\nconst getColumnType = (attribute: Attribute) => {\n if ('columnType' in attribute && attribute.columnType) {\n return attribute.columnType;\n }\n\n switch (attribute.type) {\n case 'increments': {\n return {\n type: 'increments',\n args: [{ primary: true, primaryKey: true }],\n notNullable: true,\n };\n }\n\n // We might want to convert email/password to string types before going into the orm with specific validators & transformers\n case 'password':\n case 'email':\n case 'string':\n case 'enumeration': {\n return { type: 'string' };\n }\n case 'uid': {\n return {\n type: 'string',\n };\n }\n case 'richtext':\n case 'text': {\n return {\n type: 'text',\n args: ['longtext'],\n };\n }\n case 'blocks':\n case 'json': {\n return { type: 'jsonb' };\n }\n case 'integer': {\n return { type: 'integer' };\n }\n case 'biginteger': {\n return { type: 'bigInteger' };\n }\n case 'float': {\n return { type: 'double' };\n }\n case 'decimal': {\n return { type: 'decimal', args: [10, 2] };\n }\n case 'date': {\n return { type: 'date' };\n }\n case 'time': {\n return { type: 'time', args: [{ precision: 3 }] };\n }\n case 'datetime': {\n return {\n type: 'datetime',\n args: [\n {\n useTz: false,\n precision: 6,\n },\n ],\n };\n }\n case 'timestamp': {\n return {\n type: 'timestamp',\n args: [\n {\n useTz: false,\n precision: 6,\n },\n ],\n };\n }\n case 'boolean': {\n return { type: 'boolean' };\n }\n default: {\n throw new Error(`Unknown type ${attribute.type}`);\n }\n }\n};\n\nexport const metadataToSchema = (metadata: Metadata): Schema => {\n const schema: Schema = {\n tables: [],\n };\n\n metadata.forEach((metadata) => {\n schema.tables.push(createTable(metadata));\n });\n\n return schema;\n};\n"],"names":["createColumn","name","attribute","type","args","opts","getColumnType","identifiers","getName","defaultTo","notNullable","unsigned","column","createTable","meta","table","tableName","indexes","foreignKeys","columns","key","Object","keys","attributes","morphColumn","owner","idColumn","typeColumn","idColumnName","typeColumnName","push","joinColumn","referencedTable","columnNameFull","referencedColumn","columnType","columnName","fkName","getFkIndexName","referencedColumns","onDelete","types","unique","getUniqueIndexName","primary","getPrimaryIndexName","primaryKey","precision","useTz","Error","metadataToSchema","metadata","schema","tables","forEach"],"mappings":"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"}
1
+ {"version":3,"file":"schema.mjs","sources":["../../src/schema/schema.ts"],"sourcesContent":["import * as types from '../utils/types';\nimport { identifiers } from '../utils/identifiers';\nimport type { Metadata, Meta } from '../metadata';\nimport type { Column, Schema, Table } from './types';\nimport type { Attribute } from '../types';\n\n/**\n * TODO: This needs to be refactored to support incoming names such as\n * (column, table, index) that are of the form string | NameToken[] so\n * that pieces can be passed through and shortened here.\n *\n * Currently, we are potentially shortening twice, although in reality\n * that won't happen since the shortened attribute column names will\n * fit here because they are already shortened to the max identifier\n * length\n *\n * That is the reason we use getName() here and not getColumnName();\n * we just want the exact shortened name for the value without doing\n * any other potential manipulation to it\n * */\n\nconst createColumn = (name: string, attribute: Attribute): Column => {\n const { type, args = [], ...opts } = getColumnType(attribute);\n\n return {\n name: identifiers.getName(name),\n type,\n args,\n defaultTo: null,\n notNullable: false,\n unsigned: false,\n ...opts,\n ...('column' in attribute ? (attribute.column ?? {}) : {}),\n };\n};\n\nconst createTable = (meta: Meta): Table => {\n const table: Table = {\n name: meta.tableName,\n indexes: meta.indexes || [],\n foreignKeys: meta.foreignKeys || [],\n columns: [],\n };\n\n for (const key of Object.keys(meta.attributes)) {\n const attribute = meta.attributes[key];\n\n // if (types.isRelation(attribute.type)) {\n if (attribute.type === 'relation') {\n if ('morphColumn' in attribute && attribute.morphColumn && attribute.owner) {\n const { idColumn, typeColumn } = attribute.morphColumn;\n\n const idColumnName = identifiers.getName(idColumn.name);\n const typeColumnName = identifiers.getName(typeColumn.name);\n\n table.columns.push(\n createColumn(idColumnName, {\n type: 'integer',\n column: {\n unsigned: true,\n },\n })\n );\n\n table.columns.push(createColumn(typeColumnName, { type: 'string' }));\n } else if (\n 'joinColumn' in attribute &&\n attribute.joinColumn &&\n attribute.owner &&\n attribute.joinColumn.referencedTable\n ) {\n // NOTE: we could pass uniquness for oneToOne to avoid creating more than one to one\n\n const {\n name: columnNameFull,\n referencedColumn,\n referencedTable,\n columnType = 'integer',\n } = attribute.joinColumn;\n\n const columnName = identifiers.getName(columnNameFull);\n\n const column = createColumn(columnName, {\n // TODO: find the column type automatically, or allow passing all the column params\n type: columnType,\n column: {\n unsigned: true,\n },\n });\n\n table.columns.push(column);\n\n const fkName = identifiers.getFkIndexName([table.name, columnName]);\n table.foreignKeys.push({\n name: fkName,\n columns: [column.name],\n referencedTable,\n referencedColumns: [referencedColumn],\n // NOTE: could allow configuration\n onDelete: 'SET NULL',\n });\n\n table.indexes.push({\n name: fkName,\n columns: [column.name],\n });\n }\n } else if (types.isScalarAttribute(attribute)) {\n const columnName = identifiers.getName(attribute.columnName || key);\n\n const column = createColumn(columnName, attribute);\n\n if (column.unique) {\n table.indexes.push({\n type: 'unique',\n name: identifiers.getUniqueIndexName([table.name, column.name]),\n columns: [columnName],\n });\n }\n\n if (column.primary) {\n table.indexes.push({\n type: 'primary',\n name: identifiers.getPrimaryIndexName([table.name, column.name]),\n columns: [columnName],\n });\n }\n\n table.columns.push(column);\n }\n }\n\n return table;\n};\n\nconst getColumnType = (attribute: Attribute) => {\n if ('columnType' in attribute && attribute.columnType) {\n return attribute.columnType;\n }\n\n switch (attribute.type) {\n case 'increments': {\n return {\n type: 'increments',\n args: [{ primary: true, primaryKey: true }],\n notNullable: true,\n };\n }\n\n // We might want to convert email/password to string types before going into the orm with specific validators & transformers\n case 'password':\n case 'email':\n case 'string':\n case 'enumeration': {\n return { type: 'string' };\n }\n case 'uid': {\n return {\n type: 'string',\n };\n }\n case 'richtext':\n case 'text': {\n return {\n type: 'text',\n args: ['longtext'],\n };\n }\n case 'blocks':\n case 'json': {\n return { type: 'jsonb' };\n }\n case 'integer': {\n return { type: 'integer' };\n }\n case 'biginteger': {\n return { type: 'bigInteger' };\n }\n case 'float': {\n return { type: 'double' };\n }\n case 'decimal': {\n return { type: 'decimal', args: [10, 2] };\n }\n case 'date': {\n return { type: 'date' };\n }\n case 'time': {\n return { type: 'time', args: [{ precision: 3 }] };\n }\n case 'datetime': {\n return {\n type: 'datetime',\n args: [\n {\n useTz: false,\n precision: 6,\n },\n ],\n };\n }\n case 'timestamp': {\n return {\n type: 'timestamp',\n args: [\n {\n useTz: false,\n precision: 6,\n },\n ],\n };\n }\n case 'boolean': {\n return { type: 'boolean' };\n }\n default: {\n throw new Error(`Unknown type ${attribute.type}`);\n }\n }\n};\n\nexport const metadataToSchema = (metadata: Metadata): Schema => {\n const schema: Schema = {\n tables: [],\n };\n\n metadata.forEach((metadata) => {\n schema.tables.push(createTable(metadata));\n });\n\n return schema;\n};\n"],"names":["createColumn","name","attribute","type","args","opts","getColumnType","identifiers","getName","defaultTo","notNullable","unsigned","column","createTable","meta","table","tableName","indexes","foreignKeys","columns","key","Object","keys","attributes","morphColumn","owner","idColumn","typeColumn","idColumnName","typeColumnName","push","joinColumn","referencedTable","columnNameFull","referencedColumn","columnType","columnName","fkName","getFkIndexName","referencedColumns","onDelete","types","unique","getUniqueIndexName","primary","getPrimaryIndexName","primaryKey","precision","useTz","Error","metadataToSchema","metadata","schema","tables","forEach"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sources":["../../src/schema/storage.ts"],"sourcesContent":["import crypto from 'crypto';\n\nimport type { Database } from '..';\nimport type { Schema } from './types';\n\nconst TABLE_NAME = 'strapi_database_schema';\n\nexport default (db: Database) => {\n const hasSchemaTable = () => db.getSchemaConnection().hasTable(TABLE_NAME);\n\n const createSchemaTable = () => {\n return db.getSchemaConnection().createTable(TABLE_NAME, (t) => {\n t.increments('id');\n t.json('schema');\n t.datetime('time', { useTz: false });\n t.string('hash');\n });\n };\n\n const checkTableExists = async () => {\n if (!(await hasSchemaTable())) {\n await createSchemaTable();\n }\n };\n\n return {\n async read(): Promise<{\n id: number;\n time: Date;\n hash: string;\n schema: Schema;\n } | null> {\n await checkTableExists();\n\n // NOTE: We get the ID first before fetching the exact entry for performance on MySQL/MariaDB\n // See: https://github.com/strapi/strapi/issues/20312\n const getSchemaID = await db\n .getConnection()\n .select('id')\n .from(TABLE_NAME)\n .orderBy('time', 'DESC')\n .first();\n\n if (!getSchemaID) {\n return null;\n }\n\n const res = await db\n .getConnection()\n .select('*')\n .from(TABLE_NAME)\n .where({ id: getSchemaID.id })\n .first();\n\n if (!res) {\n return null;\n }\n\n const parsedSchema = typeof res.schema === 'object' ? res.schema : JSON.parse(res.schema);\n\n return {\n ...res,\n schema: parsedSchema,\n };\n },\n\n hashSchema(schema: Schema) {\n return crypto.createHash('sha256').update(JSON.stringify(schema)).digest('hex');\n },\n\n async add(schema: Schema) {\n await checkTableExists();\n\n // NOTE: we can remove this to add history\n await db.getConnection(TABLE_NAME).delete();\n\n const time = new Date();\n\n await db\n .getConnection()\n .insert({\n schema: JSON.stringify(schema),\n hash: this.hashSchema(schema),\n time,\n })\n .into(TABLE_NAME);\n },\n\n async clear() {\n await checkTableExists();\n\n await db.getConnection(TABLE_NAME).truncate();\n },\n };\n};\n"],"names":["TABLE_NAME","db","hasSchemaTable","getSchemaConnection","hasTable","createSchemaTable","createTable","t","increments","json","datetime","useTz","string","checkTableExists","read","getSchemaID","getConnection","select","from","orderBy","first","res","where","id","parsedSchema","schema","JSON","parse","hashSchema","crypto","createHash","update","stringify","digest","add","delete","time","Date","insert","hash","into","clear","truncate"],"mappings":"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"}
1
+ {"version":3,"file":"storage.js","sources":["../../src/schema/storage.ts"],"sourcesContent":["import crypto from 'crypto';\n\nimport type { Database } from '..';\nimport type { Schema } from './types';\n\nconst TABLE_NAME = 'strapi_database_schema';\n\nexport default (db: Database) => {\n const hasSchemaTable = () => db.getSchemaConnection().hasTable(TABLE_NAME);\n\n const createSchemaTable = () => {\n return db.getSchemaConnection().createTable(TABLE_NAME, (t) => {\n t.increments('id');\n t.json('schema');\n t.datetime('time', { useTz: false });\n t.string('hash');\n });\n };\n\n const checkTableExists = async () => {\n if (!(await hasSchemaTable())) {\n await createSchemaTable();\n }\n };\n\n return {\n async read(): Promise<{\n id: number;\n time: Date;\n hash: string;\n schema: Schema;\n } | null> {\n await checkTableExists();\n\n // NOTE: We get the ID first before fetching the exact entry for performance on MySQL/MariaDB\n // See: https://github.com/strapi/strapi/issues/20312\n const getSchemaID = await db\n .getConnection()\n .select('id')\n .from(TABLE_NAME)\n .orderBy('time', 'DESC')\n .first();\n\n if (!getSchemaID) {\n return null;\n }\n\n const res = await db\n .getConnection()\n .select('*')\n .from(TABLE_NAME)\n .where({ id: getSchemaID.id })\n .first();\n\n if (!res) {\n return null;\n }\n\n const parsedSchema = typeof res.schema === 'object' ? res.schema : JSON.parse(res.schema);\n\n return {\n ...res,\n schema: parsedSchema,\n };\n },\n\n hashSchema(schema: Schema) {\n return crypto.createHash('sha256').update(JSON.stringify(schema)).digest('hex');\n },\n\n async add(schema: Schema) {\n await checkTableExists();\n\n // NOTE: we can remove this to add history\n await db.getConnection(TABLE_NAME).delete();\n\n const time = new Date();\n\n await db\n .getConnection()\n .insert({\n schema: JSON.stringify(schema),\n hash: this.hashSchema(schema),\n time,\n })\n .into(TABLE_NAME);\n },\n\n async clear() {\n await checkTableExists();\n\n await db.getConnection(TABLE_NAME).truncate();\n },\n };\n};\n"],"names":["TABLE_NAME","db","hasSchemaTable","getSchemaConnection","hasTable","createSchemaTable","createTable","t","increments","json","datetime","useTz","string","checkTableExists","read","getSchemaID","getConnection","select","from","orderBy","first","res","where","id","parsedSchema","schema","JSON","parse","hashSchema","crypto","createHash","update","stringify","digest","add","delete","time","Date","insert","hash","into","clear","truncate"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"storage.mjs","sources":["../../src/schema/storage.ts"],"sourcesContent":["import crypto from 'crypto';\n\nimport type { Database } from '..';\nimport type { Schema } from './types';\n\nconst TABLE_NAME = 'strapi_database_schema';\n\nexport default (db: Database) => {\n const hasSchemaTable = () => db.getSchemaConnection().hasTable(TABLE_NAME);\n\n const createSchemaTable = () => {\n return db.getSchemaConnection().createTable(TABLE_NAME, (t) => {\n t.increments('id');\n t.json('schema');\n t.datetime('time', { useTz: false });\n t.string('hash');\n });\n };\n\n const checkTableExists = async () => {\n if (!(await hasSchemaTable())) {\n await createSchemaTable();\n }\n };\n\n return {\n async read(): Promise<{\n id: number;\n time: Date;\n hash: string;\n schema: Schema;\n } | null> {\n await checkTableExists();\n\n // NOTE: We get the ID first before fetching the exact entry for performance on MySQL/MariaDB\n // See: https://github.com/strapi/strapi/issues/20312\n const getSchemaID = await db\n .getConnection()\n .select('id')\n .from(TABLE_NAME)\n .orderBy('time', 'DESC')\n .first();\n\n if (!getSchemaID) {\n return null;\n }\n\n const res = await db\n .getConnection()\n .select('*')\n .from(TABLE_NAME)\n .where({ id: getSchemaID.id })\n .first();\n\n if (!res) {\n return null;\n }\n\n const parsedSchema = typeof res.schema === 'object' ? res.schema : JSON.parse(res.schema);\n\n return {\n ...res,\n schema: parsedSchema,\n };\n },\n\n hashSchema(schema: Schema) {\n return crypto.createHash('sha256').update(JSON.stringify(schema)).digest('hex');\n },\n\n async add(schema: Schema) {\n await checkTableExists();\n\n // NOTE: we can remove this to add history\n await db.getConnection(TABLE_NAME).delete();\n\n const time = new Date();\n\n await db\n .getConnection()\n .insert({\n schema: JSON.stringify(schema),\n hash: this.hashSchema(schema),\n time,\n })\n .into(TABLE_NAME);\n },\n\n async clear() {\n await checkTableExists();\n\n await db.getConnection(TABLE_NAME).truncate();\n },\n };\n};\n"],"names":["TABLE_NAME","db","hasSchemaTable","getSchemaConnection","hasTable","createSchemaTable","createTable","t","increments","json","datetime","useTz","string","checkTableExists","read","getSchemaID","getConnection","select","from","orderBy","first","res","where","id","parsedSchema","schema","JSON","parse","hashSchema","crypto","createHash","update","stringify","digest","add","delete","time","Date","insert","hash","into","clear","truncate"],"mappings":"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"}
1
+ {"version":3,"file":"storage.mjs","sources":["../../src/schema/storage.ts"],"sourcesContent":["import crypto from 'crypto';\n\nimport type { Database } from '..';\nimport type { Schema } from './types';\n\nconst TABLE_NAME = 'strapi_database_schema';\n\nexport default (db: Database) => {\n const hasSchemaTable = () => db.getSchemaConnection().hasTable(TABLE_NAME);\n\n const createSchemaTable = () => {\n return db.getSchemaConnection().createTable(TABLE_NAME, (t) => {\n t.increments('id');\n t.json('schema');\n t.datetime('time', { useTz: false });\n t.string('hash');\n });\n };\n\n const checkTableExists = async () => {\n if (!(await hasSchemaTable())) {\n await createSchemaTable();\n }\n };\n\n return {\n async read(): Promise<{\n id: number;\n time: Date;\n hash: string;\n schema: Schema;\n } | null> {\n await checkTableExists();\n\n // NOTE: We get the ID first before fetching the exact entry for performance on MySQL/MariaDB\n // See: https://github.com/strapi/strapi/issues/20312\n const getSchemaID = await db\n .getConnection()\n .select('id')\n .from(TABLE_NAME)\n .orderBy('time', 'DESC')\n .first();\n\n if (!getSchemaID) {\n return null;\n }\n\n const res = await db\n .getConnection()\n .select('*')\n .from(TABLE_NAME)\n .where({ id: getSchemaID.id })\n .first();\n\n if (!res) {\n return null;\n }\n\n const parsedSchema = typeof res.schema === 'object' ? res.schema : JSON.parse(res.schema);\n\n return {\n ...res,\n schema: parsedSchema,\n };\n },\n\n hashSchema(schema: Schema) {\n return crypto.createHash('sha256').update(JSON.stringify(schema)).digest('hex');\n },\n\n async add(schema: Schema) {\n await checkTableExists();\n\n // NOTE: we can remove this to add history\n await db.getConnection(TABLE_NAME).delete();\n\n const time = new Date();\n\n await db\n .getConnection()\n .insert({\n schema: JSON.stringify(schema),\n hash: this.hashSchema(schema),\n time,\n })\n .into(TABLE_NAME);\n },\n\n async clear() {\n await checkTableExists();\n\n await db.getConnection(TABLE_NAME).truncate();\n },\n };\n};\n"],"names":["TABLE_NAME","db","hasSchemaTable","getSchemaConnection","hasTable","createSchemaTable","createTable","t","increments","json","datetime","useTz","string","checkTableExists","read","getSchemaID","getConnection","select","from","orderBy","first","res","where","id","parsedSchema","schema","JSON","parse","hashSchema","crypto","createHash","update","stringify","digest","add","delete","time","Date","insert","hash","into","clear","truncate"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"transaction-context.js","sources":["../src/transaction-context.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport { Knex } from 'knex';\n\nexport type Callback = (...args: any[]) => Promise<any> | any;\n\nexport interface TransactionObject {\n commit: () => Promise<void>;\n rollback: () => Promise<void>;\n get: () => Knex.Transaction;\n}\nexport interface Store {\n trx: Knex.Transaction | null;\n commitCallbacks: Callback[];\n rollbackCallbacks: Callback[];\n}\n\nconst storage = new AsyncLocalStorage<Store>();\n\nconst transactionCtx = {\n async run<TCallback extends Callback>(trx: Knex.Transaction, cb: TCallback) {\n const store = storage.getStore();\n return storage.run<ReturnType<TCallback>, void[]>(\n {\n trx,\n // Fill with existing callbacks if nesting transactions\n commitCallbacks: store?.commitCallbacks || [],\n rollbackCallbacks: store?.rollbackCallbacks || [],\n },\n cb\n );\n },\n\n get() {\n const store = storage.getStore();\n return store?.trx;\n },\n\n async commit(trx: Knex.Transaction) {\n const store = storage.getStore();\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Commit transaction\n await trx.commit();\n\n if (!store?.commitCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.commitCallbacks.forEach((cb) => cb());\n store.commitCallbacks = [];\n },\n\n async rollback(trx: Knex.Transaction) {\n const store = storage.getStore();\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Rollback transaction\n await trx.rollback();\n\n if (!store?.rollbackCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.rollbackCallbacks.forEach((cb) => cb());\n store.rollbackCallbacks = [];\n },\n\n onCommit(cb: Callback) {\n const store = storage.getStore();\n if (store?.commitCallbacks) {\n store.commitCallbacks.push(cb);\n }\n },\n\n onRollback(cb: Callback) {\n const store = storage.getStore();\n if (store?.rollbackCallbacks) {\n store.rollbackCallbacks.push(cb);\n }\n },\n};\n\nexport { transactionCtx };\n"],"names":["storage","AsyncLocalStorage","transactionCtx","run","trx","cb","store","getStore","commitCallbacks","rollbackCallbacks","get","commit","length","forEach","rollback","onCommit","push","onRollback"],"mappings":";;;;AAgBA,MAAMA,UAAU,IAAIC,kCAAAA,EAAAA;AAEpB,MAAMC,cAAiB,GAAA;IACrB,MAAMC,GAAAA,CAAAA,CAAgCC,GAAqB,EAAEC,EAAa,EAAA;QACxE,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;QAC9B,OAAOP,OAAAA,CAAQG,GAAG,CAChB;AACEC,YAAAA,GAAAA;;YAEAI,eAAiBF,EAAAA,KAAAA,EAAOE,mBAAmB,EAAE;YAC7CC,iBAAmBH,EAAAA,KAAAA,EAAOG,qBAAqB;SAEjDJ,EAAAA,EAAAA,CAAAA;AAEJ,KAAA;AAEAK,IAAAA,GAAAA,CAAAA,GAAAA;QACE,MAAMJ,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,OAAOD,KAAOF,EAAAA,GAAAA;AAChB,KAAA;AAEA,IAAA,MAAMO,QAAOP,GAAqB,EAAA;QAChC,MAAME,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;;AAG9B,QAAA,IAAID,OAAOF,GAAK,EAAA;AACdE,YAAAA,KAAAA,CAAMF,GAAG,GAAG,IAAA;AACd;;AAGA,QAAA,MAAMA,IAAIO,MAAM,EAAA;QAEhB,IAAI,CAACL,KAAOE,EAAAA,eAAAA,CAAgBI,MAAQ,EAAA;AAClC,YAAA;AACF;;AAGAN,QAAAA,KAAAA,CAAME,eAAe,CAACK,OAAO,CAAC,CAACR,EAAOA,GAAAA,EAAAA,EAAAA,CAAAA;QACtCC,KAAME,CAAAA,eAAe,GAAG,EAAE;AAC5B,KAAA;AAEA,IAAA,MAAMM,UAASV,GAAqB,EAAA;QAClC,MAAME,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;;AAG9B,QAAA,IAAID,OAAOF,GAAK,EAAA;AACdE,YAAAA,KAAAA,CAAMF,GAAG,GAAG,IAAA;AACd;;AAGA,QAAA,MAAMA,IAAIU,QAAQ,EAAA;QAElB,IAAI,CAACR,KAAOG,EAAAA,iBAAAA,CAAkBG,MAAQ,EAAA;AACpC,YAAA;AACF;;AAGAN,QAAAA,KAAAA,CAAMG,iBAAiB,CAACI,OAAO,CAAC,CAACR,EAAOA,GAAAA,EAAAA,EAAAA,CAAAA;QACxCC,KAAMG,CAAAA,iBAAiB,GAAG,EAAE;AAC9B,KAAA;AAEAM,IAAAA,QAAAA,CAAAA,CAASV,EAAY,EAAA;QACnB,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,IAAID,OAAOE,eAAiB,EAAA;YAC1BF,KAAME,CAAAA,eAAe,CAACQ,IAAI,CAACX,EAAAA,CAAAA;AAC7B;AACF,KAAA;AAEAY,IAAAA,UAAAA,CAAAA,CAAWZ,EAAY,EAAA;QACrB,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,IAAID,OAAOG,iBAAmB,EAAA;YAC5BH,KAAMG,CAAAA,iBAAiB,CAACO,IAAI,CAACX,EAAAA,CAAAA;AAC/B;AACF;AACF;;;;"}
1
+ {"version":3,"file":"transaction-context.js","sources":["../src/transaction-context.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport { Knex } from 'knex';\n\nexport type Callback = (...args: any[]) => Promise<any> | any;\n\nexport interface TransactionObject {\n commit: () => Promise<void>;\n rollback: () => Promise<void>;\n get: () => Knex.Transaction;\n}\nexport interface Store {\n trx: Knex.Transaction | null;\n commitCallbacks: Callback[];\n rollbackCallbacks: Callback[];\n}\n\nconst storage = new AsyncLocalStorage<Store>();\n\nconst transactionCtx = {\n async run<TCallback extends Callback>(trx: Knex.Transaction, cb: TCallback) {\n const store = storage.getStore();\n return storage.run<ReturnType<TCallback>, void[]>(\n {\n trx,\n // Fill with existing callbacks if nesting transactions\n commitCallbacks: store?.commitCallbacks || [],\n rollbackCallbacks: store?.rollbackCallbacks || [],\n },\n cb\n );\n },\n\n get() {\n const store = storage.getStore();\n return store?.trx;\n },\n\n async commit(trx: Knex.Transaction) {\n const store = storage.getStore();\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Commit transaction\n await trx.commit();\n\n if (!store?.commitCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.commitCallbacks.forEach((cb) => cb());\n store.commitCallbacks = [];\n },\n\n async rollback(trx: Knex.Transaction) {\n const store = storage.getStore();\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Rollback transaction\n await trx.rollback();\n\n if (!store?.rollbackCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.rollbackCallbacks.forEach((cb) => cb());\n store.rollbackCallbacks = [];\n },\n\n onCommit(cb: Callback) {\n const store = storage.getStore();\n if (store?.commitCallbacks) {\n store.commitCallbacks.push(cb);\n }\n },\n\n onRollback(cb: Callback) {\n const store = storage.getStore();\n if (store?.rollbackCallbacks) {\n store.rollbackCallbacks.push(cb);\n }\n },\n};\n\nexport { transactionCtx };\n"],"names":["storage","AsyncLocalStorage","transactionCtx","run","trx","cb","store","getStore","commitCallbacks","rollbackCallbacks","get","commit","length","forEach","rollback","onCommit","push","onRollback"],"mappings":";;;;AAgBA,MAAMA,UAAU,IAAIC,kCAAAA,EAAAA;AAEpB,MAAMC,cAAAA,GAAiB;IACrB,MAAMC,GAAAA,CAAAA,CAAgCC,GAAqB,EAAEC,EAAa,EAAA;QACxE,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;QAC9B,OAAOP,OAAAA,CAAQG,GAAG,CAChB;AACEC,YAAAA,GAAAA;;YAEAI,eAAAA,EAAiBF,KAAAA,EAAOE,mBAAmB,EAAE;YAC7CC,iBAAAA,EAAmBH,KAAAA,EAAOG,qBAAqB;SACjD,EACAJ,EAAAA,CAAAA;AAEJ,IAAA,CAAA;AAEAK,IAAAA,GAAAA,CAAAA,GAAAA;QACE,MAAMJ,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,OAAOD,KAAAA,EAAOF,GAAAA;AAChB,IAAA,CAAA;AAEA,IAAA,MAAMO,QAAOP,GAAqB,EAAA;QAChC,MAAME,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;;AAG9B,QAAA,IAAID,OAAOF,GAAAA,EAAK;AACdE,YAAAA,KAAAA,CAAMF,GAAG,GAAG,IAAA;AACd,QAAA;;AAGA,QAAA,MAAMA,IAAIO,MAAM,EAAA;QAEhB,IAAI,CAACL,KAAAA,EAAOE,eAAAA,CAAgBI,MAAAA,EAAQ;AAClC,YAAA;AACF,QAAA;;AAGAN,QAAAA,KAAAA,CAAME,eAAe,CAACK,OAAO,CAAC,CAACR,EAAAA,GAAOA,EAAAA,EAAAA,CAAAA;QACtCC,KAAAA,CAAME,eAAe,GAAG,EAAE;AAC5B,IAAA,CAAA;AAEA,IAAA,MAAMM,UAASV,GAAqB,EAAA;QAClC,MAAME,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;;AAG9B,QAAA,IAAID,OAAOF,GAAAA,EAAK;AACdE,YAAAA,KAAAA,CAAMF,GAAG,GAAG,IAAA;AACd,QAAA;;AAGA,QAAA,MAAMA,IAAIU,QAAQ,EAAA;QAElB,IAAI,CAACR,KAAAA,EAAOG,iBAAAA,CAAkBG,MAAAA,EAAQ;AACpC,YAAA;AACF,QAAA;;AAGAN,QAAAA,KAAAA,CAAMG,iBAAiB,CAACI,OAAO,CAAC,CAACR,EAAAA,GAAOA,EAAAA,EAAAA,CAAAA;QACxCC,KAAAA,CAAMG,iBAAiB,GAAG,EAAE;AAC9B,IAAA,CAAA;AAEAM,IAAAA,QAAAA,CAAAA,CAASV,EAAY,EAAA;QACnB,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,IAAID,OAAOE,eAAAA,EAAiB;YAC1BF,KAAAA,CAAME,eAAe,CAACQ,IAAI,CAACX,EAAAA,CAAAA;AAC7B,QAAA;AACF,IAAA,CAAA;AAEAY,IAAAA,UAAAA,CAAAA,CAAWZ,EAAY,EAAA;QACrB,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,IAAID,OAAOG,iBAAAA,EAAmB;YAC5BH,KAAAA,CAAMG,iBAAiB,CAACO,IAAI,CAACX,EAAAA,CAAAA;AAC/B,QAAA;AACF,IAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"transaction-context.mjs","sources":["../src/transaction-context.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport { Knex } from 'knex';\n\nexport type Callback = (...args: any[]) => Promise<any> | any;\n\nexport interface TransactionObject {\n commit: () => Promise<void>;\n rollback: () => Promise<void>;\n get: () => Knex.Transaction;\n}\nexport interface Store {\n trx: Knex.Transaction | null;\n commitCallbacks: Callback[];\n rollbackCallbacks: Callback[];\n}\n\nconst storage = new AsyncLocalStorage<Store>();\n\nconst transactionCtx = {\n async run<TCallback extends Callback>(trx: Knex.Transaction, cb: TCallback) {\n const store = storage.getStore();\n return storage.run<ReturnType<TCallback>, void[]>(\n {\n trx,\n // Fill with existing callbacks if nesting transactions\n commitCallbacks: store?.commitCallbacks || [],\n rollbackCallbacks: store?.rollbackCallbacks || [],\n },\n cb\n );\n },\n\n get() {\n const store = storage.getStore();\n return store?.trx;\n },\n\n async commit(trx: Knex.Transaction) {\n const store = storage.getStore();\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Commit transaction\n await trx.commit();\n\n if (!store?.commitCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.commitCallbacks.forEach((cb) => cb());\n store.commitCallbacks = [];\n },\n\n async rollback(trx: Knex.Transaction) {\n const store = storage.getStore();\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Rollback transaction\n await trx.rollback();\n\n if (!store?.rollbackCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.rollbackCallbacks.forEach((cb) => cb());\n store.rollbackCallbacks = [];\n },\n\n onCommit(cb: Callback) {\n const store = storage.getStore();\n if (store?.commitCallbacks) {\n store.commitCallbacks.push(cb);\n }\n },\n\n onRollback(cb: Callback) {\n const store = storage.getStore();\n if (store?.rollbackCallbacks) {\n store.rollbackCallbacks.push(cb);\n }\n },\n};\n\nexport { transactionCtx };\n"],"names":["storage","AsyncLocalStorage","transactionCtx","run","trx","cb","store","getStore","commitCallbacks","rollbackCallbacks","get","commit","length","forEach","rollback","onCommit","push","onRollback"],"mappings":";;AAgBA,MAAMA,UAAU,IAAIC,iBAAAA,EAAAA;AAEpB,MAAMC,cAAiB,GAAA;IACrB,MAAMC,GAAAA,CAAAA,CAAgCC,GAAqB,EAAEC,EAAa,EAAA;QACxE,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;QAC9B,OAAOP,OAAAA,CAAQG,GAAG,CAChB;AACEC,YAAAA,GAAAA;;YAEAI,eAAiBF,EAAAA,KAAAA,EAAOE,mBAAmB,EAAE;YAC7CC,iBAAmBH,EAAAA,KAAAA,EAAOG,qBAAqB;SAEjDJ,EAAAA,EAAAA,CAAAA;AAEJ,KAAA;AAEAK,IAAAA,GAAAA,CAAAA,GAAAA;QACE,MAAMJ,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,OAAOD,KAAOF,EAAAA,GAAAA;AAChB,KAAA;AAEA,IAAA,MAAMO,QAAOP,GAAqB,EAAA;QAChC,MAAME,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;;AAG9B,QAAA,IAAID,OAAOF,GAAK,EAAA;AACdE,YAAAA,KAAAA,CAAMF,GAAG,GAAG,IAAA;AACd;;AAGA,QAAA,MAAMA,IAAIO,MAAM,EAAA;QAEhB,IAAI,CAACL,KAAOE,EAAAA,eAAAA,CAAgBI,MAAQ,EAAA;AAClC,YAAA;AACF;;AAGAN,QAAAA,KAAAA,CAAME,eAAe,CAACK,OAAO,CAAC,CAACR,EAAOA,GAAAA,EAAAA,EAAAA,CAAAA;QACtCC,KAAME,CAAAA,eAAe,GAAG,EAAE;AAC5B,KAAA;AAEA,IAAA,MAAMM,UAASV,GAAqB,EAAA;QAClC,MAAME,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;;AAG9B,QAAA,IAAID,OAAOF,GAAK,EAAA;AACdE,YAAAA,KAAAA,CAAMF,GAAG,GAAG,IAAA;AACd;;AAGA,QAAA,MAAMA,IAAIU,QAAQ,EAAA;QAElB,IAAI,CAACR,KAAOG,EAAAA,iBAAAA,CAAkBG,MAAQ,EAAA;AACpC,YAAA;AACF;;AAGAN,QAAAA,KAAAA,CAAMG,iBAAiB,CAACI,OAAO,CAAC,CAACR,EAAOA,GAAAA,EAAAA,EAAAA,CAAAA;QACxCC,KAAMG,CAAAA,iBAAiB,GAAG,EAAE;AAC9B,KAAA;AAEAM,IAAAA,QAAAA,CAAAA,CAASV,EAAY,EAAA;QACnB,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,IAAID,OAAOE,eAAiB,EAAA;YAC1BF,KAAME,CAAAA,eAAe,CAACQ,IAAI,CAACX,EAAAA,CAAAA;AAC7B;AACF,KAAA;AAEAY,IAAAA,UAAAA,CAAAA,CAAWZ,EAAY,EAAA;QACrB,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,IAAID,OAAOG,iBAAmB,EAAA;YAC5BH,KAAMG,CAAAA,iBAAiB,CAACO,IAAI,CAACX,EAAAA,CAAAA;AAC/B;AACF;AACF;;;;"}
1
+ {"version":3,"file":"transaction-context.mjs","sources":["../src/transaction-context.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport { Knex } from 'knex';\n\nexport type Callback = (...args: any[]) => Promise<any> | any;\n\nexport interface TransactionObject {\n commit: () => Promise<void>;\n rollback: () => Promise<void>;\n get: () => Knex.Transaction;\n}\nexport interface Store {\n trx: Knex.Transaction | null;\n commitCallbacks: Callback[];\n rollbackCallbacks: Callback[];\n}\n\nconst storage = new AsyncLocalStorage<Store>();\n\nconst transactionCtx = {\n async run<TCallback extends Callback>(trx: Knex.Transaction, cb: TCallback) {\n const store = storage.getStore();\n return storage.run<ReturnType<TCallback>, void[]>(\n {\n trx,\n // Fill with existing callbacks if nesting transactions\n commitCallbacks: store?.commitCallbacks || [],\n rollbackCallbacks: store?.rollbackCallbacks || [],\n },\n cb\n );\n },\n\n get() {\n const store = storage.getStore();\n return store?.trx;\n },\n\n async commit(trx: Knex.Transaction) {\n const store = storage.getStore();\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Commit transaction\n await trx.commit();\n\n if (!store?.commitCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.commitCallbacks.forEach((cb) => cb());\n store.commitCallbacks = [];\n },\n\n async rollback(trx: Knex.Transaction) {\n const store = storage.getStore();\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Rollback transaction\n await trx.rollback();\n\n if (!store?.rollbackCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.rollbackCallbacks.forEach((cb) => cb());\n store.rollbackCallbacks = [];\n },\n\n onCommit(cb: Callback) {\n const store = storage.getStore();\n if (store?.commitCallbacks) {\n store.commitCallbacks.push(cb);\n }\n },\n\n onRollback(cb: Callback) {\n const store = storage.getStore();\n if (store?.rollbackCallbacks) {\n store.rollbackCallbacks.push(cb);\n }\n },\n};\n\nexport { transactionCtx };\n"],"names":["storage","AsyncLocalStorage","transactionCtx","run","trx","cb","store","getStore","commitCallbacks","rollbackCallbacks","get","commit","length","forEach","rollback","onCommit","push","onRollback"],"mappings":";;AAgBA,MAAMA,UAAU,IAAIC,iBAAAA,EAAAA;AAEpB,MAAMC,cAAAA,GAAiB;IACrB,MAAMC,GAAAA,CAAAA,CAAgCC,GAAqB,EAAEC,EAAa,EAAA;QACxE,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;QAC9B,OAAOP,OAAAA,CAAQG,GAAG,CAChB;AACEC,YAAAA,GAAAA;;YAEAI,eAAAA,EAAiBF,KAAAA,EAAOE,mBAAmB,EAAE;YAC7CC,iBAAAA,EAAmBH,KAAAA,EAAOG,qBAAqB;SACjD,EACAJ,EAAAA,CAAAA;AAEJ,IAAA,CAAA;AAEAK,IAAAA,GAAAA,CAAAA,GAAAA;QACE,MAAMJ,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,OAAOD,KAAAA,EAAOF,GAAAA;AAChB,IAAA,CAAA;AAEA,IAAA,MAAMO,QAAOP,GAAqB,EAAA;QAChC,MAAME,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;;AAG9B,QAAA,IAAID,OAAOF,GAAAA,EAAK;AACdE,YAAAA,KAAAA,CAAMF,GAAG,GAAG,IAAA;AACd,QAAA;;AAGA,QAAA,MAAMA,IAAIO,MAAM,EAAA;QAEhB,IAAI,CAACL,KAAAA,EAAOE,eAAAA,CAAgBI,MAAAA,EAAQ;AAClC,YAAA;AACF,QAAA;;AAGAN,QAAAA,KAAAA,CAAME,eAAe,CAACK,OAAO,CAAC,CAACR,EAAAA,GAAOA,EAAAA,EAAAA,CAAAA;QACtCC,KAAAA,CAAME,eAAe,GAAG,EAAE;AAC5B,IAAA,CAAA;AAEA,IAAA,MAAMM,UAASV,GAAqB,EAAA;QAClC,MAAME,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;;AAG9B,QAAA,IAAID,OAAOF,GAAAA,EAAK;AACdE,YAAAA,KAAAA,CAAMF,GAAG,GAAG,IAAA;AACd,QAAA;;AAGA,QAAA,MAAMA,IAAIU,QAAQ,EAAA;QAElB,IAAI,CAACR,KAAAA,EAAOG,iBAAAA,CAAkBG,MAAAA,EAAQ;AACpC,YAAA;AACF,QAAA;;AAGAN,QAAAA,KAAAA,CAAMG,iBAAiB,CAACI,OAAO,CAAC,CAACR,EAAAA,GAAOA,EAAAA,EAAAA,CAAAA;QACxCC,KAAAA,CAAMG,iBAAiB,GAAG,EAAE;AAC9B,IAAA,CAAA;AAEAM,IAAAA,QAAAA,CAAAA,CAASV,EAAY,EAAA;QACnB,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,IAAID,OAAOE,eAAAA,EAAiB;YAC1BF,KAAAA,CAAME,eAAe,CAACQ,IAAI,CAACX,EAAAA,CAAAA;AAC7B,QAAA;AACF,IAAA,CAAA;AAEAY,IAAAA,UAAAA,CAAAA,CAAWZ,EAAY,EAAA;QACrB,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,IAAID,OAAOG,iBAAAA,EAAmB;YAC5BH,KAAAA,CAAMG,iBAAiB,CAACO,IAAI,CAACX,EAAAA,CAAAA;AAC/B,QAAA;AACF,IAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"async-curry.js","sources":["../../src/utils/async-curry.ts"],"sourcesContent":["// lodash/fp curry does not handle async functions properly, and creates very \"ugly\" types,\n// so we will use our own version to ensure curried functions are typed correctly\n// TODO: Export this from root @strapi/utils so we don't have copies of it between packages\n\n/**\n * @internal\n */\nexport const asyncCurry = <Args extends any[], R>(\n fn: (...args: Args) => Promise<R>\n): CurriedAsyncFunction<Args, R> => {\n const curried = (...args: any[]): any => {\n if (args.length >= fn.length) {\n return fn(...(args as Args));\n }\n return (...moreArgs: any[]) => curried(...args, ...moreArgs);\n };\n\n return curried as CurriedAsyncFunction<Args, R>;\n};\n\n/**\n * @internal\n */\nexport type CurriedAsyncFunction<Args extends any[], R> = Args extends [infer First, ...infer Rest]\n ? Rest extends []\n ? (arg: First) => Promise<R>\n : (arg: First) => CurriedAsyncFunction<Rest, R>\n : () => Promise<R>;\n"],"names":["asyncCurry","fn","curried","args","length","moreArgs"],"mappings":";;AAAA;AACA;AACA;AAEA;;IAGaA,MAAAA,UAAAA,GAAa,CACxBC,EAAAA,GAAAA;IAEA,MAAMC,OAAAA,GAAU,CAAC,GAAGC,IAAAA,GAAAA;AAClB,QAAA,IAAIA,IAAKC,CAAAA,MAAM,IAAIH,EAAAA,CAAGG,MAAM,EAAE;AAC5B,YAAA,OAAOH,EAAOE,CAAAA,GAAAA,IAAAA,CAAAA;AAChB;AACA,QAAA,OAAO,CAAC,GAAGE,QAAoBH,GAAAA,OAAAA,CAAAA,GAAWC,IAASE,EAAAA,GAAAA,QAAAA,CAAAA;AACrD,KAAA;IAEA,OAAOH,OAAAA;AACT;;;;"}
1
+ {"version":3,"file":"async-curry.js","sources":["../../src/utils/async-curry.ts"],"sourcesContent":["// lodash/fp curry does not handle async functions properly, and creates very \"ugly\" types,\n// so we will use our own version to ensure curried functions are typed correctly\n// TODO: Export this from root @strapi/utils so we don't have copies of it between packages\n\n/**\n * @internal\n */\nexport const asyncCurry = <Args extends any[], R>(\n fn: (...args: Args) => Promise<R>\n): CurriedAsyncFunction<Args, R> => {\n const curried = (...args: any[]): any => {\n if (args.length >= fn.length) {\n return fn(...(args as Args));\n }\n return (...moreArgs: any[]) => curried(...args, ...moreArgs);\n };\n\n return curried as CurriedAsyncFunction<Args, R>;\n};\n\n/**\n * @internal\n */\nexport type CurriedAsyncFunction<Args extends any[], R> = Args extends [infer First, ...infer Rest]\n ? Rest extends []\n ? (arg: First) => Promise<R>\n : (arg: First) => CurriedAsyncFunction<Rest, R>\n : () => Promise<R>;\n"],"names":["asyncCurry","fn","curried","args","length","moreArgs"],"mappings":";;AAAA;AACA;AACA;AAEA;;IAGO,MAAMA,UAAAA,GAAa,CACxBC,EAAAA,GAAAA;IAEA,MAAMC,OAAAA,GAAU,CAAC,GAAGC,IAAAA,GAAAA;AAClB,QAAA,IAAIA,IAAAA,CAAKC,MAAM,IAAIH,EAAAA,CAAGG,MAAM,EAAE;AAC5B,YAAA,OAAOH,EAAAA,CAAAA,GAAOE,IAAAA,CAAAA;AAChB,QAAA;AACA,QAAA,OAAO,CAAC,GAAGE,QAAAA,GAAoBH,OAAAA,CAAAA,GAAWC,IAAAA,EAAAA,GAASE,QAAAA,CAAAA;AACrD,IAAA,CAAA;IAEA,OAAOH,OAAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"async-curry.mjs","sources":["../../src/utils/async-curry.ts"],"sourcesContent":["// lodash/fp curry does not handle async functions properly, and creates very \"ugly\" types,\n// so we will use our own version to ensure curried functions are typed correctly\n// TODO: Export this from root @strapi/utils so we don't have copies of it between packages\n\n/**\n * @internal\n */\nexport const asyncCurry = <Args extends any[], R>(\n fn: (...args: Args) => Promise<R>\n): CurriedAsyncFunction<Args, R> => {\n const curried = (...args: any[]): any => {\n if (args.length >= fn.length) {\n return fn(...(args as Args));\n }\n return (...moreArgs: any[]) => curried(...args, ...moreArgs);\n };\n\n return curried as CurriedAsyncFunction<Args, R>;\n};\n\n/**\n * @internal\n */\nexport type CurriedAsyncFunction<Args extends any[], R> = Args extends [infer First, ...infer Rest]\n ? Rest extends []\n ? (arg: First) => Promise<R>\n : (arg: First) => CurriedAsyncFunction<Rest, R>\n : () => Promise<R>;\n"],"names":["asyncCurry","fn","curried","args","length","moreArgs"],"mappings":"AAAA;AACA;AACA;AAEA;;IAGaA,MAAAA,UAAAA,GAAa,CACxBC,EAAAA,GAAAA;IAEA,MAAMC,OAAAA,GAAU,CAAC,GAAGC,IAAAA,GAAAA;AAClB,QAAA,IAAIA,IAAKC,CAAAA,MAAM,IAAIH,EAAAA,CAAGG,MAAM,EAAE;AAC5B,YAAA,OAAOH,EAAOE,CAAAA,GAAAA,IAAAA,CAAAA;AAChB;AACA,QAAA,OAAO,CAAC,GAAGE,QAAoBH,GAAAA,OAAAA,CAAAA,GAAWC,IAASE,EAAAA,GAAAA,QAAAA,CAAAA;AACrD,KAAA;IAEA,OAAOH,OAAAA;AACT;;;;"}
1
+ {"version":3,"file":"async-curry.mjs","sources":["../../src/utils/async-curry.ts"],"sourcesContent":["// lodash/fp curry does not handle async functions properly, and creates very \"ugly\" types,\n// so we will use our own version to ensure curried functions are typed correctly\n// TODO: Export this from root @strapi/utils so we don't have copies of it between packages\n\n/**\n * @internal\n */\nexport const asyncCurry = <Args extends any[], R>(\n fn: (...args: Args) => Promise<R>\n): CurriedAsyncFunction<Args, R> => {\n const curried = (...args: any[]): any => {\n if (args.length >= fn.length) {\n return fn(...(args as Args));\n }\n return (...moreArgs: any[]) => curried(...args, ...moreArgs);\n };\n\n return curried as CurriedAsyncFunction<Args, R>;\n};\n\n/**\n * @internal\n */\nexport type CurriedAsyncFunction<Args extends any[], R> = Args extends [infer First, ...infer Rest]\n ? Rest extends []\n ? (arg: First) => Promise<R>\n : (arg: First) => CurriedAsyncFunction<Rest, R>\n : () => Promise<R>;\n"],"names":["asyncCurry","fn","curried","args","length","moreArgs"],"mappings":"AAAA;AACA;AACA;AAEA;;IAGO,MAAMA,UAAAA,GAAa,CACxBC,EAAAA,GAAAA;IAEA,MAAMC,OAAAA,GAAU,CAAC,GAAGC,IAAAA,GAAAA;AAClB,QAAA,IAAIA,IAAAA,CAAKC,MAAM,IAAIH,EAAAA,CAAGG,MAAM,EAAE;AAC5B,YAAA,OAAOH,EAAAA,CAAAA,GAAOE,IAAAA,CAAAA;AAChB,QAAA;AACA,QAAA,OAAO,CAAC,GAAGE,QAAAA,GAAoBH,OAAAA,CAAAA,GAAWC,IAAAA,EAAAA,GAASE,QAAAA,CAAAA;AACrD,IAAA,CAAA;IAEA,OAAOH,OAAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"hash.js","sources":["../../../src/utils/identifiers/hash.ts"],"sourcesContent":["/**\n * @fileoverview This file contains utility functions for shortening identifiers for use in a database schema.\n * The functions in this file are used to generate shorter names for database tables and columns\n * to avoid breaking the constraints of databases.\n *\n * IMPORTANT\n * Any changes here that result in a different output string from any of the naming methods will\n * cause the schema creation to delete data it doesn't recognize because the name\n * is different.\n *\n * If there are any test failures after updating this code, it means there is a breaking change that\n * will cause data loss, so beware; do not update the test to match your changes\n *\n * @internal\n */\n\nimport crypto from 'node:crypto';\nimport { isInteger } from 'lodash/fp';\n\n/**\n * Creates a hash of the given data with the specified string length as a string of hex characters\n *\n * @example\n * createHash(\"myData\", 5); // \"03f85\"\n * createHash(\"myData\", 2); // \"03\"\n * createHash(\"myData\", 1); // \"0\"\n *\n * @param data - The data to be hashed\n * @param len - The length of the hash\n * @returns The generated hash\n * @throws Error if the length is not a positive integer\n * @internal\n */\nexport function createHash(data: string, len: number): string {\n if (!isInteger(len) || len <= 0) {\n throw new Error(`createHash length must be a positive integer, received ${len}`);\n }\n\n const hash = crypto.createHash('shake256', { outputLength: Math.ceil(len / 2) }).update(data);\n return hash.digest('hex').substring(0, len);\n}\n"],"names":["createHash","data","len","isInteger","Error","hash","crypto","outputLength","Math","ceil","update","digest","substring"],"mappings":";;;;;AAmBA;;;;;;;;;;;;;AAaC,IACM,SAASA,UAAWC,CAAAA,IAAY,EAAEC,GAAW,EAAA;AAClD,IAAA,IAAI,CAACC,WAAAA,CAAUD,GAAQA,CAAAA,IAAAA,GAAAA,IAAO,CAAG,EAAA;AAC/B,QAAA,MAAM,IAAIE,KAAAA,CAAM,CAAC,uDAAuD,EAAEF,GAAK,CAAA,CAAA,CAAA;AACjF;AAEA,IAAA,MAAMG,IAAOC,GAAAA,MAAAA,CAAON,UAAU,CAAC,UAAY,EAAA;QAAEO,YAAcC,EAAAA,IAAAA,CAAKC,IAAI,CAACP,GAAM,GAAA,CAAA;AAAG,KAAA,CAAA,CAAGQ,MAAM,CAACT,IAAAA,CAAAA;AACxF,IAAA,OAAOI,KAAKM,MAAM,CAAC,KAAOC,CAAAA,CAAAA,SAAS,CAAC,CAAGV,EAAAA,GAAAA,CAAAA;AACzC;;;;"}
1
+ {"version":3,"file":"hash.js","sources":["../../../src/utils/identifiers/hash.ts"],"sourcesContent":["/**\n * @fileoverview This file contains utility functions for shortening identifiers for use in a database schema.\n * The functions in this file are used to generate shorter names for database tables and columns\n * to avoid breaking the constraints of databases.\n *\n * IMPORTANT\n * Any changes here that result in a different output string from any of the naming methods will\n * cause the schema creation to delete data it doesn't recognize because the name\n * is different.\n *\n * If there are any test failures after updating this code, it means there is a breaking change that\n * will cause data loss, so beware; do not update the test to match your changes\n *\n * @internal\n */\n\nimport crypto from 'node:crypto';\nimport { isInteger } from 'lodash/fp';\n\n/**\n * Creates a hash of the given data with the specified string length as a string of hex characters\n *\n * @example\n * createHash(\"myData\", 5); // \"03f85\"\n * createHash(\"myData\", 2); // \"03\"\n * createHash(\"myData\", 1); // \"0\"\n *\n * @param data - The data to be hashed\n * @param len - The length of the hash\n * @returns The generated hash\n * @throws Error if the length is not a positive integer\n * @internal\n */\nexport function createHash(data: string, len: number): string {\n if (!isInteger(len) || len <= 0) {\n throw new Error(`createHash length must be a positive integer, received ${len}`);\n }\n\n const hash = crypto.createHash('shake256', { outputLength: Math.ceil(len / 2) }).update(data);\n return hash.digest('hex').substring(0, len);\n}\n"],"names":["createHash","data","len","isInteger","Error","hash","crypto","outputLength","Math","ceil","update","digest","substring"],"mappings":";;;;;AAmBA;;;;;;;;;;;;;AAaC,IACM,SAASA,UAAAA,CAAWC,IAAY,EAAEC,GAAW,EAAA;AAClD,IAAA,IAAI,CAACC,WAAAA,CAAUD,GAAAA,CAAAA,IAAQA,GAAAA,IAAO,CAAA,EAAG;AAC/B,QAAA,MAAM,IAAIE,KAAAA,CAAM,CAAC,uDAAuD,EAAEF,GAAAA,CAAAA,CAAK,CAAA;AACjF,IAAA;AAEA,IAAA,MAAMG,IAAAA,GAAOC,MAAAA,CAAON,UAAU,CAAC,UAAA,EAAY;QAAEO,YAAAA,EAAcC,IAAAA,CAAKC,IAAI,CAACP,GAAAA,GAAM,CAAA;AAAG,KAAA,CAAA,CAAGQ,MAAM,CAACT,IAAAA,CAAAA;AACxF,IAAA,OAAOI,KAAKM,MAAM,CAAC,KAAA,CAAA,CAAOC,SAAS,CAAC,CAAA,EAAGV,GAAAA,CAAAA;AACzC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"hash.mjs","sources":["../../../src/utils/identifiers/hash.ts"],"sourcesContent":["/**\n * @fileoverview This file contains utility functions for shortening identifiers for use in a database schema.\n * The functions in this file are used to generate shorter names for database tables and columns\n * to avoid breaking the constraints of databases.\n *\n * IMPORTANT\n * Any changes here that result in a different output string from any of the naming methods will\n * cause the schema creation to delete data it doesn't recognize because the name\n * is different.\n *\n * If there are any test failures after updating this code, it means there is a breaking change that\n * will cause data loss, so beware; do not update the test to match your changes\n *\n * @internal\n */\n\nimport crypto from 'node:crypto';\nimport { isInteger } from 'lodash/fp';\n\n/**\n * Creates a hash of the given data with the specified string length as a string of hex characters\n *\n * @example\n * createHash(\"myData\", 5); // \"03f85\"\n * createHash(\"myData\", 2); // \"03\"\n * createHash(\"myData\", 1); // \"0\"\n *\n * @param data - The data to be hashed\n * @param len - The length of the hash\n * @returns The generated hash\n * @throws Error if the length is not a positive integer\n * @internal\n */\nexport function createHash(data: string, len: number): string {\n if (!isInteger(len) || len <= 0) {\n throw new Error(`createHash length must be a positive integer, received ${len}`);\n }\n\n const hash = crypto.createHash('shake256', { outputLength: Math.ceil(len / 2) }).update(data);\n return hash.digest('hex').substring(0, len);\n}\n"],"names":["createHash","data","len","isInteger","Error","hash","crypto","outputLength","Math","ceil","update","digest","substring"],"mappings":";;;AAmBA;;;;;;;;;;;;;AAaC,IACM,SAASA,UAAWC,CAAAA,IAAY,EAAEC,GAAW,EAAA;AAClD,IAAA,IAAI,CAACC,SAAAA,CAAUD,GAAQA,CAAAA,IAAAA,GAAAA,IAAO,CAAG,EAAA;AAC/B,QAAA,MAAM,IAAIE,KAAAA,CAAM,CAAC,uDAAuD,EAAEF,GAAK,CAAA,CAAA,CAAA;AACjF;AAEA,IAAA,MAAMG,IAAOC,GAAAA,MAAAA,CAAON,UAAU,CAAC,UAAY,EAAA;QAAEO,YAAcC,EAAAA,IAAAA,CAAKC,IAAI,CAACP,GAAM,GAAA,CAAA;AAAG,KAAA,CAAA,CAAGQ,MAAM,CAACT,IAAAA,CAAAA;AACxF,IAAA,OAAOI,KAAKM,MAAM,CAAC,KAAOC,CAAAA,CAAAA,SAAS,CAAC,CAAGV,EAAAA,GAAAA,CAAAA;AACzC;;;;"}
1
+ {"version":3,"file":"hash.mjs","sources":["../../../src/utils/identifiers/hash.ts"],"sourcesContent":["/**\n * @fileoverview This file contains utility functions for shortening identifiers for use in a database schema.\n * The functions in this file are used to generate shorter names for database tables and columns\n * to avoid breaking the constraints of databases.\n *\n * IMPORTANT\n * Any changes here that result in a different output string from any of the naming methods will\n * cause the schema creation to delete data it doesn't recognize because the name\n * is different.\n *\n * If there are any test failures after updating this code, it means there is a breaking change that\n * will cause data loss, so beware; do not update the test to match your changes\n *\n * @internal\n */\n\nimport crypto from 'node:crypto';\nimport { isInteger } from 'lodash/fp';\n\n/**\n * Creates a hash of the given data with the specified string length as a string of hex characters\n *\n * @example\n * createHash(\"myData\", 5); // \"03f85\"\n * createHash(\"myData\", 2); // \"03\"\n * createHash(\"myData\", 1); // \"0\"\n *\n * @param data - The data to be hashed\n * @param len - The length of the hash\n * @returns The generated hash\n * @throws Error if the length is not a positive integer\n * @internal\n */\nexport function createHash(data: string, len: number): string {\n if (!isInteger(len) || len <= 0) {\n throw new Error(`createHash length must be a positive integer, received ${len}`);\n }\n\n const hash = crypto.createHash('shake256', { outputLength: Math.ceil(len / 2) }).update(data);\n return hash.digest('hex').substring(0, len);\n}\n"],"names":["createHash","data","len","isInteger","Error","hash","crypto","outputLength","Math","ceil","update","digest","substring"],"mappings":";;;AAmBA;;;;;;;;;;;;;AAaC,IACM,SAASA,UAAAA,CAAWC,IAAY,EAAEC,GAAW,EAAA;AAClD,IAAA,IAAI,CAACC,SAAAA,CAAUD,GAAAA,CAAAA,IAAQA,GAAAA,IAAO,CAAA,EAAG;AAC/B,QAAA,MAAM,IAAIE,KAAAA,CAAM,CAAC,uDAAuD,EAAEF,GAAAA,CAAAA,CAAK,CAAA;AACjF,IAAA;AAEA,IAAA,MAAMG,IAAAA,GAAOC,MAAAA,CAAON,UAAU,CAAC,UAAA,EAAY;QAAEO,YAAAA,EAAcC,IAAAA,CAAKC,IAAI,CAACP,GAAAA,GAAM,CAAA;AAAG,KAAA,CAAA,CAAGQ,MAAM,CAACT,IAAAA,CAAAA;AACxF,IAAA,OAAOI,KAAKM,MAAM,CAAC,KAAA,CAAA,CAAOC,SAAS,CAAC,CAAA,EAAGV,GAAAA,CAAAA;AACzC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/utils/identifiers/index.ts"],"sourcesContent":["/**\n * This file contains utility functions for generating names used in the database.\n * These names include table names, column names, join table names, index names, and more.\n * The generated names can be customized with prefixes, suffixes, and maximum length.\n * These utility functions are used throughout the codebase to ensure consistent and standardized naming conventions in the database.\n *\n * The reason for checking maxLength for suffixes and prefixes and using the long ones from Strapi 4 is so that we always\n * have access to the full length names, in particular for migration purposes, but also so that (in theory) the feature\n * could be disabled and stay compatible with v4 database structure.\n */\nimport _, { isInteger, partition, snakeCase, sumBy } from 'lodash/fp';\nimport { createHash } from './hash';\nimport {\n IdentifiersOptions,\n NameInput,\n NameOptions,\n NameToken,\n NameTokenWithAllocation,\n} from './types';\n\nconst IDENTIFIER_MAX_LENGTH = 55 as const;\n\nexport class Identifiers {\n ID_COLUMN = 'id' as const;\n\n ORDER_COLUMN = 'order' as const;\n\n FIELD_COLUMN = 'field' as const;\n\n HASH_LENGTH = 5 as const;\n\n HASH_SEPARATOR = '' as const; // no separator is needed, we will just attach hash directly to shortened name\n\n IDENTIFIER_SEPARATOR = '_' as const;\n\n MIN_TOKEN_LENGTH = 3 as const; // the min characters required at the beginning of a name part\n\n // Fixed compression map for suffixes and prefixes\n #replacementMap = {\n links: 'lnk',\n order_inv_fk: 'oifk',\n order: 'ord',\n morphs: 'mph',\n index: 'idx',\n inv_fk: 'ifk',\n order_fk: 'ofk',\n id_column_index: 'idix',\n order_index: 'oidx',\n unique: 'uq',\n primary: 'pk',\n };\n\n #options: IdentifiersOptions;\n\n constructor(options: { maxLength: number }) {\n this.#options = options;\n }\n\n get replacementMap() {\n return this.#replacementMap;\n }\n\n get options() {\n return this.#options;\n }\n\n mapshortNames = (name: string): string | undefined => {\n if (name in this.replacementMap) {\n return (this.replacementMap as any)[name];\n }\n return undefined;\n };\n\n // Generic name handler that must be used by all helper functions\n /**\n * TODO: we should be requiring snake_case inputs for all names here, but we\n * aren't and it will require some refactoring to make it work. Currently if\n * we get names 'myModel' and 'my_model' they would be converted to the same\n * final string my_model which generally works but is not entirely safe\n * */\n getName = (names: NameInput, options?: NameOptions) => {\n const tokens: NameToken[] = _.castArray(names).map((name) => {\n return {\n name,\n compressible: true,\n };\n });\n\n if (options?.suffix) {\n tokens.push({\n name: options.suffix,\n compressible: false,\n shortName: this.mapshortNames(options.suffix),\n });\n }\n\n if (options?.prefix) {\n tokens.unshift({\n name: options.prefix,\n compressible: false,\n shortName: this.mapshortNames(options.prefix),\n });\n }\n\n return this.getNameFromTokens(tokens);\n };\n\n /**\n * TABLES\n */\n\n getTableName = (name: string, options?: NameOptions) => {\n return this.getName(name, options);\n };\n\n getJoinTableName = (collectionName: string, attributeName: string, options?: NameOptions) => {\n return this.getName([collectionName, attributeName], {\n suffix: 'links',\n ...options,\n });\n };\n\n getMorphTableName = (collectionName: string, attributeName: string, options?: NameOptions) => {\n return this.getName([snakeCase(collectionName), snakeCase(attributeName)], {\n suffix: 'morphs',\n ...options,\n });\n };\n\n /**\n * COLUMNS\n */\n\n getColumnName = (attributeName: string, options?: NameOptions) => {\n return this.getName(attributeName, options);\n };\n\n getJoinColumnAttributeIdName = (attributeName: string, options?: NameOptions) => {\n return this.getName(attributeName, { suffix: 'id', ...options });\n };\n\n getInverseJoinColumnAttributeIdName = (attributeName: string, options?: NameOptions) => {\n return this.getName(snakeCase(attributeName), { suffix: 'id', prefix: 'inv', ...options });\n };\n\n getOrderColumnName = (singularName: string, options?: NameOptions) => {\n return this.getName(singularName, { suffix: 'order', ...options });\n };\n\n getInverseOrderColumnName = (singularName: string, options?: NameOptions) => {\n return this.getName(singularName, {\n suffix: 'order',\n prefix: 'inv',\n ...options,\n });\n };\n\n /**\n * Morph Join Tables\n */\n getMorphColumnJoinTableIdName = (singularName: string, options?: NameOptions) => {\n return this.getName(snakeCase(singularName), { suffix: 'id', ...options });\n };\n\n getMorphColumnAttributeIdName = (attributeName: string, options?: NameOptions) => {\n return this.getName(snakeCase(attributeName), { suffix: 'id', ...options });\n };\n\n getMorphColumnTypeName = (attributeName: string, options?: NameOptions) => {\n return this.getName(snakeCase(attributeName), { suffix: 'type', ...options });\n };\n\n /**\n * INDEXES\n * Note that these methods are generally used to reference full table names + attribute(s), which\n * may already be shortened strings rather than individual parts.\n * That is fine and expected to compress the previously incompressible parts of those strings,\n * because in these cases the relevant information is the table name and we can't really do\n * any better; shortening the individual parts again might make it even more confusing.\n *\n * So for example, the fk for the table `mytable_myattr4567d_localizations` will become\n * mytable_myattr4567d_loc63bf2_fk\n */\n\n // base index types\n getIndexName = (names: NameInput, options?: NameOptions) => {\n return this.getName(names, { suffix: 'index', ...options });\n };\n\n getFkIndexName = (names: NameInput, options?: NameOptions) => {\n return this.getName(names, { suffix: 'fk', ...options });\n };\n\n getUniqueIndexName = (names: NameInput, options?: NameOptions) => {\n return this.getName(names, { suffix: 'unique', ...options });\n };\n\n getPrimaryIndexName = (names: NameInput, options?: NameOptions) => {\n return this.getName(names, { suffix: 'primary', ...options });\n };\n\n // custom index types\n getInverseFkIndexName = (names: NameInput, options?: NameOptions) => {\n return this.getName(names, { suffix: 'inv_fk', ...options });\n };\n\n getOrderFkIndexName = (names: NameInput, options?: NameOptions) => {\n return this.getName(names, { suffix: 'order_fk', ...options });\n };\n\n getOrderInverseFkIndexName = (names: NameInput, options?: NameOptions) => {\n return this.getName(names, { suffix: 'order_inv_fk', ...options });\n };\n\n getIdColumnIndexName = (names: NameInput, options?: NameOptions) => {\n return this.getName(names, { suffix: 'id_column_index', ...options });\n };\n\n getOrderIndexName = (names: NameInput, options?: NameOptions) => {\n return this.getName(names, { suffix: 'order_index', ...options });\n };\n\n /**\n * Generates a string with a max length, appending a hash at the end if necessary to keep it unique\n *\n * @example\n * // if we have strings such as \"longstring1\" and \"longstring2\" with a max length of 9,\n * // we don't want to end up with \"longstrin\" and \"longstrin\"\n * // we want something such as \"longs0b23\" and \"longs953f\"\n * const token1 = generateToken(\"longstring1\", 9); // \"longs0b23\"\n * const token2 = generateToken(\"longstring2\", 9); // \"longs953f\"\n *\n * @param name - The base name\n * @param len - The desired length of the token.\n * @returns The generated token with hash.\n * @throws Error if the length is not a positive integer, or if the length is too short for the token.\n * @internal\n */\n getShortenedName = (name: string, len: number) => {\n if (!isInteger(len) || len <= 0) {\n throw new Error(`tokenWithHash length must be a positive integer, received ${len}`);\n }\n if (name.length <= len) {\n return name;\n }\n if (len < this.MIN_TOKEN_LENGTH + this.HASH_LENGTH) {\n throw new Error(\n `length for part of identifier too short, minimum is hash length (${this.HASH_LENGTH}) plus min token length (${this.MIN_TOKEN_LENGTH}), received ${len} for token ${name}`\n );\n }\n\n const availableLength = len - this.HASH_LENGTH - this.HASH_SEPARATOR.length;\n if (availableLength < this.MIN_TOKEN_LENGTH) {\n throw new Error(\n `length for part of identifier minimum is less than min token length (${this.MIN_TOKEN_LENGTH}), received ${len} for token ${name}`\n );\n }\n\n return `${name.substring(0, availableLength)}${this.HASH_SEPARATOR}${createHash(\n name,\n this.HASH_LENGTH\n )}`;\n };\n\n /**\n * Constructs a name from an array of name tokens within a specified maximum length. It ensures the final name does not exceed\n * this limit by selectively compressing tokens marked as compressible. If the name exceeds the maximum length and cannot be\n * compressed sufficiently, an error is thrown. This function supports dynamic adjustment of token lengths to fit within the\n * maxLength constraint (that is, it will always make use of all available space), while also ensuring the preservation of\n * incompressible tokens.\n * @internal\n */\n getNameFromTokens = (nameTokens: NameToken[]): string => {\n const { maxLength } = this.options;\n\n if (!isInteger(maxLength) || maxLength < 0) {\n throw new Error('maxLength must be a positive integer or 0 (for unlimited length)');\n }\n\n const unshortenedName = nameTokens\n .map((token) => {\n return token.name;\n })\n .join(this.IDENTIFIER_SEPARATOR);\n\n // if maxLength == 0 we want the legacy v4 name without any shortening\n if (maxLength === 0) {\n this.setUnshortenedName(unshortenedName, unshortenedName);\n return unshortenedName;\n }\n\n // check the full length name (but with incompressible tokens using shortNames if available)\n const fullLengthName = nameTokens\n .map((token) => {\n if (token.compressible) {\n return token.name;\n }\n return token.shortName ?? token.name;\n })\n .join(this.IDENTIFIER_SEPARATOR);\n\n if (fullLengthName.length <= maxLength) {\n this.setUnshortenedName(fullLengthName, unshortenedName);\n return fullLengthName;\n }\n\n // Split tokens by compressibility\n const [compressible, incompressible] = partition(\n (token: NameToken) => token.compressible,\n nameTokens\n );\n\n const totalIncompressibleLength = sumBy((token: NameToken) =>\n token.compressible === false && token.shortName !== undefined\n ? token.shortName.length\n : token.name.length\n )(incompressible);\n const totalSeparatorsLength = nameTokens.length * this.IDENTIFIER_SEPARATOR.length - 1;\n const available = maxLength - totalIncompressibleLength - totalSeparatorsLength;\n const availablePerToken = Math.floor(available / compressible.length);\n\n if (\n totalIncompressibleLength + totalSeparatorsLength > maxLength ||\n availablePerToken < this.MIN_TOKEN_LENGTH\n ) {\n throw new Error('Maximum length is too small to accommodate all tokens');\n }\n\n // Calculate the remainder from the division and add it to the surplus\n let surplus = available % compressible.length;\n\n // Check that it's even possible to proceed\n const minHashedLength = this.HASH_LENGTH + this.HASH_SEPARATOR.length + this.MIN_TOKEN_LENGTH;\n const totalLength = nameTokens.reduce(\n (total, token) => {\n if (token.compressible) {\n if (token.name.length < availablePerToken) {\n return total + token.name.length;\n }\n return total + minHashedLength;\n }\n const tokenName = token.shortName ?? token.name;\n return total + tokenName.length;\n },\n nameTokens.length * this.IDENTIFIER_SEPARATOR.length - 1\n );\n\n // TODO: this is the weakest thing of the shortener, but fortunately it can be improved later without a breaking change if it turns out to be a problem (for example, if there is some case we need 6+ name parts in one identifier). We could take this \"shortest string we could generate\" that is too long and apply the hash directly to that, which would work fine even though it would be very difficult to determine what it was actually referring to\n // Check if the maximum length is less than the total length\n if (maxLength < totalLength) {\n throw new Error('Maximum length is too small to accommodate all tokens');\n }\n\n // Calculate total surplus length from shorter strings and total deficit length from longer strings\n let deficits: NameTokenWithAllocation[] = [];\n compressible.forEach((token) => {\n const actualLength = token.name.length;\n if (actualLength < availablePerToken) {\n surplus += availablePerToken - actualLength;\n token.allocatedLength = actualLength;\n } else {\n token.allocatedLength = availablePerToken;\n deficits.push(token as NameTokenWithAllocation);\n }\n });\n\n // Redistribute surplus length to longer strings, one character at a time\n // This way we avoid issues with greed and trying to handle floating points by dividing available length\n function filterAndIncreaseLength(token: NameTokenWithAllocation) {\n if (token.allocatedLength < token.name.length && surplus > 0) {\n token.allocatedLength += 1;\n surplus -= 1;\n // if it hasn't reached its full length, keep it in array for next round\n return token.allocatedLength < token.name.length;\n }\n return false; // Remove this token from the deficits array\n }\n\n // Redistribute surplus length to longer strings, one character at a time\n let previousSurplus = surplus + 1; // infinite loop protection\n while (surplus > 0 && deficits.length > 0) {\n deficits = deficits.filter((token) => filterAndIncreaseLength(token));\n\n // infinite loop protection; if the surplus hasn't changed, there was nothing left to distribute it to\n if (surplus === previousSurplus) {\n break;\n }\n previousSurplus = surplus;\n }\n\n // Build final string\n const shortenedName = nameTokens\n .map((token) => {\n // if it is compressible, shorten it\n if (\n token.compressible &&\n 'allocatedLength' in token &&\n token.allocatedLength !== undefined\n ) {\n return this.getShortenedName(token.name, token.allocatedLength);\n }\n\n // if is is only compressible as a fixed value, use that\n if (token.compressible === false && token.shortName) {\n return token.shortName;\n }\n\n // otherwise return it as-is\n return token.name;\n })\n .join(this.IDENTIFIER_SEPARATOR);\n\n // this should be unreachable, but add a final check for potential edge cases we missed\n if (shortenedName.length > maxLength) {\n throw new Error(\n `name shortening failed to generate a name of the correct maxLength; name ${shortenedName}`\n );\n }\n\n this.setUnshortenedName(shortenedName, unshortenedName);\n return shortenedName;\n };\n\n // We need to be able to find the full-length name for any shortened name, primarily for migration purposes\n // Therefore we store every name that passes through so we can retrieve the original later\n nameMap = new Map<string, string>();\n\n getUnshortenedName = (shortName: string) => {\n return this.nameMap.get(this.serializeKey(shortName)) ?? shortName;\n };\n\n setUnshortenedName = (shortName: string, fullName: string) => {\n // This is protection against cases where a name is shortened twice, for example shortened in a model outside of createMetadata\n // and then run through the shortener against inside createMetadata, which would do nothing at all but replace the original\n // name in this mapping\n if (this.nameMap.get(this.serializeKey(shortName)) && shortName === fullName) {\n return;\n }\n\n // set the name\n this.nameMap.set(this.serializeKey(shortName), fullName);\n };\n\n serializeKey = (shortName: string) => {\n return `${shortName}.${this.options.maxLength}`;\n };\n}\n\n// TODO: instead of instantiating this here as a global metadata should create its own to use\n// However, that would require refactoring all of the metadata methods to be instantiated to keep a centralized identifiers\nexport const identifiers = new Identifiers({ maxLength: IDENTIFIER_MAX_LENGTH });\n"],"names":["IDENTIFIER_MAX_LENGTH","Identifiers","replacementMap","options","ID_COLUMN","ORDER_COLUMN","FIELD_COLUMN","HASH_LENGTH","HASH_SEPARATOR","IDENTIFIER_SEPARATOR","MIN_TOKEN_LENGTH","links","order_inv_fk","order","morphs","index","inv_fk","order_fk","id_column_index","order_index","unique","primary","mapshortNames","name","undefined","getName","names","tokens","_","castArray","map","compressible","suffix","push","shortName","prefix","unshift","getNameFromTokens","getTableName","getJoinTableName","collectionName","attributeName","getMorphTableName","snakeCase","getColumnName","getJoinColumnAttributeIdName","getInverseJoinColumnAttributeIdName","getOrderColumnName","singularName","getInverseOrderColumnName","getMorphColumnJoinTableIdName","getMorphColumnAttributeIdName","getMorphColumnTypeName","getIndexName","getFkIndexName","getUniqueIndexName","getPrimaryIndexName","getInverseFkIndexName","getOrderFkIndexName","getOrderInverseFkIndexName","getIdColumnIndexName","getOrderIndexName","getShortenedName","len","isInteger","Error","length","availableLength","substring","createHash","nameTokens","maxLength","unshortenedName","token","join","setUnshortenedName","fullLengthName","incompressible","partition","totalIncompressibleLength","sumBy","totalSeparatorsLength","available","availablePerToken","Math","floor","surplus","minHashedLength","totalLength","reduce","total","tokenName","deficits","forEach","actualLength","allocatedLength","filterAndIncreaseLength","previousSurplus","filter","shortenedName","nameMap","Map","getUnshortenedName","get","serializeKey","fullName","set","identifiers"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/utils/identifiers/index.ts"],"sourcesContent":["/**\n * This file contains utility functions for generating names used in the database.\n * These names include table names, column names, join table names, index names, and more.\n * The generated names can be customized with prefixes, suffixes, and maximum length.\n * These utility functions are used throughout the codebase to ensure consistent and standardized naming conventions in the database.\n *\n * The reason for checking maxLength for suffixes and prefixes and using the long ones from Strapi 4 is so that we always\n * have access to the full length names, in particular for migration purposes, but also so that (in theory) the feature\n * could be disabled and stay compatible with v4 database structure.\n */\nimport _, { isInteger, partition, snakeCase, sumBy } from 'lodash/fp';\nimport { createHash } from './hash';\nimport {\n IdentifiersOptions,\n NameInput,\n NameOptions,\n NameToken,\n NameTokenWithAllocation,\n} from './types';\n\nconst IDENTIFIER_MAX_LENGTH = 55 as const;\n\nexport class Identifiers {\n ID_COLUMN = 'id' as const;\n\n ORDER_COLUMN = 'order' as const;\n\n FIELD_COLUMN = 'field' as const;\n\n HASH_LENGTH = 5 as const;\n\n HASH_SEPARATOR = '' as const; // no separator is needed, we will just attach hash directly to shortened name\n\n IDENTIFIER_SEPARATOR = '_' as const;\n\n MIN_TOKEN_LENGTH = 3 as const; // the min characters required at the beginning of a name part\n\n // Fixed compression map for suffixes and prefixes\n #replacementMap = {\n links: 'lnk',\n order_inv_fk: 'oifk',\n order: 'ord',\n morphs: 'mph',\n index: 'idx',\n inv_fk: 'ifk',\n order_fk: 'ofk',\n id_column_index: 'idix',\n order_index: 'oidx',\n unique: 'uq',\n primary: 'pk',\n };\n\n #options: IdentifiersOptions;\n\n constructor(options: { maxLength: number }) {\n this.#options = options;\n }\n\n get replacementMap() {\n return this.#replacementMap;\n }\n\n get options() {\n return this.#options;\n }\n\n mapshortNames = (name: string): string | undefined => {\n if (name in this.replacementMap) {\n return (this.replacementMap as any)[name];\n }\n return undefined;\n };\n\n // Generic name handler that must be used by all helper functions\n /**\n * TODO: we should be requiring snake_case inputs for all names here, but we\n * aren't and it will require some refactoring to make it work. Currently if\n * we get names 'myModel' and 'my_model' they would be converted to the same\n * final string my_model which generally works but is not entirely safe\n * */\n getName = (names: NameInput, options?: NameOptions) => {\n const tokens: NameToken[] = _.castArray(names).map((name) => {\n return {\n name,\n compressible: true,\n };\n });\n\n if (options?.suffix) {\n tokens.push({\n name: options.suffix,\n compressible: false,\n shortName: this.mapshortNames(options.suffix),\n });\n }\n\n if (options?.prefix) {\n tokens.unshift({\n name: options.prefix,\n compressible: false,\n shortName: this.mapshortNames(options.prefix),\n });\n }\n\n return this.getNameFromTokens(tokens);\n };\n\n /**\n * TABLES\n */\n\n getTableName = (name: string, options?: NameOptions) => {\n return this.getName(name, options);\n };\n\n getJoinTableName = (collectionName: string, attributeName: string, options?: NameOptions) => {\n return this.getName([collectionName, attributeName], {\n suffix: 'links',\n ...options,\n });\n };\n\n getMorphTableName = (collectionName: string, attributeName: string, options?: NameOptions) => {\n return this.getName([snakeCase(collectionName), snakeCase(attributeName)], {\n suffix: 'morphs',\n ...options,\n });\n };\n\n /**\n * COLUMNS\n */\n\n getColumnName = (attributeName: string, options?: NameOptions) => {\n return this.getName(attributeName, options);\n };\n\n getJoinColumnAttributeIdName = (attributeName: string, options?: NameOptions) => {\n return this.getName(attributeName, { suffix: 'id', ...options });\n };\n\n getInverseJoinColumnAttributeIdName = (attributeName: string, options?: NameOptions) => {\n return this.getName(snakeCase(attributeName), { suffix: 'id', prefix: 'inv', ...options });\n };\n\n getOrderColumnName = (singularName: string, options?: NameOptions) => {\n return this.getName(singularName, { suffix: 'order', ...options });\n };\n\n getInverseOrderColumnName = (singularName: string, options?: NameOptions) => {\n return this.getName(singularName, {\n suffix: 'order',\n prefix: 'inv',\n ...options,\n });\n };\n\n /**\n * Morph Join Tables\n */\n getMorphColumnJoinTableIdName = (singularName: string, options?: NameOptions) => {\n return this.getName(snakeCase(singularName), { suffix: 'id', ...options });\n };\n\n getMorphColumnAttributeIdName = (attributeName: string, options?: NameOptions) => {\n return this.getName(snakeCase(attributeName), { suffix: 'id', ...options });\n };\n\n getMorphColumnTypeName = (attributeName: string, options?: NameOptions) => {\n return this.getName(snakeCase(attributeName), { suffix: 'type', ...options });\n };\n\n /**\n * INDEXES\n * Note that these methods are generally used to reference full table names + attribute(s), which\n * may already be shortened strings rather than individual parts.\n * That is fine and expected to compress the previously incompressible parts of those strings,\n * because in these cases the relevant information is the table name and we can't really do\n * any better; shortening the individual parts again might make it even more confusing.\n *\n * So for example, the fk for the table `mytable_myattr4567d_localizations` will become\n * mytable_myattr4567d_loc63bf2_fk\n */\n\n // base index types\n getIndexName = (names: NameInput, options?: NameOptions) => {\n return this.getName(names, { suffix: 'index', ...options });\n };\n\n getFkIndexName = (names: NameInput, options?: NameOptions) => {\n return this.getName(names, { suffix: 'fk', ...options });\n };\n\n getUniqueIndexName = (names: NameInput, options?: NameOptions) => {\n return this.getName(names, { suffix: 'unique', ...options });\n };\n\n getPrimaryIndexName = (names: NameInput, options?: NameOptions) => {\n return this.getName(names, { suffix: 'primary', ...options });\n };\n\n // custom index types\n getInverseFkIndexName = (names: NameInput, options?: NameOptions) => {\n return this.getName(names, { suffix: 'inv_fk', ...options });\n };\n\n getOrderFkIndexName = (names: NameInput, options?: NameOptions) => {\n return this.getName(names, { suffix: 'order_fk', ...options });\n };\n\n getOrderInverseFkIndexName = (names: NameInput, options?: NameOptions) => {\n return this.getName(names, { suffix: 'order_inv_fk', ...options });\n };\n\n getIdColumnIndexName = (names: NameInput, options?: NameOptions) => {\n return this.getName(names, { suffix: 'id_column_index', ...options });\n };\n\n getOrderIndexName = (names: NameInput, options?: NameOptions) => {\n return this.getName(names, { suffix: 'order_index', ...options });\n };\n\n /**\n * Generates a string with a max length, appending a hash at the end if necessary to keep it unique\n *\n * @example\n * // if we have strings such as \"longstring1\" and \"longstring2\" with a max length of 9,\n * // we don't want to end up with \"longstrin\" and \"longstrin\"\n * // we want something such as \"longs0b23\" and \"longs953f\"\n * const token1 = generateToken(\"longstring1\", 9); // \"longs0b23\"\n * const token2 = generateToken(\"longstring2\", 9); // \"longs953f\"\n *\n * @param name - The base name\n * @param len - The desired length of the token.\n * @returns The generated token with hash.\n * @throws Error if the length is not a positive integer, or if the length is too short for the token.\n * @internal\n */\n getShortenedName = (name: string, len: number) => {\n if (!isInteger(len) || len <= 0) {\n throw new Error(`tokenWithHash length must be a positive integer, received ${len}`);\n }\n if (name.length <= len) {\n return name;\n }\n if (len < this.MIN_TOKEN_LENGTH + this.HASH_LENGTH) {\n throw new Error(\n `length for part of identifier too short, minimum is hash length (${this.HASH_LENGTH}) plus min token length (${this.MIN_TOKEN_LENGTH}), received ${len} for token ${name}`\n );\n }\n\n const availableLength = len - this.HASH_LENGTH - this.HASH_SEPARATOR.length;\n if (availableLength < this.MIN_TOKEN_LENGTH) {\n throw new Error(\n `length for part of identifier minimum is less than min token length (${this.MIN_TOKEN_LENGTH}), received ${len} for token ${name}`\n );\n }\n\n return `${name.substring(0, availableLength)}${this.HASH_SEPARATOR}${createHash(\n name,\n this.HASH_LENGTH\n )}`;\n };\n\n /**\n * Constructs a name from an array of name tokens within a specified maximum length. It ensures the final name does not exceed\n * this limit by selectively compressing tokens marked as compressible. If the name exceeds the maximum length and cannot be\n * compressed sufficiently, an error is thrown. This function supports dynamic adjustment of token lengths to fit within the\n * maxLength constraint (that is, it will always make use of all available space), while also ensuring the preservation of\n * incompressible tokens.\n * @internal\n */\n getNameFromTokens = (nameTokens: NameToken[]): string => {\n const { maxLength } = this.options;\n\n if (!isInteger(maxLength) || maxLength < 0) {\n throw new Error('maxLength must be a positive integer or 0 (for unlimited length)');\n }\n\n const unshortenedName = nameTokens\n .map((token) => {\n return token.name;\n })\n .join(this.IDENTIFIER_SEPARATOR);\n\n // if maxLength == 0 we want the legacy v4 name without any shortening\n if (maxLength === 0) {\n this.setUnshortenedName(unshortenedName, unshortenedName);\n return unshortenedName;\n }\n\n // check the full length name (but with incompressible tokens using shortNames if available)\n const fullLengthName = nameTokens\n .map((token) => {\n if (token.compressible) {\n return token.name;\n }\n return token.shortName ?? token.name;\n })\n .join(this.IDENTIFIER_SEPARATOR);\n\n if (fullLengthName.length <= maxLength) {\n this.setUnshortenedName(fullLengthName, unshortenedName);\n return fullLengthName;\n }\n\n // Split tokens by compressibility\n const [compressible, incompressible] = partition(\n (token: NameToken) => token.compressible,\n nameTokens\n );\n\n const totalIncompressibleLength = sumBy((token: NameToken) =>\n token.compressible === false && token.shortName !== undefined\n ? token.shortName.length\n : token.name.length\n )(incompressible);\n const totalSeparatorsLength = nameTokens.length * this.IDENTIFIER_SEPARATOR.length - 1;\n const available = maxLength - totalIncompressibleLength - totalSeparatorsLength;\n const availablePerToken = Math.floor(available / compressible.length);\n\n if (\n totalIncompressibleLength + totalSeparatorsLength > maxLength ||\n availablePerToken < this.MIN_TOKEN_LENGTH\n ) {\n throw new Error('Maximum length is too small to accommodate all tokens');\n }\n\n // Calculate the remainder from the division and add it to the surplus\n let surplus = available % compressible.length;\n\n // Check that it's even possible to proceed\n const minHashedLength = this.HASH_LENGTH + this.HASH_SEPARATOR.length + this.MIN_TOKEN_LENGTH;\n const totalLength = nameTokens.reduce(\n (total, token) => {\n if (token.compressible) {\n if (token.name.length < availablePerToken) {\n return total + token.name.length;\n }\n return total + minHashedLength;\n }\n const tokenName = token.shortName ?? token.name;\n return total + tokenName.length;\n },\n nameTokens.length * this.IDENTIFIER_SEPARATOR.length - 1\n );\n\n // TODO: this is the weakest thing of the shortener, but fortunately it can be improved later without a breaking change if it turns out to be a problem (for example, if there is some case we need 6+ name parts in one identifier). We could take this \"shortest string we could generate\" that is too long and apply the hash directly to that, which would work fine even though it would be very difficult to determine what it was actually referring to\n // Check if the maximum length is less than the total length\n if (maxLength < totalLength) {\n throw new Error('Maximum length is too small to accommodate all tokens');\n }\n\n // Calculate total surplus length from shorter strings and total deficit length from longer strings\n let deficits: NameTokenWithAllocation[] = [];\n compressible.forEach((token) => {\n const actualLength = token.name.length;\n if (actualLength < availablePerToken) {\n surplus += availablePerToken - actualLength;\n token.allocatedLength = actualLength;\n } else {\n token.allocatedLength = availablePerToken;\n deficits.push(token as NameTokenWithAllocation);\n }\n });\n\n // Redistribute surplus length to longer strings, one character at a time\n // This way we avoid issues with greed and trying to handle floating points by dividing available length\n function filterAndIncreaseLength(token: NameTokenWithAllocation) {\n if (token.allocatedLength < token.name.length && surplus > 0) {\n token.allocatedLength += 1;\n surplus -= 1;\n // if it hasn't reached its full length, keep it in array for next round\n return token.allocatedLength < token.name.length;\n }\n return false; // Remove this token from the deficits array\n }\n\n // Redistribute surplus length to longer strings, one character at a time\n let previousSurplus = surplus + 1; // infinite loop protection\n while (surplus > 0 && deficits.length > 0) {\n deficits = deficits.filter((token) => filterAndIncreaseLength(token));\n\n // infinite loop protection; if the surplus hasn't changed, there was nothing left to distribute it to\n if (surplus === previousSurplus) {\n break;\n }\n previousSurplus = surplus;\n }\n\n // Build final string\n const shortenedName = nameTokens\n .map((token) => {\n // if it is compressible, shorten it\n if (\n token.compressible &&\n 'allocatedLength' in token &&\n token.allocatedLength !== undefined\n ) {\n return this.getShortenedName(token.name, token.allocatedLength);\n }\n\n // if is is only compressible as a fixed value, use that\n if (token.compressible === false && token.shortName) {\n return token.shortName;\n }\n\n // otherwise return it as-is\n return token.name;\n })\n .join(this.IDENTIFIER_SEPARATOR);\n\n // this should be unreachable, but add a final check for potential edge cases we missed\n if (shortenedName.length > maxLength) {\n throw new Error(\n `name shortening failed to generate a name of the correct maxLength; name ${shortenedName}`\n );\n }\n\n this.setUnshortenedName(shortenedName, unshortenedName);\n return shortenedName;\n };\n\n // We need to be able to find the full-length name for any shortened name, primarily for migration purposes\n // Therefore we store every name that passes through so we can retrieve the original later\n nameMap = new Map<string, string>();\n\n getUnshortenedName = (shortName: string) => {\n return this.nameMap.get(this.serializeKey(shortName)) ?? shortName;\n };\n\n setUnshortenedName = (shortName: string, fullName: string) => {\n // This is protection against cases where a name is shortened twice, for example shortened in a model outside of createMetadata\n // and then run through the shortener against inside createMetadata, which would do nothing at all but replace the original\n // name in this mapping\n if (this.nameMap.get(this.serializeKey(shortName)) && shortName === fullName) {\n return;\n }\n\n // set the name\n this.nameMap.set(this.serializeKey(shortName), fullName);\n };\n\n serializeKey = (shortName: string) => {\n return `${shortName}.${this.options.maxLength}`;\n };\n}\n\n// TODO: instead of instantiating this here as a global metadata should create its own to use\n// However, that would require refactoring all of the metadata methods to be instantiated to keep a centralized identifiers\nexport const identifiers = new Identifiers({ maxLength: IDENTIFIER_MAX_LENGTH });\n"],"names":["IDENTIFIER_MAX_LENGTH","Identifiers","replacementMap","options","ID_COLUMN","ORDER_COLUMN","FIELD_COLUMN","HASH_LENGTH","HASH_SEPARATOR","IDENTIFIER_SEPARATOR","MIN_TOKEN_LENGTH","links","order_inv_fk","order","morphs","index","inv_fk","order_fk","id_column_index","order_index","unique","primary","mapshortNames","name","undefined","getName","names","tokens","_","castArray","map","compressible","suffix","push","shortName","prefix","unshift","getNameFromTokens","getTableName","getJoinTableName","collectionName","attributeName","getMorphTableName","snakeCase","getColumnName","getJoinColumnAttributeIdName","getInverseJoinColumnAttributeIdName","getOrderColumnName","singularName","getInverseOrderColumnName","getMorphColumnJoinTableIdName","getMorphColumnAttributeIdName","getMorphColumnTypeName","getIndexName","getFkIndexName","getUniqueIndexName","getPrimaryIndexName","getInverseFkIndexName","getOrderFkIndexName","getOrderInverseFkIndexName","getIdColumnIndexName","getOrderIndexName","getShortenedName","len","isInteger","Error","length","availableLength","substring","createHash","nameTokens","maxLength","unshortenedName","token","join","setUnshortenedName","fullLengthName","incompressible","partition","totalIncompressibleLength","sumBy","totalSeparatorsLength","available","availablePerToken","Math","floor","surplus","minHashedLength","totalLength","reduce","total","tokenName","deficits","forEach","actualLength","allocatedLength","filterAndIncreaseLength","previousSurplus","filter","shortenedName","nameMap","Map","getUnshortenedName","get","serializeKey","fullName","set","identifiers"],"mappings":"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"}