@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/CHANGELOG.md +0 -17
- package/bin/flux.js +1 -1
- package/dist/flux-cli.js +43 -193
- package/dist/flux.cjs.js +6 -35
- package/dist/flux.esm.js +6 -35
- package/dist/flux.min.js +35 -35
- package/package.json +1 -1
- package/src/self/pkg.flux +37 -144
- package/src/self/pkg.js +35 -159
- package/src/self/lexer.stage2.js +0 -700
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xnoxs/flux-lang",
|
|
3
|
-
"version": "3.5.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
147
|
-
|
|
148
|
-
|
|
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
|
-
|
|
128
|
+
err("Failed to fetch " + name + ": " + e.message)
|
|
152
129
|
|
|
153
130
|
console.log()
|
|
154
|
-
|
|
155
|
-
|
|
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
|
-
|
|
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
|
-
|
|
207
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
296
|
+
console.log(clr(C.gray, " tags: ") + keywords.slice(0, 8).join(", "))
|
|
332
297
|
|
|
333
298
|
console.log()
|
|
334
|
-
console.log(
|
|
299
|
+
console.log(clr(C.gray, " Install: ") + clr(C.yellow, "flux add " + name))
|
|
335
300
|
console.log()
|
|
336
301
|
|
|
337
302
|
catch(e):
|
|
338
|
-
|
|
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: "
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
108
|
+
err(((("Failed to fetch " + name) + ": ") + e.message));
|
|
135
109
|
}
|
|
136
110
|
}
|
|
137
111
|
console.log();
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
302
|
-
console.log();
|
|
261
|
+
console.log((clr(C.bold, (" " + name)) + clr(C.gray, (" v" + latest))));
|
|
303
262
|
if (ver.description) {
|
|
304
|
-
console.log((" " +
|
|
263
|
+
console.log((" " + ver.description));
|
|
305
264
|
}
|
|
306
265
|
console.log();
|
|
307
|
-
console.log((
|
|
308
|
-
console.log((
|
|
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((
|
|
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((
|
|
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((
|
|
278
|
+
console.log((clr(C.gray, " tags: ") + keywords.slice(0, 8).join(", ")));
|
|
320
279
|
}
|
|
321
280
|
console.log();
|
|
322
|
-
console.log((
|
|
281
|
+
console.log((clr(C.gray, " Install: ") + clr(C.yellow, ("flux add " + name))));
|
|
323
282
|
console.log();
|
|
324
283
|
}
|
|
325
284
|
catch (e) {
|
|
326
|
-
|
|
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);
|