@cavuno/board 4.19.0 → 4.21.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 (43) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/{_spec-DyTPJbIZ.d.mts → _spec-CyNKpM_j.d.mts} +68 -4
  3. package/dist/{_spec-DyTPJbIZ.d.ts → _spec-CyNKpM_j.d.ts} +68 -4
  4. package/dist/{blog-Cdw6_ocq.d.mts → blog-BNIqGayD.d.mts} +1 -1
  5. package/dist/{blog-vDgRPBAK.d.ts → blog-CRvaDyzJ.d.ts} +1 -1
  6. package/dist/{board-CLDHd9N_.d.mts → board-CXNxSlUB.d.ts} +16 -3
  7. package/dist/{board-DpDCNMJD.d.ts → board-mn3GVbrC.d.mts} +16 -3
  8. package/dist/{breadcrumbs-CKtVWTOB.d.mts → breadcrumbs-Bi4LHNAF.d.mts} +2 -2
  9. package/dist/{breadcrumbs-CYT3HxfO.d.ts → breadcrumbs-Crk6Q69T.d.ts} +2 -2
  10. package/dist/browser/cavuno-board.global.min.js +1 -1
  11. package/dist/{chunk-XNO4NOPW.mjs → chunk-RORHD4WQ.mjs} +2 -0
  12. package/dist/filters.d.mts +2 -2
  13. package/dist/filters.d.ts +2 -2
  14. package/dist/format.d.mts +4 -4
  15. package/dist/format.d.ts +4 -4
  16. package/dist/index.d.mts +33 -17
  17. package/dist/index.d.ts +33 -17
  18. package/dist/index.js +15 -6
  19. package/dist/index.mjs +14 -7
  20. package/dist/{jobs-Bnx1B6at.d.mts → jobs-CALE3I8I.d.mts} +1 -1
  21. package/dist/{jobs-Bwl7pKKg.d.ts → jobs-CSWXqLZR.d.ts} +1 -1
  22. package/dist/route-contract.d.mts +2 -1
  23. package/dist/route-contract.d.ts +2 -1
  24. package/dist/{search-CQZ-ibOl.d.ts → search-BRCbe1Nm.d.ts} +1 -1
  25. package/dist/{search-DlxLGmDk.d.mts → search-B_hwS-xu.d.mts} +1 -1
  26. package/dist/{seo-zYWVcaj1.d.mts → seo-CS4lrG20.d.mts} +1 -1
  27. package/dist/{seo-BfEBr4pW.d.ts → seo-D1u-RmLQ.d.ts} +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 +6 -6
  33. package/dist/server.d.ts +6 -6
  34. package/dist/server.mjs +1 -1
  35. package/dist/sitemap.d.mts +6 -6
  36. package/dist/sitemap.d.ts +6 -6
  37. package/dist/sitemap.mjs +1 -1
  38. package/dist/suggest.d.mts +2 -2
  39. package/dist/suggest.d.ts +2 -2
  40. package/dist/well-known.d.mts +2 -1
  41. package/dist/well-known.d.ts +2 -1
  42. package/package.json +2 -2
  43. package/skills/manifest.json +1 -1
