fit-file-parser 4.0.1 → 4.0.2

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
@@ -1,5 +1,12 @@
1
1
  # Change Log
2
2
 
3
+ ## 4.0.2
4
+
5
+ - Preserve record alignment when developer-field descriptions are missing or
6
+ appear after their message definitions.
7
+ - Decode subsequent developer-field values once their descriptions become
8
+ available, in both strict and force modes.
9
+
3
10
  ## 4.0.0
4
11
 
5
12
  ### FIT decoder performance
package/dist/binary.d.ts CHANGED
@@ -7,8 +7,16 @@ export interface MessageTypeDefinition {
7
7
  globalMessageNumber: number;
8
8
  numberOfFields: number;
9
9
  fieldDefs: FieldDefinition[];
10
+ developerFieldDefs?: DeveloperFieldDefinition[];
10
11
  rawData?: any[];
11
12
  }
13
+ export interface DeveloperFieldDefinition {
14
+ developerDataIndex: number;
15
+ fieldDefinitionNumber: number;
16
+ size: number;
17
+ resolvedFieldDef?: FieldDefinition;
18
+ resolvedFrom?: unknown;
19
+ }
12
20
  export declare function addEndian(littleEndian: boolean, bytes: number[]): number;
13
21
  export declare function readRecord(blob: Uint8Array, messageTypes: MessageTypeDefinition[], developerFields: any[], startIndex: number, options: FitParserOptions, startDate: number | undefined, pausedTime: number, dataView?: DataView): {
14
22
  messageType: MesgNum | '';
package/dist/binary.js CHANGED
@@ -333,8 +333,49 @@ function applyGarminProductName(fields) {
333
333
  fields.product_name = productName;
334
334
  }
335
335
  }
336
+ function resolveDeveloperFieldDefinition(developerFieldDef, littleEndian, developerFields, options) {
337
+ var _a, _b, _c, _d;
338
+ const description = (_a = developerFields[developerFieldDef.developerDataIndex]) === null || _a === void 0 ? void 0 : _a[developerFieldDef.fieldDefinitionNumber];
339
+ if (!description) {
340
+ developerFieldDef.resolvedFieldDef = undefined;
341
+ developerFieldDef.resolvedFrom = undefined;
342
+ return undefined;
343
+ }
344
+ if (developerFieldDef.resolvedFrom === description
345
+ && developerFieldDef.resolvedFieldDef) {
346
+ return developerFieldDef.resolvedFieldDef;
347
+ }
348
+ const baseType = description.fit_base_type_id;
349
+ const type = FIT.types.fit_base_type[baseType];
350
+ if (typeof baseType !== 'number' || type === undefined) {
351
+ developerFieldDef.resolvedFieldDef = undefined;
352
+ developerFieldDef.resolvedFrom = undefined;
353
+ if (options.force) {
354
+ return undefined;
355
+ }
356
+ throw new Error(`Unsupported base type for developer data index ${developerFieldDef.developerDataIndex}, field ${developerFieldDef.fieldDefinitionNumber}`);
357
+ }
358
+ const resolvedFieldDef = {
359
+ type,
360
+ fDefNo: developerFieldDef.fieldDefinitionNumber,
361
+ size: developerFieldDef.size,
362
+ endianAbility: (baseType & 128) === 128,
363
+ littleEndian,
364
+ baseTypeNo: baseType,
365
+ name: (_b = description.field_name) !== null && _b !== void 0 ? _b : '',
366
+ dataType: getFitMessageBaseType(baseType & 15),
367
+ scale: (_c = description.scale) !== null && _c !== void 0 ? _c : 1,
368
+ offset: (_d = description.offset) !== null && _d !== void 0 ? _d : 0,
369
+ requiresBoundedDataView: requiresBoundedEndianDataView(type, developerFieldDef.size),
370
+ developerDataIndex: developerFieldDef.developerDataIndex,
371
+ isDeveloperField: true,
372
+ };
373
+ developerFieldDef.resolvedFieldDef = resolvedFieldDef;
374
+ developerFieldDef.resolvedFrom = description;
375
+ return resolvedFieldDef;
376
+ }
336
377
  export function readRecord(blob, messageTypes, developerFields, startIndex, options, startDate, pausedTime, dataView = new DataView(blob.buffer, blob.byteOffset, blob.byteLength)) {
337
- var _a, _b, _c, _d, _e;
378
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
338
379
  const recordHeader = blob[startIndex];
339
380
  let localMessageType = recordHeader & 15;
340
381
  if ((recordHeader & CompressedHeaderMask) === CompressedHeaderMask) {
@@ -358,6 +399,7 @@ export function readRecord(blob, messageTypes, developerFields, startIndex, opti
358
399
  ]),
359
400
  numberOfFields: numberOfFields + numberOfDeveloperDataFields,
360
401
  fieldDefs: [],
402
+ developerFieldDefs: [],
361
403
  rawData: [],
362
404
  };
