@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,489 +1 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Authoritative source for dbschema-catalog content.
|
|
5
|
-
* Used by:
|
|
6
|
-
* - cli/dbschema-catalog.js (CLI introspection command)
|
|
7
|
-
* - (future) MCP server tool for dbschema-kit grounding
|
|
8
|
-
*
|
|
9
|
-
* SINGLE SOURCE OF TRUTH: Modify only this file when adding/changing
|
|
10
|
-
* dbschema-kit defineModel API spec. Keep in sync with:
|
|
11
|
-
* - lib/dbschema-kit/define-model.js
|
|
12
|
-
* - lib/dbschema-kit/parser/shorthand-parser.js
|
|
13
|
-
* - lib/dbschema-kit/validator/schema-validator.js
|
|
14
|
-
* - lib/dbschema-kit/validator/cross-model-validator.js
|
|
15
|
-
* - lib/dbschema-kit/ir-builder.js
|
|
16
|
-
* - lib/dbschema-kit/naming.js
|
|
17
|
-
*
|
|
18
|
-
* Reference: docs/schema-definition.md (single source of truth, human-readable)
|
|
19
|
-
*
|
|
20
|
-
* @module lib/templates/dbschema-catalog
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
const SCHEMA_VERSION = '1.0';
|
|
24
|
-
const SOURCE = 'dbschema-catalog';
|
|
25
|
-
const DOCUMENTATION_URL = 'https://restforge.dev/docs/cli/schema-definition';
|
|
26
|
-
|
|
27
|
-
// ============================================================================
|
|
28
|
-
// DEFINE MODEL OPTIONS
|
|
29
|
-
// ============================================================================
|
|
30
|
-
|
|
31
|
-
// Note: defineModel signature is `defineModel(tableName, options)`.
|
|
32
|
-
// `tableName` is a positional first argument (snake_case), not a property of `options`.
|
|
33
|
-
// Schema files use factory pattern:
|
|
34
|
-
// module.exports = ({ defineModel }) => defineModel('table_name', { fields: { ... } });
|
|
35
|
-
// Auto-derive from filename happens at the CLI loader level, not in defineModel itself.
|
|
36
|
-
const DEFINE_MODEL_OPTIONS = [
|
|
37
|
-
{
|
|
38
|
-
name: 'schema',
|
|
39
|
-
required: false,
|
|
40
|
-
type: 'string|null',
|
|
41
|
-
description: 'Database schema namespace (multi-schema database).',
|
|
42
|
-
notes: 'null or empty string means default schema.'
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
name: 'fields',
|
|
46
|
-
required: true,
|
|
47
|
-
type: 'object',
|
|
48
|
-
description: 'Object of field definitions in shorthand string format.',
|
|
49
|
-
example: '{ id: "string:36 pk", name: "string:255 notnull" }'
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
name: 'primaryKey',
|
|
53
|
-
required: false,
|
|
54
|
-
type: 'string|array',
|
|
55
|
-
description: 'Override primary key. Single field name or composite array.',
|
|
56
|
-
notes: 'Auto-detected from field shorthand "pk" when not specified.'
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
name: 'relations',
|
|
60
|
-
required: false,
|
|
61
|
-
type: 'object',
|
|
62
|
-
description: 'Inter-table relations (belongsTo, hasOne, hasMany).',
|
|
63
|
-
example: '{ category: { type: "belongsTo", references: "category(id)" } }'
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
name: 'indexes',
|
|
67
|
-
required: false,
|
|
68
|
-
type: 'array',
|
|
69
|
-
description: 'Non-unique indexes. Each entry is array of column names or object { name, columns }.',
|
|
70
|
-
example: '[["status", "created_at"]]'
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
name: 'uniques',
|
|
74
|
-
required: false,
|
|
75
|
-
type: 'array',
|
|
76
|
-
description: 'Unique constraints (single or composite).',
|
|
77
|
-
example: '[["category_code"], ["tenant_id", "category_code"]]'
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
name: 'checks',
|
|
81
|
-
required: false,
|
|
82
|
-
type: 'array',
|
|
83
|
-
description: 'CHECK constraints. Each entry uses operator-as-key shape: { name?, field, <operator>: <value> } where <operator> is one of checkOperations (in, eq, neq, gt, gte, lt, lte). The internal IR shape after ir-builder normalization is { name?, field, op, value }, but that is NOT the user input format.',
|
|
84
|
-
example: '[{ field: "status", in: ["active", "inactive"] }, { field: "qty", gte: 0 }]'
|
|
85
|
-
}
|
|
86
|
-
];
|
|
87
|
-
|
|
88
|
-
// ============================================================================
|
|
89
|
-
// FIELD TYPES (10 entries)
|
|
90
|
-
// Source: lib/dbschema-kit/parser/shorthand-parser.js (VALID_TYPES)
|
|
91
|
-
// ============================================================================
|
|
92
|
-
|
|
93
|
-
const FIELD_TYPES = [
|
|
94
|
-
{
|
|
95
|
-
name: 'string',
|
|
96
|
-
description: 'Variable-length text. Length modifier required.',
|
|
97
|
-
requiresModifier: true,
|
|
98
|
-
modifierFormat: 'string:<length>',
|
|
99
|
-
example: 'string:255',
|
|
100
|
-
notes: 'Explicit length required for cross-dialect portability.'
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
name: 'text',
|
|
104
|
-
description: 'Long-form text without length limit (TEXT/CLOB).',
|
|
105
|
-
requiresModifier: false,
|
|
106
|
-
example: 'text'
|
|
107
|
-
},
|
|
108
|
-
{
|
|
109
|
-
name: 'integer',
|
|
110
|
-
description: '32-bit signed integer (INT/INTEGER).',
|
|
111
|
-
requiresModifier: false,
|
|
112
|
-
example: 'integer'
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
name: 'bigint',
|
|
116
|
-
description: '64-bit signed integer (BIGINT).',
|
|
117
|
-
requiresModifier: false,
|
|
118
|
-
example: 'bigint'
|
|
119
|
-
},
|
|
120
|
-
{
|
|
121
|
-
name: 'decimal',
|
|
122
|
-
description: 'Fixed-point decimal. Precision and scale required.',
|
|
123
|
-
requiresModifier: true,
|
|
124
|
-
modifierFormat: 'decimal:<precision>,<scale>',
|
|
125
|
-
example: 'decimal:15,2',
|
|
126
|
-
notes: 'Precision and scale required for cross-dialect portability.'
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
name: 'boolean',
|
|
130
|
-
description: 'Boolean value (native BOOLEAN on PostgreSQL, VARCHAR on others).',
|
|
131
|
-
requiresModifier: false,
|
|
132
|
-
example: 'boolean'
|
|
133
|
-
},
|
|
134
|
-
{
|
|
135
|
-
name: 'date',
|
|
136
|
-
description: 'Date only (no time component).',
|
|
137
|
-
requiresModifier: false,
|
|
138
|
-
example: 'date'
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
name: 'timestamp',
|
|
142
|
-
description: 'Date and time (TIMESTAMP).',
|
|
143
|
-
requiresModifier: false,
|
|
144
|
-
example: 'timestamp',
|
|
145
|
-
notes: 'Default timezone behavior is dialect-specific.'
|
|
146
|
-
},
|
|
147
|
-
{
|
|
148
|
-
name: 'uuid',
|
|
149
|
-
description: 'UUID. Native UUID on PostgreSQL, VARCHAR(36) on others.',
|
|
150
|
-
requiresModifier: false,
|
|
151
|
-
example: 'uuid'
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
name: 'json',
|
|
155
|
-
description: 'JSON column (JSONB on PostgreSQL, JSON on MySQL, CLOB on Oracle).',
|
|
156
|
-
requiresModifier: false,
|
|
157
|
-
example: 'json'
|
|
158
|
-
}
|
|
159
|
-
];
|
|
160
|
-
|
|
161
|
-
// ============================================================================
|
|
162
|
-
// CONSTRAINTS (shorthand)
|
|
163
|
-
// Source: lib/dbschema-kit/parser/shorthand-parser.js
|
|
164
|
-
// STANDALONE_CONSTRAINTS, VALUE_CONSTRAINTS
|
|
165
|
-
// ============================================================================
|
|
166
|
-
|
|
167
|
-
const CONSTRAINTS = [
|
|
168
|
-
{
|
|
169
|
-
name: 'pk',
|
|
170
|
-
kind: 'standalone',
|
|
171
|
-
description: 'Marks field as primary key.',
|
|
172
|
-
example: 'string:36 pk'
|
|
173
|
-
},
|
|
174
|
-
{
|
|
175
|
-
name: 'notnull',
|
|
176
|
-
kind: 'standalone',
|
|
177
|
-
description: 'NOT NULL constraint.',
|
|
178
|
-
example: 'string:255 notnull'
|
|
179
|
-
},
|
|
180
|
-
{
|
|
181
|
-
name: 'unique',
|
|
182
|
-
kind: 'standalone',
|
|
183
|
-
description: 'Single-column unique constraint.',
|
|
184
|
-
example: 'string:32 unique'
|
|
185
|
-
},
|
|
186
|
-
{
|
|
187
|
-
name: 'index',
|
|
188
|
-
kind: 'standalone',
|
|
189
|
-
description: 'Single-column non-unique index.',
|
|
190
|
-
example: 'string:64 index'
|
|
191
|
-
},
|
|
192
|
-
{
|
|
193
|
-
name: 'autoUpdate',
|
|
194
|
-
kind: 'standalone',
|
|
195
|
-
description: 'Marker for audit timestamp columns. RESTForge generator injects this column = <native_now> on every UPDATE statement.',
|
|
196
|
-
example: 'timestamp autoUpdate',
|
|
197
|
-
notes: 'Only valid for type \'timestamp\' or \'date\'. Cannot coexist with \'default:\' constraint. Pre-processed in ir-builder before parser.'
|
|
198
|
-
},
|
|
199
|
-
{
|
|
200
|
-
name: 'default',
|
|
201
|
-
kind: 'value',
|
|
202
|
-
description: 'Default value. Single-quoted for strings, raw for numeric/boolean, bare identifier for SQL constants, identifier() for native function calls.',
|
|
203
|
-
valueFormat: "default:<literal> | default:'<string>' | default:<constant> | default:<function>()",
|
|
204
|
-
example: 'boolean default:true'
|
|
205
|
-
},
|
|
206
|
-
{
|
|
207
|
-
name: 'fk',
|
|
208
|
-
kind: 'value',
|
|
209
|
-
description: 'Foreign key reference. Auto-generates a belongsTo relation entry.',
|
|
210
|
-
valueFormat: 'fk:<table>.<column>',
|
|
211
|
-
example: 'string:36 fk:category.id',
|
|
212
|
-
notes: 'Cannot coexist with explicit relation entry referencing the same field.'
|
|
213
|
-
}
|
|
214
|
-
];
|
|
215
|
-
|
|
216
|
-
// ============================================================================
|
|
217
|
-
// RELATION TYPES
|
|
218
|
-
// Source: lib/dbschema-kit/validator/schema-validator.js (VALID_RELATION_TYPES)
|
|
219
|
-
// ============================================================================
|
|
220
|
-
|
|
221
|
-
const RELATION_TYPES = [
|
|
222
|
-
{
|
|
223
|
-
name: 'belongsTo',
|
|
224
|
-
description: 'Many-to-one. This table holds the FK column referencing the parent table.',
|
|
225
|
-
requiredFields: ['type', 'localKey', 'references'],
|
|
226
|
-
optionalFields: ['target', 'onDelete', 'onUpdate'],
|
|
227
|
-
example: '{ type: "belongsTo", localKey: "category_id", references: "category_id", onDelete: "restrict" }',
|
|
228
|
-
notes: '`references` is the bare column name in the target table. Target table is auto-derived from the relation key name, or override with `target`.'
|
|
229
|
-
},
|
|
230
|
-
{
|
|
231
|
-
name: 'hasOne',
|
|
232
|
-
description: 'One-to-one (inverse of belongsTo). Optional inverse declaration on the parent side; does not affect DDL.',
|
|
233
|
-
requiredFields: ['type', 'localKey', 'references'],
|
|
234
|
-
optionalFields: ['target', 'onDelete', 'onUpdate'],
|
|
235
|
-
example: '{ type: "hasOne", target: "profile", localKey: "user_id", references: "user_id" }'
|
|
236
|
-
},
|
|
237
|
-
{
|
|
238
|
-
name: 'hasMany',
|
|
239
|
-
description: 'One-to-many (inverse of belongsTo). Optional inverse declaration on the parent side; does not affect DDL.',
|
|
240
|
-
requiredFields: ['type', 'localKey', 'references'],
|
|
241
|
-
optionalFields: ['target', 'onDelete', 'onUpdate'],
|
|
242
|
-
example: '{ type: "hasMany", target: "order_item", localKey: "order_id", references: "order_id" }'
|
|
243
|
-
}
|
|
244
|
-
];
|
|
245
|
-
|
|
246
|
-
// ============================================================================
|
|
247
|
-
// REFERENTIAL ACTIONS (onDelete / onUpdate)
|
|
248
|
-
// Source: lib/dbschema-kit/validator/schema-validator.js (VALID_REFERENTIAL_ACTIONS)
|
|
249
|
-
// ============================================================================
|
|
250
|
-
|
|
251
|
-
const REFERENTIAL_ACTIONS = [
|
|
252
|
-
{
|
|
253
|
-
name: 'cascade',
|
|
254
|
-
description: 'Cascade delete/update to child rows.',
|
|
255
|
-
appliesTo: ['onDelete', 'onUpdate']
|
|
256
|
-
},
|
|
257
|
-
{
|
|
258
|
-
name: 'restrict',
|
|
259
|
-
description: 'Reject delete/update when child rows exist.',
|
|
260
|
-
appliesTo: ['onDelete', 'onUpdate']
|
|
261
|
-
},
|
|
262
|
-
{
|
|
263
|
-
name: 'setNull',
|
|
264
|
-
description: 'Set FK column to NULL on child rows.',
|
|
265
|
-
appliesTo: ['onDelete', 'onUpdate'],
|
|
266
|
-
notes: 'FK field must be nullable.'
|
|
267
|
-
},
|
|
268
|
-
{
|
|
269
|
-
name: 'noAction',
|
|
270
|
-
description: 'Defer constraint check (semantically similar to restrict on most dialects).',
|
|
271
|
-
appliesTo: ['onDelete', 'onUpdate']
|
|
272
|
-
}
|
|
273
|
-
];
|
|
274
|
-
|
|
275
|
-
// ============================================================================
|
|
276
|
-
// CHECK OPERATIONS
|
|
277
|
-
// Source: lib/dbschema-kit/ir-builder.js (VALID_CHECK_OPS)
|
|
278
|
-
// ============================================================================
|
|
279
|
-
|
|
280
|
-
const CHECK_OPERATIONS = [
|
|
281
|
-
{
|
|
282
|
-
name: 'in',
|
|
283
|
-
description: 'Value must be one of a list.',
|
|
284
|
-
valueType: 'array',
|
|
285
|
-
example: '{ field: "status", in: ["active", "inactive"] }'
|
|
286
|
-
},
|
|
287
|
-
{
|
|
288
|
-
name: 'eq',
|
|
289
|
-
description: 'Equal to.',
|
|
290
|
-
valueType: 'scalar',
|
|
291
|
-
example: '{ field: "type", eq: "user" }'
|
|
292
|
-
},
|
|
293
|
-
{
|
|
294
|
-
name: 'neq',
|
|
295
|
-
description: 'Not equal to.',
|
|
296
|
-
valueType: 'scalar',
|
|
297
|
-
example: '{ field: "type", neq: "system" }'
|
|
298
|
-
},
|
|
299
|
-
{
|
|
300
|
-
name: 'gt',
|
|
301
|
-
description: 'Greater than.',
|
|
302
|
-
valueType: 'numeric',
|
|
303
|
-
example: '{ field: "qty", gt: 0 }'
|
|
304
|
-
},
|
|
305
|
-
{
|
|
306
|
-
name: 'gte',
|
|
307
|
-
description: 'Greater than or equal to.',
|
|
308
|
-
valueType: 'numeric',
|
|
309
|
-
example: '{ field: "qty", gte: 0 }'
|
|
310
|
-
},
|
|
311
|
-
{
|
|
312
|
-
name: 'lt',
|
|
313
|
-
description: 'Less than.',
|
|
314
|
-
valueType: 'numeric',
|
|
315
|
-
example: '{ field: "discount", lt: 100 }'
|
|
316
|
-
},
|
|
317
|
-
{
|
|
318
|
-
name: 'lte',
|
|
319
|
-
description: 'Less than or equal to.',
|
|
320
|
-
valueType: 'numeric',
|
|
321
|
-
example: '{ field: "discount", lte: 100 }'
|
|
322
|
-
}
|
|
323
|
-
];
|
|
324
|
-
|
|
325
|
-
// ============================================================================
|
|
326
|
-
// AUDIT COLUMNS CONVENTION
|
|
327
|
-
// Cross-reference: lib/templates/field-validation-catalog.js (AUDIT_COLUMNS)
|
|
328
|
-
// ============================================================================
|
|
329
|
-
|
|
330
|
-
const AUDIT_COLUMNS = {
|
|
331
|
-
description: 'Standard 4-column audit convention for tables managed by RESTForge. The same convention is documented in field-validation:catalog (auditColumns section) for the RDF/backend layer. SDF and RDF stay aligned when both declare these 4 columns.',
|
|
332
|
-
columns: [
|
|
333
|
-
{
|
|
334
|
-
name: 'created_at',
|
|
335
|
-
shorthand: 'timestamp default:now()',
|
|
336
|
-
nullable: true,
|
|
337
|
-
purpose: 'Record creation timestamp. Auto-set on INSERT via DEFAULT now(). Native function translates per dialect (postgres: CURRENT_TIMESTAMP, mysql: NOW(), oracle: SYSTIMESTAMP, sqlite: CURRENT_TIMESTAMP).'
|
|
338
|
-
},
|
|
339
|
-
{
|
|
340
|
-
name: 'created_by',
|
|
341
|
-
shorthand: 'string:100',
|
|
342
|
-
nullable: true,
|
|
343
|
-
purpose: 'User identifier (username, user_id, or composite token) of the record creator. Set by application layer on INSERT, not by database default.'
|
|
344
|
-
},
|
|
345
|
-
{
|
|
346
|
-
name: 'updated_at',
|
|
347
|
-
shorthand: 'timestamp autoUpdate',
|
|
348
|
-
nullable: true,
|
|
349
|
-
purpose: 'Last modification timestamp. autoUpdate is a marker constraint — the RESTForge generator injects updated_at = <native_now> into every UPDATE statement. Initial INSERT value is the application layer responsibility.'
|
|
350
|
-
},
|
|
351
|
-
{
|
|
352
|
-
name: 'updated_by',
|
|
353
|
-
shorthand: 'string:100',
|
|
354
|
-
nullable: true,
|
|
355
|
-
purpose: 'User identifier of the last modifier. Set by application layer on UPDATE, not by database default.'
|
|
356
|
-
}
|
|
357
|
-
],
|
|
358
|
-
convention: {
|
|
359
|
-
emitInSkeleton: 'Yes — dbschema:init emits all 4 columns by default. Tables that do not need audit (lookup tables, system tables) can manually remove these fields from the generated skeleton.',
|
|
360
|
-
nullablePolicy: 'All 4 columns are nullable. The created_by/updated_by columns may be empty for rows inserted by system seeds, migrations, or batch imports that do not have a user context.',
|
|
361
|
-
relationToRdf: 'The RDF generator (codegen_create_endpoint) assumes these 4 columns exist when the payload.auditColumns key is absent. See field-validation:catalog auditColumns for the RDF-side behavior. Drift between SDF (missing audit columns) and RDF (assumes audit columns) causes runtime errors when the generated endpoint tries to write created_by/updated_by to a non-existent column.'
|
|
362
|
-
}
|
|
363
|
-
};
|
|
364
|
-
|
|
365
|
-
// ============================================================================
|
|
366
|
-
// SHORTHAND SYNTAX
|
|
367
|
-
// Source: lib/dbschema-kit/parser/shorthand-parser.js
|
|
368
|
-
// ============================================================================
|
|
369
|
-
|
|
370
|
-
const SHORTHAND_SYNTAX = {
|
|
371
|
-
format: '<type>[:<modifier>] [<constraint>[:<value>]]...',
|
|
372
|
-
description: 'String shorthand for field definition. Type required at start, followed by optional modifier and space-separated constraints.',
|
|
373
|
-
rules: [
|
|
374
|
-
'Type is mandatory at the beginning and must be one of fieldTypes.',
|
|
375
|
-
'Modifier is mandatory for type "string" (length) and "decimal" (precision,scale).',
|
|
376
|
-
'Standalone constraints (pk, notnull, unique, index, autoUpdate) take no value. autoUpdate is pre-processed in ir-builder before parser tokenization.',
|
|
377
|
-
'Value constraints (default, fk) require constraint:value format.',
|
|
378
|
-
'Default value format depends on type: raw for boolean (default:true), raw for integer (default:0), single-quoted for string (default:\'value\'), bare identifier for SQL constants (default:current_date), identifier() for native function calls (default:now()).',
|
|
379
|
-
'Foreign key uses dot notation: fk:<table>.<column> (e.g., fk:category.id). The parser rejects parentheses syntax.'
|
|
380
|
-
],
|
|
381
|
-
examples: [
|
|
382
|
-
{ input: 'string:36 pk', meaning: 'VARCHAR(36) PRIMARY KEY' },
|
|
383
|
-
{ input: 'string:255 notnull', meaning: 'VARCHAR(255) NOT NULL' },
|
|
384
|
-
{ input: 'decimal:15,2 notnull default:0', meaning: 'DECIMAL(15,2) NOT NULL DEFAULT 0' },
|
|
385
|
-
{ input: 'boolean default:true', meaning: 'BOOLEAN DEFAULT TRUE' },
|
|
386
|
-
{ input: "string:100 default:'pending'", meaning: "VARCHAR(100) DEFAULT 'pending'" },
|
|
387
|
-
{ input: 'timestamp default:now()', meaning: 'TIMESTAMP DEFAULT <native_now per dialect>' },
|
|
388
|
-
{ input: 'timestamp autoUpdate', meaning: 'TIMESTAMP (generator injects = <native_now> on UPDATE)' },
|
|
389
|
-
{ input: 'string:36 fk:category.id', meaning: 'VARCHAR(36) with FK to category(id), auto belongsTo relation' },
|
|
390
|
-
{ input: 'string:64 index', meaning: 'VARCHAR(64) with single-column index' }
|
|
391
|
-
]
|
|
392
|
-
};
|
|
393
|
-
|
|
394
|
-
// ============================================================================
|
|
395
|
-
// NAMING RULES
|
|
396
|
-
// Source: lib/dbschema-kit/naming.js, validator/schema-validator.js
|
|
397
|
-
// ============================================================================
|
|
398
|
-
|
|
399
|
-
const NAMING_RULES = {
|
|
400
|
-
tableName: {
|
|
401
|
-
format: 'snake_case',
|
|
402
|
-
description: 'Table name must be lowercase, digits, and underscores only.'
|
|
403
|
-
},
|
|
404
|
-
fieldName: {
|
|
405
|
-
format: 'snake_case',
|
|
406
|
-
description: 'Column name must be snake_case.'
|
|
407
|
-
},
|
|
408
|
-
constraintName: {
|
|
409
|
-
format: '<prefix>_<table>_<suffix>',
|
|
410
|
-
defaultMaxLength: 30,
|
|
411
|
-
fallbackStrategy: 'MD5 hash 8-character suffix when name exceeds maxLength',
|
|
412
|
-
description: 'Constraint names auto-generated with type-specific prefix (pk, fk, idx, uq, ck) and dialect-specific max length.'
|
|
413
|
-
},
|
|
414
|
-
compositeShortName: {
|
|
415
|
-
description: 'For composite indexes/uniques, name is derived by joining columns with underscore and truncating when needed.'
|
|
416
|
-
}
|
|
417
|
-
};
|
|
418
|
-
|
|
419
|
-
// ============================================================================
|
|
420
|
-
// DIALECT SUPPORT
|
|
421
|
-
// Source: lib/dbschema-kit/dialect/{postgres,mysql,oracle,sqlite}.js
|
|
422
|
-
// ============================================================================
|
|
423
|
-
|
|
424
|
-
const DIALECT_SUPPORT = [
|
|
425
|
-
{
|
|
426
|
-
name: 'postgres',
|
|
427
|
-
driver: 'pg',
|
|
428
|
-
booleanStorage: 'native BOOLEAN'
|
|
429
|
-
},
|
|
430
|
-
{
|
|
431
|
-
name: 'mysql',
|
|
432
|
-
driver: 'mysql2',
|
|
433
|
-
booleanStorage: 'VARCHAR (literal "true"/"false")'
|
|
434
|
-
},
|
|
435
|
-
{
|
|
436
|
-
name: 'oracle',
|
|
437
|
-
driver: 'oracledb',
|
|
438
|
-
booleanStorage: 'VARCHAR2 with CHECK constraint'
|
|
439
|
-
},
|
|
440
|
-
{
|
|
441
|
-
name: 'sqlite',
|
|
442
|
-
driver: 'better-sqlite3',
|
|
443
|
-
booleanStorage: 'TEXT'
|
|
444
|
-
}
|
|
445
|
-
];
|
|
446
|
-
|
|
447
|
-
// ============================================================================
|
|
448
|
-
// EXPORT
|
|
449
|
-
// ============================================================================
|
|
450
|
-
|
|
451
|
-
const DBSCHEMA_CATALOG = {
|
|
452
|
-
schemaVersion: SCHEMA_VERSION,
|
|
453
|
-
source: SOURCE,
|
|
454
|
-
summary: {
|
|
455
|
-
totalDefineModelOptions: DEFINE_MODEL_OPTIONS.length,
|
|
456
|
-
totalFieldTypes: FIELD_TYPES.length,
|
|
457
|
-
totalConstraints: CONSTRAINTS.length,
|
|
458
|
-
totalRelationTypes: RELATION_TYPES.length,
|
|
459
|
-
totalReferentialActions: REFERENTIAL_ACTIONS.length,
|
|
460
|
-
totalCheckOperations: CHECK_OPERATIONS.length,
|
|
461
|
-
totalAuditColumns: AUDIT_COLUMNS.columns.length,
|
|
462
|
-
totalDialects: DIALECT_SUPPORT.length
|
|
463
|
-
},
|
|
464
|
-
defineModelOptions: DEFINE_MODEL_OPTIONS,
|
|
465
|
-
fieldTypes: FIELD_TYPES,
|
|
466
|
-
constraints: CONSTRAINTS,
|
|
467
|
-
relationTypes: RELATION_TYPES,
|
|
468
|
-
referentialActions: REFERENTIAL_ACTIONS,
|
|
469
|
-
checkOperations: CHECK_OPERATIONS,
|
|
470
|
-
auditColumns: AUDIT_COLUMNS,
|
|
471
|
-
shorthandSyntax: SHORTHAND_SYNTAX,
|
|
472
|
-
namingRules: NAMING_RULES,
|
|
473
|
-
dialectSupport: DIALECT_SUPPORT,
|
|
474
|
-
documentationUrl: DOCUMENTATION_URL
|
|
475
|
-
};
|
|
476
|
-
|
|
477
|
-
module.exports = {
|
|
478
|
-
DBSCHEMA_CATALOG,
|
|
479
|
-
DEFINE_MODEL_OPTIONS,
|
|
480
|
-
FIELD_TYPES,
|
|
481
|
-
CONSTRAINTS,
|
|
482
|
-
RELATION_TYPES,
|
|
483
|
-
REFERENTIAL_ACTIONS,
|
|
484
|
-
CHECK_OPERATIONS,
|
|
485
|
-
AUDIT_COLUMNS,
|
|
486
|
-
SHORTHAND_SYNTAX,
|
|
487
|
-
NAMING_RULES,
|
|
488
|
-
DIALECT_SUPPORT
|
|
489
|
-
};
|
|
1
|
+
'use strict';const a0_0x590179=a0_0x2390;(function(_0x5c0dda,_0x3533bf){const _0x6a2875=a0_0x2390,_0x5129e3=_0x5c0dda();while(!![]){try{const _0x298d58=-parseInt(_0x6a2875(0x24a))/0x1+-parseInt(_0x6a2875(0x221))/0x2*(-parseInt(_0x6a2875(0x229))/0x3)+-parseInt(_0x6a2875(0x205))/0x4*(-parseInt(_0x6a2875(0x1f7))/0x5)+parseInt(_0x6a2875(0x1f6))/0x6+-parseInt(_0x6a2875(0x235))/0x7*(-parseInt(_0x6a2875(0x252))/0x8)+parseInt(_0x6a2875(0x238))/0x9*(-parseInt(_0x6a2875(0x224))/0xa)+-parseInt(_0x6a2875(0x1f1))/0xb;if(_0x298d58===_0x3533bf)break;else _0x5129e3['push'](_0x5129e3['shift']());}catch(_0x1aa027){_0x5129e3['push'](_0x5129e3['shift']());}}}(a0_0x1242,0x9a38f));const SCHEMA_VERSION='1.0',SOURCE='dbschema-catalog',DOCUMENTATION_URL=a0_0x590179(0x20a),DEFINE_MODEL_OPTIONS=[{'name':'schema','required':![],'type':a0_0x590179(0x236),'description':a0_0x590179(0x219),'notes':a0_0x590179(0x255)},{'name':a0_0x590179(0x21a),'required':!![],'type':a0_0x590179(0x20e),'description':a0_0x590179(0x22c),'example':a0_0x590179(0x258)},{'name':'primaryKey','required':![],'type':a0_0x590179(0x24e),'description':a0_0x590179(0x203),'notes':'Auto-detected\x20from\x20field\x20shorthand\x20\x22pk\x22\x20when\x20not\x20specified.'},{'name':'relations','required':![],'type':'object','description':'Inter-table\x20relations\x20(belongsTo,\x20hasOne,\x20hasMany).','example':'{\x20category:\x20{\x20type:\x20\x22belongsTo\x22,\x20references:\x20\x22category(id)\x22\x20}\x20}'},{'name':'indexes','required':![],'type':a0_0x590179(0x1fd),'description':a0_0x590179(0x23a),'example':'[[\x22status\x22,\x20\x22created_at\x22]]'},{'name':a0_0x590179(0x20b),'required':![],'type':'array','description':a0_0x590179(0x1ed),'example':'[[\x22category_code\x22],\x20[\x22tenant_id\x22,\x20\x22category_code\x22]]'},{'name':a0_0x590179(0x245),'required':![],'type':a0_0x590179(0x1fd),'description':'CHECK\x20constraints.\x20Each\x20entry\x20uses\x20operator-as-key\x20shape:\x20{\x20name?,\x20field,\x20<operator>:\x20<value>\x20}\x20where\x20<operator>\x20is\x20one\x20of\x20checkOperations\x20(in,\x20eq,\x20neq,\x20gt,\x20gte,\x20lt,\x20lte).\x20The\x20internal\x20IR\x20shape\x20after\x20ir-builder\x20normalization\x20is\x20{\x20name?,\x20field,\x20op,\x20value\x20},\x20but\x20that\x20is\x20NOT\x20the\x20user\x20input\x20format.','example':a0_0x590179(0x21f)}],FIELD_TYPES=[{'name':a0_0x590179(0x23b),'description':'Variable-length\x20text.\x20Length\x20modifier\x20required.','requiresModifier':!![],'modifierFormat':a0_0x590179(0x1f8),'example':a0_0x590179(0x246),'notes':a0_0x590179(0x1f5)},{'name':'text','description':'Long-form\x20text\x20without\x20length\x20limit\x20(TEXT/CLOB).','requiresModifier':![],'example':'text'},{'name':a0_0x590179(0x23c),'description':a0_0x590179(0x1ef),'requiresModifier':![],'example':a0_0x590179(0x23c)},{'name':a0_0x590179(0x1ee),'description':a0_0x590179(0x216),'requiresModifier':![],'example':a0_0x590179(0x1ee)},{'name':'decimal','description':'Fixed-point\x20decimal.\x20Precision\x20and\x20scale\x20required.','requiresModifier':!![],'modifierFormat':a0_0x590179(0x22e),'example':'decimal:15,2','notes':a0_0x590179(0x202)},{'name':'boolean','description':a0_0x590179(0x247),'requiresModifier':![],'example':'boolean'},{'name':a0_0x590179(0x218),'description':a0_0x590179(0x230),'requiresModifier':![],'example':a0_0x590179(0x218)},{'name':a0_0x590179(0x212),'description':'Date\x20and\x20time\x20(TIMESTAMP).','requiresModifier':![],'example':'timestamp','notes':a0_0x590179(0x226)},{'name':'uuid','description':'UUID.\x20Native\x20UUID\x20on\x20PostgreSQL,\x20VARCHAR(36)\x20on\x20others.','requiresModifier':![],'example':'uuid'},{'name':a0_0x590179(0x22a),'description':a0_0x590179(0x1e0),'requiresModifier':![],'example':a0_0x590179(0x22a)}],CONSTRAINTS=[{'name':'pk','kind':a0_0x590179(0x23f),'description':a0_0x590179(0x1fb),'example':a0_0x590179(0x21e)},{'name':'notnull','kind':'standalone','description':'NOT\x20NULL\x20constraint.','example':'string:255\x20notnull'},{'name':'unique','kind':'standalone','description':'Single-column\x20unique\x20constraint.','example':'string:32\x20unique'},{'name':a0_0x590179(0x21c),'kind':a0_0x590179(0x23f),'description':a0_0x590179(0x1fa),'example':'string:64\x20index'},{'name':a0_0x590179(0x20d),'kind':'standalone','deprecated':!![],'description':'DEPRECATED:\x20This\x20modifier\x20no\x20longer\x20has\x20functional\x20effect\x20at\x20the\x20DDL\x20or\x20runtime\x20level.\x20Auto-update\x20for\x20updated_at\x20is\x20handled\x20by\x20the\x20RDF\x20layer\x20(auditColumns\x20convention\x20in\x20BaseModel\x20runtime)\x20based\x20on\x20field\x20naming\x20convention,\x20not\x20by\x20this\x20SDF\x20marker.\x20Existing\x20usage\x20is\x20preserved\x20for\x20backward\x20compatibility\x20but\x20should\x20be\x20removed\x20from\x20new\x20templates.','example':'timestamp','notes':'Engine\x20still\x20parses\x20this\x20token\x20(backward\x20compatibility),\x20but\x20DDL\x20output\x20is\x20identical\x20to\x20plain\x20\x27timestamp\x27.\x20Use\x20\x27timestamp\x27\x20alone.\x20The\x20actual\x20auto-update\x20behavior\x20is\x20documented\x20in\x20the\x20RDF\x20auditColumns\x20catalog\x20(field-validation:catalog).'},{'name':a0_0x590179(0x204),'kind':'value','description':a0_0x590179(0x23d),'valueFormat':'default:<literal>\x20|\x20default:\x27<string>\x27\x20|\x20default:<constant>\x20|\x20default:<function>()','example':a0_0x590179(0x231)},{'name':'fk','kind':a0_0x590179(0x215),'description':'Foreign\x20key\x20reference.\x20Auto-generates\x20a\x20belongsTo\x20relation\x20entry.','valueFormat':a0_0x590179(0x248),'example':'string:36\x20fk:category.id','notes':'Cannot\x20coexist\x20with\x20explicit\x20relation\x20entry\x20referencing\x20the\x20same\x20field.'}],RELATION_TYPES=[{'name':a0_0x590179(0x1f2),'description':'Many-to-one.\x20This\x20table\x20holds\x20the\x20FK\x20column\x20referencing\x20the\x20parent\x20table.','requiredFields':[a0_0x590179(0x209),'localKey','references'],'optionalFields':[a0_0x590179(0x23e),a0_0x590179(0x214),a0_0x590179(0x208)],'example':a0_0x590179(0x1f4),'notes':a0_0x590179(0x1e4)},{'name':'hasOne','description':'One-to-one\x20(inverse\x20of\x20belongsTo).\x20Optional\x20inverse\x20declaration\x20on\x20the\x20parent\x20side;\x20does\x20not\x20affect\x20DDL.','requiredFields':[a0_0x590179(0x209),a0_0x590179(0x241),a0_0x590179(0x249)],'optionalFields':['target','onDelete',a0_0x590179(0x208)],'example':'{\x20type:\x20\x22hasOne\x22,\x20target:\x20\x22profile\x22,\x20localKey:\x20\x22user_id\x22,\x20references:\x20\x22user_id\x22\x20}'},{'name':'hasMany','description':a0_0x590179(0x20f),'requiredFields':['type','localKey',a0_0x590179(0x249)],'optionalFields':[a0_0x590179(0x23e),'onDelete',a0_0x590179(0x208)],'example':a0_0x590179(0x228)}],REFERENTIAL_ACTIONS=[{'name':'cascade','description':a0_0x590179(0x257),'appliesTo':['onDelete','onUpdate']},{'name':a0_0x590179(0x1f9),'description':a0_0x590179(0x200),'appliesTo':['onDelete','onUpdate']},{'name':a0_0x590179(0x244),'description':a0_0x590179(0x1e2),'appliesTo':['onDelete','onUpdate'],'notes':'FK\x20field\x20must\x20be\x20nullable.'},{'name':a0_0x590179(0x1fc),'description':a0_0x590179(0x237),'appliesTo':[a0_0x590179(0x214),a0_0x590179(0x208)]}],CHECK_OPERATIONS=[{'name':'in','description':'Value\x20must\x20be\x20one\x20of\x20a\x20list.','valueType':'array','example':'{\x20field:\x20\x22status\x22,\x20in:\x20[\x22active\x22,\x20\x22inactive\x22]\x20}'},{'name':'eq','description':a0_0x590179(0x1e6),'valueType':'scalar','example':'{\x20field:\x20\x22type\x22,\x20eq:\x20\x22user\x22\x20}'},{'name':a0_0x590179(0x232),'description':a0_0x590179(0x256),'valueType':a0_0x590179(0x254),'example':a0_0x590179(0x227)},{'name':'gt','description':a0_0x590179(0x223),'valueType':'numeric','example':a0_0x590179(0x20c)},{'name':a0_0x590179(0x1e1),'description':'Greater\x20than\x20or\x20equal\x20to.','valueType':a0_0x590179(0x24f),'example':a0_0x590179(0x21b)},{'name':'lt','description':a0_0x590179(0x22b),'valueType':'numeric','example':a0_0x590179(0x217)},{'name':a0_0x590179(0x1ea),'description':a0_0x590179(0x201),'valueType':a0_0x590179(0x24f),'example':a0_0x590179(0x242)}],AUDIT_COLUMNS={'description':a0_0x590179(0x21d),'columns':[{'name':a0_0x590179(0x22f),'shorthand':'timestamp\x20default:now()','nullable':!![],'purpose':a0_0x590179(0x239)},{'name':'created_by','shorthand':'string:100','nullable':!![],'purpose':'User\x20identifier\x20(username,\x20user_id,\x20or\x20composite\x20token)\x20of\x20the\x20record\x20creator.\x20Set\x20by\x20application\x20layer\x20on\x20INSERT,\x20not\x20by\x20database\x20default.'},{'name':'updated_at','shorthand':a0_0x590179(0x212),'nullable':!![],'purpose':a0_0x590179(0x1ec)},{'name':a0_0x590179(0x206),'shorthand':a0_0x590179(0x234),'nullable':!![],'purpose':a0_0x590179(0x222)}],'convention':{'emitInSkeleton':a0_0x590179(0x225),'nullablePolicy':'All\x204\x20columns\x20are\x20nullable.\x20The\x20created_by/updated_by\x20columns\x20may\x20be\x20empty\x20for\x20rows\x20inserted\x20by\x20system\x20seeds,\x20migrations,\x20or\x20batch\x20imports\x20that\x20do\x20not\x20have\x20a\x20user\x20context.','relationToRdf':a0_0x590179(0x220)}},SHORTHAND_SYNTAX={'format':a0_0x590179(0x1e8),'description':a0_0x590179(0x24c),'rules':['Type\x20is\x20mandatory\x20at\x20the\x20beginning\x20and\x20must\x20be\x20one\x20of\x20fieldTypes.','Modifier\x20is\x20mandatory\x20for\x20type\x20\x22string\x22\x20(length)\x20and\x20\x22decimal\x22\x20(precision,scale).',a0_0x590179(0x243),'Value\x20constraints\x20(default,\x20fk)\x20require\x20constraint:value\x20format.','Default\x20value\x20format\x20depends\x20on\x20type:\x20raw\x20for\x20boolean\x20(default:true),\x20raw\x20for\x20integer\x20(default:0),\x20single-quoted\x20for\x20string\x20(default:\x27value\x27),\x20bare\x20identifier\x20for\x20SQL\x20constants\x20(default:current_date),\x20identifier()\x20for\x20native\x20function\x20calls\x20(default:now()).','Foreign\x20key\x20uses\x20dot\x20notation:\x20fk:<table>.<column>\x20(e.g.,\x20fk:category.id).\x20The\x20parser\x20rejects\x20parentheses\x20syntax.'],'examples':[{'input':'string:36\x20pk','meaning':'VARCHAR(36)\x20PRIMARY\x20KEY'},{'input':a0_0x590179(0x24d),'meaning':'VARCHAR(255)\x20NOT\x20NULL'},{'input':a0_0x590179(0x207),'meaning':'DECIMAL(15,2)\x20NOT\x20NULL\x20DEFAULT\x200'},{'input':a0_0x590179(0x231),'meaning':a0_0x590179(0x250)},{'input':'string:100\x20default:\x27pending\x27','meaning':a0_0x590179(0x233)},{'input':'timestamp\x20default:now()','meaning':'TIMESTAMP\x20DEFAULT\x20<native_now\x20per\x20dialect>'},{'input':'string:36\x20fk:category.id','meaning':a0_0x590179(0x24b)},{'input':'string:64\x20index','meaning':a0_0x590179(0x1e3)}]},NAMING_RULES={'tableName':{'format':'snake_case','description':a0_0x590179(0x1e7)},'fieldName':{'format':'snake_case','description':'Column\x20name\x20must\x20be\x20snake_case.'},'constraintName':{'format':a0_0x590179(0x22d),'defaultMaxLength':0x1e,'fallbackStrategy':a0_0x590179(0x1f0),'description':a0_0x590179(0x240)},'compositeShortName':{'description':a0_0x590179(0x1e5)}},DIALECT_SUPPORT=[{'name':a0_0x590179(0x251),'driver':'pg','booleanStorage':a0_0x590179(0x1fe)},{'name':a0_0x590179(0x1eb),'driver':a0_0x590179(0x210),'booleanStorage':a0_0x590179(0x211)},{'name':a0_0x590179(0x253),'driver':'oracledb','booleanStorage':'VARCHAR2\x20with\x20CHECK\x20constraint'},{'name':a0_0x590179(0x1e9),'driver':'better-sqlite3','booleanStorage':'TEXT'}],DBSCHEMA_CATALOG={'schemaVersion':SCHEMA_VERSION,'source':SOURCE,'summary':{'totalDefineModelOptions':DEFINE_MODEL_OPTIONS[a0_0x590179(0x213)],'totalFieldTypes':FIELD_TYPES[a0_0x590179(0x213)],'totalConstraints':CONSTRAINTS['length'],'totalRelationTypes':RELATION_TYPES[a0_0x590179(0x213)],'totalReferentialActions':REFERENTIAL_ACTIONS[a0_0x590179(0x213)],'totalCheckOperations':CHECK_OPERATIONS['length'],'totalAuditColumns':AUDIT_COLUMNS[a0_0x590179(0x1f3)]['length'],'totalDialects':DIALECT_SUPPORT[a0_0x590179(0x213)]},'defineModelOptions':DEFINE_MODEL_OPTIONS,'fieldTypes':FIELD_TYPES,'constraints':CONSTRAINTS,'relationTypes':RELATION_TYPES,'referentialActions':REFERENTIAL_ACTIONS,'checkOperations':CHECK_OPERATIONS,'auditColumns':AUDIT_COLUMNS,'shorthandSyntax':SHORTHAND_SYNTAX,'namingRules':NAMING_RULES,'dialectSupport':DIALECT_SUPPORT,'documentationUrl':DOCUMENTATION_URL};module[a0_0x590179(0x1ff)]={'DBSCHEMA_CATALOG':DBSCHEMA_CATALOG,'DEFINE_MODEL_OPTIONS':DEFINE_MODEL_OPTIONS,'FIELD_TYPES':FIELD_TYPES,'CONSTRAINTS':CONSTRAINTS,'RELATION_TYPES':RELATION_TYPES,'REFERENTIAL_ACTIONS':REFERENTIAL_ACTIONS,'CHECK_OPERATIONS':CHECK_OPERATIONS,'AUDIT_COLUMNS':AUDIT_COLUMNS,'SHORTHAND_SYNTAX':SHORTHAND_SYNTAX,'NAMING_RULES':NAMING_RULES,'DIALECT_SUPPORT':DIALECT_SUPPORT};function a0_0x2390(_0x3985a3,_0x55c121){_0x3985a3=_0x3985a3-0x1e0;const _0x1242d5=a0_0x1242();let _0x2390af=_0x1242d5[_0x3985a3];if(a0_0x2390['acHuqv']===undefined){var _0x3d6767=function(_0x1f6646){const _0x15ea7f='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x385827='',_0xea4e83='';for(let _0x57b017=0x0,_0x50246c,_0x543953,_0x53000b=0x0;_0x543953=_0x1f6646['charAt'](_0x53000b++);~_0x543953&&(_0x50246c=_0x57b017%0x4?_0x50246c*0x40+_0x543953:_0x543953,_0x57b017++%0x4)?_0x385827+=String['fromCharCode'](0xff&_0x50246c>>(-0x2*_0x57b017&0x6)):0x0){_0x543953=_0x15ea7f['indexOf'](_0x543953);}for(let _0x106758=0x0,_0x23bd56=_0x385827['length'];_0x106758<_0x23bd56;_0x106758++){_0xea4e83+='%'+('00'+_0x385827['charCodeAt'](_0x106758)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0xea4e83);};a0_0x2390['zoWnNF']=_0x3d6767,a0_0x2390['ULMWdT']={},a0_0x2390['acHuqv']=!![];}const _0x705f5c=_0x1242d5[0x0],_0x25e953=_0x3985a3+_0x705f5c,_0x106d78=a0_0x2390['ULMWdT'][_0x25e953];return!_0x106d78?(_0x2390af=a0_0x2390['zoWnNF'](_0x2390af),a0_0x2390['ULMWdT'][_0x25e953]=_0x2390af):_0x2390af=_0x106d78,_0x2390af;}function a0_0x1242(){const _0x3ee7b1=['nJuXnMHyzhDqua','uMvJB3jKignYzwf0Aw9UihrPBwvZDgfTCc4Gqxv0BY1ZzxqGB24Gsu5trvjuihzPysberuzbvuXuig5VDYGPlIboyxrPDMuGzNvUy3rPB24GDhjHBNnSyxrLCYbWzxiGzgLHBgvJDcaOCg9ZDgDYzxm6ienvuLjftLrFveLnrvnuqu1qlcbTExnXBdOGtK9xkcKSig9YywnSztOGu1LtveLnrvnuqu1qlcbZCwXPDgu6ienvuLjftLrFveLnrvnuqu1qks4','tM9UlxvUAxf1zsbPBMrLEgvZlIbfywnOigvUDhj5igLZigfYCMf5ig9MignVBhvTBIbUyw1LCYbVCIbVyMPLy3qGEYbUyw1LlcbJB2X1Bw5Zih0U','C3rYAw5N','Aw50zwDLCG','rgvMyxvSDcb2ywX1zs4Gu2LUz2XLlxf1B3rLzcbMB3iGC3rYAw5NCYWGCMf3igzVCIbUDw1LCMLJl2jVB2XLyw4SigjHCMuGAwrLBNrPzMLLCIbMB3iGu1fmignVBNn0yw50CYWGAwrLBNrPzMLLCIGPigzVCIbUyxrPDMuGzNvUy3rPB24Gy2fSBhmU','DgfYz2v0','C3rHBMrHBg9Uzq','q29UC3rYywLUDcbUyw1LCYbHDxrVlwDLBMvYyxrLzcb3AxrOihr5CguTC3bLy2LMAwmGChjLzML4icHWAYWGzMSSigLKEcWGDxeSignRksbHBMqGzgLHBgvJDc1ZCgvJAwzPyYbTyxGGBgvUz3rOlG','Bg9JywXlzxK','EYbMAwvSzdOGiMrPC2nVDw50iIWGBhrLoIaXmdaGFq','u3rHBMrHBg9UzsbJB25ZDhjHAw50CYaOCgSSig5VDg51BgWSihvUAxf1zsWGAw5KzxGPihrHA2uGBM8GDMfSDwuUifrOzsbSzwDHy3KGyxv0B1vWzgf0zsb0B2TLBIbPCYbZDgLSBcbWyxjZzwqGzM9YigjHy2T3yxjKignVBxbHDgLIAwXPDhKGyNv0igLZigrLChjLy2f0zwqGyw5KigHHCYbUBYbMDw5JDgLVBMfSigvMzMvJDc4','C2v0tNvSBa','y2HLy2TZ','C3rYAw5NoJi1nq','qM9VBgvHBIb2ywX1zsaOBMf0AxzLiejpt0Xfqu4GB24Gug9ZDgDYzvnrtcWGvKfsq0HbuIbVBIbVDgHLCNmPlG','zMS6phrHyMXLpI48y29SDw1UpG','CMvMzxjLBMnLCW','odC1nJa0AhLOwwrd','vKfsq0HbuIGZnIKGD2L0AcbgsYb0BYbJyxrLz29YEsHPzcKSigf1Dg8GyMvSB25NC1rVihjLBgf0Aw9U','u3rYAw5NihnOB3j0AgfUzcbMB3iGzMLLBgqGzgvMAw5PDgLVBI4GvhLWzsbYzxf1AxjLzcbHDcbZDgfYDcWGzM9SBg93zwqGyNKGB3b0Aw9UywWGBw9KAwzPzxiGyw5KihnWywnLlxnLCgfYyxrLzcbJB25ZDhjHAw50CY4','C3rYAw5NoJi1nsbUB3rUDwXS','C3rYAw5NFgfYCMf5','BNvTzxjPyW','qK9ptevbtIberuzbvuXuifrsvuu','Cg9ZDgDYzxm','nZj5Egjps2O','B3jHy2XL','C2nHBgfY','BNvSBcbVCIbLBxb0EsbZDhjPBMCGBwvHBNmGzgvMyxvSDcbZy2HLBweU','tM90igvXDwfSihrVlG','q2fZy2fKzsbKzwXLDguVDxbKyxrLihrVignOAwXKihjVD3mU','EYbPzdOGiNn0CMLUzZOZnIbWAYiSig5HBwu6icjZDhjPBMC6mJu1ig5VDg51BgWIih0','sLnptIbJB2X1Bw4GkePtt05cig9UifbVC3rNCMvtuuWSiePtt04GB24GtxLtuuWSienmt0iGB24Gt3jHy2XLks4','z3rL','u2v0iezlignVBhvTBIb0BYbovuXmig9UignOAwXKihjVD3mU','vKfsq0HbuIG2ncKGD2L0AcbZAw5NBguTy29SDw1UigLUzgv4','yhjLzMvYzw5JzxnGigLZihrOzsbIyxjLignVBhvTBIbUyw1LigLUihrOzsb0yxjNzxqGDgfIBguUifrHCMDLDcb0ywjSzsbPCYbHDxrVlwrLCML2zwqGzNjVBsb0AguGCMvSyxrPB24GA2v5ig5HBwuSig9Yig92zxjYAwrLihDPDgGGyhrHCMDLDgaU','rM9YignVBxbVC2L0zsbPBMrLEgvZl3vUAxf1zxmSig5HBwuGAxmGzgvYAxzLzcbIEsbQB2LUAw5NignVBhvTBNmGD2L0Acb1BMrLCNnJB3jLigfUzcb0CNvUy2f0Aw5NihDOzw4GBMvLzgvKlG','rxf1ywWGDg8U','vgfIBguGBMfTzsbTDxn0igjLigXVD2vYy2fZzsWGzgLNAxrZlcbHBMqGDw5KzxjZy29YzxmGB25SEs4','phr5Cgu+wZO8Bw9KAwzPzxi+xsbBpgnVBNn0CMfPBNq+wZO8DMfSDwu+xv0UlI4','C3fSAxrL','BhrL','BxLZCwW','tgfZDcbTB2rPzMLJyxrPB24GDgLTzxn0yw1WlIbbDxrVlxvWzgf0zsbPCYbOyw5KBgvKigj5ihrOzsbsreyGCNvUDgLTzsaOqMfZzu1VzgvSigf1zgL0q29SDw1UCYbJB252zw50Aw9Uksb3AgLJAcbPBMPLy3rZihvWzgf0zwrFyxqGpsbdvvjsru5ux1rjtuvtvefnucbPBNrVigv2zxj5ifvqrefursbZDgf0zw1LBNqGyMfZzwqGB24GzMLLBgqGBMfTAw5NlcbUB3qGyNKGyw55ifnerIbTyxjRzxiUieLUAxrPywWGsu5trvjuihzHBhvLigLZigfSC28GAgfUzgXLzcbIEsb0AguGuKrgihj1BNrPBwuGyxvKAxrdB2X1Bw5ZigHLBhbLCI4','vw5PCxvLignVBNn0CMfPBNrZicHZAw5NBguGB3iGy29TCg9ZAxrLks4','yMLNAw50','mZiTyML0ihnPz25LzcbPBNrLz2vYicHjtLqVsu5uruDfuIKU','tuq1igHHC2GGoc1JAgfYywn0zxiGC3vMzML4ihDOzw4GBMfTzsbLEgnLzwrZig1HEeXLBMD0Aa','mtyZnJeXmdnZDMvTDeG','yMvSB25NC1rV','y29SDw1UCW','EYb0ExbLoIaIyMvSB25NC1rViIWGBg9JywXlzxK6icjJyxrLz29YEv9PzciSihjLzMvYzw5Jzxm6icjJyxrLz29YEv9PzciSig9UrgvSzxrLoIaICMvZDhjPy3qIih0','rxHWBgLJAxqGBgvUz3rOihjLCxvPCMvKigzVCIbJCM9ZCY1KAwfSzwn0ihbVCNrHyMLSAxr5lG','ntGWody3mKX1B0PhyG','mtuWnvjxseT5Bq','C3rYAw5NoJXSzw5NDgG+','CMvZDhjPy3q','u2LUz2XLlwnVBhvTBIbUB24TDw5PCxvLigLUzgv4lG','twfYA3mGzMLLBgqGyxmGChjPBwfYEsbRzxKU','BM9by3rPB24','yxjYyxK','BMf0AxzLiejpt0Xfqu4','zxHWB3j0CW','uMvQzwn0igrLBgv0zs91CgrHDguGD2HLBIbJAgLSzcbYB3DZigv4Axn0lG','tgvZCYb0AgfUig9YigvXDwfSihrVlG','uhjLy2LZAw9UigfUzcbZy2fSzsbYzxf1AxjLzcbMB3iGy3jVC3mTzgLHBgvJDcbWB3j0ywjPBgL0Es4','t3zLCNjPzguGChjPBwfYEsbRzxKUifnPBMDSzsbMAwvSzcbUyw1Lig9YignVBxbVC2L0zsbHCNjHEs4','zgvMyxvSDa','mte0mJH2EuD4qKC','DxbKyxrLzf9IEq','zgvJAw1HBdOXnsWYig5VDg51BgWGzgvMyxvSDdOW','B25vCgrHDgu','DhLWzq','Ahr0Chm6lY9Yzxn0zM9Yz2uUzgv2l2rVy3mVy2XPl3nJAgvTys1KzwzPBML0Aw9U','Dw5PCxvLCW','EYbMAwvSzdOGiNf0EsiSigD0oIaWih0','yxv0B1vWzgf0zq','B2jQzwn0','t25LlxrVlw1HBNKGkgLUDMvYC2uGB2yGyMvSB25NC1rVks4Gt3b0Aw9UywWGAw52zxjZzsbKzwnSyxjHDgLVBIbVBIb0AguGCgfYzw50ihnPzgu7igrVzxmGBM90igfMzMvJDcbereWU','BxLZCwWY','vKfsq0HbuIaOBgL0zxjHBcaIDhj1zsiViMzHBhnLiIK','DgLTzxn0yw1W','BgvUz3rO','B25ezwXLDgu','DMfSDwu','nJqTyML0ihnPz25LzcbPBNrLz2vYicHcsuDjtLqPlG','EYbMAwvSzdOGiMrPC2nVDw50iIWGBhq6ideWmcb9','zgf0zq','rgf0ywjHC2uGC2nOzw1Hig5HBwvZCgfJzsaOBxvSDgKTC2nOzw1HigrHDgfIyxnLks4','zMLLBgrZ','EYbMAwvSzdOGiNf0EsiSigD0ztOGmcb9','Aw5KzxG','u3rHBMrHCMqGnc1JB2X1Bw4GyxvKAxqGy29UDMvUDgLVBIbMB3iGDgfIBgvZig1HBMfNzwqGyNKGuKvtvezVCMDLlIbuAguGC2fTzsbJB252zw50Aw9UigLZigrVy3vTzw50zwqGAw4GzMLLBgqTDMfSAwrHDgLVBJPJyxrHBg9NicHHDwrPDenVBhvTBNmGC2vJDgLVBIKGzM9YihrOzsbsreyVyMfJA2vUzcbSyxLLCI4Gu0rgigfUzcbsreyGC3rHEsbHBgLNBMvKihDOzw4GyM90AcbKzwnSyxjLihrOzxnLidqGy29SDw1UCY4','C3rYAw5NoJm2ihbR','w3SGzMLLBgq6icjZDgf0DxmIlcbPBJOGwYjHy3rPDMuIlcaIAw5Hy3rPDMuIxsb9lcb7igzPzwXKoIaICxr5iIWGz3rLoIaWih1D','vgHLifjerIbNzw5LCMf0B3iGkgnVzgvNzw5Fy3jLyxrLx2vUzhbVAw50ksbHC3n1BwvZihrOzxnLidqGy29SDw1UCYbLEgLZDcb3AgvUihrOzsbWyxLSB2fKlMf1zgL0q29SDw1UCYbRzxKGAxmGywjZzw50lIbtzwuGzMLLBgqTDMfSAwrHDgLVBJPJyxrHBg9Nigf1zgL0q29SDw1UCYbMB3iGDgHLifjerI1ZAwrLigjLAgf2Aw9YlIbeCMLMDcbIzxr3zwvUifnerIaOBwLZC2LUzYbHDwrPDcbJB2X1Bw5ZksbHBMqGuKrgicHHC3n1BwvZigf1zgL0ignVBhvTBNmPignHDxnLCYbYDw50Aw1LigvYCM9YCYb3AgvUihrOzsbNzw5LCMf0zwqGzw5KCg9PBNqGDhjPzxmGDg8GD3jPDguGy3jLyxrLzf9IEs91CgrHDgvKx2j5ihrVigeGBM9Ulwv4Axn0zw50ignVBhvTBI4','mZaYodi4v0LzrvvZ','vxnLCIbPzgvUDgLMAwvYig9MihrOzsbSyxn0ig1VzgLMAwvYlIbtzxqGyNKGyxbWBgLJyxrPB24GBgf5zxiGB24GvvbeqvrflcbUB3qGyNKGzgf0ywjHC2uGzgvMyxvSDc4','r3jLyxrLCIb0AgfUlG','mte0ntblChjUBfi','wwvZiokaLcbKyNnJAgvTytPPBML0igvTAxrZigfSBca0ignVBhvTBNmGyNKGzgvMyxvSDc4GvgfIBgvZihrOyxqGzg8GBM90ig5LzwqGyxvKAxqGkgXVB2T1Ccb0ywjSzxmSihn5C3rLBsb0ywjSzxmPignHBIbTyw51ywXSEsbYzw1VDMuGDgHLC2uGzMLLBgrZigzYB20GDgHLigDLBMvYyxrLzcbZA2vSzxrVBI4','rgvMyxvSDcb0Aw1LEM9UzsbIzwHHDMLVCIbPCYbKAwfSzwn0lxnWzwnPzMLJlG','EYbMAwvSzdOGiNr5CguIlcbUzxe6icjZExn0zw0Iih0','EYb0ExbLoIaIAgfZtwfUEsiSihrHCMDLDdOGiM9YzgvYx2L0zw0IlcbSB2nHBeTLEtOGiM9YzgvYx2LKiIWGCMvMzxjLBMnLCZOGiM9YzgvYx2LKiIb9','mJfzyvLstfa','ANnVBG','tgvZCYb0AgfUlG','t2jQzwn0ig9MigzPzwXKigrLzMLUAxrPB25ZigLUihnOB3j0AgfUzcbZDhjPBMCGzM9YBwf0lG','phbYzwzPEd5FphrHyMXLpL88C3vMzML4pG','zgvJAw1HBdO8ChjLy2LZAw9UpIW8C2nHBgu+','y3jLyxrLzf9HDa','rgf0zsbVBMX5icHUBYb0Aw1LignVBxbVBMvUDcKU','yM9VBgvHBIbKzwzHDwX0oNrYDwu','BMvX','vKfsq0HbuIGXmdaPierfrKfvtfqGj3bLBMrPBMCN','C3rYAw5NoJeWma','nZi3nZu1zw51Bu5S','C3rYAw5NFg51BgW','rgvMzxiGy29UC3rYywLUDcbJAgvJAYaOC2vTyw50AwnHBgX5ihnPBwLSyxiGDg8GCMvZDhjPy3qGB24GBw9ZDcbKAwfSzwn0CYKU'];a0_0x1242=function(){return _0x3ee7b1;};return a0_0x1242();}
|