ochre-sdk 1.0.78 → 1.1.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.
Files changed (84) hide show
  1. package/README.md +31 -3
  2. package/dist/_virtual/_rolldown/runtime.mjs +13 -0
  3. package/dist/categories.d.mts +249 -0
  4. package/dist/categories.mjs +259 -0
  5. package/dist/constants.d.mts +14 -0
  6. package/dist/constants.mjs +18 -1
  7. package/dist/errors.d.mts +23 -0
  8. package/dist/{utilities.mjs → errors.mjs} +33 -84
  9. package/dist/fetchers/gallery.mjs +15 -51
  10. package/dist/fetchers/item-children.mjs +20 -66
  11. package/dist/fetchers/item-links.mjs +26 -79
  12. package/dist/fetchers/item-ocr-data.d.mts +2 -2
  13. package/dist/fetchers/item-ocr-data.mjs +11 -15
  14. package/dist/fetchers/item.d.mts +0 -15
  15. package/dist/fetchers/item.mjs +20 -72
  16. package/dist/fetchers/request.d.mts +70 -0
  17. package/dist/fetchers/request.mjs +100 -0
  18. package/dist/fetchers/set/items.mjs +27 -73
  19. package/dist/fetchers/set/property-values.d.mts +2 -3
  20. package/dist/fetchers/set/property-values.mjs +96 -130
  21. package/dist/fetchers/website-metadata.mjs +35 -57
  22. package/dist/fetchers/website.d.mts +2 -3
  23. package/dist/fetchers/website.mjs +22 -31
  24. package/dist/getters.d.mts +78 -148
  25. package/dist/getters.mjs +127 -208
  26. package/dist/helpers.d.mts +0 -4
  27. package/dist/helpers.mjs +19 -6
  28. package/dist/index.d.mts +8 -6
  29. package/dist/index.mjs +6 -4
  30. package/dist/ocr.d.mts +37 -0
  31. package/dist/ocr.mjs +52 -0
  32. package/dist/parsers/helpers.d.mts +21 -1
  33. package/dist/parsers/helpers.mjs +26 -6
  34. package/dist/parsers/index.d.mts +0 -8
  35. package/dist/parsers/index.mjs +118 -259
  36. package/dist/parsers/languages.d.mts +72 -0
  37. package/dist/parsers/languages.mjs +132 -0
  38. package/dist/parsers/multilingual.d.mts +49 -74
  39. package/dist/parsers/multilingual.mjs +88 -189
  40. package/dist/parsers/property-token.d.mts +34 -0
  41. package/dist/parsers/property-token.mjs +29 -0
  42. package/dist/parsers/string.d.mts +19 -0
  43. package/dist/parsers/string.mjs +45 -25
  44. package/dist/parsers/website/bounds.d.mts +10 -0
  45. package/dist/parsers/website/bounds.mjs +28 -0
  46. package/dist/parsers/website/components.d.mts +91 -0
  47. package/dist/parsers/website/components.mjs +681 -0
  48. package/dist/parsers/website/index.d.mts +0 -7
  49. package/dist/parsers/website/index.mjs +92 -1153
  50. package/dist/parsers/website/links.d.mts +36 -0
  51. package/dist/parsers/website/links.mjs +58 -0
  52. package/dist/parsers/website/messages.d.mts +24 -0
  53. package/dist/parsers/website/messages.mjs +31 -0
  54. package/dist/parsers/website/options.d.mts +6 -0
  55. package/dist/parsers/website/options.mjs +114 -0
  56. package/dist/parsers/website/properties.d.mts +12 -0
  57. package/dist/parsers/website/properties.mjs +158 -0
  58. package/dist/parsers/website/reader.d.mts +54 -4
  59. package/dist/parsers/website/reader.mjs +65 -20
  60. package/dist/parsers/website/slug.d.mts +64 -0
  61. package/dist/parsers/website/slug.mjs +82 -0
  62. package/dist/parsers/website/styles.d.mts +28 -0
  63. package/dist/parsers/website/styles.mjs +103 -0
  64. package/dist/parsers/website/walk.d.mts +68 -0
  65. package/dist/parsers/website/walk.mjs +116 -0
  66. package/dist/query.d.mts +66 -18
  67. package/dist/query.mjs +202 -48
  68. package/dist/reflection.d.mts +64 -0
  69. package/dist/reflection.mjs +79 -0
  70. package/dist/schemas.d.mts +7 -0
  71. package/dist/schemas.mjs +12 -3
  72. package/dist/types/index.d.mts +1 -31
  73. package/dist/types/utilities.d.mts +9 -0
  74. package/dist/types/utilities.mjs +1 -0
  75. package/dist/types/website.d.mts +49 -58
  76. package/dist/xml/metadata.d.mts +16 -0
  77. package/dist/xml/metadata.mjs +32 -11
  78. package/dist/xml/schemas.d.mts +5970 -3
  79. package/dist/xml/schemas.mjs +43 -45
  80. package/dist/xml/types.d.mts +13 -30
  81. package/dist/xquery.d.mts +46 -0
  82. package/dist/xquery.mjs +66 -0
  83. package/package.json +3 -3
  84. package/dist/utilities.d.mts +0 -54
