# Changelog
Make sure to use the same version for parsing and serializing saves, if possible.

### [4.1.1] (2026-04-25)
### Bugfix
* Barrel file included jest/test files, which it shouldnt.

### [4.1.0] (2026-04-25)
### Bugfix
* The state of inventory items and items on belts wasn't quite correct. Like the chainsaw stores energy value in its state.
* Items on belts referenced by `ConvyorChainActor`s had wrong positions/offsets. Because they were read as int32 instead of float32.

### [4.0.2] (2026-04-23)
### Bugfix
* StructProperty had `subtype` in typescript definition, even tho it is no longer filled.

### [4.0.1] (2026-04-18)
### Bugfix
* ByteProperty wasnt read correctly, when node purities were overwritten from 1.2 game mode.
* Harden some type guards

### [4.0.0] (2026-04-18)
## 1.2 Support, Breaking Changes
* Supporting 1.2 Saves and Blueprints. Usage from parsing did not change, but properties quite a bit. Taking the chance to trim some fat. Reach out if you still find bugs or have other ideas.
### Types
* Properties no longer have a `subtype`. instead check a property's `propertyTagType`. it more accurately describes nested subtypes. And would only be doubled with a `subtype` field. Technically the `propertyTagType` only exists in saves from late 1.1 on, but the parser constructs it artificially for older saves.
* Properties no longer have a `ueType`, since it now maps 1:1 on to the parsers `type` and the `propertyTagType`.
* ArrayProperties will have a `type=ArrayProperty`, no matter the subtype. So no longer `StrArrayProperty`. I keep type definitions and type guards for e.g. `StrArrayProperty, isStrArrayProperty(property)`, but they just evaluate on the `propertyTagType` anyway.
### ArrayProperties of StructProperties
* Their `structValueFields` moved over to -> `structTag`. But those are only present for saves 1.1 or lower.
* And the values of that ArrayProperty are now actual values of structproperties, no longer `StructProperty[]` as a whole. Which was inconsistent with other properties to be fair and a bug.
#### Parsed Output
* Shortened the resulting JSON. fields like `index`, `flag`, `propertyGuid` of a property are only included if they are not entirely 0.
### Blueprints
* `lastEditedBy` is called `lastEditedByLegacy` in blueprints from <= 1.1 saves. since its structure changes there.
#### Smaller Bugfixes & Renamings
* `ArrayProperty/SetProperty .AvailablePropertyTypes` -> is handled by `ArrayProperty/SetProperty`. check for type guards if you need them like `isStrArrayProperty()` or `isStrSetProperty()`
* fixed confusing `flags` with `guid` of a property. which was a bug.
* Rename `SoftObjectReference`'s `unk` -> `subPathString`.
* Rename `Int32Property` -> `IntProperty`to reflect the accuracte type.
* Some new fields and smaller internal renamings.
* the parsers internal context like `saveVersion` extended.
* `SaveReader.GetRoughSaveVersion` -> `SaveReader.GetApproximateSaveVersion`
* Removed deprecated `SaveStreamJsonStringifier` and `EDIT`.
* Keeping The ReadableStreamParser for now, but has lower priority.

### [3.3.1] (2026-02-08)
#### Quick Bugfixes
* Fix parsing a bit more of Mod FicsItNetworks.
* Fixed a bug where the parser would expect a list of unresolved save data at the end of the save, even though there is none.
* Fix exporting SoftObjectProperty

### [3.3.0] (2025-12-17)
#### Changed Behavior on Errors! see ([README.md](https://github.com/etothepii4/satisfactory-file-parser?tab=readme-ov-file#error-handling-from-331-on))
* The parser will no longer throw errors on encountering unknown properties or objects. Only if you explicitly specify `throwErrors: true` when calling the parser. Major errors on the overall save structure still get thrown.
* Made `AbstractBaseProperty` include `rawBytes`, in case properties can not be parsed. When you specify `throwErrors: false` when calling the parser, unparsed property data lands in there.
#### Bugfix
* Bugfix for Mods FicsItNetworks and Modular Load Balancers
* Some Internal types / functions got moved a bit

