@xnoxs/flux-lang 3.3.3 → 3.4.0

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.
@@ -0,0 +1,288 @@
1
+ // ── Flux stdlib ──
2
+
3
+ function join(arr, sep) { return arr.join(sep != null ? sep : ','); }
4
+
5
+ function keys(obj) { return Object.keys(obj); }
6
+
7
+ function startsWith(s, prefix) { return String(s).startsWith(prefix); }
8
+ // ── end stdlib ──
9
+
10
+ // Generated by Flux Transpiler v3.2.0
11
+ "use strict";
12
+
13
+ const Fs = require("fs");
14
+ const Path = require("path");
15
+ const Https = require("https");
16
+ const Http = require("http");
17
+ const Os = require("os");
18
+ const { readPackage, writeConfig, loadConfig } = require("./config");
19
+ const REGISTRY_URL = "https://registry.npmjs.org";
20
+ const FLUX_PKG_DIR = "flux_modules";
21
+ const PKG_FILE = "flux.json";
22
+ const C = { reset: "\\x1b[0m", bold: "\\x1b[1m", dim: "\\x1b[2m", red: "\\x1b[31m", green: "\\x1b[32m", yellow: "\\x1b[33m", blue: "\\x1b[34m", cyan: "\\x1b[36m", gray: "\\x1b[90m" };
23
+ function clr(c, s) {
24
+ return ((c + s) + C.reset);
25
+ }
26
+ function ok(msg) {
27
+ console.log((clr(C.green, "✓ ") + msg));
28
+ }
29
+ function err(msg) {
30
+ console.error((clr(C.red, "✗ ") + msg));
31
+ }
32
+ function info(msg) {
33
+ console.log((clr(C.cyan, " ") + msg));
34
+ }
35
+ async function fetchJson(url) {
36
+ const mod = (url.startsWith("https") ? Https : Http);
37
+ function doRequest(resolve, reject) {
38
+ let data = "";
39
+ function onData(chunk) {
40
+ data = (data + chunk);
41
+ }
42
+ function onEnd() {
43
+ try {
44
+ resolve(JSON.parse(data));
45
+ }
46
+ catch (e) {
47
+ reject(new Error(("Invalid JSON from registry: " + e.message)));
48
+ }
49
+ }
50
+ function onRes(res) {
51
+ res.on("data", onData);
52
+ res.on("end", onEnd);
53
+ }
54
+ mod.get(url, { headers: { "User-Agent": "flux-pkg/1.0" } }, onRes).on("error", reject);
55
+ }
56
+ return new Promise(doRequest);
57
+ }
58
+ function ensureFluxJson(cwd_) {
59
+ const cwd = (cwd_ ?? process.cwd());
60
+ const file = Path.join(cwd, PKG_FILE);
61
+ if (!Fs.existsSync(file)) {
62
+ const pkg = { name: Path.basename(cwd), version: "1.0.0", description: "", author: "", license: "MIT", scripts: { start: "flux run src/main.flux", build: "flux bundle src/main.flux -o dist/bundle.js", dev: "flux watch src/main.flux", check: "flux check src/main.flux" }, dependencies: { }, devDependencies: { } };
63
+ Fs.writeFileSync(file, (JSON.stringify(pkg, null, 2) + "\n"), "utf8");
64
+ ok("Created flux.json");
65
+ }
66
+ return JSON.parse(Fs.readFileSync(file, "utf8"));
67
+ }
68
+ function saveFluxJson(pkg, cwd_) {
69
+ const cwd = (cwd_ ?? process.cwd());
70
+ const file = Path.join(cwd, PKG_FILE);
71
+ Fs.writeFileSync(file, (JSON.stringify(pkg, null, 2) + "\n"), "utf8");
72
+ }
73
+ function parsePackageSpec(spec) {
74
+ const atIdx = spec.lastIndexOf("@");
75
+ if ((atIdx > 0)) {
76
+ return { name: spec.slice(0, atIdx), version: spec.slice((atIdx + 1)) };
77
+ }
78
+ return { name: spec, version: "latest" };
79
+ }
80
+ async function cmdAdd(specs, opts) {
81
+ const isDev = (opts?.dev ?? false);
82
+ const cwd = process.cwd();
83
+ const pkg = ensureFluxJson(cwd);
84
+ for (const spec of specs) {
85
+ const { name, version } = parsePackageSpec(spec);
86
+ console.log((((clr(C.cyan, "\n Adding ") + clr(C.bold, name)) + clr(C.gray, ("@" + version))) + " ..."));
87
+ try {
88
+ const info_ = await fetchJson(((REGISTRY_URL + "/") + name));
89
+ const resolvedVersion = ((version == "latest") ? (info_["dist-tags"]?.latest ?? "1.0.0") : version);
90
+ const versionInfo = info_.versions?.[resolvedVersion];
91
+ if (!versionInfo) {
92
+ err(((("Version " + resolvedVersion) + " not found for ") + name));
93
+ continue;
94
+ }
95
+ const depKey = (isDev ? "devDependencies" : "dependencies");
96
+ if (!pkg[depKey]) {
97
+ pkg[depKey] = { };
98
+ }
99
+ pkg[depKey][name] = ("^" + resolvedVersion);
100
+ saveFluxJson(pkg, cwd);
101
+ const desc = (versionInfo.description ? clr(C.gray, (" — " + versionInfo.description)) : "");
102
+ ok(((name + clr(C.green, ("@" + resolvedVersion))) + desc));
103
+ info(("Added to " + (isDev ? "devDependencies" : "dependencies")));
104
+ }
105
+ catch (e) {
106
+ err(((("Failed to fetch " + name) + ": ") + e.message));
107
+ }
108
+ }
109
+ console.log();
110
+ console.log(((clr(C.gray, " Run ") + clr(C.yellow, "flux install")) + clr(C.gray, " to install packages")));
111
+ console.log();
112
+ }
113
+ module.exports.cmdAdd = cmdAdd;
114
+ function cmdRemove(names, opts) {
115
+ const cwd = process.cwd();
116
+ const pkg = ensureFluxJson(cwd);
117
+ let removed = 0;
118
+ for (const name of names) {
119
+ let found = false;
120
+ if ((pkg.dependencies && pkg.dependencies[name])) {
121
+ delete;
122
+ pkg.dependencies[name];
123
+ found = true;
124
+ }
125
+ if ((pkg.devDependencies && pkg.devDependencies[name])) {
126
+ delete;
127
+ pkg.devDependencies[name];
128
+ found = true;
129
+ }
130
+ if (found) {
131
+ ok(("Removed " + clr(C.bold, name)));
132
+ removed = (removed + 1);
133
+ }
134
+ else {
135
+ err((name + " not found in flux.json"));
136
+ }
137
+ }
138
+ if ((removed > 0)) {
139
+ saveFluxJson(pkg, cwd);
140
+ }
141
+ }
142
+ module.exports.cmdRemove = cmdRemove;
143
+ async function cmdInstall(opts) {
144
+ const cwd = process.cwd();
145
+ const pkg = ensureFluxJson(cwd);
146
+ const deps = (pkg.dependencies ?? { });
147
+ const devDeps = (pkg.devDependencies ?? { });
148
+ const all = { ...deps, ...devDeps };
149
+ const names = Object.keys(all);
150
+ if ((names.length == 0)) {
151
+ info("No dependencies found in flux.json");
152
+ return;
153
+ }
154
+ console.log(((clr(C.cyan, "\n Installing ") + names.length) + " package(s)...\n"));
155
+ const modDir = Path.join(cwd, FLUX_PKG_DIR);
156
+ if (!Fs.existsSync(modDir)) {
157
+ Fs.mkdirSync(modDir, { recursive: true });
158
+ }
159
+ for (const name of names) {
160
+ const spec = all[name];
161
+ const version = spec.replace(/[\^~>=<]/g, "").split(" ")[0];
162
+ console.log(((clr(C.gray, " ○ ") + name) + clr(C.gray, ("@" + version))));
163
+ }
164
+ console.log();
165
+ ok("flux.json dependencies registered");
166
+ info("Note: Use npm/pnpm to install Node.js compatible packages");
167
+ console.log();
168
+ }
169
+ module.exports.cmdInstall = cmdInstall;
170
+ function cmdList(opts) {
171
+ const cwd = process.cwd();
172
+ const pkg = readPackage(cwd);
173
+ if (!pkg) {
174
+ err("No flux.json found. Run: flux init");
175
+ return;
176
+ }
177
+ console.log();
178
+ console.log(clr(C.bold, ((" " + (pkg.name ?? "project")) + clr(C.gray, ("@" + (pkg.version ?? "1.0.0"))))));
179
+ console.log();
180
+ const deps = (pkg.dependencies ?? { });
181
+ const devDeps = (pkg.devDependencies ?? { });
182
+ if ((Object.keys(deps).length > 0)) {
183
+ console.log(clr(C.cyan, " dependencies:"));
184
+ for (const name of Object.keys(deps)) {
185
+ console.log(((" " + clr(C.green, name)) + clr(C.gray, (" " + deps[name]))));
186
+ }
187
+ console.log();
188
+ }
189
+ if ((Object.keys(devDeps).length > 0)) {
190
+ console.log(clr(C.cyan, " devDependencies:"));
191
+ for (const name of Object.keys(devDeps)) {
192
+ console.log(((" " + clr(C.blue, name)) + clr(C.gray, (" " + devDeps[name]))));
193
+ }
194
+ console.log();
195
+ }
196
+ if (((Object.keys(deps).length == 0) && (Object.keys(devDeps).length == 0))) {
197
+ info("No dependencies");
198
+ console.log();
199
+ }
200
+ }
201
+ module.exports.cmdList = cmdList;
202
+ async function cmdSearch(query, opts) {
203
+ console.log(((clr(C.cyan, "\n Searching for ") + clr(C.bold, (("\"" + query) + "\""))) + " ...\n"));
204
+ try {
205
+ const url = (((REGISTRY_URL + "/-/v1/search?text=") + encodeURIComponent((query + " keywords:flux"))) + "&size=10");
206
+ const results = await fetchJson(url);
207
+ const objects = (results.objects ?? []);
208
+ if ((objects.length == 0)) {
209
+ info(("No packages found for: " + query));
210
+ console.log();
211
+ return;
212
+ }
213
+ for (const obj of objects) {
214
+ const p = obj.package;
215
+ console.log(((" " + clr(C.bold, p.name)) + clr(C.gray, (" v" + p.version))));
216
+ if (p.description) {
217
+ console.log((" " + clr(C.gray, p.description)));
218
+ }
219
+ console.log((" " + clr(C.blue, (p.links?.npm ?? ""))));
220
+ console.log();
221
+ }
222
+ }
223
+ catch (e) {
224
+ err(("Search failed: " + e.message));
225
+ }
226
+ }
227
+ module.exports.cmdSearch = cmdSearch;
228
+ async function cmdInfo(name, opts) {
229
+ console.log(((clr(C.cyan, "\n Fetching info for ") + clr(C.bold, name)) + " ...\n"));
230
+ try {
231
+ const info_ = await fetchJson(((REGISTRY_URL + "/") + name));
232
+ const latest = (info_["dist-tags"]?.latest ?? "unknown");
233
+ const ver = (info_.versions?.[latest] ?? { });
234
+ console.log((clr(C.bold, (" " + name)) + clr(C.gray, (" v" + latest))));
235
+ if (ver.description) {
236
+ console.log((" " + ver.description));
237
+ }
238
+ console.log();
239
+ console.log((clr(C.gray, " license: ") + (ver.license ?? "unknown")));
240
+ console.log((clr(C.gray, " author: ") + ((ver.author?.name ?? ver.author) ?? "unknown")));
241
+ const homepage = (ver.homepage ?? info_.homepage);
242
+ if (homepage) {
243
+ console.log((clr(C.gray, " home: ") + clr(C.blue, homepage)));
244
+ }
245
+ const repo = (ver.repository?.url ?? info_.repository?.url);
246
+ if (repo) {
247
+ console.log((clr(C.gray, " repo: ") + clr(C.blue, repo.replace("git+", "").replace(".git", ""))));
248
+ }
249
+ const keywords = (ver.keywords ?? []);
250
+ if ((keywords.length > 0)) {
251
+ console.log((clr(C.gray, " tags: ") + keywords.slice(0, 8).join(", ")));
252
+ }
253
+ console.log();
254
+ console.log((clr(C.gray, " Install: ") + clr(C.yellow, ("flux add " + name))));
255
+ console.log();
256
+ }
257
+ catch (e) {
258
+ err(((("Could not fetch info for " + name) + ": ") + e.message));
259
+ }
260
+ }
261
+ module.exports.cmdInfo = cmdInfo;
262
+ function cmdPublish(opts) {
263
+ const cwd = process.cwd();
264
+ const pkg = readPackage(cwd);
265
+ if (!pkg) {
266
+ err("No flux.json found. Run: flux init");
267
+ return;
268
+ }
269
+ console.log();
270
+ console.log(((clr(C.cyan, " Publishing ") + clr(C.bold, ((pkg.name + "@") + pkg.version))) + " ..."));
271
+ console.log();
272
+ info("Building package...");
273
+ info("Checking flux.json...");
274
+ if (!pkg.name) {
275
+ err("flux.json must have a name field");
276
+ return;
277
+ }
278
+ if (!pkg.version) {
279
+ err("flux.json must have a version field");
280
+ return;
281
+ }
282
+ console.log();
283
+ ok(((("Package ready: " + pkg.name) + "@") + pkg.version));
284
+ info("Run: npm publish to publish to the npm registry");
285
+ info("Run: flux publish --registry <url> for a custom registry");
286
+ console.log();
287
+ }
288
+ module.exports.cmdPublish = cmdPublish;
@@ -3,7 +3,7 @@
3
3
  function join(arr, sep) { return arr.join(sep != null ? sep : ','); }
