@solidxai/core 0.1.11-beta.1 → 0.1.11-beta.4

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 (136) hide show
  1. package/.claude/settings.local.json +16 -0
  2. package/CLAUDE.md +26 -0
  3. package/dist/controllers/datasource-introspection.controller.d.ts +38 -1
  4. package/dist/controllers/datasource-introspection.controller.d.ts.map +1 -1
  5. package/dist/controllers/datasource-introspection.controller.js +38 -0
  6. package/dist/controllers/datasource-introspection.controller.js.map +1 -1
  7. package/dist/controllers/service.controller.d.ts +1 -0
  8. package/dist/controllers/service.controller.d.ts.map +1 -1
  9. package/dist/controllers/service.controller.js +2 -2
  10. package/dist/controllers/service.controller.js.map +1 -1
  11. package/dist/dtos/datasource-introspection-mapping.dto.d.ts +4 -0
  12. package/dist/dtos/datasource-introspection-mapping.dto.d.ts.map +1 -1
  13. package/dist/dtos/datasource-introspection-mapping.dto.js +18 -2
  14. package/dist/dtos/datasource-introspection-mapping.dto.js.map +1 -1
  15. package/dist/entities/{legacy-common-with-id.entity.d.ts → legacy-common-with-generated-id.entity.d.ts} +2 -2
  16. package/dist/entities/legacy-common-with-generated-id.entity.d.ts.map +1 -0
  17. package/dist/entities/{legacy-common-with-id.entity.js → legacy-common-with-generated-id.entity.js} +4 -4
  18. package/dist/entities/legacy-common-with-generated-id.entity.js.map +1 -0
  19. package/dist/entities/{legacy-common.entity.d.ts → legacy-common.entity-with-existing-id.entity.d.ts} +1 -1
  20. package/dist/entities/legacy-common.entity-with-existing-id.entity.d.ts.map +1 -0
  21. package/dist/entities/{legacy-common.entity.js → legacy-common.entity-with-existing-id.entity.js} +1 -1
  22. package/dist/entities/legacy-common.entity-with-existing-id.entity.js.map +1 -0
  23. package/dist/helpers/field-crud-managers/IntFieldCrudManager.d.ts.map +1 -1
  24. package/dist/helpers/field-crud-managers/IntFieldCrudManager.js +4 -1
  25. package/dist/helpers/field-crud-managers/IntFieldCrudManager.js.map +1 -1
  26. package/dist/helpers/model-metadata-helper.service.js +3 -3
  27. package/dist/helpers/model-metadata-helper.service.js.map +1 -1
  28. package/dist/helpers/solid-registry.d.ts +2 -1
  29. package/dist/helpers/solid-registry.d.ts.map +1 -1
  30. package/dist/helpers/solid-registry.js.map +1 -1
  31. package/dist/index.d.ts +2 -2
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +2 -2
  34. package/dist/index.js.map +1 -1
  35. package/dist/interfaces/datasource-introspection-provider.interface.d.ts +1 -0
  36. package/dist/interfaces/datasource-introspection-provider.interface.d.ts.map +1 -1
  37. package/dist/interfaces/datasource-introspection-provider.interface.js.map +1 -1
  38. package/dist/seeders/module-metadata-seeder.service.d.ts +5 -1
  39. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  40. package/dist/seeders/module-metadata-seeder.service.js +61 -3
  41. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  42. package/dist/seeders/seed-data/solid-core-metadata.json +19 -3
  43. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts.map +1 -1
  44. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js +6 -5
  45. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js.map +1 -1
  46. package/dist/services/datasource-introspection/mssql-datasource-introspection-provider.service.d.ts.map +1 -1
  47. package/dist/services/datasource-introspection/mssql-datasource-introspection-provider.service.js +12 -0
  48. package/dist/services/datasource-introspection/mssql-datasource-introspection-provider.service.js.map +1 -1
  49. package/dist/services/datasource-introspection/mysql-datasource-introspection-provider.service.d.ts.map +1 -1
  50. package/dist/services/datasource-introspection/mysql-datasource-introspection-provider.service.js +2 -0
  51. package/dist/services/datasource-introspection/mysql-datasource-introspection-provider.service.js.map +1 -1
  52. package/dist/services/datasource-introspection/postgres-datasource-introspection-provider.service.d.ts.map +1 -1
  53. package/dist/services/datasource-introspection/postgres-datasource-introspection-provider.service.js +28 -15
  54. package/dist/services/datasource-introspection/postgres-datasource-introspection-provider.service.js.map +1 -1
  55. package/dist/services/datasource-introspection.service.d.ts +52 -2
  56. package/dist/services/datasource-introspection.service.d.ts.map +1 -1
  57. package/dist/services/datasource-introspection.service.js +534 -160
  58. package/dist/services/datasource-introspection.service.js.map +1 -1
  59. package/dist/services/locale.service.d.ts +14 -0
  60. package/dist/services/locale.service.d.ts.map +1 -1
  61. package/dist/services/locale.service.js +83 -0
  62. package/dist/services/locale.service.js.map +1 -1
  63. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +10 -10
  64. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
  65. package/dist/services/role-metadata.service.d.ts +1 -0
  66. package/dist/services/role-metadata.service.d.ts.map +1 -1
  67. package/dist/services/role-metadata.service.js +23 -2
  68. package/dist/services/role-metadata.service.js.map +1 -1
  69. package/dist/services/view-metadata.service.d.ts.map +1 -1
  70. package/dist/services/view-metadata.service.js +4 -7
  71. package/dist/services/view-metadata.service.js.map +1 -1
  72. package/dist/subscribers/audit.subscriber.d.ts +2 -0
  73. package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
  74. package/dist/subscribers/audit.subscriber.js +25 -6
  75. package/dist/subscribers/audit.subscriber.js.map +1 -1
  76. package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
  77. package/dist/subscribers/computed-entity-field.subscriber.js +1 -0
  78. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  79. package/dist/subscribers/created-by-updated-by.subscriber.d.ts.map +1 -1
  80. package/dist/subscribers/created-by-updated-by.subscriber.js.map +1 -1
  81. package/dist/subscribers/field-metadata.subscriber.d.ts.map +1 -1
  82. package/dist/subscribers/field-metadata.subscriber.js.map +1 -1
  83. package/package.json +1 -1
  84. package/src/controllers/datasource-introspection.controller.ts +27 -1
  85. package/src/controllers/service.controller.ts +3 -2
  86. package/src/dtos/datasource-introspection-mapping.dto.ts +10 -0
  87. package/src/entities/{legacy-common-with-id.entity.ts → legacy-common-with-generated-id.entity.ts} +1 -1
  88. package/src/helpers/field-crud-managers/IntFieldCrudManager.ts +4 -1
  89. package/src/helpers/model-metadata-helper.service.ts +1 -1
  90. package/src/helpers/solid-registry.ts +7 -1
  91. package/src/index.ts +2 -2
  92. package/src/interfaces/datasource-introspection-provider.interface.ts +1 -0
  93. package/src/seeders/module-metadata-seeder.service.ts +72 -2
  94. package/src/seeders/seed-data/solid-core-metadata.json +19 -3
  95. package/src/services/1.js +6 -0
  96. package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts +10 -5
  97. package/src/services/datasource-introspection/mssql-datasource-introspection-provider.service.ts +12 -0
  98. package/src/services/datasource-introspection/mysql-datasource-introspection-provider.service.ts +2 -0
  99. package/src/services/datasource-introspection/postgres-datasource-introspection-provider.service.ts +28 -15
  100. package/src/services/datasource-introspection.service.ts +626 -136
  101. package/src/services/locale.service.ts +111 -3
  102. package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +2 -2
  103. package/src/services/role-metadata.service.ts +26 -2
  104. package/src/services/view-metadata.service.ts +4 -8
  105. package/src/subscribers/audit.subscriber.ts +34 -14
  106. package/src/subscribers/computed-entity-field.subscriber.ts +1 -0
  107. package/src/subscribers/created-by-updated-by.subscriber.ts +3 -0
  108. package/src/subscribers/field-metadata.subscriber.ts +3 -0
  109. package/dist/entities/legacy-common-with-id.entity.d.ts.map +0 -1
  110. package/dist/entities/legacy-common-with-id.entity.js.map +0 -1
  111. package/dist/entities/legacy-common.entity.d.ts.map +0 -1
  112. package/dist/entities/legacy-common.entity.js.map +0 -1
  113. package/dist-tests/api/authenticate.spec.js +0 -119
  114. package/dist-tests/api/authenticate.spec.js.map +0 -1
  115. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +0 -97
  116. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +0 -1
  117. package/dist-tests/api/ping.spec.js +0 -21
  118. package/dist-tests/api/ping.spec.js.map +0 -1
  119. package/dist-tests/helpers/auth.js +0 -41
  120. package/dist-tests/helpers/auth.js.map +0 -1
  121. package/dist-tests/helpers/env.js +0 -11
  122. package/dist-tests/helpers/env.js.map +0 -1
  123. package/docs/agent-hub-grooming.md +0 -301
  124. package/docs/dashboards/AGENTIC_DASHBOARD_IMPLEMENTATION_PLAN.md +0 -438
  125. package/docs/dashboards/dashboard-curl-smoke-tests.txt +0 -146
  126. package/docs/dashboards/delete-legacy-dashboard-metadata.sql +0 -172
  127. package/docs/datasource-introspection-ddl-analysis.md +0 -326
  128. package/docs/datasource-introspection-implementation-plan.md +0 -306
  129. package/docs/grouping-enhancements.md +0 -89
  130. package/docs/java-spring/README.md +0 -3
  131. package/docs/java-spring/solid-core-module-deep-dive-report.md +0 -1317
  132. package/docs/module-package-import-handoff.md +0 -691
  133. package/docs/seed-changes.md +0 -65
  134. package/docs/test-data-workflow.md +0 -200
  135. package/docs/type-declaration-import-issue.md +0 -24
  136. /package/src/entities/{legacy-common.entity.ts → legacy-common.entity-with-existing-id.entity.ts} +0 -0
