@cavuno/board 4.58.0 → 4.59.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.
Files changed (51) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/{_spec-DIzdOWz7.d.mts → _spec-DZV8ME1P.d.mts} +11 -5
  3. package/dist/{_spec-DIzdOWz7.d.ts → _spec-DZV8ME1P.d.ts} +11 -5
  4. package/dist/analytics.js +38 -1
  5. package/dist/analytics.mjs +38 -1
  6. package/dist/bin.mjs +27 -14
  7. package/dist/{blog-DgbGOmzW.d.mts → blog-BfVuJQvO.d.mts} +1 -1
  8. package/dist/{blog-CyvB9C6W.d.ts → blog-CLVfmknV.d.ts} +1 -1
  9. package/dist/{board-leXc6_BM.d.ts → board-Cl6cfS-a.d.ts} +2 -2
  10. package/dist/{board-D3ByAGAb.d.mts → board-gmV8MoLW.d.mts} +2 -2
  11. package/dist/{breadcrumbs-zYG4xzpC.d.mts → breadcrumbs-BOM71gXT.d.mts} +2 -2
  12. package/dist/{breadcrumbs-aCKRBNWX.d.ts → breadcrumbs-dTn6GsKo.d.ts} +2 -2
  13. package/dist/browser/cavuno-board.global.min.js +1 -1
  14. package/dist/{chunk-GUXSUQCP.mjs → chunk-LO7D3AIX.mjs} +8 -10
  15. package/dist/doctor.js +27 -14
  16. package/dist/doctor.mjs +27 -14
  17. package/dist/filters.d.mts +2 -2
  18. package/dist/filters.d.ts +2 -2
  19. package/dist/format.d.mts +12 -4
  20. package/dist/format.d.ts +12 -4
  21. package/dist/format.js +6 -1
  22. package/dist/format.mjs +6 -1
  23. package/dist/index.d.mts +15 -11
  24. package/dist/index.d.ts +15 -11
  25. package/dist/index.js +47 -10
  26. package/dist/index.mjs +47 -10
  27. package/dist/{jobs-nA2K33Nu.d.mts → jobs-DfMyFAYs.d.mts} +1 -1
  28. package/dist/{jobs-DodvFXH2.d.ts → jobs-Di0L5sM1.d.ts} +1 -1
  29. package/dist/route-contract.d.mts +3 -4
  30. package/dist/route-contract.d.ts +3 -4
  31. package/dist/route-contract.js +8 -10
  32. package/dist/route-contract.mjs +1 -1
  33. package/dist/{search-8kX6OW03.d.mts → search-1pxkvj_I.d.mts} +1 -1
  34. package/dist/{search-C1XNGSm6.d.ts → search-BPnMYVa7.d.ts} +1 -1
  35. package/dist/{seo-Bn5gQY8t.d.mts → seo-CJtLrGD_.d.mts} +1 -1
  36. package/dist/{seo-DFAwxGej.d.ts → seo-DFPj-7Rl.d.ts} +1 -1
  37. package/dist/seo-files.d.mts +2 -2
  38. package/dist/seo-files.d.ts +2 -2
  39. package/dist/seo.d.mts +6 -6
  40. package/dist/seo.d.ts +6 -6
  41. package/dist/server.d.mts +6 -6
  42. package/dist/server.d.ts +6 -6
  43. package/dist/sitemap.d.mts +6 -6
  44. package/dist/sitemap.d.ts +6 -6
  45. package/dist/suggest.d.mts +2 -2
  46. package/dist/suggest.d.ts +2 -2
  47. package/dist/well-known.mjs +1 -1
  48. package/package.json +1 -1
  49. package/skills/cavuno-board-auth/SKILL.md +7 -0
  50. package/skills/cavuno-board-format/SKILL.md +5 -1
  51. package/skills/manifest.json +1 -1
