@cavuno/board 4.31.0 → 4.32.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 (44) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/{_spec-BD5My4zL.d.mts → _spec-BdqHycDm.d.mts} +14 -0
  3. package/dist/{_spec-BD5My4zL.d.ts → _spec-BdqHycDm.d.ts} +14 -0
  4. package/dist/bin.mjs +31 -8
  5. package/dist/{blog-Dh-Ru5QZ.d.mts → blog-CE0g5csE.d.mts} +1 -1
  6. package/dist/{blog-CcLmN5Tw.d.ts → blog-D85cD8W0.d.ts} +1 -1
  7. package/dist/{board-CF66EdYi.d.ts → board-CEsr8xMh.d.ts} +2 -2
  8. package/dist/{board-BRWS1m6D.d.mts → board-CdG7z-Vq.d.mts} +2 -2
  9. package/dist/{breadcrumbs-AEupw3fi.d.mts → breadcrumbs-B3n9k95M.d.mts} +2 -2
  10. package/dist/{breadcrumbs-Bu1lN6qA.d.ts → breadcrumbs-DmVbf4_6.d.ts} +2 -2
  11. package/dist/browser/cavuno-board.global.min.js +1 -1
  12. package/dist/doctor.js +31 -8
  13. package/dist/doctor.mjs +31 -8
  14. package/dist/filters.d.mts +2 -2
  15. package/dist/filters.d.ts +2 -2
  16. package/dist/format.d.mts +4 -4
  17. package/dist/format.d.ts +4 -4
  18. package/dist/index.d.mts +12 -11
  19. package/dist/index.d.ts +12 -11
  20. package/dist/index.js +6 -2
  21. package/dist/index.mjs +6 -2
  22. package/dist/{jobs-BPTMfkal.d.mts → jobs-COOBWXWV.d.mts} +1 -1
  23. package/dist/{jobs-BbtjrUo2.d.ts → jobs-DbZuagy-.d.ts} +1 -1
  24. package/dist/{search-CqPIHkv8.d.ts → search-BV2B73ty.d.ts} +1 -1
  25. package/dist/{search-CIjAdPR-.d.mts → search-BapnDodc.d.mts} +1 -1
  26. package/dist/{seo-C-NQ0T9w.d.ts → seo-BcC8Tv0d.d.ts} +1 -1
  27. package/dist/{seo-BypmVm97.d.mts → seo-C_yEotTb.d.mts} +1 -1
  28. package/dist/seo-files.d.mts +2 -2
  29. package/dist/seo-files.d.ts +2 -2
  30. package/dist/seo.d.mts +6 -6
  31. package/dist/seo.d.ts +6 -6
  32. package/dist/server.d.mts +27 -22
  33. package/dist/server.d.ts +27 -22
  34. package/dist/server.js +8 -13
  35. package/dist/server.mjs +8 -13
  36. package/dist/sitemap.d.mts +6 -6
  37. package/dist/sitemap.d.ts +6 -6
  38. package/dist/suggest.d.mts +2 -2
  39. package/dist/suggest.d.ts +2 -2
  40. package/package.json +1 -1
  41. package/skills/cavuno-board-auth/SKILL.md +1 -1
  42. package/skills/cavuno-board-server-sessions/SKILL.md +5 -5
  43. package/skills/cavuno-board-setup/SKILL.md +1 -1
  44. package/skills/manifest.json +2 -2