@@ -1,7 +1,7 @@
1
1
  import { MultilingualString } from "../parsers/multilingual.mjs";
2
+ import { Prettify } from "./utilities.mjs";
2
3
  import { Webpage } from "./website.mjs";
3
4
  //#region src/types/index.d.ts
4
- export type Prettify<T> = { [K in keyof T]: T[K]; } & {};
5
5
  /**
6
6
  * Language-code tuple or array used by OCHRE multilingual fields.
7
7
  *
@@ -38,10 +38,6 @@ export type ContainedItemCategoryFromOption<U extends ItemCategory = ItemCategor
38
38
  * The category of items in a heading
39
39
  */
40
40
  export type HeadingItemCategory = Exclude<ItemCategory, "tree" | "bibliography" | "spatialUnit" | "concept" | "period">;
41
- /**
42
- * The category of items that expose recursive subitem structures.
43
- */
44
- export type RecursiveItemCategory = Exclude<ItemCategory, "tree" | "person" | "propertyVariable" | "propertyValue" | "set">;
45
41
  /**
46
42
  * The category names that can appear in OCHRE context paths
47
43
  */
@@ -365,7 +361,6 @@ export type SimplifiedProperty<T extends LanguageCodes = LanguageCodes> = {
365
361
  export type SetItemProperty<T extends LanguageCodes = LanguageCodes> = Omit<Property<T>, "properties">;
366
362
  export type SetItemSimplifiedProperty<T extends LanguageCodes = LanguageCodes> = Omit<SimplifiedProperty<T>, "properties">;
367
363
  export type PropertyLike<T extends LanguageCodes = LanguageCodes> = Property<T> | SetItemProperty<T> | SimplifiedProperty<T> | SetItemSimplifiedProperty<T>;
368
- export type ItemProperty<T extends LanguageCodes = LanguageCodes> = Property<T> | SetItemProperty<T>;
369
364
  export type PropertyValueDataType = PropertyValueContent["dataType"];
370
365
  export type QueryablePropertyValueDataType = Exclude<PropertyValueDataType, "coordinate">;
371
366
  export type PropertyRelation = "related" | "inverse";
@@ -502,9 +497,6 @@ export type Item<U extends ItemCategory = ItemCategory, V extends ContainedItemC
502
497
  * An item fetched without its embedded item hierarchy.
503
498
  */
504
499
  export type ItemWithoutEmbeddedItems<U extends ItemCategoryWithEmbeddedItems = ItemCategoryWithEmbeddedItems, V extends ContainedItemCategory<U> = ContainedItemCategory<U>, T extends LanguageCodes = LanguageCodes, W extends ItemPayloadKind = "topLevel"> = U extends ItemCategoryWithEmbeddedItems ? U extends "tree" ? Prettify<Omit<Tree<Extract<V, TreeItemCategory>, T, W>, "items">> : U extends "set" ? Prettify<Omit<Set<Extract<V, SetItemCategory>, T, W>, "items">> : U extends "bibliography" ? Prettify<Omit<Bibliography<T, W>, "items">> : U extends "concept" ? Prettify<Omit<Concept<T, W>, "items">> : U extends "spatialUnit" ? Prettify<Omit<SpatialUnit<T, W>, "items">> : U extends "period" ? Prettify<Omit<Period<T, W>, "items">> : U extends "resource" ? Prettify<Omit<Resource<T, W>, "items">> : never : never;
505
- export type TopLevelItem<U extends ItemCategory = ItemCategory, V extends ContainedItemCategory<U> = ContainedItemCategory<U>, T extends LanguageCodes = LanguageCodes> = Item<U, V, T, "topLevel">;
506
- export type EmbeddedItem<U extends ItemCategory = ItemCategory, V extends ContainedItemCategory<U> = ContainedItemCategory<U>, T extends LanguageCodes = LanguageCodes> = Item<U, V, T, "embedded">;
507
- export type AnyItem<U extends ItemCategory = ItemCategory, V extends ContainedItemCategory<U> = ContainedItemCategory<U>, T extends LanguageCodes = LanguageCodes> = Item<U, V, T, ItemPayloadKind>;
508
500
  /**
509
501
  * Heading in OCHRE
510
502
  */
@@ -748,28 +740,6 @@ export type Section<T extends LanguageCodes = LanguageCodes> = {
748
740
  identification: Identification<T>;
749
741
  } | null;
750
742
  };
