edfcore 0.4.285 → 0.4.293

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.
@@ -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.285";
112
+ export declare const VERSION = "0.4.293";
113
113
  //# sourceMappingURL=constants.d.ts.map
package/dist/constants.js CHANGED
@@ -79,5 +79,5 @@ export const SIGNAL_FIELD_BLOCK_OFFSETS = {
79
79
  reserved: 224,
80
80
  };
81
81
  /** Published package version. Kept in sync with package.json by a test. */
82
- export const VERSION = '0.4.285';
82
+ export const VERSION = '0.4.293';
83
83
  //# sourceMappingURL=constants.js.map
package/docs/CHANGELOG.md CHANGED
@@ -6,6 +6,119 @@ 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.293
10
+
11
+ - **Moved** the tarball check out of the test suite, which is the only place it could not live.
12
+ Packing this package runs `prepublishOnly` — `npm run check && npm run build` — so a test that
13
+ packs runs the suite containing itself, and `npm pack --json` printed the whole run before its
14
+ JSON. 0.4.292 tried to parse around that with `--ignore-scripts` and a located JSON array; the
15
+ publish runner's npm ran the lifecycle anyway, and the extra output then broke the parser a
16
+ second way. It is `npm run verify:tarball` now, in CI's `package` job beside `verify:package`,
17
+ where nothing recurses.
18
+
19
+ **0.4.287 through 0.4.292 were never released** — six versions, all tagged, all with green CI,
20
+ none reaching npm, because `publish.yml` runs its own `npm run check` after the release exists.
21
+ Everything they carried is in this one. The release script waits for CI on the commit, and the
22
+ publish is a separate workflow that starts later, so the wait added in 0.4.244 cannot see it.
23
+
24
+ ## 0.4.292
25
+
26
+ - **Fixed** the tarball check added in 0.4.287, which broke the publish it was written to protect.
27
+ It ran `npm pack --dry-run --json` without `--ignore-scripts`, so `npm pack` ran the pack
28
+ lifecycle — and this package's `prepublishOnly` is `npm run check && npm run build`. The pack
29
+ performed by the test therefore ran the suite containing the test, printed all of it to stdout,
30
+ and left `JSON.parse` reading `npm notice run biome check` as JSON. It bites only where a
31
+ lifecycle actually fires, which is why it passed on this machine and failed in `publish.yml`.
32
+ The JSON is now located in the output rather than assumed to start at byte zero, and a missing
33
+ file list says so instead of throwing `Cannot read properties of undefined`.
34
+
35
+ **0.4.287 through 0.4.291 were never released.** All five were tagged, all five had green CI —
36
+ the failure is in `publish.yml`, which runs after — and none reached npm. Everything they
37
+ carried is in this release. That is five more numbers on the list with 0.2.29, 0.2.36, 0.2.59,
38
+ 0.4.176, 0.4.231-0.4.236 and 0.4.241-0.4.242.
39
+
40
+ ## 0.4.291
41
+
42
+ - **Extended** `verify:site` to the rendered head of every built page. `Base.astro` builds it once
43
+ for all of them, which is exactly why a page that misses it misses it silently — nothing renders
44
+ differently. Title, description, canonical and the two Open Graph tags are now required on all 27
45
+ pages, and every documentation page must carry the `rel="alternate"` markdown link.
46
+ - That last one has a stated purpose rather than being SEO housekeeping. `[...slug].md.ts` records
47
+ what was measured: no AI crawler uses content negotiation, and the ones that found markdown found
48
+ it through an explicit `<link rel="alternate">` in the HTML. A docs page without it has a
49
+ markdown twin nothing can discover, which is the whole feature quietly not working.
50
+ - The `/docs` redirect stub Astro generates is exempt, and correctly: it carries `robots: noindex`
51
+ and exists to be followed rather than read.
52
+
53
+ ## 0.4.290
54
+
55
+ - **Added** `npm run verify:site`, which checks what the site build produced rather than that it
56
+ produced something. `llms.txt`, `llms-full.txt`, the markdown twin of every page, `robots.txt`
57
+ and `api.json` are generated from the collection and nothing looked at the output — and each
58
+ fails silently. A page missing from `llms.txt` is a page an agent never learns about; a `.md`
59
+ twin that did not render leaves a documented URL 404ing while the HTML page beside it is fine;
60
+ a `Sitemap:` line naming a file the build did not emit tells a crawler to fetch nothing.
61
+ - It runs in CI's `site` job, after the build, rather than in `npm run check`. These generators
62
+ live under `website/`, where an import pulls in a tsconfig the root install does not have —
63
+ the boundary 0.4.264 guards — so the artifact is the only place the question can be asked.
64
+ Verified by narrowing `llms.txt`'s section list and watching three pages disappear from the map.
65
+
66
+ ## 0.4.289
67
+
68
+ - **Tested** `header/fields.ts` directly, the last source module no test imported. It is the sole
69
+ owner of where each of the ten fixed fields lives and which diagnostic a field that fails its
70
+ grammar deserves, and every function in it ran only as a step inside `parseHeader` — covered by
71
+ whichever inputs some larger fixture happened to produce.
72
+ - The offsets are the part a whole-file parse cannot check at all: a field read from the wrong
73
+ offset still parses, it just parses the neighbouring field's bytes. So the table is checked
74
+ against a header whose every field is filled with a distinct letter, which makes a misread
75
+ visible rather than plausible, and against the property that the ten fields tile all 256 bytes
76
+ with no gap and no overlap. The spec's offsets are written out from the specification rather
77
+ than imported from `constants.ts` — importing them would compare the table with itself, and the
78
+ two have to agree because both describe a format neither of them defines.
79
+
80
+ ## 0.4.288
81
+
82
+ - **Tested** `options.ts` directly for the first time. It is 66 lines of Layer 1 whose whole job is
83
+ refusing bad input, and no test imported it — every path through it ran only as a side effect of
84
+ some larger read. Its own docblock records two misdiagnoses that reached users from a `NaN`
85
+ budget: an `EdfBudgetError` advising "read fewer records per call", which no record count
86
+ satisfies, and an `EdfRangeError` about `count: NaN` telling the caller to clamp a range the
87
+ function does not take. The distinction it exists for — `undefined` means "use the default",
88
+ `NaN` means a caller computed something and got nothing — is now pinned from both sides, along
89
+ with the ordering that makes the message right: `NaN >= 0` is false, so a sign check written
90
+ first would call `NaN` negative.
91
+ - **Pinned** the inventory the module states: six modules resolve the budget and two hand it on.
92
+ That sentence is the argument the guard is worth anything — "a guard that only one of the eight
93
+ applies is not a guard" — and a seventh consumer reading the option raw is how it stops being
94
+ true.
95
+
96
+ ## 0.4.287
97
+
98
+ - **Added** a check on what `npm publish` would actually send. `publint` runs in CI and checks the
99
+ manifest is well formed; it says nothing about membership, and membership is where the claims
100
+ are — `tests/README.md` promises "nothing under `tests/` ever ships", and the fixture policy
101
+ says the six committed binaries are excluded from the published package.
102
+ - Wrong in either direction is quiet. A stray `tests/` ships 2.1 MB of other people's EDF files to
103
+ every consumer, with the licence questions that policy exists to avoid; a missing `dist/` ships
104
+ a package that installs and cannot be imported. Neither surfaces until someone downloads it, and
105
+ by then the version is immutable. Asked through `npm pack --dry-run`, which is the code path a
106
+ publish takes, rather than by reimplementing npm's ignore rules — which is the whole difficulty
107
+ of the question. Every exports and `bin` target is checked to be present, and `docs/` is checked
108
+ to contain the changelog and nothing else.
109
+
110
+ ## 0.4.286
111
+
112
+ - **Guarded** the two `git push` calls, which were the last unguarded network steps in the release.
113
+ Both reach the network, so both fail for reasons unrelated to the code, and each leaves a
114
+ different half-done state that re-running the script cannot repair — the commit and the tag
115
+ already exist locally, so a second run refuses the tag rather than retrying.
116
+ - Found by living it. Cutting 0.4.285 the tag push timed out with `Recv failure`: main was public,
117
+ the tag was not, nothing triggered a release, and the script exited without a word. The recovery
118
+ 0.4.226 added covers the step after these two and never fired, so the only evidence was a version
119
+ on `main` with no release behind it. Each push now says which half is done and gives the exact
120
+ commands to finish, rather than the one that would cut the next version.
121
+
9
122
  ## 0.4.285
