@restforgejs/platform 4.2.8 → 4.3.2

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 (325) 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/payload/payload-runner.js +1 -1
  25. package/generators/lib/templates/dashboard-catalog.js +1 -437
  26. package/generators/lib/templates/db-connection-env.js +1 -212
  27. package/generators/lib/templates/dbschema-catalog.js +1 -489
  28. package/generators/lib/templates/field-validation-catalog.js +1 -531
  29. package/generators/lib/templates/mysql-template.js +1 -3863
  30. package/generators/lib/templates/oracle-template.js +1 -3915
  31. package/generators/lib/templates/postgres-template.js +1 -5838
  32. package/generators/lib/templates/query-declarative-catalog.js +1 -199
  33. package/generators/lib/templates/sqlite-template.js +1 -3440
  34. package/generators/lib/utils/env-manager.js +6 -0
  35. package/generators/lib/utils/path-validator.js +71 -0
  36. package/generators/lib/validators/payload-validator.js +1 -2
  37. package/integrity-manifest.json +28 -10
  38. package/package.json +11 -3
  39. package/scripts/verify-integrity.js +1 -1
  40. package/server.js +1 -1
  41. package/src/components/handlers/adjust_handler.js +1 -1
  42. package/src/components/handlers/audit_handler.js +1 -1
  43. package/src/components/handlers/delete_handler.js +1 -1
  44. package/src/components/handlers/export_handler.js +1 -1
  45. package/src/components/handlers/import_handler.js +1 -1
  46. package/src/components/handlers/insert_handler.js +1 -1
  47. package/src/components/handlers/update_handler.js +1 -1
  48. package/src/components/handlers/upload_handler.js +1 -1
  49. package/src/components/handlers/workflow_handler.js +1 -1
  50. package/src/components/integrations/webhook.js +1 -1
  51. package/src/consumers/baseConsumer.js +1 -1
  52. package/src/consumers/declarativeMapper.js +1 -1
  53. package/src/consumers/handlers/apiHandler.js +1 -1
  54. package/src/consumers/handlers/consoleHandler.js +1 -1
  55. package/src/consumers/handlers/databaseHandler.js +1 -1
  56. package/src/consumers/handlers/index.js +1 -1
  57. package/src/consumers/handlers/kafkaHandler.js +1 -1
  58. package/src/consumers/index.js +1 -1
  59. package/src/consumers/messageTransformer.js +1 -1
  60. package/src/consumers/validator.js +1 -1
  61. package/src/core/db/dialect/base-dialect.js +1 -1
  62. package/src/core/db/dialect/index.js +1 -1
  63. package/src/core/db/dialect/mysql-dialect.js +1 -1
  64. package/src/core/db/dialect/oracle-dialect.js +1 -1
  65. package/src/core/db/dialect/postgres-dialect.js +1 -1
  66. package/src/core/db/dialect/sqlite-dialect.js +1 -1
  67. package/src/core/db/flatten-helper.js +1 -1
  68. package/src/core/db/query-builder-error.js +1 -1
  69. package/src/core/db/query-builder.js +1 -1
  70. package/src/core/db/relation-helper.js +1 -1
  71. package/src/core/handlers/delete_handler.js +1 -1
  72. package/src/core/handlers/insert_handler.js +1 -1
  73. package/src/core/handlers/update_handler.js +1 -1
  74. package/src/core/models/base-model.js +1 -1
  75. package/src/core/utils/cache-manager.js +1 -1
  76. package/src/core/utils/component-engine.js +1 -1
  77. package/src/core/utils/context-builder.js +1 -1
  78. package/src/core/utils/datetime-formatter.js +1 -1
  79. package/src/core/utils/datetime-parser.js +1 -1
  80. package/src/core/utils/db.js +1 -1
  81. package/src/core/utils/logger.js +1 -1
  82. package/src/core/utils/payload-loader.js +1 -1
  83. package/src/core/utils/security-checks.js +1 -1
  84. package/src/middleware/body-options.js +1 -1
  85. package/src/middleware/cors.js +1 -1
  86. package/src/middleware/idempotency.js +1 -1
  87. package/src/middleware/rate-limiter.js +1 -1
  88. package/src/middleware/request-logger.js +1 -1
  89. package/src/middleware/security-headers.js +1 -1
  90. package/src/models/base-model-mysql.js +1 -1
  91. package/src/models/base-model-oracle.js +1 -1
  92. package/src/models/base-model-sqlite.js +1 -1
  93. package/src/models/base-model.js +1 -1
  94. package/src/pro/caching/redis-client.js +1 -1
  95. package/src/pro/caching/redis-helper.js +1 -1
  96. package/src/pro/consumers/baseConsumer.js +1 -1
  97. package/src/pro/consumers/declarativeMapper.js +1 -1
  98. package/src/pro/consumers/handlers/apiHandler.js +1 -1
  99. package/src/pro/consumers/handlers/consoleHandler.js +1 -1
  100. package/src/pro/consumers/handlers/databaseHandler.js +1 -1
  101. package/src/pro/consumers/handlers/index.js +1 -1
  102. package/src/pro/consumers/handlers/kafkaHandler.js +1 -1
  103. package/src/pro/consumers/index.js +1 -1
  104. package/src/pro/consumers/messageTransformer.js +1 -1
  105. package/src/pro/consumers/validator.js +1 -1
  106. package/src/pro/database/base-model-mysql.js +1 -1
  107. package/src/pro/database/base-model-oracle.js +1 -1
  108. package/src/pro/database/base-model-sqlite.js +1 -1
  109. package/src/pro/database/db-mysql.js +1 -1
  110. package/src/pro/database/db-oracle.js +1 -1
  111. package/src/pro/database/db-sqlite.js +1 -1
  112. package/src/pro/excel/excel-generator.js +1 -1
  113. package/src/pro/excel/excel-parser.js +1 -1
  114. package/src/pro/excel/export-service.js +1 -1
  115. package/src/pro/excel/export_handler.js +1 -1
  116. package/src/pro/excel/import-service.js +1 -1
  117. package/src/pro/excel/import-validator.js +1 -1
  118. package/src/pro/excel/import_handler.js +1 -1
  119. package/src/pro/excel/upsert-builder.js +1 -1
  120. package/src/pro/idgen/idgen-routes.js +1 -1
  121. package/src/pro/integrations/lookup-resolver.js +1 -1
  122. package/src/pro/integrations/upload-handler-v2.js +1 -1
  123. package/src/pro/integrations/upload-handler.js +1 -1
  124. package/src/pro/integrations/webhook.js +1 -1
  125. package/src/pro/locking/lock-routes.js +1 -1
  126. package/src/pro/locking/resource-lock-manager.js +1 -1
  127. package/src/pro/messaging/kafkaConsumerService.js +1 -1
  128. package/src/pro/messaging/kafkaService.js +1 -1
  129. package/src/pro/messaging/messagehubService.js +1 -1
  130. package/src/pro/messaging/rabbitmqService.js +1 -1
  131. package/src/pro/scheduler/job-manager.js +1 -1
  132. package/src/pro/scheduler/job-routes.js +1 -1
  133. package/src/pro/scheduler/job-validator.js +1 -1
  134. package/src/pro/storage/base-storage-provider.js +1 -1
  135. package/src/pro/storage/file-metadata-helper.js +1 -1
  136. package/src/pro/storage/index.js +1 -1
  137. package/src/pro/storage/local-storage-provider.js +1 -1
  138. package/src/pro/storage/s3-storage-provider.js +1 -1
  139. package/src/pro/storage/upload-cleanup-job.js +1 -1
  140. package/src/pro/storage/upload-cleanup-scheduler.js +1 -1
  141. package/src/pro/storage/upload-pending-tracker.js +1 -1
  142. package/src/pro/websocket/broadcast-helper.js +1 -1
  143. package/src/pro/websocket/index.js +1 -1
  144. package/src/pro/websocket/livesync-server.js +1 -1
  145. package/src/pro/websocket/ws-broadcaster.js +1 -1
  146. package/src/services/export-service.js +1 -1
  147. package/src/services/import-service.js +1 -1
  148. package/src/services/kafkaConsumerService.js +1 -1
  149. package/src/services/kafkaService.js +1 -1
  150. package/src/services/messagehubService.js +1 -1
  151. package/src/services/rabbitmqService.js +1 -1
  152. package/src/utils/cache-invalidation-registry.js +1 -1
  153. package/src/utils/cache-manager.js +1 -1
  154. package/src/utils/component-engine.js +1 -1
  155. package/src/utils/config-extractor.js +1 -1
  156. package/src/utils/consumerLogger.js +1 -1
  157. package/src/utils/context-builder.js +1 -1
  158. package/src/utils/dashboard-helpers.js +1 -1
  159. package/src/utils/dateHelper.js +1 -1
  160. package/src/utils/datetime-formatter.js +1 -1
  161. package/src/utils/datetime-parser.js +1 -1
  162. package/src/utils/db-bootstrap.js +1 -1
  163. package/src/utils/db-mysql.js +1 -1
  164. package/src/utils/db-oracle.js +1 -1
  165. package/src/utils/db-sqlite.js +1 -1
  166. package/src/utils/db.js +1 -1
  167. package/src/utils/demo-generator.js +1 -1
  168. package/src/utils/excel-generator.js +1 -1
  169. package/src/utils/excel-parser.js +1 -1
  170. package/src/utils/file-watcher.js +1 -1
  171. package/src/utils/id-generator.js +1 -1
  172. package/src/utils/idempotency-manager.js +1 -1
  173. package/src/utils/import-validator.js +1 -1
  174. package/src/utils/license-client.js +1 -1
  175. package/src/utils/lock-manager.js +1 -1
  176. package/src/utils/logger.js +1 -1
  177. package/src/utils/lookup-resolver.js +1 -1
  178. package/src/utils/payload-loader.js +1 -1
  179. package/src/utils/processor-response.js +1 -1
  180. package/src/utils/rabbitmq.js +1 -1
  181. package/src/utils/redis-client.js +1 -1
  182. package/src/utils/redis-helper.js +1 -1
  183. package/src/utils/request-scope.js +1 -1
  184. package/src/utils/security-checks.js +1 -1
  185. package/src/utils/service-resolver.js +1 -1
  186. package/src/utils/shutdown-coordinator.js +1 -1
  187. package/src/utils/trusted-keys.js +1 -1
  188. package/src/utils/upload-handler.js +1 -1
  189. package/src/utils/upsert-builder.js +1 -1
  190. package/src/utils/workflow-hook-executor.js +1 -1
  191. package/generators/metadata/global.json +0 -58
  192. package/generators/metadata/test-mysql-workbench.json +0 -118
  193. package/generators/metadata/test-mysql.json +0 -56
  194. package/generators/metadata/test-oracle-workbench.json +0 -118
  195. package/generators/metadata/test-oracle.json +0 -56
  196. package/generators/metadata/test-pg-workbench.json +0 -118
  197. package/generators/metadata/test-pg.json +0 -56
  198. package/generators/scripts/obfuscate-source.js +0 -356
  199. package/generators/scripts/validate-catalog.js +0 -430
  200. package/generators/scripts/validate-dbschema-catalog.js +0 -708
  201. package/generators/tests/baseline/mysql/mini_inventory_item/src/models/mini-inventory/item.js +0 -944
  202. package/generators/tests/baseline/mysql/mini_inventory_item/src/modules/mini-inventory/item.js +0 -740
  203. package/generators/tests/baseline/mysql/mini_inventory_item/src/modules/mini-inventory.js +0 -336
  204. package/generators/tests/baseline/oracle/mini_inventory_item/src/models/mini-inventory/item.js +0 -1002
  205. package/generators/tests/baseline/oracle/mini_inventory_item/src/modules/mini-inventory/item.js +0 -740
  206. package/generators/tests/baseline/oracle/mini_inventory_item/src/modules/mini-inventory.js +0 -336
  207. package/generators/tests/baseline/postgres/mini_inventory_item/src/models/mini-inventory/item.js +0 -1333
  208. package/generators/tests/baseline/postgres/mini_inventory_item/src/modules/mini-inventory/item.js +0 -1173
  209. package/generators/tests/baseline/postgres/mini_inventory_item/src/modules/mini-inventory.js +0 -496
  210. package/generators/tests/fixtures/payloads/custom-sensitive.json +0 -27
  211. package/generators/tests/fixtures/payloads/dynamic-search-optout.json +0 -23
  212. package/generators/tests/fixtures/payloads/login-with-password.json +0 -22
  213. package/generators/tests/fixtures/payloads/order-process.json +0 -52
  214. package/generators/tests/fixtures/payloads/with-inline-sql.json +0 -26
  215. package/generators/tests/integration-tahap4b/README.md +0 -145
  216. package/generators/tests/integration-tahap4b/run-concurrent.js +0 -77
  217. package/generators/tests/integration-tahap4b/seed.sql +0 -53
  218. package/generators/tests/integration-tahap4b/verify.sql +0 -110
  219. package/generators/tests/unit/cli/create-dashboard.test.js +0 -505
  220. package/generators/tests/unit/cli/create-processor.test.js +0 -319
  221. package/generators/tests/unit/cli/dispatch-dashboard.test.js +0 -149
  222. package/generators/tests/unit/lib/dashboard-generator.test.js +0 -895
  223. package/generators/tests/unit/lib/dashboard-validator.test.js +0 -354
  224. package/generators/tests/unit/lib/dbschema-kit/apply-executor.test.js +0 -437
  225. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-introspect.test.js +0 -393
  226. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-generate-ddl.test.js +0 -104
  227. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-init.test.js +0 -119
  228. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-list.test.js +0 -48
  229. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-migrate.test.js +0 -175
  230. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-validate.test.js +0 -102
  231. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-models.test.js +0 -43
  232. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/all-schemas-listing.js +0 -84
  233. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/connection-error.js +0 -13
  234. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/empty.js +0 -12
  235. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/multi-schema.js +0 -124
  236. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/single-schema-inventory.js +0 -64
  237. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/two-tables.js +0 -66
  238. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/connection-error.js +0 -9
  239. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/partial.js +0 -29
  240. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/rollback.js +0 -26
  241. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/success.js +0 -43
  242. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/multi-schema/audit/events.js +0 -18
  243. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/multi-schema/inventory/products.js +0 -9
  244. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/multi-schema/users.js +0 -8
  245. package/generators/tests/unit/lib/dbschema-kit/connection.test.js +0 -112
  246. package/generators/tests/unit/lib/dbschema-kit/ddl-generator.test.js +0 -205
  247. package/generators/tests/unit/lib/dbschema-kit/define-model.test.js +0 -56
  248. package/generators/tests/unit/lib/dbschema-kit/dialect/index.test.js +0 -46
  249. package/generators/tests/unit/lib/dbschema-kit/dialect/mysql.test.js +0 -126
  250. package/generators/tests/unit/lib/dbschema-kit/dialect/oracle.test.js +0 -126
  251. package/generators/tests/unit/lib/dbschema-kit/dialect/postgres.test.js +0 -131
  252. package/generators/tests/unit/lib/dbschema-kit/dialect/sqlite.test.js +0 -126
  253. package/generators/tests/unit/lib/dbschema-kit/driver-loader.test.js +0 -93
  254. package/generators/tests/unit/lib/dbschema-kit/emitters/create-index.test.js +0 -173
  255. package/generators/tests/unit/lib/dbschema-kit/emitters/create-table.test.js +0 -376
  256. package/generators/tests/unit/lib/dbschema-kit/emitters/drop-table.test.js +0 -78
  257. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/invalid-dialect.env +0 -6
  258. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/missing-dialect.env +0 -5
  259. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/missing-host.env +0 -5
  260. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/oracle-valid.env +0 -6
  261. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/postgres-valid.env +0 -7
  262. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/sqlite-valid.env +0 -2
  263. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/category.js +0 -11
  264. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/item_product.js +0 -11
  265. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/stock_inbound.js +0 -24
  266. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/stock_inbound_item.js +0 -28
  267. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/supplier.js +0 -9
  268. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/warehouse.js +0 -9
  269. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-invalid/orphan.js +0 -17
  270. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/category.js +0 -11
  271. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/item_product.js +0 -11
  272. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/supplier.js +0 -9
  273. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/warehouse.js +0 -9
  274. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/transactions/stock_inbound.js +0 -24
  275. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/transactions/stock_inbound_item.js +0 -28
  276. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/multi-schema/audit/events.js +0 -18
  277. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/multi-schema/inventory/products.js +0 -9
  278. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/multi-schema/public/users.js +0 -9
  279. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-subfolder/extra/category.js +0 -8
  280. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-subfolder/master/category.js +0 -8
  281. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-tablename/bar.js +0 -8
  282. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-tablename/foo.js +0 -8
  283. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/empty-folder/README.md +0 -1
  284. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/invalid-export/plain.js +0 -3
  285. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/invalid-schema/bad.js +0 -6
  286. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/legacy-pattern/legacy.js +0 -12
  287. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-distinct/audit/products.js +0 -9
  288. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-distinct/inventory/products.js +0 -9
  289. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-duplicate/a/products.js +0 -8
  290. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-duplicate/b/products.js +0 -8
  291. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/nested-deep/a/b/c/deep_table.js +0 -8
  292. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/.hidden/ignored.js +0 -7
  293. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/master/category.js +0 -8
  294. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/master/supplier.js +0 -8
  295. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/transactions/stock_inbound.js +0 -8
  296. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/transactions/stock_inbound_item.js +0 -8
  297. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/valid-multiple/category.js +0 -8
  298. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/valid-multiple/item_product.js +0 -9
  299. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/valid-single/category.js +0 -8
  300. package/generators/tests/unit/lib/dbschema-kit/integration.test.js +0 -217
  301. package/generators/tests/unit/lib/dbschema-kit/introspect-mapper.test.js +0 -403
  302. package/generators/tests/unit/lib/dbschema-kit/ir-builder.test.js +0 -390
  303. package/generators/tests/unit/lib/dbschema-kit/loader.test.js +0 -128
  304. package/generators/tests/unit/lib/dbschema-kit/naming.test.js +0 -170
  305. package/generators/tests/unit/lib/dbschema-kit/parser/shorthand-parser.test.js +0 -237
  306. package/generators/tests/unit/lib/dbschema-kit/schema-printer.test.js +0 -251
  307. package/generators/tests/unit/lib/dbschema-kit/statement-modifier.test.js +0 -105
  308. package/generators/tests/unit/lib/dbschema-kit/statement-splitter.test.js +0 -165
  309. package/generators/tests/unit/lib/dbschema-kit/topological-sort.test.js +0 -135
  310. package/generators/tests/unit/lib/dbschema-kit/validator/check-compatibility-validator.test.js +0 -373
  311. package/generators/tests/unit/lib/dbschema-kit/validator/circular-relation-validator.test.js +0 -454
  312. package/generators/tests/unit/lib/dbschema-kit/validator/cross-model-validator.test.js +0 -512
  313. package/generators/tests/unit/lib/dbschema-kit/validator/enhanced-validate-integration.test.js +0 -390
  314. package/generators/tests/unit/lib/dbschema-kit/validator/naming-convention-validator.test.js +0 -306
  315. package/generators/tests/unit/lib/dbschema-kit/validator/schema-validator.test.js +0 -443
  316. package/generators/tests/unit/lib/dbschema-kit/validator/type-compatibility-validator.test.js +0 -440
  317. package/generators/tests/unit/lib/dbschema-kit/validator/validator-reporter.test.js +0 -172
  318. package/generators/tests/unit/lib/metadata-manager-dashboard.test.js +0 -256
  319. package/generators/tests/unit/lib/payload-validator-fieldpolicy.test.js +0 -240
  320. package/generators/tests/unit/lib/processor-validation-generator.test.js +0 -300
  321. package/generators/tests/unit/lib/sensitive-field-masker.test.js +0 -170
  322. package/generators/tests/unit/lib/sql-table-extractor.test.js +0 -119
  323. package/scripts/generate-integrity-manifest.js +0 -124
  324. package/scripts/snapshot-cli-contracts.js +0 -194
  325. package/scripts/verify-publish.js +0 -56