751
- export type EmbeddedTree<U extends TreeItemCategory = TreeItemCategory, T extends LanguageCodes = LanguageCodes> = Tree<U, T, "embedded">;
752
- export type AnyTree<U extends TreeItemCategory = TreeItemCategory, T extends LanguageCodes = LanguageCodes> = Tree<U, T, ItemPayloadKind>;
753
- export type EmbeddedSet<U extends SetItemCategory = SetItemCategory, T extends LanguageCodes = LanguageCodes> = Set<U, T, "embedded">;
754
- export type AnySet<U extends SetItemCategory = SetItemCategory, T extends LanguageCodes = LanguageCodes> = Set<U, T, ItemPayloadKind>;
755
- export type EmbeddedBibliography<T extends LanguageCodes = LanguageCodes> = Bibliography<T, "embedded">;
756
- export type AnyBibliography<T extends LanguageCodes = LanguageCodes> = Bibliography<T, ItemPayloadKind>;
757
- export type EmbeddedConcept<T extends LanguageCodes = LanguageCodes> = Concept<T, "embedded">;
758
- export type AnyConcept<T extends LanguageCodes = LanguageCodes> = Concept<T, ItemPayloadKind>;
759
- export type EmbeddedSpatialUnit<T extends LanguageCodes = LanguageCodes> = SpatialUnit<T, "embedded">;
760
- export type AnySpatialUnit<T extends LanguageCodes = LanguageCodes> = SpatialUnit<T, ItemPayloadKind>;
761
- export type EmbeddedPeriod<T extends LanguageCodes = LanguageCodes> = Period<T, "embedded">;
762
- export type AnyPeriod<T extends LanguageCodes = LanguageCodes> = Period<T, ItemPayloadKind>;
763
- export type EmbeddedPerson<T extends LanguageCodes = LanguageCodes> = Person<T, "embedded">;
764
- export type AnyPerson<T extends LanguageCodes = LanguageCodes> = Person<T, ItemPayloadKind>;
765
- export type EmbeddedPropertyVariable<T extends LanguageCodes = LanguageCodes> = PropertyVariable<T, "embedded">;
766
- export type AnyPropertyVariable<T extends LanguageCodes = LanguageCodes> = PropertyVariable<T, ItemPayloadKind>;
767
- export type EmbeddedPropertyValue<T extends LanguageCodes = LanguageCodes> = PropertyValue<T, "embedded">;
768
- export type AnyPropertyValue<T extends LanguageCodes = LanguageCodes> = PropertyValue<T, ItemPayloadKind>;
769
- export type EmbeddedResource<T extends LanguageCodes = LanguageCodes> = Resource<T, "embedded">;
770
- export type AnyResource<T extends LanguageCodes = LanguageCodes> = Resource<T, ItemPayloadKind>;
771
- export type EmbeddedText<T extends LanguageCodes = LanguageCodes> = Text<T, "embedded">;
772
- export type AnyText<T extends LanguageCodes = LanguageCodes> = Text<T, ItemPayloadKind>;
773
743
  /**
774
744
  * Represents a gallery with its identification, project identification, resources and max length
775
745
  */