package/dist/index.d.ts CHANGED
@@ -1,13 +1,13 @@
1
- import { S as Schemas, c as components } from './_spec-DyTPJbIZ.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-CQZ-ibOl.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-CQZ-ibOl.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-DpDCNMJD.js';
5
- export { a as CompanyCategorySalary, j as CompanyMarket, k as CompanyMarketRef, b as CompanySalary, l as CompanySalarySummary, C as CustomFieldDefinition, m as CustomFieldOption, n as CustomFieldType, L as LocationSalaryDetail, o as LocationSkillsIndex, p as LocationTitlesIndex, P as PublicBoard, q as PublicBoardAds, r as PublicBoardAnalytics, s as PublicBoardFeatures, t as PublicBoardJobForm, u as PublicCompany, v as PublicCompanyDetail, w as SalaryCompany, x as SalaryLocation, y as SalarySkill, z as SalaryTitle, A as SkillLocationSalary, B as SkillLocationsIndex, S as SkillSalaryDetail, D as TitleLocationSalary, E as TitleLocationsIndex, T as TitleSalaryDetail } from './board-DpDCNMJD.js';
6
- export { B as BoardSeo } from './seo-BfEBr4pW.js';
7
- import { R as RemoteOption, E as EmploymentType, S as Seniority, L as ListEnvelope, a as JobsListQuery, b as JobCardListEnvelope, c as JobsSearchBody, d as JobCardSearchEnvelope, e as JobsSimilarQuery, f as SearchEnvelope } from './jobs-Bwl7pKKg.js';
8
- export { g as CustomFieldValue, C as CustomFieldValues, h as EducationRequirement, i as JobCatalogPagination, j as JobCompany, J as JobSort, O as OfficeLocation, k as OffsetPagination, P as PublicJob, l as PublicJobCard, m as RelatedSearch, n as RemotePermit, o as RemoteTimezone, p as StorefrontPagination } from './jobs-Bwl7pKKg.js';
9
- import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-vDgRPBAK.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-vDgRPBAK.js';
1
+ import { S as Schemas, c as components } from './_spec-CyNKpM_j.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-BRCbe1Nm.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-BRCbe1Nm.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-CXNxSlUB.js';
5
+ export { a as CompanyCategorySalary, j as CompanyMarket, k as CompanyMarketRef, b as CompanySalary, l as CompanySalarySummary, C as CustomFieldDefinition, m as CustomFieldOption, n as CustomFieldType, L as LocationSalaryDetail, o as LocationSkillsIndex, p as LocationTitlesIndex, P as PublicBoard, q as PublicBoardAds, r as PublicBoardAnalytics, s as PublicBoardFeatures, t as PublicBoardJobForm, u as PublicCompany, v as PublicCompanyDetail, w as PublicCompanyMembership, x as SalaryCompany, y as SalaryLocation, z as SalarySkill, A as SalaryTitle, B as SkillLocationSalary, D as SkillLocationsIndex, S as SkillSalaryDetail, E as TitleLocationSalary, F as TitleLocationsIndex, T as TitleSalaryDetail } from './board-CXNxSlUB.js';
6
+ export { B as BoardSeo } from './seo-D1u-RmLQ.js';
7
+ import { R as RemoteOption, E as EmploymentType, S as Seniority, L as ListEnvelope, a as JobsListQuery, b as JobCardListEnvelope, c as JobsSearchBody, d as JobCardSearchEnvelope, e as JobsSimilarQuery, f as SearchEnvelope } from './jobs-CSWXqLZR.js';
8
+ export { g as CustomFieldValue, C as CustomFieldValues, h as EducationRequirement, i as JobCatalogPagination, j as JobCompany, J as JobSort, O as OfficeLocation, k as OffsetPagination, P as PublicJob, l as PublicJobCard, m as RelatedSearch, n as RemotePermit, o as RemoteTimezone, p as StorefrontPagination } from './jobs-CSWXqLZR.js';
9
+ import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-CRvaDyzJ.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-CRvaDyzJ.js';
11
11
 
12
12
  /**
13
13
  * Well-known `<domain>_<snake_reason>` codes the Board API sends, grouped by
@@ -20,7 +20,7 @@ export { B as BlogAuthorEmbed, d as BlogTagEmbed, e as PublicBlogAdjacentPosts,
20
20
  * `unknown_error` is SDK-synthesized when a response carries no parseable
21
21
  * envelope.
22
22
  */