4
4
  // ── end stdlib ──
5
5
 
6
- // Generated by Flux Transpiler v3.1.0
6
+ // Generated by Flux Transpiler v3.2.0
7
7
  "use strict";
8
8
 
9
9
  const BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
@@ -90,6 +90,18 @@ function product(arr) {
90
90
  return arr.reduce(function(a, b) { return a * b; }, 1);
91
91
  }
92
92
 
93
+ function min(arr) {
94
+ if (arguments.length > 1) return Math.min.apply(null, arguments);
95
+ return Math.min.apply(null, arr);
96
+ }
97
+
98
+ function max(arr) {
99
+ if (arguments.length > 1) return Math.max.apply(null, arguments);
100
+ return Math.max.apply(null, arr);
101
+ }
102
+
103
+ function floor(n) { return Math.floor(n); }
104
+
93
105
  function randInt(min, max) {
94
106
  return Math.floor(Math.random() * (max - min + 1)) + min;
95
107
  }
@@ -136,6 +148,8 @@ function fromEntries(entries) {
136
148
  return Object.fromEntries(entries);
137
149
  }
138
150
 
151
+ function keys(obj) { return Object.keys(obj); }
152
+
139
153
  function deepEqual(a, b) {
140
154
  return JSON.stringify(a) === JSON.stringify(b);
141
155
  }
