@cavuno/board 4.56.1 → 4.57.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 (68) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/dist/{_spec-DS4-nx__.d.mts → _spec-CDYDY0hB.d.mts} +310 -0
  3. package/dist/{_spec-DS4-nx__.d.ts → _spec-CDYDY0hB.d.ts} +310 -0
  4. package/dist/bin.mjs +26 -4
  5. package/dist/{blog-By6dc-Ce.d.ts → blog-DNGOmaKI.d.ts} +1 -1
  6. package/dist/{blog-BcjUrzqE.d.mts → blog-WupXypHv.d.mts} +1 -1
  7. package/dist/{board-B7104o4G.d.ts → board-CmQox8FZ.d.ts} +2 -2
  8. package/dist/{board-BboonvQM.d.mts → board-DbBBz7Pv.d.mts} +2 -2
  9. package/dist/{breadcrumbs-CfRlf9_7.d.ts → breadcrumbs-DpXiAo9j.d.ts} +2 -2
  10. package/dist/{breadcrumbs-DmnLLDr9.d.mts → breadcrumbs-mQTz0vZo.d.mts} +2 -2
  11. package/dist/browser/cavuno-board.global.min.js +1 -1
  12. package/dist/{chunk-VERFP5OF.mjs → chunk-GUXSUQCP.mjs} +18 -4
  13. package/dist/{chunk-DZD3DAEY.mjs → chunk-M4CX64RC.mjs} +25 -1
  14. package/dist/{chunk-ENQ4ZIO2.mjs → chunk-MSY7ERBY.mjs} +13 -1
  15. package/dist/{chunk-EWD4PIOM.mjs → chunk-R3QB3WM6.mjs} +1 -1
  16. package/dist/doctor.js +26 -4
  17. package/dist/doctor.mjs +26 -4
  18. package/dist/filters.d.mts +2 -2
  19. package/dist/filters.d.ts +2 -2
  20. package/dist/format.d.mts +4 -4
  21. package/dist/format.d.ts +4 -4
  22. package/dist/format.js +5 -1
  23. package/dist/format.mjs +2 -2
  24. package/dist/go.js +5 -1
  25. package/dist/go.mjs +1 -1
  26. package/dist/index.d.mts +241 -13
  27. package/dist/index.d.ts +241 -13
  28. package/dist/index.js +226 -2
  29. package/dist/index.mjs +202 -2
  30. package/dist/{jobs-DkDmvx2n.d.ts → jobs-B-NPmaV0.d.ts} +1 -1
  31. package/dist/{jobs-D70pujRc.d.mts → jobs-CgmHLS8j.d.mts} +1 -1
  32. package/dist/paths.d.mts +16 -1
  33. package/dist/paths.d.ts +16 -1
  34. package/dist/paths.js +13 -1
  35. package/dist/paths.mjs +5 -1
  36. package/dist/{roles-Bh3WNF9u.d.mts → roles-B_d0igKI.d.mts} +5 -1
  37. package/dist/{roles-Bh3WNF9u.d.ts → roles-B_d0igKI.d.ts} +5 -1
  38. package/dist/route-contract.d.mts +2 -2
  39. package/dist/route-contract.d.ts +2 -2
  40. package/dist/route-contract.js +26 -4
  41. package/dist/route-contract.mjs +2 -2
  42. package/dist/{search-DCNHOZQK.d.mts → search--bO1b3RJ.d.mts} +1 -1
  43. package/dist/{search-DAwVPHKk.d.ts → search-BvhQ92ZO.d.ts} +1 -1
  44. package/dist/{seo-Duj1plPG.d.mts → seo-C7HjUu_z.d.mts} +1 -1
  45. package/dist/{seo-BH3Ryx7D.d.ts → seo-CBRBS8Mc.d.ts} +1 -1
  46. package/dist/seo-files.d.mts +2 -2
  47. package/dist/seo-files.d.ts +2 -2
  48. package/dist/seo-files.js +5 -0
  49. package/dist/seo-files.mjs +5 -0
  50. package/dist/seo.d.mts +6 -6
  51. package/dist/seo.d.ts +6 -6
  52. package/dist/seo.js +5 -1
  53. package/dist/seo.mjs +2 -2
  54. package/dist/server.d.mts +6 -6
  55. package/dist/server.d.ts +6 -6
  56. package/dist/server.mjs +1 -1
  57. package/dist/sitemap.d.mts +6 -6
  58. package/dist/sitemap.d.ts +6 -6
  59. package/dist/sitemap.js +9 -3
  60. package/dist/sitemap.mjs +6 -4
  61. package/dist/suggest.d.mts +2 -2
  62. package/dist/suggest.d.ts +2 -2
  63. package/dist/well-known.d.mts +1 -1
  64. package/dist/well-known.d.ts +1 -1
  65. package/dist/well-known.js +26 -4
  66. package/dist/well-known.mjs +2 -2
  67. package/package.json +1 -1
  68. 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-DS4-nx__.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-DAwVPHKk.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-DAwVPHKk.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-DkDmvx2n.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-DkDmvx2n.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-B7104o4G.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-B7104o4G.js';
