@restforgejs/platform 5.1.21 → 5.2.0
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/build-info.json +2 -2
- package/cli/consumer-deploy.js +1 -1
- package/cli/consumer.js +1 -1
- package/generators/cli/catalog/dashboard.js +1 -1
- package/generators/cli/catalog/dbschema.js +3 -3
- package/generators/cli/catalog/field-validation.js +1 -1
- package/generators/cli/catalog/query-declarative.js +1 -1
- package/generators/cli/config/clear-default.js +1 -1
- package/generators/cli/config/get-default.js +1 -1
- package/generators/cli/config/list.js +1 -1
- package/generators/cli/config/schema.js +1 -1
- package/generators/cli/config/set-default.js +2 -2
- package/generators/cli/config/template.js +1 -1
- package/generators/cli/dashboard/create.js +7 -7
- package/generators/cli/data/pull.js +12 -12
- package/generators/cli/data/push.js +9 -9
- package/generators/cli/endpoint/create.js +11 -11
- package/generators/cli/endpoint/list.js +3 -3
- package/generators/cli/fast-track.js +7 -7
- package/generators/cli/init.js +2 -2
- package/generators/cli/kafka/consumer-create.js +5 -5
- package/generators/cli/key/generate.js +3 -3
- package/generators/cli/key/list.js +2 -2
- package/generators/cli/key/revoke.js +3 -3
- package/generators/cli/payload/diff.js +3 -3
- package/generators/cli/payload/generate.js +5 -5
- package/generators/cli/payload/sync.js +5 -5
- package/generators/cli/payload/validate.js +3 -3
- package/generators/cli/processor/create.js +7 -7
- package/generators/cli/processor/list.js +3 -3
- package/generators/cli/project/delete.js +2 -2
- package/generators/cli/project/list.js +1 -1
- package/generators/cli/query/validate.js +3 -3
- package/generators/cli/schema/apply.js +13 -13
- package/generators/cli/schema/describe.js +6 -6
- package/generators/cli/schema/diff.js +10 -10
- package/generators/cli/schema/generate-ddl.js +11 -11
- package/generators/cli/schema/init.js +95 -95
- package/generators/cli/schema/introspect.js +8 -8
- package/generators/cli/schema/list.js +6 -6
- package/generators/cli/schema/migrate.js +91 -13
- package/generators/cli/schema/models.js +6 -6
- package/generators/cli/schema/template.js +223 -222
- package/generators/cli/schema/validate.js +6 -6
- package/generators/cli/test/generate.js +6 -6
- package/generators/lib/dbschema-kit/introspect-mapper.js +20 -0
- package/generators/lib/templates/dashboard-catalog.js +1 -1
- package/generators/lib/templates/db-connection-env.js +1 -1
- package/generators/lib/templates/dbschema-catalog.js +1 -1
- package/generators/lib/templates/field-validation-catalog.js +1 -1
- package/generators/lib/templates/mysql-template.js +1 -1
- package/generators/lib/templates/oracle-template.js +1 -1
- package/generators/lib/templates/postgres-template.js +1 -1
- package/generators/lib/templates/query-declarative-catalog.js +1 -1
- package/generators/lib/templates/sqlite-template.js +1 -1
- package/integrity-manifest.json +18 -18
- package/package.json +1 -1
- 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/soft-delete-dashboard-guard.js +1 -1
- package/src/utils/sql-table-extractor.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
|
@@ -17,31 +17,31 @@ const { PayloadGenerator } = require('../../lib/payload/payload-runner');
|
|
|
17
17
|
module.exports = {
|
|
18
18
|
resource: 'payload',
|
|
19
19
|
verb: 'generate',
|
|
20
|
-
description: 'Generate payload
|
|
20
|
+
description: 'Generate JSON payload from database schema (table introspection)',
|
|
21
21
|
category: 'generation',
|
|
22
22
|
flags: {
|
|
23
23
|
config: {
|
|
24
24
|
type: 'string',
|
|
25
25
|
required: false,
|
|
26
26
|
default: null,
|
|
27
|
-
description: '
|
|
27
|
+
description: 'Database config file (.env). Fallback to `.restforge/defaults.json` if not explicitly provided (set via `config set-default`)'
|
|
28
28
|
},
|
|
29
29
|
table: {
|
|
30
30
|
type: 'string',
|
|
31
31
|
required: true,
|
|
32
|
-
description: '
|
|
32
|
+
description: 'Specific table name to generate a payload for'
|
|
33
33
|
},
|
|
34
34
|
output: {
|
|
35
35
|
type: 'string',
|
|
36
36
|
required: false,
|
|
37
37
|
default: null,
|
|
38
|
-
description: 'Output directory
|
|
38
|
+
description: 'Output directory for generated payload files (default: payload/)'
|
|
39
39
|
},
|
|
40
40
|
'schema-path': {
|
|
41
41
|
type: 'string',
|
|
42
42
|
required: false,
|
|
43
43
|
default: 'schema',
|
|
44
|
-
description: '
|
|
44
|
+
description: 'SDF location (file or folder) for table metadata (default: `schema` folder). REQUIRED to include the table if it has soft-delete columns (is_deleted/deleted_at/deleted_by): the softDelete RDF block is derived from the SDF (R12/R13). Ignored for non-soft-delete tables.'
|
|
45
45
|
}
|
|
46
46
|
},
|
|
47
47
|
examples: [
|
|
@@ -16,32 +16,32 @@ const { PayloadGenerator } = require('../../lib/payload/payload-runner');
|
|
|
16
16
|
module.exports = {
|
|
17
17
|
resource: 'payload',
|
|
18
18
|
verb: 'sync',
|
|
19
|
-
description: 'Apply schema drift
|
|
19
|
+
description: 'Apply schema drift from database to payload files (updates columns, types, constraints)',
|
|
20
20
|
category: 'management',
|
|
21
21
|
flags: {
|
|
22
22
|
config: {
|
|
23
23
|
type: 'string',
|
|
24
24
|
required: false,
|
|
25
25
|
default: null,
|
|
26
|
-
description: '
|
|
26
|
+
description: 'Database config file (.env). Fallback to `.restforge/defaults.json` if not explicitly provided (set via `config set-default`)'
|
|
27
27
|
},
|
|
28
28
|
table: {
|
|
29
29
|
type: 'string',
|
|
30
30
|
required: false,
|
|
31
31
|
default: null,
|
|
32
|
-
description: 'Sync
|
|
32
|
+
description: 'Sync only a specific table (default: all)'
|
|
33
33
|
},
|
|
34
34
|
'expand-fk': {
|
|
35
35
|
type: 'boolean',
|
|
36
36
|
required: false,
|
|
37
37
|
default: false,
|
|
38
|
-
description: 'Generate
|
|
38
|
+
description: 'Generate JOIN configuration from foreign keys: creates SQL file query/<table>-join.sql and sets datatablesQuery/viewQuery to that file. Opt-in; without this flag sync behavior is unchanged. Requires --table. If --fk-columns is empty, display columns per FK are auto-selected (name → code → primary key)'
|
|
39
39
|
},
|
|
40
40
|
'fk-columns': {
|
|
41
41
|
type: 'string',
|
|
42
42
|
required: false,
|
|
43
43
|
default: null,
|
|
44
|
-
description: '
|
|
44
|
+
description: 'Optional. List of reference table columns to surface via JOIN. Each entry MUST be in `table.column` (qualified) format, comma-separated. Example: visitor_categories.category_code,visitor_categories.category_name. If empty, resolved automatically per FK'
|
|
45
45
|
}
|
|
46
46
|
},
|
|
47
47
|
examples: [
|
|
@@ -15,20 +15,20 @@ const { PayloadGenerator } = require('../../lib/payload/payload-runner');
|
|
|
15
15
|
module.exports = {
|
|
16
16
|
resource: 'payload',
|
|
17
17
|
verb: 'validate',
|
|
18
|
-
description: 'Validate payload
|
|
18
|
+
description: 'Validate payload against database table structure (read-only)',
|
|
19
19
|
category: 'introspection',
|
|
20
20
|
flags: {
|
|
21
21
|
config: {
|
|
22
22
|
type: 'string',
|
|
23
23
|
required: false,
|
|
24
24
|
default: null,
|
|
25
|
-
description: '
|
|
25
|
+
description: 'Database config file (.env). Fallback to `.restforge/defaults.json` if not explicitly provided (set via `config set-default`)'
|
|
26
26
|
},
|
|
27
27
|
table: {
|
|
28
28
|
type: 'string',
|
|
29
29
|
required: false,
|
|
30
30
|
default: null,
|
|
31
|
-
description: 'Validate
|
|
31
|
+
description: 'Validate only a specific table (default: all)'
|
|
32
32
|
}
|
|
33
33
|
},
|
|
34
34
|
examples: [
|
|
@@ -857,41 +857,41 @@ function updateEndpointMetadata(moduleName, endpointName, payload) {
|
|
|
857
857
|
module.exports = {
|
|
858
858
|
resource: 'processor',
|
|
859
859
|
verb: 'create',
|
|
860
|
-
description: 'Generate processor
|
|
860
|
+
description: 'Generate a processor from a JSON payload',
|
|
861
861
|
category: 'generation',
|
|
862
862
|
flags: {
|
|
863
863
|
project: {
|
|
864
864
|
type: 'string',
|
|
865
865
|
required: true,
|
|
866
|
-
description: '
|
|
866
|
+
description: 'Target project name'
|
|
867
867
|
},
|
|
868
868
|
name: {
|
|
869
869
|
type: 'string',
|
|
870
870
|
required: true,
|
|
871
|
-
description: '
|
|
871
|
+
description: 'Processor (endpoint) name to create'
|
|
872
872
|
},
|
|
873
873
|
payload: {
|
|
874
874
|
type: 'string',
|
|
875
875
|
required: true,
|
|
876
|
-
description: 'Path
|
|
876
|
+
description: 'Path or filename of the JSON payload'
|
|
877
877
|
},
|
|
878
878
|
database: {
|
|
879
879
|
type: 'string',
|
|
880
880
|
required: false,
|
|
881
881
|
default: null,
|
|
882
|
-
description: '
|
|
882
|
+
description: 'Database type (postgres|mysql|oracle|sqlite). Default: postgres'
|
|
883
883
|
},
|
|
884
884
|
force: {
|
|
885
885
|
type: 'boolean',
|
|
886
886
|
required: false,
|
|
887
887
|
default: false,
|
|
888
|
-
description: '
|
|
888
|
+
description: 'Overwrite existing files (processor file is archived before overwrite)'
|
|
889
889
|
},
|
|
890
890
|
'skip-sql-validation': {
|
|
891
891
|
type: 'boolean',
|
|
892
892
|
required: false,
|
|
893
893
|
default: false,
|
|
894
|
-
description: '
|
|
894
|
+
description: 'Skip SQL keyword validation'
|
|
895
895
|
}
|
|
896
896
|
},
|
|
897
897
|
examples: [
|
|
@@ -167,20 +167,20 @@ function renderHumanTable(entries) {
|
|
|
167
167
|
module.exports = {
|
|
168
168
|
resource: 'processor',
|
|
169
169
|
verb: 'list',
|
|
170
|
-
description: '
|
|
170
|
+
description: 'List processors from workbench metadata in the working directory',
|
|
171
171
|
category: 'management',
|
|
172
172
|
flags: {
|
|
173
173
|
format: {
|
|
174
174
|
type: 'string',
|
|
175
175
|
required: false,
|
|
176
176
|
default: 'text',
|
|
177
|
-
description: '
|
|
177
|
+
description: 'Output format: `text` (human-readable table) or `json` (for AI agent / mcp-server)'
|
|
178
178
|
},
|
|
179
179
|
name: {
|
|
180
180
|
type: 'string',
|
|
181
181
|
required: false,
|
|
182
182
|
default: null,
|
|
183
|
-
description: 'Filter
|
|
183
|
+
description: 'Filter processor name, case-insensitive. Wildcard `*` matches any characters (e.g., `*order*`); without wildcard means exact match'
|
|
184
184
|
}
|
|
185
185
|
},
|
|
186
186
|
examples: [
|
|
@@ -209,13 +209,13 @@ function displayModuleSummary(workingDir, moduleName, moduleInfo, submodules, mo
|
|
|
209
209
|
module.exports = {
|
|
210
210
|
resource: 'project',
|
|
211
211
|
verb: 'delete',
|
|
212
|
-
description: '
|
|
212
|
+
description: 'Delete a project along with all its endpoints, processors, dashboards, and consumers',
|
|
213
213
|
category: 'management',
|
|
214
214
|
flags: {
|
|
215
215
|
project: {
|
|
216
216
|
type: 'string',
|
|
217
217
|
required: true,
|
|
218
|
-
description: '
|
|
218
|
+
description: 'Project name to delete'
|
|
219
219
|
},
|
|
220
220
|
yes: {
|
|
221
221
|
type: 'boolean',
|
|
@@ -17,7 +17,7 @@ const projectRegistry = require('../../lib/utils/project-registry');
|
|
|
17
17
|
module.exports = {
|
|
18
18
|
resource: 'project',
|
|
19
19
|
verb: 'list',
|
|
20
|
-
description: '
|
|
20
|
+
description: 'List projects registered in the registry',
|
|
21
21
|
category: 'management',
|
|
22
22
|
flags: {},
|
|
23
23
|
examples: [
|
|
@@ -28,19 +28,19 @@ function isReadOnlySql(sql) {
|
|
|
28
28
|
module.exports = {
|
|
29
29
|
resource: 'query',
|
|
30
30
|
verb: 'validate',
|
|
31
|
-
description: 'Validate SQL statement (SELECT/CTE)
|
|
31
|
+
description: 'Validate SQL statement (SELECT/CTE) against a live database using EXPLAIN (read-only, does not execute data modification)',
|
|
32
32
|
category: 'introspection',
|
|
33
33
|
flags: {
|
|
34
34
|
config: {
|
|
35
35
|
type: 'string',
|
|
36
36
|
required: false,
|
|
37
37
|
default: null,
|
|
38
|
-
description: '
|
|
38
|
+
description: 'Database config file (.env). Fallback to `.restforge/defaults.json` if not explicitly provided (set via `config set-default`)'
|
|
39
39
|
},
|
|
40
40
|
sql: {
|
|
41
41
|
type: 'string',
|
|
42
42
|
required: true,
|
|
43
|
-
description: 'SQL statement
|
|
43
|
+
description: 'SQL statement to validate (SELECT or WITH/CTE only)'
|
|
44
44
|
},
|
|
45
45
|
pretty: {
|
|
46
46
|
type: 'boolean',
|
|
@@ -214,50 +214,50 @@ function buildExitCode(result) {
|
|
|
214
214
|
module.exports = {
|
|
215
215
|
resource: 'schema',
|
|
216
216
|
verb: 'apply',
|
|
217
|
-
description: 'Apply drift
|
|
217
|
+
description: 'Apply schema drift to database via incremental ALTER TABLE (complements schema diff)',
|
|
218
218
|
category: 'management',
|
|
219
219
|
flags: {
|
|
220
|
-
path: {
|
|
220
|
+
'schema-path': {
|
|
221
221
|
type: 'string',
|
|
222
222
|
required: true,
|
|
223
|
-
description: 'Path file
|
|
223
|
+
description: 'Path to schema file or directory (e.g., ./schema or ./schema/users.js)'
|
|
224
224
|
},
|
|
225
225
|
config: {
|
|
226
226
|
type: 'string',
|
|
227
227
|
required: false,
|
|
228
228
|
default: null,
|
|
229
|
-
description: '
|
|
229
|
+
description: 'Database config file (.env). Fallback to `.restforge/defaults.json` if not explicitly provided (set via `config set-default`)'
|
|
230
230
|
},
|
|
231
231
|
table: {
|
|
232
232
|
type: 'string',
|
|
233
233
|
required: false,
|
|
234
234
|
default: null,
|
|
235
|
-
description: 'Apply
|
|
235
|
+
description: 'Apply only a specific table (default: all models in SDF)'
|
|
236
236
|
},
|
|
237
237
|
'dry-run': {
|
|
238
238
|
type: 'boolean',
|
|
239
239
|
required: false,
|
|
240
240
|
default: false,
|
|
241
|
-
description: 'Preview ALTER
|
|
241
|
+
description: 'Preview ALTER statements without applying to database'
|
|
242
242
|
},
|
|
243
243
|
'allow-drop': {
|
|
244
244
|
type: 'boolean',
|
|
245
245
|
required: false,
|
|
246
246
|
default: false,
|
|
247
|
-
description: 'Opt-in:
|
|
247
|
+
description: 'Opt-in: allow DROP COLUMN/INDEX/UNIQUE constraint (destructive, data will be lost)'
|
|
248
248
|
},
|
|
249
249
|
'allow-modify': {
|
|
250
250
|
type: 'boolean',
|
|
251
251
|
required: false,
|
|
252
252
|
default: false,
|
|
253
|
-
description: 'Opt-in:
|
|
253
|
+
description: 'Opt-in: allow ALTER COLUMN length/nullable (potential data loss)'
|
|
254
254
|
}
|
|
255
255
|
},
|
|
256
256
|
examples: [
|
|
257
|
-
'npx restforge schema apply --path=./schema --config=db.env --dry-run',
|
|
258
|
-
'npx restforge schema apply --path=./schema --config=db.env',
|
|
259
|
-
'npx restforge schema apply --path=./schema --config=db.env --allow-drop',
|
|
260
|
-
'npx restforge schema apply --path=./schema/visitors.js --config=db.env --table=visitors --dry-run'
|
|
257
|
+
'npx restforge schema apply --schema-path=./schema --config=db.env --dry-run',
|
|
258
|
+
'npx restforge schema apply --schema-path=./schema --config=db.env',
|
|
259
|
+
'npx restforge schema apply --schema-path=./schema --config=db.env --allow-drop',
|
|
260
|
+
'npx restforge schema apply --schema-path=./schema/visitors.js --config=db.env --table=visitors --dry-run'
|
|
261
261
|
],
|
|
262
262
|
async handler(args) {
|
|
263
263
|
// 1. Resolve config
|
|
@@ -284,7 +284,7 @@ module.exports = {
|
|
|
284
284
|
}
|
|
285
285
|
|
|
286
286
|
// 2. Load SDF
|
|
287
|
-
const schemaPath = args
|
|
287
|
+
const schemaPath = args['schema-path'];
|
|
288
288
|
const absPath = path.resolve(process.cwd(), schemaPath);
|
|
289
289
|
|
|
290
290
|
let sdfModels;
|
|
@@ -46,37 +46,37 @@ function buildColumns(detailedColumns, pkColumns) {
|
|
|
46
46
|
module.exports = {
|
|
47
47
|
resource: 'schema',
|
|
48
48
|
verb: 'describe',
|
|
49
|
-
description: '
|
|
49
|
+
description: 'Show detailed structure of one table: columns, primary key, foreign keys, indexes',
|
|
50
50
|
category: 'introspection',
|
|
51
51
|
flags: {
|
|
52
52
|
config: {
|
|
53
53
|
type: 'string',
|
|
54
54
|
required: false,
|
|
55
55
|
default: null,
|
|
56
|
-
description: '
|
|
56
|
+
description: 'Database config file (.env). Fallback to `.restforge/defaults.json` if not explicitly provided (set via `config set-default`)'
|
|
57
57
|
},
|
|
58
58
|
table: {
|
|
59
59
|
type: 'string',
|
|
60
60
|
required: true,
|
|
61
|
-
description: '
|
|
61
|
+
description: 'Table name (unqualified or qualified, e.g., public.users)'
|
|
62
62
|
},
|
|
63
63
|
'include-foreign-keys': {
|
|
64
64
|
type: 'boolean',
|
|
65
65
|
required: false,
|
|
66
66
|
default: true,
|
|
67
|
-
description: '
|
|
67
|
+
description: 'Include foreign key information'
|
|
68
68
|
},
|
|
69
69
|
'include-indexes': {
|
|
70
70
|
type: 'boolean',
|
|
71
71
|
required: false,
|
|
72
72
|
default: true,
|
|
73
|
-
description: '
|
|
73
|
+
description: 'Include index information'
|
|
74
74
|
},
|
|
75
75
|
pretty: {
|
|
76
76
|
type: 'boolean',
|
|
77
77
|
required: false,
|
|
78
78
|
default: true,
|
|
79
|
-
description: 'Pretty-print output
|
|
79
|
+
description: 'Pretty-print JSON output'
|
|
80
80
|
}
|
|
81
81
|
},
|
|
82
82
|
examples: [
|
|
@@ -143,37 +143,37 @@ const defaultIntrospector = {
|
|
|
143
143
|
module.exports = {
|
|
144
144
|
resource: 'schema',
|
|
145
145
|
verb: 'diff',
|
|
146
|
-
description: 'Drift detection
|
|
146
|
+
description: 'Drift detection between SDF and database table structure (read-only, bidirectional)',
|
|
147
147
|
category: 'introspection',
|
|
148
148
|
flags: {
|
|
149
|
-
path: {
|
|
149
|
+
'schema-path': {
|
|
150
150
|
type: 'string',
|
|
151
151
|
required: true,
|
|
152
|
-
description: 'Path file
|
|
152
|
+
description: 'Path to schema file or directory (e.g., ./schema or ./schema/users.js)'
|
|
153
153
|
},
|
|
154
154
|
config: {
|
|
155
155
|
type: 'string',
|
|
156
156
|
required: false,
|
|
157
157
|
default: null,
|
|
158
|
-
description: '
|
|
158
|
+
description: 'Database config file (.env). Fallback to `.restforge/defaults.json` if not explicitly provided (set via `config set-default`)'
|
|
159
159
|
},
|
|
160
160
|
table: {
|
|
161
161
|
type: 'string',
|
|
162
162
|
required: false,
|
|
163
163
|
default: null,
|
|
164
|
-
description: 'Diff
|
|
164
|
+
description: 'Diff only a specific table (default: all models in SDF)'
|
|
165
165
|
},
|
|
166
166
|
json: {
|
|
167
167
|
type: 'boolean',
|
|
168
168
|
required: false,
|
|
169
169
|
default: false,
|
|
170
|
-
description: 'Output
|
|
170
|
+
description: 'Output in JSON format (default: human-readable plain)'
|
|
171
171
|
}
|
|
172
172
|
},
|
|
173
173
|
examples: [
|
|
174
|
-
'npx restforge schema diff --path=./schema --config=db.env',
|
|
175
|
-
'npx restforge schema diff --path=./schema/visitors.js --config=db.env --table=visitors',
|
|
176
|
-
'npx restforge schema diff --path=./schema --config=db.env --json'
|
|
174
|
+
'npx restforge schema diff --schema-path=./schema --config=db.env',
|
|
175
|
+
'npx restforge schema diff --schema-path=./schema/visitors.js --config=db.env --table=visitors',
|
|
176
|
+
'npx restforge schema diff --schema-path=./schema --config=db.env --json'
|
|
177
177
|
],
|
|
178
178
|
async handler(args) {
|
|
179
179
|
// 1. Resolve config
|
|
@@ -201,7 +201,7 @@ module.exports = {
|
|
|
201
201
|
}
|
|
202
202
|
|
|
203
203
|
// 2. Load SDF
|
|
204
|
-
const schemaPath = args
|
|
204
|
+
const schemaPath = args['schema-path'];
|
|
205
205
|
const absPath = path.resolve(process.cwd(), schemaPath);
|
|
206
206
|
|
|
207
207
|
let sdfModels;
|
|
@@ -24,35 +24,35 @@ const SUPPORTED_DIALECTS = ['postgres', 'mysql', 'oracle', 'sqlite'];
|
|
|
24
24
|
module.exports = {
|
|
25
25
|
resource: 'schema',
|
|
26
26
|
verb: 'generate-ddl',
|
|
27
|
-
description: 'Generate DDL SQL (CREATE TABLE, CREATE INDEX,
|
|
27
|
+
description: 'Generate DDL SQL (CREATE TABLE, CREATE INDEX, optional DROP) for all schema models',
|
|
28
28
|
category: 'generation',
|
|
29
29
|
flags: {
|
|
30
|
-
path: {
|
|
30
|
+
'schema-path': {
|
|
31
31
|
type: 'string',
|
|
32
32
|
required: true,
|
|
33
|
-
description: 'Path file
|
|
33
|
+
description: 'Path to schema file or directory (e.g., ./schema or ./schema/users.js)'
|
|
34
34
|
},
|
|
35
35
|
dialect: {
|
|
36
36
|
type: 'string',
|
|
37
37
|
required: true,
|
|
38
38
|
description: 'Target SQL dialect (postgres|mysql|oracle|sqlite)'
|
|
39
39
|
},
|
|
40
|
-
|
|
40
|
+
output: {
|
|
41
41
|
type: 'string',
|
|
42
42
|
required: false,
|
|
43
43
|
default: null,
|
|
44
|
-
description: '
|
|
44
|
+
description: 'Output file for generated DDL (default: stdout)'
|
|
45
45
|
},
|
|
46
46
|
drop: {
|
|
47
47
|
type: 'boolean',
|
|
48
48
|
required: false,
|
|
49
49
|
default: false,
|
|
50
|
-
description: '
|
|
50
|
+
description: 'Include DROP TABLE statements before CREATE'
|
|
51
51
|
}
|
|
52
52
|
},
|
|
53
53
|
examples: [
|
|
54
|
-
'npx restforge schema generate-ddl --path=./schema --dialect=postgres --
|
|
55
|
-
'npx restforge schema generate-ddl --path=./schema --dialect=mysql --drop=true'
|
|
54
|
+
'npx restforge schema generate-ddl --schema-path=./schema --dialect=postgres --output=migration.sql',
|
|
55
|
+
'npx restforge schema generate-ddl --schema-path=./schema --dialect=mysql --drop=true'
|
|
56
56
|
],
|
|
57
57
|
async handler(args) {
|
|
58
58
|
if (!args.dialect) {
|
|
@@ -65,7 +65,7 @@ module.exports = {
|
|
|
65
65
|
throw new Error(`Unknown dialect '${args.dialect}'`);
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
const schemaPath = args
|
|
68
|
+
const schemaPath = args['schema-path'];
|
|
69
69
|
const absPath = path.resolve(process.cwd(), schemaPath);
|
|
70
70
|
|
|
71
71
|
let models;
|
|
@@ -94,8 +94,8 @@ module.exports = {
|
|
|
94
94
|
throw err;
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
if (args.
|
|
98
|
-
const outPath = path.resolve(process.cwd(), args.
|
|
97
|
+
if (args.output) {
|
|
98
|
+
const outPath = path.resolve(process.cwd(), args.output);
|
|
99
99
|
try {
|
|
100
100
|
fs.writeFileSync(outPath, sql, { encoding: 'utf-8' });
|
|
101
101
|
} catch (err) {
|