@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 +48 -13
- package/dist/cli.js +48 -40
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +42 -35
- package/dist/cli.mjs.map +1 -1
- package/package.json +2 -1
- package/templates/default/package.json.ejs +1 -1
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
|
|
38
|
+
onex upload --theme simple
|
|
39
39
|
|
|
40
40
|
# Clone a theme from S3
|
|
41
|
-
onex clone simple
|
|
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 --
|
|
173
|
+
onex upload --theme simple --dry-run
|
|
174
174
|
|
|
175
175
|
# Upload to staging
|
|
176
|
-
onex upload --theme simple
|
|
176
|
+
onex upload --theme simple
|
|
177
177
|
|
|
178
178
|
# Upload to production
|
|
179
|
-
onex upload --theme simple
|
|
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
|
|
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.
|
|
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
|
-
#
|
|
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
|
|
8
|
-
var
|
|
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
|
|
25
|
-
var
|
|
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/
|
|
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(
|