@restforgejs/platform 4.2.8 → 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 (324) 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 +1 -1
  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 +3 -2
  18. package/generators/cli/schema/describe.js +3 -2
  19. package/generators/cli/schema/diff.js +3 -2
  20. package/generators/cli/schema/introspect.js +3 -2
  21. package/generators/cli/schema/list.js +3 -2
  22. package/generators/cli/schema/migrate.js +3 -2
  23. package/generators/lib/migration/audit-table-runner.js +213 -215
  24. package/generators/lib/templates/dashboard-catalog.js +1 -437
  25. package/generators/lib/templates/db-connection-env.js +1 -212
  26. package/generators/lib/templates/dbschema-catalog.js +1 -489
  27. package/generators/lib/templates/field-validation-catalog.js +1 -531
  28. package/generators/lib/templates/mysql-template.js +1 -3863
  29. package/generators/lib/templates/oracle-template.js +1 -3915
  30. package/generators/lib/templates/postgres-template.js +1 -5838
  31. package/generators/lib/templates/query-declarative-catalog.js +1 -199
  32. package/generators/lib/templates/sqlite-template.js +1 -3440
  33. package/generators/lib/utils/env-manager.js +6 -0
  34. package/generators/lib/utils/path-validator.js +71 -0
  35. package/generators/lib/validators/payload-validator.js +1 -2
  36. package/integrity-manifest.json +28 -10
  37. package/package.json +11 -3
  38. package/scripts/verify-integrity.js +1 -1
  39. package/server.js +1 -1
  40. package/src/components/handlers/adjust_handler.js +1 -1
  41. package/src/components/handlers/audit_handler.js +1 -1
  42. package/src/components/handlers/delete_handler.js +1 -1
  43. package/src/components/handlers/export_handler.js +1 -1
  44. package/src/components/handlers/import_handler.js +1 -1
  45. package/src/components/handlers/insert_handler.js +1 -1
  46. package/src/components/handlers/update_handler.js +1 -1
  47. package/src/components/handlers/upload_handler.js +1 -1
  48. package/src/components/handlers/workflow_handler.js +1 -1
  49. package/src/components/integrations/webhook.js +1 -1
  50. package/src/consumers/baseConsumer.js +1 -1
  51. package/src/consumers/declarativeMapper.js +1 -1
  52. package/src/consumers/handlers/apiHandler.js +1 -1
  53. package/src/consumers/handlers/consoleHandler.js +1 -1
  54. package/src/consumers/handlers/databaseHandler.js +1 -1
  55. package/src/consumers/handlers/index.js +1 -1
  56. package/src/consumers/handlers/kafkaHandler.js +1 -1
  57. package/src/consumers/index.js +1 -1
  58. package/src/consumers/messageTransformer.js +1 -1
  59. package/src/consumers/validator.js +1 -1
  60. package/src/core/db/dialect/base-dialect.js +1 -1
  61. package/src/core/db/dialect/index.js +1 -1
  62. package/src/core/db/dialect/mysql-dialect.js +1 -1
  63. package/src/core/db/dialect/oracle-dialect.js +1 -1
  64. package/src/core/db/dialect/postgres-dialect.js +1 -1
  65. package/src/core/db/dialect/sqlite-dialect.js +1 -1
  66. package/src/core/db/flatten-helper.js +1 -1
  67. package/src/core/db/query-builder-error.js +1 -1
  68. package/src/core/db/query-builder.js +1 -1
  69. package/src/core/db/relation-helper.js +1 -1
  70. package/src/core/handlers/delete_handler.js +1 -1
  71. package/src/core/handlers/insert_handler.js +1 -1
  72. package/src/core/handlers/update_handler.js +1 -1
  73. package/src/core/models/base-model.js +1 -1
  74. package/src/core/utils/cache-manager.js +1 -1
  75. package/src/core/utils/component-engine.js +1 -1
  76. package/src/core/utils/context-builder.js +1 -1
  77. package/src/core/utils/datetime-formatter.js +1 -1
  78. package/src/core/utils/datetime-parser.js +1 -1
  79. package/src/core/utils/db.js +1 -1
  80. package/src/core/utils/logger.js +1 -1
  81. package/src/core/utils/payload-loader.js +1 -1
  82. package/src/core/utils/security-checks.js +1 -1
  83. package/src/middleware/body-options.js +1 -1
  84. package/src/middleware/cors.js +1 -1
  85. package/src/middleware/idempotency.js +1 -1
  86. package/src/middleware/rate-limiter.js +1 -1
  87. package/src/middleware/request-logger.js +1 -1
  88. package/src/middleware/security-headers.js +1 -1
  89. package/src/models/base-model-mysql.js +1 -1
  90. package/src/models/base-model-oracle.js +1 -1
  91. package/src/models/base-model-sqlite.js +1 -1
  92. package/src/models/base-model.js +1 -1
  93. package/src/pro/caching/redis-client.js +1 -1
  94. package/src/pro/caching/redis-helper.js +1 -1
  95. package/src/pro/consumers/baseConsumer.js +1 -1
  96. package/src/pro/consumers/declarativeMapper.js +1 -1
  97. package/src/pro/consumers/handlers/apiHandler.js +1 -1
  98. package/src/pro/consumers/handlers/consoleHandler.js +1 -1
  99. package/src/pro/consumers/handlers/databaseHandler.js +1 -1
  100. package/src/pro/consumers/handlers/index.js +1 -1
  101. package/src/pro/consumers/handlers/kafkaHandler.js +1 -1
  102. package/src/pro/consumers/index.js +1 -1
  103. package/src/pro/consumers/messageTransformer.js +1 -1
  104. package/src/pro/consumers/validator.js +1 -1
  105. package/src/pro/database/base-model-mysql.js +1 -1
  106. package/src/pro/database/base-model-oracle.js +1 -1
  107. package/src/pro/database/base-model-sqlite.js +1 -1
  108. package/src/pro/database/db-mysql.js +1 -1
  109. package/src/pro/database/db-oracle.js +1 -1
  110. package/src/pro/database/db-sqlite.js +1 -1
  111. package/src/pro/excel/excel-generator.js +1 -1
  112. package/src/pro/excel/excel-parser.js +1 -1
  113. package/src/pro/excel/export-service.js +1 -1
  114. package/src/pro/excel/export_handler.js +1 -1
  115. package/src/pro/excel/import-service.js +1 -1
  116. package/src/pro/excel/import-validator.js +1 -1
  117. package/src/pro/excel/import_handler.js +1 -1
  118. package/src/pro/excel/upsert-builder.js +1 -1
  119. package/src/pro/idgen/idgen-routes.js +1 -1
  120. package/src/pro/integrations/lookup-resolver.js +1 -1
  121. package/src/pro/integrations/upload-handler-v2.js +1 -1
  122. package/src/pro/integrations/upload-handler.js +1 -1
  123. package/src/pro/integrations/webhook.js +1 -1
  124. package/src/pro/locking/lock-routes.js +1 -1
  125. package/src/pro/locking/resource-lock-manager.js +1 -1
  126. package/src/pro/messaging/kafkaConsumerService.js +1 -1
  127. package/src/pro/messaging/kafkaService.js +1 -1
  128. package/src/pro/messaging/messagehubService.js +1 -1
  129. package/src/pro/messaging/rabbitmqService.js +1 -1
  130. package/src/pro/scheduler/job-manager.js +1 -1
  131. package/src/pro/scheduler/job-routes.js +1 -1
  132. package/src/pro/scheduler/job-validator.js +1 -1
  133. package/src/pro/storage/base-storage-provider.js +1 -1
  134. package/src/pro/storage/file-metadata-helper.js +1 -1
  135. package/src/pro/storage/index.js +1 -1
  136. package/src/pro/storage/local-storage-provider.js +1 -1
  137. package/src/pro/storage/s3-storage-provider.js +1 -1
  138. package/src/pro/storage/upload-cleanup-job.js +1 -1
  139. package/src/pro/storage/upload-cleanup-scheduler.js +1 -1
  140. package/src/pro/storage/upload-pending-tracker.js +1 -1
  141. package/src/pro/websocket/broadcast-helper.js +1 -1
  142. package/src/pro/websocket/index.js +1 -1
  143. package/src/pro/websocket/livesync-server.js +1 -1
  144. package/src/pro/websocket/ws-broadcaster.js +1 -1
  145. package/src/services/export-service.js +1 -1
  146. package/src/services/import-service.js +1 -1
  147. package/src/services/kafkaConsumerService.js +1 -1
  148. package/src/services/kafkaService.js +1 -1
  149. package/src/services/messagehubService.js +1 -1
  150. package/src/services/rabbitmqService.js +1 -1
  151. package/src/utils/cache-invalidation-registry.js +1 -1
  152. package/src/utils/cache-manager.js +1 -1
  153. package/src/utils/component-engine.js +1 -1
  154. package/src/utils/config-extractor.js +1 -1
  155. package/src/utils/consumerLogger.js +1 -1
  156. package/src/utils/context-builder.js +1 -1
  157. package/src/utils/dashboard-helpers.js +1 -1
  158. package/src/utils/dateHelper.js +1 -1
  159. package/src/utils/datetime-formatter.js +1 -1
  160. package/src/utils/datetime-parser.js +1 -1
  161. package/src/utils/db-bootstrap.js +1 -1
  162. package/src/utils/db-mysql.js +1 -1
  163. package/src/utils/db-oracle.js +1 -1
  164. package/src/utils/db-sqlite.js +1 -1
  165. package/src/utils/db.js +1 -1
  166. package/src/utils/demo-generator.js +1 -1
  167. package/src/utils/excel-generator.js +1 -1
  168. package/src/utils/excel-parser.js +1 -1
  169. package/src/utils/file-watcher.js +1 -1
  170. package/src/utils/id-generator.js +1 -1
  171. package/src/utils/idempotency-manager.js +1 -1
  172. package/src/utils/import-validator.js +1 -1
  173. package/src/utils/license-client.js +1 -1
  174. package/src/utils/lock-manager.js +1 -1
  175. package/src/utils/logger.js +1 -1
  176. package/src/utils/lookup-resolver.js +1 -1
  177. package/src/utils/payload-loader.js +1 -1
  178. package/src/utils/processor-response.js +1 -1
  179. package/src/utils/rabbitmq.js +1 -1
  180. package/src/utils/redis-client.js +1 -1
  181. package/src/utils/redis-helper.js +1 -1
  182. package/src/utils/request-scope.js +1 -1
  183. package/src/utils/security-checks.js +1 -1
  184. package/src/utils/service-resolver.js +1 -1
  185. package/src/utils/shutdown-coordinator.js +1 -1
  186. package/src/utils/trusted-keys.js +1 -1
  187. package/src/utils/upload-handler.js +1 -1
  188. package/src/utils/upsert-builder.js +1 -1
  189. package/src/utils/workflow-hook-executor.js +1 -1
  190. package/generators/metadata/global.json +0 -58
  191. package/generators/metadata/test-mysql-workbench.json +0 -118
  192. package/generators/metadata/test-mysql.json +0 -56
  193. package/generators/metadata/test-oracle-workbench.json +0 -118
  194. package/generators/metadata/test-oracle.json +0 -56
  195. package/generators/metadata/test-pg-workbench.json +0 -118
  196. package/generators/metadata/test-pg.json +0 -56
  197. package/generators/scripts/obfuscate-source.js +0 -356
  198. package/generators/scripts/validate-catalog.js +0 -430
  199. package/generators/scripts/validate-dbschema-catalog.js +0 -708
  200. package/generators/tests/baseline/mysql/mini_inventory_item/src/models/mini-inventory/item.js +0 -944
  201. package/generators/tests/baseline/mysql/mini_inventory_item/src/modules/mini-inventory/item.js +0 -740
  202. package/generators/tests/baseline/mysql/mini_inventory_item/src/modules/mini-inventory.js +0 -336
  203. package/generators/tests/baseline/oracle/mini_inventory_item/src/models/mini-inventory/item.js +0 -1002
  204. package/generators/tests/baseline/oracle/mini_inventory_item/src/modules/mini-inventory/item.js +0 -740
  205. package/generators/tests/baseline/oracle/mini_inventory_item/src/modules/mini-inventory.js +0 -336
  206. package/generators/tests/baseline/postgres/mini_inventory_item/src/models/mini-inventory/item.js +0 -1333
  207. package/generators/tests/baseline/postgres/mini_inventory_item/src/modules/mini-inventory/item.js +0 -1173
  208. package/generators/tests/baseline/postgres/mini_inventory_item/src/modules/mini-inventory.js +0 -496
  209. package/generators/tests/fixtures/payloads/custom-sensitive.json +0 -27
  210. package/generators/tests/fixtures/payloads/dynamic-search-optout.json +0 -23
  211. package/generators/tests/fixtures/payloads/login-with-password.json +0 -22
  212. package/generators/tests/fixtures/payloads/order-process.json +0 -52
  213. package/generators/tests/fixtures/payloads/with-inline-sql.json +0 -26
  214. package/generators/tests/integration-tahap4b/README.md +0 -145
  215. package/generators/tests/integration-tahap4b/run-concurrent.js +0 -77
  216. package/generators/tests/integration-tahap4b/seed.sql +0 -53
  217. package/generators/tests/integration-tahap4b/verify.sql +0 -110
  218. package/generators/tests/unit/cli/create-dashboard.test.js +0 -505
  219. package/generators/tests/unit/cli/create-processor.test.js +0 -319
  220. package/generators/tests/unit/cli/dispatch-dashboard.test.js +0 -149
  221. package/generators/tests/unit/lib/dashboard-generator.test.js +0 -895
  222. package/generators/tests/unit/lib/dashboard-validator.test.js +0 -354
  223. package/generators/tests/unit/lib/dbschema-kit/apply-executor.test.js +0 -437
  224. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-introspect.test.js +0 -393
  225. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-generate-ddl.test.js +0 -104
  226. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-init.test.js +0 -119
  227. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-list.test.js +0 -48
  228. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-migrate.test.js +0 -175
  229. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-validate.test.js +0 -102
  230. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-models.test.js +0 -43
  231. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/all-schemas-listing.js +0 -84
  232. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/connection-error.js +0 -13
  233. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/empty.js +0 -12
  234. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/multi-schema.js +0 -124
  235. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/single-schema-inventory.js +0 -64
  236. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/two-tables.js +0 -66
  237. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/connection-error.js +0 -9
  238. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/partial.js +0 -29
  239. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/rollback.js +0 -26
  240. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/success.js +0 -43
  241. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/multi-schema/audit/events.js +0 -18
  242. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/multi-schema/inventory/products.js +0 -9
  243. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/multi-schema/users.js +0 -8
  244. package/generators/tests/unit/lib/dbschema-kit/connection.test.js +0 -112
  245. package/generators/tests/unit/lib/dbschema-kit/ddl-generator.test.js +0 -205
  246. package/generators/tests/unit/lib/dbschema-kit/define-model.test.js +0 -56
  247. package/generators/tests/unit/lib/dbschema-kit/dialect/index.test.js +0 -46
  248. package/generators/tests/unit/lib/dbschema-kit/dialect/mysql.test.js +0 -126
  249. package/generators/tests/unit/lib/dbschema-kit/dialect/oracle.test.js +0 -126
  250. package/generators/tests/unit/lib/dbschema-kit/dialect/postgres.test.js +0 -131
  251. package/generators/tests/unit/lib/dbschema-kit/dialect/sqlite.test.js +0 -126
  252. package/generators/tests/unit/lib/dbschema-kit/driver-loader.test.js +0 -93
  253. package/generators/tests/unit/lib/dbschema-kit/emitters/create-index.test.js +0 -173
  254. package/generators/tests/unit/lib/dbschema-kit/emitters/create-table.test.js +0 -376
  255. package/generators/tests/unit/lib/dbschema-kit/emitters/drop-table.test.js +0 -78
  256. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/invalid-dialect.env +0 -6
  257. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/missing-dialect.env +0 -5
  258. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/missing-host.env +0 -5
  259. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/oracle-valid.env +0 -6
  260. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/postgres-valid.env +0 -7
  261. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/sqlite-valid.env +0 -2
  262. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/category.js +0 -11
  263. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/item_product.js +0 -11
  264. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/stock_inbound.js +0 -24
  265. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/stock_inbound_item.js +0 -28
  266. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/supplier.js +0 -9
  267. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/warehouse.js +0 -9
  268. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-invalid/orphan.js +0 -17
  269. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/category.js +0 -11
  270. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/item_product.js +0 -11
  271. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/supplier.js +0 -9
  272. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/warehouse.js +0 -9
  273. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/transactions/stock_inbound.js +0 -24
  274. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/transactions/stock_inbound_item.js +0 -28
  275. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/multi-schema/audit/events.js +0 -18
  276. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/multi-schema/inventory/products.js +0 -9
  277. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/multi-schema/public/users.js +0 -9
  278. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-subfolder/extra/category.js +0 -8
  279. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-subfolder/master/category.js +0 -8
  280. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-tablename/bar.js +0 -8
  281. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-tablename/foo.js +0 -8
  282. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/empty-folder/README.md +0 -1
  283. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/invalid-export/plain.js +0 -3
  284. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/invalid-schema/bad.js +0 -6
  285. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/legacy-pattern/legacy.js +0 -12
  286. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-distinct/audit/products.js +0 -9
  287. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-distinct/inventory/products.js +0 -9
  288. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-duplicate/a/products.js +0 -8
  289. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-duplicate/b/products.js +0 -8
  290. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/nested-deep/a/b/c/deep_table.js +0 -8
  291. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/.hidden/ignored.js +0 -7
  292. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/master/category.js +0 -8
  293. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/master/supplier.js +0 -8
  294. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/transactions/stock_inbound.js +0 -8
  295. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/transactions/stock_inbound_item.js +0 -8
  296. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/valid-multiple/category.js +0 -8
  297. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/valid-multiple/item_product.js +0 -9
  298. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/valid-single/category.js +0 -8
  299. package/generators/tests/unit/lib/dbschema-kit/integration.test.js +0 -217
  300. package/generators/tests/unit/lib/dbschema-kit/introspect-mapper.test.js +0 -403
  301. package/generators/tests/unit/lib/dbschema-kit/ir-builder.test.js +0 -390
  302. package/generators/tests/unit/lib/dbschema-kit/loader.test.js +0 -128
  303. package/generators/tests/unit/lib/dbschema-kit/naming.test.js +0 -170
  304. package/generators/tests/unit/lib/dbschema-kit/parser/shorthand-parser.test.js +0 -237
  305. package/generators/tests/unit/lib/dbschema-kit/schema-printer.test.js +0 -251
  306. package/generators/tests/unit/lib/dbschema-kit/statement-modifier.test.js +0 -105
  307. package/generators/tests/unit/lib/dbschema-kit/statement-splitter.test.js +0 -165
  308. package/generators/tests/unit/lib/dbschema-kit/topological-sort.test.js +0 -135
  309. package/generators/tests/unit/lib/dbschema-kit/validator/check-compatibility-validator.test.js +0 -373
  310. package/generators/tests/unit/lib/dbschema-kit/validator/circular-relation-validator.test.js +0 -454
  311. package/generators/tests/unit/lib/dbschema-kit/validator/cross-model-validator.test.js +0 -512
  312. package/generators/tests/unit/lib/dbschema-kit/validator/enhanced-validate-integration.test.js +0 -390
  313. package/generators/tests/unit/lib/dbschema-kit/validator/naming-convention-validator.test.js +0 -306
  314. package/generators/tests/unit/lib/dbschema-kit/validator/schema-validator.test.js +0 -443
  315. package/generators/tests/unit/lib/dbschema-kit/validator/type-compatibility-validator.test.js +0 -440
  316. package/generators/tests/unit/lib/dbschema-kit/validator/validator-reporter.test.js +0 -172
  317. package/generators/tests/unit/lib/metadata-manager-dashboard.test.js +0 -256
  318. package/generators/tests/unit/lib/payload-validator-fieldpolicy.test.js +0 -240
  319. package/generators/tests/unit/lib/processor-validation-generator.test.js +0 -300
  320. package/generators/tests/unit/lib/sensitive-field-masker.test.js +0 -170
  321. package/generators/tests/unit/lib/sql-table-extractor.test.js +0 -119
  322. package/scripts/generate-integrity-manifest.js +0 -124
  323. package/scripts/snapshot-cli-contracts.js +0 -194
  324. 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
- });