10
123
 
11
124
  - **Added** a check that every diagnostic code edfcore emits is registered, or is one of six that
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "edfcore",
3
- "version": "0.4.285",
3
+ "version": "0.4.293",
4
4
  "description": "Modern, typed, zero-dependency reader for EDF, EDF+, BDF and BDF+ biosignal files. Works in browsers and Node with true random access.",
5
5
  "keywords": [
6
6
  "edf",
@@ -71,6 +71,8 @@
71
71
  "format": "biome check --write --linter-enabled=false .",
72
72
  "check": "npm run lint && npm run typecheck && npm run build && npm run test",
73
73
  "verify:package": "npx --yes publint@latest --strict && npx --yes @arethetypeswrong/cli@latest --pack . --profile esm-only",
74
+ "verify:tarball": "node scripts/check-tarball.mjs",
75
+ "verify:site": "node scripts/check-site-output.mjs",
74
76
  "corpus:fetch": "node scripts/fetch-corpus.mjs",
75
77
  "release": "node scripts/release.mjs",
76
78
  "prepublishOnly": "npm run check && npm run build"
package/src/constants.ts CHANGED
@@ -93,4 +93,4 @@ export const SIGNAL_FIELD_BLOCK_OFFSETS = {
93
93
  } as const;
94
94
 
95
95
  /** Published package version. Kept in sync with package.json by a test. */
96
- export const VERSION = '0.4.285';
96
+ export const VERSION = '0.4.293';