23
- declare const BOARD_API_ERROR_CODES: readonly ["internal_error", "validation_bad_request", "validation_payload_too_large", "rate_limited", "rate_limit_unavailable", "search_unavailable", "too_many_filter_values", "pagination_invalid_cursor", "pagination_offset_too_large", "auth_unauthenticated", "auth_forbidden", "plan_upgrade_required", "unknown_error", "boards_not_found", "board_page_not_found", "board_auth_account_not_found", "board_auth_email_taken", "board_auth_invalid_credentials", "board_auth_invalid_token", "board_auth_registration_disabled", "board_auth_token_expired", "invalid_current_password", "no_password", "same_email", "email_taken", "invalid_token", "board_password_required", "board_password_invalid", "jobs_not_found", "jobs_invalid_filter", "categories_not_found", "skills_not_found", "places_not_found", "companies_not_found", "company_markets_not_found", "company_salary_not_found", "company_category_salary_not_found", "salaries_title_not_found", "salaries_skill_not_found", "salaries_location_not_found", "salaries_title_location_not_found", "salaries_skill_location_not_found", "blog_post_not_found", "blog_author_not_found", "blog_tag_not_found", "talent_not_found", "talent_directory_not_found", "talent_directory_restricted", "job_recommendations_not_found", "recommended_talent_not_found", "job_alert_not_found", "job_alerts_disabled", "candidate_alert_limit_reached", "candidate_alert_not_found", "candidate_entry_not_found", "candidate_handle_taken", "candidate_job_not_found", "candidate_notification_preference_paused", "resume_invalid_file", "resume_upload_forbidden", "applications_external_apply_only", "applications_country_not_allowed", "applications_guest_not_allowed", "applications_job_not_found", "applications_not_found", "applications_resume_invalid_file", "applications_unprocessable", "messaging_application_not_found", "messaging_application_not_linked", "messaging_blocked", "messaging_cannot_block_self", "messaging_cold_rule", "messaging_conversation_not_found", "messaging_disabled", "messaging_edit_window_expired", "messaging_message_deleted", "messaging_message_not_found", "messaging_not_author", "messaging_not_participant", "messaging_not_permitted", "messaging_not_recipient", "messaging_rate_limited", "messaging_recipient_not_found", "messaging_recipient_not_open", "messaging_unsend_window_expired", "employer_applicant_not_found", "employer_ats_unprocessable", "employer_checkout_failed", "employer_company_exists", "employer_company_name_taken", "employer_company_not_found", "employer_job_not_found", "employer_job_slug_taken", "employer_jobs_quota_exceeded", "employer_not_member", "employer_payment_required", "employer_pipeline_stage_not_found", "employer_member_not_found", "employer_invite_not_found", "not_company_admin", "not_company_member", "company_deletion_disabled", "last_admin", "already_member", "already_invited", "invalid_email", "invite_email_mismatch", "candidate_role", "job_not_published", "talent_list_not_found", "sourced_candidate_not_found", "sourced_convert_unavailable", "paywall_already_active", "paywall_disabled", "paywall_invalid_checkout_session", "paywall_no_candidate_profile", "paywall_no_recurring_subscription", "paywall_offer_not_found", "talent_access_unavailable", "company_required", "already_on_plan", "talent_access_required", "messaging_talent_access_required", "stripe_not_connected", "job_posting_logo_lookup_unavailable", "job_posting_logo_not_found", "job_posting_rejected"];
23
+ declare const BOARD_API_ERROR_CODES: readonly ["internal_error", "validation_bad_request", "validation_payload_too_large", "rate_limited", "rate_limit_unavailable", "search_unavailable", "too_many_filter_values", "pagination_invalid_cursor", "pagination_offset_too_large", "auth_unauthenticated", "auth_forbidden", "plan_upgrade_required", "unknown_error", "boards_not_found", "board_page_not_found", "board_auth_account_not_found", "board_auth_email_taken", "board_auth_invalid_credentials", "board_auth_invalid_token", "board_auth_registration_disabled", "board_auth_token_expired", "invalid_current_password", "no_password", "same_email", "email_taken", "invalid_token", "board_password_required", "board_password_invalid", "jobs_not_found", "jobs_invalid_filter", "categories_not_found", "skills_not_found", "places_not_found", "companies_not_found", "company_markets_not_found", "company_salary_not_found", "company_category_salary_not_found", "salaries_title_not_found", "salaries_skill_not_found", "salaries_location_not_found", "salaries_title_location_not_found", "salaries_skill_location_not_found", "blog_post_not_found", "blog_author_not_found", "blog_tag_not_found", "talent_not_found", "talent_directory_not_found", "talent_directory_restricted", "job_recommendations_not_found", "recommended_talent_not_found", "job_alert_not_found", "job_alerts_disabled", "candidate_alert_limit_reached", "candidate_alert_not_found", "candidate_entry_not_found", "candidate_handle_taken", "candidate_job_not_found", "candidate_notification_preference_paused", "resume_invalid_file", "resume_upload_forbidden", "applications_external_apply_only", "applications_country_not_allowed", "applications_guest_not_allowed", "applications_job_not_found", "applications_not_found", "applications_resume_invalid_file", "applications_unprocessable", "messaging_application_not_found", "messaging_application_not_linked", "messaging_blocked", "messaging_cannot_block_self", "messaging_cold_rule", "messaging_conversation_not_found", "messaging_disabled", "messaging_edit_window_expired", "messaging_message_deleted", "messaging_message_not_found", "messaging_not_author", "messaging_not_participant", "messaging_not_permitted", "messaging_not_recipient", "messaging_rate_limited", "messaging_recipient_not_found", "messaging_recipient_not_open", "messaging_unsend_window_expired", "employer_applicant_not_found", "employer_ats_unprocessable", "employer_checkout_failed", "employer_company_exists", "employer_company_name_taken", "employer_company_not_found", "employer_job_not_found", "employer_job_slug_taken", "employer_jobs_quota_exceeded", "membership_required", "employer_not_member", "employer_payment_required", "employer_pipeline_stage_not_found", "employer_member_not_found", "employer_invite_not_found", "not_company_admin", "not_company_member", "company_deletion_disabled", "last_admin", "already_member", "already_invited", "invalid_email", "invite_email_mismatch", "candidate_role", "job_not_published", "talent_list_not_found", "sourced_candidate_not_found", "sourced_convert_unavailable", "candidate_paywall_access_required", "paywall_already_active", "paywall_disabled", "paywall_invalid_checkout_session", "paywall_no_candidate_profile", "paywall_no_recurring_subscription", "paywall_offer_not_found", "talent_access_unavailable", "company_required", "already_on_plan", "talent_access_required", "messaging_talent_access_required", "stripe_not_connected", "job_posting_logo_lookup_unavailable", "job_posting_logo_not_found", "job_posting_rejected"];
24
24
  /**
25
25
  * The known code set plus open string — new codes ship additively within v1,
26
26
  * so exhaustive narrowing is intentionally impossible.
@@ -143,7 +143,7 @@ declare function paginate<Q extends Record<string, unknown>, P extends PageShape
143
143
  * constant because the package is platform-neutral and cannot read
144
144
  * package.json at runtime.
145
145
  */