@@ -0,0 +1,9 @@
1
+ //#region src/types/utilities.d.ts
2
+ /**
3
+ * Flatten an intersection so editors show one object instead of `A & B`
4
+ *
5
+ * Deliberately not re-exported from the package root: it is a TypeScript
6
+ * presentation detail, not part of the OCHRE model.
7
+ */
8
+ export type Prettify<T> = { [K in keyof T]: T[K]; } & {};
9
+ //#endregion
@@ -0,0 +1 @@
1
+ export {};
@@ -1,5 +1,6 @@
1
1
  import { MultilingualString } from "../parsers/multilingual.mjs";
2
- import { Bibliography, Identification, ItemCategory, LanguageCodes, License, Metadata, Person, Prettify, QueryablePropertyValueDataType } from "./index.mjs";
2
+ import { Prettify } from "./utilities.mjs";
3
+ import { Bibliography, Identification, LanguageCodes, License, Metadata, Person, QueryablePropertyValueDataType } from "./index.mjs";
3
4
  //#region src/types/website.d.ts
4
5
  /**
5
6
  * Represents a context tree level item with a variable and value
@@ -64,28 +65,47 @@ export type WebOptions<T extends LanguageCodes = LanguageCodes> = {
64
65
  };
65
66
  };
66
67
  /**
67
- * Represents a stylesheet item with its UUID and category
68
+ * The style overrides for each viewport a website presentation targets
68
69
  */
69
- export type StylesheetCategory = Extract<ItemCategory, "propertyVariable" | "propertyValue">;
70
+ export type ResponsiveStyles = {
71
+ default: Array<Style>;
72
+ tablet: Array<Style>;
73
+ mobile: Array<Style>;
74
+ };
75
+ /**
76
+ * Whether an item page section and its header are shown
77
+ */
78
+ export type WebSectionDisplay = {
79
+ isDisplayed: boolean;
80
+ isHeaderDisplayed: boolean;
81
+ };
82
+ /**
83
+ * How a website indicates that content is loading
84
+ */
85
+ export type WebLoadingVariant = "spinner" | "skeleton" | "animation" | "none";
86
+ /**
87
+ * How an item page groups a repeated section
88
+ */
89
+ export type WebSectionVariant = "discrete" | "tabs-horizontal" | "tabs-vertical" | "tabular";
90
+ /**
91
+ * The IIIF viewer a website renders images with
92
+ */
93
+ export type WebIiifViewer = "universal-viewer" | "clover";
94
+ /**
95
+ * How a website restricts access to its content
96
+ */
97
+ export type WebsitePrivacy = "public" | "password" | "credentials-ochre";
70
98
  export type StylesheetItem = {
71
99
  uuid: string;
72
100
  category: "propertyVariable";
73
101
  icon: string | null;
74
- styles: {
75
- default: Array<Style>;
76
- tablet: Array<Style>;
77
- mobile: Array<Style>;
78
- };
102
+ styles: ResponsiveStyles;
79
103
  } | {
80
104
  uuid: string;
81
105
  category: "propertyValue";
82
106
  variableUuid: string;
83
107
  icon: string | null;
84
- styles: {
85
- default: Array<Style>;
86
- tablet: Array<Style>;
87
- mobile: Array<Style>;
88
- };
108
+ styles: ResponsiveStyles;
89
109
  };