363
405
  const message = getFitMessage(mTypeDef.globalMessageNumber);
@@ -380,41 +422,15 @@ export function readRecord(blob, messageTypes, developerFields, startIndex, opti
380
422
  };
381
423
  mTypeDef.fieldDefs.push(fDef);
382
424
  }
383
- // numberOfDeveloperDataFields = 0 so it wont crash here and wont loop
384
425
  for (let i = 0; i < numberOfDeveloperDataFields; i++) {
385
- // If we fail to parse then try catch
386
- try {
387
- const fDefIndex = startIndex + 6 + numberOfFields * 3 + 1 + i * 3;
388
- const fieldNum = blob[fDefIndex];
389
- const size = blob[fDefIndex + 1];
390
- const devDataIndex = blob[fDefIndex + 2];
391
- const devDef = developerFields[devDataIndex][fieldNum];
392
- const baseType = devDef.fit_base_type_id;
393
- const fDef = {
394
- type: FIT.types.fit_base_type[baseType],
395
- fDefNo: fieldNum,
396
- size,
397
- endianAbility: (baseType & 128) === 128,
398
- littleEndian: lEnd,
399
- baseTypeNo: baseType,
400
- name: devDef.field_name,
401
- dataType: getFitMessageBaseType(baseType & 15),
402
- scale: devDef.scale || 1,
403
- offset: devDef.offset || 0,
404
- requiresBoundedDataView: requiresBoundedEndianDataView(FIT.types.fit_base_type[baseType], size),
405
- developerDataIndex: devDataIndex,
406
- isDeveloperField: true,
407
- };
408
- mTypeDef.fieldDefs.push(fDef);
409
- }
410
- catch (e) {
411
- if (options.force) {
412
- continue;
413
- }
414
- throw e;
415
- }
426
+ const fDefIndex = startIndex + 6 + numberOfFields * 3 + 1 + i * 3;
427
+ (_a = mTypeDef.developerFieldDefs) === null || _a === void 0 ? void 0 : _a.push({
428
+ fieldDefinitionNumber: blob[fDefIndex],
429
+ size: blob[fDefIndex + 1],
430
+ developerDataIndex: blob[fDefIndex + 2],
431
+ });
416
432
  }
417
- mTypeDef.rawData = Array.from({ length: mTypeDef.fieldDefs.length }, () => InvalidFieldData);
433
+ mTypeDef.rawData = Array.from({ length: mTypeDef.numberOfFields }, () => InvalidFieldData);
418
434
  messageTypes[localMessageType] = mTypeDef;
419
435
  const nextIndex = startIndex + 6 + mTypeDef.numberOfFields * 3;
420
436
  const nextIndexWithDeveloperData = nextIndex + 1;