@@ -1077,15 +1077,24 @@
1077
1077
  {
1078
1078
  "name": "type",
1079
1079
  "displayName": "Type",
1080
- "type": "shortText",
1080
+ "type": "selectionStatic",
1081
1081
  "ormType": "varchar",
1082
+ "length": 256,
1082
1083
  "required": true,
1083
1084
  "unique": false,
1084
1085
  "index": true,
1085
1086
  "private": false,
1086
1087
  "encrypt": false,
1087
1088
  "columnName": "type",
1088
- "isSystem": true
1089
+ "isSystem": true,
1090
+ "selectionValueType": "string",
1091
+ "selectionStaticValues": [
1092
+ "list:List",
1093
+ "form:Form",
1094
+ "tree:Tree",
1095
+ "kanban:Kanban",
1096
+ "card:Card"
1097
+ ]
1089
1098
  },
1090
1099
  {
1091
1100
  "name": "context",
@@ -1584,7 +1593,7 @@
1584
1593
  "name": "roles",
1585
1594
  "displayName": "Roles",
1586
1595
  "type": "relation",
1587
- "required": true,
1596
+ "required": false,
1588
1597
  "unique": false,
1589
1598
  "index": true,
1590
1599
  "private": false,
@@ -5244,6 +5253,13 @@
5244
5253
  }
5245
5254
  ]
5246
5255
  },
5256
+ "locales": [
5257
+ {
5258
+ "locale": "en",
5259
+ "displayName": "English",
5260
+ "isDefault": true
5261
+ }
5262
+ ],
5247
5263
  "permissions": [
5248
5264
  "mcp:invoke",
5249
5265
  "agent:invoke",
@@ -1 +1 @@
1
- {"version":3,"file":"alpha-num-external-id-computed-field-provider.d.ts","sourceRoot":"","sources":["../../../../src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,WAAW,yBAAyB;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,qBAEa,qCAAqC,CAAC,CAAC,SAAS,YAAY,CAAE,YAAW,8BAA8B,CAAC,CAAC,EAAE,yBAAyB,CAAC;IAG9I,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAG/C,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAIR,eAAe,CAAC,aAAa,EAAE,CAAC,EAAE,qBAAqB,EAAE,qBAAqB,CAAC,yBAAyB,CAAC;IAuB/G,OAAO,CAAC,kBAAkB;YASZ,kBAAkB;YASlB,wBAAwB;CAkBvC"}
1
+ {"version":3,"file":"alpha-num-external-id-computed-field-provider.d.ts","sourceRoot":"","sources":["../../../../src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,WAAW,yBAAyB;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,qBAEa,qCAAqC,CAAC,CAAC,SAAS,YAAY,CAAE,YAAW,8BAA8B,CAAC,CAAC,EAAE,yBAAyB,CAAC;IAG9I,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAG/C,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAIR,eAAe,CAAC,aAAa,EAAE,CAAC,EAAE,qBAAqB,EAAE,qBAAqB,CAAC,yBAAyB,CAAC;IA4B/G,OAAO,CAAC,kBAAkB;YASZ,kBAAkB;YASlB,wBAAwB;CAkBvC"}
@@ -40,7 +40,8 @@ let AlphaNumExternalIdComputationProvider = class AlphaNumExternalIdComputationP
40
40
  resolvedPrefix = String(dynamicValue).trim().toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9\-]/g, '');
41
41
  }
42
42
  }
43
- const uniqueCode = await this.generateUniqueExternalId(resolvedPrefix, codeLength, computedFieldMetadata.fieldName, entityName);
43
+ const manager = eventContext?.manager ?? this.entityManager;
44
+ const uniqueCode = await this.generateUniqueExternalId(manager, resolvedPrefix, codeLength, computedFieldMetadata.fieldName, entityName);
44
45
  const finalExternalId = resolvedPrefix ? `${resolvedPrefix}-${uniqueCode}` : uniqueCode;
45
46
  triggerEntity[computedFieldMetadata.fieldName] = finalExternalId;
46
47
  }
@@ -52,18 +53,18 @@ let AlphaNumExternalIdComputationProvider = class AlphaNumExternalIdComputationP
52
53
  }
53
54
  return result;
54
55
  }
