functionalscript 0.17.0 → 0.19.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/fs/asn.1/module.f.js +7 -8
- package/fs/asn.1/test.f.js +11 -12
- package/fs/ci/common/module.f.d.ts +4 -5
- package/fs/ci/common/module.f.js +4 -4
- package/fs/ci/config/module.f.d.ts +5 -5
- package/fs/ci/config/module.f.js +5 -5
- package/fs/ci/test.f.js +2 -4
- package/fs/crypto/sign/module.f.js +3 -3
- package/fs/dev/module.f.d.ts +3 -3
- package/fs/dev/module.f.js +12 -9
- package/fs/dev/tf/module.d.ts +1 -1
- package/fs/dev/tf/module.f.d.ts +76 -7
- package/fs/dev/tf/module.f.js +166 -87
- package/fs/dev/tf/module.js +3 -53
- package/fs/dev/tf/scenarios/all.d.ts +1 -0
- package/fs/dev/tf/scenarios/all.js +3 -0
- package/fs/dev/tf/scenarios/fail.fail.f.d.ts +1 -0
- package/fs/dev/tf/scenarios/fail.fail.f.js +1 -0
- package/fs/dev/tf/scenarios/return-value.pass.f.d.ts +1 -0
- package/fs/dev/tf/scenarios/return-value.pass.f.js +2 -0
- package/fs/dev/tf/scenarios/throw.pass.f.d.ts +6 -0
- package/fs/dev/tf/scenarios/throw.pass.f.js +3 -0
- package/fs/dev/tf/test.f.d.ts +21 -20
- package/fs/dev/tf/test.f.js +254 -31
- package/fs/djs/module.f.d.ts +2 -2
- package/fs/djs/module.f.js +8 -5
- package/fs/djs/test.f.js +5 -6
- package/fs/djs/tokenizer-new/test.f.js +126 -78
- package/fs/djs/transpiler/module.f.js +2 -2
- package/fs/djs/transpiler/test.f.js +11 -12
- package/fs/fjs/module.f.d.ts +2 -7
- package/fs/fjs/module.f.js +16 -22
- package/fs/fjs/module.js +2 -2
- package/fs/io/module.d.ts +3 -3
- package/fs/io/module.f.d.ts +9 -2
- package/fs/io/module.f.js +13 -3
- package/fs/io/module.js +68 -17
- package/fs/path/module.f.d.ts +6 -0
- package/fs/path/module.f.js +6 -0
- package/fs/path/test.f.d.ts +3 -5
- package/fs/path/test.f.js +67 -49
- package/fs/sul/id/module.f.js +3 -4
- package/fs/sul/level/literal/module.f.js +3 -3
- package/fs/text/sgr/module.f.d.ts +9 -1
- package/fs/text/sgr/module.f.js +16 -5
- package/fs/text/sgr/test.f.js +16 -1
- package/fs/types/bit_vec/module.f.d.ts +9 -4
- package/fs/types/bit_vec/module.f.js +7 -9
- package/fs/types/btree/remove/module.f.d.ts +1 -1
- package/fs/types/btree/remove/module.f.js +7 -2
- package/fs/types/btree/set/module.f.d.ts +1 -1
- package/fs/types/btree/set/module.f.js +7 -2
- package/fs/types/btree/types/module.f.d.ts +1 -0
- package/fs/types/btree/types/module.f.js +1 -1
- package/fs/types/effects/node/module.f.d.ts +30 -17
- package/fs/types/effects/node/module.f.js +21 -2
- package/fs/types/effects/node/test.f.js +8 -5
- package/fs/types/effects/node/virtual/module.f.d.ts +12 -2
- package/fs/types/effects/node/virtual/module.f.js +31 -17
- package/fs/types/function/compare/module.f.d.ts +12 -0
- package/fs/types/function/compare/module.f.js +33 -0
- package/fs/types/function/operator/test.f.d.ts +10 -0
- package/fs/types/function/operator/test.f.js +81 -0
- package/fs/types/nullable/test.f.js +10 -1
- package/fs/types/range_map/module.f.js +3 -18
- package/fs/types/result/module.f.d.ts +4 -0
- package/fs/types/result/module.f.js +4 -0
- package/fs/types/result/test.f.d.ts +2 -4
- package/fs/types/result/test.f.js +24 -16
- package/fs/types/rtti/common/module.f.d.ts +10 -1
- package/fs/types/rtti/common/module.f.js +7 -2
- package/fs/types/rtti/parse/module.f.js +35 -46
- package/fs/types/rtti/validate/module.f.js +9 -12
- package/fs/types/sorted_list/module.f.d.ts +1 -2
- package/fs/types/sorted_list/module.f.js +8 -21
- package/fs/types/sorted_set/module.f.d.ts +1 -3
- package/fs/types/ts/test.f.d.ts +18 -0
- package/fs/types/ts/test.f.js +111 -0
- package/fs/types/uint8array/module.f.js +7 -1
- package/fs/types/uint8array/test.f.d.ts +1 -0
- package/fs/types/uint8array/test.f.js +5 -1
- package/package.json +4 -4
package/fs/dev/tf/module.f.js
CHANGED
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
6
|
+
import { reset, fgGreen, fgRed, bold, csiWrite } from "../../text/sgr/module.f.js";
|
|
7
|
+
import { all, sandbox, test } from "../../types/effects/node/module.f.js";
|
|
8
|
+
import { pure, do_ } from "../../types/effects/module.f.js";
|
|
9
|
+
import { loadModuleMap } from "../module.f.js";
|
|
10
|
+
import { invert } from "../../types/result/module.f.js";
|
|
9
11
|
export const isTest = (s) => s.endsWith('test.f.js') || s.endsWith('test.f.ts');
|
|
10
12
|
const addPass = (delta) => (ts) => ({ ...ts, time: ts.time + delta, pass: ts.pass + 1 });
|
|
11
13
|
const addFail = (delta) => (ts) => ({ ...ts, time: ts.time + delta, fail: ts.fail + 1 });
|
|
@@ -18,24 +20,12 @@ const timeFormat = (a) => {
|
|
|
18
20
|
const e = x.substring(s);
|
|
19
21
|
return `${b}.${e} ms`;
|
|
20
22
|
};
|
|
21
|
-
export const parseTestSet = (
|
|
23
|
+
export const parseTestSet = (throws, x) => {
|
|
22
24
|
switch (typeof x) {
|
|
23
25
|
case 'function': {
|
|
24
26
|
if (x.length === 0) {
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
return xt;
|
|
28
|
-
}
|
|
29
|
-
// Pass-on-throw: the test passes if it throws. Triggered when the
|
|
30
|
-
// enclosing tree node is named 'throw' (so any function reference
|
|
31
|
-
// works, not only inline ones whose inferred name is 'throw').
|
|
32
|
-
return () => {
|
|
33
|
-
const { result: [tag, value] } = sandbox(xt);
|
|
34
|
-
if (tag === 'ok') {
|
|
35
|
-
throw value;
|
|
36
|
-
}
|
|
37
|
-
return value;
|
|
38
|
-
};
|
|
27
|
+
const fn = x;
|
|
28
|
+
return { fn, throws: throws || fn.name === 'throw' };
|
|
39
29
|
}
|
|
40
30
|
break;
|
|
41
31
|
}
|
|
@@ -48,77 +38,166 @@ export const parseTestSet = (sandbox) => (throws) => (x) => {
|
|
|
48
38
|
}
|
|
49
39
|
return [];
|
|
50
40
|
};
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
};
|
|
95
|
-
return ts => {
|
|
96
|
-
if (isTest(k)) {
|
|
97
|
-
log(`testing ${k}`);
|
|
98
|
-
ts = test('| ')(false)(v.default)(ts);
|
|
99
|
-
// Non-default exports are walked as a sibling test group so
|
|
100
|
-
// a test file can spread its tests across multiple named
|
|
101
|
-
// exports (see issue 27 in `issues/README.md`). Skip exports
|
|
102
|
-
// that parseTestSet would treat as empty (constants, types,
|
|
103
|
-
// non-test helpers) to avoid noisy empty entries in output.
|
|
104
|
-
const others = Object.fromEntries(Object.entries(v).filter(([key, val]) => key !== 'default' && ((typeof val === 'function' && val.length === 0) ||
|
|
105
|
-
(typeof val === 'object' && val !== null))));
|
|
106
|
-
if (Object.keys(others).length !== 0) {
|
|
107
|
-
ts = test('| ')(false)(others)(ts);
|
|
41
|
+
/**
|
|
42
|
+
* Recursively collects all leaf tests reachable from `v` as `[path, entry]`
|
|
43
|
+
* pairs, without running anything. Return-value sub-trees are not walked
|
|
44
|
+
* (that requires execution); only the static object/array/function structure
|
|
45
|
+
* is traversed.
|
|
46
|
+
*/
|
|
47
|
+
export const collectTests = (path, throws, v) => {
|
|
48
|
+
const set = parseTestSet(throws, v);
|
|
49
|
+
if (set instanceof Array) {
|
|
50
|
+
return set.flatMap(([ck, cv]) => collectTests([...path, ck], throws || ck === 'throw', cv));
|
|
51
|
+
}
|
|
52
|
+
return [[path, set]];
|
|
53
|
+
};
|
|
54
|
+
export const registerModule = (ctx, k, v) => {
|
|
55
|
+
const registerOne = (ctx, [path, { fn, throws }]) => test(ctx, fmtImport(k, path), throws, (t) => {
|
|
56
|
+
if (throws) {
|
|
57
|
+
fn();
|
|
58
|
+
return pure(undefined);
|
|
59
|
+
}
|
|
60
|
+
const r = fn();
|
|
61
|
+
const sub = collectTests([...path, null], false, r);
|
|
62
|
+
if (sub.length === 0) {
|
|
63
|
+
return pure(undefined);
|
|
64
|
+
}
|
|
65
|
+
return all(...sub.map(e => registerOne(t, e))).step(() => pure(undefined));
|
|
66
|
+
});
|
|
67
|
+
const tests = collectTests([], false, v);
|
|
68
|
+
if (tests.length === 0) {
|
|
69
|
+
return pure(undefined);
|
|
70
|
+
}
|
|
71
|
+
return all(...tests.map(e => registerOne(ctx, e))).step(() => pure(undefined));
|
|
72
|
+
};
|
|
73
|
+
const mergeState = (a, b) => ({ time: a.time + b.time, pass: a.pass + b.pass, fail: a.fail + b.fail });
|
|
74
|
+
const zero = { time: 0, pass: 0, fail: 0 };
|
|
75
|
+
const runModule = ({ result, test }) => (k, v) => (ts) => {
|
|
76
|
+
const one = ([testPath, set]) => test(k, testPath, set)
|
|
77
|
+
.step(sr => {
|
|
78
|
+
const { result: [s, r], duration } = sr;
|
|
79
|
+
return result(k, testPath, sr)
|
|
80
|
+
.step(() => {
|
|
81
|
+
if (s === 'ok') {
|
|
82
|
+
if (set.throws) {
|
|
83
|
+
return pure(addPass(duration)(zero));
|
|
108
84
|
}
|
|
85
|
+
// Walk return-value sub-tree; null marks the call boundary so
|
|
86
|
+
// paths render as e.g. `outer().inner`. throws resets to false.
|
|
87
|
+
return walk([...testPath, null], false, r)
|
|
88
|
+
.step(sub => pure(mergeState(addPass(duration)(zero), sub)));
|
|
109
89
|
}
|
|
110
|
-
return
|
|
111
|
-
};
|
|
90
|
+
return pure(addFail(duration)(zero));
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
const walk = (path, throws, v) => {
|
|
94
|
+
const effects = collectTests(path, throws, v).map(one);
|
|
95
|
+
return all(...effects)
|
|
96
|
+
.step(states => pure(states.reduce(mergeState, zero)));
|
|
112
97
|
};
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
98
|
+
return walk([], false, v)
|
|
99
|
+
.step(delta => pure(mergeState(ts, delta)));
|
|
100
|
+
};
|
|
101
|
+
const { entries } = Object;
|
|
102
|
+
export const runModuleMap = (reporter) => (moduleMap) => {
|
|
103
|
+
const { summary } = reporter;
|
|
104
|
+
const modules = entries(moduleMap).filter(([k]) => isTest(k));
|
|
105
|
+
return modules.reduce((acc, [k, v]) => acc.step(runModule(reporter)(k, v)), pure({ time: 0, pass: 0, fail: 0 }))
|
|
106
|
+
.step(ts => summary(ts.pass, ts.fail, ts.time)
|
|
107
|
+
.step(() => pure(ts.fail !== 0 ? 1 : 0)));
|
|
108
|
+
};
|
|
109
|
+
export const testAll = (reporter) => options => loadModuleMap(options.env).step(runModuleMap(reporter));
|
|
110
|
+
export const registerModuleMap = (ctx, moduleMap) => {
|
|
111
|
+
const modules = entries(moduleMap).filter(([k]) => isTest(k));
|
|
112
|
+
if (modules.length === 0) {
|
|
113
|
+
return pure(undefined);
|
|
114
|
+
}
|
|
115
|
+
return all(...modules.map(([k, v]) => registerModule(ctx, k, v))).step(() => pure(undefined));
|
|
119
116
|
};
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
117
|
+
const isAlpha = (c) => (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c === '_' || c === '$';
|
|
118
|
+
const isDigit = (c) => c >= '0' && c <= '9';
|
|
119
|
+
export const isInteger = (s) => s.length > 0 && [...s].every(isDigit) && (s === '0' || s[0] !== '0');
|
|
120
|
+
export const isIdentifier = (s) => s.length > 0 && isAlpha(s[0]) && [...s.slice(1)].every(c => isAlpha(c) || isDigit(c));
|
|
121
|
+
const fmtKey = (k) => k === null ? '()'
|
|
122
|
+
: isInteger(k) ? `[${k}]`
|
|
123
|
+
: isIdentifier(k) ? `.${k}`
|
|
124
|
+
: `[${JSON.stringify(k)}]`;
|
|
125
|
+
/**
|
|
126
|
+
* Renders a key chain as a JS property-access expression: identifier keys use
|
|
127
|
+
* dot notation, integer keys use `[N]`, other strings use `["key"]`, and `null`
|
|
128
|
+
* emits `()` to mark a function-call boundary.
|
|
129
|
+
* E.g. `['math', 'add']` → `.math.add`, `['outer', null, 'inner']` → `.outer().inner`.
|
|
130
|
+
*/
|
|
131
|
+
export const fmtPath = (path) => path.reduce((acc, k) => acc + fmtKey(k), '');
|
|
132
|
+
/**
|
|
133
|
+
* Formats a fully-qualified test identifier as a JS-like expression, e.g.
|
|
134
|
+
* `import("./math.test.f.ts").add()` or `import("./a.test.f.ts").users[3].name()`.
|
|
135
|
+
* Self-contained per line — suitable for parallel output and as a CLI filter argument.
|
|
136
|
+
*/
|
|
137
|
+
export const fmtImport = (file, path) => `import(${JSON.stringify(file)})${fmtPath(path)}()`;
|
|
138
|
+
/**
|
|
139
|
+
* Renders a key chain for terminal output: `| ` per level of depth, followed
|
|
140
|
+
* by the last segment formatted as a bare integer, a bare identifier, or a
|
|
141
|
+
* JSON-quoted string. E.g. `['math', 'add']` → `| | add`,
|
|
142
|
+
* `['a', '0']` → `| | 0`, `['x', 'hello world']` → `| | "hello world"`.
|
|
143
|
+
*/
|
|
144
|
+
export const fmtTerm = (path) => {
|
|
145
|
+
const keys = path.flatMap(k => k !== null ? [k] : []);
|
|
146
|
+
const indent = '| '.repeat(keys.length);
|
|
147
|
+
if (keys.length === 0) {
|
|
148
|
+
return `${indent}()`;
|
|
149
|
+
}
|
|
150
|
+
const last = keys[keys.length - 1];
|
|
151
|
+
return `${indent}${isInteger(last) || isIdentifier(last) ? last : JSON.stringify(last)}`;
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* Percent-encodes characters that GitHub workflow-command property values
|
|
155
|
+
* treat as separators (`%`, `:`, `,`) plus newlines.
|
|
156
|
+
* https://docs.github.com/en/actions/learn-github-actions/workflow-commands-for-github-actions
|
|
157
|
+
*/
|
|
158
|
+
export const ghEscape = (s) => s.replaceAll('%', '%25')
|
|
159
|
+
.replaceAll(':', '%3A')
|
|
160
|
+
.replaceAll(',', '%2C')
|
|
161
|
+
.replaceAll('\r', '%0D')
|
|
162
|
+
.replaceAll('\n', '%0A');
|
|
163
|
+
export const defaultTest = (file, path, { fn, throws }) => sandbox(fn)
|
|
164
|
+
.step(r => pure(throws ? { ...r, result: invert(r.result) } : r));
|
|
165
|
+
const fmtResultLine = (file, path, color, label, duration) => `${fmtImport(file, path)}: ${color}${label}${reset}, ${timeFormat(duration)}`;
|
|
166
|
+
/**
|
|
167
|
+
* The terminal/GitHub reporter used by `fjs t`. Output goes through
|
|
168
|
+
* `csiWrite`, so ANSI styles are stripped on non-TTY streams. When
|
|
169
|
+
* `GITHUB_ACTION` is set, failures are emitted as `::error` workflow
|
|
170
|
+
* annotations instead of colored lines. Exported as a factory so the
|
|
171
|
+
* GitHub format path can be exercised directly from tests.
|
|
172
|
+
*/
|
|
173
|
+
export const defaultReporter = (options) => {
|
|
174
|
+
const write = csiWrite(options);
|
|
175
|
+
const line = (w) => {
|
|
176
|
+
const x = write(w);
|
|
177
|
+
return (s) => x(s + '\n');
|
|
178
|
+
};
|
|
179
|
+
const csiLog = line('stdout');
|
|
180
|
+
const csiError = line('stderr');
|
|
181
|
+
const isGitHub = options.env['GITHUB_ACTION'] !== undefined;
|
|
182
|
+
return {
|
|
183
|
+
// https://github.com/OndraM/ci-detector/blob/main/src/Ci/GitHubActions.php
|
|
184
|
+
result: (file, path, { result: [s, v], duration }) => s === 'ok'
|
|
185
|
+
? csiLog(fmtResultLine(file, path, fgGreen, 'ok', duration))
|
|
186
|
+
: isGitHub
|
|
187
|
+
? csiError(`::error file=${file},line=1,title=${ghEscape(fmtImport(file, path))}::${ghEscape(String(v))}`)
|
|
188
|
+
: csiError(fmtResultLine(file, path, fgRed, 'error', duration))
|
|
189
|
+
.step(() => csiError(`${fgRed}${v}${reset}`)),
|
|
190
|
+
summary: (pass, fail, time) => {
|
|
191
|
+
const fgFail = fail === 0 ? fgGreen : fgRed;
|
|
192
|
+
return csiLog(`${bold}Number of tests: pass: ${fgGreen}${pass}${reset}${bold}, fail: ${fgFail}${fail}${reset}${bold}, total: ${pass + fail}${reset}`)
|
|
193
|
+
.step(() => csiLog(`${bold}Time: ${timeFormat(time)}${reset}`));
|
|
194
|
+
},
|
|
195
|
+
test: defaultTest,
|
|
196
|
+
};
|
|
123
197
|
};
|
|
124
|
-
export const main =
|
|
198
|
+
export const main = options => testAll(defaultReporter(options))(options);
|
|
199
|
+
export const register = o => loadModuleMap(o.env)
|
|
200
|
+
.step(m => registerModuleMap(o.engine === 'bun' ? o.bunTestContext :
|
|
201
|
+
o.engine === 'playwright' ? o.playwrightTestContext :
|
|
202
|
+
o.testContext, m))
|
|
203
|
+
.step(() => pure(0));
|
package/fs/dev/tf/module.js
CHANGED
|
@@ -1,54 +1,4 @@
|
|
|
1
1
|
import { io } from "../../io/module.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
import { asyncImport } from "../../io/module.js";
|
|
6
|
-
import { fromIo } from "../../io/module.f.js";
|
|
7
|
-
const isBun = typeof Bun !== 'undefined';
|
|
8
|
-
const isPlaywright = typeof process !== 'undefined' && process?.env?.PLAYWRIGHT_TEST !== undefined;
|
|
9
|
-
const createFramework = (fw) => (prefix, f) => fw.test(prefix, t => f((name, v) => t.test(name, v)));
|
|
10
|
-
// Bun doesn't support nested tests yet.
|
|
11
|
-
const createBunFramework = (fw) => (prefix, f) => f((name, v) => fw.test(`${prefix}: ${name}`, v));
|
|
12
|
-
const createPlaywrightFramework = async () => {
|
|
13
|
-
const pwTest = (await asyncImport('@playwright/test')).test;
|
|
14
|
-
return (prefix, f) => f((name, v) => pwTest(`${prefix}: ${name}`, v));
|
|
15
|
-
};
|
|
16
|
-
const framework = isPlaywright ? await createPlaywrightFramework() :
|
|
17
|
-
isBun ? createBunFramework(nodeTest) :
|
|
18
|
-
createFramework(nodeTest);
|
|
19
|
-
const parse = parseTestSet(io.sandbox);
|
|
20
|
-
const scanModule = (x) => async (subTestRunner) => {
|
|
21
|
-
let subTests = [x];
|
|
22
|
-
while (true) {
|
|
23
|
-
const [first, ...rest] = subTests;
|
|
24
|
-
if (first === undefined) {
|
|
25
|
-
break;
|
|
26
|
-
}
|
|
27
|
-
subTests = rest;
|
|
28
|
-
//
|
|
29
|
-
const [name, value, throws] = first;
|
|
30
|
-
const set = parse(throws)(value);
|
|
31
|
-
if (typeof set === 'function') {
|
|
32
|
-
await subTestRunner(name, () => {
|
|
33
|
-
const r = set();
|
|
34
|
-
// The result of a function is walked as a fresh sub-tree;
|
|
35
|
-
// the parent's `throws` flag does not propagate into it.
|
|
36
|
-
subTests = [...subTests, [`${name}()`, r, false]];
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
for (const [j, y] of set) {
|
|
41
|
-
const pr = `${name}/${j}`;
|
|
42
|
-
subTests = [...subTests, [pr, y, throws || j === 'throw']];
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
export const run = async () => {
|
|
48
|
-
const x = await fromIo(io)(loadModuleMap2(io.process.env));
|
|
49
|
-
for (const [i, v] of Object.entries(x)) {
|
|
50
|
-
if (isTest(i)) {
|
|
51
|
-
framework(i, scanModule(['', v.default, false]));
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
};
|
|
2
|
+
import { register } from "./module.f.js";
|
|
3
|
+
import { runProgram } from "../../io/module.f.js";
|
|
4
|
+
export const run = () => runProgram(io)([])(register);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const failing: () => never;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const failing = () => { throw 'intentional failure'; };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const outer: () => unknown;
|
package/fs/dev/tf/test.f.d.ts
CHANGED
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
declare const
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
1
|
+
export declare const flat: () => void;
|
|
2
|
+
export declare const nested: () => void;
|
|
3
|
+
export declare const throwKey: () => void;
|
|
4
|
+
export declare const throwKeyFail: () => void;
|
|
5
|
+
export declare const mixedPassFail: () => void;
|
|
6
|
+
export declare const returnValueSubTree: () => void;
|
|
7
|
+
export declare const arrayKeys: () => void;
|
|
8
|
+
export declare const nonTestFilesSkipped: () => void;
|
|
9
|
+
export declare const multipleFiles: () => void;
|
|
10
|
+
export declare const throwByFunctionName: () => void;
|
|
11
|
+
export declare const namedExports: () => void;
|
|
12
|
+
export declare const defaultReporterOutput: () => void;
|
|
13
|
+
export declare const defaultReporterFailOutput: () => void;
|
|
14
|
+
export declare const githubReporterOutput: () => void;
|
|
15
|
+
export declare const helpers: {
|
|
16
|
+
isInteger: () => void;
|
|
17
|
+
isIdentifier: () => void;
|
|
18
|
+
fmtImport: () => void;
|
|
19
|
+
fmtPath: () => void;
|
|
20
|
+
fmtTerm: () => void;
|
|
21
|
+
ghEscape: () => void;
|
|
21
22
|
};
|