@@ -144,6 +158,41 @@ function deepClone(v) {
144
158
  return JSON.parse(JSON.stringify(v));
145
159
  }
146
160
 
161
+ function capitalize(s) {
162
+ return s ? s[0].toUpperCase() + s.slice(1) : s;
163
+ }
164
+
165
+ function camelCase(s) {
166
+ return s.replace(/[-_\s]+(.)/g, function(_, c) { return c.toUpperCase(); }).replace(/^./, function(c) { return c.toLowerCase(); });
167
+ }
168
+
169
+ function snakeCase(s) {
170
+ return s.replace(/([A-Z])/g, function(c) { return '_' + c.toLowerCase(); }).replace(/[-\s]+/g, '_').replace(/^_/, '');
171
+ }
172
+
173
+ function kebabCase(s) {
174
+ return s.replace(/([A-Z])/g, function(c) { return '-' + c.toLowerCase(); }).replace(/[_\s]+/g, '-').replace(/^-/, '');
175
+ }
176
+
177
+ function truncate(s, len, suffix) {
178
+ suffix = suffix != null ? suffix : '...';
179
+ if (s.length <= len) return s;
180
+ var cut = len - suffix.length;
181
+ if (cut <= 0) return suffix.slice(0, len);
182
+ return s.slice(0, cut) + suffix;
183
+ }
184
+
185
+ function pad(s, len, char) {
186
+ char = char || ' ';
187
+ s = String(s);
188
+ var total = len - s.length;
189
+ if (total <= 0) return s;
190
+ var half = Math.floor(total / 2);
191
+ return char.repeat(half) + s + char.repeat(total - half);
192
+ }
193
+
194
+ function repeat(s, n) { return String(s).repeat(n); }
195
+
147
196
  function sleep(ms) {
148
197
  return new Promise(function(resolve) { setTimeout(resolve, ms); });
149
198
  }