package/dist/index.d.mts CHANGED
@@ -1,13 +1,13 @@
1
- import { S as Schemas, c as components } from './_spec-BD5My4zL.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-CIjAdPR-.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-CIjAdPR-.mjs';
4
- import { c as CompaniesListQuery, d as CompanyListEnvelope, e as CompaniesSearchBody, f as CompanyJobsListQuery, g as CompanySimilarQuery, h as CompanyMarketsListQuery, i as SalaryDetailQuery } from './board-BRWS1m6D.mjs';
5
- export { B as BoardFormBuiltinField, j as BoardFormField, k as BoardFormLayout, l as BoardFormLockReason, m as BoardJobFormField, n as BoardProfileFormField, o as BoardRoleSignIn, p as BoardSignInSsoConnection, a as CompanyCategorySalary, q as CompanyMarket, r as CompanyMarketRef, b as CompanySalary, s as CompanySalarySummary, C as CustomFieldDefinition, t as CustomFieldOption, u as CustomFieldType, L as LocationSalaryDetail, v as LocationSkillsIndex, w as LocationTitlesIndex, P as PublicBoard, x as PublicBoardAds, y as PublicBoardAnalytics, z as PublicBoardFeatures, A as PublicBoardJobForm, D as PublicBoardSignIn, E as PublicCompany, F as PublicCompanyDetail, G as PublicCompanyMembership, H as SalaryCompany, I as SalaryLocation, J as SalarySkill, K as SalaryTitle, M as SkillLocationSalary, N as SkillLocationsIndex, S as SkillSalaryDetail, O as TitleLocationSalary, Q as TitleLocationsIndex, T as TitleSalaryDetail } from './board-BRWS1m6D.mjs';
6
- export { B as BoardSeo } from './seo-BypmVm97.mjs';
7
- import { R as RemoteOption, E as EmploymentType, S as Seniority, a as CustomFieldFilter, O as ObjectReferenceFilter, L as ListEnvelope, b as JobCollectionChoiceQuery, c as JobsListQuery, d as JobCardListEnvelope, e as JobsSearchBody, f as JobCardSearchEnvelope, g as JobsSimilarQuery, h as SearchEnvelope } from './jobs-BPTMfkal.mjs';
8
- export { i as CustomFieldValue, C as CustomFieldValues, j as CustomFilterValue, k as EducationRequirement, l as JobCatalogPagination, m as JobCollectionChoiceList, n as JobCollectionFieldDefinition, o as JobCompany, J as JobSort, p as OfficeLocation, q as OffsetPagination, P as PublicJob, r as PublicJobCard, s as RelatedSearch, t as RemotePermit, u as RemoteTimezone, v as ResolvedJobCollectionField, w as StorefrontPagination } from './jobs-BPTMfkal.mjs';
9
- import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-Dh-Ru5QZ.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-Dh-Ru5QZ.mjs';
1
+ import { S as Schemas, c as components } from './_spec-BdqHycDm.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-BapnDodc.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-BapnDodc.mjs';
4
+ import { c as CompaniesListQuery, d as CompanyListEnvelope, e as CompaniesSearchBody, f as CompanyJobsListQuery, g as CompanySimilarQuery, h as CompanyMarketsListQuery, i as SalaryDetailQuery } from './board-CdG7z-Vq.mjs';
5
+ export { B as BoardFormBuiltinField, j as BoardFormField, k as BoardFormLayout, l as BoardFormLockReason, m as BoardJobFormField, n as BoardProfileFormField, o as BoardRoleSignIn, p as BoardSignInSsoConnection, a as CompanyCategorySalary, q as CompanyMarket, r as CompanyMarketRef, b as CompanySalary, s as CompanySalarySummary, C as CustomFieldDefinition, t as CustomFieldOption, u as CustomFieldType, L as LocationSalaryDetail, v as LocationSkillsIndex, w as LocationTitlesIndex, P as PublicBoard, x as PublicBoardAds, y as PublicBoardAnalytics, z as PublicBoardFeatures, A as PublicBoardJobForm, D as PublicBoardSignIn, E as PublicCompany, F as PublicCompanyDetail, G as PublicCompanyMembership, H as SalaryCompany, I as SalaryLocation, J as SalarySkill, K as SalaryTitle, M as SkillLocationSalary, N as SkillLocationsIndex, S as SkillSalaryDetail, O as TitleLocationSalary, Q as TitleLocationsIndex, T as TitleSalaryDetail } from './board-CdG7z-Vq.mjs';
6
+ export { B as BoardSeo } from './seo-C_yEotTb.mjs';
7
+ import { R as RemoteOption, E as EmploymentType, S as Seniority, a as CustomFieldFilter, O as ObjectReferenceFilter, L as ListEnvelope, b as JobCollectionChoiceQuery, c as JobsListQuery, d as JobCardListEnvelope, e as JobsSearchBody, f as JobCardSearchEnvelope, g as JobsSimilarQuery, h as SearchEnvelope } from './jobs-COOBWXWV.mjs';
8
+ export { i as CustomFieldValue, C as CustomFieldValues, j as CustomFilterValue, k as EducationRequirement, l as JobCatalogPagination, m as JobCollectionChoiceList, n as JobCollectionFieldDefinition, o as JobCompany, J as JobSort, p as OfficeLocation, q as OffsetPagination, P as PublicJob, r as PublicJobCard, s as RelatedSearch, t as RemotePermit, u as RemoteTimezone, v as ResolvedJobCollectionField, w as StorefrontPagination } from './jobs-COOBWXWV.mjs';
9
+ import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-CE0g5csE.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-CE0g5csE.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.31.0";
205
+ declare const SDK_VERSION = "4.32.0";
206
206
 
207
207
  type SavedJob = Schemas['SavedJob'];
208
208
  type SavedJobsListQuery = {
@@ -1230,6 +1230,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1230
1230
  impressum: boolean;
1231
1231
  nativeApplications: boolean;
1232
1232
  messaging: boolean;
1233
+ contactPage: boolean;
1233
1234
  };
1234
1235
  talentAccessModel: "paid_messaging" | "paid_unlocks_and_messaging" | null;
