ochre-sdk 1.0.60 → 1.0.62

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.
@@ -1,22 +1,36 @@
1
- import { Website } from "../types/website.mjs";
1
+ import { ProtectedWebsite, Website } from "../types/website.mjs";
2
2
  import { LanguageCodes } from "../types/index.mjs";
3
3
  import { FetchFunction } from "../parsers/helpers.mjs";
4
4
  //#region src/fetchers/website.d.ts
5
5
  /**
6
- * Fetches and parses a website configuration from the OCHRE API
6
+ * Fetches and parses a website configuration from the OCHRE API.
7
7
  *
8
- * @param abbreviation - The abbreviation identifier for the website
9
- * @returns The parsed website configuration or null if the fetch/parse fails
8
+ * For password-protected or OCHRE-credential-protected websites, if no credentials
9
+ * are provided the function returns a minimal `protectedWebsite` object instead of
10
+ * the full website. Pass `credentials` (a shared password string, or an object with
11
+ * `username` and `password` for OCHRE accounts) to authenticate and receive the full
12
+ * website data.
10
13
  */
11
14
  declare function fetchWebsite<const T extends LanguageCodes = LanguageCodes>(abbreviation: string, options?: {
12
15
  fetch?: FetchFunction;
13
16
  languages?: T;
17
+ credentials?: string | {
18
+ username: string;
19
+ password: string;
20
+ };
14
21
  }): Promise<{
15
22
  website: Website<T>;
23
+ protectedWebsite: null;
16
24
  error: null;
17
25
  detailedError: null;
18
26
  } | {
19
27
  website: null;
28
+ protectedWebsite: ProtectedWebsite<T>;
29
+ error: null;
30
+ detailedError: null;
31
+ } | {
32
+ website: null;
33
+ protectedWebsite: null;
20
34
  error: string;
21
35
  detailedError: string;
22
36
  }>;
@@ -6,30 +6,64 @@ import { parseWebsite } from "../parsers/website/index.mjs";
6
6
  import * as v from "valibot";
7
7
  import { XMLParser } from "fast-xml-parser";
8
8
  //#region src/fetchers/website.ts
9
+ async function validateWebsiteCredentials(uuid, credentials, fetcher) {
10
+ const security = typeof credentials === "string" ? { validate: credentials } : {
11
+ validate: credentials.password,
12
+ userOCHRE: credentials.username
13
+ };
14
+ return (await fetcher("https://ochre.lib.uchicago.edu/ochre/v2/ochre.php", {
15
+ method: "POST",
16
+ body: JSON.stringify({
17
+ uuid,
18
+ data: { security }
19
+ }),
20
+ headers: { "Content-Type": "application/json" }
21
+ })).ok;
22
+ }
9
23
  /**
10
- * Fetches and parses a website configuration from the OCHRE API
24
+ * Fetches and parses a website configuration from the OCHRE API.
11
25
  *
12
- * @param abbreviation - The abbreviation identifier for the website
13
- * @returns The parsed website configuration or null if the fetch/parse fails
26
+ * For password-protected or OCHRE-credential-protected websites, if no credentials
27
+ * are provided the function returns a minimal `protectedWebsite` object instead of
28
+ * the full website. Pass `credentials` (a shared password string, or an object with
29
+ * `username` and `password` for OCHRE accounts) to authenticate and receive the full
30
+ * website data.
14
31
  */
