@restforgejs/platform 5.1.20 → 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.
Files changed (215) hide show
  1. package/build-info.json +2 -2
  2. package/cli/consumer-deploy.js +1 -1
  3. package/cli/consumer.js +1 -1
  4. package/generators/cli/catalog/dashboard.js +1 -1
  5. package/generators/cli/catalog/dbschema.js +3 -3
  6. package/generators/cli/catalog/field-validation.js +1 -1
  7. package/generators/cli/catalog/query-declarative.js +1 -1
  8. package/generators/cli/config/clear-default.js +1 -1
  9. package/generators/cli/config/get-default.js +1 -1
  10. package/generators/cli/config/list.js +1 -1
  11. package/generators/cli/config/schema.js +1 -1
  12. package/generators/cli/config/set-default.js +2 -2
  13. package/generators/cli/config/template.js +1 -1
  14. package/generators/cli/dashboard/create.js +7 -7
  15. package/generators/cli/data/pull.js +12 -12
  16. package/generators/cli/data/push.js +9 -9
  17. package/generators/cli/endpoint/create.js +11 -11
  18. package/generators/cli/endpoint/list.js +3 -3
  19. package/generators/cli/fast-track.js +7 -7
  20. package/generators/cli/init.js +2 -2
  21. package/generators/cli/kafka/consumer-create.js +5 -5
  22. package/generators/cli/key/generate.js +3 -3
  23. package/generators/cli/key/list.js +2 -2
  24. package/generators/cli/key/revoke.js +3 -3
  25. package/generators/cli/payload/diff.js +3 -3
  26. package/generators/cli/payload/generate.js +5 -5
  27. package/generators/cli/payload/sync.js +5 -5
  28. package/generators/cli/payload/validate.js +3 -3
  29. package/generators/cli/processor/create.js +7 -7
  30. package/generators/cli/processor/list.js +3 -3
  31. package/generators/cli/project/delete.js +2 -2
  32. package/generators/cli/project/list.js +1 -1
  33. package/generators/cli/query/validate.js +3 -3
  34. package/generators/cli/schema/apply.js +13 -13
  35. package/generators/cli/schema/describe.js +6 -6
  36. package/generators/cli/schema/diff.js +10 -10
  37. package/generators/cli/schema/generate-ddl.js +11 -11
  38. package/generators/cli/schema/init.js +95 -95
  39. package/generators/cli/schema/introspect.js +8 -8
  40. package/generators/cli/schema/list.js +6 -6
  41. package/generators/cli/schema/migrate.js +91 -13
  42. package/generators/cli/schema/models.js +6 -6
  43. package/generators/cli/schema/template.js +223 -222
  44. package/generators/cli/schema/validate.js +6 -6
  45. package/generators/cli/test/generate.js +6 -6
  46. package/generators/lib/dbschema-kit/apply-executor.js +20 -0
  47. package/generators/lib/dbschema-kit/introspect-mapper.js +20 -0
  48. package/generators/lib/generators/processor-validation-generator.js +4 -1
  49. package/generators/lib/migrate/field-type-resolver.js +23 -0
  50. package/generators/lib/payload/payload-runner.js +17 -3
  51. package/generators/lib/templates/dashboard-catalog.js +1 -1
  52. package/generators/lib/templates/db-connection-env.js +1 -1
  53. package/generators/lib/templates/dbschema-catalog.js +1 -1
  54. package/generators/lib/templates/field-validation-catalog.js +1 -1
  55. package/generators/lib/templates/mysql-template.js +1 -1
  56. package/generators/lib/templates/oracle-template.js +1 -1
  57. package/generators/lib/templates/postgres-template.js +1 -1
  58. package/generators/lib/templates/query-declarative-catalog.js +1 -1
  59. package/generators/lib/templates/sqlite-template.js +1 -1
  60. package/integrity-manifest.json +18 -18
  61. package/package.json +1 -1
  62. package/scripts/verify-integrity.js +1 -1
  63. package/server.js +1 -1
  64. package/src/components/handlers/adjust_handler.js +1 -1
  65. package/src/components/handlers/audit_handler.js +1 -1
  66. package/src/components/handlers/delete_handler.js +1 -1
  67. package/src/components/handlers/export_handler.js +1 -1
  68. package/src/components/handlers/import_handler.js +1 -1
  69. package/src/components/handlers/insert_handler.js +1 -1
  70. package/src/components/handlers/update_handler.js +1 -1
  71. package/src/components/handlers/upload_handler.js +1 -1
  72. package/src/components/handlers/workflow_handler.js +1 -1
  73. package/src/components/integrations/webhook.js +1 -1
  74. package/src/consumers/baseConsumer.js +1 -1
  75. package/src/consumers/declarativeMapper.js +1 -1
  76. package/src/consumers/handlers/apiHandler.js +1 -1
  77. package/src/consumers/handlers/consoleHandler.js +1 -1
  78. package/src/consumers/handlers/databaseHandler.js +1 -1
  79. package/src/consumers/handlers/index.js +1 -1
  80. package/src/consumers/handlers/kafkaHandler.js +1 -1
  81. package/src/consumers/index.js +1 -1
  82. package/src/consumers/messageTransformer.js +1 -1
  83. package/src/consumers/validator.js +1 -1
  84. package/src/core/db/dialect/base-dialect.js +1 -1
  85. package/src/core/db/dialect/index.js +1 -1
  86. package/src/core/db/dialect/mysql-dialect.js +1 -1
  87. package/src/core/db/dialect/oracle-dialect.js +1 -1
  88. package/src/core/db/dialect/postgres-dialect.js +1 -1
  89. package/src/core/db/dialect/sqlite-dialect.js +1 -1
  90. package/src/core/db/flatten-helper.js +1 -1
  91. package/src/core/db/query-builder-error.js +1 -1
  92. package/src/core/db/query-builder.js +1 -1
  93. package/src/core/db/relation-helper.js +1 -1
  94. package/src/core/handlers/delete_handler.js +1 -1
  95. package/src/core/handlers/insert_handler.js +1 -1
  96. package/src/core/handlers/update_handler.js +1 -1
  97. package/src/core/models/base-model.js +1 -1
  98. package/src/core/utils/cache-manager.js +1 -1
  99. package/src/core/utils/component-engine.js +1 -1
  100. package/src/core/utils/context-builder.js +1 -1
  101. package/src/core/utils/datetime-formatter.js +1 -1
  102. package/src/core/utils/datetime-parser.js +1 -1
  103. package/src/core/utils/db.js +1 -1
  104. package/src/core/utils/logger.js +1 -1
  105. package/src/core/utils/payload-loader.js +1 -1
  106. package/src/core/utils/security-checks.js +1 -1
  107. package/src/middleware/body-options.js +1 -1
  108. package/src/middleware/cors.js +1 -1
  109. package/src/middleware/idempotency.js +1 -1
  110. package/src/middleware/rate-limiter.js +1 -1
  111. package/src/middleware/request-logger.js +1 -1
  112. package/src/middleware/security-headers.js +1 -1
  113. package/src/models/base-model-mysql.js +1 -1
  114. package/src/models/base-model-oracle.js +1 -1
  115. package/src/models/base-model-sqlite.js +1 -1
  116. package/src/models/base-model.js +1 -1
  117. package/src/pro/caching/redis-client.js +1 -1
  118. package/src/pro/caching/redis-helper.js +1 -1
  119. package/src/pro/consumers/baseConsumer.js +1 -1
  120. package/src/pro/consumers/declarativeMapper.js +1 -1
  121. package/src/pro/consumers/handlers/apiHandler.js +1 -1
  122. package/src/pro/consumers/handlers/consoleHandler.js +1 -1
  123. package/src/pro/consumers/handlers/databaseHandler.js +1 -1
  124. package/src/pro/consumers/handlers/index.js +1 -1
  125. package/src/pro/consumers/handlers/kafkaHandler.js +1 -1
  126. package/src/pro/consumers/index.js +1 -1
  127. package/src/pro/consumers/messageTransformer.js +1 -1
  128. package/src/pro/consumers/validator.js +1 -1
  129. package/src/pro/database/base-model-mysql.js +1 -1
  130. package/src/pro/database/base-model-oracle.js +1 -1
  131. package/src/pro/database/base-model-sqlite.js +1 -1
  132. package/src/pro/database/db-mysql.js +1 -1
  133. package/src/pro/database/db-oracle.js +1 -1
  134. package/src/pro/database/db-sqlite.js +1 -1
  135. package/src/pro/excel/excel-generator.js +1 -1
  136. package/src/pro/excel/excel-parser.js +1 -1
  137. package/src/pro/excel/export-service.js +1 -1
  138. package/src/pro/excel/export_handler.js +1 -1
  139. package/src/pro/excel/import-service.js +1 -1
  140. package/src/pro/excel/import-validator.js +1 -1
  141. package/src/pro/excel/import_handler.js +1 -1
  142. package/src/pro/excel/upsert-builder.js +1 -1
  143. package/src/pro/idgen/idgen-routes.js +1 -1
  144. package/src/pro/integrations/lookup-resolver.js +1 -1
  145. package/src/pro/integrations/upload-handler-v2.js +1 -1
  146. package/src/pro/integrations/upload-handler.js +1 -1
  147. package/src/pro/integrations/webhook.js +1 -1
  148. package/src/pro/locking/lock-routes.js +1 -1
  149. package/src/pro/locking/resource-lock-manager.js +1 -1
  150. package/src/pro/messaging/kafkaConsumerService.js +1 -1
  151. package/src/pro/messaging/kafkaService.js +1 -1
  152. package/src/pro/messaging/messagehubService.js +1 -1
  153. package/src/pro/messaging/rabbitmqService.js +1 -1
  154. package/src/pro/scheduler/job-manager.js +1 -1
  155. package/src/pro/scheduler/job-routes.js +1 -1
  156. package/src/pro/scheduler/job-validator.js +1 -1
  157. package/src/pro/storage/base-storage-provider.js +1 -1
  158. package/src/pro/storage/file-metadata-helper.js +1 -1
  159. package/src/pro/storage/index.js +1 -1
  160. package/src/pro/storage/local-storage-provider.js +1 -1
  161. package/src/pro/storage/s3-storage-provider.js +1 -1
  162. package/src/pro/storage/upload-cleanup-job.js +1 -1
  163. package/src/pro/storage/upload-cleanup-scheduler.js +1 -1
  164. package/src/pro/storage/upload-pending-tracker.js +1 -1
  165. package/src/pro/websocket/broadcast-helper.js +1 -1
  166. package/src/pro/websocket/index.js +1 -1
  167. package/src/pro/websocket/livesync-server.js +1 -1
  168. package/src/pro/websocket/ws-broadcaster.js +1 -1
  169. package/src/services/export-service.js +1 -1
  170. package/src/services/import-service.js +1 -1
  171. package/src/services/kafkaConsumerService.js +1 -1
  172. package/src/services/kafkaService.js +1 -1
  173. package/src/services/messagehubService.js +1 -1
  174. package/src/services/rabbitmqService.js +1 -1
  175. package/src/utils/cache-invalidation-registry.js +1 -1
  176. package/src/utils/cache-manager.js +1 -1
  177. package/src/utils/component-engine.js +1 -1
  178. package/src/utils/config-extractor.js +1 -1
  179. package/src/utils/consumerLogger.js +1 -1
  180. package/src/utils/context-builder.js +1 -1
  181. package/src/utils/dashboard-helpers.js +1 -1
  182. package/src/utils/dateHelper.js +1 -1
  183. package/src/utils/datetime-formatter.js +1 -1
  184. package/src/utils/datetime-parser.js +1 -1
  185. package/src/utils/db-bootstrap.js +1 -1
  186. package/src/utils/db-mysql.js +1 -1
  187. package/src/utils/db-oracle.js +1 -1
  188. package/src/utils/db-sqlite.js +1 -1
  189. package/src/utils/db.js +1 -1
  190. package/src/utils/demo-generator.js +1 -1
  191. package/src/utils/excel-generator.js +1 -1
  192. package/src/utils/excel-parser.js +1 -1
  193. package/src/utils/file-watcher.js +1 -1
  194. package/src/utils/id-generator.js +1 -1
  195. package/src/utils/idempotency-manager.js +1 -1
  196. package/src/utils/import-validator.js +1 -1
  197. package/src/utils/license-client.js +1 -1
  198. package/src/utils/lock-manager.js +1 -1
  199. package/src/utils/logger.js +1 -1
  200. package/src/utils/lookup-resolver.js +1 -1
  201. package/src/utils/payload-loader.js +1 -1
  202. package/src/utils/processor-response.js +1 -1
  203. package/src/utils/rabbitmq.js +1 -1
  204. package/src/utils/redis-client.js +1 -1
  205. package/src/utils/redis-helper.js +1 -1
  206. package/src/utils/request-scope.js +1 -1
  207. package/src/utils/security-checks.js +1 -1
  208. package/src/utils/service-resolver.js +1 -1
  209. package/src/utils/shutdown-coordinator.js +1 -1
  210. package/src/utils/soft-delete-dashboard-guard.js +1 -1
  211. package/src/utils/sql-table-extractor.js +1 -1
  212. package/src/utils/trusted-keys.js +1 -1
  213. package/src/utils/upload-handler.js +1 -1
  214. package/src/utils/upsert-builder.js +1 -1
  215. 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 JSON dari schema database (introspeksi tabel)',
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: 'File config database (.env). Fallback ke `.restforge/defaults.json` bila tidak disediakan eksplisit (set via `config set-default`)'
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: 'Nama tabel spesifik yang akan di-generate payload-nya'
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 untuk file payload yang di-generate (default: payload/)'
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: 'Lokasi SDF (file atau folder) sumber metadata tabel (default: folder `schema`). WAJIB memuat tabel bila tabel memiliki kolom soft-delete (is_deleted/deleted_at/deleted_by): blok softDelete RDF diturunkan dari SDF (R12/R13). Diabaikan untuk tabel non-soft-delete.'
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 dari database ke file payload (update kolom, tipe, constraint)',
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: 'File config database (.env). Fallback ke `.restforge/defaults.json` bila tidak disediakan eksplisit (set via `config set-default`)'
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 hanya satu tabel spesifik (default: semua)'
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 konfigurasi JOIN dari foreign key: buat file SQL query/<table>-join.sql dan set datatablesQuery/viewQuery ke file tersebut. Opt-in; tanpa flag ini perilaku sync tidak berubah. Butuh --table. Bila --fk-columns tidak diisi, kolom display per FK dipilih otomatis (name/nama -> code/kode -> primary key)'
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: 'Opsional. Daftar kolom tabel referensi yang di-surface lewat JOIN. Setiap entri WAJIB berbentuk `table.column` (qualified), dipisah koma. Contoh: visitor_categories.category_code,visitor_categories.category_name. Bila dikosongkan, di-resolve otomatis per FK'
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 terhadap struktur tabel database (read-only)',
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: 'File config database (.env). Fallback ke `.restforge/defaults.json` bila tidak disediakan eksplisit (set via `config set-default`)'
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 hanya satu tabel spesifik (default: semua)'
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 dari payload JSON',
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: 'Nama project target'
866
+ description: 'Target project name'
867
867
  },
