diff --git a/packages/psd/src/classes/Group.ts b/packages/psd/src/classes/Group.ts index 4259e15..491695c 100644 --- a/packages/psd/src/classes/Group.ts +++ b/packages/psd/src/classes/Group.ts @@ -2,7 +2,7 @@ // Copyright 2021-present NAVER WEBTOON // MIT License -import {GroupFrame} from "../sections"; +import {GroupFrame, LayerProperties} from "../sections"; import {NodeChild, NodeParent} from "./Node"; import {NodeBase} from "./NodeBase"; @@ -30,6 +30,12 @@ export class Group implements NodeBase { return this.parent.composedOpacity * (this.opacity / 255); } + get additionalProperties(): + | LayerProperties["additionalLayerProperties"] + | undefined { + return this.layerFrame?.layerProperties.additionalLayerProperties; + } + addChild(node: NodeChild): void { this.children.push(node); } diff --git a/packages/psd/src/classes/Psd.ts b/packages/psd/src/classes/Psd.ts index dacc185..aa27e90 100644 --- a/packages/psd/src/classes/Psd.ts +++ b/packages/psd/src/classes/Psd.ts @@ -38,7 +38,7 @@ export class Psd extends Synthesizable implements NodeBase { public readonly globalLightAngle?: number = undefined; public readonly globalLightAltitude?: number = undefined; public readonly resolutionInfo?: ResolutionInfo = undefined; - public readonly additionalLayerProperties: AdditionalLayerProperties = []; + public readonly additionalLayerProperties: AdditionalLayerProperties = {}; static parse(buffer: ArrayBuffer): Psd { const parsingResult = parse(buffer); diff --git a/packages/psd/src/index.ts b/packages/psd/src/index.ts index 5bba240..edfac03 100644 --- a/packages/psd/src/index.ts +++ b/packages/psd/src/index.ts @@ -12,6 +12,8 @@ export { SliceOrigin, DimensionUnit, ResolutionUnit, + AliKey, + PathRecordType, } from "./interfaces"; export type {Guide} from "./interfaces"; diff --git a/packages/psd/src/sections/LayerAndMaskInformation/interfaces.ts b/packages/psd/src/sections/LayerAndMaskInformation/interfaces.ts index e920670..e67f722 100644 --- a/packages/psd/src/sections/LayerAndMaskInformation/interfaces.ts +++ b/packages/psd/src/sections/LayerAndMaskInformation/interfaces.ts @@ -45,7 +45,9 @@ export interface Frame { layerRecord?: LayerRecord; } -export type AdditionalLayerProperties = AdditionalLayerInfo[]; +export type AdditionalLayerProperties = { + [K in AdditionalLayerInfo as K["key"]]?: K; +}; export interface LayerProperties { name: string; @@ -88,6 +90,10 @@ export const createLayerProperties = ( additionalLayerInfos, } = layerRecord; + const additionalLayerProperties = Object.fromEntries( + additionalLayerInfos.map((ali) => [ali.key, ali]) + ) as AdditionalLayerProperties; + return { name, top, @@ -103,7 +109,7 @@ export const createLayerProperties = ( text: layerText, textProperties: engineData, maskData, - additionalLayerProperties: additionalLayerInfos, + additionalLayerProperties, }; }; diff --git a/packages/psd/src/sections/LayerAndMaskInformation/readLayerRecordsAndChannels.ts b/packages/psd/src/sections/LayerAndMaskInformation/readLayerRecordsAndChannels.ts index 73344ca..bc4a8ae 100644 --- a/packages/psd/src/sections/LayerAndMaskInformation/readLayerRecordsAndChannels.ts +++ b/packages/psd/src/sections/LayerAndMaskInformation/readLayerRecordsAndChannels.ts @@ -209,7 +209,9 @@ export function readGlobalAdditionalLayerInformation( ); } - return additionalLayerInfos; + return Object.fromEntries( + additionalLayerInfos.map((ali) => [ali.key, ali]) + ) as AdditionalLayerProperties; } function readLayerRectangle(cursor: Cursor): [number, number, number, number] { diff --git a/packages/psd/tests/integration/fillAdjustments.test.ts b/packages/psd/tests/integration/fillAdjustments.test.ts index 5d39b2b..b952a7f 100644 --- a/packages/psd/tests/integration/fillAdjustments.test.ts +++ b/packages/psd/tests/integration/fillAdjustments.test.ts @@ -7,8 +7,7 @@ import * as path from "path"; import {beforeAll, describe, expect, it} from "vitest"; import type Psd from "../../src/index"; -import PSD from "../../src/index"; -import {AliKey} from "../../src/interfaces"; +import PSD, {AliKey} from "../../src/index"; const FIXTURE_DIR = path.join(__dirname, "fixtures"); @@ -22,9 +21,7 @@ describe("adjustements parsing", () => { }); it("describe HSL changes", () => { - const hue = psd.layers[10].additionalProperties.find( - ({key}) => key === AliKey.HueSaturation - ); + const hue = psd.layers[10].additionalProperties[AliKey.HueSaturation]; expect(hue).toStrictEqual({ adjustment: [ diff --git a/packages/psd/tests/integration/placedLayer.test.ts b/packages/psd/tests/integration/placedLayer.test.ts index edae8b2..c358a4a 100644 --- a/packages/psd/tests/integration/placedLayer.test.ts +++ b/packages/psd/tests/integration/placedLayer.test.ts @@ -9,12 +9,7 @@ import {beforeAll, describe, expect, it} from "vitest"; import type Psd from "../../src/index"; import PSD from "../../src/index"; -import { - AliKey, - LinkedLayerAliBlock, - SmartObjectPlacedLayerDataAliBlock, - StringDescriptorValue, -} from "../../src/interfaces"; +import {AliKey, StringDescriptorValue} from "../../src/interfaces"; const FIXTURE_DIR = path.join(__dirname, "fixtures"); @@ -26,21 +21,18 @@ describe("placed layer data parsing", () => { }); it("should contain links to placed files inside layers", () => { - const placedObject = psd.layers[0].additionalProperties.find( - ({key}) => key === AliKey.PlacedLayerData - ) as SmartObjectPlacedLayerDataAliBlock; + const placedObject = + psd.layers[0].additionalProperties[AliKey.PlacedLayerData]; - const id = placedObject.data.descriptor.items.get( + const id = placedObject?.data.descriptor.items.get( "Idnt" ) as StringDescriptorValue; expect(id.value).toStrictEqual("5a96c404-ab9c-1177-97ef-96ca454b82b7"); }); it("should contain embedded files as extra resources", () => { - const linkedLayer = psd.additionalLayerProperties.find( - ({key}) => key === AliKey.LinkedLayer2 - ) as LinkedLayerAliBlock; - expect(linkedLayer.layers[0]).toContain({ + const linkedLayer = psd.additionalLayerProperties[AliKey.LinkedLayer2]; + expect(linkedLayer?.layers[0]).toContain({ uniqueId: "5a96c404-ab9c-1177-97ef-96ca454b82b7", filename: "linked-layer.png", filetype: "png ", @@ -48,7 +40,7 @@ describe("placed layer data parsing", () => { const hash = crypto .createHash("sha256") - .update(linkedLayer.layers[0].contents) + .update(linkedLayer?.layers[0].contents ?? "") .digest("hex"); // NOTE: when changing the hash, please make sure the result is coherent :) diff --git a/packages/psd/tests/integration/vectorMask.test.ts b/packages/psd/tests/integration/vectorMask.test.ts index 5d15837..f577bc3 100644 --- a/packages/psd/tests/integration/vectorMask.test.ts +++ b/packages/psd/tests/integration/vectorMask.test.ts @@ -7,8 +7,7 @@ import * as path from "path"; import {beforeAll, describe, expect, it} from "vitest"; import type Psd from "../../src/index"; -import PSD from "../../src/index"; -import {AliKey, PathRecordType} from "../../src/interfaces"; +import PSD, {AliKey, PathRecordType} from "../../src/index"; const FIXTURE_DIR = path.join(__dirname, "fixtures"); @@ -20,9 +19,7 @@ describe("vector mask parsing", () => { }); it("should return pathRecords to build vector mask", () => { - const vmsk = psd.layers[0].additionalProperties.find( - ({key}) => key === AliKey.VectorMaskSetting1 - ); + const vmsk = psd.layers[0].additionalProperties[AliKey.VectorMaskSetting1]; expect(vmsk).toStrictEqual({ key: "vmsk",