@flux-lang/core 0.1.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.
- package/dist/args.d.ts +18 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +60 -0
- package/dist/args.js.map +1 -0
- package/dist/ast.d.ts +194 -0
- package/dist/ast.d.ts.map +1 -0
- package/dist/ast.js +3 -0
- package/dist/ast.js.map +1 -0
- package/dist/bin/flux.d.ts +2 -0
- package/dist/bin/flux.d.ts.map +1 -0
- package/dist/bin/flux.js +157 -0
- package/dist/bin/flux.js.map +1 -0
- package/dist/checks.d.ts +12 -0
- package/dist/checks.d.ts.map +1 -0
- package/dist/checks.js +98 -0
- package/dist/checks.js.map +1 -0
- package/dist/commands/check.d.ts +2 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +118 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/repl.d.ts +2 -0
- package/dist/commands/repl.d.ts.map +1 -0
- package/dist/commands/repl.js +37 -0
- package/dist/commands/repl.js.map +1 -0
- package/dist/fs-utils.d.ts +4 -0
- package/dist/fs-utils.d.ts.map +1 -0
- package/dist/fs-utils.js +34 -0
- package/dist/fs-utils.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/parse.d.ts +2 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +107 -0
- package/dist/parse.js.map +1 -0
- package/dist/parser.d.ts +3 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +1452 -0
- package/dist/parser.js.map +1 -0
- package/dist/runtime/kernel.d.ts +20 -0
- package/dist/runtime/kernel.d.ts.map +1 -0
- package/dist/runtime/kernel.js +356 -0
- package/dist/runtime/kernel.js.map +1 -0
- package/dist/runtime/model.d.ts +146 -0
- package/dist/runtime/model.d.ts.map +1 -0
- package/dist/runtime/model.js +3 -0
- package/dist/runtime/model.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +33 -0
package/dist/args.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface FlagMap {
|
|
2
|
+
[key: string]: string | number | boolean;
|
|
3
|
+
}
|
|
4
|
+
export interface ParsedArgs {
|
|
5
|
+
flags: FlagMap;
|
|
6
|
+
positional: string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Very small, predictable argv parser.
|
|
10
|
+
* Supports:
|
|
11
|
+
* --flag
|
|
12
|
+
* --flag=value
|
|
13
|
+
* --flag value
|
|
14
|
+
* -q (single-char flags)
|
|
15
|
+
* Everything else is treated as positional.
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseArgs(argv: string[]): ParsedArgs;
|
|
18
|
+
//# sourceMappingURL=args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,OAAO;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CAC1C;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA2CpD"}
|
package/dist/args.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// packages/cli/src/args.ts
|
|
2
|
+
/**
|
|
3
|
+
* Very small, predictable argv parser.
|
|
4
|
+
* Supports:
|
|
5
|
+
* --flag
|
|
6
|
+
* --flag=value
|
|
7
|
+
* --flag value
|
|
8
|
+
* -q (single-char flags)
|
|
9
|
+
* Everything else is treated as positional.
|
|
10
|
+
*/
|
|
11
|
+
export function parseArgs(argv) {
|
|
12
|
+
const flags = {};
|
|
13
|
+
const positional = [];
|
|
14
|
+
for (let i = 0; i < argv.length; i++) {
|
|
15
|
+
const arg = argv[i];
|
|
16
|
+
if (arg === "--") {
|
|
17
|
+
positional.push(...argv.slice(i + 1));
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
if (arg.startsWith("--")) {
|
|
21
|
+
const body = arg.slice(2);
|
|
22
|
+
const eqIdx = body.indexOf("=");
|
|
23
|
+
if (eqIdx !== -1) {
|
|
24
|
+
const key = body.slice(0, eqIdx);
|
|
25
|
+
const value = coerce(body.slice(eqIdx + 1));
|
|
26
|
+
flags[key] = value;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
const next = argv[i + 1];
|
|
30
|
+
if (next && !next.startsWith("-")) {
|
|
31
|
+
flags[body] = coerce(next);
|
|
32
|
+
i++;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
flags[body] = true;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (arg.startsWith("-") && arg.length > 1) {
|
|
41
|
+
const letters = arg.slice(1).split("");
|
|
42
|
+
for (const ch of letters) {
|
|
43
|
+
flags[ch] = true;
|
|
44
|
+
}
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
positional.push(arg);
|
|
48
|
+
}
|
|
49
|
+
return { flags, positional };
|
|
50
|
+
}
|
|
51
|
+
function coerce(raw) {
|
|
52
|
+
if (raw === "true")
|
|
53
|
+
return true;
|
|
54
|
+
if (raw === "false")
|
|
55
|
+
return false;
|
|
56
|
+
if (/^-?\d+(\.\d+)?$/.test(raw))
|
|
57
|
+
return Number(raw);
|
|
58
|
+
return raw;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=args.js.map
|
package/dist/args.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAW3B;;;;;;;;GAQG;AACH,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,KAAK,GAAY,EAAE,CAAC;IAC1B,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM;QACR,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBACjC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC5C,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAClC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC3B,CAAC,EAAE,CAAC;gBACN,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;gBACrB,CAAC;YACH,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACvC,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;gBACzB,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;YACnB,CAAC;YACD,SAAS;QACX,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,MAAM,CAAC,GAAW;IACzB,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,GAAG,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACpD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/ast.d.ts
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
export type FluxType = "int" | "float" | "bool" | "string" | "enum";
|
|
2
|
+
export interface FluxParam {
|
|
3
|
+
name: string;
|
|
4
|
+
type: FluxType;
|
|
5
|
+
min?: number | string;
|
|
6
|
+
max?: number | string;
|
|
7
|
+
initial: number | string | boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface FluxState {
|
|
10
|
+
params: FluxParam[];
|
|
11
|
+
}
|
|
12
|
+
export interface FluxMeta {
|
|
13
|
+
title?: string;
|
|
14
|
+
author?: string;
|
|
15
|
+
version: string;
|
|
16
|
+
[key: string]: string | undefined;
|
|
17
|
+
}
|
|
18
|
+
export interface PageSize {
|
|
19
|
+
width: number;
|
|
20
|
+
height: number;
|
|
21
|
+
units: string;
|
|
22
|
+
}
|
|
23
|
+
export interface PageConfig {
|
|
24
|
+
size: PageSize;
|
|
25
|
+
}
|
|
26
|
+
export type Topology = "grid" | "linear" | "graph" | "spatial";
|
|
27
|
+
export type PayloadKind = "none" | "phrase" | "audio_clip" | "image" | "video";
|
|
28
|
+
export interface BasePayload {
|
|
29
|
+
kind: PayloadKind | string;
|
|
30
|
+
}
|
|
31
|
+
export interface PhrasePayload extends BasePayload {
|
|
32
|
+
kind: "phrase";
|
|
33
|
+
instrument?: string;
|
|
34
|
+
pitches: string[];
|
|
35
|
+
durations: number[];
|
|
36
|
+
}
|
|
37
|
+
export interface AudioClipPayload extends BasePayload {
|
|
38
|
+
kind: "audio_clip";
|
|
39
|
+
start: number;
|
|
40
|
+
duration: number;
|
|
41
|
+
gain?: number;
|
|
42
|
+
}
|
|
43
|
+
export interface ImagePayload extends BasePayload {
|
|
44
|
+
kind: "image";
|
|
45
|
+
crop?: {
|
|
46
|
+
x: number;
|
|
47
|
+
y: number;
|
|
48
|
+
w: number;
|
|
49
|
+
h: number;
|
|
50
|
+
};
|
|
51
|
+
opacity?: number;
|
|
52
|
+
}
|
|
53
|
+
export interface VideoPayload extends BasePayload {
|
|
54
|
+
kind: "video";
|
|
55
|
+
start?: number;
|
|
56
|
+
end?: number;
|
|
57
|
+
loop?: boolean;
|
|
58
|
+
}
|
|
59
|
+
export type FluxPayload = BasePayload | PhrasePayload | AudioClipPayload | ImagePayload | VideoPayload | Record<string, any>;
|
|
60
|
+
export interface FluxCell {
|
|
61
|
+
id: string;
|
|
62
|
+
tags: string[];
|
|
63
|
+
content?: string;
|
|
64
|
+
mediaId?: string;
|
|
65
|
+
payload?: FluxPayload;
|
|
66
|
+
dynamic?: number;
|
|
67
|
+
density?: number;
|
|
68
|
+
salience?: number;
|
|
69
|
+
numericFields?: Record<string, number>;
|
|
70
|
+
}
|
|
71
|
+
export interface GridSize {
|
|
72
|
+
rows?: number;
|
|
73
|
+
cols?: number;
|
|
74
|
+
}
|
|
75
|
+
export interface FluxGrid {
|
|
76
|
+
name: string;
|
|
77
|
+
topology: Topology;
|
|
78
|
+
page?: number;
|
|
79
|
+
size?: GridSize;
|
|
80
|
+
cells: FluxCell[];
|
|
81
|
+
}
|
|
82
|
+
export type CanonicalEventType = "transport" | "input" | "sensor";
|
|
83
|
+
export interface FluxEvent {
|
|
84
|
+
type: string;
|
|
85
|
+
source?: string;
|
|
86
|
+
location?: any;
|
|
87
|
+
payload?: any;
|
|
88
|
+
timestamp: number;
|
|
89
|
+
}
|
|
90
|
+
export type EventsApplyPolicy = "immediate" | "deferred" | "cellImmediateParamsDeferred";
|
|
91
|
+
export type DocstepAdvanceKind = "timer" | "transport" | "ruleRequest";
|
|
92
|
+
export type TimerUnit = "s" | "sec" | "secs" | "second" | "seconds" | "ms" | "millisecond" | "milliseconds" | "m" | "min" | "mins" | "minute" | "minutes" | "h" | "hr" | "hrs" | "hour" | "hours" | "bar" | "bars" | "measure" | "measures" | "beat" | "beats" | "sub" | "subs" | "subdivision" | "subdivisions" | "tick" | "ticks";
|
|
93
|
+
export interface DocstepAdvanceTimer {
|
|
94
|
+
kind: "timer";
|
|
95
|
+
amount: number;
|
|
96
|
+
unit: TimerUnit;
|
|
97
|
+
}
|
|
98
|
+
export interface DocstepAdvanceTransport {
|
|
99
|
+
kind: "transport";
|
|
100
|
+
eventName: string;
|
|
101
|
+
}
|
|
102
|
+
export interface DocstepAdvanceRuleRequest {
|
|
103
|
+
kind: "ruleRequest";
|
|
104
|
+
name: string;
|
|
105
|
+
}
|
|
106
|
+
export type DocstepAdvanceSpec = DocstepAdvanceTimer | DocstepAdvanceTransport | DocstepAdvanceRuleRequest;
|
|
107
|
+
export interface FluxRuntimeConfig {
|
|
108
|
+
eventsApply?: EventsApplyPolicy;
|
|
109
|
+
docstepAdvance?: DocstepAdvanceSpec[];
|
|
110
|
+
}
|
|
111
|
+
export type RuleMode = "docstep" | "event" | "timer";
|
|
112
|
+
export interface RuleScope {
|
|
113
|
+
grid?: string;
|
|
114
|
+
}
|
|
115
|
+
export type BinaryOp = "==" | "!=" | "===" | "!==" | "<" | "<=" | ">" | ">=" | "+" | "-" | "*" | "/" | "and" | "or";
|
|
116
|
+
export type UnaryOp = "-" | "not";
|
|
117
|
+
export type FluxLiteralValue = number | string | boolean;
|
|
118
|
+
export interface LiteralExpr {
|
|
119
|
+
kind: "Literal";
|
|
120
|
+
value: FluxLiteralValue;
|
|
121
|
+
}
|
|
122
|
+
export interface IdentifierExpr {
|
|
123
|
+
kind: "Identifier";
|
|
124
|
+
name: string;
|
|
125
|
+
}
|
|
126
|
+
export interface MemberExpr {
|
|
127
|
+
kind: "MemberExpression";
|
|
128
|
+
object: FluxExpr;
|
|
129
|
+
property: string;
|
|
130
|
+
}
|
|
131
|
+
export interface CallExpr {
|
|
132
|
+
kind: "CallExpression";
|
|
133
|
+
callee: FluxExpr;
|
|
134
|
+
args: FluxExpr[];
|
|
135
|
+
}
|
|
136
|
+
export interface UnaryExpr {
|
|
137
|
+
kind: "UnaryExpression";
|
|
138
|
+
op: UnaryOp;
|
|
139
|
+
argument: FluxExpr;
|
|
140
|
+
}
|
|
141
|
+
export interface BinaryExpr {
|
|
142
|
+
kind: "BinaryExpression";
|
|
143
|
+
op: BinaryOp;
|
|
144
|
+
left: FluxExpr;
|
|
145
|
+
right: FluxExpr;
|
|
146
|
+
}
|
|
147
|
+
export interface NeighborsCallExpr {
|
|
148
|
+
kind: "NeighborsCallExpression";
|
|
149
|
+
namespace: "neighbors";
|
|
150
|
+
method: string;
|
|
151
|
+
args: FluxExpr[];
|
|
152
|
+
}
|
|
153
|
+
export type FluxExpr = LiteralExpr | IdentifierExpr | MemberExpr | CallExpr | UnaryExpr | BinaryExpr | NeighborsCallExpr;
|
|
154
|
+
export interface AssignmentStmt {
|
|
155
|
+
kind: "AssignmentStatement";
|
|
156
|
+
target: FluxExpr;
|
|
157
|
+
value: FluxExpr;
|
|
158
|
+
}
|
|
159
|
+
export interface LetStmt {
|
|
160
|
+
kind: "LetStatement";
|
|
161
|
+
name: string;
|
|
162
|
+
value: FluxExpr;
|
|
163
|
+
}
|
|
164
|
+
export interface AdvanceDocstepStmt {
|
|
165
|
+
kind: "AdvanceDocstepStatement";
|
|
166
|
+
}
|
|
167
|
+
export interface ExpressionStmt {
|
|
168
|
+
kind: "ExpressionStatement";
|
|
169
|
+
expr: FluxExpr;
|
|
170
|
+
}
|
|
171
|
+
export type FluxStmt = AssignmentStmt | LetStmt | AdvanceDocstepStmt | ExpressionStmt;
|
|
172
|
+
export interface RuleBranch {
|
|
173
|
+
condition: FluxExpr;
|
|
174
|
+
thenBranch: FluxStmt[];
|
|
175
|
+
}
|
|
176
|
+
export interface FluxRule {
|
|
177
|
+
name: string;
|
|
178
|
+
mode: RuleMode;
|
|
179
|
+
scope?: RuleScope;
|
|
180
|
+
onEventType?: string;
|
|
181
|
+
branches: RuleBranch[];
|
|
182
|
+
condition: FluxExpr;
|
|
183
|
+
thenBranch: FluxStmt[];
|
|
184
|
+
elseBranch?: FluxStmt[];
|
|
185
|
+
}
|
|
186
|
+
export interface FluxDocument {
|
|
187
|
+
meta: FluxMeta;
|
|
188
|
+
state: FluxState;
|
|
189
|
+
pageConfig?: PageConfig;
|
|
190
|
+
grids: FluxGrid[];
|
|
191
|
+
rules: FluxRule[];
|
|
192
|
+
runtime?: FluxRuntimeConfig;
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=ast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"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"}
|
package/dist/ast.js
ADDED
package/dist/ast.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast.js","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"AAAA,kCAAkC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flux.d.ts","sourceRoot":"","sources":["../../src/bin/flux.ts"],"names":[],"mappings":""}
|
package/dist/bin/flux.js
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
!/usr/bin / env;
|
|
2
|
+
node;
|
|
3
|
+
import { FLUX_CLI_VERSION } from "../version.js";
|
|
4
|
+
import { runParseCommand } from "../commands/parse.js";
|
|
5
|
+
import { runCheckCommand } from "../commands/check.js";
|
|
6
|
+
import { runRepl } from "../commands/repl.js";
|
|
7
|
+
function printGlobalHelp() {
|
|
8
|
+
// Keep in sync with the spec we agreed on
|
|
9
|
+
// (you can factor this into a template if needed)
|
|
10
|
+
const text = `
|
|
11
|
+
Flux language CLI v0.1
|
|
12
|
+
|
|
13
|
+
Usage:
|
|
14
|
+
flux <command> [options]
|
|
15
|
+
|
|
16
|
+
Commands:
|
|
17
|
+
parse Parse one or more .flux files and print their IR
|
|
18
|
+
check Parse and statically check .flux files
|
|
19
|
+
repl Interactive Flux scratchpad (paste snippets, see IR)
|
|
20
|
+
help Show help for a command
|
|
21
|
+
|
|
22
|
+
Global options:
|
|
23
|
+
-h, --help Show this help and exit
|
|
24
|
+
-V, --version Show version and exit
|
|
25
|
+
--color Force colored output
|
|
26
|
+
--no-color Disable colored output
|
|
27
|
+
|
|
28
|
+
Run \`flux help <command>\` for more details on a specific command.
|
|
29
|
+
If run with no arguments, \`flux\` starts the interactive \`repl\` mode.
|
|
30
|
+
`.trimStart();
|
|
31
|
+
// eslint-disable-next-line no-console
|
|
32
|
+
console.log(text);
|
|
33
|
+
}
|
|
34
|
+
function printCommandHelp(command) {
|
|
35
|
+
switch (command) {
|
|
36
|
+
case "parse": {
|
|
37
|
+
const text = `
|
|
38
|
+
Usage:
|
|
39
|
+
flux parse [options] <file...>
|
|
40
|
+
|
|
41
|
+
Description:
|
|
42
|
+
Parse one or more Flux source files and print their canonical IR.
|
|
43
|
+
|
|
44
|
+
For a single file, the default output is pretty-printed JSON to stdout.
|
|
45
|
+
For multiple files, the default output is NDJSON:
|
|
46
|
+
{"file":"path/to/file1.flux","doc":{...}}
|
|
47
|
+
{"file":"path/to/file2.flux","doc":{...}}
|
|
48
|
+
|
|
49
|
+
Options:
|
|
50
|
+
-o, --output <path> Write output to a file instead of stdout
|
|
51
|
+
--compact Emit compact JSON (no pretty-printing)
|
|
52
|
+
--ndjson Force NDJSON output even for a single file
|
|
53
|
+
--summary Print a human-readable summary instead of JSON
|
|
54
|
+
--stdin Read source from stdin (file list is ignored)
|
|
55
|
+
`.trimStart();
|
|
56
|
+
console.log(text);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
case "check": {
|
|
60
|
+
const text = `
|
|
61
|
+
Usage:
|
|
62
|
+
flux check [options] [paths...]
|
|
63
|
+
|
|
64
|
+
Description:
|
|
65
|
+
Parse and statically check Flux source files.
|
|
66
|
+
|
|
67
|
+
By default, checks all *.flux files under the given paths.
|
|
68
|
+
If no paths are provided, '.' is assumed.
|
|
69
|
+
|
|
70
|
+
Options:
|
|
71
|
+
-q, --quiet Suppress normal output; use exit code only
|
|
72
|
+
--json Emit machine-readable diagnostics as JSON
|
|
73
|
+
--max-errors N Stop after reporting N errors (default: unlimited)
|
|
74
|
+
--no-recursive Do not recurse into subdirectories
|
|
75
|
+
--stdin Read a single Flux source from stdin
|
|
76
|
+
|
|
77
|
+
Exit codes:
|
|
78
|
+
0 All files parsed and checked successfully
|
|
79
|
+
1 Parse/check errors in at least one file
|
|
80
|
+
2 Internal CLI error
|
|
81
|
+
`.trimStart();
|
|
82
|
+
console.log(text);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
case "repl": {
|
|
86
|
+
const text = `
|
|
87
|
+
Usage:
|
|
88
|
+
flux repl
|
|
89
|
+
|
|
90
|
+
Description:
|
|
91
|
+
Interactive Flux scratchpad.
|
|
92
|
+
|
|
93
|
+
- Paste or type a Flux document and press Ctrl+D (EOF) to parse.
|
|
94
|
+
- On success, prints a summary and optionally the IR.
|
|
95
|
+
- On failure, prints the parse error with location.
|
|
96
|
+
|
|
97
|
+
Notes:
|
|
98
|
+
Running \`flux\` with no arguments is equivalent to \`flux repl\`.
|
|
99
|
+
`.trimStart();
|
|
100
|
+
console.log(text);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
default:
|
|
104
|
+
console.error(`Unknown command '${command}' for 'flux help'.`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async function main() {
|
|
108
|
+
const [, , ...argv] = process.argv;
|
|
109
|
+
if (argv.length === 0) {
|
|
110
|
+
await runRepl();
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const first = argv[0];
|
|
114
|
+
if (first === "-h" || first === "--help") {
|
|
115
|
+
printGlobalHelp();
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (first === "-V" || first === "--version") {
|
|
119
|
+
console.log(`flux v${FLUX_CLI_VERSION}`);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (first === "help") {
|
|
123
|
+
const sub = argv[1];
|
|
124
|
+
if (!sub) {
|
|
125
|
+
printGlobalHelp();
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
printCommandHelp(sub);
|
|
129
|
+
}
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const command = first;
|
|
133
|
+
const commandArgs = argv.slice(1);
|
|
134
|
+
try {
|
|
135
|
+
switch (command) {
|
|
136
|
+
case "parse":
|
|
137
|
+
await runParseCommand(commandArgs);
|
|
138
|
+
break;
|
|
139
|
+
case "check":
|
|
140
|
+
await runCheckCommand(commandArgs);
|
|
141
|
+
break;
|
|
142
|
+
case "repl":
|
|
143
|
+
await runRepl();
|
|
144
|
+
break;
|
|
145
|
+
default:
|
|
146
|
+
console.error(`Unknown command '${command}'.`);
|
|
147
|
+
printGlobalHelp();
|
|
148
|
+
process.exitCode = 1;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
console.error(`flux: internal error: ${err.message}`);
|
|
153
|
+
process.exitCode = 2;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
void main();
|
|
157
|
+
//# sourceMappingURL=flux.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flux.js","sourceRoot":"","sources":["../../src/bin/flux.ts"],"names":[],"mappings":"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"}
|
package/dist/checks.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { FluxDocument } from "./ast.js";
|
|
2
|
+
/**
|
|
3
|
+
* Run basic static checks on a FluxDocument.
|
|
4
|
+
*
|
|
5
|
+
* This is used by the CLI and can also be consumed by editor integrations.
|
|
6
|
+
*
|
|
7
|
+
* @param file - A label for the source (path or "<buffer>").
|
|
8
|
+
* @param doc - Parsed FluxDocument AST.
|
|
9
|
+
* @returns An array of human-readable diagnostic strings.
|
|
10
|
+
*/
|
|
11
|
+
export declare function checkDocument(file: string, doc: FluxDocument): string[];
|
|
12
|
+
//# sourceMappingURL=checks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../src/checks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAgC,MAAM,UAAU,CAAC;AAE3E;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,MAAM,EAAE,CA6BvE"}
|
package/dist/checks.js
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run basic static checks on a FluxDocument.
|
|
3
|
+
*
|
|
4
|
+
* This is used by the CLI and can also be consumed by editor integrations.
|
|
5
|
+
*
|
|
6
|
+
* @param file - A label for the source (path or "<buffer>").
|
|
7
|
+
* @param doc - Parsed FluxDocument AST.
|
|
8
|
+
* @returns An array of human-readable diagnostic strings.
|
|
9
|
+
*/
|
|
10
|
+
export function checkDocument(file, doc) {
|
|
11
|
+
const errors = [];
|
|
12
|
+
const gridNames = new Set(doc.grids.map((g) => g.name));
|
|
13
|
+
for (const rule of doc.rules ?? []) {
|
|
14
|
+
// grid=foo scope must refer to an existing grid
|
|
15
|
+
if (rule.scope?.grid && !gridNames.has(rule.scope.grid)) {
|
|
16
|
+
errors.push(`${file}:0:0: Check error: Rule '${rule.name}' references unknown grid '${rule.scope.grid}'`);
|
|
17
|
+
}
|
|
18
|
+
// Expression-level checks (neighbors.* etc.)
|
|
19
|
+
checkRuleExpressions(file, rule, errors);
|
|
20
|
+
}
|
|
21
|
+
// Runtime timers sanity check
|
|
22
|
+
if (doc.runtime?.docstepAdvance) {
|
|
23
|
+
for (const spec of doc.runtime.docstepAdvance) {
|
|
24
|
+
if (spec.kind === "timer" && spec.amount <= 0) {
|
|
25
|
+
errors.push(`${file}:0:0: Check error: timer(...) amount must be positive (found ${spec.amount})`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return errors;
|
|
30
|
+
}
|
|
31
|
+
function checkRuleExpressions(file, rule, errors) {
|
|
32
|
+
if (rule.condition) {
|
|
33
|
+
checkExpr(rule.condition, file, errors);
|
|
34
|
+
}
|
|
35
|
+
for (const stmt of rule.thenBranch ?? []) {
|
|
36
|
+
checkStmt(stmt, file, errors);
|
|
37
|
+
}
|
|
38
|
+
if (rule.elseBranch) {
|
|
39
|
+
for (const stmt of rule.elseBranch) {
|
|
40
|
+
checkStmt(stmt, file, errors);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// v0.1: some rules may have desugared branches (else-when chains)
|
|
44
|
+
const anyRule = rule;
|
|
45
|
+
if (Array.isArray(anyRule.branches)) {
|
|
46
|
+
for (const branch of anyRule.branches) {
|
|
47
|
+
checkExpr(branch.condition, file, errors);
|
|
48
|
+
for (const stmt of branch.thenBranch) {
|
|
49
|
+
checkStmt(stmt, file, errors);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function checkExpr(expr, file, errors) {
|
|
55
|
+
switch (expr.kind) {
|
|
56
|
+
case "NeighborsCallExpression":
|
|
57
|
+
if (expr.method !== "all" && expr.method !== "orth") {
|
|
58
|
+
errors.push(`${file}:0:0: Check error: Unsupported neighbors method '${expr.method}'`);
|
|
59
|
+
}
|
|
60
|
+
for (const arg of expr.args) {
|
|
61
|
+
checkExpr(arg, file, errors);
|
|
62
|
+
}
|
|
63
|
+
break;
|
|
64
|
+
case "BinaryExpression":
|
|
65
|
+
checkExpr(expr.left, file, errors);
|
|
66
|
+
checkExpr(expr.right, file, errors);
|
|
67
|
+
break;
|
|
68
|
+
case "UnaryExpression":
|
|
69
|
+
checkExpr(expr.argument, file, errors);
|
|
70
|
+
break;
|
|
71
|
+
case "MemberExpression":
|
|
72
|
+
checkExpr(expr.object, file, errors);
|
|
73
|
+
break;
|
|
74
|
+
case "CallExpression":
|
|
75
|
+
checkExpr(expr.callee, file, errors);
|
|
76
|
+
for (const arg of expr.args) {
|
|
77
|
+
checkExpr(arg, file, errors);
|
|
78
|
+
}
|
|
79
|
+
break;
|
|
80
|
+
default:
|
|
81
|
+
// Literals, Identifiers, etc. are fine.
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function checkStmt(stmt, file, errors) {
|
|
86
|
+
switch (stmt.kind) {
|
|
87
|
+
case "AssignmentStatement":
|
|
88
|
+
checkExpr(stmt.value, file, errors);
|
|
89
|
+
break;
|
|
90
|
+
case "LetStatement":
|
|
91
|
+
checkExpr(stmt.value, file, errors);
|
|
92
|
+
break;
|
|
93
|
+
default:
|
|
94
|
+
// AdvanceDocstepStatement, ExpressionStatement, etc. — nothing to check yet.
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checks.js","sourceRoot":"","sources":["../src/checks.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,GAAiB;IACzD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAExD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QACjC,gDAAgD;QAChD,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACtD,MAAM,CAAC,IAAI,CACP,GAAG,IAAI,4BAA4B,IAAI,CAAC,IAAI,8BAA8B,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAC/F,CAAC;QACN,CAAC;QAED,6CAA6C;QAC7C,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,8BAA8B;IAC9B,IAAI,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC;QAC9B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YAC5C,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,CACP,GAAG,IAAI,gEAAgE,IAAI,CAAC,MAAM,GAAG,CACxF,CAAC;YACN,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAS,oBAAoB,CACzB,IAAY,EACZ,IAAc,EACd,MAAgB;IAEhB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;QACvC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACjC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAClC,CAAC;IACL,CAAC;IAED,kEAAkE;IAClE,MAAM,OAAO,GAAG,IAAW,CAAC;IAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,QAG1B,EAAE,CAAC;YACF,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAC1C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACnC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAClC,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CACd,IAAc,EACd,IAAY,EACZ,MAAgB;IAEhB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,yBAAyB;YAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAClD,MAAM,CAAC,IAAI,CACP,GAAG,IAAI,oDAAoD,IAAI,CAAC,MAAM,GAAG,CAC5E,CAAC;YACN,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC1B,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACjC,CAAC;YACD,MAAM;QAEV,KAAK,kBAAkB;YACnB,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACnC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACpC,MAAM;QAEV,KAAK,iBAAiB;YAClB,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACvC,MAAM;QAEV,KAAK,kBAAkB;YACnB,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACrC,MAAM;QAEV,KAAK,gBAAgB;YACjB,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACrC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC1B,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACjC,CAAC;YACD,MAAM;QAEV;YACI,wCAAwC;YACxC,MAAM;IACd,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CACd,IAAc,EACd,IAAY,EACZ,MAAgB;IAEhB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,qBAAqB;YACtB,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACpC,MAAM;QACV,KAAK,cAAc;YACf,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACpC,MAAM;QACV;YACI,6EAA6E;YAC7E,MAAM;IACd,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAwBA,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDnE"}
|