8
- export { B as BoardSeo } from './seo-BH3Ryx7D.js';
9
- import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-By6dc-Ce.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-By6dc-Ce.js';
1
+ import { S as Schemas, c as components } from './_spec-CDYDY0hB.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-BvhQ92ZO.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-BvhQ92ZO.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-B-NPmaV0.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-B-NPmaV0.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-CmQox8FZ.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-CmQox8FZ.js';
8
+ export { B as BoardSeo } from './seo-CBRBS8Mc.js';
9
+ import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-DNGOmaKI.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-DNGOmaKI.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", "search_filter_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", "board_development_origin_not_allowed_for_email", "board_development_origin_not_registered", "board_development_origin_requires_publishable_key", "sso_required", "board_auth_method_unavailable", "board_auth_sso_connection_not_found", "board_auth_sso_role_unavailable", "board_auth_sso_provider_unavailable", "board_auth_sso_browser_mismatch", "board_auth_sso_not_provisioned", "board_auth_sso_identity_linked_elsewhere", "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", "locations_invalid_id", "locations_unavailable", "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", "feeds_not_found", "feed_not_ready", "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", "candidate_profile_required", "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_free_email_website", "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", "talent_list_full", "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", "membership_plan_not_found", "membership_seat_taken", "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", "search_filter_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", "board_development_origin_not_allowed_for_email", "board_development_origin_not_registered", "board_development_origin_requires_publishable_key", "sso_required", "board_auth_method_unavailable", "board_auth_sso_connection_not_found", "board_auth_sso_role_unavailable", "board_auth_sso_provider_unavailable", "board_auth_sso_browser_mismatch", "board_auth_sso_not_provisioned", "board_auth_sso_identity_linked_elsewhere", "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", "locations_invalid_id", "locations_unavailable", "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", "feeds_not_found", "feed_not_ready", "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", "candidate_profile_required", "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_free_email_website", "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", "talent_list_full", "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", "membership_plan_not_found", "membership_seat_taken", "job_posting_logo_lookup_unavailable", "job_posting_logo_not_found", "job_posting_rejected", "products_not_found", "product_checkout_not_found", "product_reviews_disabled", "product_sold_out", "product_email_invalid", "product_email_blocked", "product_amount_below_minimum", "product_amount_invalid", "product_answers_invalid", "purchases_not_found", "purchase_file_not_found", "purchase_unavailable", "purchase_access_removed", "purchase_awaiting_payment", "purchase_refunded", "purchase_email_confirmation_required", "purchase_email_mismatch", "purchase_file_preparing", "purchase_download_limit_reached", "purchase_review_invalid", "purchase_download_all_unavailable"];
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.
@@ -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.56.1";
205
+ declare const SDK_VERSION = "4.57.0";
206
206
 
207
207
  type SavedJob = Schemas['SavedJob'];