55
- async isExternalIdUnique(externalId, fieldName, entityName) {
56
- const count = await this.entityManager.count(entityName, {
56
+ async isExternalIdUnique(manager, externalId, fieldName, entityName) {
57
+ const count = await manager.count(entityName, {
57
58
  where: { [fieldName]: externalId },
58
59
  });
59
60
  return count === 0;
60
61
  }
61
- async generateUniqueExternalId(resolvedPrefix, codeLength, fieldName, entityName) {
62
+ async generateUniqueExternalId(manager, resolvedPrefix, codeLength, fieldName, entityName) {
62
63
  const maxAttempts = 10;
63
64
  for (let attempt = 0; attempt < maxAttempts; attempt++) {
64
65
  const newId = this.generateRandomCode(codeLength);
65
66
  const fullId = resolvedPrefix ? `${resolvedPrefix}-${newId}` : newId;
66
- const isUnique = await this.isExternalIdUnique(fullId, fieldName, entityName);
67
+ const isUnique = await this.isExternalIdUnique(manager, fullId, fieldName, entityName);
67
68
  if (isUnique) {
68
69
  return newId;
69
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"alpha-num-external-id-computed-field-provider.js","sourceRoot":"","sources":["../../../../src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { InjectEntityManager } from '@nestjs/typeorm';\nimport { ComputedFieldProvider } from 'src/decorators/computed-field-provider.decorator';\nimport { CommonEntity } from 'src/entities/common.entity';\nimport { ComputedFieldMetadata } from 'src/helpers/solid-registry';\nimport { IEntityPreComputeFieldProvider } from 'src/interfaces';\nimport { EntityManager } from 'typeorm';\nimport { get } from \"lodash\";\nexport interface AlphaNumExternalIdContext {\n prefix?: string; // alias -> staticPrefix\n length?: number; // Optional: length of the unique code to generate, default is 5\n dynamicFieldPrefix?: string; // NEW: field name on the entity\n}\n\n@ComputedFieldProvider()\n@Injectable()\nexport class AlphaNumExternalIdComputationProvider<T extends CommonEntity> implements IEntityPreComputeFieldProvider<T, AlphaNumExternalIdContext> {\n constructor(\n @InjectEntityManager()\n private readonly entityManager: EntityManager\n ) { }\n\n name(): string {\n return this.constructor.name;\n }\n\n help(): string {\n return 'Provider used to compute external ID for a CommonEntity with support for static or dynamic prefix.';\n }\n\n async preComputeValue(triggerEntity: T, computedFieldMetadata: ComputedFieldMetadata<AlphaNumExternalIdContext>) {\n const { prefix, length, dynamicFieldPrefix } = computedFieldMetadata.computedFieldValueProviderCtxt;\n const eventContext = computedFieldMetadata.eventContext;\n const entityName = eventContext?.metadataName ?? eventContext.databaseEntity?.constructor?.name ?? '';\n\n const codeLength = length || 5;\n\n // Determine prefix\n let resolvedPrefix = prefix || '';\n\n if (dynamicFieldPrefix) {\n const dynamicValue = get(triggerEntity as any, dynamicFieldPrefix);\n if (dynamicValue) {\n resolvedPrefix = String(dynamicValue).trim().toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9\\-]/g, '');\n }\n }\n\n const uniqueCode = await this.generateUniqueExternalId(resolvedPrefix, codeLength, computedFieldMetadata.fieldName, entityName);\n const finalExternalId = resolvedPrefix ? `${resolvedPrefix}-${uniqueCode}` : uniqueCode;\n\n triggerEntity[computedFieldMetadata.fieldName] = finalExternalId;\n }\n\n private generateRandomCode(length = 5): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n }\n\n private async isExternalIdUnique(externalId: string, fieldName: string, entityName: string): Promise<boolean> {\n const count = await this.entityManager.count(entityName as any,\n {\n where: { [fieldName]: externalId },\n }\n );\n return count === 0;\n }\n\n private async generateUniqueExternalId(resolvedPrefix: string, codeLength: number, fieldName: string, entityName: string): Promise<string> {\n const maxAttempts = 10;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n\n const newId = this.generateRandomCode(codeLength);\n\n const fullId = resolvedPrefix ? `${resolvedPrefix}-${newId}` : newId;\n\n const isUnique = await this.isExternalIdUnique(fullId, fieldName, entityName);\n\n if (isUnique) {\n return newId;\n }\n }\n\n throw new Error('Failed to generate a unique external ID after multiple attempts');\n }\n}\n"]}
1
+ {"version":3,"file":"alpha-num-external-id-computed-field-provider.js","sourceRoot":"","sources":["../../../../src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { InjectEntityManager } from '@nestjs/typeorm';\nimport { ComputedFieldProvider } from 'src/decorators/computed-field-provider.decorator';\nimport { CommonEntity } from 'src/entities/common.entity';\nimport { ComputedFieldMetadata } from 'src/helpers/solid-registry';\nimport { IEntityPreComputeFieldProvider } from 'src/interfaces';\nimport { EntityManager } from 'typeorm';\nimport { get } from \"lodash\";\nexport interface AlphaNumExternalIdContext {\n prefix?: string; // alias -> staticPrefix\n length?: number; // Optional: length of the unique code to generate, default is 5\n dynamicFieldPrefix?: string; // NEW: field name on the entity\n}\n\n@ComputedFieldProvider()\n@Injectable()\nexport class AlphaNumExternalIdComputationProvider<T extends CommonEntity> implements IEntityPreComputeFieldProvider<T, AlphaNumExternalIdContext> {\n constructor(\n @InjectEntityManager()\n private readonly entityManager: EntityManager\n ) { }\n\n name(): string {\n return this.constructor.name;\n }\n\n help(): string {\n return 'Provider used to compute external ID for a CommonEntity with support for static or dynamic prefix.';\n }\n\n async preComputeValue(triggerEntity: T, computedFieldMetadata: ComputedFieldMetadata<AlphaNumExternalIdContext>) {\n const { prefix, length, dynamicFieldPrefix } = computedFieldMetadata.computedFieldValueProviderCtxt;\n const eventContext = computedFieldMetadata.eventContext;\n const entityName = eventContext?.metadataName ?? eventContext.databaseEntity?.constructor?.name ?? '';\n\n const codeLength = length || 5;\n\n // Determine prefix\n let resolvedPrefix = prefix || '';\n\n if (dynamicFieldPrefix) {\n const dynamicValue = get(triggerEntity as any, dynamicFieldPrefix);\n if (dynamicValue) {\n resolvedPrefix = String(dynamicValue).trim().toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9\\-]/g, '');\n }\n }\n\n // Use the originating transaction's EntityManager so the uniqueness check runs on the\n // active connection. Falls back to the injected manager only when no event context is\n // available (e.g. direct invocation outside a TypeORM lifecycle event).\n const manager = eventContext?.manager ?? this.entityManager;\n\n const uniqueCode = await this.generateUniqueExternalId(manager, resolvedPrefix, codeLength, computedFieldMetadata.fieldName, entityName);\n const finalExternalId = resolvedPrefix ? `${resolvedPrefix}-${uniqueCode}` : uniqueCode;\n\n triggerEntity[computedFieldMetadata.fieldName] = finalExternalId;\n }\n\n private generateRandomCode(length = 5): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n }\n\n private async isExternalIdUnique(manager: EntityManager, externalId: string, fieldName: string, entityName: string): Promise<boolean> {\n const count = await manager.count(entityName as any,\n {\n where: { [fieldName]: externalId },\n }\n );\n return count === 0;\n }\n\n private async generateUniqueExternalId(manager: EntityManager, resolvedPrefix: string, codeLength: number, fieldName: string, entityName: string): Promise<string> {\n const maxAttempts = 10;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n\n const newId = this.generateRandomCode(codeLength);\n\n const fullId = resolvedPrefix ? `${resolvedPrefix}-${newId}` : newId;\n\n const isUnique = await this.isExternalIdUnique(manager, fullId, fieldName, entityName);\n\n if (isUnique) {\n return newId;\n }\n }\n\n throw new Error('Failed to generate a unique external ID after multiple attempts');\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"mssql-datasource-introspection-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/datasource-introspection/mssql-datasource-introspection-provider.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACH,6BAA6B,EAC7B,+BAA+B,EAC/B,+BAA+B,EAClC,MAAM,4DAA4D,CAAC;AAEpE,qBACa,2CAA4C,YAAW,+BAA+B;IAC/F,QAAQ,CAAC,IAAI,WAAW;IAExB,QAAQ,CAAC,IAAI,EAAE,MAAM;IAIf,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAiB9E,WAAW,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,6BAA6B,EAAE,CAAC;IAwC7E,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAuGhH,OAAO,CAAC,cAAc;CAQzB"}
1
+ {"version":3,"file":"mssql-datasource-introspection-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/datasource-introspection/mssql-datasource-introspection-provider.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACH,6BAA6B,EAC7B,+BAA+B,EAC/B,+BAA+B,EAClC,MAAM,4DAA4D,CAAC;AAEpE,qBACa,2CAA4C,YAAW,+BAA+B;IAC/F,QAAQ,CAAC,IAAI,WAAW;IAExB,QAAQ,CAAC,IAAI,EAAE,MAAM;IAIf,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAiB9E,WAAW,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,6BAA6B,EAAE,CAAC;IAoD7E,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAuGhH,OAAO,CAAC,cAAc;CAQzB"}
@@ -38,6 +38,7 @@ let MssqlDatasourceIntrospectionProviderService = class MssqlDatasourceIntrospec
38
38
  c.name AS columnName,
39
39
  ty.name AS dataType,
40
40
  c.is_identity AS isAutoGenerated,
41
+ CASE WHEN pk.column_id IS NOT NULL THEN 1 ELSE 0 END AS isPrimaryKey,
41
42
  CASE WHEN c.is_nullable = 1 THEN 'YES' ELSE 'NO' END AS isNullable,
42
43
  dc.definition AS defaultValue,
43
44
  CASE
@@ -51,6 +52,16 @@ let MssqlDatasourceIntrospectionProviderService = class MssqlDatasourceIntrospec
51
52
  INNER JOIN sys.columns c ON c.object_id = t.object_id
52
53
  INNER JOIN sys.types ty ON ty.user_type_id = c.user_type_id
53
54
  LEFT JOIN sys.default_constraints dc ON dc.object_id = c.default_object_id
55
+ LEFT JOIN (
56
+ SELECT ic.object_id, ic.column_id
57
+ FROM sys.index_columns ic
58
+ INNER JOIN sys.key_constraints kc
59
+ ON kc.parent_object_id = ic.object_id
60
+ AND kc.unique_index_id = ic.index_id
61
+ WHERE kc.type = 'PK'
62
+ ) pk
63
+ ON pk.object_id = c.object_id
64
+ AND pk.column_id = c.column_id
54
65
  WHERE schema_name(t.schema_id) NOT IN ('sys', 'INFORMATION_SCHEMA')
55
66
  ORDER BY schema_name(t.schema_id), t.name, c.column_id
56
67
  `);
@@ -60,6 +71,7 @@ let MssqlDatasourceIntrospectionProviderService = class MssqlDatasourceIntrospec
60
71
  columnName: row.columnName,
61
72
  dataType: row.dataType,
62
73
  isAutoGenerated: Boolean(row.isAutoGenerated),
74
+ isPrimaryKey: Boolean(row.isPrimaryKey),
63
75
  isNullable: String(row.isNullable).toUpperCase() === "YES",
64
76
  defaultValue: row.defaultValue ?? null,
65
77
  characterMaximumLength: this.toNumberOrNull(row.characterMaximumLength),
@@ -1 +1 @@
1
- {"version":3,"file":"mssql-datasource-introspection-provider.service.js","sourceRoot":"","sources":["../../../src/services/datasource-introspection/mssql-datasource-introspection-provider.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AASrC,IAAM,2CAA2C,GAAjD,MAAM,2CAA2C;IAAjD;QACM,SAAI,GAAG,OAAO,CAAC;IA8K5B,CAAC;IA5KG,QAAQ,CAAC,IAAY;QACjB,OAAO,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAsB;QACnC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC;;;;;;;;SAQnC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAC3B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS;SAC3B,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAsB;QACpC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;SAsBnC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAC3B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;YAC7C,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK;YAC1D,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,IAAI;YACtC,sBAAsB,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,sBAAsB,CAAC;YACvE,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAC3D,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC;YACnD,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC;SAC5D,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAAsB,EAAE,KAAsC;QACnF,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAC/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA8FC,EACD,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,CACvC,CAAC;QAEF,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC;IAClC,CAAC;IAEO,cAAc,CAAC,KAAc;QACjC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACnD,CAAC;CACJ,CAAA;AA/KY,kGAA2C;sDAA3C,2CAA2C;IADvD,IAAA,mBAAU,GAAE;GACA,2CAA2C,CA+KvD","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { DataSource } from \"typeorm\";\nimport {\n DatasourceIntrospectionColumn,\n DatasourceIntrospectionProvider,\n DatasourceIntrospectionTableRef,\n} from \"src/interfaces/datasource-introspection-provider.interface\";\n\n@Injectable()\nexport class MssqlDatasourceIntrospectionProviderService implements DatasourceIntrospectionProvider {\n readonly type = \"mssql\";\n\n supports(type: string) {\n return type?.toLowerCase() === this.type;\n }\n\n async listTables(dataSource: DataSource): Promise<DatasourceIntrospectionTableRef[]> {\n const rows = await dataSource.query(`\n SELECT\n TABLE_SCHEMA AS tableSchema,\n TABLE_NAME AS tableName\n FROM INFORMATION_SCHEMA.TABLES\n WHERE TABLE_TYPE = 'BASE TABLE'\n AND TABLE_SCHEMA NOT IN ('sys', 'INFORMATION_SCHEMA')\n ORDER BY TABLE_SCHEMA, TABLE_NAME\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n }));\n }\n\n async listColumns(dataSource: DataSource): Promise<DatasourceIntrospectionColumn[]> {\n const rows = await dataSource.query(`\n SELECT\n schema_name(t.schema_id) AS tableSchema,\n t.name AS tableName,\n c.name AS columnName,\n ty.name AS dataType,\n c.is_identity AS isAutoGenerated,\n CASE WHEN c.is_nullable = 1 THEN 'YES' ELSE 'NO' END AS isNullable,\n dc.definition AS defaultValue,\n CASE\n WHEN ty.name IN ('nchar', 'nvarchar') AND c.max_length > 0 THEN c.max_length / 2\n ELSE c.max_length\n END AS characterMaximumLength,\n c.precision AS numericPrecision,\n c.scale AS numericScale,\n c.column_id AS ordinalPosition\n FROM sys.tables t\n INNER JOIN sys.columns c ON c.object_id = t.object_id\n INNER JOIN sys.types ty ON ty.user_type_id = c.user_type_id\n LEFT JOIN sys.default_constraints dc ON dc.object_id = c.default_object_id\n WHERE schema_name(t.schema_id) NOT IN ('sys', 'INFORMATION_SCHEMA')\n ORDER BY schema_name(t.schema_id), t.name, c.column_id\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n columnName: row.columnName,\n dataType: row.dataType,\n isAutoGenerated: Boolean(row.isAutoGenerated),\n isNullable: String(row.isNullable).toUpperCase() === \"YES\",\n defaultValue: row.defaultValue ?? null,\n characterMaximumLength: this.toNumberOrNull(row.characterMaximumLength),\n numericPrecision: this.toNumberOrNull(row.numericPrecision),\n numericScale: this.toNumberOrNull(row.numericScale),\n ordinalPosition: this.toNumberOrNull(row.ordinalPosition),\n }));\n }\n\n async getTableDefinition(dataSource: DataSource, table: DatasourceIntrospectionTableRef): Promise<string | null> {\n const rows = await dataSource.query(\n `\n DECLARE @schemaName NVARCHAR(128) = @0;\n DECLARE @tableName NVARCHAR(128) = @1;\n\n WITH target_table AS (\n SELECT t.object_id, s.name AS schema_name, t.name AS table_name\n FROM sys.tables t\n INNER JOIN sys.schemas s ON s.schema_id = t.schema_id\n WHERE t.name = @tableName\n AND (@schemaName IS NULL OR s.name = @schemaName)\n ),\n column_lines AS (\n SELECT\n c.column_id,\n ' [' + c.name + '] '\n + UPPER(ty.name)\n + CASE\n WHEN ty.name IN ('varchar', 'char', 'varbinary', 'binary') THEN\n '(' + CASE WHEN c.max_length = -1 THEN 'MAX' ELSE CAST(c.max_length AS VARCHAR(16)) END + ')'\n WHEN ty.name IN ('nvarchar', 'nchar') THEN\n '(' + CASE WHEN c.max_length = -1 THEN 'MAX' ELSE CAST(c.max_length / 2 AS VARCHAR(16)) END + ')'\n WHEN ty.name IN ('decimal', 'numeric') THEN\n '(' + CAST(c.precision AS VARCHAR(16)) + ',' + CAST(c.scale AS VARCHAR(16)) + ')'\n WHEN ty.name IN ('datetime2', 'datetimeoffset', 'time') THEN\n '(' + CAST(c.scale AS VARCHAR(16)) + ')'\n ELSE\n ''\n END\n + CASE\n WHEN ic.object_id IS NOT NULL THEN\n ' IDENTITY(' + CAST(CONVERT(BIGINT, ic.seed_value) AS VARCHAR(32)) + ',' + CAST(CONVERT(BIGINT, ic.increment_value) AS VARCHAR(32)) + ')'\n ELSE\n ''\n END\n + CASE\n WHEN dc.definition IS NOT NULL THEN ' DEFAULT ' + dc.definition\n ELSE ''\n END\n + CASE\n WHEN c.is_nullable = 1 THEN ' NULL'\n ELSE ' NOT NULL'\n END AS line\n FROM target_table tt\n INNER JOIN sys.columns c ON c.object_id = tt.object_id\n INNER JOIN sys.types ty ON ty.user_type_id = c.user_type_id\n LEFT JOIN sys.identity_columns ic\n ON ic.object_id = c.object_id\n AND ic.column_id = c.column_id\n LEFT JOIN sys.default_constraints dc ON dc.object_id = c.default_object_id\n ),\n constraint_lines AS (\n SELECT\n kc.name AS constraint_name,\n ' CONSTRAINT [' + kc.name + '] PRIMARY KEY ('\n + STUFF((\n SELECT ', [' + c.name + ']'\n FROM sys.index_columns ic\n INNER JOIN sys.columns c\n ON c.object_id = ic.object_id\n AND c.column_id = ic.column_id\n WHERE ic.object_id = kc.parent_object_id\n AND ic.index_id = kc.unique_index_id\n ORDER BY ic.key_ordinal\n FOR XML PATH(''), TYPE\n ).value('.', 'NVARCHAR(MAX)'), 1, 2, '')\n + ')' AS line\n FROM target_table tt\n INNER JOIN sys.key_constraints kc ON kc.parent_object_id = tt.object_id\n WHERE kc.type = 'PK'\n )\n SELECT\n 'CREATE TABLE [' + tt.schema_name + '].[' + tt.table_name + '] (' + CHAR(10)\n + ISNULL((\n SELECT STUFF((\n SELECT ',' + CHAR(10) + cl.line\n FROM column_lines cl\n ORDER BY cl.column_id\n FOR XML PATH(''), TYPE\n ).value('.', 'NVARCHAR(MAX)'), 1, 2, '')\n ), '')\n + ISNULL((\n SELECT CASE\n WHEN EXISTS (SELECT 1 FROM constraint_lines)\n THEN ',' + CHAR(10) + STUFF((\n SELECT ',' + CHAR(10) + cn.line\n FROM constraint_lines cn\n ORDER BY cn.constraint_name\n FOR XML PATH(''), TYPE\n ).value('.', 'NVARCHAR(MAX)'), 1, 2, '')\n ELSE ''\n END\n ), '')\n + CHAR(10) + ');' AS ddl\n FROM target_table tt\n `,\n [table.tableSchema, table.tableName],\n );\n\n return rows?.[0]?.ddl ?? null;\n }\n\n private toNumberOrNull(value: unknown) {\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n}\n"]}
1
+ {"version":3,"file":"mssql-datasource-introspection-provider.service.js","sourceRoot":"","sources":["../../../src/services/datasource-introspection/mssql-datasource-introspection-provider.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AASrC,IAAM,2CAA2C,GAAjD,MAAM,2CAA2C;IAAjD;QACM,SAAI,GAAG,OAAO,CAAC;IA0L5B,CAAC;IAxLG,QAAQ,CAAC,IAAY;QACjB,OAAO,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAsB;QACnC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC;;;;;;;;SAQnC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAC3B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS;SAC3B,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAsB;QACpC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAiCnC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAC3B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;YAC7C,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;YACvC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK;YAC1D,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,IAAI;YACtC,sBAAsB,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,sBAAsB,CAAC;YACvE,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAC3D,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC;YACnD,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC;SAC5D,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAAsB,EAAE,KAAsC;QACnF,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAC/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA8FC,EACD,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,CACvC,CAAC;QAEF,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC;IAClC,CAAC;IAEO,cAAc,CAAC,KAAc;QACjC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACnD,CAAC;CACJ,CAAA;AA3LY,kGAA2C;sDAA3C,2CAA2C;IADvD,IAAA,mBAAU,GAAE;GACA,2CAA2C,CA2LvD","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { DataSource } from \"typeorm\";\nimport {\n DatasourceIntrospectionColumn,\n DatasourceIntrospectionProvider,\n DatasourceIntrospectionTableRef,\n} from \"src/interfaces/datasource-introspection-provider.interface\";\n\n@Injectable()\nexport class MssqlDatasourceIntrospectionProviderService implements DatasourceIntrospectionProvider {\n readonly type = \"mssql\";\n\n supports(type: string) {\n return type?.toLowerCase() === this.type;\n }\n\n async listTables(dataSource: DataSource): Promise<DatasourceIntrospectionTableRef[]> {\n const rows = await dataSource.query(`\n SELECT\n TABLE_SCHEMA AS tableSchema,\n TABLE_NAME AS tableName\n FROM INFORMATION_SCHEMA.TABLES\n WHERE TABLE_TYPE = 'BASE TABLE'\n AND TABLE_SCHEMA NOT IN ('sys', 'INFORMATION_SCHEMA')\n ORDER BY TABLE_SCHEMA, TABLE_NAME\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n }));\n }\n\n async listColumns(dataSource: DataSource): Promise<DatasourceIntrospectionColumn[]> {\n const rows = await dataSource.query(`\n SELECT\n schema_name(t.schema_id) AS tableSchema,\n t.name AS tableName,\n c.name AS columnName,\n ty.name AS dataType,\n c.is_identity AS isAutoGenerated,\n CASE WHEN pk.column_id IS NOT NULL THEN 1 ELSE 0 END AS isPrimaryKey,\n CASE WHEN c.is_nullable = 1 THEN 'YES' ELSE 'NO' END AS isNullable,\n dc.definition AS defaultValue,\n CASE\n WHEN ty.name IN ('nchar', 'nvarchar') AND c.max_length > 0 THEN c.max_length / 2\n ELSE c.max_length\n END AS characterMaximumLength,\n c.precision AS numericPrecision,\n c.scale AS numericScale,\n c.column_id AS ordinalPosition\n FROM sys.tables t\n INNER JOIN sys.columns c ON c.object_id = t.object_id\n INNER JOIN sys.types ty ON ty.user_type_id = c.user_type_id\n LEFT JOIN sys.default_constraints dc ON dc.object_id = c.default_object_id\n LEFT JOIN (\n SELECT ic.object_id, ic.column_id\n FROM sys.index_columns ic\n INNER JOIN sys.key_constraints kc\n ON kc.parent_object_id = ic.object_id\n AND kc.unique_index_id = ic.index_id\n WHERE kc.type = 'PK'\n ) pk\n ON pk.object_id = c.object_id\n AND pk.column_id = c.column_id\n WHERE schema_name(t.schema_id) NOT IN ('sys', 'INFORMATION_SCHEMA')\n ORDER BY schema_name(t.schema_id), t.name, c.column_id\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n columnName: row.columnName,\n dataType: row.dataType,\n isAutoGenerated: Boolean(row.isAutoGenerated),\n isPrimaryKey: Boolean(row.isPrimaryKey),\n isNullable: String(row.isNullable).toUpperCase() === \"YES\",\n defaultValue: row.defaultValue ?? null,\n characterMaximumLength: this.toNumberOrNull(row.characterMaximumLength),\n numericPrecision: this.toNumberOrNull(row.numericPrecision),\n numericScale: this.toNumberOrNull(row.numericScale),\n ordinalPosition: this.toNumberOrNull(row.ordinalPosition),\n }));\n }\n\n async getTableDefinition(dataSource: DataSource, table: DatasourceIntrospectionTableRef): Promise<string | null> {\n const rows = await dataSource.query(\n `\n DECLARE @schemaName NVARCHAR(128) = @0;\n DECLARE @tableName NVARCHAR(128) = @1;\n\n WITH target_table AS (\n SELECT t.object_id, s.name AS schema_name, t.name AS table_name\n FROM sys.tables t\n INNER JOIN sys.schemas s ON s.schema_id = t.schema_id\n WHERE t.name = @tableName\n AND (@schemaName IS NULL OR s.name = @schemaName)\n ),\n column_lines AS (\n SELECT\n c.column_id,\n ' [' + c.name + '] '\n + UPPER(ty.name)\n + CASE\n WHEN ty.name IN ('varchar', 'char', 'varbinary', 'binary') THEN\n '(' + CASE WHEN c.max_length = -1 THEN 'MAX' ELSE CAST(c.max_length AS VARCHAR(16)) END + ')'\n WHEN ty.name IN ('nvarchar', 'nchar') THEN\n '(' + CASE WHEN c.max_length = -1 THEN 'MAX' ELSE CAST(c.max_length / 2 AS VARCHAR(16)) END + ')'\n WHEN ty.name IN ('decimal', 'numeric') THEN\n '(' + CAST(c.precision AS VARCHAR(16)) + ',' + CAST(c.scale AS VARCHAR(16)) + ')'\n WHEN ty.name IN ('datetime2', 'datetimeoffset', 'time') THEN\n '(' + CAST(c.scale AS VARCHAR(16)) + ')'\n ELSE\n ''\n END\n + CASE\n WHEN ic.object_id IS NOT NULL THEN\n ' IDENTITY(' + CAST(CONVERT(BIGINT, ic.seed_value) AS VARCHAR(32)) + ',' + CAST(CONVERT(BIGINT, ic.increment_value) AS VARCHAR(32)) + ')'\n ELSE\n ''\n END\n + CASE\n WHEN dc.definition IS NOT NULL THEN ' DEFAULT ' + dc.definition\n ELSE ''\n END\n + CASE\n WHEN c.is_nullable = 1 THEN ' NULL'\n ELSE ' NOT NULL'\n END AS line\n FROM target_table tt\n INNER JOIN sys.columns c ON c.object_id = tt.object_id\n INNER JOIN sys.types ty ON ty.user_type_id = c.user_type_id\n LEFT JOIN sys.identity_columns ic\n ON ic.object_id = c.object_id\n AND ic.column_id = c.column_id\n LEFT JOIN sys.default_constraints dc ON dc.object_id = c.default_object_id\n ),\n constraint_lines AS (\n SELECT\n kc.name AS constraint_name,\n ' CONSTRAINT [' + kc.name + '] PRIMARY KEY ('\n + STUFF((\n SELECT ', [' + c.name + ']'\n FROM sys.index_columns ic\n INNER JOIN sys.columns c\n ON c.object_id = ic.object_id\n AND c.column_id = ic.column_id\n WHERE ic.object_id = kc.parent_object_id\n AND ic.index_id = kc.unique_index_id\n ORDER BY ic.key_ordinal\n FOR XML PATH(''), TYPE\n ).value('.', 'NVARCHAR(MAX)'), 1, 2, '')\n + ')' AS line\n FROM target_table tt\n INNER JOIN sys.key_constraints kc ON kc.parent_object_id = tt.object_id\n WHERE kc.type = 'PK'\n )\n SELECT\n 'CREATE TABLE [' + tt.schema_name + '].[' + tt.table_name + '] (' + CHAR(10)\n + ISNULL((\n SELECT STUFF((\n SELECT ',' + CHAR(10) + cl.line\n FROM column_lines cl\n ORDER BY cl.column_id\n FOR XML PATH(''), TYPE\n ).value('.', 'NVARCHAR(MAX)'), 1, 2, '')\n ), '')\n + ISNULL((\n SELECT CASE\n WHEN EXISTS (SELECT 1 FROM constraint_lines)\n THEN ',' + CHAR(10) + STUFF((\n SELECT ',' + CHAR(10) + cn.line\n FROM constraint_lines cn\n ORDER BY cn.constraint_name\n FOR XML PATH(''), TYPE\n ).value('.', 'NVARCHAR(MAX)'), 1, 2, '')\n ELSE ''\n END\n ), '')\n + CHAR(10) + ');' AS ddl\n FROM target_table tt\n `,\n [table.tableSchema, table.tableName],\n );\n\n return rows?.[0]?.ddl ?? null;\n }\n\n private toNumberOrNull(value: unknown) {\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"mysql-datasource-introspection-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/datasource-introspection/mysql-datasource-introspection-provider.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACH,6BAA6B,EAC7B,+BAA+B,EAC/B,+BAA+B,EAClC,MAAM,4DAA4D,CAAC;AAEpE,qBACa,2CAA4C,YAAW,+BAA+B;IAC/F,QAAQ,CAAC,IAAI,WAAW;IAExB,QAAQ,CAAC,IAAI,EAAE,MAAM;IAIf,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAiB9E,WAAW,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,6BAA6B,EAAE,CAAC;IAkC7E,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAmBhH,OAAO,CAAC,cAAc;CAQzB"}
1
+ {"version":3,"file":"mysql-datasource-introspection-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/datasource-introspection/mysql-datasource-introspection-provider.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACH,6BAA6B,EAC7B,+BAA+B,EAC/B,+BAA+B,EAClC,MAAM,4DAA4D,CAAC;AAEpE,qBACa,2CAA4C,YAAW,+BAA+B;IAC/F,QAAQ,CAAC,IAAI,WAAW;IAExB,QAAQ,CAAC,IAAI,EAAE,MAAM;IAIf,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAiB9E,WAAW,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,6BAA6B,EAAE,CAAC;IAoC7E,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAmBhH,OAAO,CAAC,cAAc;CAQzB"}
@@ -38,6 +38,7 @@ let MysqlDatasourceIntrospectionProviderService = class MysqlDatasourceIntrospec
38
38
  COLUMN_NAME AS columnName,
39
39
  DATA_TYPE AS dataType,
40
40
  EXTRA AS extra,
41
+ COLUMN_KEY AS columnKey,
41
42
  IS_NULLABLE AS isNullable,
42
43
  COLUMN_DEFAULT AS defaultValue,
43
44
  CHARACTER_MAXIMUM_LENGTH AS characterMaximumLength,
@@ -54,6 +55,7 @@ let MysqlDatasourceIntrospectionProviderService = class MysqlDatasourceIntrospec
54
55
  columnName: row.columnName,
55
56
  dataType: row.dataType,
56
57
  isAutoGenerated: String(row.extra ?? "").toLowerCase().includes("auto_increment"),
58
+ isPrimaryKey: String(row.columnKey ?? "").toUpperCase() === "PRI",
57
59
  isNullable: String(row.isNullable).toUpperCase() === "YES",
58
60
  defaultValue: row.defaultValue ?? null,
59
61
  characterMaximumLength: this.toNumberOrNull(row.characterMaximumLength),
@@ -1 +1 @@
1
- {"version":3,"file":"mysql-datasource-introspection-provider.service.js","sourceRoot":"","sources":["../../../src/services/datasource-introspection/mysql-datasource-introspection-provider.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AASrC,IAAM,2CAA2C,GAAjD,MAAM,2CAA2C;IAAjD;QACM,SAAI,GAAG,OAAO,CAAC;IAoF5B,CAAC;IAlFG,QAAQ,CAAC,IAAY;QACjB,OAAO,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAsB;QACnC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC;;;;;;;;SAQnC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAC3B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS;SAC3B,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAsB;QACpC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;SAgBnC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAC3B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACjF,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK;YAC1D,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,IAAI;YACtC,sBAAsB,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,sBAAsB,CAAC;YACvE,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAC3D,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC;YACnD,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC;SAC5D,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAAsB,EAAE,KAAsC;QACnF,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,IAAI,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC;QACpE,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAC/B,uBAAuB,UAAU,QAAQ,KAAK,CAAC,SAAS,IAAI,CAC/D,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;QACjG,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IACzD,CAAC;IAEO,cAAc,CAAC,KAAc;QACjC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACnD,CAAC;CACJ,CAAA;AArFY,kGAA2C;sDAA3C,2CAA2C;IADvD,IAAA,mBAAU,GAAE;GACA,2CAA2C,CAqFvD","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { DataSource } from \"typeorm\";\nimport {\n DatasourceIntrospectionColumn,\n DatasourceIntrospectionProvider,\n DatasourceIntrospectionTableRef,\n} from \"src/interfaces/datasource-introspection-provider.interface\";\n\n@Injectable()\nexport class MysqlDatasourceIntrospectionProviderService implements DatasourceIntrospectionProvider {\n readonly type = \"mysql\";\n\n supports(type: string) {\n return type?.toLowerCase() === this.type;\n }\n\n async listTables(dataSource: DataSource): Promise<DatasourceIntrospectionTableRef[]> {\n const rows = await dataSource.query(`\n SELECT\n TABLE_SCHEMA AS tableSchema,\n TABLE_NAME AS tableName\n FROM INFORMATION_SCHEMA.TABLES\n WHERE TABLE_TYPE = 'BASE TABLE'\n AND TABLE_SCHEMA = DATABASE()\n ORDER BY TABLE_SCHEMA, TABLE_NAME\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n }));\n }\n\n async listColumns(dataSource: DataSource): Promise<DatasourceIntrospectionColumn[]> {\n const rows = await dataSource.query(`\n SELECT\n TABLE_SCHEMA AS tableSchema,\n TABLE_NAME AS tableName,\n COLUMN_NAME AS columnName,\n DATA_TYPE AS dataType,\n EXTRA AS extra,\n IS_NULLABLE AS isNullable,\n COLUMN_DEFAULT AS defaultValue,\n CHARACTER_MAXIMUM_LENGTH AS characterMaximumLength,\n NUMERIC_PRECISION AS numericPrecision,\n NUMERIC_SCALE AS numericScale,\n ORDINAL_POSITION AS ordinalPosition\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = DATABASE()\n ORDER BY TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n columnName: row.columnName,\n dataType: row.dataType,\n isAutoGenerated: String(row.extra ?? \"\").toLowerCase().includes(\"auto_increment\"),\n isNullable: String(row.isNullable).toUpperCase() === \"YES\",\n defaultValue: row.defaultValue ?? null,\n characterMaximumLength: this.toNumberOrNull(row.characterMaximumLength),\n numericPrecision: this.toNumberOrNull(row.numericPrecision),\n numericScale: this.toNumberOrNull(row.numericScale),\n ordinalPosition: this.toNumberOrNull(row.ordinalPosition),\n }));\n }\n\n async getTableDefinition(dataSource: DataSource, table: DatasourceIntrospectionTableRef): Promise<string | null> {\n const schemaName = table.tableSchema ?? dataSource.options.database;\n const rows = await dataSource.query(\n `SHOW CREATE TABLE \\`${schemaName}\\`.\\`${table.tableName}\\``,\n );\n\n const firstRow = rows?.[0];\n if (!firstRow || typeof firstRow !== \"object\") {\n return null;\n }\n\n const ddlKey = Object.keys(firstRow).find((key) => key.toLowerCase().startsWith(\"create table\"));\n if (!ddlKey) {\n return null;\n }\n\n return String(firstRow[ddlKey] ?? \"\").trim() || null;\n }\n\n private toNumberOrNull(value: unknown) {\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n}\n"]}
1
+ {"version":3,"file":"mysql-datasource-introspection-provider.service.js","sourceRoot":"","sources":["../../../src/services/datasource-introspection/mysql-datasource-introspection-provider.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { DataSource } from \"typeorm\";\nimport {\n DatasourceIntrospectionColumn,\n DatasourceIntrospectionProvider,\n DatasourceIntrospectionTableRef,\n} from \"src/interfaces/datasource-introspection-provider.interface\";\n\n@Injectable()\nexport class MysqlDatasourceIntrospectionProviderService implements DatasourceIntrospectionProvider {\n readonly type = \"mysql\";\n\n supports(type: string) {\n return type?.toLowerCase() === this.type;\n }\n\n async listTables(dataSource: DataSource): Promise<DatasourceIntrospectionTableRef[]> {\n const rows = await dataSource.query(`\n SELECT\n TABLE_SCHEMA AS tableSchema,\n TABLE_NAME AS tableName\n FROM INFORMATION_SCHEMA.TABLES\n WHERE TABLE_TYPE = 'BASE TABLE'\n AND TABLE_SCHEMA = DATABASE()\n ORDER BY TABLE_SCHEMA, TABLE_NAME\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n }));\n }\n\n async listColumns(dataSource: DataSource): Promise<DatasourceIntrospectionColumn[]> {\n const rows = await dataSource.query(`\n SELECT\n TABLE_SCHEMA AS tableSchema,\n TABLE_NAME AS tableName,\n COLUMN_NAME AS columnName,\n DATA_TYPE AS dataType,\n EXTRA AS extra,\n COLUMN_KEY AS columnKey,\n IS_NULLABLE AS isNullable,\n COLUMN_DEFAULT AS defaultValue,\n CHARACTER_MAXIMUM_LENGTH AS characterMaximumLength,\n NUMERIC_PRECISION AS numericPrecision,\n NUMERIC_SCALE AS numericScale,\n ORDINAL_POSITION AS ordinalPosition\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = DATABASE()\n ORDER BY TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n columnName: row.columnName,\n dataType: row.dataType,\n isAutoGenerated: String(row.extra ?? \"\").toLowerCase().includes(\"auto_increment\"),\n isPrimaryKey: String(row.columnKey ?? \"\").toUpperCase() === \"PRI\",\n isNullable: String(row.isNullable).toUpperCase() === \"YES\",\n defaultValue: row.defaultValue ?? null,\n characterMaximumLength: this.toNumberOrNull(row.characterMaximumLength),\n numericPrecision: this.toNumberOrNull(row.numericPrecision),\n numericScale: this.toNumberOrNull(row.numericScale),\n ordinalPosition: this.toNumberOrNull(row.ordinalPosition),\n }));\n }\n\n async getTableDefinition(dataSource: DataSource, table: DatasourceIntrospectionTableRef): Promise<string | null> {\n const schemaName = table.tableSchema ?? dataSource.options.database;\n const rows = await dataSource.query(\n `SHOW CREATE TABLE \\`${schemaName}\\`.\\`${table.tableName}\\``,\n );\n\n const firstRow = rows?.[0];\n if (!firstRow || typeof firstRow !== \"object\") {\n return null;\n }\n\n const ddlKey = Object.keys(firstRow).find((key) => key.toLowerCase().startsWith(\"create table\"));\n if (!ddlKey) {\n return null;\n }\n\n return String(firstRow[ddlKey] ?? \"\").trim() || null;\n }\n\n private toNumberOrNull(value: unknown) {\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-datasource-introspection-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/datasource-introspection/postgres-datasource-introspection-provider.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACH,6BAA6B,EAC7B,+BAA+B,EAC/B,+BAA+B,EAClC,MAAM,4DAA4D,CAAC;AAEpE,qBACa,8CAA+C,YAAW,+BAA+B;IAClG,QAAQ,CAAC,IAAI,cAAc;IAE3B,QAAQ,CAAC,IAAI,EAAE,MAAM;IAIf,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAiB9E,WAAW,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,6BAA6B,EAAE,CAAC;IAsC7E,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgFhH,OAAO,CAAC,cAAc;CAQzB"}
1
+ {"version":3,"file":"postgres-datasource-introspection-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/datasource-introspection/postgres-datasource-introspection-provider.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACH,6BAA6B,EAC7B,+BAA+B,EAC/B,+BAA+B,EAClC,MAAM,4DAA4D,CAAC;AAEpE,qBACa,8CAA+C,YAAW,+BAA+B;IAClG,QAAQ,CAAC,IAAI,cAAc;IAE3B,QAAQ,CAAC,IAAI,EAAE,MAAM;IAIf,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAiB9E,WAAW,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,6BAA6B,EAAE,CAAC;IAmD7E,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgFhH,OAAO,CAAC,cAAc;CAQzB"}
@@ -33,24 +33,36 @@ let PostgresDatasourceIntrospectionProviderService = class PostgresDatasourceInt
33
33
  async listColumns(dataSource) {
34
34
  const rows = await dataSource.query(`
35
35
  SELECT
36
- TABLE_SCHEMA AS "tableSchema",
37
- TABLE_NAME AS "tableName",
38
- COLUMN_NAME AS "columnName",
39
- DATA_TYPE AS "dataType",
36
+ c.TABLE_SCHEMA AS "tableSchema",
37
+ c.TABLE_NAME AS "tableName",
38
+ c.COLUMN_NAME AS "columnName",
39
+ c.DATA_TYPE AS "dataType",
40
40
  CASE
41
- WHEN is_identity = 'YES' THEN true
42
- WHEN COLUMN_DEFAULT LIKE 'nextval(%' THEN true
41
+ WHEN c.is_identity = 'YES' THEN true
42
+ WHEN c.COLUMN_DEFAULT LIKE 'nextval(%' THEN true
43
43
  ELSE false
44
44
  END AS "isAutoGenerated",
45
- IS_NULLABLE AS "isNullable",
46
- COLUMN_DEFAULT AS "defaultValue",
47
- CHARACTER_MAXIMUM_LENGTH AS "characterMaximumLength",
48
- NUMERIC_PRECISION AS "numericPrecision",
49
- NUMERIC_SCALE AS "numericScale",
50
- ORDINAL_POSITION AS "ordinalPosition"
51
- FROM INFORMATION_SCHEMA.COLUMNS
52
- WHERE TABLE_SCHEMA NOT IN ('pg_catalog', 'information_schema')
53
- ORDER BY TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION
45
+ EXISTS (
46
+ SELECT 1
47
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
48
+ INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
49
+ ON kcu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
50
+ AND kcu.TABLE_SCHEMA = tc.TABLE_SCHEMA
51
+ AND kcu.TABLE_NAME = tc.TABLE_NAME
52
+ WHERE tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
53
+ AND tc.TABLE_SCHEMA = c.TABLE_SCHEMA
54
+ AND tc.TABLE_NAME = c.TABLE_NAME
55
+ AND kcu.COLUMN_NAME = c.COLUMN_NAME
56
+ ) AS "isPrimaryKey",
57
+ c.IS_NULLABLE AS "isNullable",
58
+ c.COLUMN_DEFAULT AS "defaultValue",
59
+ c.CHARACTER_MAXIMUM_LENGTH AS "characterMaximumLength",
60
+ c.NUMERIC_PRECISION AS "numericPrecision",
61
+ c.NUMERIC_SCALE AS "numericScale",
62
+ c.ORDINAL_POSITION AS "ordinalPosition"
63
+ FROM INFORMATION_SCHEMA.COLUMNS c
64
+ WHERE c.TABLE_SCHEMA NOT IN ('pg_catalog', 'information_schema')
65
+ ORDER BY c.TABLE_SCHEMA, c.TABLE_NAME, c.ORDINAL_POSITION
54
66
  `);
55
67
  return rows.map((row) => ({
56
68
  tableSchema: row.tableSchema ?? null,
@@ -58,6 +70,7 @@ let PostgresDatasourceIntrospectionProviderService = class PostgresDatasourceInt
58
70
  columnName: row.columnName,
59
71
  dataType: row.dataType,
60
72
  isAutoGenerated: Boolean(row.isAutoGenerated),
73
+ isPrimaryKey: Boolean(row.isPrimaryKey),
61
74
  isNullable: String(row.isNullable).toUpperCase() === "YES",
62
75
  defaultValue: row.defaultValue ?? null,
63
76
  characterMaximumLength: this.toNumberOrNull(row.characterMaximumLength),
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-datasource-introspection-provider.service.js","sourceRoot":"","sources":["../../../src/services/datasource-introspection/postgres-datasource-introspection-provider.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AASrC,IAAM,8CAA8C,GAApD,MAAM,8CAA8C;IAApD;QACM,SAAI,GAAG,UAAU,CAAC;IAqJ/B,CAAC;IAnJG,QAAQ,CAAC,IAAY;QACjB,OAAO,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAsB;QACnC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC;;;;;;;;SAQnC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAC3B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS;SAC3B,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAsB;QACpC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;SAoBnC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAC3B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;YAC7C,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK;YAC1D,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,IAAI;YACtC,sBAAsB,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,sBAAsB,CAAC;YACvE,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAC3D,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC;YACnD,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC;SAC5D,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAAsB,EAAE,KAAsC;QACnF,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAC/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAuEC,EACD,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,CACvC,CAAC;QAEF,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC;IAClC,CAAC;IAEO,cAAc,CAAC,KAAc;QACjC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACnD,CAAC;CACJ,CAAA;AAtJY,wGAA8C;yDAA9C,8CAA8C;IAD1D,IAAA,mBAAU,GAAE;GACA,8CAA8C,CAsJ1D","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { DataSource } from \"typeorm\";\nimport {\n DatasourceIntrospectionColumn,\n DatasourceIntrospectionProvider,\n DatasourceIntrospectionTableRef,\n} from \"src/interfaces/datasource-introspection-provider.interface\";\n\n@Injectable()\nexport class PostgresDatasourceIntrospectionProviderService implements DatasourceIntrospectionProvider {\n readonly type = \"postgres\";\n\n supports(type: string) {\n return type?.toLowerCase() === this.type;\n }\n\n async listTables(dataSource: DataSource): Promise<DatasourceIntrospectionTableRef[]> {\n const rows = await dataSource.query(`\n SELECT\n TABLE_SCHEMA AS \"tableSchema\",\n TABLE_NAME AS \"tableName\"\n FROM INFORMATION_SCHEMA.TABLES\n WHERE TABLE_TYPE = 'BASE TABLE'\n AND TABLE_SCHEMA NOT IN ('pg_catalog', 'information_schema')\n ORDER BY TABLE_SCHEMA, TABLE_NAME\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n }));\n }\n\n async listColumns(dataSource: DataSource): Promise<DatasourceIntrospectionColumn[]> {\n const rows = await dataSource.query(`\n SELECT\n TABLE_SCHEMA AS \"tableSchema\",\n TABLE_NAME AS \"tableName\",\n COLUMN_NAME AS \"columnName\",\n DATA_TYPE AS \"dataType\",\n CASE\n WHEN is_identity = 'YES' THEN true\n WHEN COLUMN_DEFAULT LIKE 'nextval(%' THEN true\n ELSE false\n END AS \"isAutoGenerated\",\n IS_NULLABLE AS \"isNullable\",\n COLUMN_DEFAULT AS \"defaultValue\",\n CHARACTER_MAXIMUM_LENGTH AS \"characterMaximumLength\",\n NUMERIC_PRECISION AS \"numericPrecision\",\n NUMERIC_SCALE AS \"numericScale\",\n ORDINAL_POSITION AS \"ordinalPosition\"\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA NOT IN ('pg_catalog', 'information_schema')\n ORDER BY TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n columnName: row.columnName,\n dataType: row.dataType,\n isAutoGenerated: Boolean(row.isAutoGenerated),\n isNullable: String(row.isNullable).toUpperCase() === \"YES\",\n defaultValue: row.defaultValue ?? null,\n characterMaximumLength: this.toNumberOrNull(row.characterMaximumLength),\n numericPrecision: this.toNumberOrNull(row.numericPrecision),\n numericScale: this.toNumberOrNull(row.numericScale),\n ordinalPosition: this.toNumberOrNull(row.ordinalPosition),\n }));\n }\n\n async getTableDefinition(dataSource: DataSource, table: DatasourceIntrospectionTableRef): Promise<string | null> {\n const rows = await dataSource.query(\n `\n WITH target_table AS (\n SELECT c.oid, n.nspname AS schema_name, c.relname AS table_name\n FROM pg_class c\n INNER JOIN pg_namespace n ON n.oid = c.relnamespace\n WHERE c.relkind = 'r'\n AND c.relname = $1\n AND ($2::text IS NULL OR n.nspname = $2)\n LIMIT 1\n ),\n column_lines AS (\n SELECT\n a.attnum,\n format(\n ' %I %s%s%s%s',\n a.attname,\n format_type(a.atttypid, a.atttypmod),\n CASE\n WHEN a.attidentity = 'a' THEN ' GENERATED ALWAYS AS IDENTITY'\n WHEN a.attidentity = 'd' THEN ' GENERATED BY DEFAULT AS IDENTITY'\n ELSE ''\n END,\n CASE\n WHEN ad.adbin IS NOT NULL THEN ' DEFAULT ' || pg_get_expr(ad.adbin, ad.adrelid)\n ELSE ''\n END,\n CASE\n WHEN a.attnotnull THEN ' NOT NULL'\n ELSE ''\n END\n ) AS line\n FROM target_table tt\n INNER JOIN pg_attribute a ON a.attrelid = tt.oid\n LEFT JOIN pg_attrdef ad\n ON ad.adrelid = a.attrelid\n AND ad.adnum = a.attnum\n WHERE a.attnum > 0\n AND NOT a.attisdropped\n ),\n constraint_lines AS (\n SELECT\n c.conname,\n format(' CONSTRAINT %I %s', c.conname, pg_get_constraintdef(c.oid, true)) AS line\n FROM target_table tt\n INNER JOIN pg_constraint c ON c.conrelid = tt.oid\n WHERE c.contype IN ('p', 'u', 'f', 'c')\n )\n SELECT format(\n 'CREATE TABLE %I.%I (\\n%s%s\\n);',\n tt.schema_name,\n tt.table_name,\n COALESCE(\n (\n SELECT string_agg(line, ',\\n' ORDER BY attnum)\n FROM column_lines\n ),\n ''\n ),\n COALESCE(\n (\n SELECT CASE\n WHEN EXISTS (SELECT 1 FROM constraint_lines)\n THEN ',\\n' || string_agg(line, ',\\n' ORDER BY conname)\n ELSE ''\n END\n FROM constraint_lines\n ),\n ''\n )\n ) AS ddl\n FROM target_table tt\n `,\n [table.tableName, table.tableSchema],\n );\n\n return rows?.[0]?.ddl ?? null;\n }\n\n private toNumberOrNull(value: unknown) {\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n}\n"]}
1
+ {"version":3,"file":"postgres-datasource-introspection-provider.service.js","sourceRoot":"","sources":["../../../src/services/datasource-introspection/postgres-datasource-introspection-provider.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AASrC,IAAM,8CAA8C,GAApD,MAAM,8CAA8C;IAApD;QACM,SAAI,GAAG,UAAU,CAAC;IAkK/B,CAAC;IAhKG,QAAQ,CAAC,IAAY;QACjB,OAAO,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAsB;QACnC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC;;;;;;;;SAQnC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAC3B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS;SAC3B,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAsB;QACpC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAgCnC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAC3B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;YAC7C,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;YACvC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK;YAC1D,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,IAAI;YACtC,sBAAsB,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,sBAAsB,CAAC;YACvE,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAC3D,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC;YACnD,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC;SAC5D,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAAsB,EAAE,KAAsC;QACnF,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAC/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAuEC,EACD,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,CACvC,CAAC;QAEF,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC;IAClC,CAAC;IAEO,cAAc,CAAC,KAAc;QACjC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACnD,CAAC;CACJ,CAAA;AAnKY,wGAA8C;yDAA9C,8CAA8C;IAD1D,IAAA,mBAAU,GAAE;GACA,8CAA8C,CAmK1D","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { DataSource } from \"typeorm\";\nimport {\n DatasourceIntrospectionColumn,\n DatasourceIntrospectionProvider,\n DatasourceIntrospectionTableRef,\n} from \"src/interfaces/datasource-introspection-provider.interface\";\n\n@Injectable()\nexport class PostgresDatasourceIntrospectionProviderService implements DatasourceIntrospectionProvider {\n readonly type = \"postgres\";\n\n supports(type: string) {\n return type?.toLowerCase() === this.type;\n }\n\n async listTables(dataSource: DataSource): Promise<DatasourceIntrospectionTableRef[]> {\n const rows = await dataSource.query(`\n SELECT\n TABLE_SCHEMA AS \"tableSchema\",\n TABLE_NAME AS \"tableName\"\n FROM INFORMATION_SCHEMA.TABLES\n WHERE TABLE_TYPE = 'BASE TABLE'\n AND TABLE_SCHEMA NOT IN ('pg_catalog', 'information_schema')\n ORDER BY TABLE_SCHEMA, TABLE_NAME\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n }));\n }\n\n async listColumns(dataSource: DataSource): Promise<DatasourceIntrospectionColumn[]> {\n const rows = await dataSource.query(`\n SELECT\n c.TABLE_SCHEMA AS \"tableSchema\",\n c.TABLE_NAME AS \"tableName\",\n c.COLUMN_NAME AS \"columnName\",\n c.DATA_TYPE AS \"dataType\",\n CASE\n WHEN c.is_identity = 'YES' THEN true\n WHEN c.COLUMN_DEFAULT LIKE 'nextval(%' THEN true\n ELSE false\n END AS \"isAutoGenerated\",\n EXISTS (\n SELECT 1\n FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc\n INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu\n ON kcu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME\n AND kcu.TABLE_SCHEMA = tc.TABLE_SCHEMA\n AND kcu.TABLE_NAME = tc.TABLE_NAME\n WHERE tc.CONSTRAINT_TYPE = 'PRIMARY KEY'\n AND tc.TABLE_SCHEMA = c.TABLE_SCHEMA\n AND tc.TABLE_NAME = c.TABLE_NAME\n AND kcu.COLUMN_NAME = c.COLUMN_NAME\n ) AS \"isPrimaryKey\",\n c.IS_NULLABLE AS \"isNullable\",\n c.COLUMN_DEFAULT AS \"defaultValue\",\n c.CHARACTER_MAXIMUM_LENGTH AS \"characterMaximumLength\",\n c.NUMERIC_PRECISION AS \"numericPrecision\",\n c.NUMERIC_SCALE AS \"numericScale\",\n c.ORDINAL_POSITION AS \"ordinalPosition\"\n FROM INFORMATION_SCHEMA.COLUMNS c\n WHERE c.TABLE_SCHEMA NOT IN ('pg_catalog', 'information_schema')\n ORDER BY c.TABLE_SCHEMA, c.TABLE_NAME, c.ORDINAL_POSITION\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n columnName: row.columnName,\n dataType: row.dataType,\n isAutoGenerated: Boolean(row.isAutoGenerated),\n isPrimaryKey: Boolean(row.isPrimaryKey),\n isNullable: String(row.isNullable).toUpperCase() === \"YES\",\n defaultValue: row.defaultValue ?? null,\n characterMaximumLength: this.toNumberOrNull(row.characterMaximumLength),\n numericPrecision: this.toNumberOrNull(row.numericPrecision),\n numericScale: this.toNumberOrNull(row.numericScale),\n ordinalPosition: this.toNumberOrNull(row.ordinalPosition),\n }));\n }\n\n async getTableDefinition(dataSource: DataSource, table: DatasourceIntrospectionTableRef): Promise<string | null> {\n const rows = await dataSource.query(\n `\n WITH target_table AS (\n SELECT c.oid, n.nspname AS schema_name, c.relname AS table_name\n FROM pg_class c\n INNER JOIN pg_namespace n ON n.oid = c.relnamespace\n WHERE c.relkind = 'r'\n AND c.relname = $1\n AND ($2::text IS NULL OR n.nspname = $2)\n LIMIT 1\n ),\n column_lines AS (\n SELECT\n a.attnum,\n format(\n ' %I %s%s%s%s',\n a.attname,\n format_type(a.atttypid, a.atttypmod),\n CASE\n WHEN a.attidentity = 'a' THEN ' GENERATED ALWAYS AS IDENTITY'\n WHEN a.attidentity = 'd' THEN ' GENERATED BY DEFAULT AS IDENTITY'\n ELSE ''\n END,\n CASE\n WHEN ad.adbin IS NOT NULL THEN ' DEFAULT ' || pg_get_expr(ad.adbin, ad.adrelid)\n ELSE ''\n END,\n CASE\n WHEN a.attnotnull THEN ' NOT NULL'\n ELSE ''\n END\n ) AS line\n FROM target_table tt\n INNER JOIN pg_attribute a ON a.attrelid = tt.oid\n LEFT JOIN pg_attrdef ad\n ON ad.adrelid = a.attrelid\n AND ad.adnum = a.attnum\n WHERE a.attnum > 0\n AND NOT a.attisdropped\n ),\n constraint_lines AS (\n SELECT\n c.conname,\n format(' CONSTRAINT %I %s', c.conname, pg_get_constraintdef(c.oid, true)) AS line\n FROM target_table tt\n INNER JOIN pg_constraint c ON c.conrelid = tt.oid\n WHERE c.contype IN ('p', 'u', 'f', 'c')\n )\n SELECT format(\n 'CREATE TABLE %I.%I (\\n%s%s\\n);',\n tt.schema_name,\n tt.table_name,\n COALESCE(\n (\n SELECT string_agg(line, ',\\n' ORDER BY attnum)\n FROM column_lines\n ),\n ''\n ),\n COALESCE(\n (\n SELECT CASE\n WHEN EXISTS (SELECT 1 FROM constraint_lines)\n THEN ',\\n' || string_agg(line, ',\\n' ORDER BY conname)\n ELSE ''\n END\n FROM constraint_lines\n ),\n ''\n )\n ) AS ddl\n FROM target_table tt\n `,\n [table.tableName, table.tableSchema],\n );\n\n return rows?.[0]?.ddl ?? null;\n }\n\n private toNumberOrNull(value: unknown) {\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n}\n"]}
@@ -6,8 +6,10 @@ import { ModelMetadataHelperService } from "../helpers/model-metadata-helper.ser
6
6
  import { ModelMetadataRepository } from "../repository/model-metadata.repository";
