ddex-json-codec 0.2.0 → 0.3.1

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/dist/index.d.mts CHANGED
@@ -12,6 +12,7 @@ interface Title {
12
12
  titleText: string;
13
13
  subTitle?: string;
14
14
  titleType?: string;
15
+ languageAndScriptCode?: string;
15
16
  }
16
17
  interface PLine {
17
18
  year?: string;
@@ -54,7 +55,7 @@ interface ArtistRole {
54
55
  interface Artist {
55
56
  /** 解決済みのデフォルト名(3.8系: FullNameから直接取得、4系: PartyListの最初のFullName) */
56
57
  name: string;
57
- /** 4系のみ: 多言語名(PartyListPartyName[]をそのまま保持) */
58
+ /** 多言語名(4系: PartyListから取得、3.8系: 複数PartyNameから取得) */
58
59
  names?: PartyName[];
59
60
  /** 4系のみ: 元の参照ID(ラウンドトリップ用) */
60
61
  partyReference?: string;
@@ -69,6 +70,7 @@ interface ResourceContributor {
69
70
  name: string;
70
71
  role: string;
71
72
  sequenceNumber?: number;
73
+ instrumentType?: string;
72
74
  /** UserDefined時の属性 */
73
75
  roleNamespace?: string;
74
76
  roleUserDefinedValue?: string;
@@ -88,16 +90,19 @@ interface Contributor {
88
90
  }
89
91
  //#endregion
90
92
  //#region src/types/image.d.ts
91
- interface Image {
93
+ interface ImageBase {
92
94
  resourceReference: string;
93
95
  type?: string;
94
96
  imageId?: ImageId;
95
- /** 3.8系: territory別の詳細 */
97
+ }
98
+ interface Image38 extends ImageBase {
96
99
  detailsByTerritory?: ImageDetailsByTerritory[];
97
- /** 4系: フラット */
100
+ }
101
+ interface Image4 extends ImageBase {
98
102
  parentalWarningType?: string;
99
103
  technicalDetails?: TechnicalImageDetails;
100
104
  }
105
+ type Image = Image38 | Image4;
101
106
  interface ImageId {
102
107
  proprietaryId?: string;
103
108
  proprietaryIdNamespace?: string;
@@ -125,25 +130,26 @@ interface HashSum {
125
130
  }
126
131
  //#endregion
127
132
  //#region src/types/sound-recording.d.ts
128
- interface SoundRecording {
133
+ interface SoundRecordingBase {
129
134
  resourceReference: string;
130
135
  type?: string;
131
136
  soundRecordingId?: SoundRecordingId;
132
- referenceTitle?: ReferenceTitle$1;
133
137
  displayArtists: DisplayArtist[];
134
138
  duration?: string;
135
139
  creationDate?: string;
136
140
  languageOfPerformance?: string;
137
141
  pLine?: PLine;
138
- /** 3.8系: territory別の詳細 */
142
+ }
143
+ interface SoundRecording38 extends SoundRecordingBase {
144
+ referenceTitle?: ReferenceTitle$1;
139
145
  detailsByTerritory?: SoundRecordingDetailsByTerritory[];
140
- /** 4系: フラットなタイトルテキスト */
146
+ }
147
+ interface SoundRecording4 extends SoundRecordingBase {
141
148
  displayTitleText?: string;
142
- /** 4系: 複数のDisplayTitle(territory+lang属性) */
143
149
  displayTitles?: DisplayTitle[];
144
- /** 4系: PartyReference参照のContributor */
145
150
  contributors?: Contributor[];
146
151
  }
152
+ type SoundRecording = SoundRecording38 | SoundRecording4;
147
153
  interface SoundRecordingId {
148
154
  isrc?: string;
149
155
  catalogNumber?: string;
@@ -157,6 +163,7 @@ interface TechnicalSoundRecordingDetails {
157
163
  audioCodecType?: string;
158
164
  bitRate?: number;
159
165
  bitRateUnit?: string;
166
+ bitsPerSample?: number;
160
167
  numberOfChannels?: number;
161
168
  samplingRate?: number;
162
169
  samplingRateUnit?: string;
@@ -179,28 +186,30 @@ interface SoundRecordingDetailsByTerritory {
179
186
  }
180
187
  //#endregion
181
188
  //#region src/types/release.d.ts
182
- interface Release {
189
+ interface ReleaseBase {
183
190
  releaseReference: string;
184
191
  releaseType?: string;
185
192
  releaseId?: ReleaseId;
186
- referenceTitle?: ReferenceTitle;
187
193
  displayArtists: DisplayArtist[];
188
194
  releaseResourceReferences?: ReleaseResourceReference[];
189
- resourceGroup?: ResourceGroup;
190
195
  duration?: string;
191
196
  pLine?: PLine;
192
197
  cLine?: CLine;
193
- /** 3.8系: territory別の詳細 */
198
+ }
199
+ interface Release38 extends ReleaseBase {
200
+ referenceTitle?: ReferenceTitle;
194
201
  detailsByTerritory?: ReleaseDetailsByTerritory[];
195
- /** 4系: フラットなタイトルテキスト */
202
+ resourceGroup?: ResourceGroup;
203
+ }
204
+ interface Release4 extends ReleaseBase {
196
205
  displayTitleText?: string;
197
- /** 4系: 複数のDisplayTitle(territory+lang属性) */
198
206
  displayTitles?: DisplayTitle[];
199
- /** 4系: ReleaseLabelReference(PartyRef値) */
200
207
  releaseLabelReferences?: string[];
201
208
  genre?: Genre;
202
209
  parentalWarningType?: string;
210
+ resourceGroup?: ResourceGroup;
203
211
  }
212
+ type Release = Release38 | Release4;
204
213
  interface ReferenceTitle {
205
214
  titleText: string;
206
215
  subTitle?: string;
@@ -211,6 +220,7 @@ interface ReleaseId {
211
220
  isrc?: string;
212
221
  gridOrIcpn?: string;
213
222
  catalogNumber?: string;
223
+ catalogNumberNamespace?: string;
214
224
  proprietaryId?: string;
215
225
  }
216
226
  interface ReleaseResourceReference {
@@ -234,9 +244,7 @@ interface TrackRelease {
234
244
  referenceTitle?: ReferenceTitle;
235
245
  displayArtists?: DisplayArtist[];
236
246
  releaseResourceReference: string;
237
- /** 4系: 複数のDisplayTitle */
238
247
  displayTitles?: DisplayTitle[];
239
- /** 4系: ReleaseLabelReference */
240
248
  releaseLabelReferences?: string[];
241
249
  genre?: Genre;
242
250
  }
@@ -289,7 +297,9 @@ interface PriceInformation {
289
297
  /**
290
298
  * パッチレベルまでのバージョン(namespace URIから検出)
291
299
  */
292
- type ErnVersion = '3.8' | '3.8.1' | '3.8.2' | '3.8.3' | '4.1' | '4.1.1' | '4.2' | '4.3' | '4.3.1' | '4.3.2';
300
+ type ErnVersion38 = '3.8' | '3.8.1' | '3.8.2' | '3.8.3';
301
+ type ErnVersion4 = '4.1' | '4.1.1' | '4.2' | '4.3' | '4.3.1' | '4.3.2';
302
+ type ErnVersion = ErnVersion38 | ErnVersion4;
293
303
  /**
294
304
  * 変換ロジックの分岐用(メジャー系統のみ)
295
305
  */
@@ -308,19 +318,27 @@ interface MessageHeader {
308
318
  messageRecipient: MessageParty;
309
319
  messageCreatedDateTime: string;
310
320
  }
311
- interface DdexMessage {
312
- ernVersion: ErnVersion;
321
+ interface DdexMessageBase {
313
322
  messageHeader: MessageHeader;
314
323
  updateIndicator?: string;
315
- resourceList: SoundRecording[];
316
- imageList?: Image[];
317
- releaseList: Release[];
324
+ }
325
+ interface DdexMessage38 extends DdexMessageBase {
326
+ ernVersion: ErnVersion38;
327
+ resourceList: SoundRecording38[];
328
+ imageList?: Image38[];
329
+ releaseList: Release38[];
330
+ dealList: ReleaseDeal[];
331
+ }
332
+ interface DdexMessage4 extends DdexMessageBase {
333
+ ernVersion: ErnVersion4;
334
+ resourceList: SoundRecording4[];
335
+ imageList?: Image4[];
336
+ releaseList: Release4[];
318
337
  dealList: ReleaseDeal[];
319
- /** 4系のみ: PartyList(ラウンドトリップ用に保持) */
320
338
  partyList?: Party[];
321
- /** 4系のみ: TrackRelease */
322
339
  trackReleaseList?: TrackRelease[];
323
340
  }
341
+ type DdexMessage = DdexMessage38 | DdexMessage4;
324
342
  //#endregion
325
343
  //#region src/converter/xml-to-json/index.d.ts
326
344
  /**
@@ -346,4 +364,4 @@ declare function jsonToXml(message: DdexMessage, version?: ErnVersion): string;
346
364
  */
347
365
  declare function detectVersion(xml: string): ErnVersion;
348
366
  //#endregion
349
- export { type Artist, type ArtistRole, type CLine, type Contributor, type DdexMessage, type Deal, type DealTerms, type DisplayArtist, type DisplayTitle, type ErnMajorVersion, type ErnVersion, type FileDetails, type Genre, type HashSum, type Image, type ImageDetailsByTerritory, type ImageId, type IndirectResourceContributor, type MessageHeader, type MessageParty, type PLine, type Party, type Release, type ReleaseDeal, type ReleaseResourceReference, type ResourceContributor, type ResourceGroup, type SoundRecording, type TechnicalImageDetails, type TechnicalSoundRecordingDetails, type TextWithAttribute, type Title, type TrackRelease, type Usage, detectVersion, jsonToXml, xmlToJson };
367
+ export { type Artist, type ArtistRole, type CLine, type Contributor, type DdexMessage, type DdexMessage38, type DdexMessage4, type DdexMessageBase, type Deal, type DealTerms, type DisplayArtist, type DisplayTitle, type ErnMajorVersion, type ErnVersion, type ErnVersion38, type ErnVersion4, type FileDetails, type Genre, type HashSum, type Image, type Image38, type Image4, type ImageBase, type ImageDetailsByTerritory, type ImageId, type IndirectResourceContributor, type MessageHeader, type MessageParty, type PLine, type Party, type PartyName, type Release, type Release38, type Release4, type ReleaseBase, type ReleaseDeal, type ReleaseDetailsByTerritory, type ReleaseId, type ReleaseResourceReference, type ResourceContributor, type ResourceGroup, type SoundRecording, type SoundRecording38, type SoundRecording4, type SoundRecordingBase, type SoundRecordingDetailsByTerritory, type TechnicalImageDetails, type TechnicalSoundRecordingDetails, type TextWithAttribute, type Title, type TrackRelease, type Usage, detectVersion, jsonToXml, xmlToJson };
package/dist/index.mjs CHANGED
@@ -230,6 +230,7 @@ var Ern38Converter = class {
230
230
  audioCodecType: raw.AudioCodecType ?? void 0,
231
231
  bitRate: bitRate ? Number(typeof bitRate === "string" ? bitRate : bitRate["#text"]) : void 0,
232
232
  bitRateUnit: typeof bitRate === "object" ? bitRate["@_UnitOfMeasure"] ?? void 0 : void 0,
233
+ bitsPerSample: raw.BitsPerSample ? Number(raw.BitsPerSample) : void 0,
233
234
  numberOfChannels: raw.NumberOfChannels ? Number(raw.NumberOfChannels) : void 0,
234
235
  samplingRate: samplingRate ? Number(typeof samplingRate === "string" ? samplingRate : samplingRate["#text"]) : void 0,
235
236
  samplingRateUnit: typeof samplingRate === "object" ? samplingRate["@_UnitOfMeasure"] ?? void 0 : void 0,
@@ -316,10 +317,19 @@ var Ern38Converter = class {
316
317
  icpn: typeof icpnRaw === "string" ? icpnRaw : icpnRaw["#text"],
317
318
  isEan: typeof icpnRaw === "object" && icpnRaw["@_IsEan"] === "true" ? true : void 0
318
319
  };
320
+ const catalogNumberRaw = raw.CatalogNumber;
321
+ let catalogNumber;
322
+ let catalogNumberNamespace;
323
+ if (catalogNumberRaw) if (typeof catalogNumberRaw === "string") catalogNumber = catalogNumberRaw;
324
+ else {
325
+ catalogNumber = catalogNumberRaw["#text"] ?? void 0;
326
+ catalogNumberNamespace = catalogNumberRaw["@_Namespace"] ?? void 0;
327
+ }
319
328
  return {
320
329
  isrc: raw.ISRC ?? void 0,
321
330
  gridOrIcpn: raw.GRid ?? void 0,
322
- catalogNumber: raw.CatalogNumber ?? void 0
331
+ catalogNumber,
332
+ catalogNumberNamespace
323
333
  };
324
334
  }
325
335
  parseReleaseResourceReferences(raw) {
@@ -417,13 +427,29 @@ var Ern38Converter = class {
417
427
  if (!raw) return void 0;
418
428
  const artists = ensureArray(raw);
419
429
  if (artists.length === 0) return void 0;
420
- return artists.map((a) => ({
421
- artist: {
422
- name: a.PartyName?.FullName ?? "",
423
- roles: a.ArtistRole ? this.parseArtistRoles(a.ArtistRole) : void 0
424
- },
425
- sequenceNumber: a["@_SequenceNumber"] ? Number(a["@_SequenceNumber"]) : void 0
426
- }));
430
+ return artists.map((a) => {
431
+ const partyNames = ensureArray(a.PartyName);
432
+ const firstName = partyNames[0]?.FullName ?? "";
433
+ let names;
434
+ if (partyNames.length > 1) names = partyNames.map((pn) => ({
435
+ fullName: pn.FullName ?? "",
436
+ fullNameIndexed: pn.FullNameIndexed ?? void 0,
437
+ languageAndScriptCode: pn["@_LanguageAndScriptCode"] ?? void 0
438
+ }));
439
+ else if (partyNames.length === 1 && partyNames[0]["@_LanguageAndScriptCode"]) names = [{
440
+ fullName: firstName,
441
+ fullNameIndexed: partyNames[0].FullNameIndexed ?? void 0,
442
+ languageAndScriptCode: partyNames[0]["@_LanguageAndScriptCode"]
443
+ }];
444
+ return {
445
+ artist: {
446
+ name: firstName,
447
+ names,
448
+ roles: a.ArtistRole ? this.parseArtistRoles(a.ArtistRole) : void 0
449
+ },
450
+ sequenceNumber: a["@_SequenceNumber"] ? Number(a["@_SequenceNumber"]) : void 0
451
+ };
452
+ });
427
453
  }
428
454
  parseArtistRoles(raw) {
429
455
  return ensureArray(raw).map((r) => {
@@ -455,6 +481,7 @@ var Ern38Converter = class {
455
481
  name: c.PartyName?.FullName ?? "",
456
482
  role,
457
483
  sequenceNumber: c["@_SequenceNumber"] ? Number(c["@_SequenceNumber"]) : void 0,
484
+ instrumentType: c.InstrumentType ?? void 0,
458
485
  roleNamespace,
459
486
  roleUserDefinedValue
460
487
  };
@@ -477,7 +504,8 @@ var Ern38Converter = class {
477
504
  return titles.map((t) => ({
478
505
  titleText: t.TitleText ?? "",
479
506
  subTitle: t.SubTitle && t.SubTitle !== "" ? t.SubTitle : void 0,
480
- titleType: t["@_TitleType"] ?? void 0
507
+ titleType: t["@_TitleType"] ?? void 0,
508
+ languageAndScriptCode: t["@_LanguageAndScriptCode"] ?? void 0
481
509
  }));
482
510
  }
483
511
  parsePLine(raw) {
@@ -510,6 +538,7 @@ var Ern4Converter = class {
510
538
  return {
511
539
  ernVersion: version,
512
540
  messageHeader: this.parseMessageHeader(root.MessageHeader),
541
+ updateIndicator: root["@_UpdateIndicator"] ?? void 0,
513
542
  resourceList: this.parseSoundRecordings(root.ResourceList),
514
543
  imageList: this.parseImages(root.ResourceList),
515
544
  releaseList: this.parseReleases(root.ReleaseList),
@@ -694,10 +723,19 @@ var Ern4Converter = class {
694
723
  const propId = raw.ProprietaryId;
695
724
  let proprietaryId;
696
725
  if (propId) proprietaryId = typeof propId === "string" ? propId : propId["#text"];
726
+ const catalogNumberRaw = raw.CatalogNumber;
727
+ let catalogNumber;
728
+ let catalogNumberNamespace;
729
+ if (catalogNumberRaw) if (typeof catalogNumberRaw === "string") catalogNumber = catalogNumberRaw;
730
+ else {
731
+ catalogNumber = catalogNumberRaw["#text"] ?? void 0;
732
+ catalogNumberNamespace = catalogNumberRaw["@_Namespace"] ?? void 0;
733
+ }
697
734
  return {
698
735
  isrc: raw.ISRC ?? void 0,
699
736
  gridOrIcpn: raw.GRid ?? void 0,
700
- catalogNumber: raw.CatalogNumber ?? void 0,
737
+ catalogNumber,
738
+ catalogNumberNamespace,
701
739
  proprietaryId
702
740
  };
703
741
  }
@@ -874,6 +912,7 @@ var Ern4Converter = class {
874
912
  //#region src/converter/json-to-xml/ern38-builder.ts
875
913
  var Ern38Builder = class {
876
914
  build(message, version) {
915
+ const msg = message;
877
916
  const nsUri = VERSION_NAMESPACE_MAP.get(version);
878
917
  if (!nsUri) throw new Error(`Unknown version: ${version}`);
879
918
  const nsPath = new URL(nsUri).pathname.replace(/^\/xml\//, "");
@@ -882,11 +921,11 @@ var Ern38Builder = class {
882
921
  "@_xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
883
922
  "@_MessageSchemaVersionId": nsPath,
884
923
  "@_xsi:schemaLocation": `${nsUri} ${nsUri}/release-notification.xsd`,
885
- MessageHeader: this.buildMessageHeader(message.messageHeader),
886
- ...message.updateIndicator ? { UpdateIndicator: message.updateIndicator } : {},
887
- ResourceList: this.buildResourceList(message.resourceList, message.imageList),
888
- ReleaseList: this.buildReleaseList(message.releaseList),
889
- DealList: this.buildDealList(message.dealList)
924
+ MessageHeader: this.buildMessageHeader(msg.messageHeader),
925
+ ...msg.updateIndicator ? { UpdateIndicator: msg.updateIndicator } : {},
926
+ ResourceList: this.buildResourceList(msg.resourceList, msg.imageList),
927
+ ReleaseList: this.buildReleaseList(msg.releaseList),
928
+ DealList: this.buildDealList(msg.dealList)
890
929
  } };
891
930
  return `<?xml version="1.0" encoding="UTF-8"?>\n${new XMLBuilder(BUILDER_OPTIONS).build(root)}`.trimEnd();
892
931
  }
@@ -960,6 +999,7 @@ var Ern38Builder = class {
960
999
  "#text": String(td.bitRate),
961
1000
  "@_UnitOfMeasure": td.bitRateUnit
962
1001
  } : String(td.bitRate);
1002
+ if (td.bitsPerSample != null) result.BitsPerSample = String(td.bitsPerSample);
963
1003
  if (td.numberOfChannels != null) result.NumberOfChannels = String(td.numberOfChannels);
964
1004
  if (td.samplingRate != null) result.SamplingRate = td.samplingRateUnit ? {
965
1005
  "#text": String(td.samplingRate),
@@ -1044,7 +1084,10 @@ var Ern38Builder = class {
1044
1084
  const result = {};
1045
1085
  if (id.isrc) result.ISRC = id.isrc;
1046
1086
  if (id.gridOrIcpn) result.GRid = id.gridOrIcpn;
1047
- if (id.catalogNumber) result.CatalogNumber = id.catalogNumber;
1087
+ if (id.catalogNumber) result.CatalogNumber = id.catalogNumberNamespace ? {
1088
+ "#text": id.catalogNumber,
1089
+ "@_Namespace": id.catalogNumberNamespace
1090
+ } : id.catalogNumber;
1048
1091
  return result;
1049
1092
  }
1050
1093
  buildReleaseResourceReference(ref) {
@@ -1114,7 +1157,14 @@ var Ern38Builder = class {
1114
1157
  buildDisplayArtist(da) {
1115
1158
  const result = {};
1116
1159
  if (da.sequenceNumber != null) result["@_SequenceNumber"] = String(da.sequenceNumber);
1117
- result.PartyName = { FullName: da.artist.name };
1160
+ if (da.artist.names?.length) result.PartyName = da.artist.names.map((pn) => {
1161
+ const r = {};
1162
+ if (pn.languageAndScriptCode) r["@_LanguageAndScriptCode"] = pn.languageAndScriptCode;
1163
+ r.FullName = pn.fullName;
1164
+ if (pn.fullNameIndexed) r.FullNameIndexed = pn.fullNameIndexed;
1165
+ return r;
1166
+ });
1167
+ else result.PartyName = { FullName: da.artist.name };
1118
1168
  if (da.artist.roles?.length) {
1119
1169
  const builtRoles = da.artist.roles.map((r) => this.buildArtistRole(r));
1120
1170
  result.ArtistRole = builtRoles.length === 1 ? builtRoles[0] : builtRoles;
@@ -1139,6 +1189,7 @@ var Ern38Builder = class {
1139
1189
  "@_UserDefinedValue": c.roleUserDefinedValue
1140
1190
  };
1141
1191
  else result.ResourceContributorRole = c.role;
1192
+ if (c.instrumentType) result.InstrumentType = c.instrumentType;
1142
1193
  return result;
1143
1194
  }
1144
1195
  buildIndirectResourceContributor(c) {
@@ -1151,6 +1202,7 @@ var Ern38Builder = class {
1151
1202
  buildTitle(t) {
1152
1203
  const result = {};
1153
1204
  if (t.titleType) result["@_TitleType"] = t.titleType;
1205
+ if (t.languageAndScriptCode) result["@_LanguageAndScriptCode"] = t.languageAndScriptCode;
1154
1206
  result.TitleText = t.titleText;
1155
1207
  if (t.subTitle) result.SubTitle = t.subTitle;
1156
1208
  return result;
@@ -1178,6 +1230,7 @@ var Ern38Builder = class {
1178
1230
  //#region src/converter/json-to-xml/ern4-builder.ts
1179
1231
  var Ern4Builder = class {
1180
1232
  build(message, version) {
1233
+ const msg = message;
1181
1234
  const nsUri = VERSION_NAMESPACE_MAP.get(version);
1182
1235
  if (!nsUri) throw new Error(`Unknown version: ${version}`);
1183
1236
  const root = { "ern:NewReleaseMessage": {
@@ -1185,11 +1238,12 @@ var Ern4Builder = class {
1185
1238
  "@_xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
1186
1239
  "@_xsi:schemaLocation": `${nsUri} ${nsUri}/release-notification.xsd`,
1187
1240
  "@_LanguageAndScriptCode": "en",
1188
- MessageHeader: this.buildMessageHeader(message.messageHeader),
1189
- PartyList: this.buildPartyList(message.partyList ?? []),
1190
- ResourceList: this.buildResourceList(message.resourceList, message.imageList, version),
1191
- ReleaseList: this.buildReleaseList(message.releaseList, message.trackReleaseList),
1192
- DealList: this.buildDealList(message.dealList)
1241
+ ...msg.updateIndicator ? { "@_UpdateIndicator": msg.updateIndicator } : {},
1242
+ MessageHeader: this.buildMessageHeader(msg.messageHeader),
1243
+ PartyList: this.buildPartyList(msg.partyList ?? []),
1244
+ ResourceList: this.buildResourceList(msg.resourceList, msg.imageList, version),
1245
+ ReleaseList: this.buildReleaseList(msg.releaseList, msg.trackReleaseList),
1246
+ DealList: this.buildDealList(msg.dealList)
1193
1247
  } };
1194
1248
  return `<?xml version="1.0" encoding="UTF-8"?>\n${new XMLBuilder(BUILDER_OPTIONS).build(root)}`.trimEnd();
1195
1249
  }
@@ -1312,7 +1366,10 @@ var Ern4Builder = class {
1312
1366
  if (id.isrc) result.ISRC = id.isrc;
1313
1367
  if (id.gridOrIcpn) result.GRid = id.gridOrIcpn;
1314
1368
  if (id.proprietaryId) result.ProprietaryId = id.proprietaryId;
1315
- if (id.catalogNumber) result.CatalogNumber = id.catalogNumber;
1369
+ if (id.catalogNumber) result.CatalogNumber = id.catalogNumberNamespace ? {
1370
+ "#text": id.catalogNumber,
1371
+ "@_Namespace": id.catalogNumberNamespace
1372
+ } : id.catalogNumber;
1316
1373
  return result;
1317
1374
  }
1318
1375
  buildTrackRelease(tr) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ddex-json-codec",
3
3
  "type": "module",
4
- "version": "0.2.0",
4
+ "version": "0.3.1",
5
5
  "description": "DDEX ERN XML ↔ JSON converter for TypeScript",
6
6
  "license": "MIT",
7
7
  "author": "kazhs",