@cavuno/board 4.8.0 → 4.9.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 (47) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/{_spec-DePC7a05.d.mts → _spec-B9Ah8dNs.d.mts} +35 -0
  3. package/dist/{_spec-DePC7a05.d.ts → _spec-B9Ah8dNs.d.ts} +35 -0
  4. package/dist/bin.mjs +174 -19
  5. package/dist/{blog-DbFr4VPW.d.mts → blog-BmqWfLZi.d.mts} +1 -1
  6. package/dist/{blog-ummlt6Uq.d.ts → blog-bh07fZ8Q.d.ts} +1 -1
  7. package/dist/{board-zWyHbyi4.d.ts → board-B4jLqmxn.d.mts} +5 -3
  8. package/dist/{board-DxTMBgIf.d.mts → board-De8nLbk7.d.ts} +5 -3
  9. package/dist/{breadcrumbs-kbmspmfk.d.ts → breadcrumbs-B1HVufC7.d.ts} +2 -2
  10. package/dist/{breadcrumbs-P4qh0zML.d.mts → breadcrumbs-BVQL2dNY.d.mts} +2 -2
  11. package/dist/browser/cavuno-board.global.min.js +1 -1
  12. package/dist/{chunk-IWWPHFK2.mjs → chunk-T46JASKG.mjs} +3 -0
  13. package/dist/doctor.d.mts +3 -1
  14. package/dist/doctor.d.ts +3 -1
  15. package/dist/doctor.js +169 -17
  16. package/dist/doctor.mjs +169 -17
  17. package/dist/filters.d.mts +2 -2
  18. package/dist/filters.d.ts +2 -2
  19. package/dist/format.d.mts +4 -4
  20. package/dist/format.d.ts +4 -4
  21. package/dist/index.d.mts +45 -23
  22. package/dist/index.d.ts +45 -23
  23. package/dist/index.js +10 -6
  24. package/dist/index.mjs +8 -7
  25. package/dist/{jobs-DTLDt57G.d.mts → jobs-B7q3BgIK.d.mts} +1 -1
  26. package/dist/{jobs-twt5TO9l.d.ts → jobs-Iv6Wkvvf.d.ts} +1 -1
  27. package/dist/{search-CHD6peIl.d.ts → search-CbDZwdyl.d.ts} +1 -1
  28. package/dist/{search-f2UNlTfv.d.mts → search-DC0jatQN.d.mts} +1 -1
  29. package/dist/seo-BDFUuvXM.d.ts +12 -0
  30. package/dist/seo-HCE7aCkh.d.mts +12 -0
  31. package/dist/seo-files.d.mts +36 -0
  32. package/dist/seo-files.d.ts +36 -0
  33. package/dist/seo-files.js +102 -0
  34. package/dist/seo-files.mjs +81 -0
  35. package/dist/seo.d.mts +6 -6
  36. package/dist/seo.d.ts +6 -6
  37. package/dist/server.d.mts +6 -5
  38. package/dist/server.d.ts +6 -5
  39. package/dist/server.mjs +1 -1
  40. package/dist/sitemap.d.mts +6 -5
  41. package/dist/sitemap.d.ts +6 -5
  42. package/dist/suggest.d.mts +2 -2
  43. package/dist/suggest.d.ts +2 -2
  44. package/package.json +11 -1
  45. package/skills/cavuno-board-account/SKILL.md +3 -1
  46. package/skills/cavuno-board-filters/SKILL.md +17 -3
  47. package/skills/manifest.json +1 -1
package/dist/index.d.ts CHANGED
@@ -1,12 +1,13 @@
1
- import { S as Schemas, c as components } from './_spec-DePC7a05.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-CHD6peIl.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-CHD6peIl.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-zWyHbyi4.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 PublicBoardAnalytics, r as PublicBoardFeatures, s as PublicCompany, t as PublicCompanyDetail, u as SalaryCompany, v as SalaryLocation, w as SalarySkill, x as SalaryTitle, y as SkillLocationSalary, z as SkillLocationsIndex, S as SkillSalaryDetail, A as TitleLocationSalary, B as TitleLocationsIndex, T as TitleSalaryDetail } from './board-zWyHbyi4.js';
6
- 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-twt5TO9l.js';
7
- 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-twt5TO9l.js';
8
- import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-ummlt6Uq.js';
9
- export { B as BlogAuthorEmbed, d as BlogTagEmbed, e as PublicBlogAdjacentPosts, f as PublicBlogAuthor, g as PublicBlogPost, P as PublicBlogPostSummary, h as PublicBlogTag } from './blog-ummlt6Uq.js';
1
+ import { S as Schemas, c as components } from './_spec-B9Ah8dNs.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-CbDZwdyl.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-CbDZwdyl.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-De8nLbk7.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-De8nLbk7.js';
6
+ export { B as BoardSeo } from './seo-BDFUuvXM.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-Iv6Wkvvf.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-Iv6Wkvvf.js';
9
+ import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-bh07fZ8Q.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-bh07fZ8Q.js';
10
11
 
11
12
  /**
12
13
  * Well-known `<domain>_<snake_reason>` codes the Board API sends, grouped by
@@ -19,7 +20,7 @@ export { B as BlogAuthorEmbed, d as BlogTagEmbed, e as PublicBlogAdjacentPosts,
19
20
  * `unknown_error` is SDK-synthesized when a response carries no parseable
20
21
  * envelope.
21
22
  */