7
7
  import { ModuleMetadataRepository } from "../repository/module-metadata.repository";
8
8
  import { DatasourceManagementService } from "./datasource-management.service";
9
+ import { CommandService } from "../helpers/command.service";
9
10
  import { FieldMetadataService } from "./field-metadata.service";
10
11
  import { ModelMetadataService } from "./model-metadata.service";
12
+ import { ModuleMetadataService } from "./module-metadata.service";
11
13
  import { MssqlDatasourceIntrospectionProviderService } from "./datasource-introspection/mssql-datasource-introspection-provider.service";
12
14
  import { MysqlDatasourceIntrospectionProviderService } from "./datasource-introspection/mysql-datasource-introspection-provider.service";
13
15
  import { PostgresDatasourceIntrospectionProviderService } from "./datasource-introspection/postgres-datasource-introspection-provider.service";
@@ -31,6 +33,7 @@ type TableInventoryRecord = {
31
33
  type TableDetailColumnRecord = {
32
34
  columnName: string;
33
35
  fieldName: string;
36
+ displayName: string;
34
37
  dataType: string;
35
38
  solidFieldType: string;
36
39
  ormType: string;
@@ -41,6 +44,7 @@ type TableDetailColumnRecord = {
41
44
  numericScale: number | null;
42
45
  ordinalPosition: number | null;
43
46
  isAutoGenerated: boolean;
47
+ isPrimaryKey: boolean;
44
48
  handledBySuperclass: boolean;
45
49
  superclassFieldName: string | null;
46
50
  };
@@ -58,11 +62,13 @@ export declare class DatasourceIntrospectionService {
58
62
  private readonly modelMetadataHelperService;
59
63
  private readonly fieldMetadataService;
60
64
  private readonly modelMetadataService;
65
+ private readonly moduleMetadataService;
66
+ private readonly commandService;
61
67
  private readonly mssqlProvider;
62
68
  private readonly mysqlProvider;
63
69
  private readonly postgresProvider;
64
70
  private readonly supportedDatasourceTypes;
65
- constructor(moduleRef: ModuleRef, datasourceManagementService: DatasourceManagementService, moduleMetadataRepository: ModuleMetadataRepository, modelMetadataRepository: ModelMetadataRepository, moduleMetadataHelperService: ModuleMetadataHelperService, modelMetadataHelperService: ModelMetadataHelperService, fieldMetadataService: FieldMetadataService, modelMetadataService: ModelMetadataService, mssqlProvider: MssqlDatasourceIntrospectionProviderService, mysqlProvider: MysqlDatasourceIntrospectionProviderService, postgresProvider: PostgresDatasourceIntrospectionProviderService);
71
+ constructor(moduleRef: ModuleRef, datasourceManagementService: DatasourceManagementService, moduleMetadataRepository: ModuleMetadataRepository, modelMetadataRepository: ModelMetadataRepository, moduleMetadataHelperService: ModuleMetadataHelperService, modelMetadataHelperService: ModelMetadataHelperService, fieldMetadataService: FieldMetadataService, modelMetadataService: ModelMetadataService, moduleMetadataService: ModuleMetadataService, commandService: CommandService, mssqlProvider: MssqlDatasourceIntrospectionProviderService, mysqlProvider: MysqlDatasourceIntrospectionProviderService, postgresProvider: PostgresDatasourceIntrospectionProviderService);
66
72
  getBootstrap(moduleId: number): Promise<{
67
73
  data: {
68
74
  module: {
@@ -220,6 +226,18 @@ export declare class DatasourceIntrospectionService {
220
226
  filePath: string;
221
227
  model: Record<string, any>;
222
228
  };
229
+ summary: {
230
+ includedColumnNames: string[];
231
+ removedColumnNames: string[];
232
+ missingSystemColumns: string[];
233
+ generatedSystemColumnCount: number;
234
+ };
235
+ };
236
+ }>;
237
+ createMigrationArtifacts(moduleId: number, mappingDto: DatasourceIntrospectionMappingDto): Promise<{
238
+ data: {
239
+ modelId: number;
240
+ operation: "create" | "update";
223
241
  migration: {
224
242
  written: boolean;
225
243
  willGenerate: boolean;
@@ -231,6 +249,13 @@ export declare class DatasourceIntrospectionService {
231
249
  note: string;
232
250
  missingSystemColumns: string[];
233
251
  };
252
+ datasourceFile: {
253
+ filePath: string;
254
+ created: boolean;
255
+ updated: boolean;
256
+ entityRegistered: boolean;
257
+ migrationGlobRegistered: boolean;
258
+ };
234
259
  summary: {
235
260
  includedColumnNames: string[];
236
261
  removedColumnNames: string[];
@@ -239,6 +264,22 @@ export declare class DatasourceIntrospectionService {
239
264
  };
240
265
  };
241
266
  }>;
267
+ generateCode(moduleId: number): Promise<{
268
+ data: {
269
+ moduleId: number;
270
+ output: string;
271
+ message: string;
272
+ };
273
+ }>;
274
+ runMigration(moduleId: number, datasourceName: string): Promise<{
275
+ data: {
276
+ moduleId: number;
277
+ datasource: string;
278
+ output: string;
279
+ command: string;
280
+ message: string;
281
+ };
282
+ }>;
242
283
  private buildMappingPreview;
243
284
  private buildModelPayload;
244
285
  private buildModelPayloadFromReviewedModel;
@@ -255,12 +296,15 @@ export declare class DatasourceIntrospectionService {
255
296
  private getLegacySystemColumnDefinitions;
256
297
  private renderMigrationTemplate;
257
298
  private renderTableColumnLiteral;
299
+ private renderTableIndexLiteral;
258
300
  private buildMigrationObjectName;
259
301
  private toMigrationTableName;
260
302
  private buildRawDdl;
261
303
  private buildTableInventory;
262
- private buildModelMap;
304
+ private buildModelLookup;
305
+ private resolveMappedModel;
263
306
  private groupColumnsByTable;
307
+ private isSolidxInternalTableName;
264
308
  private detectLegacyTableType;
265
309
  private getSuggestedIdColumn;
266
310
  private buildUserKeyCandidates;
@@ -269,6 +313,7 @@ export declare class DatasourceIntrospectionService {
269
313
  private getLegacySuperclassFieldName;
270
314
  private isHandledBySuperclass;
271
315
  private getBaseClassName;
316
+ private getDatasourceTypeFamily;
272
317
  private toSolidFieldType;
273
318
  private toOrmFieldType;
274
319
  private toFieldName;
@@ -276,6 +321,11 @@ export declare class DatasourceIntrospectionService {
276
321
  private toPluralNameCandidate;
277
322
  private toTableKey;
278
323
  private toModelMapKey;
324
+ private syncTypeormDatasourceFile;
325
+ private renderTypeormDatasourceTemplate;
326
+ private arrayLiteralContainsValue;
327
+ private getTypeormDatasourceOptions;
328
+ private getObjectPropertyArrayLiteral;
279
329
  private buildSynchronizeBlockedMessage;
280
330
  private resolveDataSourceByName;
281
331
  private getProvider;
@@ -1 +1 @@
1
- {"version":3,"file":"datasource-introspection.service.d.ts","sourceRoot":"","sources":["../../src/services/datasource-introspection.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"datasource-introspection.service.d.ts","sourceRoot":"","sources":["../../src/services/datasource-introspection.service.ts"],"names":[],"mappings":"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"}