@xnoxs/flux-lang 3.5.0 → 3.5.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xnoxs/flux-lang",
3
- "version": "3.5.0",
3
+ "version": "3.5.1",
4
4
  "description": "Flux — A modern language that transpiles to JavaScript. Python-clean syntax, TypeScript-level safety, Rust-inspired pattern matching.",
5
5
  "main": "dist/flux.cjs.js",
6
6
  "module": "dist/flux.esm.js",
package/src/self/pkg.flux CHANGED
@@ -36,33 +36,11 @@ val C = {
36
36
  gray: "\u001b[90m",
37
37
  }
38
38
 
39
- val hasColor = process.env.COLORTERM or process.env.FORCE_COLOR or (process.stdout.isTTY and process.env.TERM != "dumb")
40
- val noColor = process.env.NO_COLOR or not hasColor
41
-
42
- fn clr(c, s): return noColor ? s : c + s + C.reset
39
+ fn clr(c, s): return c + s + C.reset
43
40
  fn ok(msg): console.log(clr(C.green, "✓ ") + msg)
44
41
  fn err(msg): console.error(clr(C.red, "✗ ") + msg)
45
42
  fn info(msg): console.log(clr(C.cyan, " ") + msg)
46
43
 
47
- // ── Spinner animation ─────────────────────────────────────────
48
- fn createSpinner(msg):
49
- if noColor:
50
- process.stdout.write(" " + msg + " ...\n")
51
- fn _stop(ok_, done):
52
- process.stdout.write(" " + (ok_ ? "✓" : "✗") + " " + done + "\n")
53
- return { stop: _stop }
54
- val frames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]
55
- var fi = 0
56
- fn tick():
57
- process.stdout.write("\r " + clr(C.cyan, frames[fi % frames.length]) + " " + msg + " ")
58
- fi = fi + 1
59
- val timer = setInterval(tick, 80)
60
- fn stop(ok_, done):
61
- clearInterval(timer)
62
- val icon = ok_ ? clr(C.green, "✓") : clr(C.red, "✗")
63
- process.stdout.write("\r " + icon + " " + done + " \n")
64
- return { stop: stop }
65
-
66
44
  // ── HTTP fetch (Node built-in, no dependencies) ───────────────
67
45
  async fn fetchJson(url):
68
46
  val mod = url.startsWith("https") ? Https : Http
@@ -122,12 +100,10 @@ export async fn cmdAdd(specs, opts):
122
100
  val isDev = opts?.dev ?? false
123
101
  val cwd = process.cwd()
124
102
  val pkg = ensureFluxJson(cwd)
125
- var addedCount = 0
126
103
 
127
- console.log()
128
104
  for spec in specs:
129
105
  val { name, version } = parsePackageSpec(spec)
130
- val spinner = createSpinner(clr(C.bold, name) + clr(C.gray, "@" + version))
106
+ console.log(clr(C.cyan, "\n Adding ") + clr(C.bold, name) + clr(C.gray, "@" + version) + " ...")
131
107
 
132
108
  try:
133
109
  val info_ = await fetchJson(REGISTRY_URL + "/" + name)
@@ -135,25 +111,25 @@ export async fn cmdAdd(specs, opts):
135
111
 
136
112
  val versionInfo = info_.versions?.[resolvedVersion]
137
113
  if not versionInfo:
138
- spinner.stop(false, clr(C.bold, name) + clr(C.gray, "@" + resolvedVersion) + " version not found")
114
+ err("Version " + resolvedVersion + " not found for " + name)
139
115
  continue
140
116
 
141
117
  val depKey = isDev ? "devDependencies" : "dependencies"
142
118
  if not pkg[depKey]: pkg[depKey] = {}
143
119
  pkg[depKey][name] = "^" + resolvedVersion
120
+
144
121
  saveFluxJson(pkg, cwd)
145
122
 
146
- val shortDesc = versionInfo.description ? clr(C.gray, " — " + versionInfo.description.slice(0, 55)) : ""
147
- spinner.stop(true, clr(C.bold, name) + clr(C.green, "@" + resolvedVersion) + shortDesc)
148
- addedCount = addedCount + 1
123
+ val desc = versionInfo.description ? clr(C.gray, " — " + versionInfo.description) : ""
124
+ ok(name + clr(C.green, "@" + resolvedVersion) + desc)
125
+ info("Added to " + (isDev ? "devDependencies" : "dependencies"))
149
126
 
