@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,256 +0,0 @@
1
- 'use strict';
2
-
3
- const test = require('node:test');
4
- const { before, after } = require('node:test');
5
- const assert = require('node:assert');
6
- const fs = require('fs');
7
- const os = require('os');
8
- const path = require('path');
9
-
10
- const MetadataManager = require('../../../lib/utils/metadata-manager');
11
- const ConfigReader = require('../../../lib/config/config-reader');
12
-
13
- function makeTmpDir() {
14
- return fs.mkdtempSync(path.join(os.tmpdir(), 'metadata-dash-test-'));
15
- }
16
-
17
- function cleanupTmpDir(dir) {
18
- try {
19
- fs.rmSync(dir, { recursive: true, force: true });
20
- } catch (err) {
21
- // best-effort cleanup
22
- }
23
- }
24
-
25
- /**
26
- * Override ConfigReader.getWorkingDirectory selama eksekusi callback.
27
- * Pendekatan ini menghindari mutasi process.cwd() global yang bisa
28
- * bocor antar test paralel.
29
- */
30
- function withWorkingDir(dir, fn) {
31
- const original = ConfigReader.getWorkingDirectory;
32
- ConfigReader.getWorkingDirectory = () => dir;
33
- try {
34
- return fn();
35
- } finally {
36
- ConfigReader.getWorkingDirectory = original;
37
- }
38
- }
39
-
40
- async function withWorkingDirAsync(dir, fn) {
41
- const original = ConfigReader.getWorkingDirectory;
42
- ConfigReader.getWorkingDirectory = () => dir;
43
- try {
44
- return await fn();
45
- } finally {
46
- ConfigReader.getWorkingDirectory = original;
47
- }
48
- }
49
-
50
- // Suppress noisy console output dari MetadataManager.writeModuleMetadata
51
- // dan FileUtils.ensureDirectoryExists tanpa menyembunyikan error.
52
- let _originalLog;
53
- let _originalWarn;
54
- before(() => {
55
- _originalLog = console.log;
56
- _originalWarn = console.warn;
57
- console.log = () => {};
58
- console.warn = () => {};
59
- });
60
- after(() => {
61
- console.log = _originalLog;
62
- console.warn = _originalWarn;
63
- });
64
-
65
- function readMetadata(tmpDir, moduleName) {
66
- const filePath = path.join(tmpDir, 'metadata', `${moduleName}.json`);
67
- return JSON.parse(fs.readFileSync(filePath, 'utf8'));
68
- }
69
-
70
- function buildSinglePayload() {
71
- return {
72
- widgets: [
73
- { id: 'author_sales', query: 'SELECT 1' }
74
- ]
75
- };
76
- }
77
-
78
- function buildMultiWidgetPayload() {
79
- return {
80
- widgets: [
81
- { id: 'author_sales', query: 'SELECT 1' },
82
- { id: 'sales_statistics', query: 'SELECT 2' },
83
- { id: 'sales_this_months', queries: { value: 'SELECT 3', points: 'SELECT 4' } }
84
- ]
85
- };
86
- }
87
-
88
- // ===== Test cases =====
89
-
90
- test('create initial metadata: file dibuat dengan entry dash-{name} bertipe dashboard', () => {
91
- const tmpDir = makeTmpDir();
92
- try {
93
- withWorkingDir(tmpDir, () => {
94
- const payload = buildSinglePayload();
95
-
96
- const ok = MetadataManager.updateDashboardMetadata('mini-inventory', 'dash-sales', payload, 'postgres');
97
- assert.strictEqual(ok, true, 'method harus return true');
98
-
99
- const metadataFile = path.join(tmpDir, 'metadata', 'mini-inventory.json');
100
- assert.strictEqual(fs.existsSync(metadataFile), true, 'metadata file harus dibuat');
101
-
102
- const metadata = readMetadata(tmpDir, 'mini-inventory');
103
- assert.ok('dash-sales' in metadata.endpoints, 'entry dash-sales harus ada');
104
-
105
- const entry = metadata.endpoints['dash-sales'];
106
- assert.strictEqual(entry.type, 'dashboard');
107
- assert.strictEqual(entry.widgetCount, 1);
108
- assert.deepStrictEqual(entry.widgetIds, ['author_sales']);
109
- assert.strictEqual(entry.databaseType, 'postgres');
110
- assert.strictEqual(entry.path, 'src/modules/mini-inventory/dash-sales.js');
111
- assert.strictEqual(entry.statistics.timesGenerated, 1);
112
- });
113
- } finally {
114
- cleanupTmpDir(tmpDir);
115
- }
116
- });
117
-
118
- test('update timesGenerated increment: dua panggilan beruntun → timesGenerated 2 dan createdAt tidak berubah', async () => {
119
- const tmpDir = makeTmpDir();
120
- try {
121
- await withWorkingDirAsync(tmpDir, async () => {
122
- const payload = buildSinglePayload();
123
-
124
- MetadataManager.updateDashboardMetadata('mini-inventory', 'dash-sales', payload, 'postgres');
125
- const first = readMetadata(tmpDir, 'mini-inventory').endpoints['dash-sales'];
126
-
127
- // Tunggu sebentar agar updatedAt berbeda secara observasi
128
- await new Promise((resolve) => setTimeout(resolve, 10));
129
-
130
- MetadataManager.updateDashboardMetadata('mini-inventory', 'dash-sales', payload, 'postgres');
131
- const second = readMetadata(tmpDir, 'mini-inventory').endpoints['dash-sales'];
132
-
133
- assert.strictEqual(second.statistics.timesGenerated, 2);
134
- assert.strictEqual(second.createdAt, first.createdAt, 'createdAt harus tetap dari invocation pertama');
135
- assert.ok(second.updatedAt >= first.updatedAt, 'updatedAt harus sama atau lebih baru');
136
- });
137
- } finally {
138
- cleanupTmpDir(tmpDir);
139
- }
140
- });
141
-
142
- test('multi widget metadata: payload 3 widget → widgetCount 3 dan widgetIds urutan match', () => {
143
- const tmpDir = makeTmpDir();
144
- try {
145
- withWorkingDir(tmpDir, () => {
146
- const payload = buildMultiWidgetPayload();
147
-
148
- MetadataManager.updateDashboardMetadata('mini-inventory', 'dash-sales', payload, 'postgres');
149
-
150
- const entry = readMetadata(tmpDir, 'mini-inventory').endpoints['dash-sales'];
151
- assert.strictEqual(entry.widgetCount, 3);
152
- assert.deepStrictEqual(
153
- entry.widgetIds,
154
- ['author_sales', 'sales_statistics', 'sales_this_months']
155
- );
156
- });
157
- } finally {
158
- cleanupTmpDir(tmpDir);
159
- }
160
- });
161
-
162
- test('params contract metadata: payload dengan params {from,to} → keyCount 2 dan keys match', () => {
163
- const tmpDir = makeTmpDir();
164
- try {
165
- withWorkingDir(tmpDir, () => {
166
- const payload = {
167
- widgets: [{ id: 'w1', query: 'SELECT 1' }],
168
- params: {
169
- from: { type: 'date', required: true },
170
- to: { type: 'date', required: true }
171
- }
172
- };
173
-
174
- MetadataManager.updateDashboardMetadata('mini-inventory', 'dash-sales', payload, 'postgres');
175
-
176
- const entry = readMetadata(tmpDir, 'mini-inventory').endpoints['dash-sales'];
177
- assert.strictEqual(entry.paramsContract.keyCount, 2);
178
- assert.deepStrictEqual(entry.paramsContract.keys, ['from', 'to']);
179
- });
180
- } finally {
181
- cleanupTmpDir(tmpDir);
182
- }
183
- });
184
-
185
- test('empty params: payload tanpa params → keyCount 0 dan keys array kosong', () => {
186
- const tmpDir = makeTmpDir();
187
- try {
188
- withWorkingDir(tmpDir, () => {
189
- const payload = buildSinglePayload();
190
-
191
- MetadataManager.updateDashboardMetadata('mini-inventory', 'dash-sales', payload, 'postgres');
192
-
193
- const entry = readMetadata(tmpDir, 'mini-inventory').endpoints['dash-sales'];
194
- assert.strictEqual(entry.paramsContract.keyCount, 0);
195
- assert.deepStrictEqual(entry.paramsContract.keys, []);
196
- });
197
- } finally {
198
- cleanupTmpDir(tmpDir);
199
- }
200
- });
201
-
202
- test('coexist dengan endpoint CRUD: keduanya tetap ada di endpoints dengan endpointsByType yang benar', () => {
203
- const tmpDir = makeTmpDir();
204
- try {
205
- withWorkingDir(tmpDir, () => {
206
- const crudPayload = {
207
- tableName: 'products',
208
- action: { create: true, read: true },
209
- fieldName: ['id', 'name', 'price']
210
- };
211
- MetadataManager.updateEndpointMetadata('mini-inventory', 'products', crudPayload, 'postgres');
212
-
213
- const dashPayload = buildSinglePayload();
214
- MetadataManager.updateDashboardMetadata('mini-inventory', 'dash-sales', dashPayload, 'postgres');
215
-
216
- const metadata = readMetadata(tmpDir, 'mini-inventory');
217
- assert.ok('products' in metadata.endpoints, 'endpoint CRUD harus tetap ada');
218
- assert.ok('dash-sales' in metadata.endpoints, 'endpoint dashboard harus ada');
219
-
220
- assert.strictEqual(metadata.endpoints['products'].type, 'module');
221
- assert.strictEqual(metadata.endpoints['dash-sales'].type, 'dashboard');
222
-
223
- assert.strictEqual(metadata.statistics.endpointsByType.module, 1);
224
- assert.strictEqual(metadata.statistics.endpointsByType.dashboard, 1);
225
- });
226
- } finally {
227
- cleanupTmpDir(tmpDir);
228
- }
229
- });
230
-
231
- test('statistics totalEndpoints: dashboard ditambahkan ke module dengan 2 CRUD → totalEndpoints 3', () => {
232
- const tmpDir = makeTmpDir();
233
- try {
234
- withWorkingDir(tmpDir, () => {
235
- const crudPayload1 = {
236
- tableName: 'products',
237
- action: { create: true },
238
- fieldName: ['id', 'name']
239
- };
240
- const crudPayload2 = {
241
- tableName: 'orders',
242
- action: { create: true, read: true },
243
- fieldName: ['id', 'total']
244
- };
245
- MetadataManager.updateEndpointMetadata('mini-inventory', 'products', crudPayload1, 'postgres');
246
- MetadataManager.updateEndpointMetadata('mini-inventory', 'orders', crudPayload2, 'postgres');
247
-
248
- MetadataManager.updateDashboardMetadata('mini-inventory', 'dash-sales', buildSinglePayload(), 'postgres');
249
-
250
- const metadata = readMetadata(tmpDir, 'mini-inventory');
251
- assert.strictEqual(metadata.statistics.totalEndpoints, 3);
252
- });
253
- } finally {
254
- cleanupTmpDir(tmpDir);
255
- }
256
- });
@@ -1,240 +0,0 @@
1
- const test = require('node:test');
2
- const assert = require('node:assert');
3
-
4
- const PayloadValidator = require('../../../lib/validators/payload-validator');
5
-
6
- const FILE = 'sample.json';
7
- const FIELDS = ['id', 'salary', 'bonus', 'name'];
8
-
9
- function expectThrowsWithMessage(fn, expectedSubstring) {
10
- let thrown = null;
11
- try {
12
- fn();
13
- } catch (err) {
14
- thrown = err;
15
- }
16
- assert.ok(thrown, 'Expected function to throw, but it did not');
17
- assert.match(
18
- thrown.message,
19
- new RegExp(expectedSubstring.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')),
20
- `Expected error message to contain: ${expectedSubstring}\nActual: ${thrown.message}`
21
- );
22
- return thrown;
23
- }
24
-
25
- test('validateFieldPolicy: strategies ["lock"] valid', () => {
26
- const policy = { salary: { strategies: ['lock'] } };
27
- assert.doesNotThrow(() => {
28
- PayloadValidator.validateFieldPolicy(policy, FIELDS, FILE);
29
- });
30
- });
31
-
32
- test('validateFieldPolicy: strategies ["audit"] valid', () => {
33
- const policy = { salary: { strategies: ['audit'] } };
34
- assert.doesNotThrow(() => {
35
- PayloadValidator.validateFieldPolicy(policy, FIELDS, FILE);
36
- });
37
- });
38
-
39
- test('validateFieldPolicy: strategies ["lock", "audit"] valid (kombinasi umum)', () => {
40
- const policy = { salary: { strategies: ['lock', 'audit'] } };
41
- assert.doesNotThrow(() => {
42
- PayloadValidator.validateFieldPolicy(policy, FIELDS, FILE);
43
- });
44
- });
45
-
46
- test('validateFieldPolicy: multi-kolom dengan strategies berbeda valid', () => {
47
- const policy = {
48
- salary: { strategies: ['lock', 'audit'] },
49
- bonus: { strategies: ['lock'] }
50
- };
51
- assert.doesNotThrow(() => {
52
- PayloadValidator.validateFieldPolicy(policy, FIELDS, FILE);
53
- });
54
- });
55
-
56
- test('validateFieldPolicy: strategies kosong [] menolak', () => {
57
- const policy = { salary: { strategies: [] } };
58
- expectThrowsWithMessage(
59
- () => PayloadValidator.validateFieldPolicy(policy, FIELDS, FILE),
60
- 'fieldPolicy.salary.strategies in sample.json is required and must be a non-empty array of strings'
61
- );
62
- });
63
-
64
- test('validateFieldPolicy: strategies tanpa property menolak', () => {
65
- const policy = { salary: {} };
66
- expectThrowsWithMessage(
67
- () => PayloadValidator.validateFieldPolicy(policy, FIELDS, FILE),
68
- 'fieldPolicy.salary.strategies in sample.json is required and must be a non-empty array of strings'
69
- );
70
- });
71
-
72
- test('validateFieldPolicy: strategy "condition" menolak dengan pesan Phase 2', () => {
73
- const policy = { salary: { strategies: ['condition'] } };
74
- const err = expectThrowsWithMessage(
75
- () => PayloadValidator.validateFieldPolicy(policy, FIELDS, FILE),
76
- "includes 'condition' which is planned for Phase 2"
77
- );
78
- assert.match(err.message, /docs\/todo\/todo-fieldpolicy-extension\.md/);
79
- });
80
-
81
- test('validateFieldPolicy: strategy "version" menolak dengan pesan Phase 2', () => {
82
- const policy = { salary: { strategies: ['version'] } };
83
- const err = expectThrowsWithMessage(
84
- () => PayloadValidator.validateFieldPolicy(policy, FIELDS, FILE),
85
- "includes 'version' which is planned for Phase 2"
86
- );
87
- assert.match(err.message, /docs\/todo\/todo-fieldpolicy-extension\.md/);
88
- });
89
-
90
- test('validateFieldPolicy: strategy typo "lok" menolak dengan list valid values', () => {
91
- const policy = { salary: { strategies: ['lok'] } };
92
- const err = expectThrowsWithMessage(
93
- () => PayloadValidator.validateFieldPolicy(policy, FIELDS, FILE),
94
- "includes 'lok' which is not valid"
95
- );
96
- assert.match(err.message, /Valid strategies in Phase 1: lock, audit/);
97
- });
98
-
99
- test('validateFieldPolicy: kolom tidak ada di fieldName menolak', () => {
100
- const policy = { unknown_column: { strategies: ['lock'] } };
101
- expectThrowsWithMessage(
102
- () => PayloadValidator.validateFieldPolicy(policy, FIELDS, FILE),
103
- "fieldPolicy column 'unknown_column' in sample.json is not in fieldName"
104
- );
105
- });
106
-
107
- test('validateFieldPolicy: fieldPolicy berupa array menolak', () => {
108
- const policy = [{ strategies: ['lock'] }];
109
- expectThrowsWithMessage(
110
- () => PayloadValidator.validateFieldPolicy(policy, FIELDS, FILE),
111
- 'fieldPolicy in sample.json must be a non-null object'
112
- );
113
- });
114
-
115
- test('validateFieldPolicy: fieldPolicy null menolak', () => {
116
- expectThrowsWithMessage(
117
- () => PayloadValidator.validateFieldPolicy(null, FIELDS, FILE),
118
- 'fieldPolicy in sample.json must be a non-null object'
119
- );
120
- });
121
-
122
- test('validateFieldPolicy: entry kolom berupa string menolak', () => {
123
- const policy = { salary: 'lock' };
124
- expectThrowsWithMessage(
125
- () => PayloadValidator.validateFieldPolicy(policy, FIELDS, FILE),
126
- 'fieldPolicy.salary in sample.json must be a non-null object'
127
- );
128
- });
129
-
130
- test('validateFieldPolicy: entry kolom berupa array menolak', () => {
131
- const policy = { salary: ['lock'] };
132
- expectThrowsWithMessage(
133
- () => PayloadValidator.validateFieldPolicy(policy, FIELDS, FILE),
134
- 'fieldPolicy.salary in sample.json must be a non-null object'
135
- );
136
- });
137
-
138
- test('validateFieldPolicy: strategies bukan array menolak', () => {
139
- const policy = { salary: { strategies: 'lock' } };
140
- expectThrowsWithMessage(
141
- () => PayloadValidator.validateFieldPolicy(policy, FIELDS, FILE),
142
- 'fieldPolicy.salary.strategies in sample.json is required and must be a non-empty array of strings'
143
- );
144
- });
145
-
146
- test('validateFieldPolicy: strategies item bukan string menolak', () => {
147
- const policy = { salary: { strategies: [123] } };
148
- expectThrowsWithMessage(
149
- () => PayloadValidator.validateFieldPolicy(policy, FIELDS, FILE),
150
- 'fieldPolicy.salary.strategies in sample.json is required and must be a non-empty array of strings'
151
- );
152
- });
153
-
154
- test('validateFieldPolicy: property tambahan (conditions) menolak Phase 1', () => {
155
- const policy = {
156
- salary: {
157
- strategies: ['lock'],
158
- conditions: [{ operation: 'reserve' }]
159
- }
160
- };
161
- expectThrowsWithMessage(
162
- () => PayloadValidator.validateFieldPolicy(policy, FIELDS, FILE),
163
- 'fieldPolicy.salary.conditions is not supported in Phase 1'
164
- );
165
- });
166
-
167
- test('validateFieldPolicy: property tambahan (versionField) menolak Phase 1', () => {
168
- const policy = {
169
- salary: {
170
- strategies: ['lock'],
171
- versionField: 'version'
172
- }
173
- };
174
- expectThrowsWithMessage(
175
- () => PayloadValidator.validateFieldPolicy(policy, FIELDS, FILE),
176
- 'fieldPolicy.salary.versionField is not supported in Phase 1'
177
- );
178
- });
179
-
180
- test('validateFieldPolicy: property tambahan (auditFormat) menolak Phase 1', () => {
181
- const policy = {
182
- salary: {
183
- strategies: ['audit'],
184
- auditFormat: 'snapshot'
185
- }
186
- };
187
- expectThrowsWithMessage(
188
- () => PayloadValidator.validateFieldPolicy(policy, FIELDS, FILE),
189
- 'fieldPolicy.salary.auditFormat is not supported in Phase 1'
190
- );
191
- });
192
-
193
- test('validatePayloadStructure: payload dengan fieldProtection lama menolak dengan migration hint', () => {
194
- const payload = {
195
- tableName: 'karyawan',
196
- primaryKey: 'id',
197
- fieldName: ['id', 'salary'],
198
- fieldProtection: {
199
- salary: { level: 'strict', auditRequired: true }
200
- },
201
- action: { update: true, datatables: false }
202
- };
203
- const err = expectThrowsWithMessage(
204
- () => PayloadValidator.validatePayloadStructure(payload, 'karyawan.json', true),
205
- "'fieldProtection' in karyawan.json has been replaced by 'fieldPolicy'"
206
- );
207
- assert.match(err.message, /docs\/todo\/todo-fieldpolicy-extension\.md/);
208
- assert.match(err.message, /strategies/);
209
- });
210
-
211
- test('validatePayloadStructure: payload dengan fieldPolicy valid lulus structure validation', () => {
212
- const payload = {
213
- tableName: 'karyawan',
214
- primaryKey: 'id',
215
- fieldName: ['id', 'salary'],
216
- fieldPolicy: {
217
- salary: { strategies: ['lock', 'audit'] }
218
- },
219
- action: { update: true, datatables: false }
220
- };
221
- assert.doesNotThrow(() => {
222
- PayloadValidator.validatePayloadStructure(payload, 'karyawan.json', true);
223
- });
224
- });
225
-
226
- test('validatePayloadStructure: payload dengan fieldPolicy strategy "condition" ditolak end-to-end', () => {
227
- const payload = {
228
- tableName: 'karyawan',
229
- primaryKey: 'id',
230
- fieldName: ['id', 'salary'],
231
- fieldPolicy: {
232
- salary: { strategies: ['condition'] }
233
- },
234
- action: { update: true, datatables: false }
235
- };
236
- expectThrowsWithMessage(
237
- () => PayloadValidator.validatePayloadStructure(payload, 'karyawan.json', true),
238
- 'planned for Phase 2'
239
- );
240
- });