208
208
  type SavedJobsListQuery = {
@@ -1101,6 +1101,80 @@ type AccessCheckoutBody = Schemas['AccessCheckoutBody'];
1101
1101
  type AccessPortalBody = Schemas['AccessPortalBody'];
1102
1102
  type PaywallOfferListEnvelope = ListEnvelope<PaywallOffer>;
1103
1103
 
1104
+ /** A product card in `products.list`. */
1105
+ type ProductCard = Schemas['ProductCard'];
1106
+ /** A product page (`products.get`). */
1107
+ type Product = Schemas['ProductDetail'];
1108
+ /**
1109
+ * A row of a product page's facts box. `kind: 'text'` shows `value`;
1110
+ * `kind: 'check'` is a yes/no row: render a tick for `checked: true` and a
1111
+ * cross for `false`, not the words Yes or No.
1112
+ */
1113
+ type ProductDetailRow = Schemas['ProductDetailRow'];
1114
+ /** The price model of a product. */
1115
+ type ProductPrice = Schemas['ProductPrice'];
1116
+ /** A question the buyer answers at checkout. */
1117
+ type ProductQuestion = Schemas['ProductQuestion'];
1118
+ /** A visible review (`products.reviews`). */
1119
+ type ProductReview = Schemas['ProductReview'];
1120
+ /** Body for `products.checkout`. */
1121
+ type ProductCheckoutBody = Schemas['ProductCheckoutBody'];
1122
+ /**
1123
+ * `products.checkout` result: `status: 'complete'` (free claim; send the
1124
+ * buyer to `downloadUrl`) or `status: 'open'` (mount the embedded Stripe
1125
+ * Checkout with `publishableKey`, `stripeAccountId` and `clientSecret`).
1126
+ */
1127
+ type ProductCheckout = Schemas['ProductCheckout'];
1128
+ /** `products.getCheckout` result, after Stripe returns the buyer. */
1129
+ type ProductCheckoutStatus = Schemas['ProductCheckoutStatus'];
1130
+ /** A purchase's download page (`purchases.get`). */
1131
+ type Purchase = Schemas['Purchase'];
1132
+ /** `purchases.confirmEmail` result. */
1133
+ type PurchaseConfirmation = Schemas['PurchaseConfirmation'];
1134
+ /** `purchases.download` result: a signed, short-lived link. */
1135
+ type PurchaseDownload = Schemas['PurchaseDownload'];
1136
+ /** `purchases.downloadAll` result: a short-lived ZIP link. */
1137
+ type PurchaseDownloadAll = Schemas['PurchaseDownloadAll'];
1138
+ /** Body for `purchases.review`. */
1139
+ type PurchaseReviewBody = Schemas['PurchaseReviewBody'];
1140
+ /** `purchases.review` result. */
1141
+ type PurchaseReviewResult = Schemas['PurchaseReviewResult'];
1142
+ /** Body for `purchases.resend`. */
1143
+ type PurchaseResendBody = Schemas['PurchaseResendBody'];
1144
+ /** `purchases.resend` result (always accepted). */
1145
+ type PurchaseResendResult = Schemas['PurchaseResendResult'];
1146
+ /** One row of the signed-in user's library (`purchases.mine`). */
1147
+ type PurchaseSummary = Schemas['PurchaseSummary'];
1148
+ type ProductsListQuery = {
1149
+ /** Search words; every word must appear in the name or summary. */
1150
+ q?: string;
1151
+ price?: 'free' | 'paid';
1152
+ sort?: 'featured' | 'newest' | 'rating' | 'price_asc';
1153
+ cursor?: string;
1154
+ /** 1 to 50 (default 20). */
1155
+ limit?: number;
1156
+ };
1157
+ type ProductReviewsQuery = {
1158
+ cursor?: string;
1159
+ /** 1 to 50 (default 20). */
1160
+ limit?: number;
1161
+ };
1162
+ /**
1163
+ * Options on every purchase-token call. `confirmationToken` is the value a
1164
+ * previous response returned; a frontend that calls the API from its server
1165
+ * keeps it (for example in its own cookie) and passes it back so a shared
1166
+ * link does not ask for the email again.
1167
+ */
1168
+ type PurchaseRequestOptions = {
1169
+ confirmationToken?: string | null;
1170
+ };
1171
+ type ProductCardListEnvelope = ListEnvelope<ProductCard>;
1172
+ type ProductReviewListEnvelope = ListEnvelope<ProductReview>;
1173
+ type PurchaseSummaryListEnvelope = ListEnvelope<PurchaseSummary>;
1174
+
1175
+ /** Header the API reads the email confirmation from. */
1176
+ declare const PURCHASE_CONFIRMATION_HEADER = "x-cavuno-purchase-confirmation";
1177
+
1104
1178
  /** First-touch signup evidence, supplied only when analytics capture is allowed. */
1105
1179
  type AudienceAttribution = Schemas['AudienceAttribution'];
1106
1180
 
@@ -4368,6 +4442,160 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
4368
4442
  paywall: {
4369
4443
  offers(options?: FetchOptions): Promise<PaywallOfferListEnvelope>;
4370
4444
  };
4445
+ products: {
4446
+ list(query?: ProductsListQuery, options?: FetchOptions): Promise<ProductCardListEnvelope>;
4447
+ get(slug: string, options?: FetchOptions): Promise<{
4448
+ object: "product";
4449
+ slug: string;
4450
+ name: string;
4451
+ description: string | null;
4452
+ descriptionHtml: string | null;
4453
+ summary: string | null;
4454
+ details: components["schemas"]["ProductDetailRow"][];
4455
+ images: string[];
4456
+ price: components["schemas"]["ProductPrice"];
4457
+ soldOut: boolean;
4458
+ salesCount: number | null;
4459
+ refundPolicy: string | null;
4460
+ questions: components["schemas"]["ProductQuestion"][];
4461
+ contents: {
4462
+ displayName: string;
4463
+ description: string | null;
4464
+ kind: "file" | "link";
4465
+ fileType: string;
4466
+ pageCount: number | null;
4467
+ sizeBytes: number | null;
4468
+ }[];
4469
+ facts: {
4470
+ fileCount: number;
4471
+ linkCount: number;
4472
+ fileTypes: string[];
4473
+ pageCount: number | null;
4474
+ totalSizeBytes: number;
4475
+ };
4476
+ isListed: boolean;
4477
+ ratingsEnabled: boolean;
4478
+ rating: {
4479
+ average: number | null;
4480
+ count: number;
4481
+ histogram: number[];
4482
+ } | null;
4483
+ url: string;
4484
+ }>;
4485
+ reviews(slug: string, query?: ProductReviewsQuery, options?: FetchOptions): Promise<ProductReviewListEnvelope>;
4486
+ checkout(slug: string, body: ProductCheckoutBody, options?: FetchOptions): Promise<{
4487
+ object: "product_checkout";
4488
+ status: "complete" | "open";
4489
+ downloadUrl: string | null;
4490
+ purchaseToken: string | null;
4491
+ sessionId: string | null;
4492
+ clientSecret: string | null;
4493
+ stripeAccountId: string | null;
4494
+ publishableKey: string | null;
4495
+ }>;
4496
+ getCheckout(slug: string, sessionId: string, options?: FetchOptions): Promise<{
4497
+ object: "product_checkout_status";
4498
+ status: "awaiting_payment" | "paid" | "free" | "access_removed";
4499
+ downloadUrl: string | null;
4500
+ purchaseToken: string | null;
4501
+ }>;
4502
+ };
4503
+ purchases: {
4504
+ get(token: string, options?: Omit<RequestInit, "body"> & {
4505
+ body?: unknown;
4506
+ query?: Record<string, unknown>;
4507
+ } & PurchaseRequestOptions): Promise<{
4508
+ object: "purchase";
4509
+ status: "awaiting_payment" | "paid" | "free";
4510
+ product: {
4511
+ slug: string;
4512
+ name: string;
4513
+ thankYouMessage: string | null;
4514
+ };
4515
+ email: string;
4516
+ purchasedAt: string;
4517
+ amountCents: number;
4518
+ currency: string;
4519
+ downloadCap: number;
4520
+ files: ({
4521
+ kind: "file";
4522
+ fileId: string;
4523
+ displayName: string;
4524
+ description: string | null;
4525
+ contentType: string | null;
4526
+ sizeBytes: number | null;
4527
+ pageCount: number | null;
4528
+ state: "ready" | "preparing" | "limit_reached";
4529
+ downloadsUsed: number;
4530
+ downloadsLeft: number;
4531
+ stamped: boolean;
4532
+ } | {
4533
+ kind: "link";
4534
+ fileId: string;
4535
+ displayName: string;
4536
+ description: string | null;
4537
+ url: string;
4538
+ })[];
4539
+ downloadAllAvailable: boolean;
4540
+ stamping: "off" | "ready" | "preparing";
4541
+ receiptUrl: string | null;
4542
+ refundPolicy: string | null;
4543
+ ratingsEnabled: boolean;
4544
+ review: {
4545
+ stars: number;
4546
+ comment: string | null;
4547
+ displayName: string | null;
4548
+ hidden: boolean;
4549
+ reply: string | null;
4550
+ updatedAt: string;
4551
+ } | null;
4552
+ purchaseToken: string;
4553
+ confirmationToken: string | null;
4554
+ }>;
4555
+ confirmEmail(token: string, body: {
4556
+ email: string;
4557
+ }, options?: FetchOptions): Promise<{
4558
+ object: "purchase_confirmation";
4559
+ confirmationToken: string;
4560
+ }>;
4561
+ download(token: string, fileId: string, options?: Omit<RequestInit, "body"> & {
4562
+ body?: unknown;
4563
+ query?: Record<string, unknown>;
4564
+ } & PurchaseRequestOptions): Promise<{
4565
+ object: "purchase_download";
4566
+ url: string;
4567
+ expiresAt: string;
4568
+ fileName: string;
4569
+ downloadsLeft: number;
4570
+ confirmationToken: string | null;
4571
+ }>;
4572
+ downloadAll(token: string, options?: Omit<RequestInit, "body"> & {
4573
+ body?: unknown;
4574
+ query?: Record<string, unknown>;
4575
+ } & PurchaseRequestOptions): Promise<{
4576
+ object: "purchase_download_all";
4577
+ url: string;
4578
+ expiresAt: string;
4579
+ fileCount: number;
4580
+ totalBytes: number;
4581
+ preparing: string[];
4582
+ limitReached: string[];
4583
+ confirmationToken: string | null;
4584
+ }>;
4585
+ review(token: string, body: PurchaseReviewBody, options?: Omit<RequestInit, "body"> & {
4586
+ body?: unknown;
4587
+ query?: Record<string, unknown>;
4588
+ } & PurchaseRequestOptions): Promise<{
4589
+ id: string;
4590
+ object: "purchase_review";
4591
+ counted: boolean;
4592
+ }>;
4593
+ resend(body: PurchaseResendBody, options?: FetchOptions): Promise<{
4594
+ object: "purchase_resend";
4595
+ accepted: true;
4596
+ }>;
4597
+ mine(options?: FetchOptions): Promise<PurchaseSummaryListEnvelope>;
4598
+ };
4371
4599
  sitemap: ((options?: FetchOptions) => Promise<{
4372
4600
  object: "board_sitemap";
4373
4601
  buckets: components["schemas"]["BoardSitemapBucketSummary"][];
@@ -4377,4 +4605,4 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
4377
4605
  };
4378
4606
  type BoardSdk = ReturnType<typeof createBoardClient>;
4379
4607
 
4380
- export { type AcceptCompanyMemberInviteBody, type AccessCheckoutBody, type AccessCheckoutSession, type AccessCheckoutSessionState, type AccessGrant, type AccessPortalBody, type AccessPortalSession, type AddApplicantNoteBody, type AddSourcedCandidateBody, type AddTalentListMemberBody, type Alert, type AlertBody, type Application, type ApplicationsListQuery, type ApplyAction, type ApplyApprovalPlan, type ApplyApprovalReceipt, type ApplyBody, type ApplyDecisionState, type ApplyIntent, type AudienceAttribution, type AvailableSignInMethods, Awaitable, BOARD_API_ERROR_CODES, type BindingStorage, type Block, type BlockStatus, type BlockUserBody, type BlockedUser, BlogPostsListQuery, BlogSearchBody, BlogSimilarQuery, type BoardAccessGrant, BoardApiError, type BoardApiErrorCode, type BoardAuthSession, BoardClient, BoardRequest, type BoardSdk, type BoardSitemapBucketSummary, type BoardSitemapIndex, type BoardUser, type BuiltInSignInMethod, type BulkMoveApplicantsBody, type BulkRejectApplicantsBody, type CandidateAvatar, type CandidateEducation, type CandidateExperience, type CandidateLanguage, type CandidateProfile, type CandidateSkill, type CategoryListQuery, type ClaimableCompany, CompaniesListQuery, CompaniesSearchBody, type CompanyBillingPortalBody, type CompanyBillingPortalSession, CompanyJobsListQuery, CompanyListEnvelope, CompanyMarketsListQuery, type CompanyMember, type CompanyMemberInvite, type CompanyMemberInviteAcceptance, type CompanyMemberInvitePreview, type CompanyMembership, CompanySalary, CompanySimilarQuery, type ConfirmEmailChangeBody, type ConfirmWorkEmailBody, type ConsumeMagicLinkBody, type Conversation, type ConversationArchive, type ConversationDetail, type ConversationRef, type ConversationsListQuery, type ConvertSourcedCandidateBody, type CreateAlertBody, type CreateApplyApprovalBody, type CreateApplyIntentBody, type CreateBoardClientOptions, type CreateCompanyBody, type CreateCompanyMemberInviteBody, type CreateEducationBody, type CreateEmployerJobBody, type CreateExperienceBody, type CreateJobPostingInput, type CreatePipelineStageBody, type CreateTalentListBody, CustomFieldFilter, type EditMessageBody, type EmbedJobsQuery, type EmployerApplicant, type EmployerBillingOption, type EmployerCheckout, type EmployerCheckoutBody, type EmployerCompany, type EmployerCompanySearchQuery, type EmployerJob, type EmployerJobStat, type EmployerJobStatsPoint, type EmployerJobStatsTimeseriesQuery, type EmployerJobSummary, type EmployerJobsListQuery, type EmployerPipeline, type EmployerPipelineQuery, type EmployerPipelineStage, type EmployerProfileStats, type EmployerProfileViewsPoint, type EmployerProfileViewsTimeseriesQuery, EmploymentType, FetchOptions, type FindExistingConversationQuery, type ForgotPasswordBody, type HandleAvailability, type JobAlertAnchorJob, type JobAlertConfirmation, type JobAlertDeletePreferenceInput, type JobAlertFiltersInput, type JobAlertFrequency, type JobAlertKind, type JobAlertManageQuery, type JobAlertManageResult, type JobAlertManageState, type JobAlertManageTokenInput, type JobAlertPreference, type JobAlertRemoteOption, type JobAlertResendResult, type JobAlertStoredFilters, type JobAlertSubscribeInput, type JobAlertSubscription, type JobAlertUpdatePreferenceInput, JobCapability, JobCardListEnvelope, JobCardSearchEnvelope, JobCollectionChoiceQuery, type JobPostingBillingOptions, type JobPostingBillingVerification, type JobPostingLogoResult, type JobPostingPlan, type JobPostingResult, JobRetrieveQuery, JobsListQuery, JobsSearchBody, JobsSimilarQuery, ListEnvelope, type LocationResolveInput, type LocationSearchQuery, Logger, type LoginBody, type LogoutBody, type MarketingConsent, type MembershipCheckoutBody, type MembershipCheckoutSession, type MembershipCheckoutSessionState, type Message, type ModerationReport, type MoveApplicantStageBody, type NotificationPreference, type OAuthAuthorizationQuery, type OAuthAuthorizationUrl, type OAuthCompletion, type OAuthExchangeBody, type OAuthProvider, ObjectReferenceFilter, type Paginator, type PaywallOffer, type PaywallOfferListEnvelope, type PlaceSuggestQuery, type PlacesListQuery, type Plan, type PlanListEnvelope, type PlansListQuery, type PreviewCompanyMemberInviteBody, type ProfileChoiceList, type ProfileChoiceQuery, type ProfileFieldEntity, type ProfileFieldValues, type ProfileObjectReferenceSelectionWrite, type ProfileObjectReferences, type PublicLocation, type PublicPlace, type PublicProfileFields, type PublicTaxonomyTerm, type ReadReceipt, type RecommendedJob, type RecommendedJobsListQuery, type RecommendedTalent, type RecommendedTalentListQuery, type RedirectResolution, type RefreshBody, type RegisterBody, RemoteOption, type RemotePermitTaxonomyEntry, type ReorderPipelineStagesBody, type ReplaceProfileObjectReferencesBody, type ReplyBody, type ReportBody, type RequestEmailChangeBody, type RequestMagicLinkBody, type ResetPasswordBody, type Resume, type ResumeUploadOptions, SDK_VERSION, SIGN_IN_REDIRECT_ERROR_CODES, SSO_LINK_PROOF_BINDING_TTL_MS, SalaryDetailQuery, type SalesLedPlan, type SalesLedPlanListEnvelope, type SaveJobBody, type SavedJob, type SavedJobsListQuery, SearchEnvelope, SearchSuggestQuery, type SendWorkEmailBody, Seniority, type SignInRedirectErrorCode, type SignInRole, type SitemapEntriesEnvelope, type SitemapEntriesQuery, type SitemapEntry, type SourcedCandidate, type SsoAuthorizationQuery, type SsoAuthorizationUrl, type SsoLinkProofBindingStore, type SsoLinkProofBody, type StartAboutApplicationBody, type StartConversationBody, StorageMode, type TalentAccess, type TalentAccessCheckoutBody, type TalentAccessCheckoutSession, type TalentAccessCheckoutSessionState, type TalentAccessClaim, type TalentAccessClaimBody, type TalentAccessUpgrade, type TalentAccessUpgradeBody, type TalentCandidateAccess, type TalentDirectoryEntry, type TalentDirectoryListEnvelope, type TalentDirectoryQuery, type TalentList, type TalentListFilters, type TalentListMember, type TalentListMembersListEnvelope, type TalentListMembersQuery, type TalentListMembership, type TalentPlace, type TalentPlacesListEnvelope, type TalentPlacesQuery, type TalentProfile, type TalentUnlock, type TalentUnlockBody, type TaxonomyGeo, type TaxonomyListQuery, type TaxonomyResolution, type ThreadMessagesQuery, type UnreadCount, type UnsubscribeBody, type UpdateApplicationFactsBody, type UpdateCandidateProfileBody, type UpdateCompanyMemberRoleBody, type UpdateEducationBody, type UpdateEmployerCompanyBody, type UpdateEmployerJobBody, type UpdateExperienceBody, type UpdateLanguagesBody, type UpdateNotificationPreferenceBody, type UpdatePasswordBody, type UpdatePipelineStageBody, type UpdateProfileFieldValuesBody, type UpdateResumeBody, type UpdateSkillsBody, type UpdateTalentListBody, type VerifyEmailBody, createBoardClient, isBoardApiError, isBoardPasswordRequired, isColdRule, isConflict, isForbidden, isFreeEmailWebsiteError, isNotFound, isOwnMessage, isRateLimited, isSafeApplicationUrl, isSignInMethodUnavailable, isSsoBrowserMismatch, isSsoRequired, isUnauthorized, isValidationError, lastOwnMessageId, paginate, parseOAuthCompletion, resolveApplyAction, resolveApplyDecision, ssoLinkProofBindingStore };
4608
+ export { type AcceptCompanyMemberInviteBody, type AccessCheckoutBody, type AccessCheckoutSession, type AccessCheckoutSessionState, type AccessGrant, type AccessPortalBody, type AccessPortalSession, type AddApplicantNoteBody, type AddSourcedCandidateBody, type AddTalentListMemberBody, type Alert, type AlertBody, type Application, type ApplicationsListQuery, type ApplyAction, type ApplyApprovalPlan, type ApplyApprovalReceipt, type ApplyBody, type ApplyDecisionState, type ApplyIntent, type AudienceAttribution, type AvailableSignInMethods, Awaitable, BOARD_API_ERROR_CODES, type BindingStorage, type Block, type BlockStatus, type BlockUserBody, type BlockedUser, BlogPostsListQuery, BlogSearchBody, BlogSimilarQuery, type BoardAccessGrant, BoardApiError, type BoardApiErrorCode, type BoardAuthSession, BoardClient, BoardRequest, type BoardSdk, type BoardSitemapBucketSummary, type BoardSitemapIndex, type BoardUser, type BuiltInSignInMethod, type BulkMoveApplicantsBody, type BulkRejectApplicantsBody, type CandidateAvatar, type CandidateEducation, type CandidateExperience, type CandidateLanguage, type CandidateProfile, type CandidateSkill, type CategoryListQuery, type ClaimableCompany, CompaniesListQuery, CompaniesSearchBody, type CompanyBillingPortalBody, type CompanyBillingPortalSession, CompanyJobsListQuery, CompanyListEnvelope, CompanyMarketsListQuery, type CompanyMember, type CompanyMemberInvite, type CompanyMemberInviteAcceptance, type CompanyMemberInvitePreview, type CompanyMembership, CompanySalary, CompanySimilarQuery, type ConfirmEmailChangeBody, type ConfirmWorkEmailBody, type ConsumeMagicLinkBody, type Conversation, type ConversationArchive, type ConversationDetail, type ConversationRef, type ConversationsListQuery, type ConvertSourcedCandidateBody, type CreateAlertBody, type CreateApplyApprovalBody, type CreateApplyIntentBody, type CreateBoardClientOptions, type CreateCompanyBody, type CreateCompanyMemberInviteBody, type CreateEducationBody, type CreateEmployerJobBody, type CreateExperienceBody, type CreateJobPostingInput, type CreatePipelineStageBody, type CreateTalentListBody, CustomFieldFilter, type EditMessageBody, type EmbedJobsQuery, type EmployerApplicant, type EmployerBillingOption, type EmployerCheckout, type EmployerCheckoutBody, type EmployerCompany, type EmployerCompanySearchQuery, type EmployerJob, type EmployerJobStat, type EmployerJobStatsPoint, type EmployerJobStatsTimeseriesQuery, type EmployerJobSummary, type EmployerJobsListQuery, type EmployerPipeline, type EmployerPipelineQuery, type EmployerPipelineStage, type EmployerProfileStats, type EmployerProfileViewsPoint, type EmployerProfileViewsTimeseriesQuery, EmploymentType, FetchOptions, type FindExistingConversationQuery, type ForgotPasswordBody, type HandleAvailability, type JobAlertAnchorJob, type JobAlertConfirmation, type JobAlertDeletePreferenceInput, type JobAlertFiltersInput, type JobAlertFrequency, type JobAlertKind, type JobAlertManageQuery, type JobAlertManageResult, type JobAlertManageState, type JobAlertManageTokenInput, type JobAlertPreference, type JobAlertRemoteOption, type JobAlertResendResult, type JobAlertStoredFilters, type JobAlertSubscribeInput, type JobAlertSubscription, type JobAlertUpdatePreferenceInput, JobCapability, JobCardListEnvelope, JobCardSearchEnvelope, JobCollectionChoiceQuery, type JobPostingBillingOptions, type JobPostingBillingVerification, type JobPostingLogoResult, type JobPostingPlan, type JobPostingResult, JobRetrieveQuery, JobsListQuery, JobsSearchBody, JobsSimilarQuery, ListEnvelope, type LocationResolveInput, type LocationSearchQuery, Logger, type LoginBody, type LogoutBody, type MarketingConsent, type MembershipCheckoutBody, type MembershipCheckoutSession, type MembershipCheckoutSessionState, type Message, type ModerationReport, type MoveApplicantStageBody, type NotificationPreference, type OAuthAuthorizationQuery, type OAuthAuthorizationUrl, type OAuthCompletion, type OAuthExchangeBody, type OAuthProvider, ObjectReferenceFilter, PURCHASE_CONFIRMATION_HEADER, type Paginator, type PaywallOffer, type PaywallOfferListEnvelope, type PlaceSuggestQuery, type PlacesListQuery, type Plan, type PlanListEnvelope, type PlansListQuery, type PreviewCompanyMemberInviteBody, type Product, type ProductCard, type ProductCardListEnvelope, type ProductCheckout, type ProductCheckoutBody, type ProductCheckoutStatus, type ProductDetailRow, type ProductPrice, type ProductQuestion, type ProductReview, type ProductReviewListEnvelope, type ProductReviewsQuery, type ProductsListQuery, type ProfileChoiceList, type ProfileChoiceQuery, type ProfileFieldEntity, type ProfileFieldValues, type ProfileObjectReferenceSelectionWrite, type ProfileObjectReferences, type PublicLocation, type PublicPlace, type PublicProfileFields, type PublicTaxonomyTerm, type Purchase, type PurchaseConfirmation, type PurchaseDownload, type PurchaseDownloadAll, type PurchaseRequestOptions, type PurchaseResendBody, type PurchaseResendResult, type PurchaseReviewBody, type PurchaseReviewResult, type PurchaseSummary, type PurchaseSummaryListEnvelope, type ReadReceipt, type RecommendedJob, type RecommendedJobsListQuery, type RecommendedTalent, type RecommendedTalentListQuery, type RedirectResolution, type RefreshBody, type RegisterBody, RemoteOption, type RemotePermitTaxonomyEntry, type ReorderPipelineStagesBody, type ReplaceProfileObjectReferencesBody, type ReplyBody, type ReportBody, type RequestEmailChangeBody, type RequestMagicLinkBody, type ResetPasswordBody, type Resume, type ResumeUploadOptions, SDK_VERSION, SIGN_IN_REDIRECT_ERROR_CODES, SSO_LINK_PROOF_BINDING_TTL_MS, SalaryDetailQuery, type SalesLedPlan, type SalesLedPlanListEnvelope, type SaveJobBody, type SavedJob, type SavedJobsListQuery, SearchEnvelope, SearchSuggestQuery, type SendWorkEmailBody, Seniority, type SignInRedirectErrorCode, type SignInRole, type SitemapEntriesEnvelope, type SitemapEntriesQuery, type SitemapEntry, type SourcedCandidate, type SsoAuthorizationQuery, type SsoAuthorizationUrl, type SsoLinkProofBindingStore, type SsoLinkProofBody, type StartAboutApplicationBody, type StartConversationBody, StorageMode, type TalentAccess, type TalentAccessCheckoutBody, type TalentAccessCheckoutSession, type TalentAccessCheckoutSessionState, type TalentAccessClaim, type TalentAccessClaimBody, type TalentAccessUpgrade, type TalentAccessUpgradeBody, type TalentCandidateAccess, type TalentDirectoryEntry, type TalentDirectoryListEnvelope, type TalentDirectoryQuery, type TalentList, type TalentListFilters, type TalentListMember, type TalentListMembersListEnvelope, type TalentListMembersQuery, type TalentListMembership, type TalentPlace, type TalentPlacesListEnvelope, type TalentPlacesQuery, type TalentProfile, type TalentUnlock, type TalentUnlockBody, type TaxonomyGeo, type TaxonomyListQuery, type TaxonomyResolution, type ThreadMessagesQuery, type UnreadCount, type UnsubscribeBody, type UpdateApplicationFactsBody, type UpdateCandidateProfileBody, type UpdateCompanyMemberRoleBody, type UpdateEducationBody, type UpdateEmployerCompanyBody, type UpdateEmployerJobBody, type UpdateExperienceBody, type UpdateLanguagesBody, type UpdateNotificationPreferenceBody, type UpdatePasswordBody, type UpdatePipelineStageBody, type UpdateProfileFieldValuesBody, type UpdateResumeBody, type UpdateSkillsBody, type UpdateTalentListBody, type VerifyEmailBody, createBoardClient, isBoardApiError, isBoardPasswordRequired, isColdRule, isConflict, isForbidden, isFreeEmailWebsiteError, isNotFound, isOwnMessage, isRateLimited, isSafeApplicationUrl, isSignInMethodUnavailable, isSsoBrowserMismatch, isSsoRequired, isUnauthorized, isValidationError, lastOwnMessageId, paginate, parseOAuthCompletion, resolveApplyAction, resolveApplyDecision, ssoLinkProofBindingStore };
package/dist/index.js CHANGED
@@ -25,6 +25,7 @@ __export(src_exports, {
25
25
  BOARD_API_ERROR_CODES: () => BOARD_API_ERROR_CODES,
26
26
  BoardApiError: () => BoardApiError,
27
27
  BoardClient: () => BoardClient,
28
+ PURCHASE_CONFIRMATION_HEADER: () => PURCHASE_CONFIRMATION_HEADER,
28
29
  REFRESH_TOKEN_KEY: () => REFRESH_TOKEN_KEY,
29
30
  SDK_VERSION: () => SDK_VERSION,
30
31
  SIGN_IN_REDIRECT_ERROR_CODES: () => SIGN_IN_REDIRECT_ERROR_CODES,
@@ -232,7 +233,31 @@ var BOARD_API_ERROR_CODES = [
232
233
  // Public job posting
233
234
  "job_posting_logo_lookup_unavailable",
234
235
  "job_posting_logo_not_found",
235
- "job_posting_rejected"
236
+ "job_posting_rejected",
237
+ // Digital products and purchases
238
+ "products_not_found",
239
+ "product_checkout_not_found",
240
+ "product_reviews_disabled",
241
+ "product_sold_out",
242
+ "product_email_invalid",
243
+ "product_email_blocked",
244
+ "product_amount_below_minimum",
245
+ "product_amount_invalid",
246
+ "product_answers_invalid",
247
+ "purchases_not_found",
248
+ "purchase_file_not_found",
249
+ "purchase_unavailable",
250
+ "purchase_access_removed",
251
+ "purchase_awaiting_payment",
252
+ "purchase_refunded",
253
+ "purchase_email_confirmation_required",
254
+ "purchase_email_mismatch",
255
+ "purchase_file_preparing",
256
+ // A permanent per-file cap (409), not a rate limit: `isRateLimited` is
257
+ // false for it, and retrying never helps.
258
+ "purchase_download_limit_reached",
259
+ "purchase_review_invalid",
260
+ "purchase_download_all_unavailable"
236
261
  ];
237
262
  var BoardApiError = class extends Error {
238
263
  status;
@@ -405,7 +430,7 @@ async function clearSession(storage) {
405
430
  }
406
431
 
407
432
  // src/version.ts
408
- var SDK_VERSION = "4.56.1";
433
+ var SDK_VERSION = "4.57.0";
409
434
 
410
435
  // src/client.ts
411
436
  function isRawBody(body) {
@@ -3767,6 +3792,84 @@ function plansNamespace(client) {
3767
3792
  };
3768
3793
  }
3769
3794
 
3795
+ // src/namespaces/products.ts
3796
+ var productBase = (slug) => `/products/${encodeURIComponent(slug)}`;
3797
+ function productsNamespace(client) {
3798
+ return {
3799
+ /**
3800
+ * List the board's listed digital products. Filter with `price`,
3801
+ * search with `q`, sort with `sort`, page with `cursor`.
3802
+ *
3803
+ * @example
3804
+ * const { data, nextCursor } = await board.products.list({ price: 'free' });
3805
+ */
3806
+ list(query, options) {
3807
+ return client.fetch("/products", {
3808
+ ...options,
3809
+ query
3810
+ });
3811
+ },
3812
+ /**
3813
+ * A product page by slug. Unlisted products answer by their exact slug
3814
+ * with `isListed: false`: keep those out of listings and sitemaps.
3815
+ *
3816
+ * @example
3817
+ * const product = await board.products.get('salary-guide');
3818
+ */
3819
+ get(slug, options) {
3820
+ return client.fetch(productBase(slug), options);
3821
+ },
3822
+ /**
3823
+ * A product's visible reviews, newest first. Empty when ratings are off.
3824
+ *
3825
+ * @example
3826
+ * const { data } = await board.products.reviews('salary-guide');
3827
+ */
3828
+ reviews(slug, query, options) {
3829
+ return client.fetch(
3830
+ `${productBase(slug)}/reviews`,
3831
+ { ...options, query }
3832
+ );
3833
+ },
3834
+ /**
3835
+ * Buy or claim a product. A free product returns `status: 'complete'`
3836
+ * with the download page path in `downloadUrl`; a paid one returns
3837
+ * `status: 'open'` with an embedded Stripe Checkout mount kit (it
3838
+ * expires after 30 minutes). Signed in, the purchase also lands in
3839
+ * `purchases.mine()`.
3840
+ *
3841
+ * @example
3842
+ * const result = await board.products.checkout('salary-guide', {
3843
+ * email: 'ada@example.com',
3844
+ * answers: [],
3845
+ * });
3846
+ * if (result.status === 'complete') redirect(result.downloadUrl!);
3847
+ */
3848
+ checkout(slug, body, options) {
3849
+ return client.fetch(`${productBase(slug)}/checkout`, {
3850
+ ...options,
3851
+ method: "POST",
3852
+ body
3853
+ });
3854
+ },
3855
+ /**
3856
+ * After Stripe returns the buyer (`session_id` on the return URL):
3857
+ * `awaiting_payment` until the payment lands, then `paid` with
3858
+ * `downloadUrl`. Poll briefly.
3859
+ *
3860
+ * @example
3861
+ * const s = await board.products.getCheckout('salary-guide', sessionId);
3862
+ * if (s.downloadUrl) redirect(s.downloadUrl);
3863
+ */
3864
+ getCheckout(slug, sessionId, options) {
3865
+ return client.fetch(
3866
+ `${productBase(slug)}/checkout/${encodeURIComponent(sessionId)}`,
3867
+ options
3868
+ );
3869
+ }
3870
+ };
3871
+ }
3872
+
3770
3873
  // src/namespaces/profile-fields.ts
3771
3874
  function profileFieldsNamespace(client) {
3772
3875
  return {
@@ -3787,6 +3890,125 @@ function profileFieldsNamespace(client) {
3787
3890
  };
3788
3891
  }
3789
3892
 
3893
+ // src/namespaces/purchases.ts
3894
+ var PURCHASE_CONFIRMATION_HEADER = "x-cavuno-purchase-confirmation";
3895
+ var purchaseBase = (token) => `/purchases/${encodeURIComponent(token)}`;
3896
+ function withConfirmation(options) {
3897
+ if (!options) return {};
3898
+ const { confirmationToken, ...rest } = options;
3899
+ if (!confirmationToken) return rest;
3900
+ const headers = new Headers(rest.headers);
3901
+ headers.set(PURCHASE_CONFIRMATION_HEADER, confirmationToken);
3902
+ return { ...rest, headers };
3903
+ }
3904
+ function purchasesNamespace(client) {
3905
+ return {
3906
+ /**
3907
+ * Open a purchase's download page by its token. A shared link asks for
3908
+ * the purchase email (`purchase_email_confirmation_required`, 403): call
3909
+ * `confirmEmail`, keep the `confirmationToken` it returns, and pass it
3910
+ * back on later calls.
3911
+ *
3912
+ * @example
3913
+ * const purchase = await board.purchases.get(token, { confirmationToken });
3914
+ */
3915
+ get(token, options) {
3916
+ return client.fetch(
3917
+ purchaseBase(token),
3918
+ withConfirmation(options)
3919
+ );
3920
+ },
3921
+ /**
3922
+ * Confirm the purchase email on a shared link. Returns the
3923
+ * `confirmationToken` to pass on later calls for this purchase.
3924
+ *
3925
+ * @example
3926
+ * const { confirmationToken } = await board.purchases.confirmEmail(token, {
3927
+ * email: 'ada@example.com',
3928
+ * });
3929
+ */
3930
+ confirmEmail(token, body, options) {
3931
+ return client.fetch(
3932
+ `${purchaseBase(token)}/confirm`,
3933
+ { ...options, method: "POST", body }
3934
+ );
3935
+ },
3936
+ /**
3937
+ * Count one download of a file and get a signed, short-lived link.
3938
+ * `purchase_file_preparing` (409) while the buyer's stamped copy is made
3939
+ * (they are emailed when it is ready); `purchase_download_limit_reached`
3940
+ * (409) when no downloads are left (only the board can reset it).
3941
+ *
3942
+ * @example
3943
+ * const { url } = await board.purchases.download(token, fileId);
3944
+ */
3945
+ download(token, fileId, options) {
3946
+ return client.fetch(
3947
+ `${purchaseBase(token)}/files/${encodeURIComponent(fileId)}/download`,
3948
+ { ...withConfirmation(options), method: "POST" }
3949
+ );
3950
+ },
3951
+ /**
3952
+ * Count every ready file and get a short-lived link to one streamed ZIP.
3953
+ * Offer it only while the page's `downloadAllAvailable` is true: files
3954
+ * totalling more than 500 MB are refused, with nothing counted, as
3955
+ * `409 purchase_download_all_unavailable` (download them one by one).
3956
+ *
3957
+ * @example
3958
+ * const { url } = await board.purchases.downloadAll(token);
3959
+ */
3960
+ downloadAll(token, options) {
3961
+ return client.fetch(
3962
+ `${purchaseBase(token)}/download-all`,
3963
+ { ...withConfirmation(options), method: "POST" }
3964
+ );
3965
+ },
3966
+ /**
3967
+ * Write or replace the buyer's review (1 to 5 stars).
3968
+ *
3969
+ * @example
3970
+ * await board.purchases.review(token, { stars: 5, comment: 'Useful' });
3971
+ */
3972
+ review(token, body, options) {
3973
+ return client.fetch(
3974
+ `${purchaseBase(token)}/review`,
3975
+ {
3976
+ ...withConfirmation(options),
3977
+ method: "PUT",
3978
+ body
3979
+ }
3980
+ );
3981
+ },
3982
+ /**
3983
+ * "Email me this link again". Always accepted, whether or not the email
3984
+ * holds a purchase.
3985
+ *
3986
+ * @example
3987
+ * await board.purchases.resend({ email: 'ada@example.com' });
3988
+ */
3989
+ resend(body, options) {
3990
+ return client.fetch("/purchases/resend", {
3991
+ ...options,
3992
+ method: "POST",
3993
+ body
3994
+ });
3995
+ },
3996
+ /**
3997
+ * The signed-in user's purchases (by account and verified email), each
3998
+ * with its download page path. Requires a board user session.
3999
+ *
4000
+ * @example
4001
+ * const { data } = await board.purchases.mine();
4002
+ */
4003
+ mine(options) {
4004
+ return client.fetch(
4005
+ "/me/purchases",
4006
+ options
4007
+ );
4008
+ }
4009
+ };
4010
+ }
4011
+
3790
4012
  // src/namespaces/redirects.ts
3791
4013
  function redirectsNamespace(client) {
3792
4014
  return {
@@ -4251,6 +4473,8 @@ function createBoardClient(options) {
4251
4473
  profileFields: profileFieldsNamespace(client),
4252
4474
  plans: plansNamespace(client),
4253
4475
  paywall: paywallNamespace(client),
4476
+ products: productsNamespace(client),
4477
+ purchases: purchasesNamespace(client),
4254
4478
  sitemap: sitemapNamespace(client)
4255
4479
  };
4256
4480
  }