146
- declare const SDK_VERSION = "4.19.0";
146
+ declare const SDK_VERSION = "4.21.0";
147
147
 
148
148
  type SavedJob = Schemas['SavedJob'];
149
149
  type SavedJobsListQuery = {
@@ -694,15 +694,22 @@ type TalentDirectoryQuery = {
694
694
  type TalentDirectoryListEnvelope = ListEnvelope<TalentDirectoryEntry>;
695
695
 
696
696
  /**
697
- * A board plan (employer pricing). `purpose` is `job_posting` or
698
- * `talent_access`; talent-access plans carry a `talent` allowance block.
697
+ * A board plan (employer or job-seeker pricing). `purpose` says what the plan
698
+ * entitles; `pricingMode` says how it is bought — a `contact` plan is
699
+ * quote-only, so render `priceText` and the CTA fields instead of `price`.
700
+ * Talent-access plans carry a `talent` allowance block.
699
701
  */
700
702
  type Plan = Schemas['Plan'];
701
- /** A sales-led ("contact us") plan — a custom CTA tier with no programmatic price. */
703
+ /**
704
+ * @deprecated Use `plans.list()` and keep the rows whose `purpose` is
705
+ * `employer_service` and whose `pricingMode` is `contact`.
706
+ *
707
+ * A sales-led ("contact us") plan — a custom CTA tier with no programmatic price.
708
+ */
702
709
  type SalesLedPlan = Schemas['SalesLedPlan'];
703
710
  type PlansListQuery = {
704
711
  /** Filter to a single purpose. Omit to return all public plans. */
705
- purpose?: 'job_posting' | 'talent_access';
712
+ purpose?: 'job_posting' | 'talent_access' | 'membership' | 'job_seeker' | 'employer_service' | 'job_seeker_service';
706
713
  };
707
714
  type PlanListEnvelope = ListEnvelope<Plan>;
708
715
  type SalesLedPlanListEnvelope = ListEnvelope<SalesLedPlan>;
@@ -939,6 +946,9 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
939
946
  messaging: boolean;
940
947
  };
941
948
  talentAccessModel: "paid_messaging" | "paid_unlocks_and_messaging" | null;
949
+ posting: {
950
+ requiresMembership: boolean;
951
+ };
942
952
  analytics: {
943
953
  ga4MeasurementId: string | null;
944
954
  gtmId: string | null;
@@ -1244,6 +1254,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1244
1254
  jobCount: number;
1245
1255
  publishedJobCount: number;
1246
1256
  salarySampleCount: number;
1257
+ membership: components["schemas"]["PublicCompanyMembership"];
1247
1258
  links: components["schemas"]["PublicCompanyLinks"];
1248
1259
  } & {
1249
1260
  markets: components["schemas"]["CompanyMarketRef"][];
@@ -1260,6 +1271,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1260
1271
  jobCount: number;
1261
1272
  publishedJobCount: number;
1262
1273
  salarySampleCount: number;
1274
+ membership: components["schemas"]["PublicCompanyMembership"];
1263
1275
  links: components["schemas"]["PublicCompanyLinks"];
1264
1276
  }>>;
1265
1277
  listJobs(companySlug: string, query?: CompanyJobsListQuery, options?: FetchOptions): Promise<JobCardListEnvelope>;
@@ -1275,6 +1287,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1275
1287
  jobCount: number;
1276
1288
  publishedJobCount: number;
1277
1289
  salarySampleCount: number;
1290
+ membership: components["schemas"]["PublicCompanyMembership"];
1278
1291
  links: components["schemas"]["PublicCompanyLinks"];
1279
1292
  }>>;
