@onexapis/cli 1.0.1 → 1.0.3

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/README.md CHANGED
@@ -35,10 +35,10 @@ onex validate --theme simple
35
35
  onex build --theme simple
36
36
 
37
37
  # Upload to S3
38
- onex upload --theme simple --bucket my-bucket
38
+ onex upload --theme simple
39
39
 
40
40
  # Clone a theme from S3
41
- onex clone simple --bucket my-bucket
41
+ onex clone simple
42
42
  ```
43
43
 
44
44
  ## Commands
@@ -170,13 +170,16 @@ Upload compiled theme to S3 as `bundle.zip` + `source.zip`.
170
170
 
171
171
  ```bash
172
172
  # Dry run first
173
- onex upload --theme simple --bucket my-bucket --dry-run
173
+ onex upload --theme simple --dry-run
174
174
 
175
175
  # Upload to staging
176
- onex upload --theme simple --bucket my-bucket
176
+ onex upload --theme simple
177
177
 
178
178
  # Upload to production
179
- onex upload --theme simple --bucket my-bucket -e production
179
+ onex upload --theme simple -e production
180
+
181
+ # Override bucket
182
+ onex upload --theme simple --bucket custom-bucket
180
183
  ```
181
184
 
182
185
  ### `onex download`
@@ -204,20 +207,48 @@ Clone theme source code from S3.
204
207
  | `--no-install` | Skip running `pnpm install` after clone |
205
208
 
206
209
  ```bash
207
- onex clone simple --bucket my-bucket
210
+ onex clone simple
208
211
  onex clone simple -v 1.0.0 -o ./my-clone --no-install
209
212
  ```
210
213
 
211
214
  ## S3 Configuration
212
215
 
213
- The `upload`, `download`, and `clone` commands use S3 for storage. Configure via environment variables:
216
+ The `upload`, `download`, and `clone` commands use S3 for storage. The CLI automatically loads env files in this order (first found wins):
217
+
218
+ 1. **Project-level**: `.env.local` and `.env` at the project root
219
+ 2. **Global**: `~/.onex/.env` (works from any directory)
220
+
221
+ ### Project config (recommended for teams)
214
222
 
215
223
  ```bash
216
- # AWS (default)
224
+ # .env.local (at project root — shared with the team via .env.example)
225
+ BUCKET_NAME=my-bucket
217
226
  AWS_REGION=ap-southeast-1
218
- AWS_ACCESS_KEY_ID=...
219
- AWS_SECRET_ACCESS_KEY=...
227
+ AWS_ACCESS_KEY_ID=your-access-key
228
+ AWS_SECRET_ACCESS_KEY=your-secret-key
229
+ ```
230
+
231
+ ### Global config (for personal use / running outside a project)
232
+
233
+ ```bash
234
+ # ~/.onex/.env
235
+ BUCKET_NAME=my-bucket
236
+ AWS_REGION=ap-southeast-1
237
+ AWS_ACCESS_KEY_ID=your-access-key
238
+ AWS_SECRET_ACCESS_KEY=your-secret-key
239
+ ```
220
240
 
241
+ Then all S3 commands just work without extra flags:
242
+
243
+ ```bash
244
+ onex upload --theme simple # picks up config automatically
245
+ onex clone simple # works from any directory
246
+ onex download -t simple # same
247
+ ```
248
+
249
+ ### Adapter Modes
250
+
251
+ ```bash
221
252
  # MinIO (set ADAPTER_MODE=vps)
222
253
  ADAPTER_MODE=vps
223
254
  MINIO_ENDPOINT=localhost:9000
@@ -226,11 +257,15 @@ MINIO_SECRET_KEY=minioadmin
226
257
 
227
258
  # LocalStack (set ADAPTER_MODE=local)
228
259
  ADAPTER_MODE=local