868
868
  name: {
869
869
  type: 'string',
870
870
  required: true,
871
- description: 'Nama processor (endpoint) yang akan dibuat'
871
+ description: 'Processor (endpoint) name to create'
872
872
  },
873
873
  payload: {
874
874
  type: 'string',
875
875
  required: true,
876
- description: 'Path atau nama file payload JSON'
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: 'Tipe database (postgres|mysql|oracle|sqlite). Default: postgres'
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: 'Timpa file existing (processor file di-archive sebelum overwrite)'
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: 'Lewati validasi keyword SQL'
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: 'Menampilkan daftar processor dari workbench metadata di working directory',
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: 'Format output: `text` (table human-readable) atau `json` (untuk AI agent / mcp-server)'
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 nama processor, case-insensitive. Wildcard `*` = karakter apa pun (mis. `*order*`); tanpa wildcard berarti exact match'
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: 'Menghapus project beserta seluruh endpoint, processor, dashboard, dan consumer di dalamnya',
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: 'Nama project yang akan dihapus'
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: 'Menampilkan daftar project yang terdaftar di registry',
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) terhadap database live menggunakan EXPLAIN (read-only, tidak mengeksekusi data modification)',
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: 'File config database (.env). Fallback ke `.restforge/defaults.json` bila tidak disediakan eksplisit (set via `config set-default`)'
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 untuk divalidasi (hanya SELECT atau WITH/CTE)'
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 dari SDF ke database via ALTER TABLE incremental (komplemen schema diff)',
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 atau folder schema (mis. ./schema atau ./schema/users.js)'
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: 'File config database (.env). Fallback ke `.restforge/defaults.json` bila tidak disediakan eksplisit (set via `config set-default`)'
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 hanya satu tabel spesifik (default: semua model di SDF)'
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 tanpa apply ke database'
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: izinkan DROP COLUMN/INDEX/UNIQUE constraint (destruktif data)'
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: izinkan ALTER COLUMN length/nullable (potential data loss)'
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.path;
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: 'Menampilkan detail struktur satu tabel: kolom, primary key, foreign keys, indexes',
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: 'File config database (.env). Fallback ke `.restforge/defaults.json` bila tidak disediakan eksplisit (set via `config set-default`)'
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: 'Nama tabel (unqualified atau qualified public.users)'
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: 'Sertakan informasi foreign key'
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: 'Sertakan informasi indexes'
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 JSON'
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 antara SDF dan struktur tabel database (read-only, bidirectional)',
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 atau folder schema (mis. ./schema atau ./schema/users.js)'
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: 'File config database (.env). Fallback ke `.restforge/defaults.json` bila tidak disediakan eksplisit (set via `config set-default`)'
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 hanya satu tabel spesifik (default: semua model di SDF)'
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 format JSON (default: human-readable plain)'
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.path;
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, opsional DROP) untuk seluruh schema models',
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 atau folder schema (mis. ./schema atau ./schema/users.js)'
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
- out: {
40
+ output: {
41
41
  type: 'string',
42
42
  required: false,
43
43
  default: null,
44
- description: 'File output untuk DDL hasil generate (default: stdout)'
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: 'Sertakan statement DROP TABLE sebelum CREATE'
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 --out=migration.sql',
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.path;
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.out) {
98
- const outPath = path.resolve(process.cwd(), args.out);
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) {