1280
1293
  markets: ((query?: CompanyMarketsListQuery, options?: FetchOptions) => Promise<ListEnvelope<{
@@ -2230,7 +2243,8 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
2230
2243
  list(slug: string, options?: FetchOptions): Promise<ListEnvelope<{
2231
2244
  id: string;
2232
2245
  object: "employer_billing_option";
2233
- type: "subscription" | "order";
2246
+ type: "subscription" | "order" | "plan_assignment";
2247
+ kind?: "member_post";
2234
2248
  planId: string;
2235
2249
  planName: string;
2236
2250
  planKind: "subscription" | "one_time" | "bundle";
@@ -2238,6 +2252,8 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
2238
2252
  jobsTotal: number;
2239
2253
  featuredRemaining: number;
2240
2254
  featuredTotal: number;
2255
+ jobsUnlimited?: boolean;
2256
+ featuredUnlimited?: boolean;
2241
2257
  renewsAt: string | null;
2242
2258
  }>>;
2243
2259
  };
package/dist/index.js CHANGED
@@ -157,6 +157,7 @@ var BOARD_API_ERROR_CODES = [
157
157
  "employer_job_not_found",
158
158
  "employer_job_slug_taken",
159
159
  "employer_jobs_quota_exceeded",
160
+ "membership_required",
160
161
  "employer_not_member",
161
162
  "employer_payment_required",
162
163
  "employer_pipeline_stage_not_found",
@@ -179,6 +180,7 @@ var BOARD_API_ERROR_CODES = [
179
180
  "sourced_candidate_not_found",
180
181
  "sourced_convert_unavailable",
181
182
  // Candidate job-access paywall
183
+ "candidate_paywall_access_required",
182
184
  "paywall_already_active",
183
185
  "paywall_disabled",
184
186
  "paywall_invalid_checkout_session",
@@ -348,7 +350,7 @@ async function clearSession(storage) {
348
350
  }
349
351
 
350
352
  // src/version.ts
351
- var SDK_VERSION = "4.19.0";
353
+ var SDK_VERSION = "4.21.0";
352
354
 
353
355
  // src/client.ts
354
356
  function isRawBody(body) {
@@ -3035,19 +3037,26 @@ function paywallNamespace(client) {
3035
3037
  function plansNamespace(client) {
3036
3038
  return {
3037
3039
  /**
3038
- * List the board's public plans (employer pricing) — job-posting +
3039
- * talent-access plans as a flat list, filterable by `purpose`. Group by
3040
- * `purpose` to render the pricing columns.
3040
+ * List the board's public plans as a flat list, filterable by `purpose`.
3041
+ * Group by `purpose` to render the pricing columns. Contact-led tiers are
3042
+ * plans too: they come back with `pricingMode: 'contact'`, no buyable
3043
+ * price, and the operator's `priceText` / `ctaText` / `ctaDestination`.
3041
3044
  *
3042
3045
  * @example
3043
3046
  * const { data } = await board.plans.list({ purpose: 'talent_access' });
3047
+ *
3048
+ * @example
3049
+ * const { data } = await board.plans.list({ purpose: 'employer_service' });
3050
+ * const contactTiers = data.filter((p) => p.pricingMode === 'contact');
3044
3051
  */
3045
3052
  list(query, options) {
3046
3053
  return client.fetch("/plans", { ...options, query });
3047
3054
  },
3048
3055
  /**
3049
- * List the board's sales-led ("contact us") plans — custom marketing tiers
3050
- * with a CTA destination and no programmatic price.
3056
+ * @deprecated Use `list({ purpose: 'employer_service' })` and keep the
3057
+ * rows whose `pricingMode` is `contact` — the same cards, carrying real
3058
+ * benefits and the shared plan shape. This helper stays as a
3059
+ * compatibility read of rows created before that.
3051
3060
  *
3052
3061
  * @example
3053
3062
  * const { data } = await board.plans.salesLed();
package/dist/index.mjs CHANGED
@@ -20,7 +20,7 @@ import {
20
20
  isRateLimited,
21
21
  isUnauthorized,
22
22
  isValidationError
23
- } from "./chunk-XNO4NOPW.mjs";
23
+ } from "./chunk-RORHD4WQ.mjs";
24
24
 
25
25
  // src/query.ts
26
26
  function toSearchParams(query) {
@@ -41,7 +41,7 @@ function toSearchParams(query) {
41
41
  }
42
42
 
43
43
  // src/version.ts
44
- var SDK_VERSION = "4.19.0";
44
+ var SDK_VERSION = "4.21.0";
45
45
 
46
46
  // src/client.ts
47
47
  function isRawBody(body) {
@@ -2728,19 +2728,26 @@ function paywallNamespace(client) {
2728
2728
  function plansNamespace(client) {
2729
2729
  return {
2730
2730
  /**
2731
- * List the board's public plans (employer pricing) — job-posting +
2732
- * talent-access plans as a flat list, filterable by `purpose`. Group by
2733
- * `purpose` to render the pricing columns.
2731
+ * List the board's public plans as a flat list, filterable by `purpose`.
2732
+ * Group by `purpose` to render the pricing columns. Contact-led tiers are
2733
+ * plans too: they come back with `pricingMode: 'contact'`, no buyable
2734
+ * price, and the operator's `priceText` / `ctaText` / `ctaDestination`.
2734
2735
  *
2735
2736
  * @example
2736
2737
  * const { data } = await board.plans.list({ purpose: 'talent_access' });
2738
+ *
2739
+ * @example
2740
+ * const { data } = await board.plans.list({ purpose: 'employer_service' });
2741
+ * const contactTiers = data.filter((p) => p.pricingMode === 'contact');
2737
2742
  */
2738
2743
  list(query, options) {
2739
2744
  return client.fetch("/plans", { ...options, query });
2740
2745
  },
2741
2746
  /**
2742
- * List the board's sales-led ("contact us") plans — custom marketing tiers
2743
- * with a CTA destination and no programmatic price.
2747
+ * @deprecated Use `list({ purpose: 'employer_service' })` and keep the
2748
+ * rows whose `pricingMode` is `contact` — the same cards, carrying real
2749
+ * benefits and the shared plan shape. This helper stays as a
2750
+ * compatibility read of rows created before that.
2744
2751
  *
2745
2752
  * @example
2746
2753
  * const { data } = await board.plans.salesLed();
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DyTPJbIZ.mjs';
1
+ import { S as Schemas } from './_spec-CyNKpM_j.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-DyTPJbIZ.js';
1
+ import { S as Schemas } from './_spec-CyNKpM_j.js';
2
2
 
3
3
  /**
4
4
  * Optional pagination metadata returned by Board API list operations.
@@ -92,7 +92,8 @@ declare function createBoardLinkResolver(layers: readonly ManifestLayer[]): {
92
92
  };
93
93
 
94
94
  /**
95
- * — pure history path matching for hosted rename 301s.
95
+ * — pure history path matching for hosted rename 301s
96
+ *.
96
97
  *
97
98
  * Segment-wise matcher (no RegExp construction from templates). Templates
98
99
  * are validated at write time but stay defensive here: any segment that
@@ -92,7 +92,8 @@ declare function createBoardLinkResolver(layers: readonly ManifestLayer[]): {
92
92
  };
93
93
 
94
94
  /**
95
- * — pure history path matching for hosted rename 301s.
95
+ * — pure history path matching for hosted rename 301s
96
+ *.
96
97
  *
97
98
  * Segment-wise matcher (no RegExp construction from templates). Templates
98
99
  * are validated at write time but stay defensive here: any segment that
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DyTPJbIZ.js';
1
+ import { S as Schemas } from './_spec-CyNKpM_j.js';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DyTPJbIZ.mjs';
1
+ import { S as Schemas } from './_spec-CyNKpM_j.mjs';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DyTPJbIZ.mjs';
1
+ import { S as Schemas } from './_spec-CyNKpM_j.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-DyTPJbIZ.js';
1
+ import { S as Schemas } from './_spec-CyNKpM_j.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-zYWVcaj1.mjs';
2
- import './_spec-DyTPJbIZ.mjs';
1
+ import { B as BoardSeo } from './seo-CS4lrG20.mjs';
2
+ import './_spec-CyNKpM_j.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-BfEBr4pW.js';
2
- import './_spec-DyTPJbIZ.js';
1
+ import { B as BoardSeo } from './seo-D1u-RmLQ.js';
2
+ import './_spec-CyNKpM_j.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-Cdw6_ocq.mjs';
2
- import { e as JsonLdObject } from './breadcrumbs-CKtVWTOB.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-CKtVWTOB.mjs';
4
- import './_spec-DyTPJbIZ.mjs';
5
- import './board-CLDHd9N_.mjs';
6
- import './jobs-Bnx1B6at.mjs';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-BNIqGayD.mjs';
2
+ import { e as JsonLdObject } from './breadcrumbs-Bi4LHNAF.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-Bi4LHNAF.mjs';
4
+ import './_spec-CyNKpM_j.mjs';
5
+ import './board-mn3GVbrC.mjs';
6
+ import './jobs-CALE3I8I.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-vDgRPBAK.js';
2
- import { e as JsonLdObject } from './breadcrumbs-CYT3HxfO.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-CYT3HxfO.js';
4
- import './_spec-DyTPJbIZ.js';
5
- import './board-DpDCNMJD.js';
6
- import './jobs-Bwl7pKKg.js';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-CRvaDyzJ.js';
2
+ import { e as JsonLdObject } from './breadcrumbs-Crk6Q69T.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-Crk6Q69T.js';
4
+ import './_spec-CyNKpM_j.js';
5
+ import './board-CXNxSlUB.js';
6
+ import './jobs-CSWXqLZR.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-DyTPJbIZ.mjs';
3
- import './search-DlxLGmDk.mjs';
4
- import './board-CLDHd9N_.mjs';
5
- import './jobs-Bnx1B6at.mjs';
6
- import './seo-zYWVcaj1.mjs';
7
- import './blog-Cdw6_ocq.mjs';
2
+ import './_spec-CyNKpM_j.mjs';
3
+ import './search-B_hwS-xu.mjs';
4
+ import './board-mn3GVbrC.mjs';
5
+ import './jobs-CALE3I8I.mjs';
6
+ import './seo-CS4lrG20.mjs';
7
+ import './blog-BNIqGayD.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-DyTPJbIZ.js';
3
- import './search-CQZ-ibOl.js';
4
- import './board-DpDCNMJD.js';
5
- import './jobs-Bwl7pKKg.js';
6
- import './seo-BfEBr4pW.js';
7
- import './blog-vDgRPBAK.js';
2
+ import './_spec-CyNKpM_j.js';
3
+ import './search-BRCbe1Nm.js';
4
+ import './board-CXNxSlUB.js';
5
+ import './jobs-CSWXqLZR.js';
6
+ import './seo-D1u-RmLQ.js';
7
+ import './blog-CRvaDyzJ.js';
8
8
 
9
9
  /**
10
10
  * Session cookie codec — pure (no framework imports, no node imports) so it
package/dist/server.mjs CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-Z4ALWIGS.mjs";
5
5
  import {
6
6
  isUnauthorized
7
- } from "./chunk-XNO4NOPW.mjs";
7
+ } from "./chunk-RORHD4WQ.mjs";
8
8
 
9
9
  // src/server/cookie.ts
10
10
  var COOKIE_ATTRIBUTES = "Path=/; HttpOnly; Secure; SameSite=Lax";
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-DyTPJbIZ.mjs';
3
- import './search-DlxLGmDk.mjs';
4
- import './board-CLDHd9N_.mjs';
5
- import './jobs-Bnx1B6at.mjs';
6
- import './seo-zYWVcaj1.mjs';
7
- import './blog-Cdw6_ocq.mjs';
2
+ import './_spec-CyNKpM_j.mjs';
3
+ import './search-B_hwS-xu.mjs';
4
+ import './board-mn3GVbrC.mjs';
5
+ import './jobs-CALE3I8I.mjs';
6
+ import './seo-CS4lrG20.mjs';
7
+ import './blog-BNIqGayD.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-DyTPJbIZ.js';
3
- import './search-CQZ-ibOl.js';
4
- import './board-DpDCNMJD.js';
5
- import './jobs-Bwl7pKKg.js';
6
- import './seo-BfEBr4pW.js';
7
- import './blog-vDgRPBAK.js';
2
+ import './_spec-CyNKpM_j.js';
3
+ import './search-BRCbe1Nm.js';
4
+ import './board-CXNxSlUB.js';
5
+ import './jobs-CSWXqLZR.js';
6
+ import './seo-D1u-RmLQ.js';
7
+ import './blog-CRvaDyzJ.js';
8
8
 
9
9
  /**
10
10
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
package/dist/sitemap.mjs CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-DLSO6XXY.mjs";
4
4
  import {
5
5
  isNotFound
6
- } from "./chunk-XNO4NOPW.mjs";
6
+ } from "./chunk-RORHD4WQ.mjs";
7
7
  import {
8
8
  BOARD_PATHS,
9
9
  blogAuthorPath,
@@ -1,5 +1,5 @@
1
- import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-DlxLGmDk.mjs';
2
- import './_spec-DyTPJbIZ.mjs';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-B_hwS-xu.mjs';
2
+ import './_spec-CyNKpM_j.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-CQZ-ibOl.js';
2
- import './_spec-DyTPJbIZ.js';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-BRCbe1Nm.js';
2
+ import './_spec-CyNKpM_j.js';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/suggest` — framework-agnostic headless search-suggest
@@ -38,7 +38,8 @@ declare function serializeManifest(manifest: {
38
38
  }): string;
39
39
 
40
40
  /**
41
- * Build-plugin variant of the well-known manifest.
41
+ * Build-plugin variant of the well-known manifest
42
+ *.
42
43
  *
43
44
  * Pure function — no fs imports and no write callback: callers (vite
44
45
  * plugin, starter build hook) own the write of `contents` to `path` under
@@ -38,7 +38,8 @@ declare function serializeManifest(manifest: {
38
38
  }): string;
39
39
 
40
40
  /**
41
- * Build-plugin variant of the well-known manifest.
41
+ * Build-plugin variant of the well-known manifest
42
+ *.
42
43
  *
43
44
  * Pure function — no fs imports and no write callback: callers (vite
44
45
  * plugin, starter build hook) own the write of `contents` to `path` under
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cavuno/board",
3
- "version": "4.19.0",
3
+ "version": "4.21.0",
4
4
  "description": "Build custom job boards and careers pages with Cavuno’s TypeScript SDK.",
5
5
  "keywords": [
6
6
  "api-client",
@@ -221,7 +221,7 @@
221
221
  "provenance": true
222
222
  },
223
223
  "scripts": {
224
- "build": "rm -rf dist && tsup",
224
+ "build": "rm -rf dist && tsup && node scripts/sanitize-dist-chunk-names.mjs",
225
225
  "clean": "git clean -xdf .turbo dist node_modules src/generated",
226
226
  "typecheck": "tsgo --noEmit && tsgo --noEmit -p tsconfig.node.json",
227
227
  "test": "vitest run",
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.19.0",
2
+ "version": "4.21.0",
3
3
  "skills": [
4
4
  {
5
5
  "name": "cavuno-board-account",