229
-
230
- # Override bucket name directly
231
- BUCKET_NAME=my-bucket
232
260
  ```
233
261
 
262
+ ### Bucket Name Resolution
263
+
264
+ Priority order:
265
+ 1. `--bucket` CLI flag
266
+ 2. `BUCKET_NAME` environment variable
267
+ 3. Default: `onex-themes-staging` or `onex-themes-prod` (based on `--environment`)
268
+
234
269
  ## Theme Structure
235
270
 
236
271
  Themes live in the `themes/` directory at the project root:
package/dist/cli.js CHANGED
@@ -1,35 +1,37 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
3
 
4
- var commander = require('commander');
5
- var chalk4 = require('chalk');
6
4
  var path = require('path');
7
- var fs2 = require('fs');
8
- var child_process = require('child_process');
9
- var inquirer = require('inquirer');
10
- var ora = require('ora');
5
+ var os = require('os');
6
+ var dotenv = require('dotenv');
11
7
  var fs = require('fs-extra');
12
8
  var ejs = require('ejs');
9
+ var child_process = require('child_process');
10
+ var chalk4 = require('chalk');
11
+ var ora = require('ora');
12
+ var commander = require('commander');
13
+ var fs2 = require('fs');
14
+ var inquirer = require('inquirer');
13
15
  var archiver = require('archiver');
14
16
  var FormData = require('form-data');
15
17
  var fetch = require('node-fetch');
16
18
  var clientS3 = require('@aws-sdk/client-s3');
17
- var os = require('os');
18
19
  var AdmZip = require('adm-zip');
19
20
 
20
21
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
21
22
 
22
- var chalk4__default = /*#__PURE__*/_interopDefault(chalk4);
23
23
  var path__default = /*#__PURE__*/_interopDefault(path);
24
- var fs2__default = /*#__PURE__*/_interopDefault(fs2);
25
- var inquirer__default = /*#__PURE__*/_interopDefault(inquirer);
26
- var ora__default = /*#__PURE__*/_interopDefault(ora);
24
+ var os__default = /*#__PURE__*/_interopDefault(os);
25
+ var dotenv__default = /*#__PURE__*/_interopDefault(dotenv);
27
26
  var fs__default = /*#__PURE__*/_interopDefault(fs);
28
27
  var ejs__default = /*#__PURE__*/_interopDefault(ejs);
28
+ var chalk4__default = /*#__PURE__*/_interopDefault(chalk4);
29
+ var ora__default = /*#__PURE__*/_interopDefault(ora);
30
+ var fs2__default = /*#__PURE__*/_interopDefault(fs2);
31
+ var inquirer__default = /*#__PURE__*/_interopDefault(inquirer);
29
32
  var archiver__default = /*#__PURE__*/_interopDefault(archiver);
30
33
  var FormData__default = /*#__PURE__*/_interopDefault(FormData);
31
34
  var fetch__default = /*#__PURE__*/_interopDefault(fetch);
32
- var os__default = /*#__PURE__*/_interopDefault(os);
33
35
  var AdmZip__default = /*#__PURE__*/_interopDefault(AdmZip);
34
36
 
35
37
  var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
@@ -86,34 +88,7 @@ var Logger = class {
86
88
  };
87
89
  var logger = new Logger();
88
90
 
89
- // src/utils/validators.ts
90
- function validateName(name) {
91
- return /^[a-z0-9]+(-[a-z0-9]+)*$/.test(name);
92
- }
93
- function toKebabCase(str) {
94
- return str.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[\s_]+/g, "-").toLowerCase();
95
- }
96
- function toPascalCase(str) {
97
- return str.split(/[-_\s]+/).map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join("");
98
- }
99
- function validateThemeName(name) {
100
- return /^[a-z][a-z0-9-]*$/.test(name);
101
- }
102
- function getValidCategories() {
103
- return [
104
- "headers",
105
- "heroes",
106
- "content",
107
- "features",
108
- "testimonials",
109
- "galleries",
110
- "cta",
111
- "footers",
112
- "ecommerce",
113
- "blog",
114
- "contact"
115
- ];
116
- }
91
+ // src/utils/file-helpers.ts
117
92
  async function renderTemplate(templatePath, data) {
118
93
  const template = await fs__default.default.readFile(templatePath, "utf-8");
119
94
  return ejs__default.default.render(template, data);
@@ -260,6 +235,35 @@ async function installDependencies(projectPath, packageManager = "npm") {
260
235
  });
261
236
  }
262
237
 
238
+ // src/utils/validators.ts
239
+ function validateName(name) {
240
+ return /^[a-z0-9]+(-[a-z0-9]+)*$/.test(name);
241
+ }
242
+ function toKebabCase(str) {
243
+ return str.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[\s_]+/g, "-").toLowerCase();
244
+ }
245
+ function toPascalCase(str) {
246
+ return str.split(/[-_\s]+/).map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join("");
247
+ }
248
+ function validateThemeName(name) {
249
+ return /^[a-z][a-z0-9-]*$/.test(name);
250
+ }
251
+ function getValidCategories() {
252
+ return [
253
+ "headers",
254
+ "heroes",
255
+ "content",
256
+ "features",
257
+ "testimonials",
258
+ "galleries",
259
+ "cta",
260
+ "footers",
261
+ "ecommerce",
262
+ "blog",
263
+ "contact"
264
+ ];
265
+ }
266
+
263
267
  // src/commands/init.ts
264
268
  async function initCommand(projectName, options = {}) {
265
269
  logger.header("Create New OneX Theme Project");
@@ -2689,6 +2693,10 @@ async function cloneCommand(themeName, options) {
2689
2693
  }
2690
2694
 
2691
2695
  // src/cli.ts
2696
+ var projectRoot = getProjectRoot();
2697
+ dotenv__default.default.config({ path: path__default.default.join(projectRoot, ".env.local"), quiet: true });
2698
+ dotenv__default.default.config({ path: path__default.default.join(projectRoot, ".env"), quiet: true });
2699
+ dotenv__default.default.config({ path: path__default.default.join(os__default.default.homedir(), ".onex", ".env"), quiet: true });
2692
2700
  var program = new commander.Command();
2693
2701
  program.name("onex").description("CLI tool for OneX theme development").version("0.1.0");
2694
2702
  program.command("init").description("Create a new OneX theme project").argument("[project-name]", "Name of the project").option(