package/dist/filters.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-DodvFXH2.js';
2
- import './_spec-DIzdOWz7.js';
1
+ import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-Di0L5sM1.js';
2
+ import './_spec-DZV8ME1P.js';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/filters` — the canonical listing-filter vocabulary and URL
package/dist/format.d.mts CHANGED
@@ -1,7 +1,7 @@
1
- export { C as CurrencyDisplay, F as FormattedSalaryRange, J as JobBreadcrumb, N as NumberNotation, S as SalaryTimeframeInput, a as SalaryTimeframeValue, b as buildJobBreadcrumbs, f as formatSalaryRange, c as formatSalaryStat, d as formatSalaryStatRange, n as normalizeWebsiteUrl } from './breadcrumbs-zYG4xzpC.mjs';
2
- import { C as CustomFieldDefinition } from './board-D3ByAGAb.mjs';
3
- import { C as CustomFieldValues } from './jobs-nA2K33Nu.mjs';
4
- import './_spec-DIzdOWz7.mjs';
1
+ export { C as CurrencyDisplay, F as FormattedSalaryRange, J as JobBreadcrumb, N as NumberNotation, S as SalaryTimeframeInput, a as SalaryTimeframeValue, b as buildJobBreadcrumbs, f as formatSalaryRange, c as formatSalaryStat, d as formatSalaryStatRange, n as normalizeWebsiteUrl } from './breadcrumbs-BOM71gXT.mjs';
2
+ import { C as CustomFieldDefinition } from './board-gmV8MoLW.mjs';
3
+ import { C as CustomFieldValues } from './jobs-DfMyFAYs.mjs';
4
+ import './_spec-DZV8ME1P.mjs';
5
5
 
6
6
  /**
7
7
  * Date display helpers in the board language (required leading parameter,
@@ -84,6 +84,9 @@ declare function countryOptions(language: string): CountryOption[];
84
84
  * with the board locale (`Intl.NumberFormat`, Yes/No chrome). Pre-stringifying
85
85
  * numbers would ship `kind: 'text'` and foreclose locale-aware formatting.
86
86
  *
87
+ * Rich text preserves API-sanitized HTML as `kind: 'rich_text'`. Render that
88
+ * variant as sanitized HTML; continue escaping plain `kind: 'text'` values.
89
+ *
87
90
  * Multi-select stays an array of resolved labels (`kind: 'multi_select'`).
88
91
  * Pre-joining with `Intl.ListFormat` would ship `kind: 'text'` and foreclose
89
92
  * locale-aware **list** formatting (short style, disjunction, separate chips)
@@ -101,6 +104,11 @@ type CustomFieldDisplayEntry = {
101
104
  label: string;
102
105
  kind: 'text';
103
106
  value: string;
107
+ } | {
108
+ key: string;
109
+ label: string;
110
+ kind: 'rich_text';
111
+ value: string;
104
112
  } | {
105
113
  key: string;
106
114
  label: string;
package/dist/format.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- export { C as CurrencyDisplay, F as FormattedSalaryRange, J as JobBreadcrumb, N as NumberNotation, S as SalaryTimeframeInput, a as SalaryTimeframeValue, b as buildJobBreadcrumbs, f as formatSalaryRange, c as formatSalaryStat, d as formatSalaryStatRange, n as normalizeWebsiteUrl } from './breadcrumbs-aCKRBNWX.js';
2
- import { C as CustomFieldDefinition } from './board-leXc6_BM.js';
3
- import { C as CustomFieldValues } from './jobs-DodvFXH2.js';
4
- import './_spec-DIzdOWz7.js';
1
+ export { C as CurrencyDisplay, F as FormattedSalaryRange, J as JobBreadcrumb, N as NumberNotation, S as SalaryTimeframeInput, a as SalaryTimeframeValue, b as buildJobBreadcrumbs, f as formatSalaryRange, c as formatSalaryStat, d as formatSalaryStatRange, n as normalizeWebsiteUrl } from './breadcrumbs-dTn6GsKo.js';
2
+ import { C as CustomFieldDefinition } from './board-Cl6cfS-a.js';
3
+ import { C as CustomFieldValues } from './jobs-Di0L5sM1.js';
4
+ import './_spec-DZV8ME1P.js';
5
5
 
6
6
  /**
7
7
  * Date display helpers in the board language (required leading parameter,
@@ -84,6 +84,9 @@ declare function countryOptions(language: string): CountryOption[];
84
84
  * with the board locale (`Intl.NumberFormat`, Yes/No chrome). Pre-stringifying
85
85
  * numbers would ship `kind: 'text'` and foreclose locale-aware formatting.
86
86
  *
87
+ * Rich text preserves API-sanitized HTML as `kind: 'rich_text'`. Render that
88
+ * variant as sanitized HTML; continue escaping plain `kind: 'text'` values.
89
+ *
87
90
  * Multi-select stays an array of resolved labels (`kind: 'multi_select'`).
88
91
  * Pre-joining with `Intl.ListFormat` would ship `kind: 'text'` and foreclose
89
92
  * locale-aware **list** formatting (short style, disjunction, separate chips)
@@ -101,6 +104,11 @@ type CustomFieldDisplayEntry = {
101
104
  label: string;
102
105
  kind: 'text';
103
106
  value: string;
107
+ } | {
108
+ key: string;
109
+ label: string;
110
+ kind: 'rich_text';
111
+ value: string;
104
112
  } | {
105
113
  key: string;
106
114
  label: string;
package/dist/format.js CHANGED
@@ -811,7 +811,12 @@ function resolveCustomFieldDisplay(language, definitions, values) {
811
811
  }
812
812
  const value = renderTextValue(def, raw);
813
813
  if (value !== null) {
814
- entries.push({ key: def.key, label: def.label, kind: "text", value });
814
+ entries.push({
815
+ key: def.key,
816
+ label: def.label,
817
+ kind: def.type === "rich_text" ? "rich_text" : "text",
818
+ value
819
+ });
815
820
  }
816
821
  }
817
822
  return entries;
package/dist/format.mjs CHANGED
@@ -475,7 +475,12 @@ function resolveCustomFieldDisplay(language, definitions, values) {
475
475
  }
476
476
  const value = renderTextValue(def, raw);
477
477
  if (value !== null) {
478
- entries.push({ key: def.key, label: def.label, kind: "text", value });
478
+ entries.push({
479
+ key: def.key,
480
+ label: def.label,
481
+ kind: def.type === "rich_text" ? "rich_text" : "text",
482
+ value
483
+ });
479
484
  }
480
485
  }
481
486
  return entries;
package/dist/index.d.mts CHANGED
@@ -1,13 +1,13 @@
1
- import { S as Schemas, c as components } from './_spec-DIzdOWz7.mjs';
2
- import { F as FetchOptions, S as StorageMode, B as BoardRequest, A as Awaitable, L as Logger, a as BoardClient, b as SearchSuggestQuery } from './search-8kX6OW03.mjs';
3
- export { c as ACCESS_TOKEN_KEY, d as BOARD_ACCESS_GRANT_KEY, C as CompanySuggestion, e as CustomStorage, M as MarketSuggestion, R as REFRESH_TOKEN_KEY, f as SearchSuggestType, g as SuggestResult, h as SuggestionItem, T as TermSuggestion } from './search-8kX6OW03.mjs';
4
- import { L as ListEnvelope, R as RemoteOption, E as EmploymentType, S as Seniority, a as JobCapability, b as CustomFieldFilter, O as ObjectReferenceFilter, c as JobCollectionChoiceQuery, d as JobsListQuery, e as JobCardListEnvelope, f as JobRetrieveQuery, g as JobsSearchBody, h as JobCardSearchEnvelope, i as JobsSimilarQuery, j as SearchEnvelope } from './jobs-nA2K33Nu.mjs';
5
- export { k as CustomFieldValue, C as CustomFieldValues, l as CustomFilterValue, m as EducationRequirement, n as JobCatalogPagination, o as JobCollectionChoiceList, p as JobCollectionFieldDefinition, q as JobCompany, r as JobCustomEmploymentType, J as JobSort, s as OfficeLocation, t as OffsetPagination, P as PublicJob, u as PublicJobCard, v as RelatedSearch, w as RemotePermit, x as RemoteTimezone, y as ResolvedJobCollectionField, z as StorefrontPagination } from './jobs-nA2K33Nu.mjs';
6
- import { c as CompaniesListQuery, d as CompanyListEnvelope, e as CompaniesSearchBody, f as CompanyJobsListQuery, g as CompanySimilarQuery, h as CompanyMarketsListQuery, i as SalaryDetailQuery, b as CompanySalary } from './board-D3ByAGAb.mjs';
7
- export { B as BoardCustomEmploymentType, j as BoardFormBuiltinField, k as BoardFormField, l as BoardFormLayout, m as BoardFormLockReason, n as BoardJobFormField, o as BoardProfileFormField, p as BoardRoleSignIn, q as BoardSignInSsoConnection, a as CompanyCategorySalary, r as CompanyMarket, s as CompanyMarketRef, t as CompanySalarySummary, C as CustomFieldDefinition, u as CustomFieldOption, v as CustomFieldType, L as LocationSalaryDetail, w as LocationSkillsIndex, x as LocationTitlesIndex, P as PublicBoard, y as PublicBoardAds, z as PublicBoardAnalytics, A as PublicBoardFeatures, D as PublicBoardJobForm, E as PublicBoardSignIn, F as PublicCompany, G as PublicCompanyDetail, H as PublicCompanyMembership, I as SalaryCompany, J as SalaryLocation, K as SalarySkill, M as SalaryTitle, N as SkillLocationSalary, O as SkillLocationsIndex, S as SkillSalaryDetail, Q as TitleLocationSalary, R as TitleLocationsIndex, T as TitleSalaryDetail } from './board-D3ByAGAb.mjs';
8
- export { B as BoardSeo } from './seo-Bn5gQY8t.mjs';
9
- import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-DgbGOmzW.mjs';
10
- export { B as BlogAuthorEmbed, d as BlogTagEmbed, e as PublicBlogAdjacentPosts, f as PublicBlogAuthor, g as PublicBlogPost, P as PublicBlogPostSummary, h as PublicBlogTag } from './blog-DgbGOmzW.mjs';
1
+ import { S as Schemas, c as components } from './_spec-DZV8ME1P.mjs';
2
+ import { F as FetchOptions, S as StorageMode, B as BoardRequest, A as Awaitable, L as Logger, a as BoardClient, b as SearchSuggestQuery } from './search-1pxkvj_I.mjs';
3
+ export { c as ACCESS_TOKEN_KEY, d as BOARD_ACCESS_GRANT_KEY, C as CompanySuggestion, e as CustomStorage, M as MarketSuggestion, R as REFRESH_TOKEN_KEY, f as SearchSuggestType, g as SuggestResult, h as SuggestionItem, T as TermSuggestion } from './search-1pxkvj_I.mjs';
4
+ import { L as ListEnvelope, R as RemoteOption, E as EmploymentType, S as Seniority, a as JobCapability, b as CustomFieldFilter, O as ObjectReferenceFilter, c as JobCollectionChoiceQuery, d as JobsListQuery, e as JobCardListEnvelope, f as JobRetrieveQuery, g as JobsSearchBody, h as JobCardSearchEnvelope, i as JobsSimilarQuery, j as SearchEnvelope } from './jobs-DfMyFAYs.mjs';
5
+ export { k as CustomFieldValue, C as CustomFieldValues, l as CustomFilterValue, m as EducationRequirement, n as JobCatalogPagination, o as JobCollectionChoiceList, p as JobCollectionFieldDefinition, q as JobCompany, r as JobCustomEmploymentType, J as JobSort, s as OfficeLocation, t as OffsetPagination, P as PublicJob, u as PublicJobCard, v as RelatedSearch, w as RemotePermit, x as RemoteTimezone, y as ResolvedJobCollectionField, z as StorefrontPagination } from './jobs-DfMyFAYs.mjs';
6
+ import { c as CompaniesListQuery, d as CompanyListEnvelope, e as CompaniesSearchBody, f as CompanyJobsListQuery, g as CompanySimilarQuery, h as CompanyMarketsListQuery, i as SalaryDetailQuery, b as CompanySalary } from './board-gmV8MoLW.mjs';
7
+ export { B as BoardCustomEmploymentType, j as BoardFormBuiltinField, k as BoardFormField, l as BoardFormLayout, m as BoardFormLockReason, n as BoardJobFormField, o as BoardProfileFormField, p as BoardRoleSignIn, q as BoardSignInSsoConnection, a as CompanyCategorySalary, r as CompanyMarket, s as CompanyMarketRef, t as CompanySalarySummary, C as CustomFieldDefinition, u as CustomFieldOption, v as CustomFieldType, L as LocationSalaryDetail, w as LocationSkillsIndex, x as LocationTitlesIndex, P as PublicBoard, y as PublicBoardAds, z as PublicBoardAnalytics, A as PublicBoardFeatures, D as PublicBoardJobForm, E as PublicBoardSignIn, F as PublicCompany, G as PublicCompanyDetail, H as PublicCompanyMembership, I as SalaryCompany, J as SalaryLocation, K as SalarySkill, M as SalaryTitle, N as SkillLocationSalary, O as SkillLocationsIndex, S as SkillSalaryDetail, Q as TitleLocationSalary, R as TitleLocationsIndex, T as TitleSalaryDetail } from './board-gmV8MoLW.mjs';
8
+ export { B as BoardSeo } from './seo-CJtLrGD_.mjs';
9
+ import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-BfVuJQvO.mjs';
10
+ export { B as BlogAuthorEmbed, d as BlogTagEmbed, e as PublicBlogAdjacentPosts, f as PublicBlogAuthor, g as PublicBlogPost, P as PublicBlogPostSummary, h as PublicBlogTag } from './blog-BfVuJQvO.mjs';
11
11
 
12
12
  /**
13
13
  * Well-known `<domain>_<snake_reason>` codes the Board API sends, grouped by
@@ -202,7 +202,7 @@ declare function paginate<Q extends Record<string, unknown>, P extends PageShape
202
202
  * constant because the package is platform-neutral and cannot read
203
203
  * package.json at runtime.
204
204
  */
205
- declare const SDK_VERSION = "4.58.0";
205
+ declare const SDK_VERSION = "4.59.1";
206
206
 
207
207
  type SavedJob = Schemas['SavedJob'];
208
208
  type SavedJobsListQuery = {
@@ -853,6 +853,8 @@ type RequestMagicLinkBody = Schemas['BoardAuthRequestMagicLinkBody'];
853
853
  type ConsumeMagicLinkBody = Schemas['BoardAuthConsumeMagicLinkBody'];
854
854
  type OAuthProvider = 'google' | 'linkedin';
855
855
  type OAuthAuthorizationQuery = {
856
+ /** SHA-256 hex of a random secret retained for the initiating browser. Supplied automatically in browsers. Server callers should pass it and later send the raw secret as `browserBinding` on exchange; it is optional for now and will become required. */
857
+ browserBindingHash?: string;
856
858
  /** JSON-encoded audience evidence captured after analytics consent. */
857
859
  audienceAttribution?: string;
858
860
  returnTo?: string;
@@ -1543,6 +1545,8 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1543
1545
  facebookUrl: string | null;
1544
1546
  linkedinUrl: string | null;
1545
1547
  instagramUrl: string | null;
1548
+ tiktokUrl: string | null;
1549
+ youtubeUrl: string | null;
1546
1550
  };
1547
1551
  }>;
1548
1552
  /**
package/dist/index.d.ts CHANGED
@@ -1,13 +1,13 @@
1
- import { S as Schemas, c as components } from './_spec-DIzdOWz7.js';
2
- import { F as FetchOptions, S as StorageMode, B as BoardRequest, A as Awaitable, L as Logger, a as BoardClient, b as SearchSuggestQuery } from './search-C1XNGSm6.js';
3
- export { c as ACCESS_TOKEN_KEY, d as BOARD_ACCESS_GRANT_KEY, C as CompanySuggestion, e as CustomStorage, M as MarketSuggestion, R as REFRESH_TOKEN_KEY, f as SearchSuggestType, g as SuggestResult, h as SuggestionItem, T as TermSuggestion } from './search-C1XNGSm6.js';
4
- import { L as ListEnvelope, R as RemoteOption, E as EmploymentType, S as Seniority, a as JobCapability, b as CustomFieldFilter, O as ObjectReferenceFilter, c as JobCollectionChoiceQuery, d as JobsListQuery, e as JobCardListEnvelope, f as JobRetrieveQuery, g as JobsSearchBody, h as JobCardSearchEnvelope, i as JobsSimilarQuery, j as SearchEnvelope } from './jobs-DodvFXH2.js';
5
- export { k as CustomFieldValue, C as CustomFieldValues, l as CustomFilterValue, m as EducationRequirement, n as JobCatalogPagination, o as JobCollectionChoiceList, p as JobCollectionFieldDefinition, q as JobCompany, r as JobCustomEmploymentType, J as JobSort, s as OfficeLocation, t as OffsetPagination, P as PublicJob, u as PublicJobCard, v as RelatedSearch, w as RemotePermit, x as RemoteTimezone, y as ResolvedJobCollectionField, z as StorefrontPagination } from './jobs-DodvFXH2.js';
6
- import { c as CompaniesListQuery, d as CompanyListEnvelope, e as CompaniesSearchBody, f as CompanyJobsListQuery, g as CompanySimilarQuery, h as CompanyMarketsListQuery, i as SalaryDetailQuery, b as CompanySalary } from './board-leXc6_BM.js';
7
- export { B as BoardCustomEmploymentType, j as BoardFormBuiltinField, k as BoardFormField, l as BoardFormLayout, m as BoardFormLockReason, n as BoardJobFormField, o as BoardProfileFormField, p as BoardRoleSignIn, q as BoardSignInSsoConnection, a as CompanyCategorySalary, r as CompanyMarket, s as CompanyMarketRef, t as CompanySalarySummary, C as CustomFieldDefinition, u as CustomFieldOption, v as CustomFieldType, L as LocationSalaryDetail, w as LocationSkillsIndex, x as LocationTitlesIndex, P as PublicBoard, y as PublicBoardAds, z as PublicBoardAnalytics, A as PublicBoardFeatures, D as PublicBoardJobForm, E as PublicBoardSignIn, F as PublicCompany, G as PublicCompanyDetail, H as PublicCompanyMembership, I as SalaryCompany, J as SalaryLocation, K as SalarySkill, M as SalaryTitle, N as SkillLocationSalary, O as SkillLocationsIndex, S as SkillSalaryDetail, Q as TitleLocationSalary, R as TitleLocationsIndex, T as TitleSalaryDetail } from './board-leXc6_BM.js';
8
- export { B as BoardSeo } from './seo-DFAwxGej.js';
9
- import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-CyvB9C6W.js';
10
- export { B as BlogAuthorEmbed, d as BlogTagEmbed, e as PublicBlogAdjacentPosts, f as PublicBlogAuthor, g as PublicBlogPost, P as PublicBlogPostSummary, h as PublicBlogTag } from './blog-CyvB9C6W.js';
1
+ import { S as Schemas, c as components } from './_spec-DZV8ME1P.js';
2
+ import { F as FetchOptions, S as StorageMode, B as BoardRequest, A as Awaitable, L as Logger, a as BoardClient, b as SearchSuggestQuery } from './search-BPnMYVa7.js';
3
+ export { c as ACCESS_TOKEN_KEY, d as BOARD_ACCESS_GRANT_KEY, C as CompanySuggestion, e as CustomStorage, M as MarketSuggestion, R as REFRESH_TOKEN_KEY, f as SearchSuggestType, g as SuggestResult, h as SuggestionItem, T as TermSuggestion } from './search-BPnMYVa7.js';
4
+ import { L as ListEnvelope, R as RemoteOption, E as EmploymentType, S as Seniority, a as JobCapability, b as CustomFieldFilter, O as ObjectReferenceFilter, c as JobCollectionChoiceQuery, d as JobsListQuery, e as JobCardListEnvelope, f as JobRetrieveQuery, g as JobsSearchBody, h as JobCardSearchEnvelope, i as JobsSimilarQuery, j as SearchEnvelope } from './jobs-Di0L5sM1.js';
5
+ export { k as CustomFieldValue, C as CustomFieldValues, l as CustomFilterValue, m as EducationRequirement, n as JobCatalogPagination, o as JobCollectionChoiceList, p as JobCollectionFieldDefinition, q as JobCompany, r as JobCustomEmploymentType, J as JobSort, s as OfficeLocation, t as OffsetPagination, P as PublicJob, u as PublicJobCard, v as RelatedSearch, w as RemotePermit, x as RemoteTimezone, y as ResolvedJobCollectionField, z as StorefrontPagination } from './jobs-Di0L5sM1.js';
6
+ import { c as CompaniesListQuery, d as CompanyListEnvelope, e as CompaniesSearchBody, f as CompanyJobsListQuery, g as CompanySimilarQuery, h as CompanyMarketsListQuery, i as SalaryDetailQuery, b as CompanySalary } from './board-Cl6cfS-a.js';
7
+ export { B as BoardCustomEmploymentType, j as BoardFormBuiltinField, k as BoardFormField, l as BoardFormLayout, m as BoardFormLockReason, n as BoardJobFormField, o as BoardProfileFormField, p as BoardRoleSignIn, q as BoardSignInSsoConnection, a as CompanyCategorySalary, r as CompanyMarket, s as CompanyMarketRef, t as CompanySalarySummary, C as CustomFieldDefinition, u as CustomFieldOption, v as CustomFieldType, L as LocationSalaryDetail, w as LocationSkillsIndex, x as LocationTitlesIndex, P as PublicBoard, y as PublicBoardAds, z as PublicBoardAnalytics, A as PublicBoardFeatures, D as PublicBoardJobForm, E as PublicBoardSignIn, F as PublicCompany, G as PublicCompanyDetail, H as PublicCompanyMembership, I as SalaryCompany, J as SalaryLocation, K as SalarySkill, M as SalaryTitle, N as SkillLocationSalary, O as SkillLocationsIndex, S as SkillSalaryDetail, Q as TitleLocationSalary, R as TitleLocationsIndex, T as TitleSalaryDetail } from './board-Cl6cfS-a.js';
8
+ export { B as BoardSeo } from './seo-DFPj-7Rl.js';
9
+ import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-CLVfmknV.js';
10
+ export { B as BlogAuthorEmbed, d as BlogTagEmbed, e as PublicBlogAdjacentPosts, f as PublicBlogAuthor, g as PublicBlogPost, P as PublicBlogPostSummary, h as PublicBlogTag } from './blog-CLVfmknV.js';
11
11
 
12
12
  /**
13
13
  * Well-known `<domain>_<snake_reason>` codes the Board API sends, grouped by
@@ -202,7 +202,7 @@ declare function paginate<Q extends Record<string, unknown>, P extends PageShape
202
202
  * constant because the package is platform-neutral and cannot read
203
203
  * package.json at runtime.
204
204
  */
205
- declare const SDK_VERSION = "4.58.0";
205
+ declare const SDK_VERSION = "4.59.1";
206
206
 
207
207
  type SavedJob = Schemas['SavedJob'];
208
208
  type SavedJobsListQuery = {
@@ -853,6 +853,8 @@ type RequestMagicLinkBody = Schemas['BoardAuthRequestMagicLinkBody'];
853
853
  type ConsumeMagicLinkBody = Schemas['BoardAuthConsumeMagicLinkBody'];
854
854
  type OAuthProvider = 'google' | 'linkedin';
855
855
  type OAuthAuthorizationQuery = {
856
+ /** SHA-256 hex of a random secret retained for the initiating browser. Supplied automatically in browsers. Server callers should pass it and later send the raw secret as `browserBinding` on exchange; it is optional for now and will become required. */
857
+ browserBindingHash?: string;
856
858
  /** JSON-encoded audience evidence captured after analytics consent. */
857
859
  audienceAttribution?: string;
858
860
  returnTo?: string;
@@ -1543,6 +1545,8 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1543
1545
  facebookUrl: string | null;
1544
1546
  linkedinUrl: string | null;
1545
1547
  instagramUrl: string | null;
1548
+ tiktokUrl: string | null;
1549
+ youtubeUrl: string | null;
1546
1550
  };
1547
1551
  }>;
1548
1552
  /**
package/dist/index.js CHANGED
@@ -430,7 +430,7 @@ async function clearSession(storage) {
430
430
  }
431
431
 
432
432
  // src/version.ts
433
- var SDK_VERSION = "4.58.0";
433
+ var SDK_VERSION = "4.59.1";
434
434
 
435
435
  // src/client.ts
436
436
  function isRawBody(body) {
@@ -897,19 +897,54 @@ function authNamespace(client, board = "") {
897
897
  return persist(session);
898
898
  },
899
899
  /**
900
- * Build a provider authorization URL. The SDK returns the URL; the
901
- * host app owns browser navigation.
900
+ * Build a provider authorization URL and bind the sign-in to the
901
+ * initiating browser. With an explicit `browserBindingHash`, the SDK sends
902
+ * it and the caller keeps the raw secret for `exchangeOAuth`. Otherwise,
903
+ * in a browser with storage and Web Crypto, the SDK creates and retains
904
+ * the proof automatically. Server runtimes should pass
905
+ * `browserBindingHash` (the SHA-256 hex of a random secret they keep
906
+ * for the visitor) and later supply that secret as `browserBinding` on
907
+ * exchange; without one the request is sent unbound, which is accepted
908
+ * for now and will be refused once proof becomes required. The host app
909
+ * owns navigation.
902
910
  *
903
911
  * @example
904
912
  * const { authorizeUrl } = await board.auth.getOAuthAuthorizationUrl('google');
905
913
  * window.location.href = authorizeUrl;
906
914
  */
907
- getOAuthAuthorizationUrl(provider, query, options) {
908
- return client.fetch(`/auth/oauth/${provider}`, {
909
- ...options,
910
- method: "GET",
911
- query
912
- });
915
+ async getOAuthAuthorizationUrl(provider, query, options) {
916
+ let browserBindingHash = query?.browserBindingHash;
917
+ let secret;
918
+ if (!browserBindingHash && globalThis.crypto?.subtle) {
919
+ try {
920
+ secret = ssoProof().begin();
921
+ } catch {
922
+ }
923
+ }
924
+ const automatic = secret !== void 0;
925
+ try {
926
+ if (secret !== void 0) {
927
+ const digest = await globalThis.crypto.subtle.digest(
928
+ "SHA-256",
929
+ new TextEncoder().encode(secret)
930
+ );
931
+ browserBindingHash = Array.from(
932
+ new Uint8Array(digest),
933
+ (byte) => byte.toString(16).padStart(2, "0")
934
+ ).join("");
935
+ }
936
+ return await client.fetch(
937
+ `/auth/oauth/${provider}`,
938
+ {
939
+ ...options,
940
+ method: "GET",
941
+ query: browserBindingHash ? { ...query, browserBindingHash } : query
942
+ }
943
+ );
944
+ } catch (error) {
945
+ if (automatic) ssoProof().clear();
946
+ throw error;
947
+ }
913
948
  },
914
949
  /**
915
950
  * Exchange the provider callback one-time token and persist the
@@ -930,7 +965,9 @@ function authNamespace(client, board = "") {
930
965
  }
931
966
  }
932
967
  );
933
- return persist(session);
968
+ const result = await persist(session);
969
+ ssoProof().clear();
970
+ return result;
934
971
  },
935
972
  /**
936
973
  * Build the authorization URL for one of the board's SSO connections
package/dist/index.mjs CHANGED
@@ -46,7 +46,7 @@ function toSearchParams(query) {
46
46
  }
47
47
 
48
48
  // src/version.ts
49
- var SDK_VERSION = "4.58.0";
49
+ var SDK_VERSION = "4.59.1";
50
50
 
51
51
  // src/client.ts
52
52
  function isRawBody(body) {
@@ -513,19 +513,54 @@ function authNamespace(client, board = "") {
513
513
  return persist(session);
514
514
  },
515
515
  /**
516
- * Build a provider authorization URL. The SDK returns the URL; the
517
- * host app owns browser navigation.
516
+ * Build a provider authorization URL and bind the sign-in to the
517
+ * initiating browser. With an explicit `browserBindingHash`, the SDK sends
518
+ * it and the caller keeps the raw secret for `exchangeOAuth`. Otherwise,
519
+ * in a browser with storage and Web Crypto, the SDK creates and retains
520
+ * the proof automatically. Server runtimes should pass
521
+ * `browserBindingHash` (the SHA-256 hex of a random secret they keep
522
+ * for the visitor) and later supply that secret as `browserBinding` on
523
+ * exchange; without one the request is sent unbound, which is accepted
524
+ * for now and will be refused once proof becomes required. The host app
525
+ * owns navigation.
518
526
  *
519
527
  * @example
520
528
  * const { authorizeUrl } = await board.auth.getOAuthAuthorizationUrl('google');
521
529
  * window.location.href = authorizeUrl;
522
530
  */
523
- getOAuthAuthorizationUrl(provider, query, options) {
524
- return client.fetch(`/auth/oauth/${provider}`, {
525
- ...options,
526
- method: "GET",
527
- query
528
- });
531
+ async getOAuthAuthorizationUrl(provider, query, options) {
532
+ let browserBindingHash = query?.browserBindingHash;
533
+ let secret;
534
+ if (!browserBindingHash && globalThis.crypto?.subtle) {
535
+ try {
536
+ secret = ssoProof().begin();
537
+ } catch {
538
+ }
539
+ }
540
+ const automatic = secret !== void 0;
541
+ try {
542
+ if (secret !== void 0) {
543
+ const digest = await globalThis.crypto.subtle.digest(
544
+ "SHA-256",
545
+ new TextEncoder().encode(secret)
546
+ );
547
+ browserBindingHash = Array.from(
548
+ new Uint8Array(digest),
549
+ (byte) => byte.toString(16).padStart(2, "0")
550
+ ).join("");
551
+ }
552
+ return await client.fetch(
553
+ `/auth/oauth/${provider}`,
554
+ {
555
+ ...options,
556
+ method: "GET",
557
+ query: browserBindingHash ? { ...query, browserBindingHash } : query
558
+ }
559
+ );
560
+ } catch (error) {
561
+ if (automatic) ssoProof().clear();
562
+ throw error;
563
+ }
529
564
  },
530
565
  /**
531
566
  * Exchange the provider callback one-time token and persist the
@@ -546,7 +581,9 @@ function authNamespace(client, board = "") {
546
581
  }
547
582
  }
548
583
  );
549
- return persist(session);
584
+ const result = await persist(session);
585
+ ssoProof().clear();
586
+ return result;
550
587
  },
551
588
  /**
552
589
  * Build the authorization URL for one of the board's SSO connections
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DIzdOWz7.mjs';
1
+ import { S as Schemas } from './_spec-DZV8ME1P.mjs';
2
2
 
3
3
  /**
4
4
  * Optional pagination metadata returned by Board API list operations.
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DIzdOWz7.js';
1
+ import { S as Schemas } from './_spec-DZV8ME1P.js';
2
2
 
3
3
  /**
4
4
  * Optional pagination metadata returned by Board API list operations.
@@ -97,10 +97,9 @@ declare function createBoardLinkResolver(layers: readonly ManifestLayer[]): {
97
97
  *.
98
98
  *
99
99
  * Segment-wise matcher (no RegExp construction from templates). Templates
100
- * are validated at write time but stay defensive here: a segment starting
101
- * with ':' is a whole-segment param, a segment with fixed text before a
102
- * `:name` (`@:handle`) captures what follows that text, and anything else
103
- * is a literal.
100
+ * are validated at write time but stay defensive here: identifier params
101
+ * capture between optional fixed text (`@:handle`, `:postSlug.html`),
102
+ * and segments without params are literal.
104
103
  */
105
104
 
106
105
  /**
@@ -97,10 +97,9 @@ declare function createBoardLinkResolver(layers: readonly ManifestLayer[]): {
97
97
  *.
98
98
  *
99
99
  * Segment-wise matcher (no RegExp construction from templates). Templates
100
- * are validated at write time but stay defensive here: a segment starting
101
- * with ':' is a whole-segment param, a segment with fixed text before a
102
- * `:name` (`@:handle`) captures what follows that text, and anything else
103
- * is a literal.
100
+ * are validated at write time but stay defensive here: identifier params
101
+ * capture between optional fixed text (`@:handle`, `:postSlug.html`),
102
+ * and segments without params are literal.
104
103
  */
105
104
 
106
105
  /**
@@ -1163,7 +1163,7 @@ function splitSegments(path) {
1163
1163
  if (withoutTrailing === "") return [];
1164
1164
  return withoutTrailing.split("/");
1165
1165
  }
1166
- var PREFIXED_PARAM_RE = /^([^:]+):([A-Za-z_][A-Za-z0-9_]*)(.*)$/;
1166
+ var PARAM_SEGMENT_RE = /^([^:]*):([A-Za-z_][A-Za-z0-9_]*)([A-Za-z0-9_.@-]*)$/;
1167
1167
  function matchPathToTemplate(template, pathname) {
1168
1168
  const templateSegs = splitSegments(template);
1169
1169
  const pathSegs = splitSegments(pathname);
@@ -1176,16 +1176,14 @@ function matchPathToTemplate(template, pathname) {
1176
1176
  const pSeg = pathSegs[i];
1177
1177
  let name = null;
1178
1178
  let value = pSeg;
1179
- if (tSeg.startsWith(":") && tSeg.length > 1) {
1179
+ const parameter = PARAM_SEGMENT_RE.exec(tSeg);
1180
+ if (parameter) {
1181
+ const [, prefix = "", param = "", suffix = ""] = parameter;
1182
+ if (!pSeg.startsWith(prefix) || !pSeg.endsWith(suffix)) return null;
1183
+ name = param;
1184
+ value = pSeg.slice(prefix.length, pSeg.length - suffix.length);
1185
+ } else if (tSeg.startsWith(":") && tSeg.length > 1) {
1180
1186
  name = tSeg.slice(1);
1181
- } else {
1182
- const prefixed = PREFIXED_PARAM_RE.exec(tSeg);
1183
- if (prefixed) {
1184
- const [, prefix = "", param = "", suffix = ""] = prefixed;
1185
- if (!pSeg.startsWith(prefix) || !pSeg.endsWith(suffix)) return null;
1186
- name = param;
1187
- value = pSeg.slice(prefix.length, pSeg.length - suffix.length);
1188
- }
1189
1187
  }
1190
1188
  if (name !== null) {
1191
1189
  if (value.length === 0) return null;
@@ -26,7 +26,7 @@ import {
26
26
  parseTanStackRoutes,
27
27
  sameParamSet,
28
28
  validateManifest
29
- } from "./chunk-GUXSUQCP.mjs";
29
+ } from "./chunk-LO7D3AIX.mjs";
30
30
  import "./chunk-MSY7ERBY.mjs";
31
31
  export {
32
32
  ALL_ROLES,
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DIzdOWz7.mjs';
1
+ import { S as Schemas } from './_spec-DZV8ME1P.mjs';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DIzdOWz7.js';
1
+ import { S as Schemas } from './_spec-DZV8ME1P.js';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DIzdOWz7.mjs';
1
+ import { S as Schemas } from './_spec-DZV8ME1P.mjs';
2
2
 
3
3
  /**
4
4
  * The public SEO-infra payload (`board.seo()`) — platform infrastructure a
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DIzdOWz7.js';
1
+ import { S as Schemas } from './_spec-DZV8ME1P.js';
2
2
 
3
3
  /**
4
4
  * The public SEO-infra payload (`board.seo()`) — platform infrastructure a
@@ -1,5 +1,5 @@
1
- import { B as BoardSeo } from './seo-Bn5gQY8t.mjs';
2
- import './_spec-DIzdOWz7.mjs';
1
+ import { B as BoardSeo } from './seo-CJtLrGD_.mjs';
2
+ import './_spec-DZV8ME1P.mjs';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/seo-files` — platform-owned crawler/identity file bodies
@@ -1,5 +1,5 @@
1
- import { B as BoardSeo } from './seo-DFAwxGej.js';
2
- import './_spec-DIzdOWz7.js';
1
+ import { B as BoardSeo } from './seo-DFPj-7Rl.js';
2
+ import './_spec-DZV8ME1P.js';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/seo-files` — platform-owned crawler/identity file bodies
package/dist/seo.d.mts CHANGED
@@ -1,9 +1,9 @@
1
- import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-DgbGOmzW.mjs';
2
- import { e as JsonLdObject } from './breadcrumbs-zYG4xzpC.mjs';
3
- export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-zYG4xzpC.mjs';
4
- import './_spec-DIzdOWz7.mjs';
5
- import './board-D3ByAGAb.mjs';
6
- import './jobs-nA2K33Nu.mjs';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-BfVuJQvO.mjs';
2
+ import { e as JsonLdObject } from './breadcrumbs-BOM71gXT.mjs';
3
+ export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-BOM71gXT.mjs';
4
+ import './_spec-DZV8ME1P.mjs';
5
+ import './board-gmV8MoLW.mjs';
6
+ import './jobs-DfMyFAYs.mjs';
7
7
 
8
8
  /**
9
9
  * Blog structured data on the `@cavuno/board` wire types, transcribed from
package/dist/seo.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-CyvB9C6W.js';
2
- import { e as JsonLdObject } from './breadcrumbs-aCKRBNWX.js';
3
- export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-aCKRBNWX.js';
4
- import './_spec-DIzdOWz7.js';
5
- import './board-leXc6_BM.js';
6
- import './jobs-DodvFXH2.js';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-CLVfmknV.js';
2
+ import { e as JsonLdObject } from './breadcrumbs-dTn6GsKo.js';
3
+ export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-dTn6GsKo.js';
4
+ import './_spec-DZV8ME1P.js';
5
+ import './board-Cl6cfS-a.js';
6
+ import './jobs-Di0L5sM1.js';
7
7
 
8
8
  /**
9
9
  * Blog structured data on the `@cavuno/board` wire types, transcribed from
package/dist/server.d.mts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-DIzdOWz7.mjs';
3
- import './search-8kX6OW03.mjs';
4
- import './jobs-nA2K33Nu.mjs';
5
- import './board-D3ByAGAb.mjs';
6
- import './seo-Bn5gQY8t.mjs';
7
- import './blog-DgbGOmzW.mjs';
2
+ import './_spec-DZV8ME1P.mjs';
3
+ import './search-1pxkvj_I.mjs';
4
+ import './jobs-DfMyFAYs.mjs';
5
+ import './board-gmV8MoLW.mjs';
6
+ import './seo-CJtLrGD_.mjs';
7
+ import './blog-BfVuJQvO.mjs';
8
8
 
9
9
  /**
10
10
  * Session cookie codec — pure (no framework imports, no node imports) so it
package/dist/server.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-DIzdOWz7.js';
3
- import './search-C1XNGSm6.js';
4
- import './jobs-DodvFXH2.js';
5
- import './board-leXc6_BM.js';
6
- import './seo-DFAwxGej.js';
7
- import './blog-CyvB9C6W.js';
2
+ import './_spec-DZV8ME1P.js';
3
+ import './search-BPnMYVa7.js';
4
+ import './jobs-Di0L5sM1.js';
5
+ import './board-Cl6cfS-a.js';
6
+ import './seo-DFPj-7Rl.js';
7
+ import './blog-CLVfmknV.js';
8
8
 
9
9
  /**
10
10
  * Session cookie codec — pure (no framework imports, no node imports) so it
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-DIzdOWz7.mjs';
3
- import './search-8kX6OW03.mjs';
4
- import './jobs-nA2K33Nu.mjs';
5
- import './board-D3ByAGAb.mjs';
6
- import './seo-Bn5gQY8t.mjs';
7
- import './blog-DgbGOmzW.mjs';
2
+ import './_spec-DZV8ME1P.mjs';
3
+ import './search-1pxkvj_I.mjs';
4
+ import './jobs-DfMyFAYs.mjs';
5
+ import './board-gmV8MoLW.mjs';
6
+ import './seo-CJtLrGD_.mjs';
7
+ import './blog-BfVuJQvO.mjs';
8
8
 
9
9
  /**
10
10
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board