@restforgejs/platform 4.1.1 → 4.3.1

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 (340) hide show
  1. package/SECURITY.md +83 -4
  2. package/bin/sdf-tools.exe +0 -0
  3. package/build-info.json +2 -2
  4. package/cli/consumer-deploy.js +1 -1
  5. package/cli/consumer.js +1 -1
  6. package/generators/cli/dashboard/create.js +4 -1
  7. package/generators/cli/endpoint/create.js +43 -4
  8. package/generators/cli/key/generate.js +2 -1
  9. package/generators/cli/key/revoke.js +2 -1
  10. package/generators/cli/payload/diff.js +3 -2
  11. package/generators/cli/payload/generate.js +3 -2
  12. package/generators/cli/payload/sync.js +3 -2
  13. package/generators/cli/payload/validate.js +3 -2
  14. package/generators/cli/processor/create.js +14 -3
  15. package/generators/cli/project/delete.js +2 -1
  16. package/generators/cli/query/validate.js +3 -2
  17. package/generators/cli/schema/apply.js +526 -0
  18. package/generators/cli/schema/describe.js +3 -2
  19. package/generators/cli/schema/diff.js +322 -0
  20. package/generators/cli/schema/generate-ddl.js +7 -10
  21. package/generators/cli/schema/init.js +95 -172
  22. package/generators/cli/schema/introspect.js +3 -2
  23. package/generators/cli/schema/list.js +3 -2
  24. package/generators/cli/schema/migrate.js +13 -18
  25. package/generators/cli/schema/models.js +8 -12
  26. package/generators/cli/schema/template.js +222 -0
  27. package/generators/cli/schema/validate.js +8 -12
  28. package/generators/cli-entry.js +17 -2
  29. package/generators/lib/dbschema-kit/apply-engine.js +582 -0
  30. package/generators/lib/dbschema-kit/diff-engine.js +703 -0
  31. package/generators/lib/dbschema-kit/diff-reporter.js +272 -0
  32. package/generators/lib/dbschema-kit/emitters/alter-table.js +275 -0
  33. package/generators/lib/migration/audit-table-runner.js +213 -215
  34. package/generators/lib/payload/endpoint-schema-validator.js +171 -0
  35. package/generators/lib/payload/payload-runner.js +137 -220
  36. package/generators/lib/payload/schema-diff.js +277 -0
  37. package/generators/lib/templates/dashboard-catalog.js +1 -437
  38. package/generators/lib/templates/db-connection-env.js +1 -212
  39. package/generators/lib/templates/dbschema-catalog.js +1 -489
  40. package/generators/lib/templates/field-validation-catalog.js +1 -531
  41. package/generators/lib/templates/mysql-template.js +1 -3863
  42. package/generators/lib/templates/oracle-template.js +1 -3915
  43. package/generators/lib/templates/postgres-template.js +1 -5838
  44. package/generators/lib/templates/query-declarative-catalog.js +1 -199
  45. package/generators/lib/templates/sqlite-template.js +1 -3440
  46. package/generators/lib/utils/audit-columns.js +181 -0
  47. package/generators/lib/utils/cli-output.js +17 -0
  48. package/generators/lib/utils/database-introspector.js +16 -13
  49. package/generators/lib/utils/env-manager.js +6 -0
  50. package/generators/lib/utils/path-validator.js +71 -0
  51. package/generators/lib/validators/payload-validator.js +1 -2
  52. package/integrity-manifest.json +28 -10
  53. package/package.json +11 -3
  54. package/scripts/verify-integrity.js +1 -1
  55. package/server.js +1 -1
  56. package/src/components/handlers/adjust_handler.js +1 -1
  57. package/src/components/handlers/audit_handler.js +1 -1
  58. package/src/components/handlers/delete_handler.js +1 -1
  59. package/src/components/handlers/export_handler.js +1 -1
  60. package/src/components/handlers/import_handler.js +1 -1
  61. package/src/components/handlers/insert_handler.js +1 -1
  62. package/src/components/handlers/update_handler.js +1 -1
  63. package/src/components/handlers/upload_handler.js +1 -1
  64. package/src/components/handlers/workflow_handler.js +1 -1
  65. package/src/components/integrations/webhook.js +1 -1
  66. package/src/consumers/baseConsumer.js +1 -1
  67. package/src/consumers/declarativeMapper.js +1 -1
  68. package/src/consumers/handlers/apiHandler.js +1 -1
  69. package/src/consumers/handlers/consoleHandler.js +1 -1
  70. package/src/consumers/handlers/databaseHandler.js +1 -1
  71. package/src/consumers/handlers/index.js +1 -1
  72. package/src/consumers/handlers/kafkaHandler.js +1 -1
  73. package/src/consumers/index.js +1 -1
  74. package/src/consumers/messageTransformer.js +1 -1
  75. package/src/consumers/validator.js +1 -1
  76. package/src/core/db/dialect/base-dialect.js +1 -1
  77. package/src/core/db/dialect/index.js +1 -1
  78. package/src/core/db/dialect/mysql-dialect.js +1 -1
  79. package/src/core/db/dialect/oracle-dialect.js +1 -1
  80. package/src/core/db/dialect/postgres-dialect.js +1 -1
  81. package/src/core/db/dialect/sqlite-dialect.js +1 -1
  82. package/src/core/db/flatten-helper.js +1 -1
  83. package/src/core/db/query-builder-error.js +1 -1
  84. package/src/core/db/query-builder.js +1 -1
  85. package/src/core/db/relation-helper.js +1 -1
  86. package/src/core/handlers/delete_handler.js +1 -1
  87. package/src/core/handlers/insert_handler.js +1 -1
  88. package/src/core/handlers/update_handler.js +1 -1
  89. package/src/core/models/base-model.js +1 -1
  90. package/src/core/utils/cache-manager.js +1 -1
  91. package/src/core/utils/component-engine.js +1 -1
  92. package/src/core/utils/context-builder.js +1 -1
  93. package/src/core/utils/datetime-formatter.js +1 -1
  94. package/src/core/utils/datetime-parser.js +1 -1
  95. package/src/core/utils/db.js +1 -1
  96. package/src/core/utils/logger.js +1 -1
  97. package/src/core/utils/payload-loader.js +1 -1
  98. package/src/core/utils/security-checks.js +1 -1
  99. package/src/middleware/body-options.js +1 -1
  100. package/src/middleware/cors.js +1 -1
  101. package/src/middleware/idempotency.js +1 -1
  102. package/src/middleware/rate-limiter.js +1 -1
  103. package/src/middleware/request-logger.js +1 -1
  104. package/src/middleware/security-headers.js +1 -1
  105. package/src/models/base-model-mysql.js +1 -1
  106. package/src/models/base-model-oracle.js +1 -1
  107. package/src/models/base-model-sqlite.js +1 -1
  108. package/src/models/base-model.js +1 -1
  109. package/src/pro/caching/redis-client.js +1 -1
  110. package/src/pro/caching/redis-helper.js +1 -1
  111. package/src/pro/consumers/baseConsumer.js +1 -1
  112. package/src/pro/consumers/declarativeMapper.js +1 -1
  113. package/src/pro/consumers/handlers/apiHandler.js +1 -1
  114. package/src/pro/consumers/handlers/consoleHandler.js +1 -1
  115. package/src/pro/consumers/handlers/databaseHandler.js +1 -1
  116. package/src/pro/consumers/handlers/index.js +1 -1
  117. package/src/pro/consumers/handlers/kafkaHandler.js +1 -1
  118. package/src/pro/consumers/index.js +1 -1
  119. package/src/pro/consumers/messageTransformer.js +1 -1
  120. package/src/pro/consumers/validator.js +1 -1
  121. package/src/pro/database/base-model-mysql.js +1 -1
  122. package/src/pro/database/base-model-oracle.js +1 -1
  123. package/src/pro/database/base-model-sqlite.js +1 -1
  124. package/src/pro/database/db-mysql.js +1 -1
  125. package/src/pro/database/db-oracle.js +1 -1
  126. package/src/pro/database/db-sqlite.js +1 -1
  127. package/src/pro/excel/excel-generator.js +1 -1
  128. package/src/pro/excel/excel-parser.js +1 -1
  129. package/src/pro/excel/export-service.js +1 -1
  130. package/src/pro/excel/export_handler.js +1 -1
  131. package/src/pro/excel/import-service.js +1 -1
  132. package/src/pro/excel/import-validator.js +1 -1
  133. package/src/pro/excel/import_handler.js +1 -1
  134. package/src/pro/excel/upsert-builder.js +1 -1
  135. package/src/pro/idgen/idgen-routes.js +1 -1
  136. package/src/pro/integrations/lookup-resolver.js +1 -1
  137. package/src/pro/integrations/upload-handler-v2.js +1 -1
  138. package/src/pro/integrations/upload-handler.js +1 -1
  139. package/src/pro/integrations/webhook.js +1 -1
  140. package/src/pro/locking/lock-routes.js +1 -1
  141. package/src/pro/locking/resource-lock-manager.js +1 -1
  142. package/src/pro/messaging/kafkaConsumerService.js +1 -1
  143. package/src/pro/messaging/kafkaService.js +1 -1
  144. package/src/pro/messaging/messagehubService.js +1 -1
  145. package/src/pro/messaging/rabbitmqService.js +1 -1
  146. package/src/pro/scheduler/job-manager.js +1 -1
  147. package/src/pro/scheduler/job-routes.js +1 -1
  148. package/src/pro/scheduler/job-validator.js +1 -1
  149. package/src/pro/storage/base-storage-provider.js +1 -1
  150. package/src/pro/storage/file-metadata-helper.js +1 -1
  151. package/src/pro/storage/index.js +1 -1
  152. package/src/pro/storage/local-storage-provider.js +1 -1
  153. package/src/pro/storage/s3-storage-provider.js +1 -1
  154. package/src/pro/storage/upload-cleanup-job.js +1 -1
  155. package/src/pro/storage/upload-cleanup-scheduler.js +1 -1
  156. package/src/pro/storage/upload-pending-tracker.js +1 -1
  157. package/src/pro/websocket/broadcast-helper.js +1 -1
  158. package/src/pro/websocket/index.js +1 -1
  159. package/src/pro/websocket/livesync-server.js +1 -1
  160. package/src/pro/websocket/ws-broadcaster.js +1 -1
  161. package/src/services/export-service.js +1 -1
  162. package/src/services/import-service.js +1 -1
  163. package/src/services/kafkaConsumerService.js +1 -1
  164. package/src/services/kafkaService.js +1 -1
  165. package/src/services/messagehubService.js +1 -1
  166. package/src/services/rabbitmqService.js +1 -1
  167. package/src/utils/cache-invalidation-registry.js +1 -1
  168. package/src/utils/cache-manager.js +1 -1
  169. package/src/utils/component-engine.js +1 -1
  170. package/src/utils/config-extractor.js +1 -1
  171. package/src/utils/consumerLogger.js +1 -1
  172. package/src/utils/context-builder.js +1 -1
  173. package/src/utils/dashboard-helpers.js +1 -1
  174. package/src/utils/dateHelper.js +1 -1
  175. package/src/utils/datetime-formatter.js +1 -1
  176. package/src/utils/datetime-parser.js +1 -1
  177. package/src/utils/db-bootstrap.js +1 -1
  178. package/src/utils/db-mysql.js +1 -1
  179. package/src/utils/db-oracle.js +1 -1
  180. package/src/utils/db-sqlite.js +1 -1
  181. package/src/utils/db.js +1 -1
  182. package/src/utils/demo-generator.js +1 -1
  183. package/src/utils/excel-generator.js +1 -1
  184. package/src/utils/excel-parser.js +1 -1
  185. package/src/utils/file-watcher.js +1 -1
  186. package/src/utils/id-generator.js +1 -1
  187. package/src/utils/idempotency-manager.js +1 -1
  188. package/src/utils/import-validator.js +1 -1
  189. package/src/utils/license-client.js +1 -1
  190. package/src/utils/lock-manager.js +1 -1
  191. package/src/utils/logger.js +1 -1
  192. package/src/utils/lookup-resolver.js +1 -1
  193. package/src/utils/payload-loader.js +1 -1
  194. package/src/utils/processor-response.js +1 -1
  195. package/src/utils/rabbitmq.js +1 -1
  196. package/src/utils/redis-client.js +1 -1
  197. package/src/utils/redis-helper.js +1 -1
  198. package/src/utils/request-scope.js +1 -1
  199. package/src/utils/security-checks.js +1 -1
  200. package/src/utils/service-resolver.js +1 -1
  201. package/src/utils/shutdown-coordinator.js +1 -1
  202. package/src/utils/trusted-keys.js +1 -1
  203. package/src/utils/upload-handler.js +1 -1
  204. package/src/utils/upsert-builder.js +1 -1
  205. package/src/utils/workflow-hook-executor.js +1 -1
  206. package/generators/metadata/global.json +0 -58
  207. package/generators/metadata/test-mysql-workbench.json +0 -118
  208. package/generators/metadata/test-mysql.json +0 -56
  209. package/generators/metadata/test-oracle-workbench.json +0 -118
  210. package/generators/metadata/test-oracle.json +0 -56
  211. package/generators/metadata/test-pg-workbench.json +0 -118
  212. package/generators/metadata/test-pg.json +0 -56
  213. package/generators/scripts/obfuscate-source.js +0 -356
  214. package/generators/scripts/validate-catalog.js +0 -430
  215. package/generators/scripts/validate-dbschema-catalog.js +0 -708
  216. package/generators/tests/baseline/mysql/mini_inventory_item/src/models/mini-inventory/item.js +0 -944
  217. package/generators/tests/baseline/mysql/mini_inventory_item/src/modules/mini-inventory/item.js +0 -740
  218. package/generators/tests/baseline/mysql/mini_inventory_item/src/modules/mini-inventory.js +0 -336
  219. package/generators/tests/baseline/oracle/mini_inventory_item/src/models/mini-inventory/item.js +0 -1002
  220. package/generators/tests/baseline/oracle/mini_inventory_item/src/modules/mini-inventory/item.js +0 -740
  221. package/generators/tests/baseline/oracle/mini_inventory_item/src/modules/mini-inventory.js +0 -336
  222. package/generators/tests/baseline/postgres/mini_inventory_item/src/models/mini-inventory/item.js +0 -1333
  223. package/generators/tests/baseline/postgres/mini_inventory_item/src/modules/mini-inventory/item.js +0 -1173
  224. package/generators/tests/baseline/postgres/mini_inventory_item/src/modules/mini-inventory.js +0 -496
  225. package/generators/tests/fixtures/payloads/custom-sensitive.json +0 -27
  226. package/generators/tests/fixtures/payloads/dynamic-search-optout.json +0 -23
  227. package/generators/tests/fixtures/payloads/login-with-password.json +0 -22
  228. package/generators/tests/fixtures/payloads/order-process.json +0 -52
  229. package/generators/tests/fixtures/payloads/with-inline-sql.json +0 -26
  230. package/generators/tests/integration-tahap4b/README.md +0 -145
  231. package/generators/tests/integration-tahap4b/run-concurrent.js +0 -77
  232. package/generators/tests/integration-tahap4b/seed.sql +0 -53
  233. package/generators/tests/integration-tahap4b/verify.sql +0 -110
  234. package/generators/tests/unit/cli/create-dashboard.test.js +0 -505
  235. package/generators/tests/unit/cli/create-processor.test.js +0 -319
  236. package/generators/tests/unit/cli/dispatch-dashboard.test.js +0 -149
  237. package/generators/tests/unit/lib/dashboard-generator.test.js +0 -895
  238. package/generators/tests/unit/lib/dashboard-validator.test.js +0 -354
  239. package/generators/tests/unit/lib/dbschema-kit/apply-executor.test.js +0 -437
  240. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-introspect.test.js +0 -393
  241. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-generate-ddl.test.js +0 -104
  242. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-init.test.js +0 -119
  243. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-list.test.js +0 -48
  244. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-migrate.test.js +0 -175
  245. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-validate.test.js +0 -102
  246. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-models.test.js +0 -43
  247. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/all-schemas-listing.js +0 -84
  248. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/connection-error.js +0 -13
  249. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/empty.js +0 -12
  250. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/multi-schema.js +0 -124
  251. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/single-schema-inventory.js +0 -64
  252. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/two-tables.js +0 -66
  253. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/connection-error.js +0 -9
  254. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/partial.js +0 -29
  255. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/rollback.js +0 -26
  256. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/success.js +0 -43
  257. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/multi-schema/audit/events.js +0 -18
  258. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/multi-schema/inventory/products.js +0 -9
  259. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/multi-schema/users.js +0 -8
  260. package/generators/tests/unit/lib/dbschema-kit/connection.test.js +0 -112
  261. package/generators/tests/unit/lib/dbschema-kit/ddl-generator.test.js +0 -205
  262. package/generators/tests/unit/lib/dbschema-kit/define-model.test.js +0 -56
  263. package/generators/tests/unit/lib/dbschema-kit/dialect/index.test.js +0 -46
  264. package/generators/tests/unit/lib/dbschema-kit/dialect/mysql.test.js +0 -126
  265. package/generators/tests/unit/lib/dbschema-kit/dialect/oracle.test.js +0 -126
  266. package/generators/tests/unit/lib/dbschema-kit/dialect/postgres.test.js +0 -131
  267. package/generators/tests/unit/lib/dbschema-kit/dialect/sqlite.test.js +0 -126
  268. package/generators/tests/unit/lib/dbschema-kit/driver-loader.test.js +0 -93
  269. package/generators/tests/unit/lib/dbschema-kit/emitters/create-index.test.js +0 -173
  270. package/generators/tests/unit/lib/dbschema-kit/emitters/create-table.test.js +0 -376
  271. package/generators/tests/unit/lib/dbschema-kit/emitters/drop-table.test.js +0 -78
  272. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/invalid-dialect.env +0 -6
  273. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/missing-dialect.env +0 -5
  274. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/missing-host.env +0 -5
  275. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/oracle-valid.env +0 -6
  276. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/postgres-valid.env +0 -7
  277. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/sqlite-valid.env +0 -2
  278. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/category.js +0 -11
  279. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/item_product.js +0 -11
  280. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/stock_inbound.js +0 -24
  281. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/stock_inbound_item.js +0 -28
  282. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/supplier.js +0 -9
  283. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/warehouse.js +0 -9
  284. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-invalid/orphan.js +0 -17
  285. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/category.js +0 -11
  286. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/item_product.js +0 -11
  287. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/supplier.js +0 -9
  288. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/warehouse.js +0 -9
  289. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/transactions/stock_inbound.js +0 -24
  290. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/transactions/stock_inbound_item.js +0 -28
  291. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/multi-schema/audit/events.js +0 -18
  292. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/multi-schema/inventory/products.js +0 -9
  293. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/multi-schema/public/users.js +0 -9
  294. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-subfolder/extra/category.js +0 -8
  295. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-subfolder/master/category.js +0 -8
  296. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-tablename/bar.js +0 -8
  297. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-tablename/foo.js +0 -8
  298. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/empty-folder/README.md +0 -1
  299. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/invalid-export/plain.js +0 -3
  300. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/invalid-schema/bad.js +0 -6
  301. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/legacy-pattern/legacy.js +0 -12
  302. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-distinct/audit/products.js +0 -9
  303. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-distinct/inventory/products.js +0 -9
  304. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-duplicate/a/products.js +0 -8
  305. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-duplicate/b/products.js +0 -8
  306. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/nested-deep/a/b/c/deep_table.js +0 -8
  307. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/.hidden/ignored.js +0 -7
  308. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/master/category.js +0 -8
  309. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/master/supplier.js +0 -8
  310. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/transactions/stock_inbound.js +0 -8
  311. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/transactions/stock_inbound_item.js +0 -8
  312. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/valid-multiple/category.js +0 -8
  313. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/valid-multiple/item_product.js +0 -9
  314. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/valid-single/category.js +0 -8
  315. package/generators/tests/unit/lib/dbschema-kit/integration.test.js +0 -217
  316. package/generators/tests/unit/lib/dbschema-kit/introspect-mapper.test.js +0 -403
  317. package/generators/tests/unit/lib/dbschema-kit/ir-builder.test.js +0 -390
  318. package/generators/tests/unit/lib/dbschema-kit/loader.test.js +0 -128
  319. package/generators/tests/unit/lib/dbschema-kit/naming.test.js +0 -170
  320. package/generators/tests/unit/lib/dbschema-kit/parser/shorthand-parser.test.js +0 -237
  321. package/generators/tests/unit/lib/dbschema-kit/schema-printer.test.js +0 -251
  322. package/generators/tests/unit/lib/dbschema-kit/statement-modifier.test.js +0 -105
  323. package/generators/tests/unit/lib/dbschema-kit/statement-splitter.test.js +0 -165
  324. package/generators/tests/unit/lib/dbschema-kit/topological-sort.test.js +0 -135
  325. package/generators/tests/unit/lib/dbschema-kit/validator/check-compatibility-validator.test.js +0 -373
  326. package/generators/tests/unit/lib/dbschema-kit/validator/circular-relation-validator.test.js +0 -454
  327. package/generators/tests/unit/lib/dbschema-kit/validator/cross-model-validator.test.js +0 -512
  328. package/generators/tests/unit/lib/dbschema-kit/validator/enhanced-validate-integration.test.js +0 -390
  329. package/generators/tests/unit/lib/dbschema-kit/validator/naming-convention-validator.test.js +0 -306
  330. package/generators/tests/unit/lib/dbschema-kit/validator/schema-validator.test.js +0 -443
  331. package/generators/tests/unit/lib/dbschema-kit/validator/type-compatibility-validator.test.js +0 -440
  332. package/generators/tests/unit/lib/dbschema-kit/validator/validator-reporter.test.js +0 -172
  333. package/generators/tests/unit/lib/metadata-manager-dashboard.test.js +0 -256
  334. package/generators/tests/unit/lib/payload-validator-fieldpolicy.test.js +0 -240
  335. package/generators/tests/unit/lib/processor-validation-generator.test.js +0 -300
  336. package/generators/tests/unit/lib/sensitive-field-masker.test.js +0 -170
  337. package/generators/tests/unit/lib/sql-table-extractor.test.js +0 -119
  338. package/scripts/generate-integrity-manifest.js +0 -124
  339. package/scripts/snapshot-cli-contracts.js +0 -194
  340. package/scripts/verify-publish.js +0 -56