### [3.2.3] (2025-12-14)
#### Extending Mod Support
* Added FicsItNetworks mod support
#### Bugfix
* Made `AbstractBaseProperty` more robust, accepting any type extension.
#### Dependency Updates

### [3.2.2] (2025-11-29)
#### Bugfix
* Explicit return type for function

### [3.2.1] (2025-11-29)
#### SaveBodyValidation moved slightly
* `save.grids` and `save.gridHash` merged together in a `save.saveBodyValidation` property. This will not affect you, unless you specifically used them. But will break parsing/serializing saves of earlier parser versions.
#### MapProperty updated slightly
* Types exported by `MapProperty` changed slightly. The `MAP_STRUCT_KEY_PROXY` got renamed to `MAP_STRUCT_PROXY`. Values in MapProperties can be struct proxies too.
#### Extending Mod Support
* Added support for Modular Load Balancer Mod and Alternates

### [3.1.3] (2025-10-01)
#### Extending Mod Support
* Added Support for Mods that have custom levels/maps. Like the Platform Expansion Program

### [3.1.2] (2025-08-30)
#### Extending Mod Support
* Added Support for Circuitry Mod

### [3.1.1] (2025-08-24)
#### Bugfix for writing Blueprints
* Fixed a bug where serialized blueprints would have 4 bytes too much and would cause issues when reading again.
#### Internal Cleanup
* provided complete enums for custom versions `BlueprintHeaderVersion`, `SaveCustomVersion`, `SaveHeaderType`

### [3.0.3] (2025-08-08)
#### Internal Cleanup
* Renamed sample test saves to not include whitespaces.
* Made some function return types explicit instead of implicit.
* added publishing the package on jsr

### [3.0.2] (2025-06-25)
#### Bugfix for Dismantled Crashsites and Map Markers
* Dismantled Crashsites weren't parsed correctly. They now correctly show up in the `destroyedActors` field of the persistent level.
* Map Markers weren't parsed correctly. They should be fixed now.

### [3.0.1] (2025-04-20)
#### Breaking Changes in Save Structure for 1.1
* The save header in 1.1 has now the save file name. Which gets used over the passed name when the file is from 1.1.
* Save objects have 1-2 new fields.
* `BuildableSubsystemSpecialProperties` have now a slightly different structure. Their buildables `typePath` gets replaced with an object reference `typeReference`.
* SaveObject's field `unknownType2` is now called `shouldMigrateObjectRefsToPersistent`.
* SaveObject's field `objectVersion` is now called `saveCustomVersion`.
* Levels also have a field `saveCustomVersion`.
* `BuildableSubsystemSpecialProperties` have one more field (`currentLightweightVersion`).
* The `parentObjectRoot` and `parentObjectName` got merged to `parentObject` as a Reference struct, instead of two strings.
* The `objects` of `VehicleSpecialProperties` are now of type `VehiclePhysicsData` instead of just listing `unknownBytes`.
* Levels within a Save are not an array, but an object with level name as key now. You can use `Object.values(levels)`to get your array.
* Blueprint Configs have now a `configVersion`
* InventoryItems' naming of fields changed. `itemStateRaw` is now better resolved into individual `properties`
* InventoryItems have now a ObjectReference `itemReference` instead of the single string `itemName`, since that is more correct. InventoryItems' fields are also mostly optional due to compatibility.

#### Internal Updates
* Some internal changes like making Reader and Writer have context. To support different save versions.
* `SatisfactorySaveHeader` and `BlueprintHeader` have their own namespace now.


### [2.1.3] (2024-11-24)
#### Update README
* fixed link to auto-generated typedoc.

### [2.1.2] (2024-11-24)
#### Update README
* fixed link to auto-generated typedoc.

### [2.1.1] (2024-11-24)
#### Blueprint structure
* Item costs and recipes in a blueprint are now correctly treated as ObjectReference, instead a single path string.
#### Internal Updates
* Migrated the rest of the generic properties towards namespaces
#### Updated README examples
#### Provided auto-generated typedoc