150
127
  catch(e):
151
- spinner.stop(false, clr(C.bold, name) + " " + e.message)
128
+ err("Failed to fetch " + name + ": " + e.message)
152
129
 
153
130
  console.log()
154
- if addedCount > 0:
155
- console.log(" " + clr(C.gray, "Run ") + clr(C.yellow, "flux install") + clr(C.gray, " to install packages"))
156
- console.log()
131
+ console.log(clr(C.gray, " Run ") + clr(C.yellow, "flux install") + clr(C.gray, " to install packages"))
132
+ console.log()
157
133
 
158
134
  // ── flux remove <pkg> ─────────────────────────────────────────
159
135
  export fn cmdRemove(names, opts):
@@ -193,19 +169,15 @@ export async fn cmdInstall(opts):
193
169
  val names = Object.keys(all)
194
170
 
195
171
  if names.length == 0:
196
- console.log()
197
172
  info("No dependencies found in flux.json")
198
- console.log()
199
173
  return
200
174
 
201
- console.log()
202
- console.log(" " + clr(C.bold, pkg.name ?? "project") + clr(C.gray, " — " + names.length + " package(s)"))
203
- console.log()
175
+ console.log(clr(C.cyan, "\n Installing ") + names.length + " package(s) into flux_modules/...\n")
176
+
204
177
  for name in names:
205
178
  val spec = all[name]
206
- val isDev_ = Object.prototype.hasOwnProperty.call(devDeps, name)
207
- val tag = isDev_ ? clr(C.gray, " dev") : ""
208
- console.log(" " + clr(C.gray, "○") + " " + clr(isDev_ ? C.blue : C.green, name) + clr(C.gray, "@" + spec) + tag)
179
+ console.log(clr(C.gray, " ○ ") + name + clr(C.gray, "@" + spec))
180
+
209
181
  console.log()
210
182
 
211
183
  // Ensure flux_modules/ exists with a minimal package.json
@@ -219,26 +191,27 @@ export async fn cmdInstall(opts):
219
191
 
220
192
  val prodNames = Object.keys(deps)
221
193
  val devNames = Object.keys(devDeps)
222
- val spinner = createSpinner("Installing packages into flux_modules/")
223
194
 
224
195
  try:
225
196
  if prodNames.length > 0:
226
197
  val prodPkgs = prodNames.map(n -> n + "@" + (deps[n] ?? "latest")).join(" ")
227
198
  val installCmd = "npm install --prefix " + fluxModDir + " " + prodPkgs
228
- execSync(installCmd, { cwd: cwd, stdio: "pipe" })
199
+ info("Running: " + installCmd)
200
+ execSync(installCmd, { cwd: cwd, stdio: "inherit" })
229
201
 
230
202
  if devNames.length > 0:
231
203
  val devPkgs = devNames.map(n -> n + "@" + (devDeps[n] ?? "latest")).join(" ")
232
204
  val devCmd = "npm install --prefix " + fluxModDir + " --save-dev " + devPkgs
233
- execSync(devCmd, { cwd: cwd, stdio: "pipe" })
205
+ info("Running: " + devCmd)
206
+ execSync(devCmd, { cwd: cwd, stdio: "inherit" })
234
207
 
235
- spinner.stop(true, names.length + " package(s) installed into " + clr(C.gray, "flux_modules/"))
236
208
  console.log()
237
- console.log(" " + clr(C.gray, "Packages resolve automatically when using: ") + clr(C.yellow, "flux run") + clr(C.gray, ", ") + clr(C.yellow, "flux bundle"))
209
+ ok(names.length + " package(s) installed into flux_modules/node_modules/")
210
+ info("Packages resolve automatically when using: flux run, flux bundle")
238
211
  catch(e):
239
- spinner.stop(false, "Install failed: " + e.message)
240
212
  console.log()
241
- console.log(" " + clr(C.gray, "Try: ") + clr(C.yellow, "npm install --prefix ./flux_modules <package>"))
213
+ err("Install failed: " + e.message)
214
+ info("Try manually: npm install --prefix ./flux_modules <package>")
242
215
 
243
216
  console.log()
244
217
 
@@ -276,138 +249,58 @@ export fn cmdList(opts):
276
249
 
277
250
  // ── flux search <query> ───────────────────────────────────────
278
251
  export async fn cmdSearch(query, opts):
