@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,66 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Stub introspector returning a small two-table dataset (`category` + `item_product`).
|
|
5
|
-
* Used by dbschema-introspect CLI tests to exercise bulk + single-table modes
|
|
6
|
-
* without touching a real database.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
const TABLES = {
|
|
10
|
-
category: {
|
|
11
|
-
tableName: 'category',
|
|
12
|
-
columns: [
|
|
13
|
-
{ column_name: 'category_id', data_type: 'uuid', udt_name: 'uuid',
|
|
14
|
-
column_default: null, is_nullable: 'NO' },
|
|
15
|
-
{ column_name: 'code', data_type: 'character varying', udt_name: 'varchar',
|
|
16
|
-
column_default: null, is_nullable: 'NO', character_maximum_length: 20 },
|
|
17
|
-
{ column_name: 'name', data_type: 'character varying', udt_name: 'varchar',
|
|
18
|
-
column_default: null, is_nullable: 'NO', character_maximum_length: 100 },
|
|
19
|
-
{ column_name: 'is_active', data_type: 'boolean', udt_name: 'bool',
|
|
20
|
-
column_default: 'true', is_nullable: 'YES' }
|
|
21
|
-
],
|
|
22
|
-
primaryKey: ['category_id'],
|
|
23
|
-
uniques: [{ name: 'uq_category_code', columns: ['code'] }],
|
|
24
|
-
foreignKeys: [],
|
|
25
|
-
indexes: [
|
|
26
|
-
{ name: 'pk_category', columns: ['category_id'], unique: true, primary: true },
|
|
27
|
-
{ name: 'idx_is_active', columns: ['is_active'], unique: false, primary: false }
|
|
28
|
-
],
|
|
29
|
-
checks: []
|
|
30
|
-
},
|
|
31
|
-
item_product: {
|
|
32
|
-
tableName: 'item_product',
|
|
33
|
-
columns: [
|
|
34
|
-
{ column_name: 'item_product_id', data_type: 'uuid', udt_name: 'uuid',
|
|
35
|
-
column_default: null, is_nullable: 'NO' },
|
|
36
|
-
{ column_name: 'category_id', data_type: 'uuid', udt_name: 'uuid',
|
|
37
|
-
column_default: null, is_nullable: 'NO' },
|
|
38
|
-
{ column_name: 'product_name', data_type: 'character varying', udt_name: 'varchar',
|
|
39
|
-
column_default: null, is_nullable: 'NO', character_maximum_length: 100 }
|
|
40
|
-
],
|
|
41
|
-
primaryKey: ['item_product_id'],
|
|
42
|
-
uniques: [],
|
|
43
|
-
foreignKeys: [{
|
|
44
|
-
name: 'fk_item_category',
|
|
45
|
-
columns: ['category_id'],
|
|
46
|
-
references: { schema: 'public', table: 'category', columns: ['category_id'] },
|
|
47
|
-
onDelete: 'CASCADE',
|
|
48
|
-
onUpdate: null
|
|
49
|
-
}],
|
|
50
|
-
indexes: [
|
|
51
|
-
{ name: 'pk_item_product', columns: ['item_product_id'], unique: true, primary: true }
|
|
52
|
-
],
|
|
53
|
-
checks: []
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
async function introspect({ table }) {
|
|
58
|
-
if (table) {
|
|
59
|
-
const meta = TABLES[table];
|
|
60
|
-
if (!meta) return { tables: [] };
|
|
61
|
-
return { tables: [meta] };
|
|
62
|
-
}
|
|
63
|
-
return { tables: Object.values(TABLES) };
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
module.exports = { introspect };
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
async function applyStatements(options) {
|
|
4
|
-
const total = options.statements.length;
|
|
5
|
-
if (typeof options.onProgress === 'function' && total >= 1) {
|
|
6
|
-
options.onProgress({ index: 1, total, statement: options.statements[0], status: 'running' });
|
|
7
|
-
options.onProgress({ index: 1, total, statement: options.statements[0], status: 'success' });
|
|
8
|
-
if (total >= 2) {
|
|
9
|
-
options.onProgress({
|
|
10
|
-
index: 2,
|
|
11
|
-
total,
|
|
12
|
-
statement: options.statements[1],
|
|
13
|
-
status: 'error',
|
|
14
|
-
error: new Error("Table 'foo' already exists")
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
return {
|
|
20
|
-
applied: 1,
|
|
21
|
-
failed: 1,
|
|
22
|
-
durationMs: 8,
|
|
23
|
-
status: 'PARTIAL',
|
|
24
|
-
failedIndex: 2,
|
|
25
|
-
failedStatement: options.statements[1] || ''
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
module.exports = { applyStatements };
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
async function applyStatements(options) {
|
|
4
|
-
const total = options.statements.length;
|
|
5
|
-
if (typeof options.onProgress === 'function' && total >= 1) {
|
|
6
|
-
options.onProgress({ index: 1, total, statement: options.statements[0], status: 'running' });
|
|
7
|
-
options.onProgress({
|
|
8
|
-
index: 1,
|
|
9
|
-
total,
|
|
10
|
-
statement: options.statements[0],
|
|
11
|
-
status: 'error',
|
|
12
|
-
error: new Error('column "id" does not exist')
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const err = new Error('column "id" does not exist');
|
|
17
|
-
err.status = 'ROLLBACK';
|
|
18
|
-
err.applied = 0;
|
|
19
|
-
err.failed = 1;
|
|
20
|
-
err.failedIndex = 1;
|
|
21
|
-
err.failedStatement = options.statements[0] || '';
|
|
22
|
-
err.durationMs = 4;
|
|
23
|
-
throw err;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
module.exports = { applyStatements };
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const fs = require('fs');
|
|
4
|
-
|
|
5
|
-
async function applyStatements(options) {
|
|
6
|
-
const recordPath = process.env.DBSCHEMA_KIT_TEST_RECORD_FILE;
|
|
7
|
-
if (recordPath) {
|
|
8
|
-
fs.writeFileSync(
|
|
9
|
-
recordPath,
|
|
10
|
-
JSON.stringify({
|
|
11
|
-
statements: options.statements,
|
|
12
|
-
dialect: options.dialect,
|
|
13
|
-
config: options.config
|
|
14
|
-
}, null, 2)
|
|
15
|
-
);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
if (typeof options.onProgress === 'function') {
|
|
19
|
-
for (let i = 0; i < options.statements.length; i++) {
|
|
20
|
-
options.onProgress({
|
|
21
|
-
index: i + 1,
|
|
22
|
-
total: options.statements.length,
|
|
23
|
-
statement: options.statements[i],
|
|
24
|
-
status: 'running'
|
|
25
|
-
});
|
|
26
|
-
options.onProgress({
|
|
27
|
-
index: i + 1,
|
|
28
|
-
total: options.statements.length,
|
|
29
|
-
statement: options.statements[i],
|
|
30
|
-
status: 'success'
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return {
|
|
36
|
-
applied: options.statements.length,
|
|
37
|
-
failed: 0,
|
|
38
|
-
durationMs: 5,
|
|
39
|
-
status: 'SUCCESS'
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
module.exports = { applyStatements };
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
module.exports = ({ defineModel }) => defineModel('events', {
|
|
4
|
-
schema: 'audit',
|
|
5
|
-
fields: {
|
|
6
|
-
event_id: 'uuid pk',
|
|
7
|
-
product_id: 'uuid notnull',
|
|
8
|
-
action: 'string:50 notnull'
|
|
9
|
-
},
|
|
10
|
-
relations: {
|
|
11
|
-
product: {
|
|
12
|
-
type: 'belongsTo',
|
|
13
|
-
target: 'inventory.products',
|
|
14
|
-
localKey: 'product_id',
|
|
15
|
-
references: 'product_id'
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
});
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const test = require('node:test');
|
|
4
|
-
const assert = require('node:assert');
|
|
5
|
-
const path = require('path');
|
|
6
|
-
|
|
7
|
-
const { loadConfig, parseConfig } = require('../../../../lib/dbschema-kit/connection');
|
|
8
|
-
|
|
9
|
-
const FIXTURES = path.join(__dirname, 'fixtures', 'connection');
|
|
10
|
-
|
|
11
|
-
test('connection: parseConfig parse KEY=VALUE menjadi object dengan dua key', () => {
|
|
12
|
-
const result = parseConfig('DB_TYPE=postgresql\nDB_HOST=localhost');
|
|
13
|
-
assert.deepStrictEqual(result, { DB_TYPE: 'postgresql', DB_HOST: 'localhost' });
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
test('connection: parseConfig skip baris kosong dan baris comment (#)', () => {
|
|
17
|
-
const content = [
|
|
18
|
-
'# Comment di awal',
|
|
19
|
-
'',
|
|
20
|
-
'DB_TYPE=postgresql',
|
|
21
|
-
' ',
|
|
22
|
-
'# Comment di tengah',
|
|
23
|
-
'DB_HOST=localhost',
|
|
24
|
-
''
|
|
25
|
-
].join('\n');
|
|
26
|
-
const result = parseConfig(content);
|
|
27
|
-
assert.deepStrictEqual(result, { DB_TYPE: 'postgresql', DB_HOST: 'localhost' });
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
test('connection: parseConfig trim whitespace pada key dan value', () => {
|
|
31
|
-
const result = parseConfig(' DB_HOST = localhost \n DB_PORT = 5432');
|
|
32
|
-
assert.deepStrictEqual(result, { DB_HOST: 'localhost', DB_PORT: '5432' });
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
test('connection: parseConfig throw bila baris tidak match KEY=VALUE', () => {
|
|
36
|
-
assert.throws(
|
|
37
|
-
() => parseConfig('DB_TYPE=postgresql\nINVALID_LINE_WITHOUT_EQUALS'),
|
|
38
|
-
/Invalid config line 2/
|
|
39
|
-
);
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
test('connection: parseConfig throw bila key kosong', () => {
|
|
43
|
-
assert.throws(() => parseConfig('=value'), /Key cannot be empty/);
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
test('connection: parseConfig throw bila content bukan string', () => {
|
|
47
|
-
assert.throws(() => parseConfig(null), /content must be a string/);
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
test('connection: parseConfig parse value yang mengandung tanda = (URL, dst)', () => {
|
|
51
|
-
const result = parseConfig('DB_URL=postgres://user:pass@host:5432/db?sslmode=require');
|
|
52
|
-
assert.deepStrictEqual(result, {
|
|
53
|
-
DB_URL: 'postgres://user:pass@host:5432/db?sslmode=require'
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
test('connection: loadConfig happy path postgres lengkap', () => {
|
|
58
|
-
const config = loadConfig(path.join(FIXTURES, 'postgres-valid.env'));
|
|
59
|
-
assert.strictEqual(config.dialect, 'postgres');
|
|
60
|
-
assert.strictEqual(config.host, 'localhost');
|
|
61
|
-
assert.strictEqual(config.port, 5432);
|
|
62
|
-
assert.strictEqual(typeof config.port, 'number');
|
|
63
|
-
assert.strictEqual(config.database, 'mini_inventory');
|
|
64
|
-
assert.strictEqual(config.user, 'postgres');
|
|
65
|
-
assert.strictEqual(config.password, 'secret');
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
test('connection: loadConfig SQLite hanya butuh dialect dan file', () => {
|
|
69
|
-
const config = loadConfig(path.join(FIXTURES, 'sqlite-valid.env'));
|
|
70
|
-
assert.strictEqual(config.dialect, 'sqlite');
|
|
71
|
-
assert.strictEqual(config.file, './database.sqlite');
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
test('connection: loadConfig Oracle expose serviceName dari DB_SERVICE_NAME', () => {
|
|
75
|
-
const config = loadConfig(path.join(FIXTURES, 'oracle-valid.env'));
|
|
76
|
-
assert.strictEqual(config.dialect, 'oracle');
|
|
77
|
-
assert.strictEqual(config.serviceName, 'XEPDB1');
|
|
78
|
-
assert.strictEqual(config.database, undefined);
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
test('connection: loadConfig throw bila DB_TYPE tidak ada', () => {
|
|
82
|
-
assert.throws(
|
|
83
|
-
() => loadConfig(path.join(FIXTURES, 'missing-dialect.env')),
|
|
84
|
-
/DB_TYPE not found/
|
|
85
|
-
);
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
test('connection: loadConfig throw bila DB_TYPE invalid (mssql)', () => {
|
|
89
|
-
assert.throws(
|
|
90
|
-
() => loadConfig(path.join(FIXTURES, 'invalid-dialect.env')),
|
|
91
|
-
/Invalid DB_TYPE 'mssql'/
|
|
92
|
-
);
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
test('connection: loadConfig throw bila required field missing (postgresql tanpa DB_HOST)', () => {
|
|
96
|
-
assert.throws(
|
|
97
|
-
() => loadConfig(path.join(FIXTURES, 'missing-host.env')),
|
|
98
|
-
/missing required fields for postgresql: DB_HOST/
|
|
99
|
-
);
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
test('connection: loadConfig throw bila file tidak exist', () => {
|
|
103
|
-
assert.throws(
|
|
104
|
-
() => loadConfig(path.join(FIXTURES, 'nonexistent.env')),
|
|
105
|
-
/Config file not found/
|
|
106
|
-
);
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
test('connection: loadConfig throw bila filePath bukan string', () => {
|
|
110
|
-
assert.throws(() => loadConfig(null), /filePath must be a non-empty string/);
|
|
111
|
-
assert.throws(() => loadConfig(''), /filePath must be a non-empty string/);
|
|
112
|
-
});
|
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const test = require('node:test');
|
|
4
|
-
const assert = require('node:assert');
|
|
5
|
-
const path = require('node:path');
|
|
6
|
-
|
|
7
|
-
const { defineModel } = require('../../../../lib/dbschema-kit/define-model');
|
|
8
|
-
const { loadSchemaFolder } = require('../../../../lib/dbschema-kit/loader');
|
|
9
|
-
const { generateDDL } = require('../../../../lib/dbschema-kit/ddl-generator');
|
|
10
|
-
|
|
11
|
-
const FIXTURE_VALID = path.resolve(__dirname, 'fixtures', 'integration', 'mini-inventory');
|
|
12
|
-
|
|
13
|
-
test('ddl-generator: tabel tunggal + dialect postgres menghasilkan header + CREATE TABLE tanpa DROP/INDEX section bila tidak ada index', () => {
|
|
14
|
-
const ir = defineModel('only_table', {
|
|
15
|
-
fields: {
|
|
16
|
-
only_table_id: 'string:36 pk',
|
|
17
|
-
name: 'string:100 notnull'
|
|
18
|
-
}
|
|
19
|
-
});
|
|
20
|
-
const models = new Map([['only_table', ir]]);
|
|
21
|
-
|
|
22
|
-
const sql = generateDDL(models, { dialect: 'postgres' });
|
|
23
|
-
|
|
24
|
-
assert.match(sql, /-- Generated by dbschema:generate-ddl/);
|
|
25
|
-
assert.match(sql, /-- Dialect: postgres/);
|
|
26
|
-
assert.match(sql, /-- Generated at: \d{4}-\d{2}-\d{2}T/);
|
|
27
|
-
assert.match(sql, /-- CREATE TABLE section/);
|
|
28
|
-
assert.match(sql, /CREATE TABLE only_table/);
|
|
29
|
-
assert.doesNotMatch(sql, /-- DROP section/);
|
|
30
|
-
assert.doesNotMatch(sql, /-- CREATE INDEX section/);
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
test('ddl-generator: drop=true menambahkan section DROP dengan header "-- DROP section"', () => {
|
|
34
|
-
const ir = defineModel('only_table', {
|
|
35
|
-
fields: { only_table_id: 'string:36 pk' }
|
|
36
|
-
});
|
|
37
|
-
const models = new Map([['only_table', ir]]);
|
|
38
|
-
|
|
39
|
-
const sql = generateDDL(models, { dialect: 'postgres', drop: true });
|
|
40
|
-
|
|
41
|
-
assert.match(sql, /-- DROP section/);
|
|
42
|
-
assert.match(sql, /DROP TABLE IF EXISTS only_table CASCADE;/);
|
|
43
|
-
// DROP harus muncul sebelum CREATE TABLE
|
|
44
|
-
const dropIdx = sql.indexOf('DROP TABLE');
|
|
45
|
-
const createIdx = sql.indexOf('CREATE TABLE');
|
|
46
|
-
assert.ok(dropIdx > 0 && dropIdx < createIdx, 'DROP harus sebelum CREATE TABLE');
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
test('ddl-generator: DROP order = reverse topological (child sebelum parent)', () => {
|
|
50
|
-
const parent = defineModel('parent', {
|
|
51
|
-
fields: { parent_id: 'string:36 pk' }
|
|
52
|
-
});
|
|
53
|
-
const child = defineModel('child', {
|
|
54
|
-
fields: {
|
|
55
|
-
child_id: 'string:36 pk',
|
|
56
|
-
parent_id: 'string:36 notnull'
|
|
57
|
-
},
|
|
58
|
-
relations: {
|
|
59
|
-
parent: { type: 'belongsTo', target: 'parent', localKey: 'parent_id', references: 'parent_id' }
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
const models = new Map([['parent', parent], ['child', child]]);
|
|
64
|
-
const sql = generateDDL(models, { dialect: 'postgres', drop: true });
|
|
65
|
-
|
|
66
|
-
const dropChildIdx = sql.indexOf('DROP TABLE IF EXISTS child');
|
|
67
|
-
const dropParentIdx = sql.indexOf('DROP TABLE IF EXISTS parent');
|
|
68
|
-
assert.ok(dropChildIdx > 0 && dropParentIdx > 0);
|
|
69
|
-
assert.ok(dropChildIdx < dropParentIdx, 'DROP child harus sebelum DROP parent');
|
|
70
|
-
|
|
71
|
-
// CREATE order kebalikannya
|
|
72
|
-
const createParentIdx = sql.indexOf('CREATE TABLE parent');
|
|
73
|
-
const createChildIdx = sql.indexOf('CREATE TABLE child');
|
|
74
|
-
assert.ok(createParentIdx < createChildIdx, 'CREATE parent harus sebelum CREATE child');
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
test('ddl-generator: multiple tables dengan FK menghasilkan CREATE order = topological (parent dulu)', () => {
|
|
78
|
-
const models = loadSchemaFolder(FIXTURE_VALID);
|
|
79
|
-
const sql = generateDDL(models, { dialect: 'postgres' });
|
|
80
|
-
|
|
81
|
-
const categoryIdx = sql.indexOf('CREATE TABLE category');
|
|
82
|
-
const itemProductIdx = sql.indexOf('CREATE TABLE item_product');
|
|
83
|
-
assert.ok(categoryIdx > 0 && itemProductIdx > 0);
|
|
84
|
-
assert.ok(categoryIdx < itemProductIdx, 'category harus sebelum item_product (item_product punya FK ke category)');
|
|
85
|
-
|
|
86
|
-
const stockInboundIdx = sql.indexOf('CREATE TABLE stock_inbound');
|
|
87
|
-
const stockInboundItemIdx = sql.indexOf('CREATE TABLE stock_inbound_item');
|
|
88
|
-
assert.ok(stockInboundIdx < stockInboundItemIdx, 'stock_inbound harus sebelum stock_inbound_item');
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
test('ddl-generator: tabel dengan index menghasilkan CREATE INDEX section di akhir, urut topological', () => {
|
|
92
|
-
const a = defineModel('parent_idx', {
|
|
93
|
-
fields: {
|
|
94
|
-
parent_idx_id: 'string:36 pk',
|
|
95
|
-
name: 'string:100 notnull',
|
|
96
|
-
flag: 'boolean'
|
|
97
|
-
},
|
|
98
|
-
indexes: ['flag']
|
|
99
|
-
});
|
|
100
|
-
const b = defineModel('child_idx', {
|
|
101
|
-
fields: {
|
|
102
|
-
child_idx_id: 'string:36 pk',
|
|
103
|
-
parent_idx_id: 'string:36 notnull',
|
|
104
|
-
tag: 'string:50'
|
|
105
|
-
},
|
|
106
|
-
indexes: ['tag'],
|
|
107
|
-
relations: {
|
|
108
|
-
parent: { type: 'belongsTo', target: 'parent_idx', localKey: 'parent_idx_id', references: 'parent_idx_id' }
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
const models = new Map([['child_idx', b], ['parent_idx', a]]);
|
|
113
|
-
const sql = generateDDL(models, { dialect: 'postgres' });
|
|
114
|
-
|
|
115
|
-
assert.match(sql, /-- CREATE INDEX section/);
|
|
116
|
-
|
|
117
|
-
const indexSectionIdx = sql.indexOf('-- CREATE INDEX section');
|
|
118
|
-
const lastCreateTableIdx = sql.lastIndexOf('CREATE TABLE');
|
|
119
|
-
assert.ok(indexSectionIdx > lastCreateTableIdx, 'CREATE INDEX section harus setelah semua CREATE TABLE');
|
|
120
|
-
|
|
121
|
-
// Urutan index ikut topological tabel: parent_idx index muncul sebelum child_idx index
|
|
122
|
-
const idxParent = sql.indexOf('ON parent_idx');
|
|
123
|
-
const idxChild = sql.indexOf('ON child_idx');
|
|
124
|
-
assert.ok(idxParent > 0 && idxChild > 0);
|
|
125
|
-
assert.ok(idxParent < idxChild, 'index parent_idx harus sebelum index child_idx');
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
test('ddl-generator: map kosong menghasilkan output hanya header, tanpa section', () => {
|
|
129
|
-
const sql = generateDDL(new Map(), { dialect: 'postgres' });
|
|
130
|
-
|
|
131
|
-
assert.match(sql, /-- Generated by dbschema:generate-ddl/);
|
|
132
|
-
assert.match(sql, /-- Dialect: postgres/);
|
|
133
|
-
assert.doesNotMatch(sql, /-- DROP section/);
|
|
134
|
-
assert.doesNotMatch(sql, /-- CREATE TABLE section/);
|
|
135
|
-
assert.doesNotMatch(sql, /-- CREATE INDEX section/);
|
|
136
|
-
assert.doesNotMatch(sql, /CREATE TABLE/);
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
test('ddl-generator: dialect mysql emit identifier tanpa quote', () => {
|
|
140
|
-
const ir = defineModel('only_table', {
|
|
141
|
-
fields: {
|
|
142
|
-
only_table_id: 'string:36 pk',
|
|
143
|
-
name: 'string:100 notnull'
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
const models = new Map([['only_table', ir]]);
|
|
147
|
-
|
|
148
|
-
const sql = generateDDL(models, { dialect: 'mysql' });
|
|
149
|
-
|
|
150
|
-
assert.match(sql, /-- Dialect: mysql/);
|
|
151
|
-
assert.match(sql, /CREATE TABLE only_table/);
|
|
152
|
-
assert.match(sql, /only_table_id VARCHAR/);
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
test('ddl-generator: dialect oracle dengan drop=true emit DROP berbentuk PL/SQL block tanpa `;` setelah `/`', () => {
|
|
156
|
-
const ir = defineModel('only_table', {
|
|
157
|
-
fields: { only_table_id: 'string:36 pk' }
|
|
158
|
-
});
|
|
159
|
-
const models = new Map([['only_table', ir]]);
|
|
160
|
-
|
|
161
|
-
const sql = generateDDL(models, { dialect: 'oracle', drop: true });
|
|
162
|
-
|
|
163
|
-
assert.match(sql, /BEGIN/);
|
|
164
|
-
assert.match(sql, /EXECUTE IMMEDIATE 'DROP TABLE only_table CASCADE CONSTRAINTS'/);
|
|
165
|
-
assert.match(sql, /EXCEPTION/);
|
|
166
|
-
assert.match(sql, /END;/);
|
|
167
|
-
// Tidak boleh ada `;` setelah `/` di Oracle DROP block
|
|
168
|
-
assert.doesNotMatch(sql, /\/;/);
|
|
169
|
-
// Pastikan ada `/` terminator pada baris tersendiri
|
|
170
|
-
assert.match(sql, /\n\/\n/);
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
test('ddl-generator: header comment menyertakan timestamp ISO 8601 (UTC)', () => {
|
|
174
|
-
const ir = defineModel('only_table', { fields: { only_table_id: 'string:36 pk' } });
|
|
175
|
-
const models = new Map([['only_table', ir]]);
|
|
176
|
-
|
|
177
|
-
const sql = generateDDL(models, { dialect: 'postgres' });
|
|
178
|
-
// Match ISO 8601 UTC timestamp
|
|
179
|
-
assert.match(sql, /-- Generated at: \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z/);
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
test('ddl-generator: setiap CREATE TABLE statement diakhiri dengan `;`', () => {
|
|
183
|
-
const models = loadSchemaFolder(FIXTURE_VALID);
|
|
184
|
-
const sql = generateDDL(models, { dialect: 'postgres' });
|
|
185
|
-
|
|
186
|
-
const lines = sql.split('\n');
|
|
187
|
-
// Cari line yang mulai dengan ')' dan pastikan diikuti ';'
|
|
188
|
-
let createTableEndingFound = 0;
|
|
189
|
-
for (let i = 0; i < lines.length; i++) {
|
|
190
|
-
if (lines[i].trim() === ');') createTableEndingFound++;
|
|
191
|
-
}
|
|
192
|
-
assert.ok(createTableEndingFound >= 6, `expected at least 6 CREATE TABLE endings, got ${createTableEndingFound}`);
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
test('ddl-generator: input bukan Map melempar error', () => {
|
|
196
|
-
assert.throws(() => generateDDL({}, { dialect: 'postgres' }), /must be a Map/);
|
|
197
|
-
assert.throws(() => generateDDL([], { dialect: 'postgres' }), /must be a Map/);
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
test('ddl-generator: dialect tidak dikenal melempar error', () => {
|
|
201
|
-
const ir = defineModel('only_table', { fields: { only_table_id: 'string:36 pk' } });
|
|
202
|
-
const models = new Map([['only_table', ir]]);
|
|
203
|
-
|
|
204
|
-
assert.throws(() => generateDDL(models, { dialect: 'mssql' }), /Unknown dialect/);
|
|
205
|
-
});
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const test = require('node:test');
|
|
4
|
-
const assert = require('node:assert');
|
|
5
|
-
|
|
6
|
-
const { defineModel } = require('../../../../lib/dbschema-kit/define-model');
|
|
7
|
-
|
|
8
|
-
test('define-model: returns IR object dengan struktur lengkap (sanity check)', () => {
|
|
9
|
-
const ir = defineModel('foo', {
|
|
10
|
-
fields: {
|
|
11
|
-
id: 'uuid pk',
|
|
12
|
-
name: 'string:20 notnull'
|
|
13
|
-
}
|
|
14
|
-
});
|
|
15
|
-
assert.strictEqual(ir.tableName, 'foo');
|
|
16
|
-
assert.ok(ir.fields, 'fields property exists');
|
|
17
|
-
assert.ok(Array.isArray(ir.primaryKey), 'primaryKey is array');
|
|
18
|
-
assert.ok(Array.isArray(ir.indexes), 'indexes is array');
|
|
19
|
-
assert.ok(Array.isArray(ir.uniques), 'uniques is array');
|
|
20
|
-
assert.strictEqual(typeof ir.relations, 'object', 'relations is object');
|
|
21
|
-
assert.ok(Array.isArray(ir.checks), 'checks is array');
|
|
22
|
-
assert.ok(ir._meta, '_meta exists');
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
test('define-model: propagate error dari parser dengan informasi tableName di error message', () => {
|
|
26
|
-
assert.throws(
|
|
27
|
-
() => defineModel('purchase_order', { fields: { status: 'string:20 uniqe' } }),
|
|
28
|
-
/^Error: Table 'purchase_order': Field 'status': unknown constraint 'uniqe'$/
|
|
29
|
-
);
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
test('define-model: mengembalikan object literal yang freezable (bukan class instance)', () => {
|
|
33
|
-
const ir = defineModel('foo', { fields: { id: 'uuid pk' } });
|
|
34
|
-
assert.strictEqual(Object.getPrototypeOf(ir), Object.prototype, 'must be plain object');
|
|
35
|
-
assert.doesNotThrow(() => Object.freeze(ir), 'should be freezable without error');
|
|
36
|
-
assert.ok(Object.isFrozen(ir), 'object should be frozen after freeze call');
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
test('define-model: throw validator error bila tableName uppercase', () => {
|
|
40
|
-
assert.throws(
|
|
41
|
-
() => defineModel('StockInbound', { fields: { id: 'string:36 pk' } }),
|
|
42
|
-
/^Error: Table name must be snake_case \(lowercase, alphanumeric, underscore, no leading digit\)$/
|
|
43
|
-
);
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
test('define-model: throw validator error bila relation localKey reference field tidak existing', () => {
|
|
47
|
-
assert.throws(
|
|
48
|
-
() => defineModel('foo', {
|
|
49
|
-
fields: { id: 'uuid pk' },
|
|
50
|
-
relations: {
|
|
51
|
-
bar: { type: 'belongsTo', localKey: 'nonexistent_field', references: 'id' }
|
|
52
|
-
}
|
|
53
|
-
}),
|
|
54
|
-
/^Error: Table 'foo': relation 'bar' references unknown field 'nonexistent_field'$/
|
|
55
|
-
);
|
|
56
|
-
});
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const test = require('node:test');
|
|
4
|
-
const assert = require('node:assert');
|
|
5
|
-
|
|
6
|
-
const { getDialect, DIALECTS } = require('../../../../../lib/dbschema-kit/dialect');
|
|
7
|
-
|
|
8
|
-
test('factory: getDialect("postgres") return modul dengan name === "postgres"', () => {
|
|
9
|
-
const d = getDialect('postgres');
|
|
10
|
-
assert.strictEqual(d.name, 'postgres');
|
|
11
|
-
assert.strictEqual(typeof d.mapType, 'function');
|
|
12
|
-
assert.strictEqual(typeof d.formatDefault, 'function');
|
|
13
|
-
assert.strictEqual(typeof d.quoteIdentifier, 'function');
|
|
14
|
-
assert.strictEqual(typeof d.formatReferentialAction, 'function');
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
test('factory: getDialect("mysql") return modul dengan name === "mysql"', () => {
|
|
18
|
-
assert.strictEqual(getDialect('mysql').name, 'mysql');
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
test('factory: getDialect("oracle") return modul dengan name === "oracle"', () => {
|
|
22
|
-
assert.strictEqual(getDialect('oracle').name, 'oracle');
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
test('factory: getDialect("sqlite") return modul dengan name === "sqlite"', () => {
|
|
26
|
-
assert.strictEqual(getDialect('sqlite').name, 'sqlite');
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
test('factory: getDialect throw bila nama dialect tidak dikenal', () => {
|
|
30
|
-
assert.throws(
|
|
31
|
-
() => getDialect('mssql'),
|
|
32
|
-
/Unknown dialect: 'mssql'\. Supported: postgres, mysql, oracle, sqlite/
|
|
33
|
-
);
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
test('factory: getDialect throw bila nama undefined atau null', () => {
|
|
37
|
-
assert.throws(() => getDialect(undefined), /Unknown dialect/);
|
|
38
|
-
assert.throws(() => getDialect(null), /Unknown dialect/);
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
test('factory: DIALECTS map mengekspos keempat dialect', () => {
|
|
42
|
-
assert.deepStrictEqual(
|
|
43
|
-
Object.keys(DIALECTS).sort(),
|
|
44
|
-
['mysql', 'oracle', 'postgres', 'sqlite']
|
|
45
|
-
);
|
|
46
|
-
});
|