@cavuno/board 4.44.0 → 4.47.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 +61 -0
- package/dist/{_spec-CLxrfYJb.d.mts → _spec-DHa5r3B0.d.mts} +26 -2
- package/dist/{_spec-CLxrfYJb.d.ts → _spec-DHa5r3B0.d.ts} +26 -2
- package/dist/bin.mjs +179 -14
- package/dist/{blog-CQ40QX7l.d.mts → blog-DylAbc0L.d.mts} +1 -1
- package/dist/{blog-mlhJ6UcD.d.ts → blog-wxhB8zAH.d.ts} +1 -1
- package/dist/{board-TOzb2D8c.d.mts → board-Bpze3b50.d.mts} +2 -2
- package/dist/{board-DWFDeICw.d.ts → board-DHsd92Gy.d.ts} +2 -2
- package/dist/{breadcrumbs-DJHyzBji.d.ts → breadcrumbs-15j5xvmN.d.ts} +2 -2
- package/dist/{breadcrumbs-DauM7O7_.d.mts → breadcrumbs-B6yhrHJV.d.mts} +2 -2
- package/dist/browser/cavuno-board.global.min.js +1 -1
- package/dist/doctor.d.mts +1 -0
- package/dist/doctor.d.ts +1 -0
- package/dist/doctor.js +179 -14
- package/dist/doctor.mjs +179 -14
- package/dist/filters.d.mts +2 -2
- package/dist/filters.d.ts +2 -2
- package/dist/format.d.mts +4 -4
- package/dist/format.d.ts +4 -4
- package/dist/index.d.mts +33 -12
- package/dist/index.d.ts +33 -12
- package/dist/index.js +78 -20
- package/dist/index.mjs +78 -20
- package/dist/{jobs-DZVMzBOQ.d.ts → jobs-CIrTcMjw.d.ts} +1 -1
- package/dist/{jobs-CjQM8EPT.d.mts → jobs-CMK-DZg3.d.mts} +1 -1
- package/dist/{search-CF_wa20h.d.ts → search-666oDd7H.d.ts} +1 -1
- package/dist/{search-BtBE6iJO.d.mts → search-DBQApXN1.d.mts} +1 -1
- package/dist/seo-files.d.mts +25 -3
- package/dist/seo-files.d.ts +25 -3
- package/dist/seo-files.js +44 -10
- package/dist/seo-files.mjs +44 -10
- package/dist/{seo-0bfk63qi.d.mts → seo-gY8y9RMw.d.mts} +1 -1
- package/dist/{seo-CU9LpWH7.d.ts → seo-ynqiQmby.d.ts} +1 -1
- 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-filters/SKILL.md +13 -0
- package/skills/cavuno-board-i18n/SKILL.md +10 -0
- package/skills/cavuno-board-job-alerts/SKILL.md +2 -0
- package/skills/manifest.json +1 -1
package/dist/seo-files.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { B as BoardSeo } from './seo-
|
|
2
|
-
import './_spec-
|
|
1
|
+
import { B as BoardSeo } from './seo-gY8y9RMw.mjs';
|
|
2
|
+
import './_spec-DHa5r3B0.mjs';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* `@cavuno/board/seo-files` — platform-owned crawler/identity file bodies
|
|
@@ -18,13 +18,35 @@ declare const INDEXNOW_CACHE_CONTROL = "public, max-age=86400, must-revalidate";
|
|
|
18
18
|
type SeoFileResponseInit = {
|
|
19
19
|
method?: string;
|
|
20
20
|
};
|
|
21
|
+
/**
|
|
22
|
+
* The board's own listing roots, for boards that rename or localize their
|
|
23
|
+
* URL words (for example `/vacatures` in place of `/jobs`). Each root scopes
|
|
24
|
+
* one group of pagination `Disallow` rules. A missing, root (`/`) or unsafe
|
|
25
|
+
* value keeps the default English root for that group.
|
|
26
|
+
*/
|
|
27
|
+
type RobotsListingPaths = {
|
|
28
|
+
jobs?: string | null;
|
|
29
|
+
companies?: string | null;
|
|
30
|
+
talent?: string | null;
|
|
31
|
+
};
|
|
21
32
|
/** Lines of the hosted robots body (no sitemap line). Exported so tests and hosted can share the literal. */
|
|
22
33
|
declare function robotsBody(input: {
|
|
23
34
|
canonicalBase: string;
|
|
24
35
|
sandbox?: boolean;
|
|
36
|
+
listingPaths?: RobotsListingPaths | null;
|
|
37
|
+
/**
|
|
38
|
+
* Listing roots of the board's secondary languages, served under a
|
|
39
|
+
* language prefix with that language's own URL words (for example
|
|
40
|
+
* `/de/stellen`). Each safe root adds one group of pagination rules after
|
|
41
|
+
* the base ones, in order. A missing, root or unsafe value adds nothing,
|
|
42
|
+
* and a root already listed is not repeated.
|
|
43
|
+
*/
|
|
44
|
+
localeListingPaths?: readonly RobotsListingPaths[] | null;
|
|
25
45
|
}): string;
|
|
26
46
|
declare function robotsResponse(seo: Pick<BoardSeo, 'canonicalBase'> & {
|
|
27
47
|
sandbox?: boolean;
|
|
48
|
+
listingPaths?: RobotsListingPaths | null;
|
|
49
|
+
localeListingPaths?: readonly RobotsListingPaths[] | null;
|
|
28
50
|
}, init?: SeoFileResponseInit): Response;
|
|
29
51
|
declare function adsTxtResponse(seo: Pick<BoardSeo, 'adsTxt'>, init?: SeoFileResponseInit): Response;
|
|
30
52
|
declare function indexNowResponse(seo: Pick<BoardSeo, 'indexNowKey'>, init?: SeoFileResponseInit): Response;
|
|
@@ -33,4 +55,4 @@ declare function googleSiteVerificationMeta(token: string | null | undefined): {
|
|
|
33
55
|
content: string;
|
|
34
56
|
} | null;
|
|
35
57
|
|
|
36
|
-
export { ADS_TXT_CACHE_CONTROL, INDEXNOW_CACHE_CONTROL, ROBOTS_CACHE_CONTROL, SEO_FILE_CONTENT_TYPE, type SeoFileResponseInit, adsTxtResponse, googleSiteVerificationMeta, indexNowResponse, robotsBody, robotsResponse };
|
|
58
|
+
export { ADS_TXT_CACHE_CONTROL, INDEXNOW_CACHE_CONTROL, ROBOTS_CACHE_CONTROL, type RobotsListingPaths, SEO_FILE_CONTENT_TYPE, type SeoFileResponseInit, adsTxtResponse, googleSiteVerificationMeta, indexNowResponse, robotsBody, robotsResponse };
|
package/dist/seo-files.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { B as BoardSeo } from './seo-
|
|
2
|
-
import './_spec-
|
|
1
|
+
import { B as BoardSeo } from './seo-ynqiQmby.js';
|
|
2
|
+
import './_spec-DHa5r3B0.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* `@cavuno/board/seo-files` — platform-owned crawler/identity file bodies
|
|
@@ -18,13 +18,35 @@ declare const INDEXNOW_CACHE_CONTROL = "public, max-age=86400, must-revalidate";
|
|
|
18
18
|
type SeoFileResponseInit = {
|
|
19
19
|
method?: string;
|
|
20
20
|
};
|
|
21
|
+
/**
|
|
22
|
+
* The board's own listing roots, for boards that rename or localize their
|
|
23
|
+
* URL words (for example `/vacatures` in place of `/jobs`). Each root scopes
|
|
24
|
+
* one group of pagination `Disallow` rules. A missing, root (`/`) or unsafe
|
|
25
|
+
* value keeps the default English root for that group.
|
|
26
|
+
*/
|
|
27
|
+
type RobotsListingPaths = {
|
|
28
|
+
jobs?: string | null;
|
|
29
|
+
companies?: string | null;
|
|
30
|
+
talent?: string | null;
|
|
31
|
+
};
|
|
21
32
|
/** Lines of the hosted robots body (no sitemap line). Exported so tests and hosted can share the literal. */
|
|
22
33
|
declare function robotsBody(input: {
|
|
23
34
|
canonicalBase: string;
|
|
24
35
|
sandbox?: boolean;
|
|
36
|
+
listingPaths?: RobotsListingPaths | null;
|
|
37
|
+
/**
|
|
38
|
+
* Listing roots of the board's secondary languages, served under a
|
|
39
|
+
* language prefix with that language's own URL words (for example
|
|
40
|
+
* `/de/stellen`). Each safe root adds one group of pagination rules after
|
|
41
|
+
* the base ones, in order. A missing, root or unsafe value adds nothing,
|
|
42
|
+
* and a root already listed is not repeated.
|
|
43
|
+
*/
|
|
44
|
+
localeListingPaths?: readonly RobotsListingPaths[] | null;
|
|
25
45
|
}): string;
|
|
26
46
|
declare function robotsResponse(seo: Pick<BoardSeo, 'canonicalBase'> & {
|
|
27
47
|
sandbox?: boolean;
|
|
48
|
+
listingPaths?: RobotsListingPaths | null;
|
|
49
|
+
localeListingPaths?: readonly RobotsListingPaths[] | null;
|
|
28
50
|
}, init?: SeoFileResponseInit): Response;
|
|
29
51
|
declare function adsTxtResponse(seo: Pick<BoardSeo, 'adsTxt'>, init?: SeoFileResponseInit): Response;
|
|
30
52
|
declare function indexNowResponse(seo: Pick<BoardSeo, 'indexNowKey'>, init?: SeoFileResponseInit): Response;
|
|
@@ -33,4 +55,4 @@ declare function googleSiteVerificationMeta(token: string | null | undefined): {
|
|
|
33
55
|
content: string;
|
|
34
56
|
} | null;
|
|
35
57
|
|
|
36
|
-
export { ADS_TXT_CACHE_CONTROL, INDEXNOW_CACHE_CONTROL, ROBOTS_CACHE_CONTROL, SEO_FILE_CONTENT_TYPE, type SeoFileResponseInit, adsTxtResponse, googleSiteVerificationMeta, indexNowResponse, robotsBody, robotsResponse };
|
|
58
|
+
export { ADS_TXT_CACHE_CONTROL, INDEXNOW_CACHE_CONTROL, ROBOTS_CACHE_CONTROL, type RobotsListingPaths, SEO_FILE_CONTENT_TYPE, type SeoFileResponseInit, adsTxtResponse, googleSiteVerificationMeta, indexNowResponse, robotsBody, robotsResponse };
|
package/dist/seo-files.js
CHANGED
|
@@ -35,25 +35,54 @@ var SEO_FILE_CONTENT_TYPE = "text/plain; charset=utf-8";
|
|
|
35
35
|
var ROBOTS_CACHE_CONTROL = "public, max-age=600, s-maxage=14400, stale-while-revalidate=86400";
|
|
36
36
|
var ADS_TXT_CACHE_CONTROL = "public, max-age=3600, must-revalidate";
|
|
37
37
|
var INDEXNOW_CACHE_CONTROL = "public, max-age=86400, must-revalidate";
|
|
38
|
+
var DEFAULT_LISTING_PATHS = {
|
|
39
|
+
jobs: "/jobs",
|
|
40
|
+
companies: "/companies",
|
|
41
|
+
talent: "/talent"
|
|
42
|
+
};
|
|
43
|
+
var SAFE_LISTING_ROOT = /^(?:\/[^\s/*$?#]+)+$/;
|
|
44
|
+
function safeListingRoot(value) {
|
|
45
|
+
if (typeof value !== "string") return null;
|
|
46
|
+
const root = value.replace(/\/+$/, "");
|
|
47
|
+
return SAFE_LISTING_ROOT.test(root) ? root : null;
|
|
48
|
+
}
|
|
49
|
+
function listingRoot(value, fallback) {
|
|
50
|
+
return safeListingRoot(value) ?? fallback;
|
|
51
|
+
}
|
|
52
|
+
var LISTING_GROUPS = ["jobs", "companies", "talent"];
|
|
53
|
+
function paginationRules(root) {
|
|
54
|
+
return [
|
|
55
|
+
`Disallow: ${root}?page=`,
|
|
56
|
+
`Disallow: ${root}*&page=`,
|
|
57
|
+
`Disallow: ${root}/*?page=`
|
|
58
|
+
];
|
|
59
|
+
}
|
|
38
60
|
function robotsBody(input) {
|
|
39
61
|
if (input.sandbox) {
|
|
40
62
|
return ["User-Agent: *", "Disallow: /", ""].join("\n");
|
|
41
63
|
}
|
|
42
64
|
const canonicalBase = input.canonicalBase.replace(/\/+$/, "");
|
|
65
|
+
const paths = input.listingPaths ?? {};
|
|
66
|
+
const baseRoots = LISTING_GROUPS.map(
|
|
67
|
+
(group) => listingRoot(paths[group], DEFAULT_LISTING_PATHS[group])
|
|
68
|
+
);
|
|
69
|
+
const seen = new Set(baseRoots);
|
|
70
|
+
const localeRoots = [];
|
|
71
|
+
for (const locale of input.localeListingPaths ?? []) {
|
|
72
|
+
for (const group of LISTING_GROUPS) {
|
|
73
|
+
const root = safeListingRoot(locale[group]);
|
|
74
|
+
if (root === null || seen.has(root)) continue;
|
|
75
|
+
seen.add(root);
|
|
76
|
+
localeRoots.push(root);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
43
79
|
return [
|
|
44
80
|
"User-Agent: *",
|
|
45
81
|
"Allow: /",
|
|
46
82
|
"Disallow: /go/",
|
|
47
83
|
"Disallow: /t/",
|
|
48
|
-
|
|
49
|
-
|
|
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=",
|
|
84
|
+
...baseRoots.flatMap(paginationRules),
|
|
85
|
+
...localeRoots.flatMap(paginationRules),
|
|
57
86
|
"",
|
|
58
87
|
`Sitemap: ${canonicalBase}/sitemap.xml`,
|
|
59
88
|
""
|
|
@@ -61,7 +90,12 @@ function robotsBody(input) {
|
|
|
61
90
|
}
|
|
62
91
|
function robotsResponse(seo, init) {
|
|
63
92
|
return textFileResponse(
|
|
64
|
-
robotsBody({
|
|
93
|
+
robotsBody({
|
|
94
|
+
canonicalBase: seo.canonicalBase,
|
|
95
|
+
sandbox: seo.sandbox,
|
|
96
|
+
listingPaths: seo.listingPaths,
|
|
97
|
+
localeListingPaths: seo.localeListingPaths
|
|
98
|
+
}),
|
|
65
99
|
ROBOTS_CACHE_CONTROL,
|
|
66
100
|
init
|
|
67
101
|
);
|
package/dist/seo-files.mjs
CHANGED
|
@@ -3,25 +3,54 @@ var SEO_FILE_CONTENT_TYPE = "text/plain; charset=utf-8";
|
|
|
3
3
|
var ROBOTS_CACHE_CONTROL = "public, max-age=600, s-maxage=14400, stale-while-revalidate=86400";
|
|
4
4
|
var ADS_TXT_CACHE_CONTROL = "public, max-age=3600, must-revalidate";
|
|
5
5
|
var INDEXNOW_CACHE_CONTROL = "public, max-age=86400, must-revalidate";
|
|
6
|
+
var DEFAULT_LISTING_PATHS = {
|
|
7
|
+
jobs: "/jobs",
|
|
8
|
+
companies: "/companies",
|
|
9
|
+
talent: "/talent"
|
|
10
|
+
};
|
|
11
|
+
var SAFE_LISTING_ROOT = /^(?:\/[^\s/*$?#]+)+$/;
|
|
12
|
+
function safeListingRoot(value) {
|
|
13
|
+
if (typeof value !== "string") return null;
|
|
14
|
+
const root = value.replace(/\/+$/, "");
|
|
15
|
+
return SAFE_LISTING_ROOT.test(root) ? root : null;
|
|
16
|
+
}
|
|
17
|
+
function listingRoot(value, fallback) {
|
|
18
|
+
return safeListingRoot(value) ?? fallback;
|
|
19
|
+
}
|
|
20
|
+
var LISTING_GROUPS = ["jobs", "companies", "talent"];
|
|
21
|
+
function paginationRules(root) {
|
|
22
|
+
return [
|
|
23
|
+
`Disallow: ${root}?page=`,
|
|
24
|
+
`Disallow: ${root}*&page=`,
|
|
25
|
+
`Disallow: ${root}/*?page=`
|
|
26
|
+
];
|
|
27
|
+
}
|
|
6
28
|
function robotsBody(input) {
|
|
7
29
|
if (input.sandbox) {
|
|
8
30
|
return ["User-Agent: *", "Disallow: /", ""].join("\n");
|
|
9
31
|
}
|
|
10
32
|
const canonicalBase = input.canonicalBase.replace(/\/+$/, "");
|
|
33
|
+
const paths = input.listingPaths ?? {};
|
|
34
|
+
const baseRoots = LISTING_GROUPS.map(
|
|
35
|
+
(group) => listingRoot(paths[group], DEFAULT_LISTING_PATHS[group])
|
|
36
|
+
);
|
|
37
|
+
const seen = new Set(baseRoots);
|
|
38
|
+
const localeRoots = [];
|
|
39
|
+
for (const locale of input.localeListingPaths ?? []) {
|
|
40
|
+
for (const group of LISTING_GROUPS) {
|
|
41
|
+
const root = safeListingRoot(locale[group]);
|
|
42
|
+
if (root === null || seen.has(root)) continue;
|
|
43
|
+
seen.add(root);
|
|
44
|
+
localeRoots.push(root);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
11
47
|
return [
|
|
12
48
|
"User-Agent: *",
|
|
13
49
|
"Allow: /",
|
|
14
50
|
"Disallow: /go/",
|
|
15
51
|
"Disallow: /t/",
|
|
16
|
-
|
|
17
|
-
|
|
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=",
|
|
52
|
+
...baseRoots.flatMap(paginationRules),
|
|
53
|
+
...localeRoots.flatMap(paginationRules),
|
|
25
54
|
"",
|
|
26
55
|
`Sitemap: ${canonicalBase}/sitemap.xml`,
|
|
27
56
|
""
|
|
@@ -29,7 +58,12 @@ function robotsBody(input) {
|
|
|
29
58
|
}
|
|
30
59
|
function robotsResponse(seo, init) {
|
|
31
60
|
return textFileResponse(
|
|
32
|
-
robotsBody({
|
|
61
|
+
robotsBody({
|
|
62
|
+
canonicalBase: seo.canonicalBase,
|
|
63
|
+
sandbox: seo.sandbox,
|
|
64
|
+
listingPaths: seo.listingPaths,
|
|
65
|
+
localeListingPaths: seo.localeListingPaths
|
|
66
|
+
}),
|
|
33
67
|
ROBOTS_CACHE_CONTROL,
|
|
34
68
|
init
|
|
35
69
|
);
|
package/dist/seo.d.mts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-
|
|
2
|
-
import { e as JsonLdObject } from './breadcrumbs-
|
|
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-
|
|
4
|
-
import './_spec-
|
|
5
|
-
import './board-
|
|
6
|
-
import './jobs-
|
|
1
|
+
import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-DylAbc0L.mjs';
|
|
2
|
+
import { e as JsonLdObject } from './breadcrumbs-B6yhrHJV.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-B6yhrHJV.mjs';
|
|
4
|
+
import './_spec-DHa5r3B0.mjs';
|
|
5
|
+
import './board-Bpze3b50.mjs';
|
|
6
|
+
import './jobs-CMK-DZg3.mjs';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Blog structured data on the `@cavuno/board` wire types, transcribed from
|
package/dist/seo.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-
|
|
2
|
-
import { e as JsonLdObject } from './breadcrumbs-
|
|
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-
|
|
4
|
-
import './_spec-
|
|
5
|
-
import './board-
|
|
6
|
-
import './jobs-
|
|
1
|
+
import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-wxhB8zAH.js';
|
|
2
|
+
import { e as JsonLdObject } from './breadcrumbs-15j5xvmN.js';
|
|
3
|
+
export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-15j5xvmN.js';
|
|
4
|
+
import './_spec-DHa5r3B0.js';
|
|
5
|
+
import './board-DHsd92Gy.js';
|
|
6
|
+
import './jobs-CIrTcMjw.js';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Blog structured data on the `@cavuno/board` wire types, transcribed from
|
package/dist/server.d.mts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { BoardSdk } from './index.mjs';
|
|
2
|
-
import './_spec-
|
|
3
|
-
import './search-
|
|
4
|
-
import './jobs-
|
|
5
|
-
import './board-
|
|
6
|
-
import './seo-
|
|
7
|
-
import './blog-
|
|
2
|
+
import './_spec-DHa5r3B0.mjs';
|
|
3
|
+
import './search-DBQApXN1.mjs';
|
|
4
|
+
import './jobs-CMK-DZg3.mjs';
|
|
5
|
+
import './board-Bpze3b50.mjs';
|
|
6
|
+
import './seo-gY8y9RMw.mjs';
|
|
7
|
+
import './blog-DylAbc0L.mjs';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Session cookie codec — pure (no framework imports, no node imports) so it
|
package/dist/server.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { BoardSdk } from './index.js';
|
|
2
|
-
import './_spec-
|
|
3
|
-
import './search-
|
|
4
|
-
import './jobs-
|
|
5
|
-
import './board-
|
|
6
|
-
import './seo-
|
|
7
|
-
import './blog-
|
|
2
|
+
import './_spec-DHa5r3B0.js';
|
|
3
|
+
import './search-666oDd7H.js';
|
|
4
|
+
import './jobs-CIrTcMjw.js';
|
|
5
|
+
import './board-DHsd92Gy.js';
|
|
6
|
+
import './seo-ynqiQmby.js';
|
|
7
|
+
import './blog-wxhB8zAH.js';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Session cookie codec — pure (no framework imports, no node imports) so it
|
package/dist/sitemap.d.mts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { BoardSdk } from './index.mjs';
|
|
2
|
-
import './_spec-
|
|
3
|
-
import './search-
|
|
4
|
-
import './jobs-
|
|
5
|
-
import './board-
|
|
6
|
-
import './seo-
|
|
7
|
-
import './blog-
|
|
2
|
+
import './_spec-DHa5r3B0.mjs';
|
|
3
|
+
import './search-DBQApXN1.mjs';
|
|
4
|
+
import './jobs-CMK-DZg3.mjs';
|
|
5
|
+
import './board-Bpze3b50.mjs';
|
|
6
|
+
import './seo-gY8y9RMw.mjs';
|
|
7
|
+
import './blog-DylAbc0L.mjs';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Sitemap primitives — the pure XML + bucket-filename logic behind a board
|
package/dist/sitemap.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { BoardSdk } from './index.js';
|
|
2
|
-
import './_spec-
|
|
3
|
-
import './search-
|
|
4
|
-
import './jobs-
|
|
5
|
-
import './board-
|
|
6
|
-
import './seo-
|
|
7
|
-
import './blog-
|
|
2
|
+
import './_spec-DHa5r3B0.js';
|
|
3
|
+
import './search-666oDd7H.js';
|
|
4
|
+
import './jobs-CIrTcMjw.js';
|
|
5
|
+
import './board-DHsd92Gy.js';
|
|
6
|
+
import './seo-ynqiQmby.js';
|
|
7
|
+
import './blog-wxhB8zAH.js';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Sitemap primitives — the pure XML + bucket-filename logic behind a board
|
package/dist/suggest.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-
|
|
2
|
-
import './_spec-
|
|
1
|
+
import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-DBQApXN1.mjs';
|
|
2
|
+
import './_spec-DHa5r3B0.mjs';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* `@cavuno/board/suggest` — framework-agnostic headless search-suggest
|
package/dist/suggest.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-
|
|
2
|
-
import './_spec-
|
|
1
|
+
import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-666oDd7H.js';
|
|
2
|
+
import './_spec-DHa5r3B0.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* `@cavuno/board/suggest` — framework-agnostic headless search-suggest
|
package/package.json
CHANGED
|
@@ -150,6 +150,19 @@ const { items } = await board.search.suggest({
|
|
|
150
150
|
The host router owns URL serialization and saved-filter persistence.
|
|
151
151
|
Locations come from `board.taxonomy.places` rather than a static filter export.
|
|
152
152
|
|
|
153
|
+
A talent directory's location filter lists the places where the board's
|
|
154
|
+
candidates live instead, from `board.talent.places.list()`, with the count the
|
|
155
|
+
viewer can see. Pass `q` to search it for a location box (same matching as
|
|
156
|
+
`board.taxonomy.places.list`'s `q`). Pass the chosen `slug` as the directory's
|
|
157
|
+
`place`:
|
|
158
|
+
|
|
159
|
+
```ts snippet
|
|
160
|
+
const { data: talentPlaces } = await board.talent.places.list({ limit: 50 });
|
|
161
|
+
const nearby = await board.talent.list({ place: talentPlaces[0]?.slug ?? undefined });
|
|
162
|
+
|
|
163
|
+
void nearby.data;
|
|
164
|
+
```
|
|
165
|
+
|
|
153
166
|
## Filter jobs by a job custom field
|
|
154
167
|
|
|
155
168
|
The operator's job custom fields arrive as definitions on
|
|
@@ -44,6 +44,16 @@ Use the installed framework and i18n guidance for routing, SSR locale detection,
|
|
|
44
44
|
|
|
45
45
|
A compile-time i18n system can replace the seam's backing source. Keep the seam provider-free unless the chosen framework integration itself requires a provider.
|
|
46
46
|
|
|
47
|
+
## Renaming a URL word
|
|
48
|
+
|
|
49
|
+
When a translated URL segment changes (for example `vacatures` to `banen`), links that used the old word must keep working. List every retired word in `src/url-words-previous.json`, keyed by locale and canonical segment:
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{ "nl": { "jobs": ["vacatures"] } }
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Starters that read this file redirect a request that uses a retired word to the current word with one 308; the SDK itself does not perform the redirect. List each word under one segment only, and never list a word that is in current use. On boards built with the Cavuno builder, the hosting platform maintains this file at every save. Do not delete entries: an old link stops working the moment its word leaves the list.
|
|
56
|
+
|
|
47
57
|
## Own the five obligations
|
|
48
58
|
|
|
49
59
|
The SDK formats amounts, units, and relative dates with `Intl` and returns
|
|
@@ -42,6 +42,8 @@ switch (result.status) {
|
|
|
42
42
|
|
|
43
43
|
Only `jobFunctions`, `placeSlugs`, and `remoteOptions` filter digest delivery. Seniority and salary fields are stored but do not scope delivery. The supported cadence is `weekly`.
|
|
44
44
|
|
|
45
|
+
`jobFunctions` are category and skill slugs (the `slug` of a category or skill, such as `engineering` or `media-and-communication`). A digest matches a job when any entry equals one of the job's category or skill slugs. Prefer sending slugs. If you send display names or free-text keywords instead, the server slugifies each one when the alert is saved and matches it against the board's category and skill slugs, their aliases, and their board-language slugs. A display name that does not slugify to one of those (for example, a renamed category) is stored slugified and will not match, so send slugs whenever you have them. Alerts read back from the API therefore always carry slugs, so compare and display them as slugs.
|
|
46
|
+
|
|
45
47
|
## Anonymous lane: manage-token transport
|
|
46
48
|
|
|
47
49
|
The read and write transports intentionally use different keys:
|
package/skills/manifest.json
CHANGED