279
- console.log()
280
- val spinner = createSpinner("Searching for " + clr(C.bold, '"' + query + '"'))
252
+ console.log(clr(C.cyan, "\n Searching for ") + clr(C.bold, '"' + query + '"') + " ...\n")
281
253
  try:
282
- val url = REGISTRY_URL + "/-/v1/search?text=" + encodeURIComponent(query) + "&size=10"
254
+ val url = REGISTRY_URL + "/-/v1/search?text=" + encodeURIComponent(query + " keywords:flux") + "&size=10"
283
255
  val results = await fetchJson(url)
284
256
  val objects = results.objects ?? []
285
257
 
286
258
  if objects.length == 0:
287
- spinner.stop(false, "No packages found for: " + query)
259
+ info("No packages found for: " + query)
288
260
  console.log()
289
261
  return
290
262
 
291
- spinner.stop(true, "Found " + objects.length + " result(s) for " + clr(C.bold, '"' + query + '"'))
292
- console.log()
293
-
294
263
  for obj in objects:
295
264
  val p = obj.package
296
265
  console.log(" " + clr(C.bold, p.name) + clr(C.gray, " v" + p.version))
297
266
  if p.description:
298
267
  console.log(" " + clr(C.gray, p.description))
299
- if p.links?.npm:
300
- console.log(" " + clr(C.blue, p.links.npm))
268
+ console.log(" " + clr(C.blue, p.links?.npm ?? ""))
301
269
  console.log()
302
270
 
303
271
  catch(e):
304
- spinner.stop(false, "Search failed: " + e.message)
305
- console.log()
272
+ err("Search failed: " + e.message)
306
273
 
307
274
  // ── flux info <pkg> ───────────────────────────────────────────
308
275
  export async fn cmdInfo(name, opts):
309
- console.log()
310
- val spinner = createSpinner("Fetching info for " + clr(C.bold, name))
276
+ console.log(clr(C.cyan, "\n Fetching info for ") + clr(C.bold, name) + " ...\n")
311
277
  try:
312
278
  val info_ = await fetchJson(REGISTRY_URL + "/" + name)
313
279
  val latest = info_["dist-tags"]?.latest ?? "unknown"
314
280
  val ver = info_.versions?.[latest] ?? {}
315
281
 
316
- spinner.stop(true, clr(C.bold, name) + clr(C.green, "@" + latest))
282
+ console.log(clr(C.bold, " " + name) + clr(C.gray, " v" + latest))
283
+ if ver.description: console.log(" " + ver.description)
317
284
  console.log()
318
- if ver.description: console.log(" " + clr(C.gray, ver.description))
319
- console.log()
320
- console.log(" " + clr(C.gray, "license:") + " " + (ver.license ?? "unknown"))
321
- console.log(" " + clr(C.gray, "author: ") + " " + (ver.author?.name ?? ver.author ?? "unknown"))
285
+ console.log(clr(C.gray, " license: ") + (ver.license ?? "unknown"))
286
+ console.log(clr(C.gray, " author: ") + (ver.author?.name ?? ver.author ?? "unknown"))
322
287
 
323
288
  val homepage = ver.homepage ?? info_.homepage
324
- if homepage: console.log(" " + clr(C.gray, "home: ") + " " + clr(C.blue, homepage))
289
+ if homepage: console.log(clr(C.gray, " home: ") + clr(C.blue, homepage))
325
290
 
326
291
  val repo = ver.repository?.url ?? info_.repository?.url
327
- if repo: console.log(" " + clr(C.gray, "repo: ") + " " + clr(C.blue, repo.replace("git+", "").replace(".git", "")))
292
+ if repo: console.log(clr(C.gray, " repo: ") + clr(C.blue, repo.replace("git+", "").replace(".git", "")))
328
293
 
329
294
  val keywords = ver.keywords ?? []
330
295
  if keywords.length > 0:
331
- console.log(" " + clr(C.gray, "tags: ") + " " + keywords.slice(0, 8).join(", "))
296
+ console.log(clr(C.gray, " tags: ") + keywords.slice(0, 8).join(", "))
332
297
 
333
298
  console.log()
334
- console.log(" " + clr(C.gray, "Install: ") + clr(C.yellow, "flux add " + name))
299
+ console.log(clr(C.gray, " Install: ") + clr(C.yellow, "flux add " + name))
335
300
  console.log()
336
301
 
337
302
  catch(e):
