@ketrics/ketrics-cli 0.1.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 (91) hide show
  1. package/README.md +326 -0
  2. package/dist/bin/ketrics.d.ts +8 -0
  3. package/dist/bin/ketrics.d.ts.map +1 -0
  4. package/dist/bin/ketrics.js +12 -0
  5. package/dist/bin/ketrics.js.map +1 -0
  6. package/dist/src/cli.d.ts +11 -0
  7. package/dist/src/cli.d.ts.map +1 -0
  8. package/dist/src/cli.js +77 -0
  9. package/dist/src/cli.js.map +1 -0
  10. package/dist/src/commands/build.d.ts +10 -0
  11. package/dist/src/commands/build.d.ts.map +1 -0
  12. package/dist/src/commands/build.js +35 -0
  13. package/dist/src/commands/build.js.map +1 -0
  14. package/dist/src/commands/create.d.ts +11 -0
  15. package/dist/src/commands/create.d.ts.map +1 -0
  16. package/dist/src/commands/create.js +170 -0
  17. package/dist/src/commands/create.js.map +1 -0
  18. package/dist/src/commands/deploy.d.ts +11 -0
  19. package/dist/src/commands/deploy.d.ts.map +1 -0
  20. package/dist/src/commands/deploy.js +105 -0
  21. package/dist/src/commands/deploy.js.map +1 -0
  22. package/dist/src/commands/run.d.ts +11 -0
  23. package/dist/src/commands/run.d.ts.map +1 -0
  24. package/dist/src/commands/run.js +236 -0
  25. package/dist/src/commands/run.js.map +1 -0
  26. package/dist/src/commands/validate.d.ts +10 -0
  27. package/dist/src/commands/validate.d.ts.map +1 -0
  28. package/dist/src/commands/validate.js +46 -0
  29. package/dist/src/commands/validate.js.map +1 -0
  30. package/dist/src/index.d.ts +13 -0
  31. package/dist/src/index.d.ts.map +1 -0
  32. package/dist/src/index.js +29 -0
  33. package/dist/src/index.js.map +1 -0
  34. package/dist/src/services/api-client.d.ts +14 -0
  35. package/dist/src/services/api-client.d.ts.map +1 -0
  36. package/dist/src/services/api-client.js +57 -0
  37. package/dist/src/services/api-client.js.map +1 -0
  38. package/dist/src/services/build-service.d.ts +40 -0
  39. package/dist/src/services/build-service.d.ts.map +1 -0
  40. package/dist/src/services/build-service.js +130 -0
  41. package/dist/src/services/build-service.js.map +1 -0
  42. package/dist/src/services/config-service.d.ts +35 -0
  43. package/dist/src/services/config-service.d.ts.map +1 -0
  44. package/dist/src/services/config-service.js +204 -0
  45. package/dist/src/services/config-service.js.map +1 -0
  46. package/dist/src/services/template-service.d.ts +51 -0
  47. package/dist/src/services/template-service.d.ts.map +1 -0
  48. package/dist/src/services/template-service.js +214 -0
  49. package/dist/src/services/template-service.js.map +1 -0
  50. package/dist/src/services/upload-service.d.ts +13 -0
  51. package/dist/src/services/upload-service.d.ts.map +1 -0
  52. package/dist/src/services/upload-service.js +54 -0
  53. package/dist/src/services/upload-service.js.map +1 -0
  54. package/dist/src/services/zip-service.d.ts +55 -0
  55. package/dist/src/services/zip-service.d.ts.map +1 -0
  56. package/dist/src/services/zip-service.js +219 -0
  57. package/dist/src/services/zip-service.js.map +1 -0
  58. package/dist/src/types/index.d.ts +188 -0
  59. package/dist/src/types/index.d.ts.map +1 -0
  60. package/dist/src/types/index.js +50 -0
  61. package/dist/src/types/index.js.map +1 -0
  62. package/dist/src/utils/logger.d.ts +52 -0
  63. package/dist/src/utils/logger.d.ts.map +1 -0
  64. package/dist/src/utils/logger.js +95 -0
  65. package/dist/src/utils/logger.js.map +1 -0
  66. package/dist/src/utils/spinner.d.ts +15 -0
  67. package/dist/src/utils/spinner.d.ts.map +1 -0
  68. package/dist/src/utils/spinner.js +38 -0
  69. package/dist/src/utils/spinner.js.map +1 -0
  70. package/package.json +47 -0
  71. package/templates/ketrics-app-v1/.env.example +17 -0
  72. package/templates/ketrics-app-v1/README.md +134 -0
  73. package/templates/ketrics-app-v1/backend/package-lock.json +716 -0
  74. package/templates/ketrics-app-v1/backend/package.json +18 -0
  75. package/templates/ketrics-app-v1/backend/src/index.ts +41 -0
  76. package/templates/ketrics-app-v1/backend/src/volume.ts +48 -0
  77. package/templates/ketrics-app-v1/backend/tsconfig.json +16 -0
  78. package/templates/ketrics-app-v1/frontend/index.html +13 -0
  79. package/templates/ketrics-app-v1/frontend/package-lock.json +1981 -0
  80. package/templates/ketrics-app-v1/frontend/package.json +24 -0
  81. package/templates/ketrics-app-v1/frontend/src/App.css +121 -0
  82. package/templates/ketrics-app-v1/frontend/src/App.tsx +109 -0
  83. package/templates/ketrics-app-v1/frontend/src/main.tsx +10 -0
  84. package/templates/ketrics-app-v1/frontend/src/services/index.ts +55 -0
  85. package/templates/ketrics-app-v1/frontend/tsconfig.json +21 -0
  86. package/templates/ketrics-app-v1/frontend/tsconfig.node.json +11 -0
  87. package/templates/ketrics-app-v1/frontend/vite.config.ts +11 -0
  88. package/templates/ketrics-app-v1/ketrics.config.json +10 -0
  89. package/templates/ketrics-app-v1/tests/test.echo.json +13 -0
  90. package/templates/ketrics-app-v1/tests/test.greet.json +11 -0
  91. package/templates/ketrics-app-v1/tests/test.info.json +9 -0