15
32
  async function fetchWebsite(abbreviation, options) {
16
33
  try {
34
+ const fetcher = options?.fetch ?? fetch;
17
35
  const cleanAbbreviation = abbreviation.trim().toLocaleLowerCase("en-US");
18
- const response = await (options?.fetch ?? fetch)(`https://ochre.lib.uchicago.edu/ochre/v2/ochre.php?xquery=${encodeURIComponent(`collection('ochre/tree')/ochre[tree/identification/abbreviation/content/string='${cleanAbbreviation}']`)}&xsl=none&lang="*"`);
36
+ const response = await fetcher(`https://ochre.lib.uchicago.edu/ochre/v2/ochre.php?xquery=${encodeURIComponent(`collection('ochre/tree')/ochre[tree/identification/abbreviation/content/string='${cleanAbbreviation}']`)}&xsl=none&lang="*"`);
19
37
  if (!response.ok) throw new Error("Failed to fetch website", { cause: response.statusText });
20
38
  const dataRaw = await response.text();
21
39
  const data = new XMLParser(XML_PARSER_OPTIONS).parse(dataRaw);
22
40
  const { success, issues, output } = v.safeParse(XMLWebsiteData, data);
23
41
  if (!success) throw createSchemaValidationError("Failed to parse website XML", issues);
24
42
  restoreXMLMetadata(output, data);
43
+ const website = parseWebsite(output, { languages: options?.languages });
44
+ if (website.properties.privacy !== "public") {
45
+ if (options?.credentials == null) return {
46
+ website: null,
47
+ protectedWebsite: {
48
+ uuid: website.uuid,
49
+ identification: website.identification,
50
+ properties: { privacy: website.properties.privacy }
51
+ },
52
+ error: null,
53
+ detailedError: null
54
+ };
55
+ if (!await validateWebsiteCredentials(website.uuid, options.credentials, fetcher)) throw new Error("Invalid credentials for protected website");
56
+ }
25
57
  return {
26
- website: parseWebsite(output, { languages: options?.languages }),
58
+ website,
59
+ protectedWebsite: null,
27
60
  error: null,
28
61
  detailedError: null
29
62
  };
30
63
  } catch (error) {
31
64
  return {
32
65
  website: null,
66
+ protectedWebsite: null,
33
67
  ...getErrorOutput(error, "Unknown error")
34
68
  };
35
69
  }
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { MultilingualOptions, MultilingualString, MultilingualStringEntries, MultilingualStringEntry, MultilingualStringInput, MultilingualStringJSON, MultilingualStringObject, MultilingualStringText } from "./parsers/multilingual.mjs";
2
- import { AccordionWebBlock, ContextTree, ContextTreeFilterLevel, ContextTreeLevel, ContextTreeLevelItem, Scope, Style, StylesheetCategory, StylesheetItem, WebAccordionItem, WebBlock, WebBlockByLayout, WebBlockItem, WebBlockLayout, WebElement, WebElementComponent, WebElementComponentName, WebElementComponentOf, WebElementOf, WebImage, WebSidebar, WebTitle, Webpage, Website, WebsiteMetadata, WebsitePropertyQuery, WebsitePropertyQueryNode, WebsiteSegment, WebsiteType } from "./types/website.mjs";
2
+ import { AccordionWebBlock, ContextTree, ContextTreeFilterLevel, ContextTreeLevel, ContextTreeLevelItem, ProtectedWebsite, Scope, Style, StylesheetCategory, StylesheetItem, WebAccordionItem, WebBlock, WebBlockByLayout, WebBlockItem, WebBlockLayout, WebElement, WebElementComponent, WebElementComponentName, WebElementComponentOf, WebElementOf, WebImage, WebSidebar, WebTitle, Webpage, Website, WebsiteMetadata, WebsitePropertyQuery, WebsitePropertyQueryNode, WebsiteSegment, WebsiteType } from "./types/website.mjs";
3
3
  import { AnyBibliography, AnyConcept, AnyItem, AnyPeriod, AnyPerson, AnyPropertyValue, AnyPropertyVariable, AnyResource, AnySet, AnySpatialUnit, AnyText, AnyTree, BaseItem, BaseItemLink, BelongsTo, Bibliography, BibliographyEntryInfo, BibliographyItemLink, BibliographySourceDocument, Concept, ConceptItemLink, ContainedItemCategory, ContainedItemCategoryFromOption, ContainedItemCategoryOption, Context, ContextItem, ContextItemCategory, ContextNode, Coordinates, CoordinatesSource, DictionaryUnitItemLink, EmbeddedBibliography, EmbeddedConcept, EmbeddedItem, EmbeddedPeriod, EmbeddedPerson, EmbeddedPropertyValue, EmbeddedPropertyVariable, EmbeddedResource, EmbeddedSet, EmbeddedSpatialUnit, EmbeddedText, EmbeddedTree, Event, Gallery, Heading, HeadingItemCategory, Identification, Image, ImageMap, ImageMapArea, Interpretation, Item, ItemCategory, ItemCategoryFromOption, ItemCategoryOption, ItemCategoryWithEmbeddedItems, ItemContainerCategory, ItemLink, ItemLinkCategory, ItemLinks, ItemPayloadKind, ItemProperty, ItemWithoutEmbeddedItems, LanguageCodes, License, Metadata, Note, Observation, Period, PeriodItemLink, Person, PersonItemLink, Prettify, Property, PropertyLike, PropertyRelation, PropertyValue, PropertyValueContent, PropertyValueDataType, PropertyValueItemLink, PropertyValueQueryItem, PropertyVariable, PropertyVariableItemLink, Query, QueryGroup, QueryLeaf, QueryablePropertyValueDataType, RecursiveItemCategory, Resource, ResourceItemLink, Section, Set, SetAttributeValueQueryItem, SetBibliography, SetConcept, SetItem, SetItemCategory, SetItemLink, SetItemProperty, SetItemSimplifiedProperty, SetItemsSort, SetItemsSortDirection, SetPeriod, SetResource, SetSpatialUnit, SetTree, SimplifiedProperty, SpatialUnit, SpatialUnitItemLink, Text, TextItemLink, TopLevelItem, Tree, TreeItemCategory, TreeItemLink } from "./types/index.mjs";
4
4
  import { fetchGallery } from "./fetchers/gallery.mjs";
5
5
  import { fetchItemChildren } from "./fetchers/item-children.mjs";
@@ -11,4 +11,4 @@ import { fetchWebsiteMetadata } from "./fetchers/website-metadata.mjs";
11
11
  import { fetchWebsite } from "./fetchers/website.mjs";
12
12
  import { PropertyOptions, filterProperties, getLeafPropertyValues, getPropertyByVariableLabel, getPropertyByVariableLabelAndValue, getPropertyByVariableLabelAndValueContent, getPropertyByVariableLabelAndValueContents, getPropertyByVariableLabelAndValues, getPropertyByVariableUuid, getPropertyValueByVariableLabel, getPropertyValueByVariableUuid, getPropertyValueContentByVariableLabel, getPropertyValueContentByVariableUuid, getPropertyValueContentsByVariableUuid, getPropertyValuesByVariableLabel, getPropertyValuesByVariableUuid, getUniqueProperties, getUniquePropertyVariableLabels } from "./getters.mjs";
13
13
  import { DEFAULT_PAGE_SIZE, flattenItemProperties } from "./helpers.mjs";
14
- export { type AccordionWebBlock, type AnyBibliography, type AnyConcept, type AnyItem, type AnyPeriod, type AnyPerson, type AnyPropertyValue, type AnyPropertyVariable, type AnyResource, type AnySet, type AnySpatialUnit, type AnyText, type AnyTree, type BaseItem, type BaseItemLink, type BelongsTo, type Bibliography, type BibliographyEntryInfo, type BibliographyItemLink, type BibliographySourceDocument, type Concept, type ConceptItemLink, type ContainedItemCategory, type ContainedItemCategoryFromOption, type ContainedItemCategoryOption, type Context, type ContextItem, type ContextItemCategory, type ContextNode, type ContextTree, type ContextTreeFilterLevel, type ContextTreeLevel, type ContextTreeLevelItem, type Coordinates, type CoordinatesSource, DEFAULT_PAGE_SIZE, type DictionaryUnitItemLink, type EmbeddedBibliography, type EmbeddedConcept, type EmbeddedItem, type EmbeddedPeriod, type EmbeddedPerson, type EmbeddedPropertyValue, type EmbeddedPropertyVariable, type EmbeddedResource, type EmbeddedSet, type EmbeddedSpatialUnit, type EmbeddedText, type EmbeddedTree, type Event, type Gallery, type Heading, type HeadingItemCategory, type Identification, type Image, type ImageMap, type ImageMapArea, type Interpretation, type Item, type ItemCategory, type ItemCategoryFromOption, type ItemCategoryOption, type ItemCategoryWithEmbeddedItems, type ItemContainerCategory, type ItemLink, type ItemLinkCategory, type ItemLinks, type ItemPayloadKind, type ItemProperty, type ItemWithoutEmbeddedItems, type LanguageCodes, type License, type Metadata, type MultilingualOptions, MultilingualString, type MultilingualStringEntries, type MultilingualStringEntry, type MultilingualStringInput, type MultilingualStringJSON, type MultilingualStringObject, type MultilingualStringText, type Note, type Observation, type Period, type PeriodItemLink, type Person, type PersonItemLink, type Prettify, type Property, type PropertyLike, PropertyOptions, type PropertyRelation, type PropertyValue, type PropertyValueContent, type PropertyValueDataType, type PropertyValueItemLink, type PropertyValueQueryItem, type PropertyVariable, type PropertyVariableItemLink, type Query, type QueryGroup, type QueryLeaf, type QueryablePropertyValueDataType, type RecursiveItemCategory, type Resource, type ResourceItemLink, type Scope, type Section, type Set, type SetAttributeValueQueryItem, type SetBibliography, type SetConcept, type SetItem, type SetItemCategory, type SetItemLink, type SetItemProperty, type SetItemSimplifiedProperty, type SetItemsSort, type SetItemsSortDirection, type SetPeriod, type SetResource, type SetSpatialUnit, type SetTree, type SimplifiedProperty, type SpatialUnit, type SpatialUnitItemLink, type Style, type StylesheetCategory, type StylesheetItem, type Text, type TextItemLink, type TopLevelItem, type Tree, type TreeItemCategory, type TreeItemLink, type WebAccordionItem, type WebBlock, type WebBlockByLayout, type WebBlockItem, type WebBlockLayout, type WebElement, type WebElementComponent, type WebElementComponentName, type WebElementComponentOf, type WebElementOf, type WebImage, type WebSidebar, type WebTitle, type Webpage, type Website, type WebsiteMetadata, type WebsitePropertyQuery, type WebsitePropertyQueryNode, type WebsiteSegment, type WebsiteType, defineLanguages, fetchGallery, fetchItem, fetchItemChildren, fetchItemLinks, fetchSetItems, fetchSetPropertyValues, fetchWebsite, fetchWebsiteMetadata, filterProperties, flattenItemProperties, getLeafPropertyValues, getPropertyByVariableLabel, getPropertyByVariableLabelAndValue, getPropertyByVariableLabelAndValueContent, getPropertyByVariableLabelAndValueContents, getPropertyByVariableLabelAndValues, getPropertyByVariableUuid, getPropertyValueByVariableLabel, getPropertyValueByVariableUuid, getPropertyValueContentByVariableLabel, getPropertyValueContentByVariableUuid, getPropertyValueContentsByVariableUuid, getPropertyValuesByVariableLabel, getPropertyValuesByVariableUuid, getUniqueProperties, getUniquePropertyVariableLabels, withLanguages };
14
+ export { type AccordionWebBlock, type AnyBibliography, type AnyConcept, type AnyItem, type AnyPeriod, type AnyPerson, type AnyPropertyValue, type AnyPropertyVariable, type AnyResource, type AnySet, type AnySpatialUnit, type AnyText, type AnyTree, type BaseItem, type BaseItemLink, type BelongsTo, type Bibliography, type BibliographyEntryInfo, type BibliographyItemLink, type BibliographySourceDocument, type Concept, type ConceptItemLink, type ContainedItemCategory, type ContainedItemCategoryFromOption, type ContainedItemCategoryOption, type Context, type ContextItem, type ContextItemCategory, type ContextNode, type ContextTree, type ContextTreeFilterLevel, type ContextTreeLevel, type ContextTreeLevelItem, type Coordinates, type CoordinatesSource, DEFAULT_PAGE_SIZE, type DictionaryUnitItemLink, type EmbeddedBibliography, type EmbeddedConcept, type EmbeddedItem, type EmbeddedPeriod, type EmbeddedPerson, type EmbeddedPropertyValue, type EmbeddedPropertyVariable, type EmbeddedResource, type EmbeddedSet, type EmbeddedSpatialUnit, type EmbeddedText, type EmbeddedTree, type Event, type Gallery, type Heading, type HeadingItemCategory, type Identification, type Image, type ImageMap, type ImageMapArea, type Interpretation, type Item, type ItemCategory, type ItemCategoryFromOption, type ItemCategoryOption, type ItemCategoryWithEmbeddedItems, type ItemContainerCategory, type ItemLink, type ItemLinkCategory, type ItemLinks, type ItemPayloadKind, type ItemProperty, type ItemWithoutEmbeddedItems, type LanguageCodes, type License, type Metadata, type MultilingualOptions, MultilingualString, type MultilingualStringEntries, type MultilingualStringEntry, type MultilingualStringInput, type MultilingualStringJSON, type MultilingualStringObject, type MultilingualStringText, type Note, type Observation, type Period, type PeriodItemLink, type Person, type PersonItemLink, type Prettify, type Property, type PropertyLike, PropertyOptions, type PropertyRelation, type PropertyValue, type PropertyValueContent, type PropertyValueDataType, type PropertyValueItemLink, type PropertyValueQueryItem, type PropertyVariable, type PropertyVariableItemLink, type ProtectedWebsite, type Query, type QueryGroup, type QueryLeaf, type QueryablePropertyValueDataType, type RecursiveItemCategory, type Resource, type ResourceItemLink, type Scope, type Section, type Set, type SetAttributeValueQueryItem, type SetBibliography, type SetConcept, type SetItem, type SetItemCategory, type SetItemLink, type SetItemProperty, type SetItemSimplifiedProperty, type SetItemsSort, type SetItemsSortDirection, type SetPeriod, type SetResource, type SetSpatialUnit, type SetTree, type SimplifiedProperty, type SpatialUnit, type SpatialUnitItemLink, type Style, type StylesheetCategory, type StylesheetItem, type Text, type TextItemLink, type TopLevelItem, type Tree, type TreeItemCategory, type TreeItemLink, type WebAccordionItem, type WebBlock, type WebBlockByLayout, type WebBlockItem, type WebBlockLayout, type WebElement, type WebElementComponent, type WebElementComponentName, type WebElementComponentOf, type WebElementOf, type WebImage, type WebSidebar, type WebTitle, type Webpage, type Website, type WebsiteMetadata, type WebsitePropertyQuery, type WebsitePropertyQueryNode, type WebsiteSegment, type WebsiteType, defineLanguages, fetchGallery, fetchItem, fetchItemChildren, fetchItemLinks, fetchSetItems, fetchSetPropertyValues, fetchWebsite, fetchWebsiteMetadata, filterProperties, flattenItemProperties, getLeafPropertyValues, getPropertyByVariableLabel, getPropertyByVariableLabelAndValue, getPropertyByVariableLabelAndValueContent, getPropertyByVariableLabelAndValueContents, getPropertyByVariableLabelAndValues, getPropertyByVariableUuid, getPropertyValueByVariableLabel, getPropertyValueByVariableUuid, getPropertyValueContentByVariableLabel, getPropertyValueContentByVariableUuid, getPropertyValueContentsByVariableUuid, getPropertyValuesByVariableLabel, getPropertyValuesByVariableUuid, getUniqueProperties, getUniquePropertyVariableLabels, withLanguages };
@@ -1176,7 +1176,9 @@ function parseWebsiteProperties(properties, websiteTree, sidebar, options, paren
1176
1176
  isDescriptionDisplayed: parent?.itemPage.isDescriptionDisplayed ?? true,
1177
1177
  isDocumentDisplayed: parent?.itemPage.isDocumentDisplayed ?? true,
1178
1178
  isNotesDisplayed: parent?.itemPage.isNotesDisplayed ?? true,
1179
+ notesDisplayVariant: parent?.itemPage.notesDisplayVariant ?? "discrete",
1179
1180
  isEventsDisplayed: parent?.itemPage.isEventsDisplayed ?? true,
1181
+ eventsDisplayVariant: parent?.itemPage.eventsDisplayVariant ?? "tabular",
1180
1182
  isPeriodsDisplayed: parent?.itemPage.isPeriodsDisplayed ?? true,
1181
1183
  isPropertiesDisplayed: parent?.itemPage.isPropertiesDisplayed ?? true,
1182
1184
  isBibliographyDisplayed: parent?.itemPage.isBibliographyDisplayed ?? true,
@@ -1220,7 +1222,9 @@ function parseWebsiteProperties(properties, websiteTree, sidebar, options, paren
1220
1222
  returnProperties.itemPage.isDescriptionDisplayed = itemPageReader.valueOr("item-page-description-displayed", returnProperties.itemPage.isDescriptionDisplayed);
1221
1223
  returnProperties.itemPage.isDocumentDisplayed = itemPageReader.valueOr("item-page-document-displayed", returnProperties.itemPage.isDocumentDisplayed);
1222
1224
  returnProperties.itemPage.isNotesDisplayed = itemPageReader.valueOr("item-page-notes-displayed", returnProperties.itemPage.isNotesDisplayed);
1225
+ returnProperties.itemPage.notesDisplayVariant = itemPageReader.valueOr("item-page-notes-display-variant", returnProperties.itemPage.notesDisplayVariant);
1223
1226
  returnProperties.itemPage.isEventsDisplayed = itemPageReader.valueOr("item-page-events-displayed", returnProperties.itemPage.isEventsDisplayed);
1227
+ returnProperties.itemPage.eventsDisplayVariant = itemPageReader.valueOr("item-page-events-display-variant", returnProperties.itemPage.eventsDisplayVariant);
1224
1228
  returnProperties.itemPage.isPeriodsDisplayed = itemPageReader.valueOr("item-page-periods-displayed", returnProperties.itemPage.isPeriodsDisplayed);
1225
1229
  returnProperties.itemPage.isPropertiesDisplayed = itemPageReader.valueOr("item-page-properties-displayed", returnProperties.itemPage.isPropertiesDisplayed);
1226
1230
  returnProperties.itemPage.isBibliographyDisplayed = itemPageReader.valueOr("item-page-bibliography-displayed", returnProperties.itemPage.isBibliographyDisplayed);
@@ -159,7 +159,9 @@ type Website<T extends LanguageCodes = LanguageCodes> = {
159
159
  isDescriptionDisplayed: boolean;
160
160
  isDocumentDisplayed: boolean;
161
161
  isNotesDisplayed: boolean;
162
+ notesDisplayVariant: "discrete" | "tabs-horizontal" | "tabs-vertical" | "tabular";
162
163
  isEventsDisplayed: boolean;
164
+ eventsDisplayVariant: "discrete" | "tabs-horizontal" | "tabs-vertical" | "tabular";
163
165
  isPeriodsDisplayed: boolean;
164
166
  isPropertiesDisplayed: boolean;
165
167
  isBibliographyDisplayed: boolean;
@@ -526,5 +528,12 @@ type WebsiteMetadata<T extends LanguageCodes = LanguageCodes> = {
526
528
  };
527
529
  };
528
530
  };
531
+ type ProtectedWebsite<T extends LanguageCodes = LanguageCodes> = {
532
+ uuid: string;
533
+ identification: Identification<T>;
534
+ properties: {
535
+ privacy: "password" | "password-ochre";
536
+ };
537
+ };
529
538
  //#endregion
530
- export { AccordionWebBlock, ContextTree, ContextTreeFilterLevel, ContextTreeLevel, ContextTreeLevelItem, Scope, Style, StylesheetCategory, StylesheetItem, WebAccordionItem, WebBlock, WebBlockByLayout, WebBlockItem, WebBlockLayout, WebElement, WebElementComponent, WebElementComponentName, WebElementComponentOf, WebElementOf, WebImage, WebSidebar, WebTitle, Webpage, Website, WebsiteMetadata, WebsitePropertyQuery, WebsitePropertyQueryNode, WebsiteSegment, WebsiteType };
539
+ export { AccordionWebBlock, ContextTree, ContextTreeFilterLevel, ContextTreeLevel, ContextTreeLevelItem, ProtectedWebsite, Scope, Style, StylesheetCategory, StylesheetItem, WebAccordionItem, WebBlock, WebBlockByLayout, WebBlockItem, WebBlockLayout, WebElement, WebElementComponent, WebElementComponentName, WebElementComponentOf, WebElementOf, WebImage, WebSidebar, WebTitle, Webpage, Website, WebsiteMetadata, WebsitePropertyQuery, WebsitePropertyQueryNode, WebsiteSegment, WebsiteType };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ochre-sdk",
3
- "version": "1.0.60",
3
+ "version": "1.0.62",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Node.js library for working with OCHRE (Online Cultural and Historical Research Environment) data",
@@ -56,8 +56,8 @@
56
56
  "bumpp": "^11.1.0",
57
57
  "eslint": "^10.7.0",
58
58
  "knip": "^6.26.0",
59
- "oxfmt": "^0.58.0",
60
- "tsdown": "^0.22.5",
59
+ "oxfmt": "^0.59.0",
60
+ "tsdown": "^0.22.7",
61
61
  "typescript": "^6.0.3",
62
62
  "vitest": "^4.1.10"
63
63
  },