shopq 0.3.7 → 0.3.9
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/dist/cli.js +247 -0
- package/dist/shopq.js +8 -6
- package/package.json +2 -2
package/dist/cli.js
ADDED
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/cli.ts
|
|
3
|
+
import { readFileSync } from "fs";
|
|
4
|
+
|
|
5
|
+
// src/registry.ts
|
|
6
|
+
var resources = new Map;
|
|
7
|
+
function getResource(name) {
|
|
8
|
+
return resources.get(name);
|
|
9
|
+
}
|
|
10
|
+
function getAllResources() {
|
|
11
|
+
return resources;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// src/help.ts
|
|
15
|
+
function topLevelHelp() {
|
|
16
|
+
const lines = [
|
|
17
|
+
"Usage: shopq <resource> <verb> [args] [flags]",
|
|
18
|
+
"",
|
|
19
|
+
"Global Flags:",
|
|
20
|
+
" --json, -j Output as JSON",
|
|
21
|
+
" --help, -h Show help",
|
|
22
|
+
" --version, -v Print version",
|
|
23
|
+
" --store <url> Store override",
|
|
24
|
+
" --no-color Disable colored output (also respects NO_COLOR env)",
|
|
25
|
+
""
|
|
26
|
+
];
|
|
27
|
+
const resources2 = getAllResources();
|
|
28
|
+
if (resources2.size > 0) {
|
|
29
|
+
lines.push("Resources:");
|
|
30
|
+
for (const [name, res] of resources2) {
|
|
31
|
+
lines.push(` ${name.padEnd(16)} ${res.description}`);
|
|
32
|
+
}
|
|
33
|
+
lines.push("");
|
|
34
|
+
}
|
|
35
|
+
return lines.join(`
|
|
36
|
+
`);
|
|
37
|
+
}
|
|
38
|
+
function resourceHelp(resourceName) {
|
|
39
|
+
const resource = getResource(resourceName);
|
|
40
|
+
if (!resource)
|
|
41
|
+
return;
|
|
42
|
+
const lines = [
|
|
43
|
+
`Usage: shopq ${resourceName} <verb> [args] [flags]`,
|
|
44
|
+
"",
|
|
45
|
+
`${resource.description}`,
|
|
46
|
+
"",
|
|
47
|
+
"Verbs:"
|
|
48
|
+
];
|
|
49
|
+
for (const [verb, cmd] of resource.verbs) {
|
|
50
|
+
lines.push(` ${verb.padEnd(16)} ${cmd.description}`);
|
|
51
|
+
}
|
|
52
|
+
lines.push("");
|
|
53
|
+
return lines.join(`
|
|
54
|
+
`);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// src/parse.ts
|
|
58
|
+
function parseArgs(argv) {
|
|
59
|
+
const flags = {
|
|
60
|
+
json: false,
|
|
61
|
+
help: false,
|
|
62
|
+
version: false,
|
|
63
|
+
noColor: "NO_COLOR" in process.env
|
|
64
|
+
};
|
|
65
|
+
const positional = [];
|
|
66
|
+
let i = 0;
|
|
67
|
+
while (i < argv.length) {
|
|
68
|
+
const arg = argv[i];
|
|
69
|
+
if (arg === "--version" || arg === "-v") {
|
|
70
|
+
flags.version = true;
|
|
71
|
+
} else if (arg === "--help" || arg === "-h") {
|
|
72
|
+
flags.help = true;
|
|
73
|
+
} else if (arg === "--json" || arg === "-j") {
|
|
74
|
+
flags.json = true;
|
|
75
|
+
} else if (arg === "--no-color") {
|
|
76
|
+
flags.noColor = true;
|
|
77
|
+
} else if (arg === "--store") {
|
|
78
|
+
i++;
|
|
79
|
+
flags.store = argv[i];
|
|
80
|
+
} else if (arg?.startsWith("--store=")) {
|
|
81
|
+
flags.store = arg.slice("--store=".length);
|
|
82
|
+
} else if (arg === "--vars") {
|
|
83
|
+
i++;
|
|
84
|
+
flags.vars = argv[i];
|
|
85
|
+
} else if (arg?.startsWith("--vars=")) {
|
|
86
|
+
flags.vars = arg.slice("--vars=".length);
|
|
87
|
+
} else if (arg === "--file") {
|
|
88
|
+
i++;
|
|
89
|
+
flags.file = argv[i];
|
|
90
|
+
} else if (arg?.startsWith("--file=")) {
|
|
91
|
+
flags.file = arg.slice("--file=".length);
|
|
92
|
+
} else if (arg === "--status") {
|
|
93
|
+
i++;
|
|
94
|
+
flags.status = argv[i];
|
|
95
|
+
} else if (arg?.startsWith("--status=")) {
|
|
96
|
+
flags.status = arg.slice("--status=".length);
|
|
97
|
+
} else if (arg === "--type") {
|
|
98
|
+
i++;
|
|
99
|
+
flags.type = argv[i];
|
|
100
|
+
} else if (arg?.startsWith("--type=")) {
|
|
101
|
+
flags.type = arg.slice("--type=".length);
|
|
102
|
+
} else if (arg === "--vendor") {
|
|
103
|
+
i++;
|
|
104
|
+
flags.vendor = argv[i];
|
|
105
|
+
} else if (arg?.startsWith("--vendor=")) {
|
|
106
|
+
flags.vendor = arg.slice("--vendor=".length);
|
|
107
|
+
} else if (arg === "--limit") {
|
|
108
|
+
i++;
|
|
109
|
+
flags.limit = argv[i];
|
|
110
|
+
} else if (arg?.startsWith("--limit=")) {
|
|
111
|
+
flags.limit = arg.slice("--limit=".length);
|
|
112
|
+
} else if (arg === "--cursor") {
|
|
113
|
+
i++;
|
|
114
|
+
flags.cursor = argv[i];
|
|
115
|
+
} else if (arg?.startsWith("--cursor=")) {
|
|
116
|
+
flags.cursor = arg.slice("--cursor=".length);
|
|
117
|
+
} else if (arg === "--title") {
|
|
118
|
+
i++;
|
|
119
|
+
flags.title = argv[i];
|
|
120
|
+
} else if (arg?.startsWith("--title=")) {
|
|
121
|
+
flags.title = arg.slice("--title=".length);
|
|
122
|
+
} else if (arg === "--handle") {
|
|
123
|
+
i++;
|
|
124
|
+
flags.handle = argv[i];
|
|
125
|
+
} else if (arg?.startsWith("--handle=")) {
|
|
126
|
+
flags.handle = arg.slice("--handle=".length);
|
|
127
|
+
} else if (arg === "--tags") {
|
|
128
|
+
i++;
|
|
129
|
+
flags.tags = argv[i];
|
|
130
|
+
} else if (arg?.startsWith("--tags=")) {
|
|
131
|
+
flags.tags = arg.slice("--tags=".length);
|
|
132
|
+
} else if (arg === "--description") {
|
|
133
|
+
i++;
|
|
134
|
+
flags.description = argv[i];
|
|
135
|
+
} else if (arg?.startsWith("--description=")) {
|
|
136
|
+
flags.description = arg.slice("--description=".length);
|
|
137
|
+
} else if (arg === "--variants") {
|
|
138
|
+
i++;
|
|
139
|
+
flags.variants = argv[i];
|
|
140
|
+
} else if (arg?.startsWith("--variants=")) {
|
|
141
|
+
flags.variants = arg.slice("--variants=".length);
|
|
142
|
+
} else if (arg === "--options") {
|
|
143
|
+
i++;
|
|
144
|
+
flags.options = argv[i];
|
|
145
|
+
} else if (arg?.startsWith("--options=")) {
|
|
146
|
+
flags.options = arg.slice("--options=".length);
|
|
147
|
+
} else if (arg === "--body") {
|
|
148
|
+
i++;
|
|
149
|
+
flags.body = argv[i];
|
|
150
|
+
} else if (arg?.startsWith("--body=")) {
|
|
151
|
+
flags.body = arg.slice("--body=".length);
|
|
152
|
+
} else if (arg === "--body-file") {
|
|
153
|
+
i++;
|
|
154
|
+
flags["body-file"] = argv[i];
|
|
155
|
+
} else if (arg?.startsWith("--body-file=")) {
|
|
156
|
+
flags["body-file"] = arg.slice("--body-file=".length);
|
|
157
|
+
} else if (arg === "--published") {
|
|
158
|
+
i++;
|
|
159
|
+
flags.published = argv[i];
|
|
160
|
+
} else if (arg?.startsWith("--published=")) {
|
|
161
|
+
flags.published = arg.slice("--published=".length);
|
|
162
|
+
} else if (arg === "--seo-title") {
|
|
163
|
+
i++;
|
|
164
|
+
flags["seo-title"] = argv[i];
|
|
165
|
+
} else if (arg?.startsWith("--seo-title=")) {
|
|
166
|
+
flags["seo-title"] = arg.slice("--seo-title=".length);
|
|
167
|
+
} else if (arg === "--seo-desc") {
|
|
168
|
+
i++;
|
|
169
|
+
flags["seo-desc"] = argv[i];
|
|
170
|
+
} else if (arg?.startsWith("--seo-desc=")) {
|
|
171
|
+
flags["seo-desc"] = arg.slice("--seo-desc=".length);
|
|
172
|
+
} else if (arg === "--yes" || arg === "-y") {
|
|
173
|
+
flags.yes = true;
|
|
174
|
+
} else if (arg) {
|
|
175
|
+
positional.push(arg);
|
|
176
|
+
}
|
|
177
|
+
i++;
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
resource: positional[0],
|
|
181
|
+
verb: positional[1],
|
|
182
|
+
args: positional.slice(2),
|
|
183
|
+
flags
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// src/cli.ts
|
|
188
|
+
var pkgPath = new URL("../package.json", import.meta.url).pathname;
|
|
189
|
+
var pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
190
|
+
async function run(argv) {
|
|
191
|
+
const parsed = parseArgs(argv);
|
|
192
|
+
if (parsed.flags.version) {
|
|
193
|
+
console.log(pkg.version);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (!parsed.resource || parsed.flags.help && !parsed.resource) {
|
|
197
|
+
console.log(topLevelHelp());
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
const resource = getResource(parsed.resource);
|
|
201
|
+
if (parsed.flags.help && parsed.resource) {
|
|
202
|
+
const help = resourceHelp(parsed.resource);
|
|
203
|
+
if (help) {
|
|
204
|
+
console.log(help);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
process.stderr.write(`Error: unknown resource "${parsed.resource}"
|
|
208
|
+
`);
|
|
209
|
+
process.exitCode = 2;
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
if (!resource) {
|
|
213
|
+
process.stderr.write(`Error: unknown resource "${parsed.resource}"
|
|
214
|
+
`);
|
|
215
|
+
process.exitCode = 2;
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
if (!parsed.verb) {
|
|
219
|
+
const defaultCommand2 = resource.verbs.get("_default");
|
|
220
|
+
if (defaultCommand2) {
|
|
221
|
+
await defaultCommand2.handler(parsed);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
const help = resourceHelp(parsed.resource);
|
|
225
|
+
if (help)
|
|
226
|
+
console.log(help);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
const defaultCommand = resource.verbs.get("_default");
|
|
230
|
+
if (defaultCommand) {
|
|
231
|
+
parsed.args = [parsed.verb, ...parsed.args];
|
|
232
|
+
parsed.verb = undefined;
|
|
233
|
+
await defaultCommand.handler(parsed);
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
const command = resource.verbs.get(parsed.verb);
|
|
237
|
+
if (!command) {
|
|
238
|
+
process.stderr.write(`Error: unknown verb "${parsed.verb}" for resource "${parsed.resource}"
|
|
239
|
+
`);
|
|
240
|
+
process.exitCode = 2;
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
await command.handler(parsed);
|
|
244
|
+
}
|
|
245
|
+
export {
|
|
246
|
+
run
|
|
247
|
+
};
|
package/dist/shopq.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
#!/usr/bin/env
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
// @bun
|
|
2
3
|
|
|
3
4
|
// src/graphql.ts
|
|
4
5
|
var API_VERSION = "2026-01";
|
|
@@ -26,7 +27,8 @@ class HttpError extends Error {
|
|
|
26
27
|
class ConfigError extends Error {
|
|
27
28
|
missing;
|
|
28
29
|
constructor(missing) {
|
|
29
|
-
super(`Missing required environment variables: ${missing.join(", ")}
|
|
30
|
+
super(`Missing required environment variables: ${missing.join(", ")}
|
|
31
|
+
` + `Set them in a .env file or as environment variables.`);
|
|
30
32
|
this.missing = missing;
|
|
31
33
|
this.name = "ConfigError";
|
|
32
34
|
}
|
|
@@ -154,7 +156,7 @@ function createClient(config) {
|
|
|
154
156
|
}
|
|
155
157
|
|
|
156
158
|
// src/helpers.ts
|
|
157
|
-
import { existsSync, readFileSync } from "
|
|
159
|
+
import { existsSync, readFileSync } from "fs";
|
|
158
160
|
|
|
159
161
|
// src/output.ts
|
|
160
162
|
function formatOutput(data, columns, options) {
|
|
@@ -187,7 +189,7 @@ function formatOutput(data, columns, options) {
|
|
|
187
189
|
}).join(" ");
|
|
188
190
|
process.stdout.write(`${headerLine}
|
|
189
191
|
`);
|
|
190
|
-
const separator = widths.map((w) => "
|
|
192
|
+
const separator = widths.map((w) => "\u2500".repeat(w)).join(" ");
|
|
191
193
|
process.stdout.write(`${separator}
|
|
192
194
|
`);
|
|
193
195
|
for (const row of data) {
|
|
@@ -329,7 +331,7 @@ register("config", "Configuration management", "show", {
|
|
|
329
331
|
});
|
|
330
332
|
|
|
331
333
|
// src/commands/gql.ts
|
|
332
|
-
import { existsSync as existsSync2, readFileSync as readFileSync2 } from "
|
|
334
|
+
import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs";
|
|
333
335
|
async function handleGql(parsed) {
|
|
334
336
|
let query;
|
|
335
337
|
if (parsed.flags.file) {
|
|
@@ -2026,7 +2028,7 @@ register("theme", "Theme management", "list", {
|
|
|
2026
2028
|
});
|
|
2027
2029
|
|
|
2028
2030
|
// src/cli.ts
|
|
2029
|
-
import { readFileSync as readFileSync3 } from "
|
|
2031
|
+
import { readFileSync as readFileSync3 } from "fs";
|
|
2030
2032
|
|
|
2031
2033
|
// src/help.ts
|
|
2032
2034
|
function topLevelHelp() {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shopq",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.9",
|
|
4
4
|
"description": "A zero-dependency Shopify Admin CLI built on Bun",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"skills"
|
|
13
13
|
],
|
|
14
14
|
"scripts": {
|
|
15
|
-
"build": "bun build bin/shopq.ts --target=
|
|
15
|
+
"build": "bun build bin/shopq.ts --target=bun --outfile dist/shopq.js && chmod +x dist/shopq.js",
|
|
16
16
|
"prepublishOnly": "bun run build",
|
|
17
17
|
"test": "bun test",
|
|
18
18
|
"check": "bunx --bun biome check --write .",
|