338
- spinner.stop(false, "Could not fetch info for " + name + ": " + e.message)
339
- console.log()
340
-
341
- // ── flux upgrade [--check] ────────────────────────────────────
342
- export async fn cmdUpgrade(opts):
343
- val isCheck = opts?.check ?? false
344
- val cwd = process.cwd()
345
- val pkg = ensureFluxJson(cwd)
346
-
347
- val deps = pkg.dependencies ?? {}
348
- val devDeps = pkg.devDependencies ?? {}
349
- val allKeys = [...Object.keys(deps), ...Object.keys(devDeps)]
350
-
351
- if allKeys.length == 0:
352
- console.log()
353
- info("No dependencies to upgrade")
354
- console.log()
355
- return
356
-
357
- console.log()
358
- var updated = 0
359
-
360
- for name in Object.keys(deps):
361
- val spinner = createSpinner(clr(C.green, name))
362
- try:
363
- val info_ = await fetchJson(REGISTRY_URL + "/" + name)
364
- val latest = info_["dist-tags"]?.latest ?? null
365
- if not latest:
366
- spinner.stop(false, clr(C.green, name) + " — could not resolve latest version")
367
- continue
368
- val current = deps[name].replace("^", "").replace("~", "")
369
- if latest == current:
370
- spinner.stop(true, clr(C.green, name) + clr(C.gray, "@" + current + " — up to date"))
371
- else:
372
- spinner.stop(true, clr(C.green, name) + clr(C.gray, "@" + current) + " → " + clr(C.yellow, latest))
373
- if not isCheck:
374
- pkg.dependencies[name] = "^" + latest
375
- updated = updated + 1
376
- catch(e):
377
- spinner.stop(false, clr(C.green, name) + " — " + e.message)
378
-
379
- for name in Object.keys(devDeps):
380
- val spinner = createSpinner(clr(C.blue, name) + clr(C.gray, " (dev)"))
381
- try:
382
- val info_ = await fetchJson(REGISTRY_URL + "/" + name)
383
- val latest = info_["dist-tags"]?.latest ?? null
384
- if not latest:
385
- spinner.stop(false, clr(C.blue, name) + " — could not resolve latest version")
386
- continue
387
- val current = devDeps[name].replace("^", "").replace("~", "")
388
- if latest == current:
389
- spinner.stop(true, clr(C.blue, name) + clr(C.gray, "@" + current + " — up to date"))
390
- else:
391
- spinner.stop(true, clr(C.blue, name) + clr(C.gray, "@" + current) + " → " + clr(C.yellow, latest) + clr(C.gray, " (dev)"))
392
- if not isCheck:
393
- pkg.devDependencies[name] = "^" + latest
394
- updated = updated + 1
395
- catch(e):
396
- spinner.stop(false, clr(C.blue, name) + " — " + e.message)
397
-
398
- console.log()
399
-
400
- if isCheck:
401
- ok("Check complete — run " + clr(C.yellow, "flux upgrade") + " to apply upgrades")
402
- else:
403
- if updated > 0:
404
- saveFluxJson(pkg, cwd)
405
- ok(updated + " package(s) updated in flux.json")
406
- console.log(" " + clr(C.gray, "Run ") + clr(C.yellow, "flux install") + clr(C.gray, " to install upgraded packages"))
407
- else:
408
- ok("All packages are already up to date")
409
-
410
- console.log()
303
+ err("Could not fetch info for " + name + ": " + e.message)
411
304
 
412
305
  // ── flux publish ──────────────────────────────────────────────
413
306
  export fn cmdPublish(opts):
package/src/self/pkg.js CHANGED
@@ -21,11 +21,9 @@ const { readPackage, writeConfig, loadConfig } = require("./config");
21
21
  const REGISTRY_URL = "https://registry.npmjs.org";
22
22
  const FLUX_PKG_DIR = "flux_modules";
23
23
  const PKG_FILE = "flux.json";