### [2.0.1] (2024-10-31)
#### Normal Properties Update
* Most Normal Properties classes got refactored to namespaces as well. More will come. Please refrain from using instances of them. Background being, that its anyway only static methods and types.
* Since normal properties of an object are effectively always of type `AbstractBaseProperty | AbstractBaseProperty[]`, the `AbstractBaseProperty` has now all fields and `BasicProperty` got removed as there is no difference anymore between the two. They would be the same now.
* type guards of "normal" properties like `isObjectProperty()` accept now `any` as parameter and should work now as expected
* Since ArrayProperties and SetProperties in the save format dont necessarily always have the same structure as their subtype, I introduced own types like `StrArrayProperty` and `Int32SetProperty` with corresponding type guards (e.g. `isStrArrayProperty()`). Means more overhead in code, but hence its more correct in usage.
#### Bugfix
* The total conveyor length in the special properties of a ConveyorChainActor got serialized as int32, but correctly now serializes as float32.

### [1.1.1] (2024-10-21)
#### Improved Special Properties
* Improved on SpecialProperties of BuildableSubsystem and ConveyorChainActor as the meaning became more clear.
* Special Properties are refactored into their own namespaces and exported.
* The union type `SpecialAnyProperties` is now automatically derived and more concisely named `SpecialProperties.AvailableSpecialPropertiesTypes` instead, in case you need it.

### [1.0.3] (2024-10-17)
#### Hotfix
* fix being forced to use callbacks when writing saves or blueprints.

### [1.0.2] (2024-10-17)
#### Internal renaming
* `...SpecialProperty` got all renamed to `...SpecialProperties`.

### [1.0.1] (2024-10-17)
#### Major breaking changes on Parser usage
* Cleaned Usage methods of Save / Blueprint Parsing. The callbacks are an optional additional parameter object now instead of required.
* Re-Added a method to parse Saves in memory again. (sorry for the inconvenience)
#### Internal structure changes
* `SatisfactorySave` structure changed, the `grids` and `gridHash` fields are slightly different now, since their meaning became more clear. Not relevant for normal save editing.
* `Level` is a namespace instead of a class now, since the classes had only static methods anyway.
#### module build now includes source maps
#### module build should now include a docs folder for auto-generated documentation

### [0.5.1] (2024-10-15)
#### Added Mod Support
#### Internal Renamings
* `DynamicStructPropertyValue` extracted to own file.
* Parsing of object data partially moved to `SaveObject`.
* Renamed `DataFields` class to `PropertiesList`.
* Moved parsing of class-specific properties into own namespace.
* `ObjectProperty` and `SoftObjectProperty` now reuse the correct method for parsing/serializing the reference value.

### [0.4.22] (2024-10-07)
#### compatibility fix
* referenced icon libraries in blueprints are now optional when being parsed.

### [0.4.21] (2024-10-07)
#### internal package restructuring
* restructured some internal packages.
* provides now typeguards for every property.

### [0.4.20] (2024-10-06)
#### bugfix
* added parsing of icon library reference to parsing blueprints.

### [0.4.19] (2024-10-06)
#### Migrated repo to public github

### [0.4.18] (2024-10-05)
#### updated README

### [0.4.17] (2024-10-05)
#### updated README
#### bugfix
* `ClientIdentityInfo` field names and structure got changed, since the meaning is now more clear.
* removed trailing object list from satisfactory save object.
* deleted entities references get serialized again, just based on collectables list.

### [0.4.16] (2024-10-03)
#### bugfix
* exporting `isSaveEntity` and `isSaveComponent` again.

### [0.4.15] (2024-10-02)
#### updated README
* changelog document doesn't seem linkable, so it is in the readme for now.

### [0.4.14] (2024-10-02)
#### updated README
* updated the code examples with more context
#### Internal renamings (won't affect you if you stick to the code examples)
* improved the interface for abstract parser classes
* extended some error log messages
* added an additional check when parsing struct property InventoryItem, since ported saves often have a few more bytes.
* changed function name `writeFloat()` to `writeFloat32()` of the save writer.
* changed variable name `saveOrBlueprintIndicator` to `objectVersion` for objects, since the meaning of that number became now more clear.