package/README.md ADDED
@@ -0,0 +1,326 @@
1
+ # Ketrics CLI
2
+
3
+ CLI tool for deploying applications to the Ketrics platform.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ # Install globally
9
+ npm install -g ketrics-cli
10
+
11
+ # Or use npx
12
+ npx ketrics-cli deploy
13
+
14
+ # Or link locally for development
15
+ cd ketrics-cli
16
+ npm install
17
+ npm run build
18
+ npm link
19
+ ```
20
+
21
+ ## Quick Start
22
+
23
+ 1. **Create a new application from template:**
24
+
25
+ ```bash
26
+ ketrics create my-app
27
+ ```
28
+
29
+ This will:
30
+ - Create a new folder `my-app/`
31
+ - Let you choose a template interactively
32
+ - Copy template files to the folder
33
+ - Update app name in configuration files
34
+
35
+ 2. **Install dependencies:**
36
+
37
+ ```bash
38
+ cd my-app
39
+ cd frontend && npm install
40
+ cd ../backend && npm install
41
+ ```
42
+
43
+ 3. **Configure credentials** (copy `.env.example` to `.env`):
44
+
45
+ ```bash
46
+ KETRICS_TOKEN=ktd_your-token-id_your-secret-key
47
+ KETRICS_API_URL=https://api.ketrics.cl/api/v1
48
+ KETRICS_TENANT_ID=your-tenant-uuid
49
+ KETRICS_APPLICATION_ID=your-application-uuid
50
+ ```
51
+
52
+ 4. **Deploy:**
53
+ ```bash
54
+ ketrics deploy
55
+ ```
56
+
57
+ The CLI will:
58
+ - Build frontend (npm run build)
59
+ - Build backend (npm run build)
60
+ - Create ZIP with both builds
61
+ - Upload to Ketrics platform
62
+
63
+ ## Commands
64
+
65
+ ### `ketrics create <app-name>`
66
+
67
+ Create a new Ketrics application from a template.
68
+
69
+ ```bash
70
+ ketrics create my-app # Interactive template selection
71
+ ketrics create my-app --template <name> # Use specific template
72
+ ```
73
+
74
+ **What it does:**
75
+ 1. Creates a folder with the provided app name (fails if folder exists)
76
+ 2. Prompts for template selection (or uses `--template` flag)
77
+ 3. Copies template files to the new folder
78
+ 4. Updates app name in:
79
+ - `ketrics.config.json`
80
+ - `frontend/package.json`
81
+ - `backend/package.json`
82
+
83
+ ### `ketrics build`
84
+
85
+ Build frontend and backend without deploying.
86
+
87
+ ```bash
88
+ ketrics build
89
+ ```
90
+
91
+ **What it does:**
92
+ 1. Runs `npm run build` in `frontend/`
93
+ 2. Runs `npm run build` in `backend/`
94
+ 3. Outputs the location of built files
95
+
96
+ ### `ketrics deploy`
97
+
98
+ Build and deploy frontend/backend to Ketrics.
99
+
100
+ ```bash
101
+ ketrics deploy # Build and deploy
102
+ ketrics deploy --env <path> # Use specific .env file
103
+ ketrics deploy --dry-run # Build and show what would be deployed
104
+ ```
105
+
106
+ **What it does:**
107
+ 1. Validates `.env` configuration
108
+ 2. Builds `frontend/` (runs `npm run build`)
109
+ 3. Builds `backend/` (runs `npm run build`)
110
+ 4. Creates ZIP with flat structure:
111
+ - `frontend/` - contents of `frontend/dist/`
112
+ - `backend/` - contents of `backend/dist/`
113
+ 5. Uploads to S3 via presigned URL
114
+
115
+ ### `ketrics validate`
116
+
117
+ Validate configuration and `.env` files.
118
+
119
+ ```bash
120
+ ketrics validate # Validate default files
121
+ ketrics validate --env <path> # Validate specific .env
122
+ ```
123
+
124
+ ### `ketrics --version`
125
+
126
+ Show CLI version.
127
+
128
+ ### `ketrics --help`
129
+
130
+ Show help information.
131
+
132
+ ## Project Structure
133
+
134
+ After running `ketrics create my-app`, your project will have:
135
+
136
+ ```
137
+ my-app/
138
+ ├── .env.example # Environment variables template
139
+ ├── .gitignore # Git ignore file
140
+ ├── ketrics.config.json # Application configuration
141
+ ├── README.md # Documentation
142
+ ├── frontend/ # React + TypeScript + Vite
143
+ │ ├── src/
144
+ │ ├── package.json
145
+ │ └── vite.config.ts
146
+ └── backend/ # TypeScript handlers
147
+ ├── src/
148
+ ├── package.json
149
+ └── tsconfig.json
150
+ ```
151
+
152
+ ## Configuration
153
+
154
+ ### `ketrics.config.json`
155
+
156
+ | Field | Type | Required | Description |
157
+ | ------------- | -------- | -------- | ---------------------------------------- |
158
+ | `name` | string | Yes | Application name |
159
+ | `version` | string | Yes | Semver version (e.g., "1.0.0") |
160
+ | `description` | string | No | Application description |
161
+ | `runtime` | string | Yes | Runtime: "nodejs18", "nodejs20", "static"|
162
+ | `actions` | string[] | Yes | List of exported backend actions |
163
+ | `entry` | string | Yes | Backend entry point file |
164
+ | `include` | string[] | Yes | Glob patterns for files to include |
165
+ | `exclude` | string[] | No | Glob patterns for files to exclude |
166
+
167
+ ### Environment Variables
168
+
169
+ | Variable | Required | Description |
170
+ | ------------------------ | -------- | -------------------------------- |
171
+ | `KETRICS_TOKEN` | Yes | Deployment token from dashboard |
172
+ | `KETRICS_API_URL` | Yes | Ketrics API URL |
173
+ | `KETRICS_TENANT_ID` | Yes | Your tenant UUID |
174
+ | `KETRICS_APPLICATION_ID` | Yes | Application UUID |
175
+
176
+ ## Deployment Flow
177
+
178
+ 1. Load `.env` file and validate Ketrics variables
179
+ 2. Build frontend using `npm run build`
180
+ 3. Build backend using `npm run build`
181
+ 4. Create ZIP with `frontend/` and `backend/` folders
182
+ 5. Request presigned URL from Ketrics API
183
+ 6. Upload ZIP to S3 via presigned URL
184
+ 7. Display deployment success with deployment ID
185
+
186
+ ## Example Output
187
+
188
+ ### Create Command
189
+
190
+ ```
191
+ $ ketrics create my-app
192
+
193
+ Available Templates
194
+
195
+ 1. ketrics-app-v1
196
+ My Ketrics application
197
+
198
+ Select a template (enter number): 1
199
+
200
+ Creating 'my-app' with template: ketrics-app-v1
201
+
202
+ Files to create:
203
+ my-app/.env.example
204
+ my-app/.gitignore
205
+ my-app/README.md
206
+ my-app/ketrics.config.json
207
+ my-app/backend/package.json
208
+ my-app/backend/src/index.ts
209
+ ...
210
+
211
+ ✔ Created 'my-app' successfully!
212
+
213
+ Next steps:
214
+ 1. cd my-app
215
+ 2. cd frontend && npm install
216
+ 3. cd ../backend && npm install
217
+ 4. Copy .env.example to .env and add your credentials
218
+ 5. Run 'ketrics deploy' to deploy your application
219
+ ```
220
+
221
+ ### Build Command
222
+
223
+ ```
224
+ $ ketrics build
225
+
226
+ Ketrics CLI v1.0.0 - Build
227
+
228
+ ℹ Building frontend and backend...
229
+
230
+ > frontend build output...
231
+ > backend build output...
232
+
233
+ ✔ Build completed successfully!
234
+
235
+ Frontend dist: /path/to/frontend/dist
236
+ Backend dist: /path/to/backend/dist
237
+ ```
238
+
239
+ ### Deploy Command
240
+
241
+ ```
242
+ $ ketrics deploy
243
+
244
+ Ketrics CLI v1.0.0
245
+
246
+ ✔ Loaded environment configuration
247
+ ✔ Validated deployment token
248
+
249
+ Building frontend and backend...
250
+
251
+ > frontend build output...
252
+ > backend build output...
253
+
254
+ ✔ Frontend and backend built successfully
255
+ ✔ Created deployment ZIP archive
256
+ ✔ ZIP archive: 59.9 KB from 5 files
257
+ ✔ Initiated deployment
258
+ ✔ Uploaded to S3
259
+
260
+ Deployment successful!
261
+
262
+ Deployment ID: 550e8400-e29b-41d4-a716-446655440002
263
+ Files: 5
264
+ Size: 59.9 KB
265
+ Duration: 3.2s
266
+
267
+ Your deployment is being processed by Ketrics.
268
+ ```
269
+
270
+ ### Dry Run
271
+
272
+ ```
273
+ $ ketrics deploy --dry-run
274
+
275
+ Ketrics CLI v1.0.0
276
+
277
+ ✔ Loaded environment configuration
278
+ ✔ Validated deployment token
279
+
280
+ Building frontend and backend...
281
+ ✔ Frontend and backend built successfully
282
+
283
+ Dry run - no files were uploaded
284
+
285
+ Files to deploy:
286
+ frontend/
287
+ assets/index-xxx.js (192.8 KB)
288
+ assets/index-xxx.css (1.4 KB)
289
+ index.html (471 B)
290
+
291
+ backend/
292
+ index.d.ts (1.2 KB)
293
+ index.js (3.4 KB)
294
+
295
+ Total files: 5
296
+ Frontend files: 3
297
+ Backend files: 2
298
+ Source size: 199.3 KB
299
+ ZIP size: 59.9 KB
300
+ ```
301
+
302
+ ## Error Handling
303
+
304
+ ### Missing node_modules
305
+
306
+ ```
307
+ ✖ Missing node_modules in frontend/. Run 'cd frontend && npm install' first.
308
+ ```
309
+
310
+ ### Folder already exists
311
+
312
+ ```
313
+ $ ketrics create my-app
314
+ ✖ Folder 'my-app' already exists.
315
+ ```
316
+
317
+ ### Invalid app name
318
+
319
+ ```
320
+ $ ketrics create 123-invalid
321
+ ✖ App name must start with a letter and contain only letters, numbers, hyphens, and underscores
322
+ ```
323
+
324
+ ## License
325
+
326
+ MIT
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Ketrics CLI Entry Point
4
+ *
5
+ * Main executable for the Ketrics CLI tool.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=ketrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ketrics.d.ts","sourceRoot":"","sources":["../../bin/ketrics.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Ketrics CLI Entry Point
5
+ *
6
+ * Main executable for the Ketrics CLI tool.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const cli_1 = require("../src/cli");
10
+ const program = (0, cli_1.createCLI)();
11
+ program.parse(process.argv);
12
+ //# sourceMappingURL=ketrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ketrics.js","sourceRoot":"","sources":["../../bin/ketrics.ts"],"names":[],"mappings":";;AACA;;;;GAIG;;AAEH,oCAAuC;AAEvC,MAAM,OAAO,GAAG,IAAA,eAAS,GAAE,CAAC;AAC5B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Ketrics CLI
3
+ *
4
+ * Command-line interface setup using Commander.js.
5
+ */
6
+ import { Command } from 'commander';
7
+ /**
8
+ * Create and configure CLI program
9
+ */
10
+ export declare function createCLI(): Command;
11
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAgEnC"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ /**
3
+ * Ketrics CLI
4
+ *
5
+ * Command-line interface setup using Commander.js.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.createCLI = createCLI;
9
+ const commander_1 = require("commander");
10
+ const create_1 = require("./commands/create");
11
+ const build_1 = require("./commands/build");
12
+ const deploy_1 = require("./commands/deploy");
13
+ const validate_1 = require("./commands/validate");
14
+ const run_1 = require("./commands/run");
15
+ const VERSION = '1.0.0';
16
+ /**
17
+ * Create and configure CLI program
18
+ */
19
+ function createCLI() {
20
+ const program = new commander_1.Command();
21
+ program
22
+ .name('ketrics')
23
+ .description('CLI tool for deploying applications to Ketrics platform')
24
+ .version(VERSION, '-v, --version', 'Show CLI version');
25
+ // Create command
26
+ program
27
+ .command('create <app-name>')
28
+ .description('Create a new Ketrics application from a template')
29
+ .option('-t, --template <name>', 'Use specific template (skip interactive selection)')
30
+ .action(async (appName, options) => {
31
+ await (0, create_1.createCommand)(appName, {
32
+ template: options.template,
33
+ });
34
+ });
35
+ // Build command
36
+ program
37
+ .command('build')
38
+ .description('Build frontend and backend without deploying')
39
+ .action(async () => {
40
+ await (0, build_1.buildCommand)();
41
+ });
42
+ // Deploy command
43
+ program
44
+ .command('deploy')
45
+ .description('Build and deploy frontend/backend to Ketrics')
46
+ .option('-e, --env <path>', 'Path to .env file')
47
+ .option('--dry-run', 'Build and show what would be deployed without uploading')
48
+ .action(async (options) => {
49
+ await (0, deploy_1.deployCommand)({
50
+ env: options.env,
51
+ dryRun: options.dryRun,
52
+ });
53
+ });
54
+ // Validate command
55
+ program
56
+ .command('validate')
57
+ .description('Validate configuration and .env files')
58
+ .option('-c, --config <path>', 'Path to ketrics.config.json')
59
+ .option('-e, --env <path>', 'Path to .env file')
60
+ .action(async (options) => {
61
+ await (0, validate_1.validateCommand)(options.config, options.env);
62
+ });
63
+ // Run command
64
+ program
65
+ .command('run <json-file>')
66
+ .description('Execute an API request from a JSON configuration file')
67
+ .option('-e, --env <path>', 'Path to .env file')
68
+ .option('-v, --verbose', 'Show detailed request/response information')
69
+ .action(async (jsonFile, options) => {
70
+ await (0, run_1.runCommand)(jsonFile, {
71
+ env: options.env,
72
+ verbose: options.verbose,
73
+ });
74
+ });
75
+ return program;
76
+ }
77
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAcH,8BAgEC;AA5ED,yCAAoC;AACpC,8CAAkD;AAClD,4CAAgD;AAChD,8CAAkD;AAClD,kDAAsD;AACtD,wCAA4C;AAE5C,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB;;GAEG;AACH,SAAgB,SAAS;IACvB,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CAAC,yDAAyD,CAAC;SACtE,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,kBAAkB,CAAC,CAAC;IAEzD,iBAAiB;IACjB,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,uBAAuB,EAAE,oDAAoD,CAAC;SACrF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QACjC,MAAM,IAAA,sBAAa,EAAC,OAAO,EAAE;YAC3B,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,gBAAgB;IAChB,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,IAAA,oBAAY,GAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEL,iBAAiB;IACjB,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;SAC/C,MAAM,CAAC,WAAW,EAAE,yDAAyD,CAAC;SAC9E,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,IAAA,sBAAa,EAAC;YAClB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,mBAAmB;IACnB,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,qBAAqB,EAAE,6BAA6B,CAAC;SAC5D,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;SAC/C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,IAAA,0BAAe,EAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEL,cAAc;IACd,OAAO;SACJ,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,uDAAuD,CAAC;SACpE,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;SAC/C,MAAM,CAAC,eAAe,EAAE,4CAA4C,CAAC;SACrE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;QAClC,MAAM,IAAA,gBAAU,EAAC,QAAQ,EAAE;YACzB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Build Command
3
+ *
4
+ * Builds frontend and backend without deploying.
5
+ */
6
+ /**
7
+ * Execute build command
8
+ */
9
+ export declare function buildCommand(): Promise<void>;
10
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/commands/build.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBlD"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ /**
3
+ * Build Command
4
+ *
5
+ * Builds frontend and backend without deploying.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.buildCommand = buildCommand;
9
+ const logger_1 = require("../utils/logger");
10
+ const build_service_1 = require("../services/build-service");
11
+ /**
12
+ * Execute build command
13
+ */
14
+ async function buildCommand() {
15
+ const cwd = process.cwd();
16
+ logger_1.logger.header('Ketrics CLI v1.0.0 - Build');
17
+ try {
18
+ // Build frontend and backend
19
+ logger_1.logger.info('Building frontend and backend...');
20
+ logger_1.logger.newline();
21
+ const buildResult = (0, build_service_1.buildAll)(cwd);
22
+ logger_1.logger.newline();
23
+ logger_1.logger.success('Build completed successfully!');
24
+ logger_1.logger.newline();
25
+ logger_1.logger.keyValue('Frontend dist', buildResult.frontendDistPath);
26
+ logger_1.logger.keyValue('Backend dist', buildResult.backendDistPath);
27
+ logger_1.logger.newline();
28
+ }
29
+ catch (error) {
30
+ logger_1.logger.newline();
31
+ logger_1.logger.error(error.message);
32
+ process.exit(1);
33
+ }
34
+ }
35
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/commands/build.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAQH,oCAuBC;AA7BD,4CAAyC;AACzC,6DAAqD;AAErD;;GAEG;AACI,KAAK,UAAU,YAAY;IAChC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,eAAM,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC;IAE5C,IAAI,CAAC;QACH,6BAA6B;QAC7B,eAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAChD,eAAM,CAAC,OAAO,EAAE,CAAC;QAEjB,MAAM,WAAW,GAAG,IAAA,wBAAQ,EAAC,GAAG,CAAC,CAAC;QAElC,eAAM,CAAC,OAAO,EAAE,CAAC;QACjB,eAAM,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;QAChD,eAAM,CAAC,OAAO,EAAE,CAAC;QACjB,eAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAC/D,eAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,eAAe,CAAC,CAAC;QAC7D,eAAM,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,OAAO,EAAE,CAAC;QACjB,eAAM,CAAC,KAAK,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Create Command
3
+ *
4
+ * Creates a new Ketrics application from a template.
5
+ */
6
+ import type { CreateOptions } from '../types';
7
+ /**
8
+ * Execute create command
9
+ */
10
+ export declare function createCommand(appName: string, options: CreateOptions): Promise<void>;
11
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/create.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,UAAU,CAAC;AAsC5D;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CAiGf"}
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ /**
3
+ * Create Command
4
+ *
5
+ * Creates a new Ketrics application from a template.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.createCommand = createCommand;
42
+ const path = __importStar(require("path"));
43
+ const prompts_1 = require("@inquirer/prompts");
44
+ const logger_1 = require("../utils/logger");
45
+ const template_service_1 = require("../services/template-service");
46
+ /**
47
+ * Prompt user to select a template interactively using arrow keys
48
+ */
49
+ async function promptTemplateSelection(templates) {
50
+ const choices = templates.map((template) => ({
51
+ name: `${template.name}: ${template.description}`,
52
+ value: template,
53
+ }));
54
+ const selected = await (0, prompts_1.select)({
55
+ message: 'Select a template:',
56
+ choices,
57
+ });
58
+ return selected;
59
+ }
60
+ /**
61
+ * Validate app name
62
+ */
63
+ function validateAppName(name) {
64
+ if (!name || name.trim().length === 0) {
65
+ return { valid: false, error: 'App name is required' };
66
+ }
67
+ // Check for valid characters (alphanumeric, hyphens, underscores)
68
+ if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(name)) {
69
+ return {
70
+ valid: false,
71
+ error: 'App name must start with a letter and contain only letters, numbers, hyphens, and underscores',
72
+ };
73
+ }
74
+ return { valid: true };
75
+ }
76
+ /**
77
+ * Execute create command
78
+ */
79
+ async function createCommand(appName, options) {
80
+ // Validate app name
81
+ const nameValidation = validateAppName(appName);
82
+ if (!nameValidation.valid) {
83
+ logger_1.logger.error(nameValidation.error);
84
+ process.exit(1);
85
+ }
86
+ // Get available templates
87
+ const templates = (0, template_service_1.getAvailableTemplates)();
88
+ if (templates.length === 0) {
89
+ logger_1.logger.error('No templates available. Please check the templates directory.');
90
+ process.exit(1);
91
+ }
92
+ // Calculate destination path
93
+ const destDir = path.join(process.cwd(), appName);
94
+ // Check if folder already exists
95
+ if ((0, template_service_1.directoryExists)(destDir)) {
96
+ logger_1.logger.error(`Folder '${appName}' already exists.`);
97
+ process.exit(1);
98
+ }
99
+ // Select template
100
+ let selectedTemplate;
101
+ if (options.template) {
102
+ // Use specified template
103
+ const template = (0, template_service_1.getTemplate)(options.template);
104
+ if (!template) {
105
+ logger_1.logger.error(`Template not found: ${options.template}`);
106
+ logger_1.logger.newline();
107
+ logger_1.logger.info('Available templates:');
108
+ templates.forEach((t) => logger_1.logger.indent(`- ${t.name}`));
109
+ process.exit(1);
110
+ }
111
+ selectedTemplate = template;
112
+ }
113
+ else if (templates.length === 1) {
114
+ // Auto-select if only one template
115
+ selectedTemplate = templates[0];
116
+ }
117
+ else {
118
+ // Interactive selection
119
+ try {
120
+ selectedTemplate = await promptTemplateSelection(templates);
121
+ }
122
+ catch (error) {
123
+ logger_1.logger.error(error.message);
124
+ process.exit(1);
125
+ }
126
+ }
127
+ // Show what will be created
128
+ logger_1.logger.newline();
129
+ logger_1.logger.info(`Creating '${appName}' with template: ${selectedTemplate.name}`);
130
+ logger_1.logger.newline();
131
+ const files = (0, template_service_1.getTemplateFiles)(selectedTemplate);
132
+ logger_1.logger.log('Files to create:');
133
+ files.forEach((file) => logger_1.logger.file(`${appName}/${file}`));
134
+ logger_1.logger.newline();
135
+ // Create directory
136
+ try {
137
+ (0, template_service_1.createDirectory)(destDir);
138
+ }
139
+ catch (error) {
140
+ logger_1.logger.error(`Failed to create directory: ${error.message}`);
141
+ process.exit(1);
142
+ }
143
+ // Copy template
144
+ try {
145
+ (0, template_service_1.copyTemplate)(selectedTemplate, destDir);
146
+ }
147
+ catch (error) {
148
+ logger_1.logger.error(`Failed to copy template: ${error.message}`);
149
+ process.exit(1);
150
+ }
151
+ // Update app name in files
152
+ try {
153
+ (0, template_service_1.updateAppName)(destDir, appName);
154
+ }
155
+ catch (error) {
156
+ logger_1.logger.error(`Failed to update app name: ${error.message}`);
157
+ process.exit(1);
158
+ }
159
+ logger_1.logger.success(`Created '${appName}' successfully!`);
160
+ // Show next steps
161
+ logger_1.logger.newline();
162
+ logger_1.logger.log('Next steps:');
163
+ logger_1.logger.indent(`1. cd ${appName}`);
164
+ logger_1.logger.indent('2. cd frontend && npm install');
165
+ logger_1.logger.indent('3. cd ../backend && npm install');
166
+ logger_1.logger.indent('4. Copy .env.example to .env and add your credentials');
167
+ logger_1.logger.indent("5. Run 'ketrics deploy' to deploy your application");
168
+ logger_1.logger.newline();
169
+ }
170
+ //# sourceMappingURL=create.js.map