22
- 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_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_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", "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", "paywall_already_active", "paywall_disabled", "paywall_invalid_checkout_session", "paywall_no_candidate_profile", "paywall_no_recurring_subscription", "paywall_offer_not_found", "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_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", "paywall_already_active", "paywall_disabled", "paywall_invalid_checkout_session", "paywall_no_candidate_profile", "paywall_no_recurring_subscription", "paywall_offer_not_found", "job_posting_logo_lookup_unavailable", "job_posting_logo_not_found", "job_posting_rejected"];
23
24
  /**
24
25
  * The known code set plus open string — new codes ship additively within v1,
25
26
  * so exhaustive narrowing is intentionally impossible.
@@ -142,7 +143,7 @@ declare function paginate<Q extends Record<string, unknown>, P extends PageShape
142
143
  * constant because the package is platform-neutral and cannot read
143
144
  * package.json at runtime.
144
145
  */
145
- declare const SDK_VERSION = "4.8.0";
146
+ declare const SDK_VERSION = "4.9.0";
146
147
 
147
148
  type SavedJob = Schemas['SavedJob'];
148
149
  type SavedJobsListQuery = {
@@ -468,15 +469,6 @@ type OAuthAuthorizationQuery = {
468
469
  type OAuthAuthorizationUrl = Schemas['BoardAuthOAuthAuthorizationUrl'];
469
470
  type OAuthExchangeBody = Schemas['BoardAuthOAuthExchangeBody'];
470
471
 
471
- /**
472
- * The public SEO-infra payload (`board.seo()`) — platform infrastructure a
473
- * headless frontend rebuilds `robots.txt` / `ads.txt` / `indexnow-key.txt`
474
- * (+ the Google site-verification `<meta>`) from, byte-identically to the
475
- * hosted board. Icons and `themeColor` left in 4.0.0; applications
476
- * own brand assets and presentation tokens.
477
- */
478
- type BoardSeo = Schemas['BoardSeo'];
479
-
480
472
  type EmbedJobsQuery = {
481
473
  /** Free-text search query, up to 200 characters. */
482
474
  q?: string;
@@ -689,6 +681,8 @@ type TaxonomyListQuery = {
689
681
  q?: string;
690
682
  cursor?: string;
691
683
  limit?: number;
684
+ /** `name` (default) or `jobCount` (highest published-job count first). */
685
+ sort?: 'name' | 'jobCount';
692
686
  };
693
687
  /**
694
688
  * Query for `taxonomy.places.list()`. Omit it (or `q`) for the full
@@ -740,10 +734,11 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
740
734
  client: BoardClient;
741
735
  /**
742
736
  * Board context — identity, brand (`logoUrl` + favicon `icons`), language,
743
- * features, and analytics.
737
+ * features, analytics, and AdSense (`ads.enabled` + `ads.clientId`).
738
+ * Per-placement slot ids are not on this resource.
744
739
  *
745
740
  * @example
746
- * const { name, language, logoUrl, icons } = await board.context();
741
+ * const { name, language, logoUrl, icons, ads } = await board.context();
747
742
  */
748
743
  context(options?: FetchOptions): Promise<{
749
744
  object: "public_board";
@@ -764,6 +759,8 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
764
759
  showCavunoBranding: boolean;
765
760
  features: {
766
761
  jobAlerts: boolean;
762
+ jobRecommendationsEnabled: boolean;
763
+ recommendedTalentEnabled: boolean;
767
764
  candidates: boolean;
768
765
  employers: boolean;
769
766
  blog: boolean;
@@ -783,9 +780,27 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
783
780
  linkedInPartnerId: string | null;
784
781
  cookieConsentRequired: boolean;
785
782
  };
783
+ ads: {
784
+ enabled: boolean;
785
+ clientId: string | null;
786
+ };
786
787
  customFields: {
787
788
  job: components["schemas"]["CustomFieldDefinition"][];
788
789
  };
790
+ jobForm: {
791
+ salary: {
792
+ visible: boolean;
793
+ };
794
+ seniority: {
795
+ visible: boolean;
796
+ };
797
+ location: {
798
+ visible: boolean;
799
+ };
800
+ sponsorship: {
801
+ visible: boolean;
802
+ };
803
+ };
789
804
  contact: {
790
805
  email: string | null;
791
806
  websiteUrl: string | null;
@@ -1580,12 +1595,14 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1580
1595
  object: "notification_preference";
1581
1596
  channel: "messageEmails" | "applicationEmails" | "recommendedJobEmails";
1582
1597
  subscribed: boolean;
1598
+ waitlisted: boolean;
1583
1599
  updatedAt: number | null;
1584
1600
  }>>;
1585
1601
  update(body: UpdateNotificationPreferenceBody, options?: FetchOptions): Promise<ListEnvelope<{
1586
1602
  object: "notification_preference";
1587
1603
  channel: "messageEmails" | "applicationEmails" | "recommendedJobEmails";
1588
1604
  subscribed: boolean;
1605
+ waitlisted: boolean;
1589
1606
  updatedAt: number | null;
1590
1607
  }>>;
1591
1608
  unsubscribeWithToken(body: UnsubscribeBody, options?: FetchOptions): Promise<void>;
@@ -1656,6 +1673,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1656
1673
  linkedinUrl: string | null;
1657
1674
  facebookUrl: string | null;
1658
1675
  logoUrl: string | null;
1676
+ deletionEnabled: boolean;
1659
1677
  }>;
1660
1678
  update(slug: string, body: UpdateEmployerCompanyBody, options?: FetchOptions): Promise<{
1661
1679
  id: string;
@@ -1669,6 +1687,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1669
1687
  linkedinUrl: string | null;
1670
1688
  facebookUrl: string | null;
1671
1689
  logoUrl: string | null;
1690
+ deletionEnabled: boolean;
1672
1691
  }>;
1673
1692
  delete(slug: string, options?: FetchOptions): Promise<void>;
1674
1693
  listMembers(slug: string, options?: FetchOptions): Promise<ListEnvelope<{
@@ -1711,6 +1730,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
1711
1730
  linkedinUrl: string | null;
1712
1731
  facebookUrl: string | null;
1713
1732
  logoUrl: string | null;
1733
+ deletionEnabled: boolean;
1714
1734
  }>;
1715
1735
  workEmail: {
1716
1736
  verify(slug: string, body: SendWorkEmailBody, options?: FetchOptions): Promise<{
@@ -2488,6 +2508,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
2488
2508
  sourceSlug: string;
2489
2509
  canonicalSlug: string;
2490
2510
  displayName: string;
2511
+ jobCount: number;
2491
2512
  }>>;
2492
2513
  resolve(slug: string, options?: FetchOptions): Promise<{
2493
2514
  object: "taxonomy_resolution";
@@ -2507,6 +2528,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
2507
2528
  sourceSlug: string;
2508
2529
  canonicalSlug: string;
2509
2530
  displayName: string;
2531
+ jobCount: number;
2510
2532
  }>>;
2511
2533
  resolve(slug: string, options?: FetchOptions): Promise<{
2512
2534
  object: "taxonomy_resolution";
@@ -3187,4 +3209,4 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
3187
3209
  };
3188
3210
  type BoardSdk = ReturnType<typeof createBoardClient>;
3189
3211
 
3190
- export { type AcceptCompanyMemberInviteBody, type AccessCheckoutBody, type AccessCheckoutSession, type AccessCheckoutSessionState, type AccessGrant, type AccessPortalBody, type AccessPortalSession, type AddApplicantNoteBody, type Alert, type AlertBody, type Application, type ApplicationsListQuery, type ApplyAction, type ApplyApprovalPlan, type ApplyApprovalReceipt, type ApplyBody, type ApplyIntent, Awaitable, BOARD_API_ERROR_CODES, type Block, type BlockStatus, type BlockUserBody, type BlockedUser, BlogPostsListQuery, BlogSearchBody, BlogSimilarQuery, type BoardAccessGrant, BoardApiError, type BoardApiErrorCode, type BoardAuthSession, BoardClient, BoardRequest, type BoardSdk, type BoardSeo, type BoardUser, type BulkMoveApplicantsBody, type BulkRejectApplicantsBody, type CandidateAvatar, type CandidateEducation, type CandidateExperience, type CandidateLanguage, type CandidateProfile, type CandidateSkill, type ClaimableCompany, CompaniesListQuery, CompaniesSearchBody, CompanyJobsListQuery, CompanyListEnvelope, CompanyMarketsListQuery, type CompanyMember, type CompanyMemberInvite, type CompanyMemberInviteAcceptance, type CompanyMembership, CompanySimilarQuery, type ConfirmEmailChangeBody, type ConfirmWorkEmailBody, type ConsumeMagicLinkBody, type Conversation, type ConversationArchive, type ConversationDetail, type ConversationRef, type ConversationsListQuery, type CreateApplyApprovalBody, type CreateApplyIntentBody, type CreateBoardClientOptions, type CreateCompanyBody, type CreateCompanyMemberInviteBody, type CreateEducationBody, type CreateEmployerJobBody, type CreateExperienceBody, type CreateJobPostingInput, type CreatePipelineStageBody, 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 JobAlertConfirmation, type JobAlertDeletePreferenceInput, type JobAlertFiltersInput, type JobAlertFrequency, type JobAlertManageQuery, type JobAlertManageResult, type JobAlertManageState, type JobAlertManageTokenInput, type JobAlertPreference, type JobAlertRemoteOption, type JobAlertResendResult, type JobAlertStoredFilters, type JobAlertSubscribeInput, type JobAlertSubscription, type JobAlertUpdatePreferenceInput, JobCardListEnvelope, JobCardSearchEnvelope, type JobPostingBillingOptions, type JobPostingBillingVerification, type JobPostingLogoResult, type JobPostingPlan, type JobPostingResult, JobsListQuery, JobsSearchBody, JobsSimilarQuery, ListEnvelope, Logger, type LoginBody, type LogoutBody, type MarketingConsent, type Message, type ModerationReport, type MoveApplicantStageBody, type NotificationPreference, type OAuthAuthorizationQuery, type OAuthAuthorizationUrl, type OAuthExchangeBody, type OAuthProvider, type Paginator, type PaywallOffer, type PaywallOfferListEnvelope, type PlacesListQuery, type Plan, type PlanListEnvelope, type PlansListQuery, type PublicPlace, type PublicTaxonomyTerm, type ReadReceipt, type RecommendedJob, type RecommendedJobsListQuery, type RecommendedTalent, type RecommendedTalentListQuery, type RedirectResolution, type RefreshBody, type RegisterBody, RemoteOption, type RemotePermitTaxonomyEntry, type ReorderPipelineStagesBody, type ReplyBody, type ReportBody, type RequestEmailChangeBody, type RequestMagicLinkBody, type ResetPasswordBody, type Resume, type ResumeUploadOptions, SDK_VERSION, SalaryDetailQuery, type SalesLedPlan, type SalesLedPlanListEnvelope, type SaveJobBody, type SavedJob, type SavedJobsListQuery, SearchEnvelope, SearchSuggestQuery, type SendWorkEmailBody, Seniority, type StartAboutApplicationBody, type StartConversationBody, StorageMode, type TalentAccess, type TalentDirectoryEntry, type TalentDirectoryListEnvelope, type TalentDirectoryQuery, type TalentProfile, 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 UpdateSkillsBody, type VerifyEmailBody, createBoardClient, isBoardApiError, isBoardPasswordRequired, isColdRule, isConflict, isForbidden, isNotFound, isOwnMessage, isRateLimited, isSafeApplicationUrl, isUnauthorized, isValidationError, lastOwnMessageId, paginate, resolveApplyAction };
3212
+ export { type AcceptCompanyMemberInviteBody, type AccessCheckoutBody, type AccessCheckoutSession, type AccessCheckoutSessionState, type AccessGrant, type AccessPortalBody, type AccessPortalSession, type AddApplicantNoteBody, type Alert, type AlertBody, type Application, type ApplicationsListQuery, type ApplyAction, type ApplyApprovalPlan, type ApplyApprovalReceipt, type ApplyBody, type ApplyIntent, Awaitable, BOARD_API_ERROR_CODES, type Block, type BlockStatus, type BlockUserBody, type BlockedUser, BlogPostsListQuery, BlogSearchBody, BlogSimilarQuery, type BoardAccessGrant, BoardApiError, type BoardApiErrorCode, type BoardAuthSession, BoardClient, BoardRequest, type BoardSdk, type BoardUser, type BulkMoveApplicantsBody, type BulkRejectApplicantsBody, type CandidateAvatar, type CandidateEducation, type CandidateExperience, type CandidateLanguage, type CandidateProfile, type CandidateSkill, type ClaimableCompany, CompaniesListQuery, CompaniesSearchBody, CompanyJobsListQuery, CompanyListEnvelope, CompanyMarketsListQuery, type CompanyMember, type CompanyMemberInvite, type CompanyMemberInviteAcceptance, type CompanyMembership, CompanySimilarQuery, type ConfirmEmailChangeBody, type ConfirmWorkEmailBody, type ConsumeMagicLinkBody, type Conversation, type ConversationArchive, type ConversationDetail, type ConversationRef, type ConversationsListQuery, type CreateApplyApprovalBody, type CreateApplyIntentBody, type CreateBoardClientOptions, type CreateCompanyBody, type CreateCompanyMemberInviteBody, type CreateEducationBody, type CreateEmployerJobBody, type CreateExperienceBody, type CreateJobPostingInput, type CreatePipelineStageBody, 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 JobAlertConfirmation, type JobAlertDeletePreferenceInput, type JobAlertFiltersInput, type JobAlertFrequency, type JobAlertManageQuery, type JobAlertManageResult, type JobAlertManageState, type JobAlertManageTokenInput, type JobAlertPreference, type JobAlertRemoteOption, type JobAlertResendResult, type JobAlertStoredFilters, type JobAlertSubscribeInput, type JobAlertSubscription, type JobAlertUpdatePreferenceInput, JobCardListEnvelope, JobCardSearchEnvelope, type JobPostingBillingOptions, type JobPostingBillingVerification, type JobPostingLogoResult, type JobPostingPlan, type JobPostingResult, JobsListQuery, JobsSearchBody, JobsSimilarQuery, ListEnvelope, Logger, type LoginBody, type LogoutBody, type MarketingConsent, type Message, type ModerationReport, type MoveApplicantStageBody, type NotificationPreference, type OAuthAuthorizationQuery, type OAuthAuthorizationUrl, type OAuthExchangeBody, type OAuthProvider, type Paginator, type PaywallOffer, type PaywallOfferListEnvelope, type PlacesListQuery, type Plan, type PlanListEnvelope, type PlansListQuery, type PublicPlace, type PublicTaxonomyTerm, type ReadReceipt, type RecommendedJob, type RecommendedJobsListQuery, type RecommendedTalent, type RecommendedTalentListQuery, type RedirectResolution, type RefreshBody, type RegisterBody, RemoteOption, type RemotePermitTaxonomyEntry, type ReorderPipelineStagesBody, type ReplyBody, type ReportBody, type RequestEmailChangeBody, type RequestMagicLinkBody, type ResetPasswordBody, type Resume, type ResumeUploadOptions, SDK_VERSION, SalaryDetailQuery, type SalesLedPlan, type SalesLedPlanListEnvelope, type SaveJobBody, type SavedJob, type SavedJobsListQuery, SearchEnvelope, SearchSuggestQuery, type SendWorkEmailBody, Seniority, type StartAboutApplicationBody, type StartConversationBody, StorageMode, type TalentAccess, type TalentDirectoryEntry, type TalentDirectoryListEnvelope, type TalentDirectoryQuery, type TalentProfile, 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 UpdateSkillsBody, type VerifyEmailBody, createBoardClient, isBoardApiError, isBoardPasswordRequired, isColdRule, isConflict, isForbidden, isNotFound, isOwnMessage, isRateLimited, isSafeApplicationUrl, isUnauthorized, isValidationError, lastOwnMessageId, paginate, resolveApplyAction };
package/dist/index.js CHANGED
@@ -104,6 +104,8 @@ var BOARD_API_ERROR_CODES = [
104
104
  "talent_not_found",
105
105
  "talent_directory_not_found",
106
106
  "talent_directory_restricted",
107
+ "job_recommendations_not_found",
108
+ "recommended_talent_not_found",
107
109
  // Job alerts (anonymous + authenticated)
108
110
  "job_alert_not_found",
109
111
  "job_alerts_disabled",
@@ -113,6 +115,7 @@ var BOARD_API_ERROR_CODES = [
113
115
  "candidate_entry_not_found",
114
116
  "candidate_handle_taken",
115
117
  "candidate_job_not_found",
118
+ "candidate_notification_preference_paused",
116
119
  "resume_invalid_file",
117
120
  "resume_upload_forbidden",
118
121
  // Applications
@@ -332,7 +335,7 @@ async function clearSession(storage) {
332
335
  }
333
336
 
334
337
  // src/version.ts
335
- var SDK_VERSION = "4.8.0";
338
+ var SDK_VERSION = "4.9.0";
336
339
 
337
340
  // src/client.ts
338
341
  function isRawBody(body) {
@@ -1111,9 +1114,9 @@ function jobsNamespace(client) {
1111
1114
  );
1112
1115
  },
1113
1116
  /**
1114
- * Create an opaque external-apply intent. A compatible starter then makes
1115
- * its own board-local POST return a browser 303 to `gatewayUrl`; do not
1116
- * render this value as a crawlable link. Pass
1117
+ * Create an opaque external-apply intent. A compatible starter sends the
1118
+ * candidate's browser to `gatewayUrl` (or asks it for the canonical JSON
1119
+ * decision after a real Apply click); never render it as a crawlable link. Pass
1117
1120
  * `x-cavuno-board-capabilities: apply-gateway-v1` in `options.headers`;
1118
1121
  * legacy callers receive 404.
1119
1122
  */
@@ -3127,10 +3130,11 @@ function createBoardClient(options) {
3127
3130
  client,
3128
3131
  /**
3129
3132
  * Board context — identity, brand (`logoUrl` + favicon `icons`), language,
3130
- * features, and analytics.
3133
+ * features, analytics, and AdSense (`ads.enabled` + `ads.clientId`).
3134
+ * Per-placement slot ids are not on this resource.
3131
3135
  *
3132
3136
  * @example
3133
- * const { name, language, logoUrl, icons } = await board.context();
3137
+ * const { name, language, logoUrl, icons, ads } = await board.context();
3134
3138
  */
3135
3139
  context(options2) {
3136
3140
  return client.fetch("", options2);
package/dist/index.mjs CHANGED
@@ -15,7 +15,7 @@ import {
15
15
  isValidationError,
16
16
  resolveStorage,
17
17
  writeSession
18
- } from "./chunk-IWWPHFK2.mjs";
18
+ } from "./chunk-T46JASKG.mjs";
19
19
  import {
20
20
  paginate
21
21
  } from "./chunk-DLSO6XXY.mjs";
@@ -39,7 +39,7 @@ function toSearchParams(query) {
39
39
  }
40
40
 
41
41
  // src/version.ts
42
- var SDK_VERSION = "4.8.0";
42
+ var SDK_VERSION = "4.9.0";
43
43
 
44
44
  // src/client.ts
45
45
  function isRawBody(body) {
@@ -818,9 +818,9 @@ function jobsNamespace(client) {
818
818
  );
819
819
  },
820
820
  /**
821
- * Create an opaque external-apply intent. A compatible starter then makes
822
- * its own board-local POST return a browser 303 to `gatewayUrl`; do not
823
- * render this value as a crawlable link. Pass
821
+ * Create an opaque external-apply intent. A compatible starter sends the
822
+ * candidate's browser to `gatewayUrl` (or asks it for the canonical JSON
823
+ * decision after a real Apply click); never render it as a crawlable link. Pass
824
824
  * `x-cavuno-board-capabilities: apply-gateway-v1` in `options.headers`;
825
825
  * legacy callers receive 404.
826
826
  */
@@ -2804,10 +2804,11 @@ function createBoardClient(options) {
2804
2804
  client,
2805
2805
  /**
2806
2806
  * Board context — identity, brand (`logoUrl` + favicon `icons`), language,
2807
- * features, and analytics.
2807
+ * features, analytics, and AdSense (`ads.enabled` + `ads.clientId`).
2808
+ * Per-placement slot ids are not on this resource.
2808
2809
  *
2809
2810
  * @example
2810
- * const { name, language, logoUrl, icons } = await board.context();
2811
+ * const { name, language, logoUrl, icons, ads } = await board.context();
2811
2812
  */
2812
2813
  context(options2) {
2813
2814
  return client.fetch("", options2);
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DePC7a05.mjs';
1
+ import { S as Schemas } from './_spec-B9Ah8dNs.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-DePC7a05.js';
1
+ import { S as Schemas } from './_spec-B9Ah8dNs.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-DePC7a05.js';
1
+ import { S as Schemas } from './_spec-B9Ah8dNs.js';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DePC7a05.mjs';
1
+ import { S as Schemas } from './_spec-B9Ah8dNs.mjs';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -0,0 +1,12 @@
1
+ import { S as Schemas } from './_spec-B9Ah8dNs.js';
2
+
3
+ /**
4
+ * The public SEO-infra payload (`board.seo()`) — platform infrastructure a
5
+ * headless frontend rebuilds `robots.txt` / `ads.txt` / `indexnow-key.txt`
6
+ * (+ the Google site-verification `<meta>`) from, byte-identically to the
7
+ * hosted board. Icons and `themeColor` left in 4.0.0; applications
8
+ * own brand assets and presentation tokens.
9
+ */
10
+ type BoardSeo = Schemas['BoardSeo'];
11
+
12
+ export type { BoardSeo as B };
@@ -0,0 +1,12 @@
1
+ import { S as Schemas } from './_spec-B9Ah8dNs.mjs';
2
+
3
+ /**
4
+ * The public SEO-infra payload (`board.seo()`) — platform infrastructure a
5
+ * headless frontend rebuilds `robots.txt` / `ads.txt` / `indexnow-key.txt`
6
+ * (+ the Google site-verification `<meta>`) from, byte-identically to the
7
+ * hosted board. Icons and `themeColor` left in 4.0.0; applications
8
+ * own brand assets and presentation tokens.
9
+ */
10
+ type BoardSeo = Schemas['BoardSeo'];
11
+
12
+ export type { BoardSeo as B };
@@ -0,0 +1,36 @@
1
+ import { B as BoardSeo } from './seo-HCE7aCkh.mjs';
2
+ import './_spec-B9Ah8dNs.mjs';
3
+
4
+ /**
5
+ * `@cavuno/board/seo-files` — platform-owned crawler/identity file bodies
6
+ * (`robots.txt`, `ads.txt`, `indexnow-key.txt`) plus the Google
7
+ * site-verification meta descriptor.
8
+ *
9
+ * Pure, dependency-free: type-only import of `BoardSeo`. No node builtins,
10
+ * no framework packages. Hosted routes, the dispatch Worker, and the starter
11
+ * share these bytes so the files cannot drift.
12
+ */
13
+
14
+ declare const SEO_FILE_CONTENT_TYPE = "text/plain; charset=utf-8";
15
+ declare const ROBOTS_CACHE_CONTROL = "public, max-age=600, s-maxage=14400, stale-while-revalidate=86400";
16
+ declare const ADS_TXT_CACHE_CONTROL = "public, max-age=3600, must-revalidate";
17
+ declare const INDEXNOW_CACHE_CONTROL = "public, max-age=86400, must-revalidate";
18
+ type SeoFileResponseInit = {
19
+ method?: string;
20
+ };
21
+ /** Lines of the hosted robots body (no sitemap line). Exported so tests and hosted can share the literal. */
22
+ declare function robotsBody(input: {
23
+ canonicalBase: string;
24
+ sandbox?: boolean;
25
+ }): string;
26
+ declare function robotsResponse(seo: Pick<BoardSeo, 'canonicalBase'> & {
27
+ sandbox?: boolean;
28
+ }, init?: SeoFileResponseInit): Response;
29
+ declare function adsTxtResponse(seo: Pick<BoardSeo, 'adsTxt'>, init?: SeoFileResponseInit): Response;
30
+ declare function indexNowResponse(seo: Pick<BoardSeo, 'indexNowKey'>, init?: SeoFileResponseInit): Response;
31
+ declare function googleSiteVerificationMeta(token: string | null | undefined): {
32
+ name: 'google-site-verification';
33
+ content: string;
34
+ } | null;
35
+
36
+ export { ADS_TXT_CACHE_CONTROL, INDEXNOW_CACHE_CONTROL, ROBOTS_CACHE_CONTROL, SEO_FILE_CONTENT_TYPE, type SeoFileResponseInit, adsTxtResponse, googleSiteVerificationMeta, indexNowResponse, robotsBody, robotsResponse };
@@ -0,0 +1,36 @@
1
+ import { B as BoardSeo } from './seo-BDFUuvXM.js';
2
+ import './_spec-B9Ah8dNs.js';
3
+
4
+ /**
5
+ * `@cavuno/board/seo-files` — platform-owned crawler/identity file bodies
6
+ * (`robots.txt`, `ads.txt`, `indexnow-key.txt`) plus the Google
7
+ * site-verification meta descriptor.
8
+ *
9
+ * Pure, dependency-free: type-only import of `BoardSeo`. No node builtins,
10
+ * no framework packages. Hosted routes, the dispatch Worker, and the starter
11
+ * share these bytes so the files cannot drift.
12
+ */
13
+
14
+ declare const SEO_FILE_CONTENT_TYPE = "text/plain; charset=utf-8";
15
+ declare const ROBOTS_CACHE_CONTROL = "public, max-age=600, s-maxage=14400, stale-while-revalidate=86400";
16
+ declare const ADS_TXT_CACHE_CONTROL = "public, max-age=3600, must-revalidate";
17
+ declare const INDEXNOW_CACHE_CONTROL = "public, max-age=86400, must-revalidate";
18
+ type SeoFileResponseInit = {
19
+ method?: string;
20
+ };
21
+ /** Lines of the hosted robots body (no sitemap line). Exported so tests and hosted can share the literal. */
22
+ declare function robotsBody(input: {
23
+ canonicalBase: string;
24
+ sandbox?: boolean;
25
+ }): string;
26
+ declare function robotsResponse(seo: Pick<BoardSeo, 'canonicalBase'> & {
27
+ sandbox?: boolean;
28
+ }, init?: SeoFileResponseInit): Response;
29
+ declare function adsTxtResponse(seo: Pick<BoardSeo, 'adsTxt'>, init?: SeoFileResponseInit): Response;
30
+ declare function indexNowResponse(seo: Pick<BoardSeo, 'indexNowKey'>, init?: SeoFileResponseInit): Response;
31
+ declare function googleSiteVerificationMeta(token: string | null | undefined): {
32
+ name: 'google-site-verification';
33
+ content: string;
34
+ } | null;
35
+
36
+ export { ADS_TXT_CACHE_CONTROL, INDEXNOW_CACHE_CONTROL, ROBOTS_CACHE_CONTROL, SEO_FILE_CONTENT_TYPE, type SeoFileResponseInit, adsTxtResponse, googleSiteVerificationMeta, indexNowResponse, robotsBody, robotsResponse };
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/seo-files/index.ts
21
+ var seo_files_exports = {};
22
+ __export(seo_files_exports, {
23
+ ADS_TXT_CACHE_CONTROL: () => ADS_TXT_CACHE_CONTROL,
24
+ INDEXNOW_CACHE_CONTROL: () => INDEXNOW_CACHE_CONTROL,
25
+ ROBOTS_CACHE_CONTROL: () => ROBOTS_CACHE_CONTROL,
26
+ SEO_FILE_CONTENT_TYPE: () => SEO_FILE_CONTENT_TYPE,
27
+ adsTxtResponse: () => adsTxtResponse,
28
+ googleSiteVerificationMeta: () => googleSiteVerificationMeta,
29
+ indexNowResponse: () => indexNowResponse,
30
+ robotsBody: () => robotsBody,
31
+ robotsResponse: () => robotsResponse
32
+ });
33
+ module.exports = __toCommonJS(seo_files_exports);
34
+ var SEO_FILE_CONTENT_TYPE = "text/plain; charset=utf-8";
35
+ var ROBOTS_CACHE_CONTROL = "public, max-age=600, s-maxage=14400, stale-while-revalidate=86400";
36
+ var ADS_TXT_CACHE_CONTROL = "public, max-age=3600, must-revalidate";
37
+ var INDEXNOW_CACHE_CONTROL = "public, max-age=86400, must-revalidate";
38
+ function robotsBody(input) {
39
+ if (input.sandbox) {
40
+ return ["User-Agent: *", "Disallow: /", ""].join("\n");
41
+ }
42
+ const canonicalBase = input.canonicalBase.replace(/\/+$/, "");
43
+ return [
44
+ "User-Agent: *",
45
+ "Allow: /",
46
+ "Disallow: /go/",
47
+ "Disallow: /t/",
48
+ "Disallow: /jobs?page=",
49
+ "Disallow: /jobs*&page=",
50
+ "Disallow: /jobs/*?page=",
51
+ "Disallow: /companies?page=",
52
+ "Disallow: /companies*&page=",
53
+ "Disallow: /companies/*?page=",
54
+ "Disallow: /talent?page=",
55
+ "Disallow: /talent*&page=",
56
+ "Disallow: /talent/*?page=",
57
+ "",
58
+ `Sitemap: ${canonicalBase}/sitemap.xml`,
59
+ ""
60
+ ].join("\n");
61
+ }
62
+ function robotsResponse(seo, init) {
63
+ return textFileResponse(
64
+ robotsBody({ canonicalBase: seo.canonicalBase, sandbox: seo.sandbox }),
65
+ ROBOTS_CACHE_CONTROL,
66
+ init
67
+ );
68
+ }
69
+ function adsTxtResponse(seo, init) {
70
+ return optionalTextFileResponse(seo.adsTxt, ADS_TXT_CACHE_CONTROL, init);
71
+ }
72
+ function indexNowResponse(seo, init) {
73
+ return optionalTextFileResponse(
74
+ seo.indexNowKey,
75
+ INDEXNOW_CACHE_CONTROL,
76
+ init
77
+ );
78
+ }
79
+ function googleSiteVerificationMeta(token) {
80
+ if (typeof token !== "string") return null;
81
+ const content = token.trim();
82
+ if (!content) return null;
83
+ return { name: "google-site-verification", content };
84
+ }
85
+ function isHead(init) {
86
+ return init?.method?.toUpperCase() === "HEAD";
87
+ }
88
+ function textFileResponse(body, cacheControl, init) {
89
+ return new Response(isHead(init) ? null : body, {
90
+ status: 200,
91
+ headers: {
92
+ "Content-Type": SEO_FILE_CONTENT_TYPE,
93
+ "Cache-Control": cacheControl
94
+ }
95
+ });
96
+ }
97
+ function optionalTextFileResponse(value, cacheControl, init) {
98
+ if (value == null || value === "") {
99
+ return new Response(null, { status: 404 });
100
+ }
101
+ return textFileResponse(value, cacheControl, init);
102
+ }
@@ -0,0 +1,81 @@
1
+ // src/seo-files/index.ts
2
+ var SEO_FILE_CONTENT_TYPE = "text/plain; charset=utf-8";
3
+ var ROBOTS_CACHE_CONTROL = "public, max-age=600, s-maxage=14400, stale-while-revalidate=86400";
4
+ var ADS_TXT_CACHE_CONTROL = "public, max-age=3600, must-revalidate";
5
+ var INDEXNOW_CACHE_CONTROL = "public, max-age=86400, must-revalidate";
6
+ function robotsBody(input) {
7
+ if (input.sandbox) {
8
+ return ["User-Agent: *", "Disallow: /", ""].join("\n");
9
+ }
10
+ const canonicalBase = input.canonicalBase.replace(/\/+$/, "");
11
+ return [
12
+ "User-Agent: *",
13
+ "Allow: /",
14
+ "Disallow: /go/",
15
+ "Disallow: /t/",
16
+ "Disallow: /jobs?page=",
17
+ "Disallow: /jobs*&page=",
18
+ "Disallow: /jobs/*?page=",
19
+ "Disallow: /companies?page=",
20
+ "Disallow: /companies*&page=",
21
+ "Disallow: /companies/*?page=",
22
+ "Disallow: /talent?page=",
23
+ "Disallow: /talent*&page=",
24
+ "Disallow: /talent/*?page=",
25
+ "",
26
+ `Sitemap: ${canonicalBase}/sitemap.xml`,
27
+ ""
28
+ ].join("\n");
29
+ }
30
+ function robotsResponse(seo, init) {
31
+ return textFileResponse(
32
+ robotsBody({ canonicalBase: seo.canonicalBase, sandbox: seo.sandbox }),
33
+ ROBOTS_CACHE_CONTROL,
34
+ init
35
+ );
36
+ }
37
+ function adsTxtResponse(seo, init) {
38
+ return optionalTextFileResponse(seo.adsTxt, ADS_TXT_CACHE_CONTROL, init);
39
+ }
40
+ function indexNowResponse(seo, init) {
41
+ return optionalTextFileResponse(
42
+ seo.indexNowKey,
43
+ INDEXNOW_CACHE_CONTROL,
44
+ init
45
+ );
46
+ }
47
+ function googleSiteVerificationMeta(token) {
48
+ if (typeof token !== "string") return null;
49
+ const content = token.trim();
50
+ if (!content) return null;
51
+ return { name: "google-site-verification", content };
52
+ }
53
+ function isHead(init) {
54
+ return init?.method?.toUpperCase() === "HEAD";
55
+ }
56
+ function textFileResponse(body, cacheControl, init) {
57
+ return new Response(isHead(init) ? null : body, {
58
+ status: 200,
59
+ headers: {
60
+ "Content-Type": SEO_FILE_CONTENT_TYPE,
61
+ "Cache-Control": cacheControl
62
+ }
63
+ });
64
+ }
65
+ function optionalTextFileResponse(value, cacheControl, init) {
66
+ if (value == null || value === "") {
67
+ return new Response(null, { status: 404 });
68
+ }
69
+ return textFileResponse(value, cacheControl, init);
70
+ }
71
+ export {
72
+ ADS_TXT_CACHE_CONTROL,
73
+ INDEXNOW_CACHE_CONTROL,
74
+ ROBOTS_CACHE_CONTROL,
75
+ SEO_FILE_CONTENT_TYPE,
76
+ adsTxtResponse,
77
+ googleSiteVerificationMeta,
78
+ indexNowResponse,
79
+ robotsBody,
80
+ robotsResponse
81
+ };
package/dist/seo.d.mts CHANGED
@@ -1,9 +1,9 @@
1
- import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-DbFr4VPW.mjs';
2
- import { e as JsonLdObject } from './breadcrumbs-P4qh0zML.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-P4qh0zML.mjs';
4
- import './_spec-DePC7a05.mjs';
5
- import './board-DxTMBgIf.mjs';
6
- import './jobs-DTLDt57G.mjs';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-BmqWfLZi.mjs';
2
+ import { e as JsonLdObject } from './breadcrumbs-BVQL2dNY.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-BVQL2dNY.mjs';
4
+ import './_spec-B9Ah8dNs.mjs';
5
+ import './board-B4jLqmxn.mjs';
6
+ import './jobs-B7q3BgIK.mjs';
7
7
 
8
8
  /**
9
9
  * Blog structured data on the `@cavuno/board` wire types, transcribed from