@@ -154,7 +203,7 @@ async function retry(fn, attempts, delay) {
154
203
  for (var i = 0; i < attempts; i++) {
155
204
  try { return await fn(); } catch(e) {
156
205
  if (i === attempts - 1) throw e;
157
- await sleep(delay * Math.pow(2, i));
206
+ await new Promise(function(r) { setTimeout(r, delay * Math.pow(2, i)); });
158
207
  }
159
208
  }
160
209
  }
@@ -192,43 +241,9 @@ function curry(fn) {
192
241
  return function() { return curried.apply(this, args.concat(Array.from(arguments))); };
193
242
  };
194
243
  }
195
-
196
- function capitalize(s) {
197
- return s ? s[0].toUpperCase() + s.slice(1) : s;
198
- }
199
-
200
- function camelCase(s) {
201
- return s.replace(/[-_\s]+(.)/g, function(_, c) { return c.toUpperCase(); }).replace(/^./, function(c) { return c.toLowerCase(); });
202
- }
203
-
204
- function snakeCase(s) {
205
- return s.replace(/([A-Z])/g, function(c) { return '_' + c.toLowerCase(); }).replace(/[-\s]+/g, '_').replace(/^_/, '');
206
- }
207
-
208
- function kebabCase(s) {
209
- return s.replace(/([A-Z])/g, function(c) { return '-' + c.toLowerCase(); }).replace(/[_\s]+/g, '-').replace(/^-/, '');
210
- }
211
-
212
- function truncate(s, len, suffix) {
213
- suffix = suffix != null ? suffix : '...';
214
- if (s.length <= len) return s;
215
- // FIX: guard against suffix longer than len to avoid negative slice index
216
- var cut = len - suffix.length;
217
- if (cut <= 0) return suffix.slice(0, len);
218
- return s.slice(0, cut) + suffix;
219
- }
220
-
221
- function pad(s, len, char) {
222
- char = char || ' ';
223
- s = String(s);
224
- var total = len - s.length;
225
- if (total <= 0) return s;
226
- var half = Math.floor(total / 2);
227
- return char.repeat(half) + s + char.repeat(total - half);
228
- }
229
244
  // ── end stdlib ──