@@ -1,66 +0,0 @@
1
- 'use strict';
2
-
3
- /**
4
- * Stub introspector returning a small two-table dataset (`category` + `item_product`).
5
- * Used by dbschema-introspect CLI tests to exercise bulk + single-table modes
6
- * without touching a real database.
7
- */
8
-
9
- const TABLES = {
10
- category: {
11
- tableName: 'category',
12
- columns: [
13
- { column_name: 'category_id', data_type: 'uuid', udt_name: 'uuid',
14
- column_default: null, is_nullable: 'NO' },
15
- { column_name: 'code', data_type: 'character varying', udt_name: 'varchar',
16
- column_default: null, is_nullable: 'NO', character_maximum_length: 20 },
17
- { column_name: 'name', data_type: 'character varying', udt_name: 'varchar',
18
- column_default: null, is_nullable: 'NO', character_maximum_length: 100 },
19
- { column_name: 'is_active', data_type: 'boolean', udt_name: 'bool',
20
- column_default: 'true', is_nullable: 'YES' }
21
- ],
22
- primaryKey: ['category_id'],
23
- uniques: [{ name: 'uq_category_code', columns: ['code'] }],
24
- foreignKeys: [],
25
- indexes: [
26
- { name: 'pk_category', columns: ['category_id'], unique: true, primary: true },
27
- { name: 'idx_is_active', columns: ['is_active'], unique: false, primary: false }
28
- ],
29
- checks: []
30
- },
31
- item_product: {
32
- tableName: 'item_product',
33
- columns: [
34
- { column_name: 'item_product_id', data_type: 'uuid', udt_name: 'uuid',
35
- column_default: null, is_nullable: 'NO' },
36
- { column_name: 'category_id', data_type: 'uuid', udt_name: 'uuid',
37
- column_default: null, is_nullable: 'NO' },
38
- { column_name: 'product_name', data_type: 'character varying', udt_name: 'varchar',
39
- column_default: null, is_nullable: 'NO', character_maximum_length: 100 }
40
- ],
41
- primaryKey: ['item_product_id'],
42
- uniques: [],
43
- foreignKeys: [{
44
- name: 'fk_item_category',
45
- columns: ['category_id'],
46
- references: { schema: 'public', table: 'category', columns: ['category_id'] },
47
- onDelete: 'CASCADE',
48
- onUpdate: null
49
- }],
50
- indexes: [
51
- { name: 'pk_item_product', columns: ['item_product_id'], unique: true, primary: true }
52
- ],
53
- checks: []
54
- }
55
- };
56
-
57
- async function introspect({ table }) {
58
- if (table) {
59
- const meta = TABLES[table];
60
- if (!meta) return { tables: [] };
61
- return { tables: [meta] };
62
- }
63
- return { tables: Object.values(TABLES) };
64
- }
65
-
66
- module.exports = { introspect };
@@ -1,9 +0,0 @@
1
- 'use strict';
2
-
3
- async function applyStatements(_options) {
4
- const err = new Error('connect ECONNREFUSED 127.0.0.1:5432');
5
- err.code = 'ECONNREFUSED';
6
- throw err;
7
- }
8
-
9
- module.exports = { applyStatements };
@@ -1,29 +0,0 @@
1
- 'use strict';
2
-
3
- async function applyStatements(options) {
4
- const total = options.statements.length;
5
- if (typeof options.onProgress === 'function' && total >= 1) {
6
- options.onProgress({ index: 1, total, statement: options.statements[0], status: 'running' });
7
- options.onProgress({ index: 1, total, statement: options.statements[0], status: 'success' });
8
- if (total >= 2) {
9
- options.onProgress({
10
- index: 2,
11
- total,
12
- statement: options.statements[1],
13
- status: 'error',
14
- error: new Error("Table 'foo' already exists")
15
- });
16
- }
17
- }
18
-
19
- return {
20
- applied: 1,
21
- failed: 1,
22
- durationMs: 8,
23
- status: 'PARTIAL',
24
- failedIndex: 2,
25
- failedStatement: options.statements[1] || ''
26
- };
27
- }
28
-
29
- module.exports = { applyStatements };
@@ -1,26 +0,0 @@
1
- 'use strict';
2
-
3
- async function applyStatements(options) {
4
- const total = options.statements.length;
5
- if (typeof options.onProgress === 'function' && total >= 1) {
6
- options.onProgress({ index: 1, total, statement: options.statements[0], status: 'running' });
7
- options.onProgress({
8
- index: 1,
9
- total,
10
- statement: options.statements[0],
11
- status: 'error',
12
- error: new Error('column "id" does not exist')
13
- });
14
- }
15
-
16
- const err = new Error('column "id" does not exist');
17
- err.status = 'ROLLBACK';
18
- err.applied = 0;
19
- err.failed = 1;
20
- err.failedIndex = 1;
21
- err.failedStatement = options.statements[0] || '';
22
- err.durationMs = 4;
23
- throw err;
24
- }
25
-
26
- module.exports = { applyStatements };
@@ -1,43 +0,0 @@
1
- 'use strict';
2
-
3
- const fs = require('fs');
4
-
5
- async function applyStatements(options) {
6
- const recordPath = process.env.DBSCHEMA_KIT_TEST_RECORD_FILE;
7
- if (recordPath) {
8
- fs.writeFileSync(
9
- recordPath,
10
- JSON.stringify({
11
- statements: options.statements,
12
- dialect: options.dialect,
13
- config: options.config
14
- }, null, 2)
15
- );
16
- }
17
-
18
- if (typeof options.onProgress === 'function') {
19
- for (let i = 0; i < options.statements.length; i++) {
20
- options.onProgress({
21
- index: i + 1,
22
- total: options.statements.length,
23
- statement: options.statements[i],
24
- status: 'running'
25
- });
26
- options.onProgress({
27
- index: i + 1,
28
- total: options.statements.length,
29
- statement: options.statements[i],
30
- status: 'success'
31
- });
32
- }
33
- }
34
-
35
- return {
36
- applied: options.statements.length,
37
- failed: 0,
38
- durationMs: 5,
39
- status: 'SUCCESS'
40
- };
41
- }
42
-
43
- module.exports = { applyStatements };
@@ -1,18 +0,0 @@
1
- 'use strict';
2
-
3
- module.exports = ({ defineModel }) => defineModel('events', {
4
- schema: 'audit',
5
- fields: {
6
- event_id: 'uuid pk',
7
- product_id: 'uuid notnull',
8
- action: 'string:50 notnull'
9
- },
10
- relations: {
11
- product: {
12
- type: 'belongsTo',
13
- target: 'inventory.products',
14
- localKey: 'product_id',
15
- references: 'product_id'
16
- }
17
- }
18
- });
@@ -1,9 +0,0 @@
1
- 'use strict';
2
-
3
- module.exports = ({ defineModel }) => defineModel('products', {
4
- schema: 'inventory',
5
- fields: {
6
- product_id: 'uuid pk',
7
- name: 'string:100 notnull'
8
- }
9
- });
@@ -1,8 +0,0 @@
1
- 'use strict';
2
-
3
- module.exports = ({ defineModel }) => defineModel('users', {
4
- fields: {
5
- user_id: 'uuid pk',
6
- email: 'string:100 unique notnull'
7
- }
8
- });
@@ -1,112 +0,0 @@
1
- 'use strict';
2
-
3
- const test = require('node:test');
4
- const assert = require('node:assert');
5
- const path = require('path');
6
-
7
- const { loadConfig, parseConfig } = require('../../../../lib/dbschema-kit/connection');
8
-
9
- const FIXTURES = path.join(__dirname, 'fixtures', 'connection');
10
-
11
- test('connection: parseConfig parse KEY=VALUE menjadi object dengan dua key', () => {
12
- const result = parseConfig('DB_TYPE=postgresql\nDB_HOST=localhost');
13
- assert.deepStrictEqual(result, { DB_TYPE: 'postgresql', DB_HOST: 'localhost' });
14
- });
15
-
16
- test('connection: parseConfig skip baris kosong dan baris comment (#)', () => {
17
- const content = [
18
- '# Comment di awal',
19
- '',
20
- 'DB_TYPE=postgresql',
21
- ' ',
22
- '# Comment di tengah',
23
- 'DB_HOST=localhost',
24
- ''
25
- ].join('\n');
26
- const result = parseConfig(content);
27
- assert.deepStrictEqual(result, { DB_TYPE: 'postgresql', DB_HOST: 'localhost' });
28
- });
29
-
30
- test('connection: parseConfig trim whitespace pada key dan value', () => {
31
- const result = parseConfig(' DB_HOST = localhost \n DB_PORT = 5432');
32
- assert.deepStrictEqual(result, { DB_HOST: 'localhost', DB_PORT: '5432' });
33
- });
34
-
35
- test('connection: parseConfig throw bila baris tidak match KEY=VALUE', () => {
36
- assert.throws(
37
- () => parseConfig('DB_TYPE=postgresql\nINVALID_LINE_WITHOUT_EQUALS'),
38
- /Invalid config line 2/
39
- );
40
- });
41
-
42
- test('connection: parseConfig throw bila key kosong', () => {
43
- assert.throws(() => parseConfig('=value'), /Key cannot be empty/);
44
- });
45
-
46
- test('connection: parseConfig throw bila content bukan string', () => {
47
- assert.throws(() => parseConfig(null), /content must be a string/);
48
- });
49
-
50
- test('connection: parseConfig parse value yang mengandung tanda = (URL, dst)', () => {
51
- const result = parseConfig('DB_URL=postgres://user:pass@host:5432/db?sslmode=require');
52
- assert.deepStrictEqual(result, {
53
- DB_URL: 'postgres://user:pass@host:5432/db?sslmode=require'
54
- });
55
- });
56
-
57
- test('connection: loadConfig happy path postgres lengkap', () => {
58
- const config = loadConfig(path.join(FIXTURES, 'postgres-valid.env'));
59
- assert.strictEqual(config.dialect, 'postgres');
60
- assert.strictEqual(config.host, 'localhost');
61
- assert.strictEqual(config.port, 5432);
62
- assert.strictEqual(typeof config.port, 'number');
63
- assert.strictEqual(config.database, 'mini_inventory');
64
- assert.strictEqual(config.user, 'postgres');
65
- assert.strictEqual(config.password, 'secret');
66
- });
67
-
68
- test('connection: loadConfig SQLite hanya butuh dialect dan file', () => {
69
- const config = loadConfig(path.join(FIXTURES, 'sqlite-valid.env'));
70
- assert.strictEqual(config.dialect, 'sqlite');
71
- assert.strictEqual(config.file, './database.sqlite');
72
- });
73
-
74
- test('connection: loadConfig Oracle expose serviceName dari DB_SERVICE_NAME', () => {
75
- const config = loadConfig(path.join(FIXTURES, 'oracle-valid.env'));
76
- assert.strictEqual(config.dialect, 'oracle');
77
- assert.strictEqual(config.serviceName, 'XEPDB1');
78
- assert.strictEqual(config.database, undefined);
79
- });
80
-
81
- test('connection: loadConfig throw bila DB_TYPE tidak ada', () => {
82
- assert.throws(
83
- () => loadConfig(path.join(FIXTURES, 'missing-dialect.env')),
84
- /DB_TYPE not found/
85
- );
86
- });
87
-
88
- test('connection: loadConfig throw bila DB_TYPE invalid (mssql)', () => {
89
- assert.throws(
90
- () => loadConfig(path.join(FIXTURES, 'invalid-dialect.env')),
91
- /Invalid DB_TYPE 'mssql'/
92
- );
93
- });
94
-
95
- test('connection: loadConfig throw bila required field missing (postgresql tanpa DB_HOST)', () => {
96
- assert.throws(
97
- () => loadConfig(path.join(FIXTURES, 'missing-host.env')),
98
- /missing required fields for postgresql: DB_HOST/
99
- );
100
- });
101
-
102
- test('connection: loadConfig throw bila file tidak exist', () => {
103
- assert.throws(
104
- () => loadConfig(path.join(FIXTURES, 'nonexistent.env')),
105
- /Config file not found/
106
- );
107
- });
108
-
109
- test('connection: loadConfig throw bila filePath bukan string', () => {
110
- assert.throws(() => loadConfig(null), /filePath must be a non-empty string/);
111
- assert.throws(() => loadConfig(''), /filePath must be a non-empty string/);
112
- });
@@ -1,205 +0,0 @@
1
- 'use strict';
2
-
3
- const test = require('node:test');
4
- const assert = require('node:assert');
5
- const path = require('node:path');
6
-
7
- const { defineModel } = require('../../../../lib/dbschema-kit/define-model');
8
- const { loadSchemaFolder } = require('../../../../lib/dbschema-kit/loader');
9
- const { generateDDL } = require('../../../../lib/dbschema-kit/ddl-generator');
10
-
11
- const FIXTURE_VALID = path.resolve(__dirname, 'fixtures', 'integration', 'mini-inventory');
12
-
13
- test('ddl-generator: tabel tunggal + dialect postgres menghasilkan header + CREATE TABLE tanpa DROP/INDEX section bila tidak ada index', () => {
14
- const ir = defineModel('only_table', {
15
- fields: {
16
- only_table_id: 'string:36 pk',
17
- name: 'string:100 notnull'
18
- }
19
- });
20
- const models = new Map([['only_table', ir]]);
21
-
22
- const sql = generateDDL(models, { dialect: 'postgres' });
23
-
24
- assert.match(sql, /-- Generated by dbschema:generate-ddl/);
25
- assert.match(sql, /-- Dialect: postgres/);
26
- assert.match(sql, /-- Generated at: \d{4}-\d{2}-\d{2}T/);
27
- assert.match(sql, /-- CREATE TABLE section/);
28
- assert.match(sql, /CREATE TABLE only_table/);
29
- assert.doesNotMatch(sql, /-- DROP section/);
30
- assert.doesNotMatch(sql, /-- CREATE INDEX section/);
31
- });
32
-
33
- test('ddl-generator: drop=true menambahkan section DROP dengan header "-- DROP section"', () => {
34
- const ir = defineModel('only_table', {
35
- fields: { only_table_id: 'string:36 pk' }
36
- });
37
- const models = new Map([['only_table', ir]]);
38
-
39
- const sql = generateDDL(models, { dialect: 'postgres', drop: true });
40
-
41
- assert.match(sql, /-- DROP section/);
42
- assert.match(sql, /DROP TABLE IF EXISTS only_table CASCADE;/);
43
- // DROP harus muncul sebelum CREATE TABLE
44
- const dropIdx = sql.indexOf('DROP TABLE');
45
- const createIdx = sql.indexOf('CREATE TABLE');
46
- assert.ok(dropIdx > 0 && dropIdx < createIdx, 'DROP harus sebelum CREATE TABLE');
47
- });
48
-
49
- test('ddl-generator: DROP order = reverse topological (child sebelum parent)', () => {
50
- const parent = defineModel('parent', {
51
- fields: { parent_id: 'string:36 pk' }
52
- });
53
- const child = defineModel('child', {
54
- fields: {
55
- child_id: 'string:36 pk',
56
- parent_id: 'string:36 notnull'
57
- },
58
- relations: {
59
- parent: { type: 'belongsTo', target: 'parent', localKey: 'parent_id', references: 'parent_id' }
60
- }
61
- });
62
-
63
- const models = new Map([['parent', parent], ['child', child]]);
64
- const sql = generateDDL(models, { dialect: 'postgres', drop: true });
65
-
66
- const dropChildIdx = sql.indexOf('DROP TABLE IF EXISTS child');
67
- const dropParentIdx = sql.indexOf('DROP TABLE IF EXISTS parent');
68
- assert.ok(dropChildIdx > 0 && dropParentIdx > 0);
69
- assert.ok(dropChildIdx < dropParentIdx, 'DROP child harus sebelum DROP parent');
70
-
71
- // CREATE order kebalikannya
72
- const createParentIdx = sql.indexOf('CREATE TABLE parent');
73
- const createChildIdx = sql.indexOf('CREATE TABLE child');
74
- assert.ok(createParentIdx < createChildIdx, 'CREATE parent harus sebelum CREATE child');
75
- });
76
-
77
- test('ddl-generator: multiple tables dengan FK menghasilkan CREATE order = topological (parent dulu)', () => {
78
- const models = loadSchemaFolder(FIXTURE_VALID);
79
- const sql = generateDDL(models, { dialect: 'postgres' });
80
-
81
- const categoryIdx = sql.indexOf('CREATE TABLE category');
82
- const itemProductIdx = sql.indexOf('CREATE TABLE item_product');
83
- assert.ok(categoryIdx > 0 && itemProductIdx > 0);
84
- assert.ok(categoryIdx < itemProductIdx, 'category harus sebelum item_product (item_product punya FK ke category)');
85
-
86
- const stockInboundIdx = sql.indexOf('CREATE TABLE stock_inbound');
87
- const stockInboundItemIdx = sql.indexOf('CREATE TABLE stock_inbound_item');
88
- assert.ok(stockInboundIdx < stockInboundItemIdx, 'stock_inbound harus sebelum stock_inbound_item');
89
- });
90
-
91
- test('ddl-generator: tabel dengan index menghasilkan CREATE INDEX section di akhir, urut topological', () => {
92
- const a = defineModel('parent_idx', {
93
- fields: {
94
- parent_idx_id: 'string:36 pk',
95
- name: 'string:100 notnull',
96
- flag: 'boolean'
97
- },
98
- indexes: ['flag']
99
- });
100
- const b = defineModel('child_idx', {
101
- fields: {
102
- child_idx_id: 'string:36 pk',
103
- parent_idx_id: 'string:36 notnull',
104
- tag: 'string:50'
105
- },
106
- indexes: ['tag'],
107
- relations: {
108
- parent: { type: 'belongsTo', target: 'parent_idx', localKey: 'parent_idx_id', references: 'parent_idx_id' }
109
- }
110
- });
111
-
112
- const models = new Map([['child_idx', b], ['parent_idx', a]]);
113
- const sql = generateDDL(models, { dialect: 'postgres' });
114
-
115
- assert.match(sql, /-- CREATE INDEX section/);
116
-
117
- const indexSectionIdx = sql.indexOf('-- CREATE INDEX section');
118
- const lastCreateTableIdx = sql.lastIndexOf('CREATE TABLE');
119
- assert.ok(indexSectionIdx > lastCreateTableIdx, 'CREATE INDEX section harus setelah semua CREATE TABLE');
120
-
121
- // Urutan index ikut topological tabel: parent_idx index muncul sebelum child_idx index
122
- const idxParent = sql.indexOf('ON parent_idx');
123
- const idxChild = sql.indexOf('ON child_idx');
124
- assert.ok(idxParent > 0 && idxChild > 0);
125
- assert.ok(idxParent < idxChild, 'index parent_idx harus sebelum index child_idx');
126
- });
127
-
128
- test('ddl-generator: map kosong menghasilkan output hanya header, tanpa section', () => {
129
- const sql = generateDDL(new Map(), { dialect: 'postgres' });
130
-
131
- assert.match(sql, /-- Generated by dbschema:generate-ddl/);
132
- assert.match(sql, /-- Dialect: postgres/);
133
- assert.doesNotMatch(sql, /-- DROP section/);
134
- assert.doesNotMatch(sql, /-- CREATE TABLE section/);
135
- assert.doesNotMatch(sql, /-- CREATE INDEX section/);
136
- assert.doesNotMatch(sql, /CREATE TABLE/);
137
- });
138
-
139
- test('ddl-generator: dialect mysql emit identifier tanpa quote', () => {
140
- const ir = defineModel('only_table', {
141
- fields: {
142
- only_table_id: 'string:36 pk',
143
- name: 'string:100 notnull'
144
- }
145
- });
146
- const models = new Map([['only_table', ir]]);
147
-
148
- const sql = generateDDL(models, { dialect: 'mysql' });
149
-
150
- assert.match(sql, /-- Dialect: mysql/);
151
- assert.match(sql, /CREATE TABLE only_table/);
152
- assert.match(sql, /only_table_id VARCHAR/);
153
- });
154
-
155
- test('ddl-generator: dialect oracle dengan drop=true emit DROP berbentuk PL/SQL block tanpa `;` setelah `/`', () => {
156
- const ir = defineModel('only_table', {
157
- fields: { only_table_id: 'string:36 pk' }
158
- });
159
- const models = new Map([['only_table', ir]]);
160
-
161
- const sql = generateDDL(models, { dialect: 'oracle', drop: true });
162
-
163
- assert.match(sql, /BEGIN/);
164
- assert.match(sql, /EXECUTE IMMEDIATE 'DROP TABLE only_table CASCADE CONSTRAINTS'/);
165
- assert.match(sql, /EXCEPTION/);
166
- assert.match(sql, /END;/);
167
- // Tidak boleh ada `;` setelah `/` di Oracle DROP block
168
- assert.doesNotMatch(sql, /\/;/);
169
- // Pastikan ada `/` terminator pada baris tersendiri
170
- assert.match(sql, /\n\/\n/);
171
- });
172
-
173
- test('ddl-generator: header comment menyertakan timestamp ISO 8601 (UTC)', () => {
174
- const ir = defineModel('only_table', { fields: { only_table_id: 'string:36 pk' } });
175
- const models = new Map([['only_table', ir]]);
176
-
177
- const sql = generateDDL(models, { dialect: 'postgres' });
178
- // Match ISO 8601 UTC timestamp
179
- assert.match(sql, /-- Generated at: \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z/);
180
- });
181
-
182
- test('ddl-generator: setiap CREATE TABLE statement diakhiri dengan `;`', () => {
183
- const models = loadSchemaFolder(FIXTURE_VALID);
184
- const sql = generateDDL(models, { dialect: 'postgres' });
185
-
186
- const lines = sql.split('\n');
187
- // Cari line yang mulai dengan ')' dan pastikan diikuti ';'
188
- let createTableEndingFound = 0;
189
- for (let i = 0; i < lines.length; i++) {
190
- if (lines[i].trim() === ');') createTableEndingFound++;
191
- }
192
- assert.ok(createTableEndingFound >= 6, `expected at least 6 CREATE TABLE endings, got ${createTableEndingFound}`);
193
- });
194
-
195
- test('ddl-generator: input bukan Map melempar error', () => {
196
- assert.throws(() => generateDDL({}, { dialect: 'postgres' }), /must be a Map/);
197
- assert.throws(() => generateDDL([], { dialect: 'postgres' }), /must be a Map/);
198
- });
199
-
200
- test('ddl-generator: dialect tidak dikenal melempar error', () => {
201
- const ir = defineModel('only_table', { fields: { only_table_id: 'string:36 pk' } });
202
- const models = new Map([['only_table', ir]]);
203
-
204
- assert.throws(() => generateDDL(models, { dialect: 'mssql' }), /Unknown dialect/);
205
- });
@@ -1,56 +0,0 @@
1
- 'use strict';
2
-
3
- const test = require('node:test');
4
- const assert = require('node:assert');
5
-
6
- const { defineModel } = require('../../../../lib/dbschema-kit/define-model');
7
-
8
- test('define-model: returns IR object dengan struktur lengkap (sanity check)', () => {
9
- const ir = defineModel('foo', {
10
- fields: {
11
- id: 'uuid pk',
12
- name: 'string:20 notnull'
13
- }
14
- });
15
- assert.strictEqual(ir.tableName, 'foo');
16
- assert.ok(ir.fields, 'fields property exists');
17
- assert.ok(Array.isArray(ir.primaryKey), 'primaryKey is array');
18
- assert.ok(Array.isArray(ir.indexes), 'indexes is array');
19
- assert.ok(Array.isArray(ir.uniques), 'uniques is array');
20
- assert.strictEqual(typeof ir.relations, 'object', 'relations is object');
21
- assert.ok(Array.isArray(ir.checks), 'checks is array');
22
- assert.ok(ir._meta, '_meta exists');
23
- });
24
-
25
- test('define-model: propagate error dari parser dengan informasi tableName di error message', () => {
26
- assert.throws(
27
- () => defineModel('purchase_order', { fields: { status: 'string:20 uniqe' } }),
28
- /^Error: Table 'purchase_order': Field 'status': unknown constraint 'uniqe'$/
29
- );
30
- });
31
-
32
- test('define-model: mengembalikan object literal yang freezable (bukan class instance)', () => {
33
- const ir = defineModel('foo', { fields: { id: 'uuid pk' } });
34
- assert.strictEqual(Object.getPrototypeOf(ir), Object.prototype, 'must be plain object');
35
- assert.doesNotThrow(() => Object.freeze(ir), 'should be freezable without error');
36
- assert.ok(Object.isFrozen(ir), 'object should be frozen after freeze call');
37
- });
38
-
39
- test('define-model: throw validator error bila tableName uppercase', () => {
40
- assert.throws(
41
- () => defineModel('StockInbound', { fields: { id: 'string:36 pk' } }),
42
- /^Error: Table name must be snake_case \(lowercase, alphanumeric, underscore, no leading digit\)$/
43
- );
44
- });
45
-
46
- test('define-model: throw validator error bila relation localKey reference field tidak existing', () => {
47
- assert.throws(
48
- () => defineModel('foo', {
49
- fields: { id: 'uuid pk' },
50
- relations: {
51
- bar: { type: 'belongsTo', localKey: 'nonexistent_field', references: 'id' }
52
- }
53
- }),
54
- /^Error: Table 'foo': relation 'bar' references unknown field 'nonexistent_field'$/
55
- );
56
- });
@@ -1,46 +0,0 @@
1
- 'use strict';
2
-
3
- const test = require('node:test');
4
- const assert = require('node:assert');
5
-
6
- const { getDialect, DIALECTS } = require('../../../../../lib/dbschema-kit/dialect');
7
-
8
- test('factory: getDialect("postgres") return modul dengan name === "postgres"', () => {
9
- const d = getDialect('postgres');
10
- assert.strictEqual(d.name, 'postgres');
11
- assert.strictEqual(typeof d.mapType, 'function');
12
- assert.strictEqual(typeof d.formatDefault, 'function');
13
- assert.strictEqual(typeof d.quoteIdentifier, 'function');
14
- assert.strictEqual(typeof d.formatReferentialAction, 'function');
15
- });
16
-
17
- test('factory: getDialect("mysql") return modul dengan name === "mysql"', () => {
18
- assert.strictEqual(getDialect('mysql').name, 'mysql');
19
- });
20
-
21
- test('factory: getDialect("oracle") return modul dengan name === "oracle"', () => {
22
- assert.strictEqual(getDialect('oracle').name, 'oracle');
23
- });
24
-
25
- test('factory: getDialect("sqlite") return modul dengan name === "sqlite"', () => {
26
- assert.strictEqual(getDialect('sqlite').name, 'sqlite');
27
- });
28
-
29
- test('factory: getDialect throw bila nama dialect tidak dikenal', () => {
30
- assert.throws(
31
- () => getDialect('mssql'),
32
- /Unknown dialect: 'mssql'\. Supported: postgres, mysql, oracle, sqlite/
33
- );
34
- });
35
-
36
- test('factory: getDialect throw bila nama undefined atau null', () => {
37
- assert.throws(() => getDialect(undefined), /Unknown dialect/);
38
- assert.throws(() => getDialect(null), /Unknown dialect/);
39
- });
40
-
41
- test('factory: DIALECTS map mengekspos keempat dialect', () => {
42
- assert.deepStrictEqual(
43
- Object.keys(DIALECTS).sort(),
44
- ['mysql', 'oracle', 'postgres', 'sqlite']
45
- );
46
- });