ddex-json-codec 0.2.0 → 0.3.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/dist/index.d.mts CHANGED
@@ -69,6 +69,7 @@ interface ResourceContributor {
69
69
  name: string;
70
70
  role: string;
71
71
  sequenceNumber?: number;
72
+ instrumentType?: string;
72
73
  /** UserDefined時の属性 */
73
74
  roleNamespace?: string;
74
75
  roleUserDefinedValue?: string;
@@ -88,16 +89,19 @@ interface Contributor {
88
89
  }
89
90
  //#endregion
90
91
  //#region src/types/image.d.ts
91
- interface Image {
92
+ interface ImageBase {
92
93
  resourceReference: string;
93
94
  type?: string;
94
95
  imageId?: ImageId;
95
- /** 3.8系: territory別の詳細 */
96
+ }
97
+ interface Image38 extends ImageBase {
96
98
  detailsByTerritory?: ImageDetailsByTerritory[];
97
- /** 4系: フラット */
99
+ }
100
+ interface Image4 extends ImageBase {
98
101
  parentalWarningType?: string;
99
102
  technicalDetails?: TechnicalImageDetails;
100
103
  }
104
+ type Image = Image38 | Image4;
101
105
  interface ImageId {
102
106
  proprietaryId?: string;
103
107
  proprietaryIdNamespace?: string;
@@ -125,25 +129,26 @@ interface HashSum {
125
129
  }
126
130
  //#endregion
127
131
  //#region src/types/sound-recording.d.ts
128
- interface SoundRecording {
132
+ interface SoundRecordingBase {
129
133
  resourceReference: string;
130
134
  type?: string;
131
135
  soundRecordingId?: SoundRecordingId;
132
- referenceTitle?: ReferenceTitle$1;
133
136
  displayArtists: DisplayArtist[];
134
137
  duration?: string;
135
138
  creationDate?: string;
136
139
  languageOfPerformance?: string;
137
140
  pLine?: PLine;
138
- /** 3.8系: territory別の詳細 */
141
+ }
142
+ interface SoundRecording38 extends SoundRecordingBase {
143
+ referenceTitle?: ReferenceTitle$1;
139
144
  detailsByTerritory?: SoundRecordingDetailsByTerritory[];
140
- /** 4系: フラットなタイトルテキスト */
145
+ }
146
+ interface SoundRecording4 extends SoundRecordingBase {
141
147
  displayTitleText?: string;
142
- /** 4系: 複数のDisplayTitle(territory+lang属性) */
143
148
  displayTitles?: DisplayTitle[];
144
- /** 4系: PartyReference参照のContributor */
145
149
  contributors?: Contributor[];
146
150
  }
151
+ type SoundRecording = SoundRecording38 | SoundRecording4;
147
152
  interface SoundRecordingId {
148
153
  isrc?: string;
149
154
  catalogNumber?: string;
@@ -157,6 +162,7 @@ interface TechnicalSoundRecordingDetails {
157
162
  audioCodecType?: string;
158
163
  bitRate?: number;
159
164
  bitRateUnit?: string;
165
+ bitsPerSample?: number;
160
166
  numberOfChannels?: number;
161
167
  samplingRate?: number;
162
168
  samplingRateUnit?: string;
@@ -179,28 +185,30 @@ interface SoundRecordingDetailsByTerritory {
179
185
  }
180
186
  //#endregion
181
187
  //#region src/types/release.d.ts
182
- interface Release {
188
+ interface ReleaseBase {
183
189
  releaseReference: string;
184
190
  releaseType?: string;
185
191
  releaseId?: ReleaseId;
186
- referenceTitle?: ReferenceTitle;
187
192
  displayArtists: DisplayArtist[];
188
193
  releaseResourceReferences?: ReleaseResourceReference[];
189
- resourceGroup?: ResourceGroup;
190
194
  duration?: string;
191
195
  pLine?: PLine;
192
196
  cLine?: CLine;
193
- /** 3.8系: territory別の詳細 */
197
+ }
198
+ interface Release38 extends ReleaseBase {
199
+ referenceTitle?: ReferenceTitle;
194
200
  detailsByTerritory?: ReleaseDetailsByTerritory[];
195
- /** 4系: フラットなタイトルテキスト */
201
+ resourceGroup?: ResourceGroup;
202
+ }
203
+ interface Release4 extends ReleaseBase {
196
204
  displayTitleText?: string;
197
- /** 4系: 複数のDisplayTitle(territory+lang属性) */
198
205
  displayTitles?: DisplayTitle[];
199
- /** 4系: ReleaseLabelReference(PartyRef値) */
200
206
  releaseLabelReferences?: string[];
201
207
  genre?: Genre;
202
208
  parentalWarningType?: string;
209
+ resourceGroup?: ResourceGroup;
203
210
  }
211
+ type Release = Release38 | Release4;
204
212
  interface ReferenceTitle {
205
213
  titleText: string;
206
214
  subTitle?: string;
@@ -211,6 +219,7 @@ interface ReleaseId {
211
219
  isrc?: string;
212
220
  gridOrIcpn?: string;
213
221
  catalogNumber?: string;
222
+ catalogNumberNamespace?: string;
214
223
  proprietaryId?: string;
215
224
  }
216
225
  interface ReleaseResourceReference {
@@ -234,9 +243,7 @@ interface TrackRelease {
234
243
  referenceTitle?: ReferenceTitle;
235
244
  displayArtists?: DisplayArtist[];
236
245
  releaseResourceReference: string;
237
- /** 4系: 複数のDisplayTitle */
238
246
  displayTitles?: DisplayTitle[];
239
- /** 4系: ReleaseLabelReference */
240
247
  releaseLabelReferences?: string[];
241
248
  genre?: Genre;
242
249
  }
@@ -289,7 +296,9 @@ interface PriceInformation {
289
296
  /**
290
297
  * パッチレベルまでのバージョン(namespace URIから検出)
291
298
  */
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';
299
+ type ErnVersion38 = '3.8' | '3.8.1' | '3.8.2' | '3.8.3';
300
+ type ErnVersion4 = '4.1' | '4.1.1' | '4.2' | '4.3' | '4.3.1' | '4.3.2';
301
+ type ErnVersion = ErnVersion38 | ErnVersion4;
293
302
  /**
294
303
  * 変換ロジックの分岐用(メジャー系統のみ)
295
304
  */
@@ -308,19 +317,27 @@ interface MessageHeader {
308
317
  messageRecipient: MessageParty;
309
318
  messageCreatedDateTime: string;
310
319
  }
311
- interface DdexMessage {
312
- ernVersion: ErnVersion;
320
+ interface DdexMessageBase {
313
321
  messageHeader: MessageHeader;
314
322
  updateIndicator?: string;
315
- resourceList: SoundRecording[];
316
- imageList?: Image[];
317
- releaseList: Release[];
323
+ }
324
+ interface DdexMessage38 extends DdexMessageBase {
325
+ ernVersion: ErnVersion38;
326
+ resourceList: SoundRecording38[];
327
+ imageList?: Image38[];
328
+ releaseList: Release38[];
329
+ dealList: ReleaseDeal[];
330
+ }
331
+ interface DdexMessage4 extends DdexMessageBase {
332
+ ernVersion: ErnVersion4;
333
+ resourceList: SoundRecording4[];
334
+ imageList?: Image4[];
335
+ releaseList: Release4[];
318
336
  dealList: ReleaseDeal[];
319
- /** 4系のみ: PartyList(ラウンドトリップ用に保持) */
320
337
  partyList?: Party[];
321
- /** 4系のみ: TrackRelease */
322
338
  trackReleaseList?: TrackRelease[];
323
339
  }
340
+ type DdexMessage = DdexMessage38 | DdexMessage4;
324
341
  //#endregion
325
342
  //#region src/converter/xml-to-json/index.d.ts
326
343
  /**
@@ -346,4 +363,4 @@ declare function jsonToXml(message: DdexMessage, version?: ErnVersion): string;
346
363
  */
347
364
  declare function detectVersion(xml: string): ErnVersion;
348
365
  //#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 };
366
+ 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) {
@@ -455,6 +465,7 @@ var Ern38Converter = class {
455
465
  name: c.PartyName?.FullName ?? "",
456
466
  role,
457
467
  sequenceNumber: c["@_SequenceNumber"] ? Number(c["@_SequenceNumber"]) : void 0,
468
+ instrumentType: c.InstrumentType ?? void 0,
458
469
  roleNamespace,
459
470
  roleUserDefinedValue
460
471
  };
@@ -510,6 +521,7 @@ var Ern4Converter = class {
510
521
  return {
511
522
  ernVersion: version,
512
523
  messageHeader: this.parseMessageHeader(root.MessageHeader),
524
+ updateIndicator: root["@_UpdateIndicator"] ?? void 0,
513
525
  resourceList: this.parseSoundRecordings(root.ResourceList),
514
526
  imageList: this.parseImages(root.ResourceList),
515
527
  releaseList: this.parseReleases(root.ReleaseList),
@@ -694,10 +706,19 @@ var Ern4Converter = class {
694
706
  const propId = raw.ProprietaryId;
695
707
  let proprietaryId;
696
708
  if (propId) proprietaryId = typeof propId === "string" ? propId : propId["#text"];
709
+ const catalogNumberRaw = raw.CatalogNumber;
710
+ let catalogNumber;
711
+ let catalogNumberNamespace;
712
+ if (catalogNumberRaw) if (typeof catalogNumberRaw === "string") catalogNumber = catalogNumberRaw;
713
+ else {
714
+ catalogNumber = catalogNumberRaw["#text"] ?? void 0;
715
+ catalogNumberNamespace = catalogNumberRaw["@_Namespace"] ?? void 0;
716
+ }
697
717
  return {
698
718
  isrc: raw.ISRC ?? void 0,
699
719
  gridOrIcpn: raw.GRid ?? void 0,
700
- catalogNumber: raw.CatalogNumber ?? void 0,
720
+ catalogNumber,
721
+ catalogNumberNamespace,
701
722
  proprietaryId
702
723
  };
703
724
  }
@@ -874,6 +895,7 @@ var Ern4Converter = class {
874
895
  //#region src/converter/json-to-xml/ern38-builder.ts
875
896
  var Ern38Builder = class {
876
897
  build(message, version) {
898
+ const msg = message;
877
899
  const nsUri = VERSION_NAMESPACE_MAP.get(version);
878
900
  if (!nsUri) throw new Error(`Unknown version: ${version}`);
879
901
  const nsPath = new URL(nsUri).pathname.replace(/^\/xml\//, "");
@@ -882,11 +904,11 @@ var Ern38Builder = class {
882
904
  "@_xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
883
905
  "@_MessageSchemaVersionId": nsPath,
884
906
  "@_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)
907
+ MessageHeader: this.buildMessageHeader(msg.messageHeader),
908
+ ...msg.updateIndicator ? { UpdateIndicator: msg.updateIndicator } : {},
909
+ ResourceList: this.buildResourceList(msg.resourceList, msg.imageList),
910
+ ReleaseList: this.buildReleaseList(msg.releaseList),
911
+ DealList: this.buildDealList(msg.dealList)
890
912
  } };
891
913
  return `<?xml version="1.0" encoding="UTF-8"?>\n${new XMLBuilder(BUILDER_OPTIONS).build(root)}`.trimEnd();
892
914
  }
@@ -960,6 +982,7 @@ var Ern38Builder = class {
960
982
  "#text": String(td.bitRate),
961
983
  "@_UnitOfMeasure": td.bitRateUnit
962
984
  } : String(td.bitRate);
985
+ if (td.bitsPerSample != null) result.BitsPerSample = String(td.bitsPerSample);
963
986
  if (td.numberOfChannels != null) result.NumberOfChannels = String(td.numberOfChannels);
964
987
  if (td.samplingRate != null) result.SamplingRate = td.samplingRateUnit ? {
965
988
  "#text": String(td.samplingRate),
@@ -1044,7 +1067,10 @@ var Ern38Builder = class {
1044
1067
  const result = {};
1045
1068
  if (id.isrc) result.ISRC = id.isrc;
1046
1069
  if (id.gridOrIcpn) result.GRid = id.gridOrIcpn;
1047
- if (id.catalogNumber) result.CatalogNumber = id.catalogNumber;
1070
+ if (id.catalogNumber) result.CatalogNumber = id.catalogNumberNamespace ? {
1071
+ "#text": id.catalogNumber,
1072
+ "@_Namespace": id.catalogNumberNamespace
1073
+ } : id.catalogNumber;
1048
1074
  return result;
1049
1075
  }
1050
1076
  buildReleaseResourceReference(ref) {
@@ -1139,6 +1165,7 @@ var Ern38Builder = class {
1139
1165
  "@_UserDefinedValue": c.roleUserDefinedValue
1140
1166
  };
1141
1167
  else result.ResourceContributorRole = c.role;
1168
+ if (c.instrumentType) result.InstrumentType = c.instrumentType;
1142
1169
  return result;
1143
1170
  }
1144
1171
  buildIndirectResourceContributor(c) {
@@ -1178,6 +1205,7 @@ var Ern38Builder = class {
1178
1205
  //#region src/converter/json-to-xml/ern4-builder.ts
1179
1206
  var Ern4Builder = class {
1180
1207
  build(message, version) {
1208
+ const msg = message;
1181
1209
  const nsUri = VERSION_NAMESPACE_MAP.get(version);
1182
1210
  if (!nsUri) throw new Error(`Unknown version: ${version}`);
1183
1211
  const root = { "ern:NewReleaseMessage": {
@@ -1185,11 +1213,12 @@ var Ern4Builder = class {
1185
1213
  "@_xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
1186
1214
  "@_xsi:schemaLocation": `${nsUri} ${nsUri}/release-notification.xsd`,
1187
1215
  "@_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)
1216
+ ...msg.updateIndicator ? { "@_UpdateIndicator": msg.updateIndicator } : {},
1217
+ MessageHeader: this.buildMessageHeader(msg.messageHeader),
1218
+ PartyList: this.buildPartyList(msg.partyList ?? []),
1219
+ ResourceList: this.buildResourceList(msg.resourceList, msg.imageList, version),
1220
+ ReleaseList: this.buildReleaseList(msg.releaseList, msg.trackReleaseList),
1221
+ DealList: this.buildDealList(msg.dealList)
1193
1222
  } };
1194
1223
  return `<?xml version="1.0" encoding="UTF-8"?>\n${new XMLBuilder(BUILDER_OPTIONS).build(root)}`.trimEnd();
1195
1224
  }
@@ -1312,7 +1341,10 @@ var Ern4Builder = class {
1312
1341
  if (id.isrc) result.ISRC = id.isrc;
1313
1342
  if (id.gridOrIcpn) result.GRid = id.gridOrIcpn;
1314
1343
  if (id.proprietaryId) result.ProprietaryId = id.proprietaryId;
1315
- if (id.catalogNumber) result.CatalogNumber = id.catalogNumber;
1344
+ if (id.catalogNumber) result.CatalogNumber = id.catalogNumberNamespace ? {
1345
+ "#text": id.catalogNumber,
1346
+ "@_Namespace": id.catalogNumberNamespace
1347
+ } : id.catalogNumber;
1316
1348
  return result;
1317
1349
  }
1318
1350
  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.0",
5
5
  "description": "DDEX ERN XML ↔ JSON converter for TypeScript",
6
6
  "license": "MIT",
7
7
  "author": "kazhs",