@cavuno/board 1.44.0 → 2.0.1
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 +22 -0
- package/CONTRIBUTING.md +25 -0
- package/LICENSE +21 -0
- package/README.md +12 -7
- package/SECURITY.md +28 -0
- package/TRADEMARKS.md +16 -0
- package/dist/_spec-sW85fuvT.d.mts +2731 -0
- package/dist/_spec-sW85fuvT.d.ts +2731 -0
- package/dist/bin.mjs +38 -349
- package/dist/{board-DZCw7A6P.d.ts → board-DKXyxwNN.d.ts} +2 -2
- package/dist/{board-BwFW1aU2.d.mts → board-QFeHT4UN.d.mts} +2 -2
- package/dist/doctor.d.mts +6 -19
- package/dist/doctor.d.ts +6 -19
- package/dist/doctor.js +38 -345
- package/dist/doctor.mjs +37 -344
- package/dist/filters.d.mts +5 -5
- package/dist/filters.d.ts +5 -5
- package/dist/format.d.mts +17 -19
- package/dist/format.d.ts +17 -19
- package/dist/go.d.mts +2 -2
- package/dist/go.d.ts +2 -2
- package/dist/go.js +1 -1
- package/dist/go.mjs +1 -1
- package/dist/index.d.mts +16 -18
- package/dist/index.d.ts +16 -18
- package/dist/index.js +39 -28
- package/dist/index.mjs +39 -28
- package/dist/{jobs-BVazo4mA.d.ts → jobs-CuRzTDb1.d.mts} +15 -13
- package/dist/{jobs-CSMshXGV.d.mts → jobs-DTnCZGtb.d.ts} +15 -13
- package/dist/paths.d.mts +6 -6
- package/dist/paths.d.ts +6 -6
- package/dist/paths.js +1 -1
- package/dist/paths.mjs +1 -1
- package/dist/roles-vY0AXhoc.d.mts +3 -3
- package/dist/roles-vY0AXhoc.d.ts +3 -3
- package/dist/route-contract.d.mts +16 -16
- package/dist/route-contract.d.ts +16 -16
- package/dist/route-contract.js +1 -1
- package/dist/route-contract.mjs +1 -1
- package/dist/{salaries-DMQsjLrV.d.ts → salaries-BOpR51Ny.d.mts} +3 -3
- package/dist/{salaries-IJlchnWk.d.mts → salaries-QoNpzRCT.d.ts} +3 -3
- package/dist/{search-B7gr_wOd.d.ts → search-B5ROY6PK.d.ts} +2 -2
- package/dist/{search-B6FJifRE.d.mts → search-f93nrSg3.d.mts} +2 -2
- package/dist/seo.d.mts +17 -18
- package/dist/seo.d.ts +17 -18
- package/dist/server.d.mts +14 -32
- package/dist/server.d.ts +14 -32
- package/dist/sitemap.d.mts +7 -7
- package/dist/sitemap.d.ts +7 -7
- package/dist/sitemap.js +4 -2
- package/dist/sitemap.mjs +4 -2
- package/dist/skills.d.mts +1 -1
- package/dist/skills.d.ts +1 -1
- package/dist/skills.js +1 -1
- package/dist/suggest.d.mts +2 -2
- package/dist/suggest.d.ts +2 -2
- package/dist/theme.d.mts +10 -13
- package/dist/theme.d.ts +10 -13
- package/dist/theme.js +1 -1
- package/dist/theme.mjs +1 -1
- package/dist/{ui-copy-CKfFTtLk.d.mts → ui-copy-CL-VN1xb.d.mts} +2 -3
- package/dist/{ui-copy-CKfFTtLk.d.ts → ui-copy-CL-VN1xb.d.ts} +2 -3
- package/dist/well-known.d.mts +3 -3
- package/dist/well-known.d.ts +3 -3
- package/dist/well-known.js +1 -1
- package/dist/well-known.mjs +1 -1
- package/package.json +46 -38
- package/skills/cavuno-board-client/SKILL.md +1 -2
- package/skills/cavuno-board-filters/SKILL.md +2 -2
- package/skills/cavuno-board-format/SKILL.md +1 -1
- package/skills/cavuno-board-i18n/SKILL.md +3 -3
- package/skills/cavuno-board-job-posting/SKILL.md +1 -1
- package/skills/cavuno-board-messaging/SKILL.md +2 -3
- package/skills/cavuno-board-paywall/SKILL.md +1 -1
- package/skills/cavuno-board-salaries/SKILL.md +1 -1
- package/skills/cavuno-board-seo/SKILL.md +4 -6
- package/skills/cavuno-board-server/SKILL.md +1 -1
- package/skills/cavuno-board-setup/SKILL.md +2 -1
- package/skills/cavuno-board-sitemap/SKILL.md +1 -1
- package/skills/cavuno-board-smoke-test/SKILL.md +4 -13
- package/skills/flavors/tanstack-start/SKILL.md +1 -2
- package/skills/manifest.json +1 -1
- package/dist/_spec-CoL3oYpG.d.mts +0 -5296
- package/dist/_spec-CoL3oYpG.d.ts +0 -5296
package/dist/route-contract.d.ts
CHANGED
|
@@ -11,13 +11,13 @@ declare function classifyRoutes(routes: RouteEntry[], markers?: ReadonlyMap<stri
|
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* Classify routes and emit a ManifestV1 plus publish-gate signals.
|
|
14
|
-
* Assigned templates are self-validated via checkRoleTemplate
|
|
14
|
+
* Assigned templates are self-validated via checkRoleTemplate;
|
|
15
15
|
* failing required roles land in blockingMissing; failing optionals warn.
|
|
16
16
|
*/
|
|
17
17
|
declare function compileManifest(routes: RouteEntry[], markers?: ReadonlyMap<string, RouteRole>): CompileResult;
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
|
-
*
|
|
20
|
+
* — compile a ManifestV1 from a workspace file tree already in
|
|
21
21
|
* memory (candidate verification). Pure: no IO.
|
|
22
22
|
*/
|
|
23
23
|
|
|
@@ -36,7 +36,7 @@ declare function compileManifestFromTree(files: ReadonlyArray<TreeFile>): Compil
|
|
|
36
36
|
* Tolerant parse of `export const cavunoPage = '<role>'` (single or double
|
|
37
37
|
* quotes; optional `as const`). Accepts camelCase roles and their kebab-case
|
|
38
38
|
* aliases (`job-detail` → `jobDetail`). Returns null when absent or when the
|
|
39
|
-
* string is not a known RouteRole
|
|
39
|
+
* string is not a known RouteRole.
|
|
40
40
|
*/
|
|
41
41
|
declare function extractCavunoPageMarker(contents: string): RouteRole | null;
|
|
42
42
|
|
|
@@ -70,7 +70,7 @@ declare function checkRoleTemplate(role: RouteRole, template: string): ValidateM
|
|
|
70
70
|
declare function validateManifest(value: unknown): ValidateManifestResult;
|
|
71
71
|
|
|
72
72
|
/**
|
|
73
|
-
* Platform resolution overlay
|
|
73
|
+
* Platform resolution overlay.
|
|
74
74
|
*
|
|
75
75
|
* Pure + isomorphic: role + params + precedence layers → board path.
|
|
76
76
|
* Imports only sibling route-contract / paths modules.
|
|
@@ -92,7 +92,7 @@ declare function createBoardLinkResolver(layers: readonly ManifestLayer[]): {
|
|
|
92
92
|
};
|
|
93
93
|
|
|
94
94
|
/**
|
|
95
|
-
*
|
|
95
|
+
* — pure history path matching for hosted rename 301s.
|
|
96
96
|
*
|
|
97
97
|
* Segment-wise matcher (no RegExp construction from templates). Templates
|
|
98
98
|
* are validated at write time but stay defensive here: any segment that
|
|
@@ -131,7 +131,7 @@ type HistoryMatchResult = {
|
|
|
131
131
|
declare function matchPathAgainstHistory(entries: readonly HistoryMatchEntry[], pathname: string): HistoryMatchResult | null;
|
|
132
132
|
|
|
133
133
|
/**
|
|
134
|
-
*
|
|
134
|
+
* — shared types for the route-derivation adapter registry.
|
|
135
135
|
*/
|
|
136
136
|
type DerivedRoute = {
|
|
137
137
|
path: string;
|
|
@@ -151,7 +151,7 @@ type FrameworkId = 'tanstack' | 'next' | 'astro' | 'sveltekit' | 'nuxt' | 'react
|
|
|
151
151
|
*
|
|
152
152
|
* The marker-less TanStack heuristic (any src/routes/*.tsx|jsx) runs LAST
|
|
153
153
|
* among framework checks so a Next/Astro/SvelteKit/Nuxt repo with a stray
|
|
154
|
-
* src/routes helper is never misclassified
|
|
154
|
+
* src/routes helper is never misclassified.
|
|
155
155
|
*/
|
|
156
156
|
|
|
157
157
|
declare function detectFramework(paths: string[]): FrameworkId | null;
|
|
@@ -159,8 +159,8 @@ declare function detectFramework(paths: string[]): FrameworkId | null;
|
|
|
159
159
|
/**
|
|
160
160
|
* react-router pure parsers over provided FILE CONTENTS.
|
|
161
161
|
*
|
|
162
|
-
* Content-fetch is intentionally
|
|
163
|
-
*
|
|
162
|
+
* Content-fetch is intentionally not supported into the navigator UI —
|
|
163
|
+
* only exposes these functions; UI wiring is a future release.
|
|
164
164
|
*/
|
|
165
165
|
|
|
166
166
|
/**
|
|
@@ -177,7 +177,7 @@ declare function parseReactRouterRoutes(contents: string[]): DerivedRoute[];
|
|
|
177
177
|
|
|
178
178
|
/**
|
|
179
179
|
* TanStack Start / TanStack Router file-based route conventions under
|
|
180
|
-
* `src/routes/`. Behavior preserved exactly from the
|
|
180
|
+
* `src/routes/`. Behavior preserved exactly from the parser.
|
|
181
181
|
*
|
|
182
182
|
* - `index` → parent path (`src/routes/index.tsx` → `/`)
|
|
183
183
|
* - dots nest (`jobs.index.tsx` → `/jobs`)
|
|
@@ -208,7 +208,7 @@ declare function parseNextRoutes(paths: string[]): DerivedRoute[];
|
|
|
208
208
|
* when the tree has astro.config.* and no src/pages/ (srcDir-customized).
|
|
209
209
|
* Page extensions: .astro / .md / .mdx / .html.
|
|
210
210
|
* Skip _-prefixed and .../api/. Index collapses.
|
|
211
|
-
* [param]→:param, [...slug]→*, [[...slug]]
|
|
211
|
+
* [param]→:param, [...slug]→*, [[...slug]]→*.
|
|
212
212
|
*/
|
|
213
213
|
|
|
214
214
|
declare function parseAstroRoutes(paths: string[]): DerivedRoute[];
|
|
@@ -217,7 +217,7 @@ declare function parseAstroRoutes(paths: string[]): DerivedRoute[];
|
|
|
217
217
|
* SvelteKit file-based routing: src/routes/.../+page.svelte
|
|
218
218
|
* and layout-reset +page@*.svelte only.
|
|
219
219
|
* (group) stripped, [param]→:param, [[...rest]]→*, dynamic ⇒ navigable false.
|
|
220
|
-
* +page.ts / +page.server.ts are load modules and derive nothing
|
|
220
|
+
* +page.ts / +page.server.ts are load modules and derive nothing.
|
|
221
221
|
*/
|
|
222
222
|
|
|
223
223
|
declare function parseSvelteKitRoutes(paths: string[]): DerivedRoute[];
|
|
@@ -231,7 +231,7 @@ declare function parseSvelteKitRoutes(paths: string[]): DerivedRoute[];
|
|
|
231
231
|
declare function parseNuxtRoutes(paths: string[]): DerivedRoute[];
|
|
232
232
|
|
|
233
233
|
/**
|
|
234
|
-
*
|
|
234
|
+
* — framework adapter registry entry.
|
|
235
235
|
*
|
|
236
236
|
* Detects the framework from a path listing, dispatches to the matching
|
|
237
237
|
* pure parser, returns DerivedRoute[] (path + navigable). Unknown → [].
|
|
@@ -239,18 +239,18 @@ declare function parseNuxtRoutes(paths: string[]): DerivedRoute[];
|
|
|
239
239
|
* react-router content parsers are exported for later UI wiring; the
|
|
240
240
|
* path-only deriveRoutes entry returns [] for react-router-only trees.
|
|
241
241
|
*
|
|
242
|
-
*
|
|
242
|
+
*enumerateRouteEntries keeps sourcePath for marker harvest +
|
|
243
243
|
* compileManifest; deriveRoutes strips it so the navigator contract is
|
|
244
244
|
* unchanged (path + navigable only).
|
|
245
245
|
*/
|
|
246
246
|
|
|
247
247
|
/**
|
|
248
|
-
* Navigator contract: path + navigable only
|
|
248
|
+
* Navigator contract: path + navigable only.
|
|
249
249
|
* sourcePath is intentionally stripped so existing equality fixtures hold.
|
|
250
250
|
*/
|
|
251
251
|
declare function deriveRoutes(paths: string[]): DerivedRoute[];
|
|
252
252
|
/**
|
|
253
|
-
*
|
|
253
|
+
* compile path: URL template + sourcePath for marker harvest.
|
|
254
254
|
*/
|
|
255
255
|
declare function enumerateRouteEntries(paths: string[]): RouteEntry[];
|
|
256
256
|
|
package/dist/route-contract.js
CHANGED
|
@@ -108,7 +108,7 @@ var BOARD_PATHS = {
|
|
|
108
108
|
talent: "/talent",
|
|
109
109
|
employers: "/employers",
|
|
110
110
|
/**
|
|
111
|
-
* Alert-email surfaces
|
|
111
|
+
* Alert-email surfaces. Promoted out of raw literals in
|
|
112
112
|
* the job-alerts composer so /go indirection and email composition share
|
|
113
113
|
* one definition.
|
|
114
114
|
*/
|
package/dist/route-contract.mjs
CHANGED
|
@@ -56,7 +56,7 @@ var BOARD_PATHS = {
|
|
|
56
56
|
talent: "/talent",
|
|
57
57
|
employers: "/employers",
|
|
58
58
|
/**
|
|
59
|
-
* Alert-email surfaces
|
|
59
|
+
* Alert-email surfaces. Promoted out of raw literals in
|
|
60
60
|
* the job-alerts composer so /go indirection and email composition share
|
|
61
61
|
* one definition.
|
|
62
62
|
*/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { S as Schemas } from './_spec-
|
|
2
|
-
import { L as ListEnvelope, m as RelatedSearch } from './jobs-
|
|
1
|
+
import { S as Schemas } from './_spec-sW85fuvT.mjs';
|
|
2
|
+
import { L as ListEnvelope, m as RelatedSearch } from './jobs-CuRzTDb1.mjs';
|
|
3
3
|
|
|
4
4
|
/** Author shape embedded on posts (no `object` discriminator). */
|
|
5
5
|
type BlogAuthorEmbed = Schemas['PublicBlogAuthorEmbed'];
|
|
@@ -33,7 +33,7 @@ type CompanyMarketRef = Schemas['CompanyMarketRef'];
|
|
|
33
33
|
/** The company DETAIL shape — `PublicCompany` plus `markets` (detail-only). */
|
|
34
34
|
type PublicCompanyDetail = Schemas['CompanyPublicDetail'];
|
|
35
35
|
/**
|
|
36
|
-
* A company's salary overview
|
|
36
|
+
* A company's salary overview: overall pay, by-seniority rows vs the
|
|
37
37
|
* board baseline, top competitors, top locations, and a per-category summary.
|
|
38
38
|
* Names are board-language localized; the company slug/name are not.
|
|
39
39
|
*/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { S as Schemas } from './_spec-
|
|
2
|
-
import { L as ListEnvelope, m as RelatedSearch } from './jobs-
|
|
1
|
+
import { S as Schemas } from './_spec-sW85fuvT.js';
|
|
2
|
+
import { L as ListEnvelope, m as RelatedSearch } from './jobs-DTnCZGtb.js';
|
|
3
3
|
|
|
4
4
|
/** Author shape embedded on posts (no `object` discriminator). */
|
|
5
5
|
type BlogAuthorEmbed = Schemas['PublicBlogAuthorEmbed'];
|
|
@@ -33,7 +33,7 @@ type CompanyMarketRef = Schemas['CompanyMarketRef'];
|
|
|
33
33
|
/** The company DETAIL shape — `PublicCompany` plus `markets` (detail-only). */
|
|
34
34
|
type PublicCompanyDetail = Schemas['CompanyPublicDetail'];
|
|
35
35
|
/**
|
|
36
|
-
* A company's salary overview
|
|
36
|
+
* A company's salary overview: overall pay, by-seniority rows vs the
|
|
37
37
|
* board baseline, top competitors, top locations, and a per-category summary.
|
|
38
38
|
* Names are board-language localized; the company slug/name are not.
|
|
39
39
|
*/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { S as Schemas } from './_spec-
|
|
1
|
+
import { S as Schemas } from './_spec-sW85fuvT.js';
|
|
2
2
|
|
|
3
3
|
type Awaitable<T> = T | Promise<T>;
|
|
4
4
|
/**
|
|
@@ -42,7 +42,7 @@ type FetchOptions = Omit<RequestInit, 'body'> & {
|
|
|
42
42
|
};
|
|
43
43
|
interface BoardClientOptions {
|
|
44
44
|
baseUrl: string;
|
|
45
|
-
/** Board identifier: `pk_…` key | `boards_…` ID | slug
|
|
45
|
+
/** Board identifier: `pk_…` key | `boards_…` ID | slug. */
|
|
46
46
|
board: string;
|
|
47
47
|
storage: CustomStorage;
|
|
48
48
|
globalHeaders?: Record<string, string>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { S as Schemas } from './_spec-
|
|
1
|
+
import { S as Schemas } from './_spec-sW85fuvT.mjs';
|
|
2
2
|
|
|
3
3
|
type Awaitable<T> = T | Promise<T>;
|
|
4
4
|
/**
|
|
@@ -42,7 +42,7 @@ type FetchOptions = Omit<RequestInit, 'body'> & {
|
|
|
42
42
|
};
|
|
43
43
|
interface BoardClientOptions {
|
|
44
44
|
baseUrl: string;
|
|
45
|
-
/** Board identifier: `pk_…` key | `boards_…` ID | slug
|
|
45
|
+
/** Board identifier: `pk_…` key | `boards_…` ID | slug. */
|
|
46
46
|
board: string;
|
|
47
47
|
storage: CustomStorage;
|
|
48
48
|
globalHeaders?: Record<string, string>;
|
package/dist/seo.d.mts
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { P as PublicBlogPostSummary, B as BlogAuthorEmbed, C as CompanyCategorySalary, a as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './salaries-
|
|
2
|
-
import { P as PublicBoard } from './board-
|
|
3
|
-
import { P as PublicJob } from './jobs-
|
|
4
|
-
import { B as BoardLabelOverrides } from './ui-copy-
|
|
5
|
-
import './_spec-
|
|
1
|
+
import { P as PublicBlogPostSummary, B as BlogAuthorEmbed, C as CompanyCategorySalary, a as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './salaries-BOpR51Ny.mjs';
|
|
2
|
+
import { P as PublicBoard } from './board-QFeHT4UN.mjs';
|
|
3
|
+
import { P as PublicJob } from './jobs-CuRzTDb1.mjs';
|
|
4
|
+
import { B as BoardLabelOverrides } from './ui-copy-CL-VN1xb.mjs';
|
|
5
|
+
import './_spec-sW85fuvT.mjs';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Google for Jobs `JobPosting` structured data on the `@cavuno/board` wire
|
|
9
9
|
* types, transcribed field-by-field from the hosted board's generator
|
|
10
|
-
* (
|
|
11
|
-
*
|
|
10
|
+
* (the hosted board implementation + `job-posting-location-json-ld.ts`) and
|
|
11
|
+
* tested against the hosted behavior.
|
|
12
12
|
*
|
|
13
13
|
* JSON-LD structure is locale-neutral per schema.org — no board-language
|
|
14
14
|
* parameter here; the only display strings are wire values passed through.
|
|
15
15
|
*
|
|
16
16
|
* Named exclusions (hosted behaviours with no wire twin, recorded in the
|
|
17
|
-
*
|
|
17
|
+
* public API contract):
|
|
18
18
|
* - `board.companyLegalName` — hosted falls back to it for the
|
|
19
19
|
* organization name between `company.name` and `board.name`; the wire
|
|
20
20
|
* board context does not expose it.
|
|
@@ -33,9 +33,8 @@ type JsonLdBoard = Pick<PublicBoard, 'name' | 'logoUrl'>;
|
|
|
33
33
|
* next to TELECOMMUTE (Google requires a location signal), so the hosted
|
|
34
34
|
* board — and this transcription — lists every country it recognises.
|
|
35
35
|
*
|
|
36
|
-
* This is the hosted board's exact country catalog
|
|
37
|
-
* `
|
|
38
|
-
* name, includes `XK` (Kosovo), excludes `KP` (North Korea). Golden-tested
|
|
36
|
+
* This is the hosted board's exact country catalog: sorted by English common
|
|
37
|
+
* name, includes `XK` (Kosovo), and excludes `KP` (North Korea). tested
|
|
39
38
|
* against the hosted list so the two cannot drift.
|
|
40
39
|
*/
|
|
41
40
|
declare const ALL_COUNTRY_CODES: readonly ["AF", "AX", "AL", "DZ", "AS", "AD", "AO", "AI", "AQ", "AG", "AR", "AM", "AW", "AU", "AT", "AZ", "BS", "BH", "BD", "BB", "BY", "BE", "BZ", "BJ", "BM", "BT", "BO", "BA", "BW", "BV", "BR", "IO", "VG", "BN", "BG", "BF", "BI", "KH", "CM", "CA", "CV", "BQ", "KY", "CF", "TD", "CL", "CN", "CX", "CC", "CO", "KM", "CK", "CR", "HR", "CU", "CW", "CY", "CZ", "DK", "DJ", "DM", "DO", "CD", "EC", "EG", "SV", "GQ", "ER", "EE", "SZ", "ET", "FK", "FO", "FJ", "FI", "FR", "GF", "PF", "TF", "GA", "GM", "GE", "DE", "GH", "GI", "GR", "GL", "GD", "GP", "GU", "GT", "GG", "GN", "GW", "GY", "HT", "HM", "HN", "HK", "HU", "IS", "IN", "ID", "IR", "IQ", "IE", "IM", "IL", "IT", "CI", "JM", "JP", "JE", "JO", "KZ", "KE", "KI", "XK", "KW", "KG", "LA", "LV", "LB", "LS", "LR", "LY", "LI", "LT", "LU", "MO", "MG", "MW", "MY", "MV", "ML", "MT", "MH", "MQ", "MR", "MU", "YT", "MX", "FM", "MD", "MC", "MN", "ME", "MS", "MA", "MZ", "MM", "NA", "NR", "NP", "NL", "NC", "NZ", "NI", "NE", "NG", "NU", "NF", "MK", "MP", "NO", "OM", "PK", "PW", "PS", "PA", "PG", "PY", "PE", "PH", "PN", "PL", "PT", "PR", "QA", "CG", "RE", "RO", "RU", "RW", "BL", "SH", "KN", "LC", "MF", "PM", "VC", "WS", "SM", "ST", "SA", "SN", "RS", "SC", "SL", "SG", "SX", "SK", "SI", "SB", "SO", "ZA", "GS", "KR", "SS", "ES", "LK", "SD", "SR", "SJ", "SE", "CH", "SY", "TW", "TJ", "TZ", "TH", "TL", "TG", "TK", "TO", "TT", "TN", "TR", "TM", "TC", "TV", "UG", "UA", "AE", "GB", "US", "UM", "VI", "UY", "UZ", "VU", "VA", "VE", "VN", "WF", "EH", "YE", "ZM", "ZW"];
|
|
@@ -58,9 +57,9 @@ declare function normalizeWebsiteUrl(website: string): string | null;
|
|
|
58
57
|
|
|
59
58
|
/**
|
|
60
59
|
* Blog structured data on the `@cavuno/board` wire types, transcribed from
|
|
61
|
-
* the hosted board's builders (
|
|
62
|
-
* `createArticleJsonLd` + `createAuthorProfilePageJsonLd`) and
|
|
63
|
-
* against them
|
|
60
|
+
* the hosted board's builders (the hosted board implementation:
|
|
61
|
+
* `createArticleJsonLd` + `createAuthorProfilePageJsonLd`) and tested
|
|
62
|
+
* against them .
|
|
64
63
|
*
|
|
65
64
|
* JSON-LD structure is locale-neutral — no board-language parameter; every
|
|
66
65
|
* display string is a wire value (or caller copy) passed through.
|
|
@@ -78,7 +77,7 @@ type ArticleJsonLdPost = Pick<PublicBlogPostSummary, 'title' | 'customExcerpt' |
|
|
|
78
77
|
* `image` follows the hosted precedence: the post's cover (feature) image
|
|
79
78
|
* first, then `ogImageUrl` — pass your page's OG image URL (hosted passes
|
|
80
79
|
* its generated `/blog/:slug/og` card; OG generation itself is app-owned
|
|
81
|
-
* per
|
|
80
|
+
* per ).
|
|
82
81
|
*/
|
|
83
82
|
declare function createBlogArticleJsonLd({ post, boardName, permalink, ogImageUrl, }: {
|
|
84
83
|
post: ArticleJsonLdPost;
|
|
@@ -132,7 +131,7 @@ declare function createBreadcrumbJsonLd(items: BreadcrumbItemInput[], options?:
|
|
|
132
131
|
* page.tsx:336-367.
|
|
133
132
|
*
|
|
134
133
|
* The Home/Jobs crumb names resolve from the copy catalog per board
|
|
135
|
-
* language ⊕ operator overrides
|
|
134
|
+
* language ⊕ operator overrides; omitting `language` keeps the
|
|
136
135
|
* English source, so existing call sites render unchanged.
|
|
137
136
|
*/
|
|
138
137
|
declare function buildJobBreadcrumbs(job: PublicJob, language?: string, labels?: BoardLabelOverrides): Array<{
|
|
@@ -142,7 +141,7 @@ declare function buildJobBreadcrumbs(job: PublicJob, language?: string, labels?:
|
|
|
142
141
|
|
|
143
142
|
/**
|
|
144
143
|
* Framework-neutral `<head>` + structural JSON-LD builders for jobs-listing
|
|
145
|
-
* pages
|
|
144
|
+
* pages. Locale-neutral pass-through: the caller supplies the
|
|
146
145
|
* heading/board copy (title/description COPY is board-SEO-config +
|
|
147
146
|
* localized — a named exclusion; these builders replicate the hosted
|
|
148
147
|
* STRUCTURE: title with result count, canonical, Open Graph, breadcrumb +
|
|
@@ -219,7 +218,7 @@ declare function formatRange(locale: string, min: number, max: number): string;
|
|
|
219
218
|
/**
|
|
220
219
|
* Seniority display label. Precedence (hosted shape): owner override >
|
|
221
220
|
* board-language lexicon (en = the English source labels) > title-case
|
|
222
|
-
* fallback for an unknown key
|
|
221
|
+
* fallback for an unknown key.
|
|
223
222
|
*/
|
|
224
223
|
declare function formatSeniority(locale: string, value: string, overrides?: Record<string, string>): string;
|
|
225
224
|
/** The canonical seniority ladder order the hosted salary pages sort by. */
|
package/dist/seo.d.ts
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { P as PublicBlogPostSummary, B as BlogAuthorEmbed, C as CompanyCategorySalary, a as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './salaries-
|
|
2
|
-
import { P as PublicBoard } from './board-
|
|
3
|
-
import { P as PublicJob } from './jobs-
|
|
4
|
-
import { B as BoardLabelOverrides } from './ui-copy-
|
|
5
|
-
import './_spec-
|
|
1
|
+
import { P as PublicBlogPostSummary, B as BlogAuthorEmbed, C as CompanyCategorySalary, a as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './salaries-QoNpzRCT.js';
|
|
2
|
+
import { P as PublicBoard } from './board-DKXyxwNN.js';
|
|
3
|
+
import { P as PublicJob } from './jobs-DTnCZGtb.js';
|
|
4
|
+
import { B as BoardLabelOverrides } from './ui-copy-CL-VN1xb.js';
|
|
5
|
+
import './_spec-sW85fuvT.js';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Google for Jobs `JobPosting` structured data on the `@cavuno/board` wire
|
|
9
9
|
* types, transcribed field-by-field from the hosted board's generator
|
|
10
|
-
* (
|
|
11
|
-
*
|
|
10
|
+
* (the hosted board implementation + `job-posting-location-json-ld.ts`) and
|
|
11
|
+
* tested against the hosted behavior.
|
|
12
12
|
*
|
|
13
13
|
* JSON-LD structure is locale-neutral per schema.org — no board-language
|
|
14
14
|
* parameter here; the only display strings are wire values passed through.
|
|
15
15
|
*
|
|
16
16
|
* Named exclusions (hosted behaviours with no wire twin, recorded in the
|
|
17
|
-
*
|
|
17
|
+
* public API contract):
|
|
18
18
|
* - `board.companyLegalName` — hosted falls back to it for the
|
|
19
19
|
* organization name between `company.name` and `board.name`; the wire
|
|
20
20
|
* board context does not expose it.
|
|
@@ -33,9 +33,8 @@ type JsonLdBoard = Pick<PublicBoard, 'name' | 'logoUrl'>;
|
|
|
33
33
|
* next to TELECOMMUTE (Google requires a location signal), so the hosted
|
|
34
34
|
* board — and this transcription — lists every country it recognises.
|
|
35
35
|
*
|
|
36
|
-
* This is the hosted board's exact country catalog
|
|
37
|
-
* `
|
|
38
|
-
* name, includes `XK` (Kosovo), excludes `KP` (North Korea). Golden-tested
|
|
36
|
+
* This is the hosted board's exact country catalog: sorted by English common
|
|
37
|
+
* name, includes `XK` (Kosovo), and excludes `KP` (North Korea). tested
|
|
39
38
|
* against the hosted list so the two cannot drift.
|
|
40
39
|
*/
|
|
41
40
|
declare const ALL_COUNTRY_CODES: readonly ["AF", "AX", "AL", "DZ", "AS", "AD", "AO", "AI", "AQ", "AG", "AR", "AM", "AW", "AU", "AT", "AZ", "BS", "BH", "BD", "BB", "BY", "BE", "BZ", "BJ", "BM", "BT", "BO", "BA", "BW", "BV", "BR", "IO", "VG", "BN", "BG", "BF", "BI", "KH", "CM", "CA", "CV", "BQ", "KY", "CF", "TD", "CL", "CN", "CX", "CC", "CO", "KM", "CK", "CR", "HR", "CU", "CW", "CY", "CZ", "DK", "DJ", "DM", "DO", "CD", "EC", "EG", "SV", "GQ", "ER", "EE", "SZ", "ET", "FK", "FO", "FJ", "FI", "FR", "GF", "PF", "TF", "GA", "GM", "GE", "DE", "GH", "GI", "GR", "GL", "GD", "GP", "GU", "GT", "GG", "GN", "GW", "GY", "HT", "HM", "HN", "HK", "HU", "IS", "IN", "ID", "IR", "IQ", "IE", "IM", "IL", "IT", "CI", "JM", "JP", "JE", "JO", "KZ", "KE", "KI", "XK", "KW", "KG", "LA", "LV", "LB", "LS", "LR", "LY", "LI", "LT", "LU", "MO", "MG", "MW", "MY", "MV", "ML", "MT", "MH", "MQ", "MR", "MU", "YT", "MX", "FM", "MD", "MC", "MN", "ME", "MS", "MA", "MZ", "MM", "NA", "NR", "NP", "NL", "NC", "NZ", "NI", "NE", "NG", "NU", "NF", "MK", "MP", "NO", "OM", "PK", "PW", "PS", "PA", "PG", "PY", "PE", "PH", "PN", "PL", "PT", "PR", "QA", "CG", "RE", "RO", "RU", "RW", "BL", "SH", "KN", "LC", "MF", "PM", "VC", "WS", "SM", "ST", "SA", "SN", "RS", "SC", "SL", "SG", "SX", "SK", "SI", "SB", "SO", "ZA", "GS", "KR", "SS", "ES", "LK", "SD", "SR", "SJ", "SE", "CH", "SY", "TW", "TJ", "TZ", "TH", "TL", "TG", "TK", "TO", "TT", "TN", "TR", "TM", "TC", "TV", "UG", "UA", "AE", "GB", "US", "UM", "VI", "UY", "UZ", "VU", "VA", "VE", "VN", "WF", "EH", "YE", "ZM", "ZW"];
|
|
@@ -58,9 +57,9 @@ declare function normalizeWebsiteUrl(website: string): string | null;
|
|
|
58
57
|
|
|
59
58
|
/**
|
|
60
59
|
* Blog structured data on the `@cavuno/board` wire types, transcribed from
|
|
61
|
-
* the hosted board's builders (
|
|
62
|
-
* `createArticleJsonLd` + `createAuthorProfilePageJsonLd`) and
|
|
63
|
-
* against them
|
|
60
|
+
* the hosted board's builders (the hosted board implementation:
|
|
61
|
+
* `createArticleJsonLd` + `createAuthorProfilePageJsonLd`) and tested
|
|
62
|
+
* against them .
|
|
64
63
|
*
|
|
65
64
|
* JSON-LD structure is locale-neutral — no board-language parameter; every
|
|
66
65
|
* display string is a wire value (or caller copy) passed through.
|
|
@@ -78,7 +77,7 @@ type ArticleJsonLdPost = Pick<PublicBlogPostSummary, 'title' | 'customExcerpt' |
|
|
|
78
77
|
* `image` follows the hosted precedence: the post's cover (feature) image
|
|
79
78
|
* first, then `ogImageUrl` — pass your page's OG image URL (hosted passes
|
|
80
79
|
* its generated `/blog/:slug/og` card; OG generation itself is app-owned
|
|
81
|
-
* per
|
|
80
|
+
* per ).
|
|
82
81
|
*/
|
|
83
82
|
declare function createBlogArticleJsonLd({ post, boardName, permalink, ogImageUrl, }: {
|
|
84
83
|
post: ArticleJsonLdPost;
|
|
@@ -132,7 +131,7 @@ declare function createBreadcrumbJsonLd(items: BreadcrumbItemInput[], options?:
|
|
|
132
131
|
* page.tsx:336-367.
|
|
133
132
|
*
|
|
134
133
|
* The Home/Jobs crumb names resolve from the copy catalog per board
|
|
135
|
-
* language ⊕ operator overrides
|
|
134
|
+
* language ⊕ operator overrides; omitting `language` keeps the
|
|
136
135
|
* English source, so existing call sites render unchanged.
|
|
137
136
|
*/
|
|
138
137
|
declare function buildJobBreadcrumbs(job: PublicJob, language?: string, labels?: BoardLabelOverrides): Array<{
|
|
@@ -142,7 +141,7 @@ declare function buildJobBreadcrumbs(job: PublicJob, language?: string, labels?:
|
|
|
142
141
|
|
|
143
142
|
/**
|
|
144
143
|
* Framework-neutral `<head>` + structural JSON-LD builders for jobs-listing
|
|
145
|
-
* pages
|
|
144
|
+
* pages. Locale-neutral pass-through: the caller supplies the
|
|
146
145
|
* heading/board copy (title/description COPY is board-SEO-config +
|
|
147
146
|
* localized — a named exclusion; these builders replicate the hosted
|
|
148
147
|
* STRUCTURE: title with result count, canonical, Open Graph, breadcrumb +
|
|
@@ -219,7 +218,7 @@ declare function formatRange(locale: string, min: number, max: number): string;
|
|
|
219
218
|
/**
|
|
220
219
|
* Seniority display label. Precedence (hosted shape): owner override >
|
|
221
220
|
* board-language lexicon (en = the English source labels) > title-case
|
|
222
|
-
* fallback for an unknown key
|
|
221
|
+
* fallback for an unknown key.
|
|
223
222
|
*/
|
|
224
223
|
declare function formatSeniority(locale: string, value: string, overrides?: Record<string, string>): string;
|
|
225
224
|
/** The canonical seniority ladder order the hosted salary pages sort by. */
|
package/dist/server.d.mts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { BoardSdk } from './index.mjs';
|
|
2
|
-
import './_spec-
|
|
3
|
-
import './search-
|
|
4
|
-
import './board-
|
|
5
|
-
import './jobs-
|
|
6
|
-
import './salaries-
|
|
2
|
+
import './_spec-sW85fuvT.mjs';
|
|
3
|
+
import './search-f93nrSg3.mjs';
|
|
4
|
+
import './board-QFeHT4UN.mjs';
|
|
5
|
+
import './jobs-CuRzTDb1.mjs';
|
|
6
|
+
import './salaries-BOpR51Ny.mjs';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Session cookie codec — pure (no framework imports, no node imports) so it
|
|
@@ -11,7 +11,7 @@ import './salaries-IJlchnWk.mjs';
|
|
|
11
11
|
* STRINGS (`Set-Cookie` values / `Cookie` headers), never framework response
|
|
12
12
|
* objects. The session is the SDK bearer pair plus the access-token expiry;
|
|
13
13
|
* it lives in ONE httpOnly cookie owned by the host app (the SDK never sees
|
|
14
|
-
* storage on the server —
|
|
14
|
+
* storage on the server — ).
|
|
15
15
|
*/
|
|
16
16
|
interface BoardSession {
|
|
17
17
|
accessToken: string;
|
|
@@ -59,7 +59,7 @@ declare function parseGrantCookie(cookieHeader: string | null, options?: {
|
|
|
59
59
|
/**
|
|
60
60
|
* Open-redirect guards — pure URL-safety logic (no cookies involved),
|
|
61
61
|
* transcribed from the hosted board's `validate-redirect-path.ts` and
|
|
62
|
-
*
|
|
62
|
+
* tested against it input-for-input.
|
|
63
63
|
*/
|
|
64
64
|
/**
|
|
65
65
|
* Guard a `?redirect=` / `?next=` param: a same-origin absolute path only
|
|
@@ -78,31 +78,13 @@ declare function safeRedirectPath(path: string | undefined | null, defaultPath?:
|
|
|
78
78
|
declare function currentPathFromReferer(referer: string | null): string;
|
|
79
79
|
|
|
80
80
|
/**
|
|
81
|
-
*
|
|
82
|
-
*
|
|
81
|
+
* Keep `<slug>.cavuno.app` working after a custom-domain cutover by
|
|
82
|
+
* 308-redirecting to the board's canonical custom domain.
|
|
83
83
|
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
* `createWfpReleaseDeploy` / `deterministicWorkerName`). That edge has
|
|
89
|
-
* **no board domain data** (no Convex, no primaryDomain). Inventing a
|
|
90
|
-
* second edge datastore for canonical hosts is forbidden by the ticket.
|
|
91
|
-
*
|
|
92
|
-
* Data source: the board's public context already carries
|
|
93
|
-
* `primaryDomain: string | null` (`GET /v1/boards/:id` via
|
|
94
|
-
* `serializeBoardContext`). The starter loads context for every request
|
|
95
|
-
* (theme, features, analytics) — reuse that field. When `primaryDomain`
|
|
96
|
-
* is set, a request whose Host is a `*.cavuno.app` serving host 308s to
|
|
97
|
-
* `https://<primaryDomain><path+query>` in **one hop**. Domainless boards
|
|
98
|
-
* (`primaryDomain === null`) keep **serving** from cavuno.app (no redirect).
|
|
99
|
-
*
|
|
100
|
-
* Wire this helper into the starter's root middleware / entry (the
|
|
101
|
-
* migration starter's host check) with `Response.redirect(url, 308)`.
|
|
102
|
-
* Pure so unit tests pin behaviour without a Worker runtime.
|
|
103
|
-
*
|
|
104
|
-
* Pattern: Vercel `*.vercel.app` / GitHub `github.io` permanent fallback
|
|
105
|
-
* origin — SEO-neutral 308 to the canonical production host.
|
|
84
|
+
* Pass `primaryDomain` from the public board context. When it is set, a
|
|
85
|
+
* request to a `*.cavuno.app` serving host redirects in one hop while
|
|
86
|
+
* preserving the path and query. A board without a custom domain keeps
|
|
87
|
+
* serving from its cavuno.app hostname.
|
|
106
88
|
*/
|
|
107
89
|
/**
|
|
108
90
|
* True when the request host is a cavuno.app board-serving host
|
|
@@ -129,7 +111,7 @@ declare function getCavunoAppCanonicalRedirectUrl(params: {
|
|
|
129
111
|
|
|
130
112
|
/**
|
|
131
113
|
* Single-flight session refresh — dedupes concurrent refreshes for the same
|
|
132
|
-
* session WITHIN one process/isolate (the rotation race,
|
|
114
|
+
* session WITHIN one process/isolate (the rotation race, ,
|
|
133
115
|
* mitigated at the one layer a client library can reach).
|
|
134
116
|
*
|
|
135
117
|
* Refresh tokens are single-use: two concurrent refreshes for the same
|
package/dist/server.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { BoardSdk } from './index.js';
|
|
2
|
-
import './_spec-
|
|
3
|
-
import './search-
|
|
4
|
-
import './board-
|
|
5
|
-
import './jobs-
|
|
6
|
-
import './salaries-
|
|
2
|
+
import './_spec-sW85fuvT.js';
|
|
3
|
+
import './search-B5ROY6PK.js';
|
|
4
|
+
import './board-DKXyxwNN.js';
|
|
5
|
+
import './jobs-DTnCZGtb.js';
|
|
6
|
+
import './salaries-QoNpzRCT.js';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Session cookie codec — pure (no framework imports, no node imports) so it
|
|
@@ -11,7 +11,7 @@ import './salaries-DMQsjLrV.js';
|
|
|
11
11
|
* STRINGS (`Set-Cookie` values / `Cookie` headers), never framework response
|
|
12
12
|
* objects. The session is the SDK bearer pair plus the access-token expiry;
|
|
13
13
|
* it lives in ONE httpOnly cookie owned by the host app (the SDK never sees
|
|
14
|
-
* storage on the server —
|
|
14
|
+
* storage on the server — ).
|
|
15
15
|
*/
|
|
16
16
|
interface BoardSession {
|
|
17
17
|
accessToken: string;
|
|
@@ -59,7 +59,7 @@ declare function parseGrantCookie(cookieHeader: string | null, options?: {
|
|
|
59
59
|
/**
|
|
60
60
|
* Open-redirect guards — pure URL-safety logic (no cookies involved),
|
|
61
61
|
* transcribed from the hosted board's `validate-redirect-path.ts` and
|
|
62
|
-
*
|
|
62
|
+
* tested against it input-for-input.
|
|
63
63
|
*/
|
|
64
64
|
/**
|
|
65
65
|
* Guard a `?redirect=` / `?next=` param: a same-origin absolute path only
|
|
@@ -78,31 +78,13 @@ declare function safeRedirectPath(path: string | undefined | null, defaultPath?:
|
|
|
78
78
|
declare function currentPathFromReferer(referer: string | null): string;
|
|
79
79
|
|
|
80
80
|
/**
|
|
81
|
-
*
|
|
82
|
-
*
|
|
81
|
+
* Keep `<slug>.cavuno.app` working after a custom-domain cutover by
|
|
82
|
+
* 308-redirecting to the board's canonical custom domain.
|
|
83
83
|
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
* `createWfpReleaseDeploy` / `deterministicWorkerName`). That edge has
|
|
89
|
-
* **no board domain data** (no Convex, no primaryDomain). Inventing a
|
|
90
|
-
* second edge datastore for canonical hosts is forbidden by the ticket.
|
|
91
|
-
*
|
|
92
|
-
* Data source: the board's public context already carries
|
|
93
|
-
* `primaryDomain: string | null` (`GET /v1/boards/:id` via
|
|
94
|
-
* `serializeBoardContext`). The starter loads context for every request
|
|
95
|
-
* (theme, features, analytics) — reuse that field. When `primaryDomain`
|
|
96
|
-
* is set, a request whose Host is a `*.cavuno.app` serving host 308s to
|
|
97
|
-
* `https://<primaryDomain><path+query>` in **one hop**. Domainless boards
|
|
98
|
-
* (`primaryDomain === null`) keep **serving** from cavuno.app (no redirect).
|
|
99
|
-
*
|
|
100
|
-
* Wire this helper into the starter's root middleware / entry (the
|
|
101
|
-
* migration starter's host check) with `Response.redirect(url, 308)`.
|
|
102
|
-
* Pure so unit tests pin behaviour without a Worker runtime.
|
|
103
|
-
*
|
|
104
|
-
* Pattern: Vercel `*.vercel.app` / GitHub `github.io` permanent fallback
|
|
105
|
-
* origin — SEO-neutral 308 to the canonical production host.
|
|
84
|
+
* Pass `primaryDomain` from the public board context. When it is set, a
|
|
85
|
+
* request to a `*.cavuno.app` serving host redirects in one hop while
|
|
86
|
+
* preserving the path and query. A board without a custom domain keeps
|
|
87
|
+
* serving from its cavuno.app hostname.
|
|
106
88
|
*/
|
|
107
89
|
/**
|
|
108
90
|
* True when the request host is a cavuno.app board-serving host
|
|
@@ -129,7 +111,7 @@ declare function getCavunoAppCanonicalRedirectUrl(params: {
|
|
|
129
111
|
|
|
130
112
|
/**
|
|
131
113
|
* Single-flight session refresh — dedupes concurrent refreshes for the same
|
|
132
|
-
* session WITHIN one process/isolate (the rotation race,
|
|
114
|
+
* session WITHIN one process/isolate (the rotation race, ,
|
|
133
115
|
* mitigated at the one layer a client library can reach).
|
|
134
116
|
*
|
|
135
117
|
* Refresh tokens are single-use: two concurrent refreshes for the same
|
package/dist/sitemap.d.mts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { BoardSdk } from './index.mjs';
|
|
2
|
-
import './_spec-
|
|
3
|
-
import './search-
|
|
4
|
-
import './board-
|
|
5
|
-
import './jobs-
|
|
6
|
-
import './salaries-
|
|
2
|
+
import './_spec-sW85fuvT.mjs';
|
|
3
|
+
import './search-f93nrSg3.mjs';
|
|
4
|
+
import './board-QFeHT4UN.mjs';
|
|
5
|
+
import './jobs-CuRzTDb1.mjs';
|
|
6
|
+
import './salaries-BOpR51Ny.mjs';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Sitemap primitives — the pure XML + bucket-filename logic behind a board
|
|
@@ -14,8 +14,8 @@ import './salaries-IJlchnWk.mjs';
|
|
|
14
14
|
*
|
|
15
15
|
* The XML byte layout transcribes the hosted serializers
|
|
16
16
|
* (`sitemap-xml.utils.ts` — `serializeBoardSitemap` /
|
|
17
|
-
* `serializeBoardSitemapIndex`) and is
|
|
18
|
-
* them
|
|
17
|
+
* `serializeBoardSitemapIndex`) and is tested byte-equal against
|
|
18
|
+
* them . `changefreq`/`priority` are deliberately not supported:
|
|
19
19
|
* the hosted builders never emit them.
|
|
20
20
|
*
|
|
21
21
|
* Network enumeration lives in `walker.ts`; this module is pure so the
|
package/dist/sitemap.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { BoardSdk } from './index.js';
|
|
2
|
-
import './_spec-
|
|
3
|
-
import './search-
|
|
4
|
-
import './board-
|
|
5
|
-
import './jobs-
|
|
6
|
-
import './salaries-
|
|
2
|
+
import './_spec-sW85fuvT.js';
|
|
3
|
+
import './search-B5ROY6PK.js';
|
|
4
|
+
import './board-DKXyxwNN.js';
|
|
5
|
+
import './jobs-DTnCZGtb.js';
|
|
6
|
+
import './salaries-QoNpzRCT.js';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Sitemap primitives — the pure XML + bucket-filename logic behind a board
|
|
@@ -14,8 +14,8 @@ import './salaries-DMQsjLrV.js';
|
|
|
14
14
|
*
|
|
15
15
|
* The XML byte layout transcribes the hosted serializers
|
|
16
16
|
* (`sitemap-xml.utils.ts` — `serializeBoardSitemap` /
|
|
17
|
-
* `serializeBoardSitemapIndex`) and is
|
|
18
|
-
* them
|
|
17
|
+
* `serializeBoardSitemapIndex`) and is tested byte-equal against
|
|
18
|
+
* them . `changefreq`/`priority` are deliberately not supported:
|
|
19
19
|
* the hosted builders never emit them.
|
|
20
20
|
*
|
|
21
21
|
* Network enumeration lives in `walker.ts`; this module is pure so the
|
package/dist/sitemap.js
CHANGED
|
@@ -222,7 +222,7 @@ var BOARD_PATHS = {
|
|
|
222
222
|
talent: "/talent",
|
|
223
223
|
employers: "/employers",
|
|
224
224
|
/**
|
|
225
|
-
* Alert-email surfaces
|
|
225
|
+
* Alert-email surfaces. Promoted out of raw literals in
|
|
226
226
|
* the job-alerts composer so /go indirection and email composition share
|
|
227
227
|
* one definition.
|
|
228
228
|
*/
|
|
@@ -339,7 +339,9 @@ async function jobsTaxonomy(board, origin, kind) {
|
|
|
339
339
|
async function jobsLocations(board, origin) {
|
|
340
340
|
const { language } = await board.context();
|
|
341
341
|
const { data } = await board.salaries.locations.list({ locale: language });
|
|
342
|
-
return data.filter(
|
|
342
|
+
return data.filter(
|
|
343
|
+
(location) => location.jobCount >= MIN_JOBS_PER_INDEXED_PAGE
|
|
344
|
+
).map((location) => location.placeSlug).sort().map((slug) => `${origin}${jobsLocationPath(slug)}`);
|
|
343
345
|
}
|
|
344
346
|
async function jobDetails(board, origin) {
|
|
345
347
|
const jobs = await enumerateJobs(board);
|