90
110
  export type WebsitePropertyQueryNode<T extends LanguageCodes = LanguageCodes> = {
91
111
  target: "property";
@@ -113,11 +133,7 @@ export type WebSidebar<T extends LanguageCodes = LanguageCodes> = {
113
133
  title: WebTitle<T>;
114
134
  layout: "start" | "end";
115
135
  mobileLayout: "default" | "inline";
116
- cssStyles: {
117
- default: Array<Style>;
118
- tablet: Array<Style>;
119
- mobile: Array<Style>;
120
- };
136
+ cssStyles: ResponsiveStyles;
121
137
  };
122
138
  /**
123
139
  * Represents a website with its properties and items
@@ -139,12 +155,12 @@ export type Website<T extends LanguageCodes = LanguageCodes> = {
139
155
  type: WebsiteType;
140
156
  status: "development" | "preview" | "production";
141
157
  versionLabel: "experimental" | "alpha" | "beta" | "test" | "staging" | "pre-release" | "release";
142
- privacy: "public" | "password" | "credentials-ochre";
158
+ privacy: WebsitePrivacy;
143
159
  contact: {
144
160
  name: string;
145
161
  email: string | null;
146
162
  } | null;
147
- loadingVariant: "spinner" | "skeleton" | "animation" | "none";
163
+ loadingVariant: WebLoadingVariant;
148
164
  theme: {
149
165
  isThemeToggleDisplayed: boolean;
150
166
  defaultTheme: "light" | "dark" | "system";
@@ -170,37 +186,25 @@ export type Website<T extends LanguageCodes = LanguageCodes> = {
170
186
  sidebar: WebSidebar<T> | null;
171
187
  itemPage: {
172
188
  isMainContentDisplayed: boolean;
173
- description: {
174
- isDisplayed: boolean;
175
- isHeaderDisplayed: boolean;
176
- };
177
- document: {
178
- isDisplayed: boolean;
179
- isHeaderDisplayed: boolean;
180
- };
189
+ description: WebSectionDisplay;
190
+ document: WebSectionDisplay;
181
191
  notes: {
182
192
  isDisplayed: boolean;
183
193
  isHeaderDisplayed: boolean;
184
- variant: "discrete" | "tabs-horizontal" | "tabs-vertical" | "tabular";
194
+ variant: WebSectionVariant;
185
195
  };
186
196
  events: {
187
197
  isDisplayed: boolean;
188
198
  isHeaderDisplayed: boolean;
189
- variant: "discrete" | "tabs-horizontal" | "tabs-vertical" | "tabular";
190
- };
191
- periods: {
192
- isDisplayed: boolean;
193
- isHeaderDisplayed: boolean;
199
+ variant: WebSectionVariant;
194
200
  };
201
+ periods: WebSectionDisplay;
195
202
  isPropertiesDisplayed: boolean;
196
- bibliography: {
197
- isDisplayed: boolean;
198
- isHeaderDisplayed: boolean;
199
- };
203
+ bibliography: WebSectionDisplay;
200
204
  isPropertyValuesGrouped: boolean;
201
205
  isPublicationDateTimeDisplayed: boolean;
202
206
  isPersistentIdentifierDisplayed: boolean;
203
- iiifViewer: "universal-viewer" | "clover";
207
+ iiifViewer: WebIiifViewer;
204
208
  };
205
209
  options: Prettify<WebOptions<T> & {
206
210
  stylesheets: {
@@ -245,11 +249,7 @@ export type Webpage<T extends LanguageCodes = LanguageCodes> = {
245
249
  } | null;
246
250
  backgroundImage: WebImage<T> | null;
247
251
  sidebar: WebSidebar<T> | null;
248
- cssStyles: {
249
- default: Array<Style>;
250
- tablet: Array<Style>;
251
- mobile: Array<Style>;
252
- };
252
+ cssStyles: ResponsiveStyles;
253
253
  };
254
254
  webpages: Array<Webpage<T>>;
255
255
  };
@@ -275,11 +275,7 @@ export type WebElement<T extends LanguageCodes = LanguageCodes> = {
275
275
  language: string | null;
276
276
  type: "element";
277
277
  title: WebTitle<T>;
278
- cssStyles: {
279
- default: Array<Style>;
280
- tablet: Array<Style>;
281
- mobile: Array<Style>;
282
- };
278
+ cssStyles: ResponsiveStyles;
283
279
  } & WebElementComponent<T>;
284
280
  /**
285
281
  * Union type of all possible web element components
@@ -342,7 +338,7 @@ export type WebElementComponent<T extends LanguageCodes = LanguageCodes> = {
342
338
  }> | null;
343
339
  variant: "slide" | "table" | "card" | "tile" | "showcase";
344
340
  paginationVariant: "default" | "numeric";
345
- loadingVariant: "spinner" | "skeleton" | "animation" | "none";
341
+ loadingVariant: WebLoadingVariant;
346
342
  image: {
347
343
  layout: "top" | "bottom" | "start" | "end" | null;
348
344
  fit: "fill" | "fit";
@@ -377,7 +373,7 @@ export type WebElementComponent<T extends LanguageCodes = LanguageCodes> = {
377
373
  } | {
378
374
  component: "iiif-viewer";
379
375
  linkUuid: string;
380
- variant: "universal-viewer" | "clover";
376
+ variant: WebIiifViewer;
381
377
  } | {
382
378
  component: "image";
383
379
  images: Array<WebImage<T>>;
@@ -529,14 +525,9 @@ export type WebBlock<T extends LanguageCodes = LanguageCodes, U extends WebBlock
529
525
  tablet: Partial<WebBlock<T>["properties"]["default"]> | null;
530
526
  mobile: Partial<WebBlock<T>["properties"]["default"]> | null;
531
527
  };
532
- cssStyles: {
533
- default: Array<Style>;
534
- tablet: Array<Style>;
535
- mobile: Array<Style>;
536
- };
528
+ cssStyles: ResponsiveStyles;
537
529
  };
538
530
  export type WebBlockByLayout<U extends WebBlockLayout = WebBlockLayout, T extends LanguageCodes = LanguageCodes> = WebBlock<T, U>;
539
- export type AccordionWebBlock<T extends LanguageCodes = LanguageCodes> = WebBlock<T, "accordion">;
540
531
  export type WebsiteMetadata<T extends LanguageCodes = LanguageCodes> = {
541
532
  uuid: string;
542
533
  belongsTo: {
@@ -547,7 +538,7 @@ export type WebsiteMetadata<T extends LanguageCodes = LanguageCodes> = {
547
538
  description: string;
548
539
  webpageTitle: MultilingualString<T> | null;
549
540
  properties: {
550
- privacy: "public" | "password" | "credentials-ochre";
541
+ privacy: WebsitePrivacy;
551
542
  icon: {
552
543
  faviconUuid: string | null;
553
544
  appleTouchIconUuid: string | null;
@@ -1,4 +1,20 @@
1
1
  //#region src/xml/metadata.d.ts
2
+ /**
3
+ * Read the offset a node started at in the source XML
4
+ * @param value - The parsed node
5
+ * @returns The offset, or null when the node carries no source metadata
6
+ * @internal
7
+ */
2
8
  export declare function getXMLSourceIndex(value: unknown): number | null;
9
+ /**
10
+ * Re-attach the source metadata validation dropped
11
+ *
12
+ * `v.safeParse` returns a fresh object graph and does not carry over the
13
+ * non-enumerable symbol `fast-xml-parser` records offsets under, so it is
14
+ * grafted back on by walking the validated output alongside the raw input.
15
+ * @param output - The validated output to graft onto
16
+ * @param input - The raw parsed input to read metadata from
17
+ * @internal
18
+ */
3
19
  export declare function restoreXMLMetadata(output: unknown, input: unknown): void;
4
20
  //#endregion
@@ -1,21 +1,42 @@
1
+ import { isObject, readEntries, readProperty } from "../reflection.mjs";
1
2
  import { XMLParser } from "fast-xml-parser";
2
3
  //#region src/xml/metadata.ts
3
4
  const XML_METADATA_SYMBOL = XMLParser.getMetaDataSymbol();
4
- function isRecord(value) {
5
- return typeof value === "object" && value != null;
6
- }
7
- function getXMLMetadata(value) {
8
- if (!isRecord(value)) return null;
9
- return value[XML_METADATA_SYMBOL] ?? null;
5
+ /**
6
+ * Read the source metadata `fast-xml-parser` attaches under a symbol key
7
+ *
8
+ * Returned as `unknown`: nothing here needs to know its shape, only whether it
9
+ * is there, and {@link getXMLSourceIndex} narrows the one field it reads.
10
+ * @param value - The value to read from
11
+ * @returns The metadata, or undefined when there is none
12
+ */
13
+ function readXMLMetadata(value) {
14
+ return readProperty(value, XML_METADATA_SYMBOL);
10
15
  }
16
+ /**
17
+ * Read the offset a node started at in the source XML
18
+ * @param value - The parsed node
19
+ * @returns The offset, or null when the node carries no source metadata
20
+ * @internal
21
+ */
11
22
  function getXMLSourceIndex(value) {
12
- const startIndex = getXMLMetadata(value)?.startIndex;
23
+ const startIndex = readProperty(readXMLMetadata(value), "startIndex");
13
24
  return typeof startIndex === "number" ? startIndex : null;
14
25
  }
26
+ /**
27
+ * Re-attach the source metadata validation dropped
28
+ *
29
+ * `v.safeParse` returns a fresh object graph and does not carry over the
30
+ * non-enumerable symbol `fast-xml-parser` records offsets under, so it is
31
+ * grafted back on by walking the validated output alongside the raw input.
32
+ * @param output - The validated output to graft onto
33
+ * @param input - The raw parsed input to read metadata from
34
+ * @internal
35
+ */
15
36
  function restoreXMLMetadata(output, input) {
16
- if (!isRecord(output) || !isRecord(input)) return;
17
- const metadata = getXMLMetadata(input);
18
- if (metadata != null) Object.defineProperty(output, XML_METADATA_SYMBOL, {
37
+ if (!isObject(output) || !isObject(input)) return;
38
+ const metadata = readXMLMetadata(input);
39
+ if (metadata !== void 0) Object.defineProperty(output, XML_METADATA_SYMBOL, {
19
40
  value: metadata,
20
41
  enumerable: false,
21
42
  configurable: true
@@ -24,7 +45,7 @@ function restoreXMLMetadata(output, input) {
24
45
  for (const [index, outputValue] of output.entries()) restoreXMLMetadata(outputValue, input[index]);
25
46
  return;
26
47
  }
27
- for (const [key, outputValue] of Object.entries(output)) restoreXMLMetadata(outputValue, input[key]);
48
+ for (const [key, outputValue] of readEntries(output)) restoreXMLMetadata(outputValue, readProperty(input, key));
28
49
  }
29
50
  //#endregion
30
51
  export { getXMLSourceIndex, restoreXMLMetadata };