@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.
- package/SECURITY.md +83 -4
- package/bin/sdf-tools.exe +0 -0
- package/build-info.json +2 -2
- package/cli/consumer-deploy.js +1 -1
- package/cli/consumer.js +1 -1
- package/generators/cli/dashboard/create.js +4 -1
- package/generators/cli/endpoint/create.js +43 -4
- package/generators/cli/key/generate.js +2 -1
- package/generators/cli/key/revoke.js +2 -1
- package/generators/cli/payload/diff.js +3 -2
- package/generators/cli/payload/generate.js +3 -2
- package/generators/cli/payload/sync.js +3 -2
- package/generators/cli/payload/validate.js +3 -2
- package/generators/cli/processor/create.js +14 -3
- package/generators/cli/project/delete.js +2 -1
- package/generators/cli/query/validate.js +3 -2
- package/generators/cli/schema/apply.js +526 -0
- package/generators/cli/schema/describe.js +3 -2
- package/generators/cli/schema/diff.js +322 -0
- package/generators/cli/schema/generate-ddl.js +7 -10
- package/generators/cli/schema/init.js +95 -172
- package/generators/cli/schema/introspect.js +3 -2
- package/generators/cli/schema/list.js +3 -2
- package/generators/cli/schema/migrate.js +13 -18
- package/generators/cli/schema/models.js +8 -12
- package/generators/cli/schema/template.js +222 -0
- package/generators/cli/schema/validate.js +8 -12
- package/generators/cli-entry.js +17 -2
- package/generators/lib/dbschema-kit/apply-engine.js +582 -0
- package/generators/lib/dbschema-kit/diff-engine.js +703 -0
- package/generators/lib/dbschema-kit/diff-reporter.js +272 -0
- package/generators/lib/dbschema-kit/emitters/alter-table.js +275 -0
- package/generators/lib/migration/audit-table-runner.js +213 -215
- package/generators/lib/payload/endpoint-schema-validator.js +171 -0
- package/generators/lib/payload/payload-runner.js +137 -220
- package/generators/lib/payload/schema-diff.js +277 -0
- package/generators/lib/templates/dashboard-catalog.js +1 -437
- package/generators/lib/templates/db-connection-env.js +1 -212
- package/generators/lib/templates/dbschema-catalog.js +1 -489
- package/generators/lib/templates/field-validation-catalog.js +1 -531
- package/generators/lib/templates/mysql-template.js +1 -3863
- package/generators/lib/templates/oracle-template.js +1 -3915
- package/generators/lib/templates/postgres-template.js +1 -5838
- package/generators/lib/templates/query-declarative-catalog.js +1 -199
- package/generators/lib/templates/sqlite-template.js +1 -3440
- package/generators/lib/utils/audit-columns.js +181 -0
- package/generators/lib/utils/cli-output.js +17 -0
- package/generators/lib/utils/database-introspector.js +16 -13
- package/generators/lib/utils/env-manager.js +6 -0
- package/generators/lib/utils/path-validator.js +71 -0
- package/generators/lib/validators/payload-validator.js +1 -2
- package/integrity-manifest.json +28 -10
- package/package.json +11 -3
- package/scripts/verify-integrity.js +1 -1
- package/server.js +1 -1
- package/src/components/handlers/adjust_handler.js +1 -1
- package/src/components/handlers/audit_handler.js +1 -1
- package/src/components/handlers/delete_handler.js +1 -1
- package/src/components/handlers/export_handler.js +1 -1
- package/src/components/handlers/import_handler.js +1 -1
- package/src/components/handlers/insert_handler.js +1 -1
- package/src/components/handlers/update_handler.js +1 -1
- package/src/components/handlers/upload_handler.js +1 -1
- package/src/components/handlers/workflow_handler.js +1 -1
- package/src/components/integrations/webhook.js +1 -1
- package/src/consumers/baseConsumer.js +1 -1
- package/src/consumers/declarativeMapper.js +1 -1
- package/src/consumers/handlers/apiHandler.js +1 -1
- package/src/consumers/handlers/consoleHandler.js +1 -1
- package/src/consumers/handlers/databaseHandler.js +1 -1
- package/src/consumers/handlers/index.js +1 -1
- package/src/consumers/handlers/kafkaHandler.js +1 -1
- package/src/consumers/index.js +1 -1
- package/src/consumers/messageTransformer.js +1 -1
- package/src/consumers/validator.js +1 -1
- package/src/core/db/dialect/base-dialect.js +1 -1
- package/src/core/db/dialect/index.js +1 -1
- package/src/core/db/dialect/mysql-dialect.js +1 -1
- package/src/core/db/dialect/oracle-dialect.js +1 -1
- package/src/core/db/dialect/postgres-dialect.js +1 -1
- package/src/core/db/dialect/sqlite-dialect.js +1 -1
- package/src/core/db/flatten-helper.js +1 -1
- package/src/core/db/query-builder-error.js +1 -1
- package/src/core/db/query-builder.js +1 -1
- package/src/core/db/relation-helper.js +1 -1
- package/src/core/handlers/delete_handler.js +1 -1
- package/src/core/handlers/insert_handler.js +1 -1
- package/src/core/handlers/update_handler.js +1 -1
- package/src/core/models/base-model.js +1 -1
- package/src/core/utils/cache-manager.js +1 -1
- package/src/core/utils/component-engine.js +1 -1
- package/src/core/utils/context-builder.js +1 -1
- package/src/core/utils/datetime-formatter.js +1 -1
- package/src/core/utils/datetime-parser.js +1 -1
- package/src/core/utils/db.js +1 -1
- package/src/core/utils/logger.js +1 -1
- package/src/core/utils/payload-loader.js +1 -1
- package/src/core/utils/security-checks.js +1 -1
- package/src/middleware/body-options.js +1 -1
- package/src/middleware/cors.js +1 -1
- package/src/middleware/idempotency.js +1 -1
- package/src/middleware/rate-limiter.js +1 -1
- package/src/middleware/request-logger.js +1 -1
- package/src/middleware/security-headers.js +1 -1
- package/src/models/base-model-mysql.js +1 -1
- package/src/models/base-model-oracle.js +1 -1
- package/src/models/base-model-sqlite.js +1 -1
- package/src/models/base-model.js +1 -1
- package/src/pro/caching/redis-client.js +1 -1
- package/src/pro/caching/redis-helper.js +1 -1
- package/src/pro/consumers/baseConsumer.js +1 -1
- package/src/pro/consumers/declarativeMapper.js +1 -1
- package/src/pro/consumers/handlers/apiHandler.js +1 -1
- package/src/pro/consumers/handlers/consoleHandler.js +1 -1
- package/src/pro/consumers/handlers/databaseHandler.js +1 -1
- package/src/pro/consumers/handlers/index.js +1 -1
- package/src/pro/consumers/handlers/kafkaHandler.js +1 -1
- package/src/pro/consumers/index.js +1 -1
- package/src/pro/consumers/messageTransformer.js +1 -1
- package/src/pro/consumers/validator.js +1 -1
- package/src/pro/database/base-model-mysql.js +1 -1
- package/src/pro/database/base-model-oracle.js +1 -1
- package/src/pro/database/base-model-sqlite.js +1 -1
- package/src/pro/database/db-mysql.js +1 -1
- package/src/pro/database/db-oracle.js +1 -1
- package/src/pro/database/db-sqlite.js +1 -1
- package/src/pro/excel/excel-generator.js +1 -1
- package/src/pro/excel/excel-parser.js +1 -1
- package/src/pro/excel/export-service.js +1 -1
- package/src/pro/excel/export_handler.js +1 -1
- package/src/pro/excel/import-service.js +1 -1
- package/src/pro/excel/import-validator.js +1 -1
- package/src/pro/excel/import_handler.js +1 -1
- package/src/pro/excel/upsert-builder.js +1 -1
- package/src/pro/idgen/idgen-routes.js +1 -1
- package/src/pro/integrations/lookup-resolver.js +1 -1
- package/src/pro/integrations/upload-handler-v2.js +1 -1
- package/src/pro/integrations/upload-handler.js +1 -1
- package/src/pro/integrations/webhook.js +1 -1
- package/src/pro/locking/lock-routes.js +1 -1
- package/src/pro/locking/resource-lock-manager.js +1 -1
- package/src/pro/messaging/kafkaConsumerService.js +1 -1
- package/src/pro/messaging/kafkaService.js +1 -1
- package/src/pro/messaging/messagehubService.js +1 -1
- package/src/pro/messaging/rabbitmqService.js +1 -1
- package/src/pro/scheduler/job-manager.js +1 -1
- package/src/pro/scheduler/job-routes.js +1 -1
- package/src/pro/scheduler/job-validator.js +1 -1
- package/src/pro/storage/base-storage-provider.js +1 -1
- package/src/pro/storage/file-metadata-helper.js +1 -1
- package/src/pro/storage/index.js +1 -1
- package/src/pro/storage/local-storage-provider.js +1 -1
- package/src/pro/storage/s3-storage-provider.js +1 -1
- package/src/pro/storage/upload-cleanup-job.js +1 -1
- package/src/pro/storage/upload-cleanup-scheduler.js +1 -1
- package/src/pro/storage/upload-pending-tracker.js +1 -1
- package/src/pro/websocket/broadcast-helper.js +1 -1
- package/src/pro/websocket/index.js +1 -1
- package/src/pro/websocket/livesync-server.js +1 -1
- package/src/pro/websocket/ws-broadcaster.js +1 -1
- package/src/services/export-service.js +1 -1
- package/src/services/import-service.js +1 -1
- package/src/services/kafkaConsumerService.js +1 -1
- package/src/services/kafkaService.js +1 -1
- package/src/services/messagehubService.js +1 -1
- package/src/services/rabbitmqService.js +1 -1
- package/src/utils/cache-invalidation-registry.js +1 -1
- package/src/utils/cache-manager.js +1 -1
- package/src/utils/component-engine.js +1 -1
- package/src/utils/config-extractor.js +1 -1
- package/src/utils/consumerLogger.js +1 -1
- package/src/utils/context-builder.js +1 -1
- package/src/utils/dashboard-helpers.js +1 -1
- package/src/utils/dateHelper.js +1 -1
- package/src/utils/datetime-formatter.js +1 -1
- package/src/utils/datetime-parser.js +1 -1
- package/src/utils/db-bootstrap.js +1 -1
- package/src/utils/db-mysql.js +1 -1
- package/src/utils/db-oracle.js +1 -1
- package/src/utils/db-sqlite.js +1 -1
- package/src/utils/db.js +1 -1
- package/src/utils/demo-generator.js +1 -1
- package/src/utils/excel-generator.js +1 -1
- package/src/utils/excel-parser.js +1 -1
- package/src/utils/file-watcher.js +1 -1
- package/src/utils/id-generator.js +1 -1
- package/src/utils/idempotency-manager.js +1 -1
- package/src/utils/import-validator.js +1 -1
- package/src/utils/license-client.js +1 -1
- package/src/utils/lock-manager.js +1 -1
- package/src/utils/logger.js +1 -1
- package/src/utils/lookup-resolver.js +1 -1
- package/src/utils/payload-loader.js +1 -1
- package/src/utils/processor-response.js +1 -1
- package/src/utils/rabbitmq.js +1 -1
- package/src/utils/redis-client.js +1 -1
- package/src/utils/redis-helper.js +1 -1
- package/src/utils/request-scope.js +1 -1
- package/src/utils/security-checks.js +1 -1
- package/src/utils/service-resolver.js +1 -1
- package/src/utils/shutdown-coordinator.js +1 -1
- package/src/utils/trusted-keys.js +1 -1
- package/src/utils/upload-handler.js +1 -1
- package/src/utils/upsert-builder.js +1 -1
- package/src/utils/workflow-hook-executor.js +1 -1
- package/generators/metadata/global.json +0 -58
- package/generators/metadata/test-mysql-workbench.json +0 -118
- package/generators/metadata/test-mysql.json +0 -56
- package/generators/metadata/test-oracle-workbench.json +0 -118
- package/generators/metadata/test-oracle.json +0 -56
- package/generators/metadata/test-pg-workbench.json +0 -118
- package/generators/metadata/test-pg.json +0 -56
- package/generators/scripts/obfuscate-source.js +0 -356
- package/generators/scripts/validate-catalog.js +0 -430
- package/generators/scripts/validate-dbschema-catalog.js +0 -708
- package/generators/tests/baseline/mysql/mini_inventory_item/src/models/mini-inventory/item.js +0 -944
- package/generators/tests/baseline/mysql/mini_inventory_item/src/modules/mini-inventory/item.js +0 -740
- package/generators/tests/baseline/mysql/mini_inventory_item/src/modules/mini-inventory.js +0 -336
- package/generators/tests/baseline/oracle/mini_inventory_item/src/models/mini-inventory/item.js +0 -1002
- package/generators/tests/baseline/oracle/mini_inventory_item/src/modules/mini-inventory/item.js +0 -740
- package/generators/tests/baseline/oracle/mini_inventory_item/src/modules/mini-inventory.js +0 -336
- package/generators/tests/baseline/postgres/mini_inventory_item/src/models/mini-inventory/item.js +0 -1333
- package/generators/tests/baseline/postgres/mini_inventory_item/src/modules/mini-inventory/item.js +0 -1173
- package/generators/tests/baseline/postgres/mini_inventory_item/src/modules/mini-inventory.js +0 -496
- package/generators/tests/fixtures/payloads/custom-sensitive.json +0 -27
- package/generators/tests/fixtures/payloads/dynamic-search-optout.json +0 -23
- package/generators/tests/fixtures/payloads/login-with-password.json +0 -22
- package/generators/tests/fixtures/payloads/order-process.json +0 -52
- package/generators/tests/fixtures/payloads/with-inline-sql.json +0 -26
- package/generators/tests/integration-tahap4b/README.md +0 -145
- package/generators/tests/integration-tahap4b/run-concurrent.js +0 -77
- package/generators/tests/integration-tahap4b/seed.sql +0 -53
- package/generators/tests/integration-tahap4b/verify.sql +0 -110
- package/generators/tests/unit/cli/create-dashboard.test.js +0 -505
- package/generators/tests/unit/cli/create-processor.test.js +0 -319
- package/generators/tests/unit/cli/dispatch-dashboard.test.js +0 -149
- package/generators/tests/unit/lib/dashboard-generator.test.js +0 -895
- package/generators/tests/unit/lib/dashboard-validator.test.js +0 -354
- package/generators/tests/unit/lib/dbschema-kit/apply-executor.test.js +0 -437
- package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-introspect.test.js +0 -393
- package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-generate-ddl.test.js +0 -104
- package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-init.test.js +0 -119
- package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-list.test.js +0 -48
- package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-migrate.test.js +0 -175
- package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-validate.test.js +0 -102
- package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-models.test.js +0 -43
- package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/all-schemas-listing.js +0 -84
- package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/connection-error.js +0 -13
- package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/empty.js +0 -12
- package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/multi-schema.js +0 -124
- package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/single-schema-inventory.js +0 -64
- package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/two-tables.js +0 -66
- package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/connection-error.js +0 -9
- package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/partial.js +0 -29
- package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/rollback.js +0 -26
- package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/success.js +0 -43
- package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/multi-schema/audit/events.js +0 -18
- package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/multi-schema/inventory/products.js +0 -9
- package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/multi-schema/users.js +0 -8
- package/generators/tests/unit/lib/dbschema-kit/connection.test.js +0 -112
- package/generators/tests/unit/lib/dbschema-kit/ddl-generator.test.js +0 -205
- package/generators/tests/unit/lib/dbschema-kit/define-model.test.js +0 -56
- package/generators/tests/unit/lib/dbschema-kit/dialect/index.test.js +0 -46
- package/generators/tests/unit/lib/dbschema-kit/dialect/mysql.test.js +0 -126
- package/generators/tests/unit/lib/dbschema-kit/dialect/oracle.test.js +0 -126
- package/generators/tests/unit/lib/dbschema-kit/dialect/postgres.test.js +0 -131
- package/generators/tests/unit/lib/dbschema-kit/dialect/sqlite.test.js +0 -126
- package/generators/tests/unit/lib/dbschema-kit/driver-loader.test.js +0 -93
- package/generators/tests/unit/lib/dbschema-kit/emitters/create-index.test.js +0 -173
- package/generators/tests/unit/lib/dbschema-kit/emitters/create-table.test.js +0 -376
- package/generators/tests/unit/lib/dbschema-kit/emitters/drop-table.test.js +0 -78
- package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/invalid-dialect.env +0 -6
- package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/missing-dialect.env +0 -5
- package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/missing-host.env +0 -5
- package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/oracle-valid.env +0 -6
- package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/postgres-valid.env +0 -7
- package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/sqlite-valid.env +0 -2
- package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/category.js +0 -11
- package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/item_product.js +0 -11
- package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/stock_inbound.js +0 -24
- package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/stock_inbound_item.js +0 -28
- package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/supplier.js +0 -9
- package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/warehouse.js +0 -9
- package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-invalid/orphan.js +0 -17
- package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/category.js +0 -11
- package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/item_product.js +0 -11
- package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/supplier.js +0 -9
- package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/warehouse.js +0 -9
- package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/transactions/stock_inbound.js +0 -24
- package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/transactions/stock_inbound_item.js +0 -28
- package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/multi-schema/audit/events.js +0 -18
- package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/multi-schema/inventory/products.js +0 -9
- package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/multi-schema/public/users.js +0 -9
- package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-subfolder/extra/category.js +0 -8
- package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-subfolder/master/category.js +0 -8
- package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-tablename/bar.js +0 -8
- package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-tablename/foo.js +0 -8
- package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/empty-folder/README.md +0 -1
- package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/invalid-export/plain.js +0 -3
- package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/invalid-schema/bad.js +0 -6
- package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/legacy-pattern/legacy.js +0 -12
- package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-distinct/audit/products.js +0 -9
- package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-distinct/inventory/products.js +0 -9
- package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-duplicate/a/products.js +0 -8
- package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-duplicate/b/products.js +0 -8
- package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/nested-deep/a/b/c/deep_table.js +0 -8
- package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/.hidden/ignored.js +0 -7
- package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/master/category.js +0 -8
- package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/master/supplier.js +0 -8
- package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/transactions/stock_inbound.js +0 -8
- package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/transactions/stock_inbound_item.js +0 -8
- package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/valid-multiple/category.js +0 -8
- package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/valid-multiple/item_product.js +0 -9
- package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/valid-single/category.js +0 -8
- package/generators/tests/unit/lib/dbschema-kit/integration.test.js +0 -217
- package/generators/tests/unit/lib/dbschema-kit/introspect-mapper.test.js +0 -403
- package/generators/tests/unit/lib/dbschema-kit/ir-builder.test.js +0 -390
- package/generators/tests/unit/lib/dbschema-kit/loader.test.js +0 -128
- package/generators/tests/unit/lib/dbschema-kit/naming.test.js +0 -170
- package/generators/tests/unit/lib/dbschema-kit/parser/shorthand-parser.test.js +0 -237
- package/generators/tests/unit/lib/dbschema-kit/schema-printer.test.js +0 -251
- package/generators/tests/unit/lib/dbschema-kit/statement-modifier.test.js +0 -105
- package/generators/tests/unit/lib/dbschema-kit/statement-splitter.test.js +0 -165
- package/generators/tests/unit/lib/dbschema-kit/topological-sort.test.js +0 -135
- package/generators/tests/unit/lib/dbschema-kit/validator/check-compatibility-validator.test.js +0 -373
- package/generators/tests/unit/lib/dbschema-kit/validator/circular-relation-validator.test.js +0 -454
- package/generators/tests/unit/lib/dbschema-kit/validator/cross-model-validator.test.js +0 -512
- package/generators/tests/unit/lib/dbschema-kit/validator/enhanced-validate-integration.test.js +0 -390
- package/generators/tests/unit/lib/dbschema-kit/validator/naming-convention-validator.test.js +0 -306
- package/generators/tests/unit/lib/dbschema-kit/validator/schema-validator.test.js +0 -443
- package/generators/tests/unit/lib/dbschema-kit/validator/type-compatibility-validator.test.js +0 -440
- package/generators/tests/unit/lib/dbschema-kit/validator/validator-reporter.test.js +0 -172
- package/generators/tests/unit/lib/metadata-manager-dashboard.test.js +0 -256
- package/generators/tests/unit/lib/payload-validator-fieldpolicy.test.js +0 -240
- package/generators/tests/unit/lib/processor-validation-generator.test.js +0 -300
- package/generators/tests/unit/lib/sensitive-field-masker.test.js +0 -170
- package/generators/tests/unit/lib/sql-table-extractor.test.js +0 -119
- package/scripts/generate-integrity-manifest.js +0 -124
- package/scripts/snapshot-cli-contracts.js +0 -194
- package/scripts/verify-publish.js +0 -56
|
@@ -1,505 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const test = require('node:test');
|
|
4
|
-
const assert = require('node:assert');
|
|
5
|
-
const fs = require('node:fs');
|
|
6
|
-
const path = require('node:path');
|
|
7
|
-
const os = require('node:os');
|
|
8
|
-
const { spawnSync } = require('node:child_process');
|
|
9
|
-
|
|
10
|
-
const REPO_ROOT = path.resolve(__dirname, '..', '..', '..');
|
|
11
|
-
const CLI_SCRIPT = path.join(REPO_ROOT, 'cli', 'create-dashboard.js');
|
|
12
|
-
|
|
13
|
-
const SAMPLE_PAYLOAD_PATH = path.resolve(
|
|
14
|
-
REPO_ROOT,
|
|
15
|
-
'..',
|
|
16
|
-
'restforge',
|
|
17
|
-
'docs',
|
|
18
|
-
'architecture',
|
|
19
|
-
'dashboard-architecture',
|
|
20
|
-
'payload',
|
|
21
|
-
'dashboard-sales.json'
|
|
22
|
-
);
|
|
23
|
-
const SAMPLE_PAYLOAD_DIR = path.dirname(SAMPLE_PAYLOAD_PATH);
|
|
24
|
-
const SAMPLE_QUERY_DIR = path.join(SAMPLE_PAYLOAD_DIR, 'query');
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Buat tmp working dir lengkap dengan payload dashboard sample plus
|
|
28
|
-
* 4 file SQL referensi. Mengembalikan absolute path ke direktori tmp.
|
|
29
|
-
*/
|
|
30
|
-
function setupTmpProject() {
|
|
31
|
-
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'rf-dash-cli-'));
|
|
32
|
-
const tmpPayloadDir = path.join(tmpDir, 'payload');
|
|
33
|
-
const tmpQueryDir = path.join(tmpPayloadDir, 'query');
|
|
34
|
-
fs.mkdirSync(tmpQueryDir, { recursive: true });
|
|
35
|
-
|
|
36
|
-
fs.copyFileSync(
|
|
37
|
-
SAMPLE_PAYLOAD_PATH,
|
|
38
|
-
path.join(tmpPayloadDir, 'dashboard-sales.json')
|
|
39
|
-
);
|
|
40
|
-
for (const sqlFile of fs.readdirSync(SAMPLE_QUERY_DIR)) {
|
|
41
|
-
fs.copyFileSync(
|
|
42
|
-
path.join(SAMPLE_QUERY_DIR, sqlFile),
|
|
43
|
-
path.join(tmpQueryDir, sqlFile)
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return tmpDir;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function cleanupTmpProject(tmpDir) {
|
|
51
|
-
try {
|
|
52
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
53
|
-
} catch (err) {
|
|
54
|
-
// Best-effort cleanup.
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function runCli(args, cwd) {
|
|
59
|
-
return spawnSync(process.execPath, [CLI_SCRIPT, ...args], {
|
|
60
|
-
cwd,
|
|
61
|
-
encoding: 'utf-8',
|
|
62
|
-
env: { ...process.env, NODE_ENV: 'test' }
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// ===== Happy path =====
|
|
67
|
-
|
|
68
|
-
test('happy path: argv valid menghasilkan file main module + dash module + registry update', () => {
|
|
69
|
-
const tmpDir = setupTmpProject();
|
|
70
|
-
try {
|
|
71
|
-
const result = runCli([
|
|
72
|
-
'--project=mini-inventory',
|
|
73
|
-
'--name=dash-sales',
|
|
74
|
-
'--payload=dashboard-sales'
|
|
75
|
-
], tmpDir);
|
|
76
|
-
|
|
77
|
-
assert.strictEqual(result.status, 0, `CLI exit non-zero: ${result.stderr}`);
|
|
78
|
-
|
|
79
|
-
const mainModulePath = path.join(tmpDir, 'src', 'modules', 'mini-inventory.js');
|
|
80
|
-
assert.strictEqual(
|
|
81
|
-
fs.existsSync(mainModulePath),
|
|
82
|
-
true,
|
|
83
|
-
'main module mini-inventory.js harus terbentuk'
|
|
84
|
-
);
|
|
85
|
-
|
|
86
|
-
const dashModulePath = path.join(
|
|
87
|
-
tmpDir, 'src', 'modules', 'mini-inventory', 'dash-sales.js'
|
|
88
|
-
);
|
|
89
|
-
assert.strictEqual(
|
|
90
|
-
fs.existsSync(dashModulePath),
|
|
91
|
-
true,
|
|
92
|
-
'dashboard module dash-sales.js harus terbentuk'
|
|
93
|
-
);
|
|
94
|
-
|
|
95
|
-
const registryPath = path.join(tmpDir, '.restforge', 'projects.json');
|
|
96
|
-
assert.strictEqual(
|
|
97
|
-
fs.existsSync(registryPath),
|
|
98
|
-
true,
|
|
99
|
-
'registry projects.json harus terbentuk'
|
|
100
|
-
);
|
|
101
|
-
|
|
102
|
-
const registry = JSON.parse(fs.readFileSync(registryPath, 'utf8'));
|
|
103
|
-
assert.ok(
|
|
104
|
-
registry.projects && registry.projects['mini-inventory'],
|
|
105
|
-
'registry harus mengandung project mini-inventory'
|
|
106
|
-
);
|
|
107
|
-
assert.ok(
|
|
108
|
-
Array.isArray(registry.projects['mini-inventory'].endpoints),
|
|
109
|
-
'project entry harus punya endpoints array'
|
|
110
|
-
);
|
|
111
|
-
assert.ok(
|
|
112
|
-
registry.projects['mini-inventory'].endpoints.includes('dash-sales'),
|
|
113
|
-
"registry endpoints harus mengandung 'dash-sales'"
|
|
114
|
-
);
|
|
115
|
-
|
|
116
|
-
const metadataPath = path.join(tmpDir, 'metadata', 'mini-inventory.json');
|
|
117
|
-
assert.ok(fs.existsSync(metadataPath), 'metadata file harus dibuat');
|
|
118
|
-
const metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf8'));
|
|
119
|
-
assert.ok('dash-sales' in metadata.endpoints, 'metadata harus berisi entry dash-sales');
|
|
120
|
-
assert.strictEqual(metadata.endpoints['dash-sales'].type, 'dashboard');
|
|
121
|
-
} finally {
|
|
122
|
-
cleanupTmpProject(tmpDir);
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
// ===== Missing arguments =====
|
|
127
|
-
|
|
128
|
-
test('missing --project: exit non-zero dan pesan error menyebut --project', () => {
|
|
129
|
-
const tmpDir = setupTmpProject();
|
|
130
|
-
try {
|
|
131
|
-
const result = runCli([
|
|
132
|
-
'--name=dash-sales',
|
|
133
|
-
'--payload=dashboard-sales'
|
|
134
|
-
], tmpDir);
|
|
135
|
-
|
|
136
|
-
assert.notStrictEqual(result.status, 0);
|
|
137
|
-
assert.match(result.stdout + result.stderr, /--project/);
|
|
138
|
-
} finally {
|
|
139
|
-
cleanupTmpProject(tmpDir);
|
|
140
|
-
}
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
test('missing --name: exit non-zero dan pesan error menyebut --name', () => {
|
|
144
|
-
const tmpDir = setupTmpProject();
|
|
145
|
-
try {
|
|
146
|
-
const result = runCli([
|
|
147
|
-
'--project=mini-inventory',
|
|
148
|
-
'--payload=dashboard-sales'
|
|
149
|
-
], tmpDir);
|
|
150
|
-
|
|
151
|
-
assert.notStrictEqual(result.status, 0);
|
|
152
|
-
assert.match(result.stdout + result.stderr, /--name/);
|
|
153
|
-
} finally {
|
|
154
|
-
cleanupTmpProject(tmpDir);
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
test('missing --payload: exit non-zero dan pesan error menyebut --payload', () => {
|
|
159
|
-
const tmpDir = setupTmpProject();
|
|
160
|
-
try {
|
|
161
|
-
const result = runCli([
|
|
162
|
-
'--project=mini-inventory',
|
|
163
|
-
'--name=dash-sales'
|
|
164
|
-
], tmpDir);
|
|
165
|
-
|
|
166
|
-
assert.notStrictEqual(result.status, 0);
|
|
167
|
-
assert.match(result.stdout + result.stderr, /--payload/);
|
|
168
|
-
} finally {
|
|
169
|
-
cleanupTmpProject(tmpDir);
|
|
170
|
-
}
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
// ===== Name prefix validation =====
|
|
174
|
-
|
|
175
|
-
test('--name tanpa prefix dash- ditolak: exit non-zero dan pesan error menyebut prefix', () => {
|
|
176
|
-
const tmpDir = setupTmpProject();
|
|
177
|
-
try {
|
|
178
|
-
const result = runCli([
|
|
179
|
-
'--project=mini-inventory',
|
|
180
|
-
'--name=sales',
|
|
181
|
-
'--payload=dashboard-sales'
|
|
182
|
-
], tmpDir);
|
|
183
|
-
|
|
184
|
-
assert.notStrictEqual(result.status, 0);
|
|
185
|
-
assert.match(result.stdout + result.stderr, /dash-/);
|
|
186
|
-
} finally {
|
|
187
|
-
cleanupTmpProject(tmpDir);
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
test('--name hanya dash- (suffix kosong) ditolak: exit non-zero', () => {
|
|
192
|
-
const tmpDir = setupTmpProject();
|
|
193
|
-
try {
|
|
194
|
-
const result = runCli([
|
|
195
|
-
'--project=mini-inventory',
|
|
196
|
-
'--name=dash-',
|
|
197
|
-
'--payload=dashboard-sales'
|
|
198
|
-
], tmpDir);
|
|
199
|
-
|
|
200
|
-
assert.notStrictEqual(result.status, 0);
|
|
201
|
-
assert.match(result.stdout + result.stderr, /suffix/);
|
|
202
|
-
} finally {
|
|
203
|
-
cleanupTmpProject(tmpDir);
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
// ===== Payload file missing =====
|
|
208
|
-
|
|
209
|
-
test('payload file tidak ada: exit non-zero dan pesan error menyebut nama file', () => {
|
|
210
|
-
const tmpDir = setupTmpProject();
|
|
211
|
-
try {
|
|
212
|
-
const result = runCli([
|
|
213
|
-
'--project=mini-inventory',
|
|
214
|
-
'--name=dash-sales',
|
|
215
|
-
'--payload=does-not-exist'
|
|
216
|
-
], tmpDir);
|
|
217
|
-
|
|
218
|
-
assert.notStrictEqual(result.status, 0);
|
|
219
|
-
assert.match(result.stdout + result.stderr, /does-not-exist/);
|
|
220
|
-
} finally {
|
|
221
|
-
cleanupTmpProject(tmpDir);
|
|
222
|
-
}
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
// ===== Payload tidak valid =====
|
|
226
|
-
|
|
227
|
-
test('payload tidak valid (mengandung tableName): exit non-zero dan pesan error dari validator', () => {
|
|
228
|
-
const tmpDir = setupTmpProject();
|
|
229
|
-
try {
|
|
230
|
-
const badPayload = {
|
|
231
|
-
tableName: 'should_not_be_here',
|
|
232
|
-
widgets: [{ id: 'w1', query: 'file:query/author-sales.sql' }]
|
|
233
|
-
};
|
|
234
|
-
fs.writeFileSync(
|
|
235
|
-
path.join(tmpDir, 'payload', 'invalid-dashboard.json'),
|
|
236
|
-
JSON.stringify(badPayload)
|
|
237
|
-
);
|
|
238
|
-
|
|
239
|
-
const result = runCli([
|
|
240
|
-
'--project=mini-inventory',
|
|
241
|
-
'--name=dash-sales',
|
|
242
|
-
'--payload=invalid-dashboard'
|
|
243
|
-
], tmpDir);
|
|
244
|
-
|
|
245
|
-
assert.notStrictEqual(result.status, 0);
|
|
246
|
-
assert.match(
|
|
247
|
-
result.stdout + result.stderr,
|
|
248
|
-
/tableName/,
|
|
249
|
-
'pesan error harus menyebut tableName (validator membatalkan payload dashboard berisi tableName)'
|
|
250
|
-
);
|
|
251
|
-
} finally {
|
|
252
|
-
cleanupTmpProject(tmpDir);
|
|
253
|
-
}
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
// ===== Force overwrite =====
|
|
257
|
-
|
|
258
|
-
test('force overwrite: file dashboard module sudah ada, --force=true → success dan file lama di-archive', () => {
|
|
259
|
-
const tmpDir = setupTmpProject();
|
|
260
|
-
try {
|
|
261
|
-
const firstRun = runCli([
|
|
262
|
-
'--project=mini-inventory',
|
|
263
|
-
'--name=dash-sales',
|
|
264
|
-
'--payload=dashboard-sales'
|
|
265
|
-
], tmpDir);
|
|
266
|
-
assert.strictEqual(firstRun.status, 0, `first run gagal: ${firstRun.stderr}`);
|
|
267
|
-
|
|
268
|
-
const moduleDir = path.join(tmpDir, 'src', 'modules', 'mini-inventory');
|
|
269
|
-
const liveFile = path.join(moduleDir, 'dash-sales.js');
|
|
270
|
-
assert.strictEqual(fs.existsSync(liveFile), true);
|
|
271
|
-
|
|
272
|
-
const secondRun = runCli([
|
|
273
|
-
'--project=mini-inventory',
|
|
274
|
-
'--name=dash-sales',
|
|
275
|
-
'--payload=dashboard-sales',
|
|
276
|
-
'--force=true'
|
|
277
|
-
], tmpDir);
|
|
278
|
-
assert.strictEqual(secondRun.status, 0, `force run gagal: ${secondRun.stderr}`);
|
|
279
|
-
|
|
280
|
-
const files = fs.readdirSync(moduleDir);
|
|
281
|
-
const archived = files.filter((f) => f.startsWith('dash-sales.js.archive.'));
|
|
282
|
-
assert.ok(
|
|
283
|
-
archived.length >= 1,
|
|
284
|
-
'minimal satu file archive harus terbuat saat force overwrite'
|
|
285
|
-
);
|
|
286
|
-
assert.strictEqual(
|
|
287
|
-
fs.existsSync(liveFile),
|
|
288
|
-
true,
|
|
289
|
-
'live file dash-sales.js harus tetap ada setelah overwrite'
|
|
290
|
-
);
|
|
291
|
-
} finally {
|
|
292
|
-
cleanupTmpProject(tmpDir);
|
|
293
|
-
}
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
// ===== Output content sanity =====
|
|
297
|
-
|
|
298
|
-
// ===== Database propagation =====
|
|
299
|
-
|
|
300
|
-
test('database propagation: --database=mysql → dashboard module emit const dialect = mysql dan require db-mysql', () => {
|
|
301
|
-
const tmpDir = setupTmpProject();
|
|
302
|
-
try {
|
|
303
|
-
const result = runCli([
|
|
304
|
-
'--project=mini-inventory-mysql',
|
|
305
|
-
'--name=dash-sales',
|
|
306
|
-
'--payload=dashboard-sales',
|
|
307
|
-
'--database=mysql'
|
|
308
|
-
], tmpDir);
|
|
309
|
-
|
|
310
|
-
assert.strictEqual(result.status, 0, `CLI exit non-zero: ${result.stderr}`);
|
|
311
|
-
|
|
312
|
-
const dashModulePath = path.join(
|
|
313
|
-
tmpDir, 'src', 'modules', 'mini-inventory-mysql', 'dash-sales.js'
|
|
314
|
-
);
|
|
315
|
-
const content = fs.readFileSync(dashModulePath, 'utf8');
|
|
316
|
-
assert.ok(
|
|
317
|
-
content.includes("const dialect = 'mysql';"),
|
|
318
|
-
"output dashboard module harus emit const dialect = 'mysql'"
|
|
319
|
-
);
|
|
320
|
-
assert.ok(
|
|
321
|
-
content.includes("require('restforgejs/src/utils/db-mysql')"),
|
|
322
|
-
'output dashboard module harus require db-mysql'
|
|
323
|
-
);
|
|
324
|
-
} finally {
|
|
325
|
-
cleanupTmpProject(tmpDir);
|
|
326
|
-
}
|
|
327
|
-
});
|
|
328
|
-
|
|
329
|
-
test('database propagation: --database=sqlite (tidak didukung dashboard) → exit non-zero dengan pesan error sqlite', () => {
|
|
330
|
-
const tmpDir = setupTmpProject();
|
|
331
|
-
try {
|
|
332
|
-
const result = runCli([
|
|
333
|
-
'--project=mini-inventory-sqlite',
|
|
334
|
-
'--name=dash-sales',
|
|
335
|
-
'--payload=dashboard-sales',
|
|
336
|
-
'--database=sqlite'
|
|
337
|
-
], tmpDir);
|
|
338
|
-
|
|
339
|
-
assert.notStrictEqual(result.status, 0, 'CLI harus exit non-zero saat database=sqlite');
|
|
340
|
-
assert.match(
|
|
341
|
-
result.stdout + result.stderr,
|
|
342
|
-
/sqlite/i,
|
|
343
|
-
'pesan error harus menyebut sqlite'
|
|
344
|
-
);
|
|
345
|
-
} finally {
|
|
346
|
-
cleanupTmpProject(tmpDir);
|
|
347
|
-
}
|
|
348
|
-
});
|
|
349
|
-
|
|
350
|
-
test('output content sanity: dash-sales.js mengandung SQL fragment dari fixture', () => {
|
|
351
|
-
const tmpDir = setupTmpProject();
|
|
352
|
-
try {
|
|
353
|
-
const result = runCli([
|
|
354
|
-
'--project=mini-inventory',
|
|
355
|
-
'--name=dash-sales',
|
|
356
|
-
'--payload=dashboard-sales'
|
|
357
|
-
], tmpDir);
|
|
358
|
-
assert.strictEqual(result.status, 0, `CLI exit non-zero: ${result.stderr}`);
|
|
359
|
-
|
|
360
|
-
const dashModulePath = path.join(
|
|
361
|
-
tmpDir, 'src', 'modules', 'mini-inventory', 'dash-sales.js'
|
|
362
|
-
);
|
|
363
|
-
const content = fs.readFileSync(dashModulePath, 'utf8');
|
|
364
|
-
|
|
365
|
-
assert.ok(
|
|
366
|
-
content.includes('country AS label'),
|
|
367
|
-
'fragment SQL author-sales harus muncul di output'
|
|
368
|
-
);
|
|
369
|
-
assert.ok(
|
|
370
|
-
content.includes('product_name AS label'),
|
|
371
|
-
'fragment SQL sales-statistics harus muncul di output'
|
|
372
|
-
);
|
|
373
|
-
assert.ok(
|
|
374
|
-
content.includes("router.post('/dashboard'"),
|
|
375
|
-
'output harus emit router.post handler /dashboard'
|
|
376
|
-
);
|
|
377
|
-
} finally {
|
|
378
|
-
cleanupTmpProject(tmpDir);
|
|
379
|
-
}
|
|
380
|
-
});
|
|
381
|
-
|
|
382
|
-
// ===== Cache cross-reference (orchestrator → validator options) =====
|
|
383
|
-
|
|
384
|
-
/**
|
|
385
|
-
* Tulis ulang payload dashboard-sales.json dengan blok cache tambahan.
|
|
386
|
-
* Membuktikan orchestrator meneruskan options.projectName + options.metadataDir
|
|
387
|
-
* ke validator, karena cross-reference path hanya aktif saat
|
|
388
|
-
* cache.enabled=true && invalidates non-empty.
|
|
389
|
-
*/
|
|
390
|
-
function writeCachePayload(tmpDir, cacheBlock) {
|
|
391
|
-
const payloadPath = path.join(tmpDir, 'payload', 'dashboard-sales.json');
|
|
392
|
-
const base = JSON.parse(fs.readFileSync(payloadPath, 'utf8'));
|
|
393
|
-
base.cache = cacheBlock;
|
|
394
|
-
fs.writeFileSync(payloadPath, JSON.stringify(base, null, 2));
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
/**
|
|
398
|
-
* Tulis metadata fixture sederhana dengan endpoint module CRUD untuk
|
|
399
|
-
* tabel-tabel yang dirujuk SQL widget. Membuktikan cross-reference berhasil
|
|
400
|
-
* ketika invalidates declarative match dengan tabel yang ada di metadata.
|
|
401
|
-
*/
|
|
402
|
-
function writeMetadataFixture(tmpDir, projectName, tables) {
|
|
403
|
-
const metaDir = path.join(tmpDir, 'metadata');
|
|
404
|
-
fs.mkdirSync(metaDir, { recursive: true });
|
|
405
|
-
const endpoints = {};
|
|
406
|
-
for (const t of tables) {
|
|
407
|
-
endpoints[t] = {
|
|
408
|
-
version: '2.0.0',
|
|
409
|
-
type: 'module',
|
|
410
|
-
tableName: t,
|
|
411
|
-
path: `src/modules/${projectName}/${t}.js`
|
|
412
|
-
};
|
|
413
|
-
}
|
|
414
|
-
fs.writeFileSync(
|
|
415
|
-
path.join(metaDir, `${projectName}.json`),
|
|
416
|
-
JSON.stringify({ project: projectName, endpoints }, null, 2)
|
|
417
|
-
);
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
test('cache cross-reference: validator dipanggil dengan options.projectName — metadata absent + invalidates non-empty → error menyebut metadata path', () => {
|
|
421
|
-
const tmpDir = setupTmpProject();
|
|
422
|
-
try {
|
|
423
|
-
writeCachePayload(tmpDir, {
|
|
424
|
-
enabled: true,
|
|
425
|
-
ttl: 300,
|
|
426
|
-
invalidates: ['sales', 'order_items']
|
|
427
|
-
});
|
|
428
|
-
|
|
429
|
-
const result = runCli([
|
|
430
|
-
'--project=mini-inventory',
|
|
431
|
-
'--name=dash-sales',
|
|
432
|
-
'--payload=dashboard-sales'
|
|
433
|
-
], tmpDir);
|
|
434
|
-
|
|
435
|
-
assert.notStrictEqual(result.status, 0, 'CLI harus exit non-zero saat metadata tidak ada');
|
|
436
|
-
const combined = result.stdout + result.stderr;
|
|
437
|
-
assert.match(
|
|
438
|
-
combined,
|
|
439
|
-
/metadata\/mini-inventory\.json/,
|
|
440
|
-
'pesan error harus menyebut metadata/{projectName}.json — bukti orchestrator pass options.projectName=args.project'
|
|
441
|
-
);
|
|
442
|
-
} finally {
|
|
443
|
-
cleanupTmpProject(tmpDir);
|
|
444
|
-
}
|
|
445
|
-
});
|
|
446
|
-
|
|
447
|
-
test('cache cross-reference: validator dipanggil dengan options.metadataDir=cwd/metadata — happy path success', () => {
|
|
448
|
-
const tmpDir = setupTmpProject();
|
|
449
|
-
try {
|
|
450
|
-
writeCachePayload(tmpDir, {
|
|
451
|
-
enabled: true,
|
|
452
|
-
ttl: 300,
|
|
453
|
-
invalidates: ['sales', 'order_items']
|
|
454
|
-
});
|
|
455
|
-
writeMetadataFixture(tmpDir, 'mini-inventory', ['sales', 'order_items']);
|
|
456
|
-
|
|
457
|
-
const result = runCli([
|
|
458
|
-
'--project=mini-inventory',
|
|
459
|
-
'--name=dash-sales',
|
|
460
|
-
'--payload=dashboard-sales'
|
|
461
|
-
], tmpDir);
|
|
462
|
-
|
|
463
|
-
assert.strictEqual(
|
|
464
|
-
result.status,
|
|
465
|
-
0,
|
|
466
|
-
`CLI gagal padahal cross-reference seharusnya pass: ${result.stderr}`
|
|
467
|
-
);
|
|
468
|
-
|
|
469
|
-
const dashModulePath = path.join(
|
|
470
|
-
tmpDir, 'src', 'modules', 'mini-inventory', 'dash-sales.js'
|
|
471
|
-
);
|
|
472
|
-
assert.ok(fs.existsSync(dashModulePath), 'dashboard module harus tetap ter-generate');
|
|
473
|
-
const content = fs.readFileSync(dashModulePath, 'utf8');
|
|
474
|
-
assert.ok(
|
|
475
|
-
content.includes("require('restforgejs/src/utils/cache-manager')"),
|
|
476
|
-
'output handler harus emit cache-manager require (cache.enabled=true)'
|
|
477
|
-
);
|
|
478
|
-
} finally {
|
|
479
|
-
cleanupTmpProject(tmpDir);
|
|
480
|
-
}
|
|
481
|
-
});
|
|
482
|
-
|
|
483
|
-
test('cache cross-reference: cache.enabled=false → cross-reference di-skip walau metadata absent', () => {
|
|
484
|
-
const tmpDir = setupTmpProject();
|
|
485
|
-
try {
|
|
486
|
-
writeCachePayload(tmpDir, {
|
|
487
|
-
enabled: false,
|
|
488
|
-
invalidates: ['sales']
|
|
489
|
-
});
|
|
490
|
-
|
|
491
|
-
const result = runCli([
|
|
492
|
-
'--project=mini-inventory',
|
|
493
|
-
'--name=dash-sales',
|
|
494
|
-
'--payload=dashboard-sales'
|
|
495
|
-
], tmpDir);
|
|
496
|
-
|
|
497
|
-
assert.strictEqual(
|
|
498
|
-
result.status,
|
|
499
|
-
0,
|
|
500
|
-
`CLI gagal padahal cache disabled seharusnya skip cross-reference: ${result.stderr}`
|
|
501
|
-
);
|
|
502
|
-
} finally {
|
|
503
|
-
cleanupTmpProject(tmpDir);
|
|
504
|
-
}
|
|
505
|
-
});
|