24
- const C = { reset: "\u001b[0m", bold: "\u001b[1m", dim: "\u001b[2m", red: "\u001b[31m", green: "\u001b[32m", yellow: "\u001b[33m", blue: "\u001b[34m", cyan: "\u001b[36m", gray: "\u001b[90m" };
25
- const hasColor = ((process.env.COLORTERM || process.env.FORCE_COLOR) || (process.stdout.isTTY && (process.env.TERM != "dumb")));
26
- const noColor = (process.env.NO_COLOR || !hasColor);
24
+ const C = { reset: "\\u001b[0m", bold: "\\u001b[1m", dim: "\\u001b[2m", red: "\\u001b[31m", green: "\\u001b[32m", yellow: "\\u001b[33m", blue: "\\u001b[34m", cyan: "\\u001b[36m", gray: "\\u001b[90m" };
27
25
  function clr(c, s) {
28
- return (noColor ? s : ((c + s) + C.reset));
26
+ return ((c + s) + C.reset);
29
27
  }
30
28
  function ok(msg) {
31
29
  console.log((clr(C.green, "✓ ") + msg));
@@ -36,28 +34,6 @@ function err(msg) {
36
34
  function info(msg) {
37
35
  console.log((clr(C.cyan, " ") + msg));
38
36
  }
39
- function createSpinner(msg) {
40
- if (noColor) {
41
- process.stdout.write(((" " + msg) + " ...\n"));
42
- function _stop(ok_, done) {
43
- process.stdout.write(((((" " + (ok_ ? "✓" : "✗")) + " ") + done) + "\n"));
44
- }
45
- return { stop: _stop };
46
- }
47
- const frames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
48
- let fi = 0;
49
- function tick() {
50
- process.stdout.write((((("\r " + clr(C.cyan, frames[(fi % frames.length)])) + " ") + msg) + " "));
51
- fi = (fi + 1);
52
- }
53
- const timer = setInterval(tick, 80);
54
- function stop(ok_, done) {
55
- clearInterval(timer);
56
- const icon = (ok_ ? clr(C.green, "✓") : clr(C.red, "✗"));
57
- process.stdout.write((((("\r " + icon) + " ") + done) + " \n"));
58
- }
59
- return { stop };
60
- }
61
37
  async function fetchJson(url) {
62
38
  const mod = (url.startsWith("https") ? Https : Http);
63
39
  function doRequest(resolve, reject) {
@@ -107,17 +83,15 @@ async function cmdAdd(specs, opts) {
107
83
  const isDev = (opts?.dev ?? false);
108
84
  const cwd = process.cwd();
109
85
  const pkg = ensureFluxJson(cwd);
110
- let addedCount = 0;
111
- console.log();
112
86
  for (const spec of specs) {
113
87
  const { name, version } = parsePackageSpec(spec);
114
- const spinner = createSpinner((clr(C.bold, name) + clr(C.gray, ("@" + version))));
88
+ console.log((((clr(C.cyan, "\n Adding ") + clr(C.bold, name)) + clr(C.gray, ("@" + version))) + " ..."));
115
89
  try {
116
90
  const info_ = await fetchJson(((REGISTRY_URL + "/") + name));
117
91
  const resolvedVersion = ((version == "latest") ? (info_["dist-tags"]?.latest ?? "1.0.0") : version);
118
92
  const versionInfo = info_.versions?.[resolvedVersion];
119
93
  if (!versionInfo) {
120
- spinner.stop(false, ((clr(C.bold, name) + clr(C.gray, ("@" + resolvedVersion))) + " version not found"));
94
+ err(((("Version " + resolvedVersion) + " not found for ") + name));
121
95
  continue;
122
96
  }
123
97
  const depKey = (isDev ? "devDependencies" : "dependencies");
@@ -126,19 +100,17 @@ async function cmdAdd(specs, opts) {
126
100
  }
127
101
  pkg[depKey][name] = ("^" + resolvedVersion);
128
102
  saveFluxJson(pkg, cwd);
129
- const shortDesc = (versionInfo.description ? clr(C.gray, (" — " + versionInfo.description.slice(0, 55))) : "");
130
- spinner.stop(true, ((clr(C.bold, name) + clr(C.green, ("@" + resolvedVersion))) + shortDesc));
131
- addedCount = (addedCount + 1);
103
+ const desc = (versionInfo.description ? clr(C.gray, (" — " + versionInfo.description)) : "");
104
+ ok(((name + clr(C.green, ("@" + resolvedVersion))) + desc));
105
+ info(("Added to " + (isDev ? "devDependencies" : "dependencies")));
132
106
  }
133
107
  catch (e) {
134
- spinner.stop(false, ((clr(C.bold, name) + " ") + e.message));
108
+ err(((("Failed to fetch " + name) + ": ") + e.message));
135
109
  }
136
110
  }
137
111
  console.log();
138
- if ((addedCount > 0)) {
139
- console.log((((" " + clr(C.gray, "Run ")) + clr(C.yellow, "flux install")) + clr(C.gray, " to install packages")));
140
- console.log();
141
- }
112
+ console.log(((clr(C.gray, " Run ") + clr(C.yellow, "flux install")) + clr(C.gray, " to install packages")));
113
+ console.log();
142
114
  }
143
115
  module.exports.cmdAdd = cmdAdd;
144
116
  function cmdRemove(names, opts) {
@@ -178,19 +150,13 @@ async function cmdInstall(opts) {
178
150
  const all = { ...deps, ...devDeps };
179
151
  const names = Object.keys(all);
180
152
  if ((names.length == 0)) {
181
- console.log();
182
153
  info("No dependencies found in flux.json");
183
- console.log();
184
154
  return;
185
155
  }
186
- console.log();
187
- console.log(((" " + clr(C.bold, (pkg.name ?? "project"))) + clr(C.gray, ((" — " + names.length) + " package(s)"))));
188
- console.log();
156
+ console.log(((clr(C.cyan, "\n Installing ") + names.length) + " package(s) into flux_modules/...\n"));
189
157
  for (const name of names) {
190
158
  const spec = all[name];
191
- const isDev_ = Object.prototype.hasOwnProperty.call(devDeps, name);
192
- const tag = (isDev_ ? clr(C.gray, " dev") : "");
193
- console.log((((((" " + clr(C.gray, "○")) + " ") + clr((isDev_ ? C.blue : C.green), name)) + clr(C.gray, ("@" + spec))) + tag));
159
+ console.log(((clr(C.gray, " ○ ") + name) + clr(C.gray, ("@" + spec))));
194
160
  }
195
161
  console.log();
196
162
  if (!Fs.existsSync(fluxModDir)) {
@@ -203,26 +169,27 @@ async function cmdInstall(opts) {
203
169
  }
204
170
  const prodNames = Object.keys(deps);
205
171
  const devNames = Object.keys(devDeps);
206
- const spinner = createSpinner("Installing packages into flux_modules/");
207
172
  try {
208
173
  if ((prodNames.length > 0)) {
209
174
  const prodPkgs = prodNames.map((n) => ((n + "@") + (deps[n] ?? "latest"))).join(" ");
210
175
  const installCmd = ((("npm install --prefix " + fluxModDir) + " ") + prodPkgs);
211
- execSync(installCmd, { cwd, stdio: "pipe" });
176
+ info(("Running: " + installCmd));
177
+ execSync(installCmd, { cwd, stdio: "inherit" });
212
178
  }
213
179
  if ((devNames.length > 0)) {
214
180
  const devPkgs = devNames.map((n) => ((n + "@") + (devDeps[n] ?? "latest"))).join(" ");
215
181
  const devCmd = ((("npm install --prefix " + fluxModDir) + " --save-dev ") + devPkgs);
216
- execSync(devCmd, { cwd, stdio: "pipe" });
182
+ info(("Running: " + devCmd));
183
+ execSync(devCmd, { cwd, stdio: "inherit" });
217
184
  }
218
- spinner.stop(true, ((names.length + " package(s) installed into ") + clr(C.gray, "flux_modules/")));
219
185
  console.log();
220
- console.log(((((" " + clr(C.gray, "Packages resolve automatically when using: ")) + clr(C.yellow, "flux run")) + clr(C.gray, ", ")) + clr(C.yellow, "flux bundle")));
186
+ ok((names.length + " package(s) installed into flux_modules/node_modules/"));
187
+ info("Packages resolve automatically when using: flux run, flux bundle");
221
188
  }
222
189
  catch (e) {
223
- spinner.stop(false, ("Install failed: " + e.message));
224
190
  console.log();
225
- console.log(((" " + clr(C.gray, "Try: ")) + clr(C.yellow, "npm install --prefix ./flux_modules <package>")));
191
+ err(("Install failed: " + e.message));
192
+ info("Try manually: npm install --prefix ./flux_modules <package>");
226
193
  }
227
194
  console.log();
228
195
  }
@@ -260,156 +227,65 @@ function cmdList(opts) {
260
227
  }
261
228
  module.exports.cmdList = cmdList;
262
229
  async function cmdSearch(query, opts) {
263
- console.log();
264
- const spinner = createSpinner(("Searching for " + clr(C.bold, (("\"" + query) + "\""))));
230
+ console.log(((clr(C.cyan, "\n Searching for ") + clr(C.bold, (("\"" + query) + "\""))) + " ...\n"));
265
231
  try {
266
- const url = (((REGISTRY_URL + "/-/v1/search?text=") + encodeURIComponent(query)) + "&size=10");
232
+ const url = (((REGISTRY_URL + "/-/v1/search?text=") + encodeURIComponent((query + " keywords:flux"))) + "&size=10");
267
233
  const results = await fetchJson(url);
268
234
  const objects = (results.objects ?? []);
269
235
  if ((objects.length == 0)) {
270
- spinner.stop(false, ("No packages found for: " + query));
236
+ info(("No packages found for: " + query));
271
237
  console.log();
272
238
  return;
273
239
  }
274
- spinner.stop(true, ((("Found " + objects.length) + " result(s) for ") + clr(C.bold, (("\"" + query) + "\""))));
275
- console.log();
276
240
  for (const obj of objects) {
277
241
  const p = obj.package;
278
242
  console.log(((" " + clr(C.bold, p.name)) + clr(C.gray, (" v" + p.version))));
279
243
  if (p.description) {
280
244
  console.log((" " + clr(C.gray, p.description)));
281
245
  }
282
- if (p.links?.npm) {
283
- console.log((" " + clr(C.blue, p.links.npm)));
284
- }
246
+ console.log((" " + clr(C.blue, (p.links?.npm ?? ""))));
285
247
  console.log();
286
248
  }
287
249
  }
288
250
  catch (e) {
289
- spinner.stop(false, ("Search failed: " + e.message));
290
- console.log();
251
+ err(("Search failed: " + e.message));
291
252
  }
292
253
  }
293
254
  module.exports.cmdSearch = cmdSearch;
294
255
  async function cmdInfo(name, opts) {
295
- console.log();
296
- const spinner = createSpinner(("Fetching info for " + clr(C.bold, name)));
256
+ console.log(((clr(C.cyan, "\n Fetching info for ") + clr(C.bold, name)) + " ...\n"));
297
257
  try {
298
258
  const info_ = await fetchJson(((REGISTRY_URL + "/") + name));
299
259
  const latest = (info_["dist-tags"]?.latest ?? "unknown");
300
260
  const ver = (info_.versions?.[latest] ?? { });
301
- spinner.stop(true, (clr(C.bold, name) + clr(C.green, ("@" + latest))));
302
- console.log();
261
+ console.log((clr(C.bold, (" " + name)) + clr(C.gray, (" v" + latest))));
303
262
  if (ver.description) {
304
- console.log((" " + clr(C.gray, ver.description)));
263
+ console.log((" " + ver.description));
305
264
  }
306
265
  console.log();
307
- console.log((((" " + clr(C.gray, "license:")) + " ") + (ver.license ?? "unknown")));
308
- console.log((((" " + clr(C.gray, "author: ")) + " ") + ((ver.author?.name ?? ver.author) ?? "unknown")));
266
+ console.log((clr(C.gray, " license: ") + (ver.license ?? "unknown")));
267
+ console.log((clr(C.gray, " author: ") + ((ver.author?.name ?? ver.author) ?? "unknown")));
309
268
  const homepage = (ver.homepage ?? info_.homepage);
310
269
  if (homepage) {
311
- console.log((((" " + clr(C.gray, "home: ")) + " ") + clr(C.blue, homepage)));
270
+ console.log((clr(C.gray, " home: ") + clr(C.blue, homepage)));
312
271
  }
313
272
  const repo = (ver.repository?.url ?? info_.repository?.url);
314
273
  if (repo) {
315
- console.log((((" " + clr(C.gray, "repo: ")) + " ") + clr(C.blue, repo.replace("git+", "").replace(".git", ""))));
274
+ console.log((clr(C.gray, " repo: ") + clr(C.blue, repo.replace("git+", "").replace(".git", ""))));
316
275
  }
317
276
  const keywords = (ver.keywords ?? []);
318
277
  if ((keywords.length > 0)) {
319
- console.log((((" " + clr(C.gray, "tags: ")) + " ") + keywords.slice(0, 8).join(", ")));
278
+ console.log((clr(C.gray, " tags: ") + keywords.slice(0, 8).join(", ")));
320
279
  }
321
280
  console.log();
322
- console.log(((" " + clr(C.gray, "Install: ")) + clr(C.yellow, ("flux add " + name))));
281
+ console.log((clr(C.gray, " Install: ") + clr(C.yellow, ("flux add " + name))));
323
282
  console.log();
324
283
  }
325
284
  catch (e) {
326
- spinner.stop(false, ((("Could not fetch info for " + name) + ": ") + e.message));
327
- console.log();
285
+ err(((("Could not fetch info for " + name) + ": ") + e.message));
328
286
  }
329
287
  }
330
288
  module.exports.cmdInfo = cmdInfo;
331
- async function cmdUpgrade(opts) {
332
- const isCheck = (opts?.check ?? false);
333
- const cwd = process.cwd();
334
- const pkg = ensureFluxJson(cwd);
335
- const deps = (pkg.dependencies ?? { });
336
- const devDeps = (pkg.devDependencies ?? { });
337
- const allKeys = [...Object.keys(deps), ...Object.keys(devDeps)];
338
- if ((allKeys.length == 0)) {
339
- console.log();
340
- info("No dependencies to upgrade");
341
- console.log();
342
- return;
343
- }
344
- console.log();
345
- let updated = 0;
346
- for (const name of Object.keys(deps)) {
347
- const spinner = createSpinner(clr(C.green, name));
348
- try {
349
- const info_ = await fetchJson(((REGISTRY_URL + "/") + name));
350
- const latest = (info_["dist-tags"]?.latest ?? null);
351
- if (!latest) {
352
- spinner.stop(false, (clr(C.green, name) + " — could not resolve latest version"));
353
- continue;
354
- }
355
- const current = deps[name].replace("^", "").replace("~", "");
356
- if ((latest == current)) {
357
- spinner.stop(true, (clr(C.green, name) + clr(C.gray, (("@" + current) + " — up to date"))));
358
- }
359
- else {
360
- spinner.stop(true, (((clr(C.green, name) + clr(C.gray, ("@" + current))) + " → ") + clr(C.yellow, latest)));
361
- if (!isCheck) {
362
- pkg.dependencies[name] = ("^" + latest);
363
- updated = (updated + 1);
364
- }
365
- }
366
- }
367
- catch (e) {
368
- spinner.stop(false, ((clr(C.green, name) + " — ") + e.message));
369
- }
370
- }
371
- for (const name of Object.keys(devDeps)) {
372
- const spinner = createSpinner((clr(C.blue, name) + clr(C.gray, " (dev)")));
373
- try {
374
- const info_ = await fetchJson(((REGISTRY_URL + "/") + name));
375
- const latest = (info_["dist-tags"]?.latest ?? null);
376
- if (!latest) {
377
- spinner.stop(false, (clr(C.blue, name) + " — could not resolve latest version"));
378
- continue;
379
- }
380
- const current = devDeps[name].replace("^", "").replace("~", "");
381
- if ((latest == current)) {
382
- spinner.stop(true, (clr(C.blue, name) + clr(C.gray, (("@" + current) + " — up to date"))));
383
- }
384
- else {
385
- spinner.stop(true, ((((clr(C.blue, name) + clr(C.gray, ("@" + current))) + " → ") + clr(C.yellow, latest)) + clr(C.gray, " (dev)")));
386
- if (!isCheck) {
387
- pkg.devDependencies[name] = ("^" + latest);
388
- updated = (updated + 1);
389
- }
390
- }
391
- }
392
- catch (e) {
393
- spinner.stop(false, ((clr(C.blue, name) + " — ") + e.message));
394
- }
395
- }
396
- console.log();
397
- if (isCheck) {
398
- ok((("Check complete — run " + clr(C.yellow, "flux upgrade")) + " to apply upgrades"));
399
- }
400
- else {
401
- if ((updated > 0)) {
402
- saveFluxJson(pkg, cwd);
403
- ok((updated + " package(s) updated in flux.json"));
404
- console.log((((" " + clr(C.gray, "Run ")) + clr(C.yellow, "flux install")) + clr(C.gray, " to install upgraded packages")));
405
- }
406
- else {
407
- ok("All packages are already up to date");
408
- }
409
- }
410
- console.log();
411
- }
412
- module.exports.cmdUpgrade = cmdUpgrade;
413
289
  function cmdPublish(opts) {
414
290
  const cwd = process.cwd();
415
291
  const pkg = readPackage(cwd);