@@ -430,7 +446,9 @@ export function readRecord(blob, messageTypes, developerFields, startIndex, opti
430
446
  let readDataFromIndex = startIndex + 1;
431
447
  const fields = {};
432
448
  const message = getFitMessage(messageType.globalMessageNumber);
433
- const rawData = (_a = messageType.rawData) !== null && _a !== void 0 ? _a : (messageType.rawData = Array.from({ length: messageType.fieldDefs.length }, () => InvalidFieldData));
449
+ const developerFieldDefs = (_b = messageType.developerFieldDefs) !== null && _b !== void 0 ? _b : [];
450
+ const totalFieldCount = messageType.fieldDefs.length + developerFieldDefs.length;
451
+ const rawData = (_c = messageType.rawData) !== null && _c !== void 0 ? _c : (messageType.rawData = Array.from({ length: totalFieldCount }, () => InvalidFieldData));
434
452
  let validFieldCount = 0;
435
453
  for (let i = 0; i < messageType.fieldDefs.length; i++) {
436
454
  const fDef = messageType.fieldDefs[i];
@@ -445,6 +463,26 @@ export function readRecord(blob, messageTypes, developerFields, startIndex, opti
445
463
  readDataFromIndex += fDef.size;
446
464
  messageSize += fDef.size;
447
465
  }
466
+ for (let i = 0; i < developerFieldDefs.length; i++) {
467
+ const developerFieldDef = developerFieldDefs[i];
468
+ const rawDataIndex = messageType.fieldDefs.length + i;
469
+ const fDef = resolveDeveloperFieldDefinition(developerFieldDef, messageType.littleEndian, developerFields, options);
470
+ if (fDef) {
471
+ const data = readData(blob, dataView, fDef, readDataFromIndex, options);
472
+ if (!isInvalidValue(data, fDef.type) && !isInvalidBaseTypeValue(data, fDef.baseTypeNo)) {
473
+ rawData[rawDataIndex] = data;
474
+ validFieldCount++;
475
+ }
476
+ else {
477
+ rawData[rawDataIndex] = InvalidFieldData;
478
+ }
479
+ }
480
+ else {
481
+ rawData[rawDataIndex] = InvalidFieldData;
482
+ }
483
+ readDataFromIndex += developerFieldDef.size;
484
+ messageSize += developerFieldDef.size;
485
+ }
448
486
  for (let i = 0; i < messageType.fieldDefs.length; i++) {
449
487
  const data = rawData[i];
450
488
  if (data === InvalidFieldData) {
@@ -456,6 +494,17 @@ export function readRecord(blob, messageTypes, developerFields, startIndex, opti
456
494
  fields[field] = data;
457
495
  }
458
496
  }
497
+ for (let i = 0; i < developerFieldDefs.length; i++) {
498
+ const data = rawData[messageType.fieldDefs.length + i];
499
+ const fDef = developerFieldDefs[i].resolvedFieldDef;
500
+ if (data === InvalidFieldData || !fDef) {
501
+ continue;
502
+ }
503
+ const field = fDef.name;
504
+ if (field !== 'unknown' && field !== '') {
505
+ fields[field] = data;
506
+ }
507
+ }
459
508
  for (let i = 0; i < messageType.fieldDefs.length; i++) {
460
509
  const data = rawData[i];
461
510
  if (data === InvalidFieldData) {
@@ -465,19 +514,30 @@ export function readRecord(blob, messageTypes, developerFields, startIndex, opti
465
514
  if (fDef.isDeveloperField) {
466
515
  const field = fDef.name;
467
516
  const { type } = fDef;
468
- const scale = (_b = fDef.scale) !== null && _b !== void 0 ? _b : null;
469
- const offset = (_c = fDef.offset) !== null && _c !== void 0 ? _c : 0;
517
+ const scale = (_d = fDef.scale) !== null && _d !== void 0 ? _d : null;
518
+ const offset = (_e = fDef.offset) !== null && _e !== void 0 ? _e : 0;
470
519
  fields[fDef.name] = applyOptions(formatByType(data, type, scale, offset), field, options, fields);
471
520
  }
472
521
  else {
473
522
  const { name: field, type } = fDef;
474
- const scale = (_d = fDef.scale) !== null && _d !== void 0 ? _d : null;
475
- const offset = (_e = fDef.offset) !== null && _e !== void 0 ? _e : 0;
523
+ const scale = (_f = fDef.scale) !== null && _f !== void 0 ? _f : null;
524
+ const offset = (_g = fDef.offset) !== null && _g !== void 0 ? _g : 0;
476
525
  if (field !== 'unknown' && field !== '' && field !== undefined) {
477
526
  fields[field] = applyOptions(formatByType(data, type, scale, offset), field, options, fields);
478
527
  }
479
528
  }
480
529
  }
530
+ for (let i = 0; i < developerFieldDefs.length; i++) {
531
+ const data = rawData[messageType.fieldDefs.length + i];
532
+ const fDef = developerFieldDefs[i].resolvedFieldDef;
533
+ if (data === InvalidFieldData || !fDef) {
534
+ continue;
535
+ }
536
+ const field = fDef.name;
537
+ if (field !== 'unknown' && field !== '') {
538
+ fields[field] = applyOptions(formatByType(data, fDef.type, (_h = fDef.scale) !== null && _h !== void 0 ? _h : null, (_j = fDef.offset) !== null && _j !== void 0 ? _j : 0), field, options, fields);
539
+ }
540
+ }
481
541
  applyGarminProductName(fields);
482
542
  if (validFieldCount > 0 && message.name === 'record' && options.elapsedRecordField) {
483
543
  fields.elapsed_time = (fields.timestamp - (startDate || 0)) / 1000;
@@ -7,8 +7,16 @@ export interface MessageTypeDefinition {
7
7
  globalMessageNumber: number;
8
8
  numberOfFields: number;
9
9
  fieldDefs: FieldDefinition[];
10
+ developerFieldDefs?: DeveloperFieldDefinition[];
10
11
  rawData?: any[];
11
12
  }
13
+ export interface DeveloperFieldDefinition {
14
+ developerDataIndex: number;
15
+ fieldDefinitionNumber: number;
16
+ size: number;
17
+ resolvedFieldDef?: FieldDefinition;
18
+ resolvedFrom?: unknown;
19
+ }
12
20
  export declare function addEndian(littleEndian: boolean, bytes: number[]): number;
13
21
  export declare function readRecord(blob: Uint8Array, messageTypes: MessageTypeDefinition[], developerFields: any[], startIndex: number, options: FitParserOptions, startDate: number | undefined, pausedTime: number, dataView?: DataView): {
14
22
  messageType: MesgNum | '';
@@ -339,8 +339,49 @@ function applyGarminProductName(fields) {
339
339
  fields.product_name = productName;
340
340
  }
341
341
  }
342
+ function resolveDeveloperFieldDefinition(developerFieldDef, littleEndian, developerFields, options) {
343
+ var _a, _b, _c, _d;
344
+ const description = (_a = developerFields[developerFieldDef.developerDataIndex]) === null || _a === void 0 ? void 0 : _a[developerFieldDef.fieldDefinitionNumber];
345
+ if (!description) {
346
+ developerFieldDef.resolvedFieldDef = undefined;
347
+ developerFieldDef.resolvedFrom = undefined;
348
+ return undefined;
349
+ }
350
+ if (developerFieldDef.resolvedFrom === description
351
+ && developerFieldDef.resolvedFieldDef) {
352
+ return developerFieldDef.resolvedFieldDef;
353
+ }
354
+ const baseType = description.fit_base_type_id;
355
+ const type = fit_js_1.FIT.types.fit_base_type[baseType];
356
+ if (typeof baseType !== 'number' || type === undefined) {
357
+ developerFieldDef.resolvedFieldDef = undefined;
358
+ developerFieldDef.resolvedFrom = undefined;
359
+ if (options.force) {
360
+ return undefined;
361
+ }
362
+ throw new Error(`Unsupported base type for developer data index ${developerFieldDef.developerDataIndex}, field ${developerFieldDef.fieldDefinitionNumber}`);
363
+ }
364
+ const resolvedFieldDef = {
365
+ type,
366
+ fDefNo: developerFieldDef.fieldDefinitionNumber,
367
+ size: developerFieldDef.size,
368
+ endianAbility: (baseType & 128) === 128,
369
+ littleEndian,
370
+ baseTypeNo: baseType,
371
+ name: (_b = description.field_name) !== null && _b !== void 0 ? _b : '',
372
+ dataType: (0, messages_js_1.getFitMessageBaseType)(baseType & 15),
373
+ scale: (_c = description.scale) !== null && _c !== void 0 ? _c : 1,
374
+ offset: (_d = description.offset) !== null && _d !== void 0 ? _d : 0,
375
+ requiresBoundedDataView: requiresBoundedEndianDataView(type, developerFieldDef.size),
376
+ developerDataIndex: developerFieldDef.developerDataIndex,
377
+ isDeveloperField: true,
378
+ };
379
+ developerFieldDef.resolvedFieldDef = resolvedFieldDef;
380
+ developerFieldDef.resolvedFrom = description;
381
+ return resolvedFieldDef;
382
+ }
342
383
  function readRecord(blob, messageTypes, developerFields, startIndex, options, startDate, pausedTime, dataView = new DataView(blob.buffer, blob.byteOffset, blob.byteLength)) {
343
- var _a, _b, _c, _d, _e;
384
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
344
385
  const recordHeader = blob[startIndex];
345
386
  let localMessageType = recordHeader & 15;
346
387
  if ((recordHeader & CompressedHeaderMask) === CompressedHeaderMask) {
@@ -364,6 +405,7 @@ function readRecord(blob, messageTypes, developerFields, startIndex, options, st
364
405
  ]),
365
406
  numberOfFields: numberOfFields + numberOfDeveloperDataFields,
366
407
  fieldDefs: [],
408
+ developerFieldDefs: [],
367
409
  rawData: [],
368
410
  };
369
411
  const message = (0, messages_js_1.getFitMessage)(mTypeDef.globalMessageNumber);
@@ -386,41 +428,15 @@ function readRecord(blob, messageTypes, developerFields, startIndex, options, st
386
428
  };
387
429
  mTypeDef.fieldDefs.push(fDef);
388
430
  }
389
- // numberOfDeveloperDataFields = 0 so it wont crash here and wont loop
390
431
  for (let i = 0; i < numberOfDeveloperDataFields; i++) {
391
- // If we fail to parse then try catch
392
- try {
393
- const fDefIndex = startIndex + 6 + numberOfFields * 3 + 1 + i * 3;
394
- const fieldNum = blob[fDefIndex];
395
- const size = blob[fDefIndex + 1];
396
- const devDataIndex = blob[fDefIndex + 2];
397
- const devDef = developerFields[devDataIndex][fieldNum];
398
- const baseType = devDef.fit_base_type_id;
399
- const fDef = {
400
- type: fit_js_1.FIT.types.fit_base_type[baseType],
401
- fDefNo: fieldNum,
402
- size,
403
- endianAbility: (baseType & 128) === 128,
404
- littleEndian: lEnd,
405
- baseTypeNo: baseType,
406
- name: devDef.field_name,
407
- dataType: (0, messages_js_1.getFitMessageBaseType)(baseType & 15),
408
- scale: devDef.scale || 1,
409
- offset: devDef.offset || 0,
410
- requiresBoundedDataView: requiresBoundedEndianDataView(fit_js_1.FIT.types.fit_base_type[baseType], size),
411
- developerDataIndex: devDataIndex,
412
- isDeveloperField: true,
413
- };
414
- mTypeDef.fieldDefs.push(fDef);
415
- }
416
- catch (e) {
417
- if (options.force) {
418
- continue;
419
- }
420
- throw e;
421
- }
432
+ const fDefIndex = startIndex + 6 + numberOfFields * 3 + 1 + i * 3;
433
+ (_a = mTypeDef.developerFieldDefs) === null || _a === void 0 ? void 0 : _a.push({
434
+ fieldDefinitionNumber: blob[fDefIndex],
435
+ size: blob[fDefIndex + 1],
436
+ developerDataIndex: blob[fDefIndex + 2],
437
+ });
422
438
  }
423
- mTypeDef.rawData = Array.from({ length: mTypeDef.fieldDefs.length }, () => InvalidFieldData);
439
+ mTypeDef.rawData = Array.from({ length: mTypeDef.numberOfFields }, () => InvalidFieldData);
424
440
  messageTypes[localMessageType] = mTypeDef;
425
441
  const nextIndex = startIndex + 6 + mTypeDef.numberOfFields * 3;
426
442
  const nextIndexWithDeveloperData = nextIndex + 1;
@@ -436,7 +452,9 @@ function readRecord(blob, messageTypes, developerFields, startIndex, options, st
436
452
  let readDataFromIndex = startIndex + 1;
437
453
  const fields = {};
438
454
  const message = (0, messages_js_1.getFitMessage)(messageType.globalMessageNumber);
439
- const rawData = (_a = messageType.rawData) !== null && _a !== void 0 ? _a : (messageType.rawData = Array.from({ length: messageType.fieldDefs.length }, () => InvalidFieldData));
455
+ const developerFieldDefs = (_b = messageType.developerFieldDefs) !== null && _b !== void 0 ? _b : [];
456
+ const totalFieldCount = messageType.fieldDefs.length + developerFieldDefs.length;
457
+ const rawData = (_c = messageType.rawData) !== null && _c !== void 0 ? _c : (messageType.rawData = Array.from({ length: totalFieldCount }, () => InvalidFieldData));
440
458
  let validFieldCount = 0;
441
459
  for (let i = 0; i < messageType.fieldDefs.length; i++) {
442
460
  const fDef = messageType.fieldDefs[i];
@@ -451,6 +469,26 @@ function readRecord(blob, messageTypes, developerFields, startIndex, options, st
451
469
  readDataFromIndex += fDef.size;
452
470
  messageSize += fDef.size;
453
471
  }
472
+ for (let i = 0; i < developerFieldDefs.length; i++) {
473
+ const developerFieldDef = developerFieldDefs[i];
474
+ const rawDataIndex = messageType.fieldDefs.length + i;
475
+ const fDef = resolveDeveloperFieldDefinition(developerFieldDef, messageType.littleEndian, developerFields, options);
476
+ if (fDef) {
477
+ const data = readData(blob, dataView, fDef, readDataFromIndex, options);
478
+ if (!isInvalidValue(data, fDef.type) && !isInvalidBaseTypeValue(data, fDef.baseTypeNo)) {
479
+ rawData[rawDataIndex] = data;
480
+ validFieldCount++;
481
+ }
482
+ else {
483
+ rawData[rawDataIndex] = InvalidFieldData;
484
+ }
485
+ }
486
+ else {
487
+ rawData[rawDataIndex] = InvalidFieldData;
488
+ }
489
+ readDataFromIndex += developerFieldDef.size;
490
+ messageSize += developerFieldDef.size;
491
+ }
454
492
  for (let i = 0; i < messageType.fieldDefs.length; i++) {
455
493
  const data = rawData[i];
456
494
  if (data === InvalidFieldData) {
@@ -462,6 +500,17 @@ function readRecord(blob, messageTypes, developerFields, startIndex, options, st
462
500
  fields[field] = data;
463
501
  }
464
502
  }
503
+ for (let i = 0; i < developerFieldDefs.length; i++) {
504
+ const data = rawData[messageType.fieldDefs.length + i];
505
+ const fDef = developerFieldDefs[i].resolvedFieldDef;
506
+ if (data === InvalidFieldData || !fDef) {
507
+ continue;
508
+ }
509
+ const field = fDef.name;
510
+ if (field !== 'unknown' && field !== '') {
511
+ fields[field] = data;
512
+ }
513
+ }
465
514
  for (let i = 0; i < messageType.fieldDefs.length; i++) {
466
515
  const data = rawData[i];
467
516
  if (data === InvalidFieldData) {
@@ -471,19 +520,30 @@ function readRecord(blob, messageTypes, developerFields, startIndex, options, st
471
520
  if (fDef.isDeveloperField) {
472
521
  const field = fDef.name;
473
522
  const { type } = fDef;
474
- const scale = (_b = fDef.scale) !== null && _b !== void 0 ? _b : null;
475
- const offset = (_c = fDef.offset) !== null && _c !== void 0 ? _c : 0;
523
+ const scale = (_d = fDef.scale) !== null && _d !== void 0 ? _d : null;
524
+ const offset = (_e = fDef.offset) !== null && _e !== void 0 ? _e : 0;
476
525
  fields[fDef.name] = applyOptions(formatByType(data, type, scale, offset), field, options, fields);
477
526
  }
478
527
  else {
479
528
  const { name: field, type } = fDef;
480
- const scale = (_d = fDef.scale) !== null && _d !== void 0 ? _d : null;
481
- const offset = (_e = fDef.offset) !== null && _e !== void 0 ? _e : 0;
529
+ const scale = (_f = fDef.scale) !== null && _f !== void 0 ? _f : null;
530
+ const offset = (_g = fDef.offset) !== null && _g !== void 0 ? _g : 0;
482
531
  if (field !== 'unknown' && field !== '' && field !== undefined) {
483
532
  fields[field] = applyOptions(formatByType(data, type, scale, offset), field, options, fields);
484
533
  }
485
534
  }
486
535
  }
536
+ for (let i = 0; i < developerFieldDefs.length; i++) {
537
+ const data = rawData[messageType.fieldDefs.length + i];
538
+ const fDef = developerFieldDefs[i].resolvedFieldDef;
539
+ if (data === InvalidFieldData || !fDef) {
540
+ continue;
541
+ }
542
+ const field = fDef.name;
543
+ if (field !== 'unknown' && field !== '') {
544
+ fields[field] = applyOptions(formatByType(data, fDef.type, (_h = fDef.scale) !== null && _h !== void 0 ? _h : null, (_j = fDef.offset) !== null && _j !== void 0 ? _j : 0), field, options, fields);
545
+ }
546
+ }
487
547
  applyGarminProductName(fields);
488
548
  if (validFieldCount > 0 && message.name === 'record' && options.elapsedRecordField) {
489
549
  fields.elapsed_time = (fields.timestamp - (startDate || 0)) / 1000;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "fit-file-parser",
3
3
  "type": "module",
4
- "version": "4.0.1",
4
+ "version": "4.0.2",
5
5
  "private": false,
6
6
  "description": "Parse your .FIT files easily, directly from JS (Garmin, Polar, Suunto)",
7
7
  "author": {