edfcore 0.3.48 → 0.3.49

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/CHANGELOG.md CHANGED
@@ -6,6 +6,24 @@ 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.3.49
10
+
11
+ - **Fixed** `splitSubfields` splitting the EDF+ identification fields on JavaScript's `\s` instead
12
+ of on the ASCII space the spec names, so a NO-BREAK SPACE inside a subfield silently cut it in
13
+ two.
14
+ - EDF+ tells a writer to replace a space inside a subfield with another character and mandates
15
+ neither the character nor a way back. NBSP is one of the choices that leaves, and it is header
16
+ byte 0xA0 — which `decodeHeaderLatin1` turns into U+00A0, which `\s` matches. `Mac<NBSP>Donald`
17
+ parsed as `name: 'Mac'` with `'Donald'` demoted to `extraSubfields`.
18
+ - Nothing warned. The split **adds** a subfield rather than removing one, trailing extras are
19
+ legal under EDF+, so the count check passed and `conformant` stayed `true`.
20
+ - In `parseRecordingId` it was worse than a truncation: every code after the NBSP shifted one
21
+ position left, so `investigationCode`, `technicianCode` and `equipmentCode` each held the
22
+ previous field's value and all three looked plausible.
23
+ - The module docblock says `raw` and the subfields "both keep what the file wrote". That was true
24
+ of `raw` only. A tab or a CR in the field now also stays inside its subfield, where
25
+ `NON_ASCII_HEADER_FIELD` reports it, rather than acting as a separator the spec never named.
26
+
9
27
  ## 0.3.48
10
28
 
11
29
  - **Fixed** the identification lines in `formatHeader` and in `edfcore json --patient` using
@@ -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.3.48";
112
+ export declare const VERSION = "0.3.49";
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.3.48';
82
+ export const VERSION = '0.3.49';
83
83
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"identification.d.ts","sourceRoot":"","sources":["../../src/header/identification.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAmB,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAejF,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAoCD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,qBAAqB,EAC9B,IAAI,EAAE,cAAc,GACnB,YAAY,CA0Cd;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,qBAAqB,EAC9B,IAAI,EAAE,cAAc,GACnB,cAAc,CA+ChB"}
1
+ {"version":3,"file":"identification.d.ts","sourceRoot":"","sources":["../../src/header/identification.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAmB,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAejF,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AA+CD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,qBAAqB,EAC9B,IAAI,EAAE,cAAc,GACnB,YAAY,CA0Cd;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,qBAAqB,EAC9B,IAAI,EAAE,cAAc,GACnB,cAAc,CA+ChB"}
@@ -30,12 +30,23 @@ const PATIENT_SUBFIELD_COUNT = 4;
30
30
  const RECORDING_SUBFIELD_COUNT = 5;
31
31
  const PATIENT_GRAMMAR = 'code sex(F|M) birthdate(dd-MMM-yyyy) name';
32
32
  const RECORDING_GRAMMAR = 'Startdate startdate(dd-MMM-yyyy) investigationCode technicianCode equipmentCode';
33
- /** Subfields are separated by spaces and may not contain one. Runs are tolerated. */
33
+ /**
34
+ * Subfields are separated by spaces and may not contain one. Runs are tolerated.
35
+ *
36
+ * The ASCII space the spec names, not `/\s+/`. JavaScript's `\s` also matches U+00A0, which is
37
+ * what header byte 0xA0 decodes to — and NO-BREAK SPACE is one of the characters a writer may
38
+ * legitimately pick when EDF+ tells it to replace a space inside a subfield. Splitting on it cut
39
+ * `Mac Donald` into two subfields, so `name` held only `Mac`; and because the split ADDS a
40
+ * subfield rather than removing one, the count check still passed and `conformant` stayed true
41
+ * with no diagnostic. In `parseRecordingId` it shifted every code after it by one position. The
42
+ * docblock's "`raw` and the subfields both keep what the file wrote" was not true of the
43
+ * subfields (fixed in 0.3.49).
44
+ */
34
45
  function splitSubfields(raw) {
35
46
  const text = trimEdfField(raw);
36
47
  if (text.length === 0)
37
48
  return [];
38
- return text.split(/\s+/).filter((part) => part.length > 0);
49
+ return text.split(' ').filter((part) => part.length > 0);
39
50
  }
40
51
  /** `'X'` is the spec's "unknown", and an absent subfield is unknown too. */
41
52
  function subfieldValue(subfields, index) {
@@ -1 +1 @@
1
- {"version":3,"file":"identification.js","sourceRoot":"","sources":["../../src/header/identification.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"identification.js","sourceRoot":"","sources":["../../src/header/identification.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "edfcore",
3
- "version": "0.3.48",
3
+ "version": "0.3.49",
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",
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.3.48';
96
+ export const VERSION = '0.3.49';
@@ -47,11 +47,22 @@ export interface IdentificationOptions {
47
47
  readonly edfPlus: boolean;
48
48
  }
49
49
 
50
- /** Subfields are separated by spaces and may not contain one. Runs are tolerated. */
50
+ /**
51
+ * Subfields are separated by spaces and may not contain one. Runs are tolerated.
52
+ *
53
+ * The ASCII space the spec names, not `/\s+/`. JavaScript's `\s` also matches U+00A0, which is
54
+ * what header byte 0xA0 decodes to — and NO-BREAK SPACE is one of the characters a writer may
55
+ * legitimately pick when EDF+ tells it to replace a space inside a subfield. Splitting on it cut
56
+ * `Mac Donald` into two subfields, so `name` held only `Mac`; and because the split ADDS a
57
+ * subfield rather than removing one, the count check still passed and `conformant` stayed true
58
+ * with no diagnostic. In `parseRecordingId` it shifted every code after it by one position. The
59
+ * docblock's "`raw` and the subfields both keep what the file wrote" was not true of the
60
+ * subfields (fixed in 0.3.49).
61
+ */
51
62
  function splitSubfields(raw: string): readonly string[] {
52
63
  const text = trimEdfField(raw);
53
64
  if (text.length === 0) return [];
54
- return text.split(/\s+/).filter((part) => part.length > 0);
65
+ return text.split(' ').filter((part) => part.length > 0);
55
66
  }
56
67
 
57
68
  /** `'X'` is the spec's "unknown", and an absent subfield is unknown too. */