1235
1236
  posting: {
package/dist/index.d.ts CHANGED
@@ -1,13 +1,13 @@
1
- import { S as Schemas, c as components } from './_spec-BD5My4zL.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-CqPIHkv8.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-CqPIHkv8.js';
4
- import { c as CompaniesListQuery, d as CompanyListEnvelope, e as CompaniesSearchBody, f as CompanyJobsListQuery, g as CompanySimilarQuery, h as CompanyMarketsListQuery, i as SalaryDetailQuery } from './board-CF66EdYi.js';
5
- export { B as BoardFormBuiltinField, j as BoardFormField, k as BoardFormLayout, l as BoardFormLockReason, m as BoardJobFormField, n as BoardProfileFormField, o as BoardRoleSignIn, p as BoardSignInSsoConnection, a as CompanyCategorySalary, q as CompanyMarket, r as CompanyMarketRef, b as CompanySalary, s as CompanySalarySummary, C as CustomFieldDefinition, t as CustomFieldOption, u as CustomFieldType, L as LocationSalaryDetail, v as LocationSkillsIndex, w as LocationTitlesIndex, P as PublicBoard, x as PublicBoardAds, y as PublicBoardAnalytics, z as PublicBoardFeatures, A as PublicBoardJobForm, D as PublicBoardSignIn, E as PublicCompany, F as PublicCompanyDetail, G as PublicCompanyMembership, H as SalaryCompany, I as SalaryLocation, J as SalarySkill, K as SalaryTitle, M as SkillLocationSalary, N as SkillLocationsIndex, S as SkillSalaryDetail, O as TitleLocationSalary, Q as TitleLocationsIndex, T as TitleSalaryDetail } from './board-CF66EdYi.js';
6
- export { B as BoardSeo } from './seo-C-NQ0T9w.js';
7
- import { R as RemoteOption, E as EmploymentType, S as Seniority, a as CustomFieldFilter, O as ObjectReferenceFilter, L as ListEnvelope, b as JobCollectionChoiceQuery, c as JobsListQuery, d as JobCardListEnvelope, e as JobsSearchBody, f as JobCardSearchEnvelope, g as JobsSimilarQuery, h as SearchEnvelope } from './jobs-BbtjrUo2.js';
8
- export { i as CustomFieldValue, C as CustomFieldValues, j as CustomFilterValue, k as EducationRequirement, l as JobCatalogPagination, m as JobCollectionChoiceList, n as JobCollectionFieldDefinition, o as JobCompany, J as JobSort, p as OfficeLocation, q as OffsetPagination, P as PublicJob, r as PublicJobCard, s as RelatedSearch, t as RemotePermit, u as RemoteTimezone, v as ResolvedJobCollectionField, w as StorefrontPagination } from './jobs-BbtjrUo2.js';
9
- import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-CcLmN5Tw.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-CcLmN5Tw.js';
1
+ import { S as Schemas, c as components } from './_spec-BdqHycDm.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-BV2B73ty.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-BV2B73ty.js';
4
+ import { c as CompaniesListQuery, d as CompanyListEnvelope, e as CompaniesSearchBody, f as CompanyJobsListQuery, g as CompanySimilarQuery, h as CompanyMarketsListQuery, i as SalaryDetailQuery } from './board-CEsr8xMh.js';
5
+ export { B as BoardFormBuiltinField, j as BoardFormField, k as BoardFormLayout, l as BoardFormLockReason, m as BoardJobFormField, n as BoardProfileFormField, o as BoardRoleSignIn, p as BoardSignInSsoConnection, a as CompanyCategorySalary, q as CompanyMarket, r as CompanyMarketRef, b as CompanySalary, s as CompanySalarySummary, C as CustomFieldDefinition, t as CustomFieldOption, u as CustomFieldType, L as LocationSalaryDetail, v as LocationSkillsIndex, w as LocationTitlesIndex, P as PublicBoard, x as PublicBoardAds, y as PublicBoardAnalytics, z as PublicBoardFeatures, A as PublicBoardJobForm, D as PublicBoardSignIn, E as PublicCompany, F as PublicCompanyDetail, G as PublicCompanyMembership, H as SalaryCompany, I as SalaryLocation, J as SalarySkill, K as SalaryTitle, M as SkillLocationSalary, N as SkillLocationsIndex, S as SkillSalaryDetail, O as TitleLocationSalary, Q as TitleLocationsIndex, T as TitleSalaryDetail } from './board-CEsr8xMh.js';
6
+ export { B as BoardSeo } from './seo-BcC8Tv0d.js';
7
+ import { R as RemoteOption, E as EmploymentType, S as Seniority, a as CustomFieldFilter, O as ObjectReferenceFilter, L as ListEnvelope, b as JobCollectionChoiceQuery, c as JobsListQuery, d as JobCardListEnvelope, e as JobsSearchBody, f as JobCardSearchEnvelope, g as JobsSimilarQuery, h as SearchEnvelope } from './jobs-DbZuagy-.js';
8
+ export { i as CustomFieldValue, C as CustomFieldValues, j as CustomFilterValue, k as EducationRequirement, l as JobCatalogPagination, m as JobCollectionChoiceList, n as JobCollectionFieldDefinition, o as JobCompany, J as JobSort, p as OfficeLocation, q as OffsetPagination, P as PublicJob, r as PublicJobCard, s as RelatedSearch, t as RemotePermit, u as RemoteTimezone, v as ResolvedJobCollectionField, w as StorefrontPagination } from './jobs-DbZuagy-.js';
9
+ import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-D85cD8W0.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-D85cD8W0.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.31.0";
205
+ declare const SDK_VERSION = "4.32.0";
206
206
 
207
207
  type SavedJob = Schemas['SavedJob'];
208
208
  type SavedJobsListQuery = {
@@ -1230,6 +1230,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1230
1230
  impressum: boolean;
1231
1231
  nativeApplications: boolean;
1232
1232
  messaging: boolean;
1233
+ contactPage: boolean;
1233
1234
  };
1234
1235
  talentAccessModel: "paid_messaging" | "paid_unlocks_and_messaging" | null;
1235
1236
  posting: {
package/dist/index.js CHANGED
@@ -403,7 +403,7 @@ async function clearSession(storage) {
403
403
  }
404
404
 
405
405
  // src/version.ts
406
- var SDK_VERSION = "4.31.0";
406
+ var SDK_VERSION = "4.32.0";
407
407
 
408
408
  // src/client.ts
409
409
  function isRawBody(body) {
@@ -674,6 +674,7 @@ function authNamespace(client, board = "") {
674
674
  * email: 'a@b.com',
675
675
  * password: 'hunter22',
676
676
  * displayName: 'Ada',
677
+ * returnTo: '/jobs/123', // carried by the verification link
677
678
  * });
678
679
  */
679
680
  async register(body, options) {
@@ -788,10 +789,13 @@ function authNamespace(client, board = "") {
788
789
  },
789
790
  /**
790
791
  * Re-send the verification email (fresh code + magic link) to the signed-in
791
- * board user. Resolves void (204); no-op if already verified.
792
+ * board user. Resolves void (204); no-op if already verified. Send
793
+ * `body: { returnTo }` to keep a same-origin return path on the new link,
794
+ * as `register({ returnTo })` does.
792
795
  *
793
796
  * @example
794
797
  * await board.auth.resendVerification();
798
+ * await board.auth.resendVerification({ body: { returnTo: '/jobs/123' } });
795
799
  */
796
800
  resendVerification(options) {
797
801
  return client.fetch("/auth/verify-email/resend", {
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.31.0";
49
+ var SDK_VERSION = "4.32.0";
50
50
 
51
51
  // src/client.ts
52
52
  function isRawBody(body) {
@@ -317,6 +317,7 @@ function authNamespace(client, board = "") {
317
317
  * email: 'a@b.com',
318
318
  * password: 'hunter22',
319
319
  * displayName: 'Ada',
320
+ * returnTo: '/jobs/123', // carried by the verification link
320
321
  * });
321
322
  */
322
323
  async register(body, options) {
@@ -431,10 +432,13 @@ function authNamespace(client, board = "") {
431
432
  },
432
433
  /**
433
434
  * Re-send the verification email (fresh code + magic link) to the signed-in
434
- * board user. Resolves void (204); no-op if already verified.
435
+ * board user. Resolves void (204); no-op if already verified. Send
436
+ * `body: { returnTo }` to keep a same-origin return path on the new link,
437
+ * as `register({ returnTo })` does.
435
438
  *
436
439
  * @example
437
440
  * await board.auth.resendVerification();
441
+ * await board.auth.resendVerification({ body: { returnTo: '/jobs/123' } });
438
442
  */
439
443
  resendVerification(options) {
440
444
  return client.fetch("/auth/verify-email/resend", {
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-BD5My4zL.mjs';
1
+ import { S as Schemas } from './_spec-BdqHycDm.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-BD5My4zL.js';
1
+ import { S as Schemas } from './_spec-BdqHycDm.js';
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-BD5My4zL.js';
1
+ import { S as Schemas } from './_spec-BdqHycDm.js';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-BD5My4zL.mjs';
1
+ import { S as Schemas } from './_spec-BdqHycDm.mjs';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-BD5My4zL.js';
1
+ import { S as Schemas } from './_spec-BdqHycDm.js';
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-BD5My4zL.mjs';
1
+ import { S as Schemas } from './_spec-BdqHycDm.mjs';
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-BypmVm97.mjs';
2
- import './_spec-BD5My4zL.mjs';
1
+ import { B as BoardSeo } from './seo-C_yEotTb.mjs';
2
+ import './_spec-BdqHycDm.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-C-NQ0T9w.js';
2
- import './_spec-BD5My4zL.js';
1
+ import { B as BoardSeo } from './seo-BcC8Tv0d.js';
2
+ import './_spec-BdqHycDm.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-Dh-Ru5QZ.mjs';
2
- import { e as JsonLdObject } from './breadcrumbs-AEupw3fi.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-AEupw3fi.mjs';
4
- import './_spec-BD5My4zL.mjs';
5
- import './board-BRWS1m6D.mjs';
6
- import './jobs-BPTMfkal.mjs';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-CE0g5csE.mjs';
2
+ import { e as JsonLdObject } from './breadcrumbs-B3n9k95M.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-B3n9k95M.mjs';
4
+ import './_spec-BdqHycDm.mjs';
5
+ import './board-CdG7z-Vq.mjs';
6
+ import './jobs-COOBWXWV.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-CcLmN5Tw.js';
2
- import { e as JsonLdObject } from './breadcrumbs-Bu1lN6qA.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-Bu1lN6qA.js';
4
- import './_spec-BD5My4zL.js';
5
- import './board-CF66EdYi.js';
6
- import './jobs-BbtjrUo2.js';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-D85cD8W0.js';
2
+ import { e as JsonLdObject } from './breadcrumbs-DmVbf4_6.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-DmVbf4_6.js';
4
+ import './_spec-BdqHycDm.js';
5
+ import './board-CEsr8xMh.js';
6
+ import './jobs-DbZuagy-.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-BD5My4zL.mjs';
3
- import './search-CIjAdPR-.mjs';
4
- import './board-BRWS1m6D.mjs';
5
- import './jobs-BPTMfkal.mjs';
6
- import './seo-BypmVm97.mjs';
7
- import './blog-Dh-Ru5QZ.mjs';
2
+ import './_spec-BdqHycDm.mjs';
3
+ import './search-BapnDodc.mjs';
4
+ import './board-CdG7z-Vq.mjs';
5
+ import './jobs-COOBWXWV.mjs';
6
+ import './seo-C_yEotTb.mjs';
7
+ import './blog-CE0g5csE.mjs';
8
8
 
9
9
  /**
10
10
  * Session cookie codec — pure (no framework imports, no node imports) so it
@@ -111,26 +111,31 @@ declare function getCavunoAppCanonicalRedirectUrl(params: {
111
111
  }): string | null;
112
112
 
113
113
  /**
114
- * Single-flight session refresh — dedupes concurrent refreshes for the same
115
- * session WITHIN one process/isolate (the rotation race, ,
116
- * mitigated at the one layer a client library can reach).
114
+ * Session refresh for server-rendered apps. Each call rotates the given
115
+ * session's refresh token with `board.auth.refresh` and maps the result to a
116
+ * `BoardSession`.
117
117
  *
118
- * Refresh tokens are single-use: two concurrent refreshes for the same
119
- * session burn the pair — the loser 401s and the user is signed out
120
- * mid-session. This helper keys an in-flight slot per refreshToken so every
121
- * concurrent caller awaits the SAME rotation; sequential calls after settle
122
- * start a fresh one.
118
+ * No state is held across calls. The refresher is usually module-scoped and
119
+ * shared by every request, so a promise kept between calls would be shared
120
+ * across requests too. On edge runtimes such as Cloudflare Workers, I/O
121
+ * belongs to the request that started it: when that request is cancelled
122
+ * (for example the client disconnects), its fetch is cancelled and a promise
123
+ * waiting on it never settles. Any later request awaiting that shared promise
124
+ * would hang. Each call therefore performs its own refresh.
123
125
  *
124
- * Scope honestly stated: the dedupe is PER PROCESS/ISOLATE (an in-memory
125
- * map). Two simultaneous requests served by different instances can still
126
- * race the token; the proactive `isExpiringSoon` window keeps that rare, it
127
- * does not eliminate it. Pair with `storage: 'nostore'` on the shared
128
- * server client — `auth.refresh` persists the rotated pair into
129
- * `client.storage`, and any persistent shared storage would bleed one
130
- * user's tokens into another's requests.
126
+ * Concurrent refreshes of the same session are safe without client-side
127
+ * coordination: the refresh endpoint returns the same successor refresh token
128
+ * for a token re-presented within a short grace window, so parallel calls
129
+ * (in one process or across instances) converge on one refresh token. Their
130
+ * access tokens may differ; each is valid.
131
+ *
132
+ * Pair with `storage: 'nostore'` on the shared server client.
133
+ * `auth.refresh` persists the rotated pair into `client.storage`, and any
134
+ * persistent shared storage would bleed one user's tokens into another's
135
+ * requests.
131
136
  *
132
137
  * Returns the rotated `BoardSession` (persist it back to the cookie), or
133
- * `null` on a 401 — the token is burned or revoked: clear the cookie and
138
+ * `null` on a 401: the token is expired or revoked, so clear the cookie and
134
139
  * continue signed out, never retry. Other errors (network, 5xx, 429)
135
140
  * rethrow untouched.
136
141
  *
package/dist/server.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-BD5My4zL.js';
3
- import './search-CqPIHkv8.js';
4
- import './board-CF66EdYi.js';
5
- import './jobs-BbtjrUo2.js';
6
- import './seo-C-NQ0T9w.js';
7
- import './blog-CcLmN5Tw.js';
2
+ import './_spec-BdqHycDm.js';
3
+ import './search-BV2B73ty.js';
4
+ import './board-CEsr8xMh.js';
5
+ import './jobs-DbZuagy-.js';
6
+ import './seo-BcC8Tv0d.js';
7
+ import './blog-D85cD8W0.js';
8
8
 
9
9
  /**
10
10
  * Session cookie codec — pure (no framework imports, no node imports) so it
@@ -111,26 +111,31 @@ declare function getCavunoAppCanonicalRedirectUrl(params: {
111
111
  }): string | null;
112
112
 
113
113
  /**
114
- * Single-flight session refresh — dedupes concurrent refreshes for the same
115
- * session WITHIN one process/isolate (the rotation race, ,
116
- * mitigated at the one layer a client library can reach).
114
+ * Session refresh for server-rendered apps. Each call rotates the given
115
+ * session's refresh token with `board.auth.refresh` and maps the result to a
116
+ * `BoardSession`.
117
117
  *
118
- * Refresh tokens are single-use: two concurrent refreshes for the same
119
- * session burn the pair — the loser 401s and the user is signed out
120
- * mid-session. This helper keys an in-flight slot per refreshToken so every
121
- * concurrent caller awaits the SAME rotation; sequential calls after settle
122
- * start a fresh one.
118
+ * No state is held across calls. The refresher is usually module-scoped and
119
+ * shared by every request, so a promise kept between calls would be shared
120
+ * across requests too. On edge runtimes such as Cloudflare Workers, I/O
121
+ * belongs to the request that started it: when that request is cancelled
122
+ * (for example the client disconnects), its fetch is cancelled and a promise
123
+ * waiting on it never settles. Any later request awaiting that shared promise
124
+ * would hang. Each call therefore performs its own refresh.
123
125
  *
124
- * Scope honestly stated: the dedupe is PER PROCESS/ISOLATE (an in-memory
125
- * map). Two simultaneous requests served by different instances can still
126
- * race the token; the proactive `isExpiringSoon` window keeps that rare, it
127
- * does not eliminate it. Pair with `storage: 'nostore'` on the shared
128
- * server client — `auth.refresh` persists the rotated pair into
129
- * `client.storage`, and any persistent shared storage would bleed one
130
- * user's tokens into another's requests.
126
+ * Concurrent refreshes of the same session are safe without client-side
127
+ * coordination: the refresh endpoint returns the same successor refresh token
128
+ * for a token re-presented within a short grace window, so parallel calls
129
+ * (in one process or across instances) converge on one refresh token. Their
130
+ * access tokens may differ; each is valid.
131
+ *
132
+ * Pair with `storage: 'nostore'` on the shared server client.
133
+ * `auth.refresh` persists the rotated pair into `client.storage`, and any
134
+ * persistent shared storage would bleed one user's tokens into another's
135
+ * requests.
131
136
  *
132
137
  * Returns the rotated `BoardSession` (persist it back to the cookie), or
133
- * `null` on a 401 — the token is burned or revoked: clear the cookie and
138
+ * `null` on a 401: the token is expired or revoked, so clear the cookie and
134
139
  * continue signed out, never retry. Other errors (network, 5xx, 429)
135
140
  * rethrow untouched.
136
141
  *
package/dist/server.js CHANGED
@@ -224,24 +224,19 @@ function createSessionRefresher(board) {
224
224
  "createSessionRefresher requires the server client to use storage: 'nostore' \u2014 a shared persistent store would leak rotated tokens across requests. Keep the session in the httpOnly cookie and pass tokens per call."
225
225
  );
226
226
  }
227
- const inflight = /* @__PURE__ */ new Map();
228
227
  return async function refresh(session) {
229
- const key = session.refreshToken;
230
- const existing = inflight.get(key);
231
- if (existing) return existing;
232
- const attempt = board.auth.refresh({ refreshToken: key }).then(
233
- (rotated) => ({
228
+ try {
229
+ const rotated = await board.auth.refresh({
230
+ refreshToken: session.refreshToken
231
+ });
232
+ return {
234
233
  accessToken: rotated.accessToken,
235
234
  refreshToken: rotated.refreshToken,
236
235
  expiresAt: rotated.expiresAt
237
- })
238
- ).catch((error) => {
236
+ };
237
+ } catch (error) {
239
238
  if (isUnauthorized(error)) return null;
240
239
  throw error;
241
- }).finally(() => {
242
- inflight.delete(key);
243
- });
244
- inflight.set(key, attempt);
245
- return attempt;
240
+ }
246
241
  };
247
242
  }
package/dist/server.mjs CHANGED
@@ -159,25 +159,20 @@ function createSessionRefresher(board) {
159
159
  "createSessionRefresher requires the server client to use storage: 'nostore' \u2014 a shared persistent store would leak rotated tokens across requests. Keep the session in the httpOnly cookie and pass tokens per call."
160
160
  );
161
161
  }
162
- const inflight = /* @__PURE__ */ new Map();
163
162
  return async function refresh(session) {
164
- const key = session.refreshToken;
165
- const existing = inflight.get(key);
166
- if (existing) return existing;
167
- const attempt = board.auth.refresh({ refreshToken: key }).then(
168
- (rotated) => ({
163
+ try {
164
+ const rotated = await board.auth.refresh({
165
+ refreshToken: session.refreshToken
166
+ });
167
+ return {
169
168
  accessToken: rotated.accessToken,
170
169
  refreshToken: rotated.refreshToken,
171
170
  expiresAt: rotated.expiresAt
172
- })
173
- ).catch((error) => {
171
+ };
172
+ } catch (error) {
174
173
  if (isUnauthorized(error)) return null;
175
174
  throw error;
176
- }).finally(() => {
177
- inflight.delete(key);
178
- });
179
- inflight.set(key, attempt);
180
- return attempt;
175
+ }
181
176
  };
182
177
  }
183
178
  export {
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-BD5My4zL.mjs';
3
- import './search-CIjAdPR-.mjs';
4
- import './board-BRWS1m6D.mjs';
5
- import './jobs-BPTMfkal.mjs';
6
- import './seo-BypmVm97.mjs';
7
- import './blog-Dh-Ru5QZ.mjs';
2
+ import './_spec-BdqHycDm.mjs';
3
+ import './search-BapnDodc.mjs';
4
+ import './board-CdG7z-Vq.mjs';
5
+ import './jobs-COOBWXWV.mjs';
6
+ import './seo-C_yEotTb.mjs';
7
+ import './blog-CE0g5csE.mjs';
8
8
 
9
9
  /**
10
10
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
package/dist/sitemap.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-BD5My4zL.js';
3
- import './search-CqPIHkv8.js';
4
- import './board-CF66EdYi.js';
5
- import './jobs-BbtjrUo2.js';
6
- import './seo-C-NQ0T9w.js';
7
- import './blog-CcLmN5Tw.js';
2
+ import './_spec-BdqHycDm.js';
3
+ import './search-BV2B73ty.js';
4
+ import './board-CEsr8xMh.js';
5
+ import './jobs-DbZuagy-.js';
6
+ import './seo-BcC8Tv0d.js';
7
+ import './blog-D85cD8W0.js';
8
8
 
9
9
  /**
10
10
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
@@ -1,5 +1,5 @@
1
- import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-CIjAdPR-.mjs';
2
- import './_spec-BD5My4zL.mjs';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-BapnDodc.mjs';
2
+ import './_spec-BdqHycDm.mjs';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/suggest` — framework-agnostic headless search-suggest
package/dist/suggest.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-CqPIHkv8.js';
2
- import './_spec-BD5My4zL.js';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-BV2B73ty.js';
2
+ import './_spec-BdqHycDm.js';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/suggest` — framework-agnostic headless search-suggest
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cavuno/board",
3
- "version": "4.31.0",
3
+ "version": "4.32.0",
4
4
  "description": "Build custom job boards and careers pages with Cavuno’s TypeScript SDK.",
5
5
  "keywords": [
6
6
  "api-client",
@@ -58,7 +58,7 @@ try {
58
58
  }
59
59
  ```
60
60
 
61
- On SSR, use the module-scoped `createSessionRefresher` pattern in `cavuno-board-server-sessions`; it is the single source of truth for concurrency, cookies, retry limits, and per-call authorization headers.
61
+ On SSR, use the module-scoped `createSessionRefresher` pattern in `cavuno-board-server-sessions`; it is the single source of truth for cookies, retry limits, and per-call authorization headers.
62
62
 
63
63
  **Complete when:** concurrent expiry paths share one rotation and the original operation is attempted at most once after a successful refresh.
64
64
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: cavuno-board-server-sessions
3
- description: Wire Cavuno server sessions and board-password access. Use when a server-rendered app needs httpOnly cookies, per-request bearer headers, single-flight refresh, grant cookies, or safe redirect-back handling.
3
+ description: Wire Cavuno server sessions and board-password access. Use when a server-rendered app needs httpOnly cookies, per-request bearer headers, session refresh, grant cookies, or safe redirect-back handling.
4
4
  ---
5
5
 
6
6
  # Wire server sessions
@@ -11,7 +11,7 @@ The server contract has three invariants:
11
11
 
12
12
  1. One module-scoped board client uses server-default `nostore`.
13
13
  2. Each request reads an app-owned httpOnly cookie and passes credentials in that call's headers.
14
- 3. One module-scoped `createSessionRefresher(board)` coordinates refreshes within the process or isolate.
14
+ 3. One module-scoped `createSessionRefresher(board)` refreshes expiring sessions. It holds no state between requests.
15
15
 
16
16
  ## 1. Persist the board-user session
17
17
 
@@ -41,7 +41,7 @@ const clearedCookie = clearSessionCookie();
41
41
 
42
42
  ## 2. Resolve one fresh session per request
43
43
 
44
- Refresh tokens rotate once. Create the refresher beside the shared client so concurrent requests using the same refresh token await one rotation. `isExpiringSoon` selects sessions within the proactive five-minute window.
44
+ Refresh tokens rotate on use. Create the refresher beside the shared client. Each call performs its own refresh; concurrent requests presenting the same refresh token within a short grace window receive the same successor refresh token, so they converge without client-side coordination. `isExpiringSoon` selects sessions within the proactive five-minute window.
45
45
 
46
46
  ```ts snippet
47
47
  import {
@@ -68,9 +68,9 @@ async function resolveSession(cookieHeader: string | null) {
68
68
  }
69
69
  ```
70
70
 
71
- A rotated session is written back before the response completes. A `null` result represents a 401 from a burned or revoked token: clear the cookie and continue signed out. Network, 5xx, and 429 failures rethrow to the app's error boundary. The helper deduplicates within one process or isolate; separate deployment instances can still race.
71
+ A rotated session is written back before the response completes. A `null` result represents a 401 from a burned or revoked token: clear the cookie and continue signed out. Network, 5xx, and 429 failures rethrow to the app's error boundary. The helper keeps no in-flight promise between requests: on edge runtimes such as Cloudflare Workers, a promise started by a request that is later cancelled never settles, and sharing it would hang every later request for that session.
72
72
 
73
- **Complete when:** two simultaneous resolutions for one expiring session invoke one rotation in the process, both observe the same result, success writes the rotated pair, and `null` produces one clear-cookie response with no refresh retry.
73
+ **Complete when:** two simultaneous resolutions for one expiring session both succeed with the same refresh token, success writes the rotated pair, and `null` produces one clear-cookie response with no refresh retry.
74
74
 
75
75
  ## 3. Authenticate each SDK call
76
76
 
@@ -48,7 +48,7 @@ Use `cavuno-board-format`, `cavuno-board-filters`, and `cavuno-board-search-sugg
48
48
 
49
49
  Use `cavuno-board-auth` for board-user registration, login, verification, recovery, and browser storage. In a server-rendered app, use `cavuno-board-server-sessions` as the authority for the httpOnly session cookie, per-call bearer header, and `createSessionRefresher`. Use `cavuno-board-errors` for typed failure branches and board-password grants.
50
50
 
51
- **Complete when:** an authenticated `board.me.retrieve()` succeeds, logout returns the app to a signed-out state, and concurrent server requests share the server skill's single-flight refresher.
51
+ **Complete when:** an authenticated `board.me.retrieve()` succeeds, logout returns the app to a signed-out state, and server requests refresh expiring sessions through the server skill's module-scoped refresher.
52
52
 
53
53
  ## 5. Add only the enabled surfaces
54
54
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.31.0",
2
+ "version": "4.32.0",
3
3
  "skills": [
4
4
  {
5
5
  "name": "cavuno-board-account",
@@ -136,7 +136,7 @@
136
136
  },
137
137
  {
138
138
  "name": "cavuno-board-server-sessions",
139
- "description": "Wire Cavuno server sessions and board-password access. Use when a server-rendered app needs httpOnly cookies, per-request bearer headers, single-flight refresh, grant cookies, or safe redirect-back handling.",
139
+ "description": "Wire Cavuno server sessions and board-password access. Use when a server-rendered app needs httpOnly cookies, per-request bearer headers, session refresh, grant cookies, or safe redirect-back handling.",
140
140
  "path": "skills/cavuno-board-server-sessions/SKILL.md",
141
141
  "framework": null,
142
142
  "category": "core"