edfcore 0.4.254 → 0.4.256
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/cli-run.d.ts +4 -4
- package/dist/cli-run.js +4 -4
- package/dist/cli.d.ts +3 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +3 -2
- package/dist/cli.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/diagnostics/summary.d.ts +3 -0
- package/dist/diagnostics/summary.d.ts.map +1 -1
- package/dist/diagnostics/summary.js +3 -0
- package/dist/diagnostics/summary.js.map +1 -1
- package/dist/format-report.d.ts +4 -2
- package/dist/format-report.d.ts.map +1 -1
- package/dist/format-report.js +4 -2
- package/dist/format-report.js.map +1 -1
- package/dist/tal/ticks.d.ts +9 -4
- package/dist/tal/ticks.d.ts.map +1 -1
- package/dist/tal/ticks.js +9 -4
- package/dist/tal/ticks.js.map +1 -1
- package/docs/CHANGELOG.md +28 -0
- package/package.json +1 -1
- package/src/cli-run.ts +4 -4
- package/src/cli.ts +3 -2
- package/src/constants.ts +1 -1
- package/src/diagnostics/summary.ts +3 -0
- package/src/format-report.ts +4 -2
- package/src/tal/ticks.ts +9 -4
package/dist/cli-run.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* What `npx edfcore` actually does, with the process factored out.
|
|
3
3
|
*
|
|
4
|
-
* `cli.ts` is a shell that supplies real `node:fs` and `node:process`; everything
|
|
5
|
-
* here, behind an injected `CliIo`. That is not ceremony — a CLI tested by
|
|
6
|
-
* can only be tested once the package is built, so the tests either skip in
|
|
7
|
-
* binary. This way the exit codes and the output are ordinary unit tests.
|
|
4
|
+
* Layer 7. `cli.ts` is a shell that supplies real `node:fs` and `node:process`; everything
|
|
5
|
+
* decidable lives here, behind an injected `CliIo`. That is not ceremony — a CLI tested by
|
|
6
|
+
* spawning a subprocess can only be tested once the package is built, so the tests either skip in
|
|
7
|
+
* CI or test a stale binary. This way the exit codes and the output are ordinary unit tests.
|
|
8
8
|
*/
|
|
9
9
|
/**
|
|
10
10
|
* A mistake in the command line, as opposed to a mistake in the file.
|
package/dist/cli-run.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* What `npx edfcore` actually does, with the process factored out.
|
|
3
3
|
*
|
|
4
|
-
* `cli.ts` is a shell that supplies real `node:fs` and `node:process`; everything
|
|
5
|
-
* here, behind an injected `CliIo`. That is not ceremony — a CLI tested by
|
|
6
|
-
* can only be tested once the package is built, so the tests either skip in
|
|
7
|
-
* binary. This way the exit codes and the output are ordinary unit tests.
|
|
4
|
+
* Layer 7. `cli.ts` is a shell that supplies real `node:fs` and `node:process`; everything
|
|
5
|
+
* decidable lives here, behind an injected `CliIo`. That is not ceremony — a CLI tested by
|
|
6
|
+
* spawning a subprocess can only be tested once the package is built, so the tests either skip in
|
|
7
|
+
* CI or test a stale binary. This way the exit codes and the output are ordinary unit tests.
|
|
8
8
|
*/
|
|
9
9
|
import { countAnnotationsByText } from './annotations-query.js';
|
|
10
10
|
import { trimEdfField } from './bytes/latin1.js';
|
package/dist/cli.d.ts
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* `npx edfcore` — looking at a file without writing code.
|
|
4
4
|
*
|
|
5
|
-
* A separate entry point, never re-exported from the barrel,
|
|
6
|
-
* `node:process`. The universal entry must stay free of Node
|
|
5
|
+
* Layer 7, and the package's `bin`. A separate entry point, never re-exported from the barrel,
|
|
6
|
+
* because it imports `node:fs` and `node:process`. The universal entry must stay free of Node
|
|
7
|
+
* built-ins, and a test asserts it.
|
|
7
8
|
*
|
|
8
9
|
* This file is only the wiring. The decisions live in `cli-run.ts`, so they can be tested without
|
|
9
10
|
* spawning a process against a build that may not exist yet.
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG"}
|
package/dist/cli.js
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* `npx edfcore` — looking at a file without writing code.
|
|
4
4
|
*
|
|
5
|
-
* A separate entry point, never re-exported from the barrel,
|
|
6
|
-
* `node:process`. The universal entry must stay free of Node
|
|
5
|
+
* Layer 7, and the package's `bin`. A separate entry point, never re-exported from the barrel,
|
|
6
|
+
* because it imports `node:fs` and `node:process`. The universal entry must stay free of Node
|
|
7
|
+
* built-ins, and a test asserts it.
|
|
7
8
|
*
|
|
8
9
|
* This file is only the wiring. The decisions live in `cli-run.ts`, so they can be tested without
|
|
9
10
|
* spawning a process against a build that may not exist yet.
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG;AAEH,8FAA8F;AAC9F,2FAA2F;AAC3F,OAAO,KAAK,cAAc,MAAM,kBAAkB,CAAC;AACnD,qDAAqD;AACrD,uFAAuF;AACvF,OAAO,KAAK,WAAW,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAc,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAezC,MAAM,EAAE,GAAW,cAAmC,CAAC;AACvD,MAAM,IAAI,GACP,WAAoD,CAAC,OAAO;IAC5D,WAAsC,CAAC;AAE1C;;;;;;;;;;;;GAYG;AACH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;IAChC,IAAI,KAAK,EAAE,IAAI,KAAK,OAAO;QAAE,MAAM,KAAK,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEH,MAAM,EAAE,GAAU;IAChB;;;;;;OAMG;IACH,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAAkC,EAAE,IAAI,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;YACxE,MAAM,IAAI,KAAK,CACb,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,2DAA2D;gBAChF,iBAAiB,CACpB,CAAC;QACJ,CAAC;IACH,CAAC;IACD,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,IAAI,CAAC,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,6FAA6F;QAC7F,4CAA4C;QAC5C,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5F,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,OAAO,IAAI,CAAC,CAAC;QAC3C,4FAA4F;QAC5F,0FAA0F;QAC1F,gBAAgB;QAChB,IAAI,CAAC,QAAQ,GAAG,KAAK,YAAY,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,8FAA8F;AAC9F,+FAA+F;AAC/F,6DAA6D;AAC7D,KAAK,IAAI,EAAE,CAAC"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -109,5 +109,5 @@ export declare const SIGNAL_FIELD_BLOCK_OFFSETS: {
|
|
|
109
109
|
readonly reserved: 224;
|
|
110
110
|
};
|
|
111
111
|
/** Published package version. Kept in sync with package.json by a test. */
|
|
112
|
-
export declare const VERSION = "0.4.
|
|
112
|
+
export declare const VERSION = "0.4.256";
|
|
113
113
|
//# sourceMappingURL=constants.d.ts.map
|
package/dist/constants.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Diagnostics, counted.
|
|
3
3
|
*
|
|
4
|
+
* Layer 1. Imports one type module and nothing else, which is what lets any layer summarise a
|
|
5
|
+
* diagnostics array without taking on a dependency.
|
|
6
|
+
*
|
|
4
7
|
* `formatDiagnostics` turns a list into text for a human. This turns the same list into numbers
|
|
5
8
|
* for a program: the question "is anything wrong with this header, and how wrong" has no answer
|
|
6
9
|
* on `EdfHeader` — `validateRecording` produces a `report.ok`, but that needs a full scan, and a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/diagnostics/summary.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/diagnostics/summary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEjF;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,yFAAyF;IACzF,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,CAAC;IACxC,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;CAC1C;AAKD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,SAAS,aAAa,EAAE,GAAG,oBAAoB,CAiChG"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Diagnostics, counted.
|
|
3
3
|
*
|
|
4
|
+
* Layer 1. Imports one type module and nothing else, which is what lets any layer summarise a
|
|
5
|
+
* diagnostics array without taking on a dependency.
|
|
6
|
+
*
|
|
4
7
|
* `formatDiagnostics` turns a list into text for a human. This turns the same list into numbers
|
|
5
8
|
* for a program: the question "is anything wrong with this header, and how wrong" has no answer
|
|
6
9
|
* on `EdfHeader` — `validateRecording` produces a `report.ok`, but that needs a full scan, and a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/diagnostics/summary.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/diagnostics/summary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA+BH,qEAAqE;AACrE,MAAM,aAAa,GAAgC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAErF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAqC;IACxE,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAA8B,CAAC;IAEnC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmC,CAAC;IAC1D,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,UAAU,CAAC,QAAQ,KAAK,OAAO;YAAE,MAAM,IAAI,CAAC,CAAC;aAC5C,IAAI,UAAU,CAAC,QAAQ,KAAK,SAAS;YAAE,QAAQ,IAAI,CAAC,CAAC;;YACrD,KAAK,IAAI,CAAC,CAAC;QAEhB,IAAI,KAAK,KAAK,SAAS,IAAI,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACrF,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC;QAC9B,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE;YAC1B,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,qFAAqF;YACrF,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI,UAAU,CAAC,QAAQ;YACnD,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,KAAK,EAAE,WAAW,CAAC,MAAM;QACzB,MAAM;QACN,QAAQ;QACR,KAAK;QACL,KAAK;QACL,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;KAC9E,CAAC;AACJ,CAAC"}
|
package/dist/format-report.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* A validation report as text.
|
|
3
3
|
*
|
|
4
|
-
* Part of `edfcore/validate`.
|
|
5
|
-
*
|
|
4
|
+
* Layer 7, and pure. Part of `edfcore/validate`.
|
|
5
|
+
*
|
|
6
|
+
* `validateRecording` returns a report a program can branch on; this turns it into the thing a
|
|
7
|
+
* person reads at the end of a CI job or a conformance sweep.
|
|
6
8
|
*
|
|
7
9
|
* The one judgement it makes is what to lead with. A sweep over a damaged file can produce six
|
|
8
10
|
* figures of diagnostics — `TIMEKEEPING_TAL_MISSING` is per record — and a wall of them buries
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-report.d.ts","sourceRoot":"","sources":["../src/format-report.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"format-report.d.ts","sourceRoot":"","sources":["../src/format-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AASnF;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,gBAAgB,EACxB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,MAAM,CAoER;AAED,qFAAqF;AACrF,YAAY,EAAE,SAAS,EAAE,CAAC"}
|
package/dist/format-report.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* A validation report as text.
|
|
3
3
|
*
|
|
4
|
-
* Part of `edfcore/validate`.
|
|
5
|
-
*
|
|
4
|
+
* Layer 7, and pure. Part of `edfcore/validate`.
|
|
5
|
+
*
|
|
6
|
+
* `validateRecording` returns a report a program can branch on; this turns it into the thing a
|
|
7
|
+
* person reads at the end of a CI job or a conformance sweep.
|
|
6
8
|
*
|
|
7
9
|
* The one judgement it makes is what to lead with. A sweep over a damaged file can produce six
|
|
8
10
|
* figures of diagnostics — `TIMEKEEPING_TAL_MISSING` is per record — and a wall of them buries
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-report.js","sourceRoot":"","sources":["../src/format-report.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"format-report.js","sourceRoot":"","sources":["../src/format-report.ts"],"names":[],"mappings":"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"}
|
package/dist/tal/ticks.d.ts
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Decimal text to exact 100 ns ticks.
|
|
3
3
|
*
|
|
4
|
-
* Layer 3
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* Layer 1, not 3 — this file sits in `tal/` but does not belong to it. It imports `constants.ts`
|
|
5
|
+
* and nothing else, and `header/parse.ts` and `header/lookup.ts` at layer 2 both call it, so
|
|
6
|
+
* labelling it 3 with the rest of the directory made the only two upward runtime imports in the
|
|
7
|
+
* package (corrected in 0.4.256). A module's layer is its dependencies, not its folder.
|
|
8
|
+
*
|
|
9
|
+
* Sole owner of the string -> tick conversion, which is the whole reason event times in edfcore
|
|
10
|
+
* compare exactly. `parseFloat`, `Number(text)` and float arithmetic appear nowhere on that path:
|
|
11
|
+
* an onset written `+0.1` and one written `+0.3` are integers here, so equality, ordering and
|
|
12
|
+
* subtraction are decided by the digits on disk rather than by float64 rounding.
|
|
8
13
|
*/
|
|
9
14
|
/**
|
|
10
15
|
* One parsed onset or duration field.
|
package/dist/tal/ticks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ticks.d.ts","sourceRoot":"","sources":["../../src/tal/ticks.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ticks.d.ts","sourceRoot":"","sources":["../../src/tal/ticks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,wFAAwF;IACxF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAwED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAOxD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAQ1D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIpD;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAGpD;AAKD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIrD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQtD"}
|
package/dist/tal/ticks.js
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Decimal text to exact 100 ns ticks.
|
|
3
3
|
*
|
|
4
|
-
* Layer 3
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* Layer 1, not 3 — this file sits in `tal/` but does not belong to it. It imports `constants.ts`
|
|
5
|
+
* and nothing else, and `header/parse.ts` and `header/lookup.ts` at layer 2 both call it, so
|
|
6
|
+
* labelling it 3 with the rest of the directory made the only two upward runtime imports in the
|
|
7
|
+
* package (corrected in 0.4.256). A module's layer is its dependencies, not its folder.
|
|
8
|
+
*
|
|
9
|
+
* Sole owner of the string -> tick conversion, which is the whole reason event times in edfcore
|
|
10
|
+
* compare exactly. `parseFloat`, `Number(text)` and float arithmetic appear nowhere on that path:
|
|
11
|
+
* an onset written `+0.1` and one written `+0.3` are integers here, so equality, ordering and
|
|
12
|
+
* subtraction are decided by the digits on disk rather than by float64 rounding.
|
|
8
13
|
*/
|
|
9
14
|
import { TICKS_PER_SECOND } from '../constants.js';
|
|
10
15
|
const ASCII_ZERO = 0x30;
|
package/dist/tal/ticks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ticks.js","sourceRoot":"","sources":["../../src/tal/ticks.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ticks.js","sourceRoot":"","sources":["../../src/tal/ticks.ts"],"names":[],"mappings":"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"}
|
package/docs/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,34 @@ alone does not tell you whether you were affected.
|
|
|
6
6
|
edfcore is pre-1.0. Patch releases have carried behaviour changes where the old behaviour was a
|
|
7
7
|
defect; those are called out below.
|
|
8
8
|
|
|
9
|
+
## 0.4.256
|
|
10
|
+
|
|
11
|
+
- **Corrected** `src/tal/ticks.ts` from layer 3 to layer 1, and started enforcing the direction
|
|
12
|
+
the layers imply. `AGENTS.md` has always said a module may only import from a lower layer, and
|
|
13
|
+
every module now declares its own — but nothing compared the two, and applying that comparison
|
|
14
|
+
for the first time found two upward runtime imports, both real and both the same mistake:
|
|
15
|
+
`header/parse.ts` and `header/lookup.ts` at layer 2 call `tal/ticks.ts`, which was labelled 3
|
|
16
|
+
because it lives in `tal/`. It imports `constants.ts` and nothing else. A module's layer is its
|
|
17
|
+
dependencies, not its folder, so the fix was the number and no code moved.
|
|
18
|
+
- **Exempted** `import type`, which is the architecture rather than a loophole: `src/types.ts`
|
|
19
|
+
opens by saying it emits no runtime code so any layer may import it without creating a
|
|
20
|
+
dependency edge. Without the exemption the check would report `types.ts` importing
|
|
21
|
+
`diagnostics/codes.ts` — precisely the edge that does not exist. Level imports are allowed too;
|
|
22
|
+
there are 28 of them inside layers 2, 3 and 7, so "only from a lower layer" is shorthand for
|
|
23
|
+
"never from a higher one".
|
|
24
|
+
|
|
25
|
+
## 0.4.255
|
|
26
|
+
|
|
27
|
+
- **Gave four modules the layer declaration every other one has.** `AGENTS.md` states this
|
|
28
|
+
project's single architectural rule — `bytes`/`text` → `diagnostics` → `header`/`decode`/`tal` →
|
|
29
|
+
`time` → `io` → entry points, and a module may only import from a lower layer — and each file
|
|
30
|
+
repeats its own position on the first line of its docblock. Forty-eight of fifty-two did.
|
|
31
|
+
`cli.ts`, `cli-run.ts`, `diagnostics/summary.ts` and `format-report.ts` did not, so the one
|
|
32
|
+
invariant the codebase has was stated everywhere except where someone had skipped it, and
|
|
33
|
+
nothing noticed because nothing read the declarations. A missing one is now a failing test.
|
|
34
|
+
`removeComments: false` ships these docblocks in `dist/*.d.ts`, so a layer is also what an
|
|
35
|
+
editor shows on hover.
|
|
36
|
+
|
|
9
37
|
## 0.4.254
|
|
10
38
|
|
|
11
39
|
- **Wrote down** that the `archive/pre-squash-2026-08-16` branch cannot be deleted, in the "things
|
package/package.json
CHANGED
package/src/cli-run.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* What `npx edfcore` actually does, with the process factored out.
|
|
3
3
|
*
|
|
4
|
-
* `cli.ts` is a shell that supplies real `node:fs` and `node:process`; everything
|
|
5
|
-
* here, behind an injected `CliIo`. That is not ceremony — a CLI tested by
|
|
6
|
-
* can only be tested once the package is built, so the tests either skip in
|
|
7
|
-
* binary. This way the exit codes and the output are ordinary unit tests.
|
|
4
|
+
* Layer 7. `cli.ts` is a shell that supplies real `node:fs` and `node:process`; everything
|
|
5
|
+
* decidable lives here, behind an injected `CliIo`. That is not ceremony — a CLI tested by
|
|
6
|
+
* spawning a subprocess can only be tested once the package is built, so the tests either skip in
|
|
7
|
+
* CI or test a stale binary. This way the exit codes and the output are ordinary unit tests.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { countAnnotationsByText } from './annotations-query.js';
|
package/src/cli.ts
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* `npx edfcore` — looking at a file without writing code.
|
|
4
4
|
*
|
|
5
|
-
* A separate entry point, never re-exported from the barrel,
|
|
6
|
-
* `node:process`. The universal entry must stay free of Node
|
|
5
|
+
* Layer 7, and the package's `bin`. A separate entry point, never re-exported from the barrel,
|
|
6
|
+
* because it imports `node:fs` and `node:process`. The universal entry must stay free of Node
|
|
7
|
+
* built-ins, and a test asserts it.
|
|
7
8
|
*
|
|
8
9
|
* This file is only the wiring. The decisions live in `cli-run.ts`, so they can be tested without
|
|
9
10
|
* spawning a process against a build that may not exist yet.
|
package/src/constants.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Diagnostics, counted.
|
|
3
3
|
*
|
|
4
|
+
* Layer 1. Imports one type module and nothing else, which is what lets any layer summarise a
|
|
5
|
+
* diagnostics array without taking on a dependency.
|
|
6
|
+
*
|
|
4
7
|
* `formatDiagnostics` turns a list into text for a human. This turns the same list into numbers
|
|
5
8
|
* for a program: the question "is anything wrong with this header, and how wrong" has no answer
|
|
6
9
|
* on `EdfHeader` — `validateRecording` produces a `report.ok`, but that needs a full scan, and a
|
package/src/format-report.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* A validation report as text.
|
|
3
3
|
*
|
|
4
|
-
* Part of `edfcore/validate`.
|
|
5
|
-
*
|
|
4
|
+
* Layer 7, and pure. Part of `edfcore/validate`.
|
|
5
|
+
*
|
|
6
|
+
* `validateRecording` returns a report a program can branch on; this turns it into the thing a
|
|
7
|
+
* person reads at the end of a CI job or a conformance sweep.
|
|
6
8
|
*
|
|
7
9
|
* The one judgement it makes is what to lead with. A sweep over a damaged file can produce six
|
|
8
10
|
* figures of diagnostics — `TIMEKEEPING_TAL_MISSING` is per record — and a wall of them buries
|
package/src/tal/ticks.ts
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Decimal text to exact 100 ns ticks.
|
|
3
3
|
*
|
|
4
|
-
* Layer 3
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* Layer 1, not 3 — this file sits in `tal/` but does not belong to it. It imports `constants.ts`
|
|
5
|
+
* and nothing else, and `header/parse.ts` and `header/lookup.ts` at layer 2 both call it, so
|
|
6
|
+
* labelling it 3 with the rest of the directory made the only two upward runtime imports in the
|
|
7
|
+
* package (corrected in 0.4.256). A module's layer is its dependencies, not its folder.
|
|
8
|
+
*
|
|
9
|
+
* Sole owner of the string -> tick conversion, which is the whole reason event times in edfcore
|
|
10
|
+
* compare exactly. `parseFloat`, `Number(text)` and float arithmetic appear nowhere on that path:
|
|
11
|
+
* an onset written `+0.1` and one written `+0.3` are integers here, so equality, ordering and
|
|
12
|
+
* subtraction are decided by the digits on disk rather than by float64 rounding.
|
|
8
13
|
*/
|
|
9
14
|
|
|
10
15
|
import { TICKS_PER_SECOND } from '../constants.js';
|