@cavuno/board 4.35.0 → 4.38.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.
- package/CHANGELOG.md +62 -0
- package/dist/{_spec-DBpKC6Rv.d.mts → _spec-BcXYrhOP.d.mts} +67 -3
- package/dist/{_spec-DBpKC6Rv.d.ts → _spec-BcXYrhOP.d.ts} +67 -3
- package/dist/bin.mjs +32 -22
- package/dist/{blog-Bk6oHqIR.d.ts → blog-BLLQ5H5M.d.ts} +1 -1
- package/dist/{blog-DXCzYj2q.d.mts → blog-PS7AwaF7.d.mts} +1 -1
- package/dist/{board-D6yRj3IN.d.mts → board-CK62f0G5.d.mts} +2 -2
- package/dist/{board-BpOyLLl_.d.ts → board-CTUrq9MP.d.ts} +2 -2
- package/dist/{breadcrumbs-B5qrRrgN.d.ts → breadcrumbs-Adrx69WV.d.ts} +2 -2
- package/dist/{breadcrumbs-BnYHHx40.d.mts → breadcrumbs-CwSd7BN1.d.mts} +2 -2
- package/dist/browser/cavuno-board.global.min.js +1 -1
- package/dist/doctor.d.mts +41 -1
- package/dist/doctor.d.ts +41 -1
- package/dist/doctor.js +59 -22
- package/dist/doctor.mjs +58 -22
- package/dist/filters.d.mts +2 -2
- package/dist/filters.d.ts +2 -2
- package/dist/format.d.mts +57 -5
- package/dist/format.d.ts +57 -5
- package/dist/format.js +61 -1
- package/dist/format.mjs +61 -1
- package/dist/index.d.mts +57 -15
- package/dist/index.d.ts +57 -15
- package/dist/index.js +37 -5
- package/dist/index.mjs +37 -5
- package/dist/{jobs-Cgh8dwXB.d.mts → jobs--rvR1CgY.d.ts} +7 -3
- package/dist/{jobs-DX_wDSzt.d.ts → jobs-Y9kacbM1.d.mts} +7 -3
- package/dist/{search-DOmwaBud.d.ts → search-B-YDO3kN.d.ts} +1 -1
- package/dist/{search-DsR5-O8E.d.mts → search-Dhy-RqrE.d.mts} +1 -1
- package/dist/{seo-DtLE8C9q.d.ts → seo-BiissB7X.d.ts} +1 -1
- package/dist/{seo-DbzhNmAY.d.mts → seo-C39S8YTH.d.mts} +1 -1
- package/dist/seo-files.d.mts +2 -2
- package/dist/seo-files.d.ts +2 -2
- package/dist/seo.d.mts +6 -6
- package/dist/seo.d.ts +6 -6
- package/dist/server.d.mts +6 -6
- package/dist/server.d.ts +6 -6
- package/dist/sitemap.d.mts +6 -6
- package/dist/sitemap.d.ts +6 -6
- package/dist/suggest.d.mts +2 -2
- package/dist/suggest.d.ts +2 -2
- package/package.json +1 -1
- package/skills/cavuno-board-companies/SKILL.md +5 -1
- package/skills/manifest.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,68 @@
|
|
|
3
3
|
This changelog records changes that affect Board API compatibility, exported
|
|
4
4
|
types, runtime behavior, or supported integration patterns.
|
|
5
5
|
|
|
6
|
+
## 4.38.0 — 2026-10-06
|
|
7
|
+
|
|
8
|
+
- Company invites: `board.invites.preview({ token })` looks up a company
|
|
9
|
+
member invite before sign-in, so an invite link can open a "Join
|
|
10
|
+
<company>" page. It returns the invite's `status` (`pending`, `expired`,
|
|
11
|
+
`accepted` or `revoked`), `expiresAt` and the company's `slug`, `name` and
|
|
12
|
+
`logoUrl`. While the invite is pending it also returns the invited `email`
|
|
13
|
+
and `account` (`none`, `employer` or `candidate`), so the page can offer
|
|
14
|
+
sign-up or sign-in. An unknown token is a 404 `employer_invite_not_found`.
|
|
15
|
+
|
|
16
|
+
- `board.auth.register` accepts an optional `inviteToken`. When an employer
|
|
17
|
+
registers with a pending invite sent to the same email, no verification
|
|
18
|
+
email is sent: accepting the invite with `board.me.acceptInvite` verifies
|
|
19
|
+
the address.
|
|
20
|
+
|
|
21
|
+
## 4.37.0 — 2026-10-06
|
|
22
|
+
|
|
23
|
+
- Job search: `radius` on `board.jobs.list`, `board.jobs.search` and the embed
|
|
24
|
+
jobs list now widens a city or locality `location` to nearby jobs within
|
|
25
|
+
that many kilometres (1–250, decimals allowed, e.g. `40.2` for 25 miles).
|
|
26
|
+
Without `radius` a location search returns jobs in the place itself, as
|
|
27
|
+
before. Region and country locations ignore `radius`. If you already send
|
|
28
|
+
`radius`, city and locality searches now include nearby jobs.
|
|
29
|
+
|
|
30
|
+
- `@cavuno/board/format` adds `searchRadiusOptions(unit)` (5, 10, 25, 50, 100
|
|
31
|
+
in miles or kilometres), `defaultSearchRadius(unit)` (25 mi or 50 km) and
|
|
32
|
+
`formatDistance(value, unit)` for a search distance menu, plus distance
|
|
33
|
+
helpers for a commute field: `distanceUnitForCountry`,
|
|
34
|
+
`defaultCommuteRadiusKm`, `kmToDistanceUnit`, `distanceUnitToKm`,
|
|
35
|
+
`kmToMiles`, `milesToKm`, `MILES_COUNTRIES`, `COMMUTE_RADIUS_MIN_KM` and
|
|
36
|
+
`COMMUTE_RADIUS_MAX_KM`.
|
|
37
|
+
|
|
38
|
+
- Candidate profile: `board.me.profile.update` accepts `locationId` (an id
|
|
39
|
+
from `board.locations.search`) and `commuteRadiusKm` (1–250, `null` for the
|
|
40
|
+
default). The profile returns `locationPlace`, `commuteRadiusKm` and
|
|
41
|
+
`commuteRadiusDefaultKm`. While a candidate has a home place, their
|
|
42
|
+
`countryCode` is that place's country and a sent `countryCode` is ignored.
|
|
43
|
+
Recommended jobs use the home place and commute distance for on-site and
|
|
44
|
+
hybrid jobs.
|
|
45
|
+
|
|
46
|
+
## 4.36.0 — 2026-10-06
|
|
47
|
+
|
|
48
|
+
- `board.get()` returns `ads.googleConsentMessage`. It is `true` when visitors
|
|
49
|
+
in the EEA, UK and Switzerland should get Google's certified consent message
|
|
50
|
+
(published in AdSense Privacy & messaging) instead of the board's own cookie
|
|
51
|
+
banner: AdSense is on with a valid `clientId` and the owner has not turned
|
|
52
|
+
the setting off. Load the AdSense tag on page load when it is `true`, and
|
|
53
|
+
gate other trackers on the visitor's answer to Google's message.
|
|
54
|
+
|
|
55
|
+
- Creating a job whose `applicationUrl` is already used by another job on the
|
|
56
|
+
account still returns `409 jobs_already_exists`, now with
|
|
57
|
+
`details.matched_on` and, for `application_url` matches,
|
|
58
|
+
`details.matching_jobs` (up to 5 `{ id, title, status }`). If the new job is
|
|
59
|
+
a different role that shares that application destination, retry with the
|
|
60
|
+
new optional `allowSharedApplicationUrl: true`. A matching `externalId` or an
|
|
61
|
+
identical job still cannot be overridden. Always set `externalId`.
|
|
62
|
+
|
|
63
|
+
- Place names on job surfaces now follow the board language: card
|
|
64
|
+
`locationLabel` (jobs list, search, similar, company jobs, saved jobs),
|
|
65
|
+
job detail `officeLocations[].displayName` and `placeHierarchy[].name`.
|
|
66
|
+
Hierarchy slugs are unchanged.
|
|
67
|
+
|
|
6
68
|
## 4.35.0 — 2026-10-05
|
|
7
69
|
|
|
8
70
|
- Boards can define custom employment types, such as "Casual", each with a
|
|
@@ -258,6 +258,8 @@ interface components {
|
|
|
258
258
|
developmentOrigin?: string;
|
|
259
259
|
/** @description Optional same-origin path to carry through the email link. */
|
|
260
260
|
returnTo?: string;
|
|
261
|
+
/** @description The company member invite token, when the person is signing up from an invite link. When `role` is `employer` and it is a pending invite on this board sent to this same email, no verification email is sent: accepting the invite (`POST /boards/{identifier}/me/invites/accept`) verifies the address. Registration never accepts the invite itself. Any other token is ignored and the verification email is sent as usual. */
|
|
262
|
+
inviteToken?: string;
|
|
261
263
|
};
|
|
262
264
|
BoardAuthRequestMagicLinkBody: {
|
|
263
265
|
audienceAttribution?: components["schemas"]["AudienceAttribution"];
|
|
@@ -535,6 +537,22 @@ interface components {
|
|
|
535
537
|
name: string;
|
|
536
538
|
proficiency: string;
|
|
537
539
|
};
|
|
540
|
+
/** @description Where the candidate lives, picked from the location search. Job matches use it with `commuteRadiusKm` for on-site and hybrid jobs. `null` when the candidate has only a free-text `location`. */
|
|
541
|
+
CandidateLocationPlace: {
|
|
542
|
+
/** @description Location id, as returned by `GET /locations/search`. Send it back as `locationId` to keep the same place. */
|
|
543
|
+
id: string;
|
|
544
|
+
/** @description Full display name, e.g. `Houston, Texas, United States`. */
|
|
545
|
+
name: string;
|
|
546
|
+
/** @description ISO 3166-1 alpha-2 country code. */
|
|
547
|
+
countryCode: string;
|
|
548
|
+
region: string | null;
|
|
549
|
+
city: string | null;
|
|
550
|
+
/**
|
|
551
|
+
* @description Level of the place, as `placeType` in `GET /locations/search`. A commute radius applies only to a `city` or `locality`; a `region` or `country` matches on-site and hybrid jobs anywhere in its country. `null` for places saved before the level was recorded.
|
|
552
|
+
* @enum {string|null}
|
|
553
|
+
*/
|
|
554
|
+
placeType: "country" | "region" | "city" | "locality" | null;
|
|
555
|
+
} | null;
|
|
538
556
|
CandidateProfile: {
|
|
539
557
|
id: string;
|
|
540
558
|
/** @enum {string} */
|
|
@@ -545,6 +563,7 @@ interface components {
|
|
|
545
563
|
handle: string | null;
|
|
546
564
|
headline: string | null;
|
|
547
565
|
location: string | null;
|
|
566
|
+
locationPlace: components["schemas"]["CandidateLocationPlace"];
|
|
548
567
|
countryCode: string | null;
|
|
549
568
|
/** @enum {string} */
|
|
550
569
|
profileVisibility: "hidden" | "logged_in_only" | "public";
|
|
@@ -552,7 +571,12 @@ interface components {
|
|
|
552
571
|
jobSearchStatus: "actively_looking" | "open_to_offers" | "not_looking";
|
|
553
572
|
/** @enum {string} */
|
|
554
573
|
jobSearchStatusVisibleTo: "everyone" | "employers_only";
|
|
574
|
+
/** @description Open to relocate. Widens on-site and hybrid job matches from the commute radius to the whole country the candidate lives in or holds a work permit for. */
|
|
555
575
|
openToRelocate: boolean;
|
|
576
|
+
/** @description How far the candidate is willing to commute, in kilometres. Applies only when `locationPlace` is a city or locality; a region or country home matches on its country instead. `null` means the default for their country (`commuteRadiusDefaultKm`). */
|
|
577
|
+
commuteRadiusKm: number | null;
|
|
578
|
+
/** @description The commute distance used when `commuteRadiusKm` is `null`: 40 km (25 miles) where distances are shown in miles (US, GB, LR, MM), 50 km elsewhere. Use it to prefill a commute field. */
|
|
579
|
+
commuteRadiusDefaultKm: number;
|
|
556
580
|
};
|
|
557
581
|
CandidateSkill: {
|
|
558
582
|
/** @enum {string} */
|
|
@@ -662,6 +686,30 @@ interface components {
|
|
|
662
686
|
object: "company_member_invite_acceptance";
|
|
663
687
|
companySlug: string;
|
|
664
688
|
};
|
|
689
|
+
CompanyMemberInvitePreview: {
|
|
690
|
+
/** @enum {string} */
|
|
691
|
+
object: "company_member_invite_preview";
|
|
692
|
+
/**
|
|
693
|
+
* @description Where the invite stands. `pending` can still be accepted; `expired` was never accepted before `expiresAt`; `accepted` has been used; `revoked` was withdrawn by a company admin.
|
|
694
|
+
* @enum {string}
|
|
695
|
+
*/
|
|
696
|
+
status: "pending" | "expired" | "accepted" | "revoked";
|
|
697
|
+
/** @description The address the invite was sent to. Only present while `status` is `pending`; `null` otherwise. Accepting requires signing in with this address. */
|
|
698
|
+
email: string | null;
|
|
699
|
+
/** @description When the invite stops being acceptable (ISO 8601). */
|
|
700
|
+
expiresAt: string;
|
|
701
|
+
/**
|
|
702
|
+
* @description Whether someone already has an account on this board with the invited address: `none` (offer sign-up), `employer` (offer sign-in), or `candidate` (the address belongs to a candidate account, which cannot join a company). Only present while `status` is `pending`; `null` otherwise.
|
|
703
|
+
* @enum {string|null}
|
|
704
|
+
*/
|
|
705
|
+
account: "none" | "employer" | "candidate" | null;
|
|
706
|
+
/** @description The company the invite is for. */
|
|
707
|
+
company: {
|
|
708
|
+
slug: string;
|
|
709
|
+
name: string;
|
|
710
|
+
logoUrl: string | null;
|
|
711
|
+
};
|
|
712
|
+
};
|
|
665
713
|
CompanyMembership: {
|
|
666
714
|
id: string;
|
|
667
715
|
/** @enum {string} */
|
|
@@ -1513,7 +1561,12 @@ interface components {
|
|
|
1513
1561
|
expiresAt: string | null;
|
|
1514
1562
|
};
|
|
1515
1563
|
stages: components["schemas"]["EmployerPipelineStage"][];
|
|
1564
|
+
/** @description One page of applicants, newest application first. Without `limit`, a page holds up to 2000. */
|
|
1516
1565
|
applicants: components["schemas"]["EmployerApplicant"][];
|
|
1566
|
+
/** @description Whether more applicants follow this page. */
|
|
1567
|
+
hasMore: boolean;
|
|
1568
|
+
/** @description Pass as `cursor` to read the next page of applicants; `null` on the last page. */
|
|
1569
|
+
nextCursor: string | null;
|
|
1517
1570
|
};
|
|
1518
1571
|
EmployerPipelineStage: {
|
|
1519
1572
|
id: string;
|
|
@@ -2130,6 +2183,10 @@ interface components {
|
|
|
2130
2183
|
/** @description Post title. */
|
|
2131
2184
|
title: string;
|
|
2132
2185
|
};
|
|
2186
|
+
PreviewCompanyMemberInviteBody: {
|
|
2187
|
+
/** @description The `token` query parameter from the invite link (`/employers/invites/accept?token=…`). */
|
|
2188
|
+
token: string;
|
|
2189
|
+
};
|
|
2133
2190
|
ProfileChoiceList: {
|
|
2134
2191
|
data: {
|
|
2135
2192
|
id: string;
|
|
@@ -2379,6 +2436,8 @@ interface components {
|
|
|
2379
2436
|
clientId: string | null;
|
|
2380
2437
|
/** @description Default Google-issued ad unit id (10 digits). Resolves the enabled jobs:list.footer slot first, then the first enabled valid slot in alphabetical placement-key order. Null when advertising is off, the publisher id is invalid, or no enabled valid slot exists. Frontends may override it per ad unit. */
|
|
2381
2438
|
defaultSlotId: string | null;
|
|
2439
|
+
/** @description True when visitors in the EEA, UK and Switzerland should get Google's certified consent message (published by the owner in AdSense → Privacy & messaging) instead of the board's own cookie banner. On by default whenever AdSense is on with a valid `clientId`; false when the owner turns it off, ads are off, or the publisher id is invalid. When true, load the AdSense tag on page load so Google's consent message can appear, and gate other trackers on the visitor's answer to it. */
|
|
2440
|
+
googleConsentMessage: boolean;
|
|
2382
2441
|
};
|
|
2383
2442
|
/** @description Operator-defined custom field definitions keyed by model (currently only `job`). Each key holds that model's definitions in display order. The frontend uses these to render and localize each record's opaque `customFieldValues`. Supports exact-value custom-field filters in job search. Profile definitions are discovered through the profile-fields endpoint. */
|
|
2384
2443
|
customFields: {
|
|
@@ -2611,7 +2670,7 @@ interface components {
|
|
|
2611
2670
|
slug: string;
|
|
2612
2671
|
name: string;
|
|
2613
2672
|
}[];
|
|
2614
|
-
/** @description Place ancestor chain (country → region → city) for the breadcrumb; each `{slug,name}` links to `/jobs/locations/:slug`.
|
|
2673
|
+
/** @description Place ancestor chain (country → region → city) for the breadcrumb; each `{slug,name}` links to `/jobs/locations/:slug`. `name` is in the board's language (the source name where the place has no translation); `slug` is the source slug. */
|
|
2615
2674
|
placeHierarchy: {
|
|
2616
2675
|
slug: string;
|
|
2617
2676
|
name: string;
|
|
@@ -2838,9 +2897,9 @@ interface components {
|
|
|
2838
2897
|
*/
|
|
2839
2898
|
lte?: string;
|
|
2840
2899
|
};
|
|
2841
|
-
/** @description Only return jobs
|
|
2900
|
+
/** @description Only return jobs in the place with this slug, including the places inside it (a region includes its cities). Pass `radius` to widen a city or locality to nearby jobs. Unresolvable slugs are ignored. */
|
|
2842
2901
|
location?: string;
|
|
2843
|
-
/** @description
|
|
2902
|
+
/** @description Widen a city or locality `location` to also return jobs placed in a city or locality within this many kilometres of the place (1–250; decimals allowed, e.g. `8.05` for 5 miles). Omit for jobs in the place itself. Ignored for region and country places, and without `location`. */
|
|
2844
2903
|
radius?: number;
|
|
2845
2904
|
/** @description Public custom job fields. Clauses are AND-matched; values within a clause are OR-matched. Up to 10 clauses and 10 values per clause. */
|
|
2846
2905
|
customFields?: {
|
|
@@ -3832,6 +3891,9 @@ interface components {
|
|
|
3832
3891
|
handle?: string;
|
|
3833
3892
|
headline?: string;
|
|
3834
3893
|
location?: string;
|
|
3894
|
+
/** @description Where the candidate lives: an `id` from `GET /locations/search`, resolved server-side. Also sets `location` to the place name unless `location` is sent too. While the candidate has a place, `countryCode` is always that place's country. `null` removes the place and keeps `location` and the last `countryCode`. An unknown id returns `400 locations_invalid_id`; `503 locations_unavailable` while the lookup is temporarily down. Changing `location` without `locationId` removes the place. */
|
|
3895
|
+
locationId?: string | null;
|
|
3896
|
+
/** @description Country the candidate can work in, checked against country-limited jobs. Applies only when the candidate has no place (`locationId`): while a place is stored or sent, `countryCode` is that place's country and a sent value is ignored without an error. Without a place, `null` clears it. */
|
|
3835
3897
|
countryCode?: string | null;
|
|
3836
3898
|
/** @enum {string} */
|
|
3837
3899
|
profileVisibility?: "hidden" | "logged_in_only" | "public";
|
|
@@ -3840,6 +3902,8 @@ interface components {
|
|
|
3840
3902
|
/** @enum {string} */
|
|
3841
3903
|
jobSearchStatusVisibleTo?: "everyone" | "employers_only";
|
|
3842
3904
|
openToRelocate?: boolean;
|
|
3905
|
+
/** @description How far the candidate is willing to commute, in kilometres (1–250, stored to one decimal place). `null` resets it to the default for their country. */
|
|
3906
|
+
commuteRadiusKm?: number | null;
|
|
3843
3907
|
};
|
|
3844
3908
|
UpdateCompanyMemberRoleBody: {
|
|
3845
3909
|
/** @enum {string} */
|
|
@@ -258,6 +258,8 @@ interface components {
|
|
|
258
258
|
developmentOrigin?: string;
|
|
259
259
|
/** @description Optional same-origin path to carry through the email link. */
|
|
260
260
|
returnTo?: string;
|
|
261
|
+
/** @description The company member invite token, when the person is signing up from an invite link. When `role` is `employer` and it is a pending invite on this board sent to this same email, no verification email is sent: accepting the invite (`POST /boards/{identifier}/me/invites/accept`) verifies the address. Registration never accepts the invite itself. Any other token is ignored and the verification email is sent as usual. */
|
|
262
|
+
inviteToken?: string;
|
|
261
263
|
};
|
|
262
264
|
BoardAuthRequestMagicLinkBody: {
|
|
263
265
|
audienceAttribution?: components["schemas"]["AudienceAttribution"];
|
|
@@ -535,6 +537,22 @@ interface components {
|
|
|
535
537
|
name: string;
|
|
536
538
|
proficiency: string;
|
|
537
539
|
};
|
|
540
|
+
/** @description Where the candidate lives, picked from the location search. Job matches use it with `commuteRadiusKm` for on-site and hybrid jobs. `null` when the candidate has only a free-text `location`. */
|
|
541
|
+
CandidateLocationPlace: {
|
|
542
|
+
/** @description Location id, as returned by `GET /locations/search`. Send it back as `locationId` to keep the same place. */
|
|
543
|
+
id: string;
|
|
544
|
+
/** @description Full display name, e.g. `Houston, Texas, United States`. */
|
|
545
|
+
name: string;
|
|
546
|
+
/** @description ISO 3166-1 alpha-2 country code. */
|
|
547
|
+
countryCode: string;
|
|
548
|
+
region: string | null;
|
|
549
|
+
city: string | null;
|
|
550
|
+
/**
|
|
551
|
+
* @description Level of the place, as `placeType` in `GET /locations/search`. A commute radius applies only to a `city` or `locality`; a `region` or `country` matches on-site and hybrid jobs anywhere in its country. `null` for places saved before the level was recorded.
|
|
552
|
+
* @enum {string|null}
|
|
553
|
+
*/
|
|
554
|
+
placeType: "country" | "region" | "city" | "locality" | null;
|
|
555
|
+
} | null;
|
|
538
556
|
CandidateProfile: {
|
|
539
557
|
id: string;
|
|
540
558
|
/** @enum {string} */
|
|
@@ -545,6 +563,7 @@ interface components {
|
|
|
545
563
|
handle: string | null;
|
|
546
564
|
headline: string | null;
|
|
547
565
|
location: string | null;
|
|
566
|
+
locationPlace: components["schemas"]["CandidateLocationPlace"];
|
|
548
567
|
countryCode: string | null;
|
|
549
568
|
/** @enum {string} */
|
|
550
569
|
profileVisibility: "hidden" | "logged_in_only" | "public";
|
|
@@ -552,7 +571,12 @@ interface components {
|
|
|
552
571
|
jobSearchStatus: "actively_looking" | "open_to_offers" | "not_looking";
|
|
553
572
|
/** @enum {string} */
|
|
554
573
|
jobSearchStatusVisibleTo: "everyone" | "employers_only";
|
|
574
|
+
/** @description Open to relocate. Widens on-site and hybrid job matches from the commute radius to the whole country the candidate lives in or holds a work permit for. */
|
|
555
575
|
openToRelocate: boolean;
|
|
576
|
+
/** @description How far the candidate is willing to commute, in kilometres. Applies only when `locationPlace` is a city or locality; a region or country home matches on its country instead. `null` means the default for their country (`commuteRadiusDefaultKm`). */
|
|
577
|
+
commuteRadiusKm: number | null;
|
|
578
|
+
/** @description The commute distance used when `commuteRadiusKm` is `null`: 40 km (25 miles) where distances are shown in miles (US, GB, LR, MM), 50 km elsewhere. Use it to prefill a commute field. */
|
|
579
|
+
commuteRadiusDefaultKm: number;
|
|
556
580
|
};
|
|
557
581
|
CandidateSkill: {
|
|
558
582
|
/** @enum {string} */
|
|
@@ -662,6 +686,30 @@ interface components {
|
|
|
662
686
|
object: "company_member_invite_acceptance";
|
|
663
687
|
companySlug: string;
|
|
664
688
|
};
|
|
689
|
+
CompanyMemberInvitePreview: {
|
|
690
|
+
/** @enum {string} */
|
|
691
|
+
object: "company_member_invite_preview";
|
|
692
|
+
/**
|
|
693
|
+
* @description Where the invite stands. `pending` can still be accepted; `expired` was never accepted before `expiresAt`; `accepted` has been used; `revoked` was withdrawn by a company admin.
|
|
694
|
+
* @enum {string}
|
|
695
|
+
*/
|
|
696
|
+
status: "pending" | "expired" | "accepted" | "revoked";
|
|
697
|
+
/** @description The address the invite was sent to. Only present while `status` is `pending`; `null` otherwise. Accepting requires signing in with this address. */
|
|
698
|
+
email: string | null;
|
|
699
|
+
/** @description When the invite stops being acceptable (ISO 8601). */
|
|
700
|
+
expiresAt: string;
|
|
701
|
+
/**
|
|
702
|
+
* @description Whether someone already has an account on this board with the invited address: `none` (offer sign-up), `employer` (offer sign-in), or `candidate` (the address belongs to a candidate account, which cannot join a company). Only present while `status` is `pending`; `null` otherwise.
|
|
703
|
+
* @enum {string|null}
|
|
704
|
+
*/
|
|
705
|
+
account: "none" | "employer" | "candidate" | null;
|
|
706
|
+
/** @description The company the invite is for. */
|
|
707
|
+
company: {
|
|
708
|
+
slug: string;
|
|
709
|
+
name: string;
|
|
710
|
+
logoUrl: string | null;
|
|
711
|
+
};
|
|
712
|
+
};
|
|
665
713
|
CompanyMembership: {
|
|
666
714
|
id: string;
|
|
667
715
|
/** @enum {string} */
|
|
@@ -1513,7 +1561,12 @@ interface components {
|
|
|
1513
1561
|
expiresAt: string | null;
|
|
1514
1562
|
};
|
|
1515
1563
|
stages: components["schemas"]["EmployerPipelineStage"][];
|
|
1564
|
+
/** @description One page of applicants, newest application first. Without `limit`, a page holds up to 2000. */
|
|
1516
1565
|
applicants: components["schemas"]["EmployerApplicant"][];
|
|
1566
|
+
/** @description Whether more applicants follow this page. */
|
|
1567
|
+
hasMore: boolean;
|
|
1568
|
+
/** @description Pass as `cursor` to read the next page of applicants; `null` on the last page. */
|
|
1569
|
+
nextCursor: string | null;
|
|
1517
1570
|
};
|
|
1518
1571
|
EmployerPipelineStage: {
|
|
1519
1572
|
id: string;
|
|
@@ -2130,6 +2183,10 @@ interface components {
|
|
|
2130
2183
|
/** @description Post title. */
|
|
2131
2184
|
title: string;
|
|
2132
2185
|
};
|
|
2186
|
+
PreviewCompanyMemberInviteBody: {
|
|
2187
|
+
/** @description The `token` query parameter from the invite link (`/employers/invites/accept?token=…`). */
|
|
2188
|
+
token: string;
|
|
2189
|
+
};
|
|
2133
2190
|
ProfileChoiceList: {
|
|
2134
2191
|
data: {
|
|
2135
2192
|
id: string;
|
|
@@ -2379,6 +2436,8 @@ interface components {
|
|
|
2379
2436
|
clientId: string | null;
|
|
2380
2437
|
/** @description Default Google-issued ad unit id (10 digits). Resolves the enabled jobs:list.footer slot first, then the first enabled valid slot in alphabetical placement-key order. Null when advertising is off, the publisher id is invalid, or no enabled valid slot exists. Frontends may override it per ad unit. */
|
|
2381
2438
|
defaultSlotId: string | null;
|
|
2439
|
+
/** @description True when visitors in the EEA, UK and Switzerland should get Google's certified consent message (published by the owner in AdSense → Privacy & messaging) instead of the board's own cookie banner. On by default whenever AdSense is on with a valid `clientId`; false when the owner turns it off, ads are off, or the publisher id is invalid. When true, load the AdSense tag on page load so Google's consent message can appear, and gate other trackers on the visitor's answer to it. */
|
|
2440
|
+
googleConsentMessage: boolean;
|
|
2382
2441
|
};
|
|
2383
2442
|
/** @description Operator-defined custom field definitions keyed by model (currently only `job`). Each key holds that model's definitions in display order. The frontend uses these to render and localize each record's opaque `customFieldValues`. Supports exact-value custom-field filters in job search. Profile definitions are discovered through the profile-fields endpoint. */
|
|
2384
2443
|
customFields: {
|
|
@@ -2611,7 +2670,7 @@ interface components {
|
|
|
2611
2670
|
slug: string;
|
|
2612
2671
|
name: string;
|
|
2613
2672
|
}[];
|
|
2614
|
-
/** @description Place ancestor chain (country → region → city) for the breadcrumb; each `{slug,name}` links to `/jobs/locations/:slug`.
|
|
2673
|
+
/** @description Place ancestor chain (country → region → city) for the breadcrumb; each `{slug,name}` links to `/jobs/locations/:slug`. `name` is in the board's language (the source name where the place has no translation); `slug` is the source slug. */
|
|
2615
2674
|
placeHierarchy: {
|
|
2616
2675
|
slug: string;
|
|
2617
2676
|
name: string;
|
|
@@ -2838,9 +2897,9 @@ interface components {
|
|
|
2838
2897
|
*/
|
|
2839
2898
|
lte?: string;
|
|
2840
2899
|
};
|
|
2841
|
-
/** @description Only return jobs
|
|
2900
|
+
/** @description Only return jobs in the place with this slug, including the places inside it (a region includes its cities). Pass `radius` to widen a city or locality to nearby jobs. Unresolvable slugs are ignored. */
|
|
2842
2901
|
location?: string;
|
|
2843
|
-
/** @description
|
|
2902
|
+
/** @description Widen a city or locality `location` to also return jobs placed in a city or locality within this many kilometres of the place (1–250; decimals allowed, e.g. `8.05` for 5 miles). Omit for jobs in the place itself. Ignored for region and country places, and without `location`. */
|
|
2844
2903
|
radius?: number;
|
|
2845
2904
|
/** @description Public custom job fields. Clauses are AND-matched; values within a clause are OR-matched. Up to 10 clauses and 10 values per clause. */
|
|
2846
2905
|
customFields?: {
|
|
@@ -3832,6 +3891,9 @@ interface components {
|
|
|
3832
3891
|
handle?: string;
|
|
3833
3892
|
headline?: string;
|
|
3834
3893
|
location?: string;
|
|
3894
|
+
/** @description Where the candidate lives: an `id` from `GET /locations/search`, resolved server-side. Also sets `location` to the place name unless `location` is sent too. While the candidate has a place, `countryCode` is always that place's country. `null` removes the place and keeps `location` and the last `countryCode`. An unknown id returns `400 locations_invalid_id`; `503 locations_unavailable` while the lookup is temporarily down. Changing `location` without `locationId` removes the place. */
|
|
3895
|
+
locationId?: string | null;
|
|
3896
|
+
/** @description Country the candidate can work in, checked against country-limited jobs. Applies only when the candidate has no place (`locationId`): while a place is stored or sent, `countryCode` is that place's country and a sent value is ignored without an error. Without a place, `null` clears it. */
|
|
3835
3897
|
countryCode?: string | null;
|
|
3836
3898
|
/** @enum {string} */
|
|
3837
3899
|
profileVisibility?: "hidden" | "logged_in_only" | "public";
|
|
@@ -3840,6 +3902,8 @@ interface components {
|
|
|
3840
3902
|
/** @enum {string} */
|
|
3841
3903
|
jobSearchStatusVisibleTo?: "everyone" | "employers_only";
|
|
3842
3904
|
openToRelocate?: boolean;
|
|
3905
|
+
/** @description How far the candidate is willing to commute, in kilometres (1–250, stored to one decimal place). `null` resets it to the default for their country. */
|
|
3906
|
+
commuteRadiusKm?: number | null;
|
|
3843
3907
|
};
|
|
3844
3908
|
UpdateCompanyMemberRoleBody: {
|
|
3845
3909
|
/** @enum {string} */
|
package/dist/bin.mjs
CHANGED
|
@@ -323,9 +323,8 @@ function truncate(line, max = 120) {
|
|
|
323
323
|
const t = line.trim();
|
|
324
324
|
return t.length > max ? `${t.slice(0, max)}\u2026` : t;
|
|
325
325
|
}
|
|
326
|
-
function
|
|
327
|
-
|
|
328
|
-
if (!existsSync2(srcDir)) {
|
|
326
|
+
function checkCookieSourceText(files, hasSource, unreadable) {
|
|
327
|
+
if (!hasSource) {
|
|
329
328
|
return [
|
|
330
329
|
COOKIE(
|
|
331
330
|
"skip",
|
|
@@ -333,33 +332,44 @@ function checkCookieCodecConformance(projectRoot) {
|
|
|
333
332
|
)
|
|
334
333
|
];
|
|
335
334
|
}
|
|
336
|
-
const files = [];
|
|
337
|
-
walkSourceFiles(srcDir, files);
|
|
338
335
|
const findings = [];
|
|
339
|
-
for (const
|
|
340
|
-
const rel = relative2(projectRoot, file).split("\\").join("/");
|
|
341
|
-
let text;
|
|
342
|
-
try {
|
|
343
|
-
text = readFileSync3(file, "utf8");
|
|
344
|
-
} catch {
|
|
345
|
-
continue;
|
|
346
|
-
}
|
|
336
|
+
for (const { path, text } of files) {
|
|
347
337
|
if (hasGeneratedBanner(text)) continue;
|
|
348
338
|
const lines = text.split(/\r?\n/);
|
|
349
339
|
for (let i = 0; i < lines.length; i += 1) {
|
|
350
340
|
if (!isOffendingSink(lines, i)) continue;
|
|
351
|
-
findings.push(`${
|
|
341
|
+
findings.push(`${path}:${i + 1} \u2014 ${truncate(lines[i])}`);
|
|
352
342
|
}
|
|
353
343
|
}
|
|
354
|
-
if (findings.length
|
|
355
|
-
return [
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
344
|
+
if (findings.length > 0) {
|
|
345
|
+
return [COOKIE("fail", `${findings.join("; ")}; ${REMEDIATION}`)];
|
|
346
|
+
}
|
|
347
|
+
if (unreadable) {
|
|
348
|
+
return [COOKIE("skip", "one or more source files could not be read")];
|
|
349
|
+
}
|
|
350
|
+
return [
|
|
351
|
+
COOKIE(
|
|
352
|
+
"pass",
|
|
353
|
+
"no domain-scoped Set-Cookie or document.cookie writes in app-authored src/ (generated output skipped)"
|
|
354
|
+
)
|
|
355
|
+
];
|
|
356
|
+
}
|
|
357
|
+
function checkCookieCodecConformance(projectRoot) {
|
|
358
|
+
const srcDir = join2(projectRoot, "src");
|
|
359
|
+
if (!existsSync2(srcDir)) return checkCookieSourceText([], false, false);
|
|
360
|
+
const files = [];
|
|
361
|
+
walkSourceFiles(srcDir, files);
|
|
362
|
+
const textFiles = [];
|
|
363
|
+
let unreadable = false;
|
|
364
|
+
for (const file of files) {
|
|
365
|
+
const rel = relative2(projectRoot, file).split("\\").join("/");
|
|
366
|
+
try {
|
|
367
|
+
textFiles.push({ path: rel, text: readFileSync3(file, "utf8") });
|
|
368
|
+
} catch {
|
|
369
|
+
unreadable = true;
|
|
370
|
+
}
|
|
361
371
|
}
|
|
362
|
-
return
|
|
372
|
+
return checkCookieSourceText(textFiles, true, unreadable);
|
|
363
373
|
}
|
|
364
374
|
|
|
365
375
|
// src/doctor/probe.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { S as Schemas } from './_spec-
|
|
2
|
-
import { L as ListEnvelope, t as RelatedSearch, a as CustomFieldFilter, O as ObjectReferenceFilter } from './jobs-
|
|
1
|
+
import { S as Schemas } from './_spec-BcXYrhOP.mjs';
|
|
2
|
+
import { L as ListEnvelope, t as RelatedSearch, a as CustomFieldFilter, O as ObjectReferenceFilter } from './jobs-Y9kacbM1.mjs';
|
|
3
3
|
|
|
4
4
|
type PublicCompany = Schemas['CompanyPublic'];
|
|
5
5
|
/** A market (sector) a company operates in — name + its source slug. */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { S as Schemas } from './_spec-
|
|
2
|
-
import { L as ListEnvelope, t as RelatedSearch, a as CustomFieldFilter, O as ObjectReferenceFilter } from './jobs
|
|
1
|
+
import { S as Schemas } from './_spec-BcXYrhOP.js';
|
|
2
|
+
import { L as ListEnvelope, t as RelatedSearch, a as CustomFieldFilter, O as ObjectReferenceFilter } from './jobs--rvR1CgY.js';
|
|
3
3
|
|
|
4
4
|
type PublicCompany = Schemas['CompanyPublic'];
|
|
5
5
|
/** A market (sector) a company operates in — name + its source slug. */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-
|
|
2
|
-
import { P as PublicJob } from './jobs
|
|
1
|
+
import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-CTUrq9MP.js';
|
|
2
|
+
import { P as PublicJob } from './jobs--rvR1CgY.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Wire enum for `salaryTimeframe`. Defined here (not re-exported from any
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-
|
|
2
|
-
import { P as PublicJob } from './jobs-
|
|
1
|
+
import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-CK62f0G5.mjs';
|
|
2
|
+
import { P as PublicJob } from './jobs-Y9kacbM1.mjs';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Wire enum for `salaryTimeframe`. Defined here (not re-exported from any
|