@k67/kaitai-struct-ts 0.7.2 → 0.8.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/README.md CHANGED
@@ -3,13 +3,14 @@
3
3
 
4
4
  # kaitai-struct-ts
5
5
 
6
- [![npm version](https://badge.fury.io/js/%40k67%2Fkaitai-struct-ts.svg)](https://www.npmjs.com/package/@k67/kaitai-struct-ts)
7
- [![CI](https://github.com/fabianopinto/kaitai-struct-ts/workflows/CI/badge.svg)](https://github.com/fabianopinto/kaitai-struct-ts/actions)
8
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
9
- [![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue.svg)](https://www.typescriptlang.org/)
10
- [![Node.js](https://img.shields.io/badge/Node.js-18%2B-green.svg)](https://nodejs.org/)
6
+ [![npm version](https://badge.fury.io/js/%40k67%2Fkaitai-struct-ts.svg)](https://www.npmjs.com/package/@k67/kaitai-struct-ts)
7
+ [![CI](https://github.com/fabianopinto/kaitai-struct-ts/workflows/CI/badge.svg)](https://github.com/fabianopinto/kaitai-struct-ts/actions)
8
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
9
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue.svg)](https://www.typescriptlang.org/)
10
+ [![Node.js](https://img.shields.io/badge/Node.js-18%2B-green.svg)](https://nodejs.org/)
11
+
12
+ **A runtime interpreter for [Kaitai Struct](https://kaitai.io/) binary format definitions in TypeScript.**
11
13
 
12
- **A runtime interpreter for [Kaitai Struct](https://kaitai.io/) binary format definitions in TypeScript.**
13
14
  </div>
14
15
 
15
16
  ---
@@ -19,6 +20,7 @@ Parse any binary data format by providing a `.ksy` (Kaitai Struct YAML) definiti
19
20
  ## Features
20
21
 
21
22
  ### Core Features
23
+
22
24
  - 🚀 **Runtime interpretation** - No code generation needed
23
25
  - 📦 **Zero dependencies** (runtime) - Only YAML parser for development
24
26
  - 🎯 **TypeScript native** - Full type safety and IntelliSense support
@@ -27,6 +29,7 @@ Parse any binary data format by providing a `.ksy` (Kaitai Struct YAML) definiti
27
29
  - 📖 **Well documented** - Clear API and examples
28
30
 
29
31
  ### Advanced Features
32
+
30
33
  - ⚡ **Expression evaluation** - Full support for Kaitai expressions
31
34
  - 🔀 **Switch/case types** - Dynamic type selection based on data
32
35
  - 💎 **Instances** - Lazy-evaluated fields with caching
@@ -110,6 +113,7 @@ console.log(result.name)
110
113
  **Completion:** ~95% toward v1.0.0
111
114
 
112
115
  ### ✅ Fully Implemented
116
+
113
117
  - **Core Runtime** - Complete binary stream reader with all primitive types
114
118
  - **KSY Parser** - Full YAML parser with schema validation
115
119
  - **Type Interpreter** - Execute schemas against binary data
@@ -120,6 +124,7 @@ console.log(result.name)
120
124
  - **Documentation** - Complete user and developer documentation
121
125
 
122
126
  ### 🔄 Remaining for v1.0.0
127
+
123
128
  - Substream processing (zlib, encryption)
124
129
  - Type imports across files
125
130
  - Additional performance optimizations
@@ -133,6 +138,7 @@ See [docs/development/PROGRESS.md](./docs/development/PROGRESS.md) for detailed
133
138
  Parse binary data using a Kaitai Struct definition.
134
139
 
135
140
  **Parameters:**
141
+
136
142
  - `ksy` - YAML string containing the .ksy definition
137
143
  - `buffer` - Binary data to parse
138
144
  - `options` - Optional parsing options (validate, strict)
@@ -140,6 +146,7 @@ Parse binary data using a Kaitai Struct definition.
140
146
  **Returns:** Parsed object with fields defined in the .ksy file
141
147
 
142
148
  **Example:**
149
+
143
150
  ```typescript
144
151
  import { parse } from 'kaitai-struct-ts'
145
152
 
@@ -176,6 +183,7 @@ kaitai format.ksy data.bin --quiet # Quiet mode
176
183
  **📖 Full CLI Documentation:** [docs/CLI.md](./docs/CLI.md)
177
184
 
178
185
  **Quick Reference:**
186
+
179
187
  - `-o, --output <file>` - Write to file
180
188
  - `--field <path>` - Extract specific field
181
189
  - `-q, --quiet` - Suppress progress messages
@@ -219,6 +227,7 @@ pnpm format
219
227
  ## Roadmap
220
228
 
221
229
  ### ✅ Phase 1: Foundation (v0.1.0) - Complete
230
+
222
231
  - ✅ Binary stream reader (KaitaiStream)
223
232
  - ✅ All primitive types (u1-u8, s1-s8, f4, f8)
224
233
  - ✅ String encoding (UTF-8, ASCII, Latin-1, UTF-16)
@@ -226,6 +235,7 @@ pnpm format
226
235
  - ✅ Error handling system
227
236
 
228
237
  ### ✅ Phase 2: Core Features (v0.2.0-v0.4.0) - Complete
238
+
229
239
  - ✅ KSY parser with validation
230
240
  - ✅ Type interpreter
231
241
  - ✅ Expression evaluator (full Kaitai expression language)
@@ -235,6 +245,7 @@ pnpm format
235
245
  - ✅ Nested user-defined types
236
246
 
237
247
  ### ✅ Phase 3: Advanced Features (v0.5.0-v0.6.0) - Complete
248
+
238
249
  - ✅ Switch/case type selection
239
250
  - ✅ Instances (lazy-evaluated fields with caching)
240
251
  - ✅ Parametric types
@@ -243,11 +254,13 @@ pnpm format
243
254
  - ✅ Processing framework (ready for zlib/encryption)
244
255
 
245
256
  ### ✅ Phase 4: CLI & Polish (v0.7.0) - Complete
257
+
246
258
  - ✅ Command-line interface
247
259
  - ✅ Documentation reorganization
248
260
  - ✅ Production-ready release
249
261
 
250
262
  ### 🔄 Phase 5: v1.0.0 - Final Polish (In Progress)
263
+
251
264
  - ⏳ Processing implementations (zlib, encryption)
252
265
  - ⏳ Type imports across files
253
266
  - ⏳ Additional performance optimizations
package/dist/cli.js CHANGED
@@ -2313,7 +2313,14 @@ var TypeInterpreter = class _TypeInterpreter {
2313
2313
  return this.readFloat(base, endian, stream);
2314
2314
  }
2315
2315
  if (isStringType(type)) {
2316
- throw new ParseError("String types require size, size-eos, or terminator");
2316
+ const encoding = this.schema.meta?.encoding || "UTF-8";
2317
+ if (type === "strz") {
2318
+ return stream.readStrz(encoding, 0, false, true, true);
2319
+ } else if (type === "str") {
2320
+ throw new ParseError(
2321
+ "str type requires size, size-eos, or terminator attribute"
2322
+ );
2323
+ }
2317
2324
  }
2318
2325
  throw new ParseError(`Unknown built-in type: ${type}`);
2319
2326
  }
@@ -2424,7 +2431,16 @@ function parse(ksyYaml, buffer, options = {}) {
2424
2431
  }
2425
2432
 
2426
2433
  // src/cli.ts
2427
- var VERSION = "0.7.1";
2434
+ function getVersion() {
2435
+ try {
2436
+ const packageJsonPath = (0, import_path.join)(__dirname, "..", "package.json");
2437
+ const packageJson = JSON.parse((0, import_fs.readFileSync)(packageJsonPath, "utf-8"));
2438
+ return packageJson.version;
2439
+ } catch {
2440
+ return "unknown";
2441
+ }
2442
+ }
2443
+ var VERSION = getVersion();
2428
2444
  var HELP_TEXT = `
2429
2445
  kaitai - Parse binary files using Kaitai Struct definitions
2430
2446
 
@@ -2546,11 +2562,17 @@ function extractField(obj, path) {
2546
2562
  }
2547
2563
  return current;
2548
2564
  }
2565
+ function jsonReplacer(_key, value) {
2566
+ if (typeof value === "bigint") {
2567
+ return value.toString();
2568
+ }
2569
+ return value;
2570
+ }
2549
2571
  function formatOutput(data, format, pretty) {
2550
2572
  if (format === "yaml") {
2551
- return JSON.stringify(data, null, 2).replace(/^{$/gm, "").replace(/^}$/gm, "").replace(/^\s*"([^"]+)":\s*/gm, "$1: ").replace(/,$/gm, "");
2573
+ return JSON.stringify(data, jsonReplacer, 2).replace(/^{$/gm, "").replace(/^}$/gm, "").replace(/^\s*"([^"]+)":\s*/gm, "$1: ").replace(/,$/gm, "");
2552
2574
  }
2553
- return pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
2575
+ return pretty ? JSON.stringify(data, jsonReplacer, 2) : JSON.stringify(data, jsonReplacer);
2554
2576
  }
2555
2577
  function main() {
2556
2578
  const { options, positional } = parseCliArgs();
package/dist/index.js CHANGED
@@ -2347,7 +2347,14 @@ var TypeInterpreter = class _TypeInterpreter {
2347
2347
  return this.readFloat(base, endian, stream);
2348
2348
  }
2349
2349
  if (isStringType(type)) {
2350
- throw new ParseError("String types require size, size-eos, or terminator");
2350
+ const encoding = this.schema.meta?.encoding || "UTF-8";
2351
+ if (type === "strz") {
2352
+ return stream.readStrz(encoding, 0, false, true, true);
2353
+ } else if (type === "str") {
2354
+ throw new ParseError(
2355
+ "str type requires size, size-eos, or terminator attribute"
2356
+ );
2357
+ }
2351
2358
  }
2352
2359
  throw new ParseError(`Unknown built-in type: ${type}`);
2353
2360
  }