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 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 node
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 "node:fs";
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) => "".repeat(w)).join(" ");
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 "node:fs";
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 "node:fs";
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.7",
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=node --outfile dist/shopq.js && chmod +x dist/shopq.js",
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 .",