@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
@@ -0,0 +1,181 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Audit Columns Helper
5
+ *
6
+ * Resolve nama kolom audit yang efektif berdasarkan konfigurasi payload.
7
+ * Konvensi default mengikuti BaseModel runtime di `src/models/base-model.js`:
8
+ * createdAt -> created_at
9
+ * createdBy -> created_by
10
+ * updatedAt -> updated_at
11
+ * updatedBy -> updated_by
12
+ *
13
+ * Payload dapat override behavior:
14
+ * - `auditColumns: false` (atau null) -> disable audit columns
15
+ * - `auditColumns: { createdAt, createdBy, updatedAt, updatedBy }` -> custom mapping
16
+ * - tidak di-set / true -> pakai default 4 nama standar
17
+ *
18
+ * Helper ini dipakai oleh:
19
+ * - schema-diff: compute effective field list (fieldName ∪ audit columns)
20
+ * - endpoint create: validation pre-codegen
21
+ *
22
+ * @module lib/utils/audit-columns
23
+ */
24
+
25
+ const DEFAULT_AUDIT_COLUMN_MAP = {
26
+ createdAt: 'created_at',
27
+ createdBy: 'created_by',
28
+ updatedAt: 'updated_at',
29
+ updatedBy: 'updated_by'
30
+ };
31
+
32
+ const DEFAULT_AUDIT_COLUMNS = Object.values(DEFAULT_AUDIT_COLUMN_MAP);
33
+
34
+ /**
35
+ * Cek apakah audit columns aktif untuk payload ini.
36
+ *
37
+ * @param {Object} payload - Processed payload object
38
+ * @returns {boolean} true jika audit columns akan di-inject runtime
39
+ */
40
+ function isAuditColumnsEnabled(payload) {
41
+ if (!payload) return false;
42
+ if (!Object.prototype.hasOwnProperty.call(payload, 'auditColumns')) return true;
43
+ const value = payload.auditColumns;
44
+ if (value === false || value === null) return false;
45
+ return true;
46
+ }
47
+
48
+ /**
49
+ * Resolve nama kolom audit (sisi database) yang akan di-inject runtime.
50
+ * Mengembalikan empty array bila audit columns di-disable.
51
+ *
52
+ * @param {Object} payload - Processed payload object
53
+ * @returns {string[]} Array nama kolom database (snake_case)
54
+ */
55
+ function resolveAuditColumnNames(payload) {
56
+ if (!isAuditColumnsEnabled(payload)) return [];
57
+
58
+ const value = payload && payload.auditColumns;
59
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
60
+ const out = [];
61
+ for (const key of Object.keys(DEFAULT_AUDIT_COLUMN_MAP)) {
62
+ const mapped = value[key];
63
+ if (typeof mapped === 'string' && mapped.length > 0) {
64
+ out.push(mapped);
65
+ } else {
66
+ out.push(DEFAULT_AUDIT_COLUMN_MAP[key]);
67
+ }
68
+ }
69
+ return out;
70
+ }
71
+
72
+ return DEFAULT_AUDIT_COLUMNS.slice();
73
+ }
74
+
75
+ /**
76
+ * Resolve effective field list yang dipakai generator codegen:
77
+ * gabungan fieldName eksplisit di payload + audit columns yang akan
78
+ * di-inject runtime.
79
+ *
80
+ * Dipakai oleh schema validation untuk men-detect drift yang berasal
81
+ * dari implicit audit columns (kasus umum: auditColumns aktif tapi
82
+ * tabel database tidak punya kolom audit).
83
+ *
84
+ * @param {Object} payload - Processed payload object
85
+ * @returns {{ fields: string[], audit: string[], explicit: string[] }}
86
+ */
87
+ function resolveEffectiveFieldList(payload) {
88
+ const explicit = Array.isArray(payload && payload.fieldName)
89
+ ? payload.fieldName.slice()
90
+ : [];
91
+ const audit = resolveAuditColumnNames(payload);
92
+
93
+ const merged = [];
94
+ const seen = new Set();
95
+ for (const f of explicit) {
96
+ if (!seen.has(f)) {
97
+ seen.add(f);
98
+ merged.push(f);
99
+ }
100
+ }
101
+ for (const f of audit) {
102
+ if (!seen.has(f)) {
103
+ seen.add(f);
104
+ merged.push(f);
105
+ }
106
+ }
107
+
108
+ return {
109
+ fields: merged,
110
+ audit,
111
+ explicit
112
+ };
113
+ }
114
+
115
+ /**
116
+ * Deteksi alignment kolom audit standar antara payload generator dan tabel
117
+ * database aktual. Helper ini dipakai oleh sync flow (payload-runner) dan
118
+ * initial generation untuk men-set `auditColumns: false` bila kolom audit
119
+ * tidak tersedia di database.
120
+ *
121
+ * Konvensi: kolom audit standar mengikuti DEFAULT_AUDIT_COLUMNS (snake_case).
122
+ * Match dilakukan exact lowercase; bila tabel pakai naming convention lain
123
+ * (mis. `CreatedAt`), audit detection akan miss.
124
+ *
125
+ * @param {string[]} dbColumns - Daftar nama kolom dari tabel database
126
+ * @returns {{
127
+ * all: boolean, // semua 4 kolom audit standar ada di database
128
+ * partial: boolean, // sebagian (1-3) kolom audit ada
129
+ * none: boolean, // tidak satupun kolom audit ada
130
+ * present: string[], // kolom audit yang ada di database
131
+ * missing: string[] // kolom audit yang tidak ada di database
132
+ * }}
133
+ */
134
+ function detectAuditAlignment(dbColumns) {
135
+ const columns = Array.isArray(dbColumns) ? dbColumns : [];
136
+ const present = DEFAULT_AUDIT_COLUMNS.filter(col => columns.includes(col));
137
+ const missing = DEFAULT_AUDIT_COLUMNS.filter(col => !columns.includes(col));
138
+ return {
139
+ all: present.length === DEFAULT_AUDIT_COLUMNS.length,
140
+ partial: present.length > 0 && present.length < DEFAULT_AUDIT_COLUMNS.length,
141
+ none: present.length === 0,
142
+ present,
143
+ missing
144
+ };
145
+ }
146
+
147
+ /**
148
+ * Cek apakah konfigurasi `auditColumns` di payload memerlukan resolusi
149
+ * berdasarkan alignment dengan database. Dipakai sync flow untuk men-detect
150
+ * "audit-only drift" yang tidak ter-detect oleh comparator schema reguler.
151
+ *
152
+ * Aturan resolusi:
153
+ * - `auditColumns: false`/`null` -> no-op (preserved)
154
+ * - `auditColumns: { ... }` (object form) -> no auto-override (manual)
155
+ * - `auditColumns: true` atau tidak di-set (default true) -> butuh resolusi
156
+ * bila database tidak punya keempat kolom audit standar (none atau partial)
157
+ *
158
+ * @param {Object} payload - Processed payload object
159
+ * @param {ReturnType<typeof detectAuditAlignment>} auditAlignment
160
+ * @returns {boolean} true bila sync wajib regenerate untuk men-set false
161
+ */
162
+ function needsAuditColumnResolution(payload, auditAlignment) {
163
+ if (!payload || !auditAlignment) return false;
164
+ const hasField = Object.prototype.hasOwnProperty.call(payload, 'auditColumns');
165
+ const value = hasField ? payload.auditColumns : undefined;
166
+
167
+ if (value === false || value === null) return false;
168
+ if (value && typeof value === 'object' && !Array.isArray(value)) return false;
169
+
170
+ return !auditAlignment.all;
171
+ }
172
+
173
+ module.exports = {
174
+ DEFAULT_AUDIT_COLUMN_MAP,
175
+ DEFAULT_AUDIT_COLUMNS,
176
+ isAuditColumnsEnabled,
177
+ resolveAuditColumnNames,
178
+ resolveEffectiveFieldList,
179
+ detectAuditAlignment,
180
+ needsAuditColumnResolution
181
+ };
@@ -67,6 +67,9 @@ class CliOutput {
67
67
  ? `${data.config.database} (force overwrite)`
68
68
  : data.config.database;
69
69
  out(` Database ${dbLine}`);
70
+ if (data.config.config) {
71
+ out(` Config ${data.config.config}`);
72
+ }
70
73
  out('');
71
74
 
72
75
  if (data.payload) {
@@ -79,6 +82,20 @@ class CliOutput {
79
82
  out('');
80
83
  }
81
84
 
85
+ if (data.schemaValidation) {
86
+ out('Schema Validation:');
87
+ if (data.schemaValidation.status === 'ok') {
88
+ const n = data.schemaValidation.columnsChecked || 0;
89
+ out(` Status OK (${n} column${n === 1 ? '' : 's'} match database)`);
90
+ } else if (data.schemaValidation.status === 'skipped') {
91
+ out(' Status SKIPPED (--skip-schema-check)');
92
+ if (data.schemaValidation.reason) {
93
+ out(` Reason ${data.schemaValidation.reason}`);
94
+ }
95
+ }
96
+ out('');
97
+ }
98
+
82
99
  if (data.archive && data.archive.count > 0) {
83
100
  out('Archive (force):');
84
101
  out(` Generation ${data.archive.generation} - ${data.archive.count} file(s) archived`);
@@ -242,22 +242,25 @@ class DatabaseIntrospector {
242
242
  }
243
243
 
244
244
  /**
245
- * Close database connection
245
+ * Close database connection. Idempotent — panggilan kedua jadi no-op
246
+ * setelah `this.pool` di-null-kan. Ini mencegah pesan "Database connection
247
+ * closed" muncul dua kali ketika caller punya cleanup ganda (mis. cleanup
248
+ * eksplisit + cleanup di catch block).
246
249
  */
247
250
  async close() {
248
- if (this.pool) {
249
- try {
250
- if (this.dbType === 'oracle') {
251
- await this.pool.close(0);
252
- } else {
253
- await this.pool.end();
254
- }
255
- } catch (e) {
256
- // ignore close errors
257
- }
258
- if (!this.quiet) {
259
- console.log('Database connection closed');
251
+ if (!this.pool) return;
252
+ try {
253
+ if (this.dbType === 'oracle') {
254
+ await this.pool.close(0);
255
+ } else {
256
+ await this.pool.end();
260
257
  }
258
+ } catch (e) {
259
+ // ignore close errors
260
+ }
261
+ this.pool = null;
262
+ if (!this.quiet) {
263
+ console.log('Database connection closed');
261
264
  }
262
265
  }
263
266
 
@@ -302,6 +302,12 @@ function backupEnvFile(filePath) {
302
302
 
303
303
  fs.copyFileSync(filePath, backupPath);
304
304
 
305
+ // Restrict permission ke owner-only karena .env mengandung credentials
306
+ // (LICENSE, KEY, DB_PASSWORD). No-op pada Windows yang pakai ACL.
307
+ if (process.platform !== 'win32') {
308
+ fs.chmodSync(backupPath, 0o600);
309
+ }
310
+
305
311
  return backupPath;
306
312
  }
307
313
 
@@ -0,0 +1,71 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Path Validator Utility
5
+ *
6
+ * Utility validasi path-aware untuk CLI handler yang menerima input path-like.
7
+ * Mencegah path traversal via `..` atau absolute path keluar dari working directory.
8
+ *
9
+ * Phase 02 dari Security Hardening v1 (Temuan B3).
10
+ *
11
+ * @module lib/utils/path-validator
12
+ */
13
+
14
+ const path = require('node:path');
15
+
16
+ const SAFE_NAME_REGEX = /^[a-zA-Z0-9_-]+$/;
17
+
18
+ /**
19
+ * Validate nama folder/file/module yang aman digunakan sebagai path component.
20
+ * Hanya memperbolehkan alphanumeric, dash, dan underscore.
21
+ *
22
+ * @param {string} value - Input value dari CLI argument
23
+ * @param {string} fieldName - Nama field untuk konteks error message
24
+ * @returns {string} value yang sudah divalidasi (untuk chaining)
25
+ * @throws {Error} jika value tidak valid (non-string, kosong, atau mengandung
26
+ * karakter di luar whitelist)
27
+ */
28
+ function validateSafeName(value, fieldName) {
29
+ if (typeof value !== 'string' || value.length === 0) {
30
+ throw new Error(`${fieldName} must be a non-empty string`);
31
+ }
32
+ if (!SAFE_NAME_REGEX.test(value)) {
33
+ throw new Error(
34
+ `${fieldName} must contain only alphanumeric, dash, or underscore characters. ` +
35
+ `Got: ${JSON.stringify(value)}`
36
+ );
37
+ }
38
+ return value;
39
+ }
40
+
41
+ /**
42
+ * Validate bahwa resolved targetPath berada di dalam baseDir.
43
+ * Mencegah path traversal via `..` atau absolute path keluar.
44
+ *
45
+ * @param {string} targetPath - Path target (boleh relative atau absolute)
46
+ * @param {string} baseDir - Base directory yang harus mengandung targetPath
47
+ * @returns {string} resolved absolute path
48
+ * @throws {Error} jika resolved path escape dari baseDir
49
+ */
50
+ function validatePathWithinBase(targetPath, baseDir) {
51
+ if (typeof targetPath !== 'string' || targetPath.length === 0) {
52
+ throw new Error('targetPath must be a non-empty string');
53
+ }
54
+ if (typeof baseDir !== 'string' || baseDir.length === 0) {
55
+ throw new Error('baseDir must be a non-empty string');
56
+ }
57
+
58
+ const baseResolved = path.resolve(baseDir);
59
+ const resolved = path.isAbsolute(targetPath)
60
+ ? path.resolve(targetPath)
61
+ : path.resolve(baseResolved, targetPath);
62
+
63
+ if (resolved !== baseResolved && !resolved.startsWith(baseResolved + path.sep)) {
64
+ throw new Error(
65
+ `Path "${targetPath}" escapes from base directory ${baseDir}`
66
+ );
67
+ }
68
+ return resolved;
69
+ }
70
+
71
+ module.exports = { validateSafeName, validatePathWithinBase };
@@ -263,7 +263,6 @@ class PayloadValidator {
263
263
  if (payload.fieldProtection !== undefined) {
264
264
  throw new Error(
265
265
  `'fieldProtection' in ${fileName} has been replaced by 'fieldPolicy'. ` +
266
- `See docs/todo/todo-fieldpolicy-extension.md for migration. ` +
267
266
  `Example: { "fieldPolicy": { "${Object.keys(payload.fieldProtection)[0] || 'columnName'}": { "strategies": ["lock", "audit"] } } }`
268
267
  );
269
268
  }
@@ -468,7 +467,7 @@ class PayloadValidator {
468
467
 
469
468
  if (PHASE2_STRATEGIES.includes(strategy)) {
470
469
  throw new Error(
471
- `fieldPolicy.${columnName}.strategies includes '${strategy}' which is planned for Phase 2 of fieldPolicy roadmap (docs/todo/todo-fieldpolicy-extension.md). Currently only 'lock' and 'audit' are supported.`
470
+ `fieldPolicy.${columnName}.strategies includes '${strategy}' which is planned for Phase 2 of fieldPolicy roadmap. Currently only 'lock' and 'audit' are supported.`
472
471
  );
473
472
  }
474
473
 
@@ -1,19 +1,37 @@
1
1
  {
2
- "version": "4.1.1",
3
- "generated": "2026-05-19T01:38:06.824Z",
2
+ "version": "4.3.1",
3
+ "generated": "2026-05-23T07:28:02.234Z",
4
4
  "generator": "restforge-build-system",
5
5
  "algorithm": "sha256",
6
6
  "files": {
7
- "server.js": "2bf1e25e7af33bb70dd0f3d5f3f970ed2f5d227c6c5534b4dfe5cb294d59b2f5",
8
- "src/utils/license-client.js": "976511ab72f356595bf1399a50480d340b556f9bce4b71058b90b10d6bd8e793",
9
- "src/utils/trusted-keys.js": "faf93514b43a83650c950c05aca6e42ed64c19fbeb7e3c84e93c509de84bd2c0",
10
- "cli/consumer.js": "e2a5055652cee82d32b6873e21469bc07784a490d125ec7e64171ba06ad31397",
11
- "src/utils/security-checks.js": "1748b39715ff5c1047a730d1e62a22151b38eedc0f48bbd33b1ab4f0ff592d34",
12
- "scripts/verify-integrity.js": "3e891f9baa234362ebcee8d1048fe7bac3221a026c2918cf0e154e5ea3444c87"
7
+ "server.js": "2ef2e146c66d74df2413398fa86944396ca20c310606237d2819eea504a3692c",
8
+ "src/utils/license-client.js": "5842a6fefa0ef4035cbd7ec1cac2ba65a6918e7faa1afa38812b2bb6e5be93b0",
9
+ "src/utils/trusted-keys.js": "2440fca5a73a633d9b37a2df2e740a8a00e131ecbabb05700cb6969cdf868da1",
10
+ "cli/consumer.js": "fcadb7f7c5b4c09c328ffb1ae882df823f5046d1a0c9ec61d25142bcca262663",
11
+ "src/utils/security-checks.js": "ca6d75ee3c20051f4931bd28d2ab12f0f5892e8d74e223bdac3038731979f557",
12
+ "scripts/verify-integrity.js": "bcd4ab356a196676235ffc81ab086b6fa7204e2720549f58006054f8cf7aafd3",
13
+ "bin/restforge-hwinfo-linux": "d9a0071b0acf58a020e738a29837de356f531a5a84d363a2adc50563e3874b8f",
14
+ "bin/restforge-hwinfo-darwin": "d35b15d4e6d7bbdd8317490335ba9602ce5c218519898fa3eabe18cc9c5bb1b6",
15
+ "bin/restforge-hwinfo.exe": "351fa4d33459d30de804ee78deb5eb977b77b688fe1b7b461cdaa214a82f145e",
16
+ "generators/lib/templates/mysql-template.js": "f0328973fb28dd1d01f314e1328d817aed4fde9243f8c9896f950cb57a3fcffb",
17
+ "generators/lib/templates/oracle-template.js": "58f3a1cff3fbcffc39ae6cacb72a6c88a8434e8c33b8ae7463806095c84cf1b3",
18
+ "generators/lib/templates/postgres-template.js": "d339fd5f0ce260233e3c80831a637dd8d27e4f4ca72aa39a3cd6946f4bd9886e",
19
+ "generators/lib/templates/sqlite-template.js": "778b0e44514694e3e1a4e0a4ce5d9b6bb2e4f716e4769331a723dd9ad0b250e4",
20
+ "generators/lib/templates/dashboard-catalog.js": "7ab933e347c60eff7359ca621cd3f40d493641bcb25870d4150a9dbf740c2105",
21
+ "generators/lib/templates/dbschema-catalog.js": "779388a04c512ec24f8f7822b4d8feb3c20ad8d70787a3dc3478ece1df823daf",
22
+ "generators/lib/templates/field-validation-catalog.js": "85f925cfe158ce6c00f98dcecbcdf7c45971c5ec64d694b7707f784bdd1a650c",
23
+ "generators/lib/templates/query-declarative-catalog.js": "d60fb26d9336e0aa2913d94d14b79a0934ed8cc848013bbd6d77a5cdda32bf9f",
24
+ "generators/lib/templates/db-connection-env.js": "85cd3f5b68121294b32fc706b4578ba7581e1e1f8399eee2e656ab1dadb5adcf"
13
25
  },
14
26
  "stats": {
15
- "totalFiles": 6,
16
- "protectedFiles": 6,
27
+ "totalFiles": 18,
28
+ "protectedFiles": 18,
17
29
  "missingFiles": 0
30
+ },
31
+ "signature": {
32
+ "algorithm": "ed25519",
33
+ "keyId": "rfs-manifest-2026-05",
34
+ "value": "340f2df9ae9c75e0c51cee4be5dd7ac0ccc4a3daedc2fa732a24bbe9b4d3e35d7215358ca313d5dcbdd03b08bdd6242ed7e9f701907aad2fb2f91acf9cb92009",
35
+ "scope": "canonical-json(manifest-without-signature)"
18
36
  }
19
37
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@restforgejs/platform",
3
- "version": "4.1.1",
3
+ "version": "4.3.1",
4
4
  "description": "RESTForge Platform — Schema-driven backend framework and code generator for full-stack Node.js applications. Generates production backend APIs with multi-database support (PostgreSQL, MySQL, Oracle). A platform builder and backend runtime, not an API testing or client tool.",
5
5
  "main": "server.js",
6
6
  "bin": {
@@ -34,10 +34,18 @@
34
34
  "server.js",
35
35
  "cli/",
36
36
  "src/",
37
- "scripts/",
37
+ "scripts/check-install.js",
38
+ "scripts/verify-integrity.js",
38
39
  "config/",
39
40
  "bin/",
40
- "generators/",
41
+ "generators/cli-entry.js",
42
+ "generators/cli/",
43
+ "generators/lib/",
44
+ "generators/assets/",
45
+ "generators/payload/",
46
+ "generators/sync-version.js",
47
+ "generators/src/",
48
+ "generators/examples/",
41
49
  "integrity-manifest.json",
42
50
  "README.md",
43
51
  "LICENSE.md",