@@ -1,443 +0,0 @@
1
- 'use strict';
2
-
3
- const test = require('node:test');
4
- const assert = require('node:assert');
5
-
6
- const { buildIR } = require('../../../../../lib/dbschema-kit/ir-builder');
7
- const { validateSchema } = require('../../../../../lib/dbschema-kit/validator/schema-validator');
8
-
9
- // =====================================================
10
- // Group 1: Table Level
11
- // =====================================================
12
-
13
- test('validator: tableName snake_case + ada PK tidak throw', () => {
14
- const ir = buildIR('stock_inbound', { fields: { id: 'uuid pk' } });
15
- assert.doesNotThrow(() => validateSchema(ir));
16
- });
17
-
18
- test('validator: tableName mengandung uppercase harus throw', () => {
19
- const ir = buildIR('StockInbound', { fields: { id: 'uuid pk' } });
20
- assert.throws(
21
- () => validateSchema(ir),
22
- /^Error: Table name must be snake_case \(lowercase, alphanumeric, underscore, no leading digit\)$/
23
- );
24
- });
25
-
26
- test('validator: tableName leading digit harus throw', () => {
27
- const ir = buildIR('1foo', { fields: { id: 'uuid pk' } });
28
- assert.throws(
29
- () => validateSchema(ir),
30
- /^Error: Table name must be snake_case \(lowercase, alphanumeric, underscore, no leading digit\)$/
31
- );
32
- });
33
-
34
- test("validator: konflik 'pk' shorthand + 'primaryKey' option harus throw", () => {
35
- const ir = buildIR('foo', {
36
- fields: { a: 'uuid pk', b: 'uuid' },
37
- primaryKey: ['a', 'b']
38
- });
39
- assert.throws(
40
- () => validateSchema(ir),
41
- /^Error: Table 'foo': cannot use 'pk' shorthand together with 'primaryKey' option$/
42
- );
43
- });
44
-
45
- // =====================================================
46
- // Group 2: Field References Existence
47
- // =====================================================
48
-
49
- test('validator: primaryKey reference field tidak existing harus throw', () => {
50
- const ir = buildIR('foo', {
51
- fields: { a: 'uuid', b: 'uuid' },
52
- primaryKey: ['a', 'nonexistent']
53
- });
54
- assert.throws(
55
- () => validateSchema(ir),
56
- /^Error: Table 'foo': primaryKey references unknown field 'nonexistent'$/
57
- );
58
- });
59
-
60
- test('validator: indexes reference field tidak existing harus throw', () => {
61
- const ir = buildIR('foo', {
62
- fields: { id: 'uuid pk', name: 'string:50' },
63
- indexes: ['nonexistent']
64
- });
65
- assert.throws(
66
- () => validateSchema(ir),
67
- /^Error: Table 'foo': index references unknown field 'nonexistent'$/
68
- );
69
- });
70
-
71
- test('validator: uniques reference field tidak existing harus throw', () => {
72
- const ir = buildIR('foo', {
73
- fields: { id: 'uuid pk', a: 'string:50' },
74
- uniques: [['a', 'nonexistent']]
75
- });
76
- assert.throws(
77
- () => validateSchema(ir),
78
- /^Error: Table 'foo': unique constraint references unknown field 'nonexistent'$/
79
- );
80
- });
81
-
82
- test('validator: relations.localKey reference field tidak existing harus throw', () => {
83
- const ir = buildIR('foo', {
84
- fields: { id: 'uuid pk' },
85
- relations: {
86
- bar: { type: 'belongsTo', localKey: 'nonexistent_field', references: 'id' }
87
- }
88
- });
89
- assert.throws(
90
- () => validateSchema(ir),
91
- /^Error: Table 'foo': relation 'bar' references unknown field 'nonexistent_field'$/
92
- );
93
- });
94
-
95
- test('validator: checks.field reference field tidak existing harus throw', () => {
96
- const ir = buildIR('foo', {
97
- fields: { id: 'uuid pk' },
98
- checks: [{ field: 'nonexistent', gt: 0 }]
99
- });
100
- assert.throws(
101
- () => validateSchema(ir),
102
- /^Error: Table 'foo': check at index 0 references unknown field 'nonexistent'$/
103
- );
104
- });
105
-
106
- // =====================================================
107
- // Group 3: Relations
108
- // =====================================================
109
-
110
- test('validator: relation tanpa type atau type invalid harus throw', () => {
111
- const ir = buildIR('foo', {
112
- fields: { id: 'uuid pk', a: 'uuid' },
113
- relations: {
114
- bar: { localKey: 'a', references: 'id' }
115
- }
116
- });
117
- assert.throws(
118
- () => validateSchema(ir),
119
- /^Error: Table 'foo': relation 'bar' has invalid or missing type 'undefined'$/
120
- );
121
-
122
- const ir2 = buildIR('foo', {
123
- fields: { id: 'uuid pk', a: 'uuid' },
124
- relations: {
125
- bar: { type: 'belongsToMany', localKey: 'a', references: 'id' }
126
- }
127
- });
128
- assert.throws(
129
- () => validateSchema(ir2),
130
- /^Error: Table 'foo': relation 'bar' has invalid or missing type 'belongsToMany'$/
131
- );
132
- });
133
-
134
- test('validator: relation tanpa localKey harus throw', () => {
135
- const ir = buildIR('foo', {
136
- fields: { id: 'uuid pk' },
137
- relations: {
138
- bar: { type: 'belongsTo', references: 'id' }
139
- }
140
- });
141
- assert.throws(
142
- () => validateSchema(ir),
143
- /^Error: Table 'foo': relation 'bar' missing 'localKey' property$/
144
- );
145
- });
146
-
147
- test('validator: relation tanpa references harus throw', () => {
148
- const ir = buildIR('foo', {
149
- fields: { id: 'uuid pk', a: 'uuid' },
150
- relations: {
151
- bar: { type: 'belongsTo', localKey: 'a' }
152
- }
153
- });
154
- assert.throws(
155
- () => validateSchema(ir),
156
- /^Error: Table 'foo': relation 'bar' missing 'references' property$/
157
- );
158
- });
159
-
160
- test('validator: invalid onDelete value harus throw', () => {
161
- const ir = buildIR('foo', {
162
- fields: { id: 'uuid pk', a: 'uuid' },
163
- relations: {
164
- bar: { type: 'belongsTo', localKey: 'a', references: 'id', onDelete: 'set null' }
165
- }
166
- });
167
- assert.throws(
168
- () => validateSchema(ir),
169
- /^Error: Table 'foo': relation 'bar' has invalid onDelete 'set null'$/
170
- );
171
-
172
- const ir2 = buildIR('foo', {
173
- fields: { id: 'uuid pk', a: 'uuid' },
174
- relations: {
175
- bar: { type: 'belongsTo', localKey: 'a', references: 'id', onDelete: 'SET_NULL' }
176
- }
177
- });
178
- assert.throws(
179
- () => validateSchema(ir2),
180
- /^Error: Table 'foo': relation 'bar' has invalid onDelete 'SET_NULL'$/
181
- );
182
- });
183
-
184
- test('validator: invalid onUpdate value harus throw', () => {
185
- const ir = buildIR('foo', {
186
- fields: { id: 'uuid pk', a: 'uuid' },
187
- relations: {
188
- bar: { type: 'belongsTo', localKey: 'a', references: 'id', onUpdate: 'cascadex' }
189
- }
190
- });
191
- assert.throws(
192
- () => validateSchema(ir),
193
- /^Error: Table 'foo': relation 'bar' has invalid onUpdate 'cascadex'$/
194
- );
195
- });
196
-
197
- test("validator: mutual exclusivity 'fk:' shorthand + relations[*].localKey harus throw", () => {
198
- const ir = buildIR('item_product', {
199
- fields: {
200
- id: 'uuid pk',
201
- category_id: 'string:36 fk:category.category_id'
202
- },
203
- relations: {
204
- category: {
205
- type: 'belongsTo',
206
- localKey: 'category_id',
207
- references: 'category_id',
208
- onDelete: 'cascade'
209
- }
210
- }
211
- });
212
- assert.throws(
213
- () => validateSchema(ir),
214
- /^Error: Table 'item_product': field 'category_id' has 'fk:' shorthand and is also referenced by relation 'category'\. Use only one declaration method\.$/
215
- );
216
- });
217
-
218
- test("validator: auto-generated relation dengan suffix '_auto' harus throw collision", () => {
219
- const ir = buildIR('foo', {
220
- fields: {
221
- id: 'uuid pk',
222
- b_id: 'string:36 fk:b_table.id',
223
- other: 'uuid'
224
- },
225
- relations: {
226
- b: { type: 'belongsTo', localKey: 'other', references: 'id' }
227
- }
228
- });
229
- assert.throws(
230
- () => validateSchema(ir),
231
- /^Error: Table 'foo': auto-generated relation name 'b' from field 'b_id' conflicts with explicit relation 'b'\. Rename one of them\.$/
232
- );
233
- });
234
-
235
- test('validator: duplikat localKey di dua relations eksplisit harus throw', () => {
236
- const ir = buildIR('foo', {
237
- fields: { id: 'uuid pk', a: 'uuid' },
238
- relations: {
239
- rel1: { type: 'belongsTo', localKey: 'a', references: 'id' },
240
- rel2: { type: 'belongsTo', localKey: 'a', references: 'id' }
241
- }
242
- });
243
- assert.throws(
244
- () => validateSchema(ir),
245
- /^Error: Table 'foo': field 'a' is referenced by multiple relations: rel1, rel2$/
246
- );
247
- });
248
-
249
- // =====================================================
250
- // Group 4: Checks
251
- // =====================================================
252
-
253
- test("validator: check dengan _invalid 'multiple operators' harus throw", () => {
254
- const ir = buildIR('foo', {
255
- fields: { id: 'uuid pk', x: 'integer' },
256
- checks: [{ field: 'x', gt: 0, lt: 100 }]
257
- });
258
- assert.throws(
259
- () => validateSchema(ir),
260
- /^Error: Table 'foo': check at index 0 has multiple operators \(use one of: in, gt, gte, lt, lte, eq, neq\)$/
261
- );
262
- });
263
-
264
- test("validator: check dengan _invalid 'no operator' harus throw", () => {
265
- const ir = buildIR('foo', {
266
- fields: { id: 'uuid pk', x: 'integer' },
267
- checks: [{ field: 'x' }]
268
- });
269
- assert.throws(
270
- () => validateSchema(ir),
271
- /^Error: Table 'foo': check at index 0 must have exactly one operator \(use one of: in, gt, gte, lt, lte, eq, neq\)$/
272
- );
273
- });
274
-
275
- test("validator: operator 'in' value bukan array atau array kosong harus throw", () => {
276
- const ir = buildIR('foo', {
277
- fields: { id: 'uuid pk', status: 'string:20' },
278
- checks: [{ field: 'status', in: 'draft' }]
279
- });
280
- assert.throws(
281
- () => validateSchema(ir),
282
- /^Error: Table 'foo': check at index 0 operator 'in' requires non-empty array of values$/
283
- );
284
-
285
- const ir2 = buildIR('foo', {
286
- fields: { id: 'uuid pk', status: 'string:20' },
287
- checks: [{ field: 'status', in: [] }]
288
- });
289
- assert.throws(
290
- () => validateSchema(ir2),
291
- /^Error: Table 'foo': check at index 0 operator 'in' requires non-empty array of values$/
292
- );
293
- });
294
-
295
- test("validator: operator 'gt' value non-number harus throw", () => {
296
- const ir = buildIR('foo', {
297
- fields: { id: 'uuid pk', x: 'integer' },
298
- checks: [{ field: 'x', gt: '0' }]
299
- });
300
- assert.throws(
301
- () => validateSchema(ir),
302
- /^Error: Table 'foo': check at index 0 operator 'gt' requires numeric value, got 'string'$/
303
- );
304
- });
305
-
306
- // =====================================================
307
- // Group 5: AutoUpdate
308
- // =====================================================
309
-
310
- test("validator: autoUpdate di field type 'string' harus throw", () => {
311
- const ir = buildIR('foo', {
312
- fields: {
313
- id: 'uuid pk',
314
- name: 'string:50 autoUpdate'
315
- }
316
- });
317
- assert.throws(
318
- () => validateSchema(ir),
319
- /^Error: Table 'foo': field 'name' constraint 'autoUpdate' only valid for type 'timestamp' or 'date', got 'string'$/
320
- );
321
- });
322
-
323
- test("validator: autoUpdate di field type 'integer' harus throw", () => {
324
- const ir = buildIR('foo', {
325
- fields: {
326
- id: 'uuid pk',
327
- counter: 'integer autoUpdate'
328
- }
329
- });
330
- assert.throws(
331
- () => validateSchema(ir),
332
- /^Error: Table 'foo': field 'counter' constraint 'autoUpdate' only valid for type 'timestamp' or 'date', got 'integer'$/
333
- );
334
- });
335
-
336
- test("validator: autoUpdate + default:now() di field timestamp harus throw", () => {
337
- const ir = buildIR('foo', {
338
- fields: {
339
- id: 'uuid pk',
340
- updated_at: 'timestamp default:now() autoUpdate'
341
- }
342
- });
343
- assert.throws(
344
- () => validateSchema(ir),
345
- /^Error: Table 'foo': field 'updated_at' constraint 'autoUpdate' cannot be combined with 'default:'$/
346
- );
347
- });
348
-
349
- // =====================================================
350
- // Bonus: Complex valid schema
351
- // =====================================================
352
-
353
- test('validator: schema valid kompleks (multiple relations, indexes, uniques, checks) tidak throw', () => {
354
- const ir = buildIR('stock_inbound_item', {
355
- fields: {
356
- stock_inbound_item_id: 'uuid pk',
357
- stock_inbound_id: 'uuid notnull',
358
- line_number: 'integer notnull',
359
- item_product_id: 'uuid notnull',
360
- qty_received: 'decimal:15,0 notnull default:0',
361
- uom: "string:10 default:'pcs'",
362
- unit_price: 'decimal:15,2 default:0',
363
- total_amount: 'decimal:15,2 default:0',
364
- status: "string:20 default:'draft'",
365
- notes: 'text',
366
- created_at: 'timestamp',
367
- updated_at: 'timestamp autoUpdate'
368
- },
369
- uniques: [['stock_inbound_id', 'line_number']],
370
- indexes: ['stock_inbound_id', 'item_product_id', ['stock_inbound_id', 'item_product_id']],
371
- relations: {
372
- header: {
373
- type: 'belongsTo',
374
- target: 'stock_inbound',
375
- localKey: 'stock_inbound_id',
376
- references: 'stock_inbound_id',
377
- onDelete: 'cascade'
378
- },
379
- product: {
380
- type: 'belongsTo',
381
- target: 'item_product',
382
- localKey: 'item_product_id',
383
- references: 'item_product_id',
384
- onDelete: 'restrict'
385
- }
386
- },
387
- checks: [
388
- { field: 'status', in: ['draft', 'confirmed', 'closed', 'cancelled'] },
389
- { field: 'line_number', gt: 0 },
390
- { field: 'unit_price', gte: 0 }
391
- ]
392
- });
393
- let result;
394
- assert.doesNotThrow(() => {
395
- result = validateSchema(ir);
396
- });
397
- assert.strictEqual(result, undefined, 'validateSchema returns undefined on success');
398
- });
399
-
400
- // =====================================================
401
- // Phase 13: schema namespace support
402
- // =====================================================
403
-
404
- test('validator: schema valid (snake_case) tidak throw, IR berisi schemaName', () => {
405
- const ir = buildIR('products', {
406
- schema: 'inventory',
407
- fields: { id: 'uuid pk' }
408
- });
409
- assert.doesNotThrow(() => validateSchema(ir));
410
- assert.strictEqual(ir.schemaName, 'inventory');
411
- assert.strictEqual(ir.qualifiedName, 'inventory.products');
412
- });
413
-
414
- test('validator: schema mengandung uppercase atau hyphen harus throw', () => {
415
- const ir = buildIR('products', {
416
- schema: 'INVALID-NAME',
417
- fields: { id: 'uuid pk' }
418
- });
419
- assert.throws(
420
- () => validateSchema(ir),
421
- /^Error: Table 'INVALID-NAME\.products': invalid schema name 'INVALID-NAME'$/
422
- );
423
- });
424
-
425
- test('validator: schema empty string harus throw', () => {
426
- // Empty string is treated as null by IR builder (default null), so it does NOT throw.
427
- // Use explicit invalid string for the negative test.
428
- const ir = buildIR('products', {
429
- schema: '_starts_with_underscore',
430
- fields: { id: 'uuid pk' }
431
- });
432
- assert.throws(
433
- () => validateSchema(ir),
434
- /^Error: Table '_starts_with_underscore\.products': invalid schema name '_starts_with_underscore'$/
435
- );
436
- });
437
-
438
- test('validator: tanpa schema → IR.schemaName null, qualifiedName == tableName, no error', () => {
439
- const ir = buildIR('products', { fields: { id: 'uuid pk' } });
440
- assert.strictEqual(ir.schemaName, null);
441
- assert.strictEqual(ir.qualifiedName, 'products');
442
- assert.doesNotThrow(() => validateSchema(ir));
443
- });