edf2csv 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.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +123 -0
  3. package/dist/cli/report.d.ts +17 -0
  4. package/dist/cli/report.d.ts.map +1 -0
  5. package/dist/cli/report.js +107 -0
  6. package/dist/cli/report.js.map +1 -0
  7. package/dist/cli.d.ts +13 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +315 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/convert/channels.d.ts +40 -0
  12. package/dist/convert/channels.d.ts.map +1 -0
  13. package/dist/convert/channels.js +134 -0
  14. package/dist/convert/channels.js.map +1 -0
  15. package/dist/convert/plan.d.ts +70 -0
  16. package/dist/convert/plan.d.ts.map +1 -0
  17. package/dist/convert/plan.js +127 -0
  18. package/dist/convert/plan.js.map +1 -0
  19. package/dist/convert/run.d.ts +48 -0
  20. package/dist/convert/run.d.ts.map +1 -0
  21. package/dist/convert/run.js +358 -0
  22. package/dist/convert/run.js.map +1 -0
  23. package/dist/convert/time-range.d.ts +63 -0
  24. package/dist/convert/time-range.d.ts.map +1 -0
  25. package/dist/convert/time-range.js +188 -0
  26. package/dist/convert/time-range.js.map +1 -0
  27. package/dist/convert/timing.d.ts +18 -0
  28. package/dist/convert/timing.d.ts.map +1 -0
  29. package/dist/convert/timing.js +69 -0
  30. package/dist/convert/timing.js.map +1 -0
  31. package/dist/edf/annotations.d.ts +43 -0
  32. package/dist/edf/annotations.d.ts.map +1 -0
  33. package/dist/edf/annotations.js +88 -0
  34. package/dist/edf/annotations.js.map +1 -0
  35. package/dist/edf/errors.d.ts +27 -0
  36. package/dist/edf/errors.d.ts.map +1 -0
  37. package/dist/edf/errors.js +23 -0
  38. package/dist/edf/errors.js.map +1 -0
  39. package/dist/edf/header.d.ts +115 -0
  40. package/dist/edf/header.d.ts.map +1 -0
  41. package/dist/edf/header.js +383 -0
  42. package/dist/edf/header.js.map +1 -0
  43. package/dist/edf/reader.d.ts +75 -0
  44. package/dist/edf/reader.d.ts.map +1 -0
  45. package/dist/edf/reader.js +224 -0
  46. package/dist/edf/reader.js.map +1 -0
  47. package/dist/edf/scale.d.ts +46 -0
  48. package/dist/edf/scale.d.ts.map +1 -0
  49. package/dist/edf/scale.js +76 -0
  50. package/dist/edf/scale.js.map +1 -0
  51. package/dist/format/csv.d.ts +34 -0
  52. package/dist/format/csv.d.ts.map +1 -0
  53. package/dist/format/csv.js +136 -0
  54. package/dist/format/csv.js.map +1 -0
  55. package/dist/format/number.d.ts +42 -0
  56. package/dist/format/number.d.ts.map +1 -0
  57. package/dist/format/number.js +108 -0
  58. package/dist/format/number.js.map +1 -0
  59. package/dist/index.d.ts +25 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +17 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/version.d.ts +3 -0
  64. package/dist/version.d.ts.map +1 -0
  65. package/dist/version.js +8 -0
  66. package/dist/version.js.map +1 -0
  67. package/package.json +73 -0
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Number formatting for CSV cells.
3
+ *
4
+ * A one-hour, 23-channel, 256 Hz recording is about 21 million numeric cells, so
5
+ * this is the hottest code in a conversion. Two things keep it cheap:
6
+ *
7
+ * - Every sample in a channel comes from a bounded set of integers (digitalMin to
8
+ * digitalMax, typically 4096 distinct values for a 12-bit ADC). The formatted
9
+ * text for a digital code never changes, so it is computed once and reused.
10
+ * - The cache fills lazily. Real recordings visit only a fraction of the range,
11
+ * and a channel with an implausibly wide range falls back to direct formatting
12
+ * rather than reserving memory it will never use.
13
+ */
14
+ import { makeScaler } from '../edf/scale.js';
15
+ /** Widest digital range worth caching: 16 bits of pointers is 512 KB per channel. */
16
+ const MAX_CACHED_SPAN = 1 << 16;
17
+ /**
18
+ * Format with a fixed number of decimals, normalising negative zero.
19
+ *
20
+ * Without this, a sample that scales to a very small negative value prints as
21
+ * "-0.000", which looks like a distinct measurement but is not.
22
+ */
23
+ export function fixed(value, decimals) {
24
+ const text = value.toFixed(decimals);
25
+ if (text.charCodeAt(0) !== 45 /* - */)
26
+ return text;
27
+ // Cheap check for "-0", "-0.0", "-0.000"...
28
+ for (let i = 1; i < text.length; i++) {
29
+ const c = text.charCodeAt(i);
30
+ if (c === 46 /* . */ || c === 48 /* 0 */)
31
+ continue;
32
+ return text;
33
+ }
34
+ return text.slice(1);
35
+ }
36
+ export function makeSampleFormatter(signal, decimals) {
37
+ const scale = makeScaler(signal);
38
+ const low = Math.min(signal.digitalMin, signal.digitalMax);
39
+ const high = Math.max(signal.digitalMin, signal.digitalMax);
40
+ const span = high - low + 1;
41
+ // Samples may fall outside the declared digital range in non-conforming files,
42
+ // so the cache covers the full int16 domain when the declared range is small.
43
+ if (!Number.isFinite(span) || span <= 0 || span > MAX_CACHED_SPAN) {
44
+ return (digital) => fixed(scale(digital), decimals);
45
+ }
46
+ const cacheLow = -32768;
47
+ const cache = new Array(65536);
48
+ return (digital) => {
49
+ const slot = digital - cacheLow;
50
+ if (slot >= 0 && slot < 65536) {
51
+ const hit = cache[slot];
52
+ if (hit !== undefined)
53
+ return hit;
54
+ const text = fixed(scale(digital), decimals);
55
+ cache[slot] = text;
56
+ return text;
57
+ }
58
+ return fixed(scale(digital), decimals);
59
+ };
60
+ }
61
+ /**
62
+ * Decimals for the time column.
63
+ *
64
+ * The interval between samples is 1/rate, which has a terminating decimal
65
+ * expansion of d places exactly when 10^d divides evenly by the rate. Every rate
66
+ * in common use clears this — 256 Hz needs 8 places, 512 Hz needs 9, 250 Hz and
67
+ * 1000 Hz need 3 — so sample times are written exactly rather than rounded, and
68
+ * `time_s * rate` comes back as a whole number instead of 8191.999999.
69
+ *
70
+ * Rates with a repeating expansion (3 Hz, say) fall back to enough places to keep
71
+ * consecutive samples distinct.
72
+ */
73
+ export function timeDecimals(samplingRate) {
74
+ if (!(samplingRate > 0) || !Number.isFinite(samplingRate))
75
+ return 3;
76
+ for (let d = 0; d <= 9; d++) {
77
+ if (Number.isInteger(10 ** d / samplingRate))
78
+ return Math.max(3, d);
79
+ }
80
+ return Math.min(9, Math.max(3, Math.ceil(Math.log10(samplingRate)) + 3));
81
+ }
82
+ /** Human-readable byte size for warnings and summaries. */
83
+ export function formatBytes(bytes) {
84
+ const units = ['B', 'KB', 'MB', 'GB', 'TB'];
85
+ let value = bytes;
86
+ let unit = 0;
87
+ while (value >= 1024 && unit < units.length - 1) {
88
+ value /= 1024;
89
+ unit++;
90
+ }
91
+ const rounded = value >= 100 || unit === 0 ? Math.round(value) : Number(value.toFixed(1));
92
+ return `${rounded} ${units[unit]}`;
93
+ }
94
+ /** Human-readable duration: 1h 05m 12s. */
95
+ export function formatDuration(seconds) {
96
+ if (!Number.isFinite(seconds) || seconds < 0)
97
+ return `${seconds}s`;
98
+ const h = Math.floor(seconds / 3600);
99
+ const m = Math.floor((seconds % 3600) / 60);
100
+ const s = seconds - h * 3600 - m * 60;
101
+ const sText = Number.isInteger(s) ? String(s) : s.toFixed(3).replace(/\.?0+$/u, '');
102
+ if (h > 0)
103
+ return `${h}h ${String(m).padStart(2, '0')}m ${sText}s`;
104
+ if (m > 0)
105
+ return `${m}m ${sText}s`;
106
+ return `${sText}s`;
107
+ }
108
+ //# sourceMappingURL=number.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number.js","sourceRoot":"","sources":["../../src/format/number.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Programmatic API.
3
+ *
4
+ * edf2csv is primarily a command-line tool, but the parser underneath is useful on
5
+ * its own — reading an EDF header, listing channels, or streaming raw samples
6
+ * without going through CSV at all.
7
+ */
8
+ export { EdfFile, DEFAULT_CHUNK_BYTES } from './edf/reader.js';
9
+ export type { RecordBatch, ReadRecordsOptions } from './edf/reader.js';
10
+ export { parseHeader, formatRate, describeFormat, formatWallClock, ANNOTATIONS_LABEL, BDF_ANNOTATIONS_LABEL } from './edf/header.js';
11
+ export type { EdfHeader, EdfHeaderInfo, EdfSignal } from './edf/header.js';
12
+ export { decodeRecordAnnotations } from './edf/annotations.js';
13
+ export type { Annotation, DecodedRecordAnnotations } from './edf/annotations.js';
14
+ export { makeScaler, quantizationStep, decimalsForSignal } from './edf/scale.js';
15
+ export type { Scaler } from './edf/scale.js';
16
+ export { EdfError } from './edf/errors.js';
17
+ export type { Diagnostic, DiagnosticCode, EdfErrorCode } from './edf/errors.js';
18
+ export { convert, defaultOutputDir, ConversionError, TOOL_VERSION } from './convert/run.js';
19
+ export type { ConvertOptions, ConvertResult, ConversionProgress, WrittenFile } from './convert/run.js';
20
+ export { buildPlan, rateSlug, SPREADSHEET_ROW_LIMIT } from './convert/plan.js';
21
+ export type { ConversionPlan, PlanOptions, PlanInput, RateGroup, PlannedChannel } from './convert/plan.js';
22
+ export { selectChannels, buildColumnNames, ChannelSelectionError } from './convert/channels.js';
23
+ export { parseTimeSpec, resolveRange, TimeRangeError } from './convert/time-range.js';
24
+ export type { ResolvedRange } from './convert/time-range.js';
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEvE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACrI,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,YAAY,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACjF,YAAY,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEhF,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC5F,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEvG,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE3G,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAChG,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACtF,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Programmatic API.
3
+ *
4
+ * edf2csv is primarily a command-line tool, but the parser underneath is useful on
5
+ * its own — reading an EDF header, listing channels, or streaming raw samples
6
+ * without going through CSV at all.
7
+ */
8
+ export { EdfFile, DEFAULT_CHUNK_BYTES } from './edf/reader.js';
9
+ export { parseHeader, formatRate, describeFormat, formatWallClock, ANNOTATIONS_LABEL, BDF_ANNOTATIONS_LABEL } from './edf/header.js';
10
+ export { decodeRecordAnnotations } from './edf/annotations.js';
11
+ export { makeScaler, quantizationStep, decimalsForSignal } from './edf/scale.js';
12
+ export { EdfError } from './edf/errors.js';
13
+ export { convert, defaultOutputDir, ConversionError, TOOL_VERSION } from './convert/run.js';
14
+ export { buildPlan, rateSlug, SPREADSHEET_ROW_LIMIT } from './convert/plan.js';
15
+ export { selectChannels, buildColumnNames, ChannelSelectionError } from './convert/channels.js';
16
+ export { parseTimeSpec, resolveRange, TimeRangeError } from './convert/time-range.js';
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAG/D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAGrI,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAG/D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGjF,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG3C,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAG5F,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG/E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAChG,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** The package version reported by the CLI and written into conversion metadata. */
2
+ export declare const VERSION: string;
3
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAcA,oFAAoF;AACpF,eAAO,MAAM,OAAO,QAAmB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { readFileSync } from 'node:fs';
2
+ const metadata = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
3
+ if (typeof metadata.version !== 'string' || metadata.version.length === 0) {
4
+ throw new Error('package.json does not contain a valid version.');
5
+ }
6
+ /** The package version reported by the CLI and written into conversion metadata. */
7
+ export const VERSION = metadata.version;
8
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAMvC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAC/C,CAAC;AAErB,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IAC1E,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;AACpE,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC"}
package/package.json ADDED
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "edf2csv",
3
+ "version": "0.1.0",
4
+ "description": "Convert EDF, EDF+ and BDF biosignal recordings (European Data Format) to CSV from the command line. Local, streaming, and never resamples or alters units.",
5
+ "keywords": [
6
+ "edf",
7
+ "edf+",
8
+ "bdf",
9
+ "european data format",
10
+ "edf to csv",
11
+ "csv",
12
+ "converter",
13
+ "eeg",
14
+ "ecg",
15
+ "emg",
16
+ "eog",
17
+ "biosignal",
18
+ "physiological signals",
19
+ "polysomnography",
20
+ "sleep study",
21
+ "neuroscience",
22
+ "cli",
23
+ "biosemi"
24
+ ],
25
+ "license": "MIT",
26
+ "author": "Sarthak Tayal",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "git+https://github.com/tayal-sarthak/edf2csv.git"
30
+ },
31
+ "bugs": {
32
+ "url": "https://github.com/tayal-sarthak/edf2csv/issues"
33
+ },
34
+ "homepage": "https://edf2csv.vercel.app",
35
+ "type": "module",
36
+ "bin": {
37
+ "edf2csv": "dist/cli.js"
38
+ },
39
+ "main": "dist/index.js",
40
+ "types": "dist/index.d.ts",
41
+ "exports": {
42
+ ".": {
43
+ "types": "./dist/index.d.ts",
44
+ "default": "./dist/index.js"
45
+ },
46
+ "./package.json": "./package.json"
47
+ },
48
+ "files": [
49
+ "dist",
50
+ "README.md",
51
+ "LICENSE"
52
+ ],
53
+ "engines": {
54
+ "node": ">=20.0.0"
55
+ },
56
+ "scripts": {
57
+ "build": "tsc -p tsconfig.json",
58
+ "clean": "node -e \"fs.rmSync('dist',{recursive:true,force:true})\"",
59
+ "fixtures": "node test/fixtures/generate.mjs",
60
+ "test": "npm run build && npm run fixtures && node --test test/*.test.js",
61
+ "typecheck": "tsc -p tsconfig.json --noEmit",
62
+ "prepublishOnly": "npm run clean && npm run build && npm test"
63
+ },
64
+ "dependencies": {
65
+ "@types/node": "^22.10.0"
66
+ },
67
+ "devDependencies": {
68
+ "typescript": "^5.7.0"
69
+ },
70
+ "publishConfig": {
71
+ "access": "public"
72
+ }
73
+ }