230
245
 
231
- // Generated by Flux Transpiler v3.1.0
246
+ // Generated by Flux Transpiler v3.2.0
232
247
  "use strict";
233
248
 
234
249
  const STDLIB_SYMBOLS = ["range", "zip", "enumerate", "clamp", "sum", "product", "flatten", "chunk", "unique", "groupBy", "sortBy", "pick", "omit", "deepEqual", "deepClone", "sleep", "retry", "memoize", "pipe", "compose", "partial", "curry", "capitalize", "camelCase", "snakeCase", "kebabCase", "truncate", "pad", "randInt", "sample", "shuffle", "mapValues", "filterValues", "fromEntries", "map", "filter", "reduce", "forEach", "find", "findIndex", "some", "every", "join", "sort", "flat", "flatMap", "includes"];
@@ -7,9 +7,15 @@ function filter(arr, fn) { return arr.filter(fn); }
7
7
  function join(arr, sep) { return arr.join(sep != null ? sep : ','); }
8
8
 
9
9
  function sort(arr, fn) { return arr.slice().sort(fn); }
10
+
11
+ function abs(n) { return Math.abs(n); }
12
+
13
+ function endsWith(s, suffix) { return String(s).endsWith(suffix); }
14
+
15
+ function repeat(s, n) { return String(s).repeat(n); }
10
16
  // ── end stdlib ──
11
17
 
12
- // Generated by Flux Transpiler v3.1.0
18
+ // Generated by Flux Transpiler v3.2.0
13
19
  "use strict";
14
20
 
15
21
  const Fs = require("fs");
@@ -1,4 +1,4 @@
1
- // Generated by Flux Transpiler v3.1.0
1
+ // Generated by Flux Transpiler v3.2.0
2
2
  "use strict";
3
3
 
4
4
  const { Lexer, lexerize, T } = require("./lexer");
@@ -15,9 +15,17 @@ function every(arr, fn) { return arr.every(fn); }
15
15
  function join(arr, sep) { return arr.join(sep != null ? sep : ','); }
16
16
 
17
17
  function includes(arr, val) { return arr.includes(val); }
18
+
19
+ function entries(obj) { return Object.entries(obj); }
20
+
21
+ function trim(s) { return String(s).trim(); }
22
+
23
+ function startsWith(s, prefix) { return String(s).startsWith(prefix); }
24
+
25
+ function endsWith(s, suffix) { return String(s).endsWith(suffix); }
18
26
  // ── end stdlib ──
19
27
 
20
- // Generated by Flux Transpiler v3.1.0
28
+ // Generated by Flux Transpiler v3.2.0
21
29
  "use strict";
22
30
 
23
31
  const T_ANY = Object.freeze({ kind: "any" });