@cavuno/board 1.33.1 → 1.35.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/README.md +7 -8
- package/dist/bin.mjs +91 -21
- package/dist/{board-BTVapQiL.d.mts → board-Be8dY9Ba.d.mts} +1 -1
- package/dist/{board-0yI5ZRJw.d.ts → board-DsRbgz_D.d.ts} +1 -1
- package/dist/filters.d.mts +1 -1
- package/dist/filters.d.ts +1 -1
- package/dist/format.d.mts +2 -2
- package/dist/format.d.ts +2 -2
- package/dist/index.d.mts +32 -16
- package/dist/index.d.ts +32 -16
- package/dist/index.js +6 -3
- package/dist/index.mjs +6 -3
- package/dist/{jobs-Di4AV-02.d.mts → jobs-BFLMDNEN.d.mts} +194 -29
- package/dist/{jobs-Di4AV-02.d.ts → jobs-BFLMDNEN.d.ts} +194 -29
- package/dist/paths.d.mts +72 -0
- package/dist/paths.d.ts +72 -0
- package/dist/paths.js +99 -0
- package/dist/paths.mjs +78 -0
- package/dist/{salaries-B-zJKjkk.d.ts → salaries-negE75t8.d.ts} +4 -4
- package/dist/{salaries-D-BGZpDC.d.mts → salaries-pO_vGORE.d.mts} +4 -4
- package/dist/seo.d.mts +3 -3
- package/dist/seo.d.ts +3 -3
- package/dist/server.d.mts +3 -3
- package/dist/server.d.ts +3 -3
- package/dist/sitemap.d.mts +3 -3
- package/dist/sitemap.d.ts +3 -3
- package/dist/sitemap.js +89 -29
- package/dist/sitemap.mjs +89 -29
- package/package.json +11 -1
- package/skills/cavuno-board-auth/SKILL.md +0 -1
- package/skills/cavuno-board-client/SKILL.md +1 -4
- package/skills/cavuno-board-job-alerts/SKILL.md +4 -3
- package/skills/cavuno-board-jobs/SKILL.md +2 -2
- package/skills/cavuno-board-setup/SKILL.md +6 -8
- package/skills/cavuno-board-smoke-test/SKILL.md +7 -6
- package/skills/cavuno-board-theme/SKILL.md +33 -45
- package/skills/flavors/tanstack-start/SKILL.md +0 -1
- package/skills/manifest.json +4 -4
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# @cavuno/board
|
|
2
2
|
|
|
3
3
|
Typed, isomorphic client for the [Cavuno](https://cavuno.com) Board API —
|
|
4
|
-
the headless toolkit for building fully
|
|
4
|
+
the headless toolkit for building fully custom job board frontends. Zero
|
|
5
5
|
dependencies; runs in the browser, Node ≥ 20, and Cloudflare Workers.
|
|
6
6
|
|
|
7
7
|
You bring the framework and own the layout; the SDK brings the job board:
|
|
@@ -12,14 +12,14 @@ contract.
|
|
|
12
12
|
|
|
13
13
|
## Building with a coding agent
|
|
14
14
|
|
|
15
|
-
The package ships an
|
|
16
|
-
|
|
15
|
+
The package ships an Agent Skills corpus for Codex, Claude Code, Cursor, and
|
|
16
|
+
other compatible coding agents. It teaches them how to wire a board correctly — client setup,
|
|
17
17
|
auth and session ownership, pagination, gating, error handling, and a
|
|
18
18
|
runtime smoke test:
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
|
-
npm install @cavuno/board
|
|
22
|
-
npx cavuno
|
|
21
|
+
npm install @cavuno/board # or: pnpm add / yarn add / bun add
|
|
22
|
+
npx @cavuno/board setup # copies version-matched Agent Skills
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
Then ask your agent: *"set up my Cavuno board"* — it reads the
|
|
@@ -33,8 +33,7 @@ never works from stale docs.
|
|
|
33
33
|
import { createBoardClient } from '@cavuno/board';
|
|
34
34
|
|
|
35
35
|
const board = createBoardClient({
|
|
36
|
-
|
|
37
|
-
board: process.env.PUBLIC_CAVUNO_BOARD!, // pk_… publishable key
|
|
36
|
+
board: process.env.PUBLIC_CAVUNO_BOARD!, // pk_… publishable key
|
|
38
37
|
});
|
|
39
38
|
|
|
40
39
|
const { name, theme, features } = await board.context();
|
|
@@ -80,7 +79,7 @@ SDK doesn't cover yet.
|
|
|
80
79
|
|
|
81
80
|
## Docs
|
|
82
81
|
|
|
83
|
-
-
|
|
82
|
+
- SDK guides and reference: https://cavuno.com/docs/sdk
|
|
84
83
|
- The OpenAPI document: `GET https://api.cavuno.com/v1/openapi.json`
|
|
85
84
|
- Reference starter (TanStack Start on Cloudflare Workers):
|
|
86
85
|
https://github.com/wollemiahq/cavuno-board-starter
|
package/dist/bin.mjs
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
+
// src/constants.ts
|
|
4
|
+
var DEFAULT_CAVUNO_API_URL = "https://api.cavuno.com";
|
|
5
|
+
|
|
3
6
|
// src/skills.ts
|
|
4
7
|
import { readFileSync } from "fs";
|
|
5
8
|
import { dirname, resolve } from "path";
|
|
@@ -220,6 +223,58 @@ async function runReadProbes(fetchImpl, frontendUrl) {
|
|
|
220
223
|
];
|
|
221
224
|
}
|
|
222
225
|
|
|
226
|
+
// src/doctor/theme.ts
|
|
227
|
+
import { createHash } from "crypto";
|
|
228
|
+
import { existsSync, readFileSync as readFileSync2 } from "fs";
|
|
229
|
+
import { join } from "path";
|
|
230
|
+
var THEME = record("static.theme", 1);
|
|
231
|
+
function checkThemeFreshness(projectRoot, context) {
|
|
232
|
+
const tokensPath = join(projectRoot, "src/tokens.css");
|
|
233
|
+
if (!existsSync(tokensPath)) {
|
|
234
|
+
return [
|
|
235
|
+
THEME(
|
|
236
|
+
"skip",
|
|
237
|
+
"board is not tokens-migrated (ADR-0065) \u2014 no src/tokens.css"
|
|
238
|
+
)
|
|
239
|
+
];
|
|
240
|
+
}
|
|
241
|
+
const tokensHash = createHash("sha256").update(readFileSync2(tokensPath, "utf8"), "utf8").digest("hex");
|
|
242
|
+
const resolvedPath = join(projectRoot, "src/theme/resolved.ts");
|
|
243
|
+
const resolvedHash = existsSync(resolvedPath) ? readFileSync2(resolvedPath, "utf8").match(
|
|
244
|
+
/tokensHash = '([0-9a-f]{64})'/
|
|
245
|
+
)?.[1] ?? null : null;
|
|
246
|
+
if (resolvedHash !== tokensHash) {
|
|
247
|
+
return [
|
|
248
|
+
THEME(
|
|
249
|
+
"fail",
|
|
250
|
+
`src/theme/resolved.ts is ${resolvedHash ? "stale" : "missing"} \u2014 run \`npm run gen:theme\` (OG images render from it)`
|
|
251
|
+
)
|
|
252
|
+
];
|
|
253
|
+
}
|
|
254
|
+
if (!context) {
|
|
255
|
+
return [
|
|
256
|
+
THEME(
|
|
257
|
+
"skip",
|
|
258
|
+
"local derivations fresh; platform snapshot unverified \u2014 board context unavailable"
|
|
259
|
+
)
|
|
260
|
+
];
|
|
261
|
+
}
|
|
262
|
+
if (context.themeSnapshotHash !== tokensHash) {
|
|
263
|
+
return [
|
|
264
|
+
THEME(
|
|
265
|
+
"fail",
|
|
266
|
+
`platform theme snapshot is ${context.themeSnapshotHash ? "stale" : "missing"} \u2014 emails render ${context.themeSnapshotHash ? "an old" : "the legacy"} theme; sync it: \`npm run gen:theme -- --payload | npx convex run boards/themeSnapshot:sync\``
|
|
267
|
+
)
|
|
268
|
+
];
|
|
269
|
+
}
|
|
270
|
+
return [
|
|
271
|
+
THEME(
|
|
272
|
+
"pass",
|
|
273
|
+
`tokens.css \u21C4 resolved module \u21C4 platform snapshot (${tokensHash.slice(0, 12)}\u2026)`
|
|
274
|
+
)
|
|
275
|
+
];
|
|
276
|
+
}
|
|
277
|
+
|
|
223
278
|
// src/doctor/writes.ts
|
|
224
279
|
var WRITE = {
|
|
225
280
|
board: record("write.board", 3),
|
|
@@ -425,8 +480,8 @@ async function runWriteProbes(options) {
|
|
|
425
480
|
}
|
|
426
481
|
|
|
427
482
|
// src/doctor/run.ts
|
|
428
|
-
import { existsSync, readFileSync as
|
|
429
|
-
import { join } from "path";
|
|
483
|
+
import { existsSync as existsSync2, readFileSync as readFileSync3 } from "fs";
|
|
484
|
+
import { join as join2 } from "path";
|
|
430
485
|
var STATIC_API = record("static.api", 1);
|
|
431
486
|
var STATIC_BOARD = record("static.board", 1);
|
|
432
487
|
var STATIC_SKILLS = record("static.skills", 1);
|
|
@@ -486,15 +541,19 @@ async function checkBoardResolves(fetchImpl, env) {
|
|
|
486
541
|
context: parsed
|
|
487
542
|
};
|
|
488
543
|
}
|
|
489
|
-
var SKILL_ROOTS = [
|
|
544
|
+
var SKILL_ROOTS = [
|
|
545
|
+
".claude/skills",
|
|
546
|
+
".agents/skills",
|
|
547
|
+
".cursor/skills"
|
|
548
|
+
];
|
|
490
549
|
function checkSkillsFreshness(projectRoot) {
|
|
491
|
-
const roots = SKILL_ROOTS.map((root) =>
|
|
492
|
-
(root) =>
|
|
550
|
+
const roots = SKILL_ROOTS.map((root) => join2(projectRoot, root)).filter(
|
|
551
|
+
(root) => existsSync2(root)
|
|
493
552
|
);
|
|
494
553
|
if (roots.length === 0) {
|
|
495
554
|
return STATIC_SKILLS(
|
|
496
555
|
"skip",
|
|
497
|
-
"no .claude/skills or .
|
|
556
|
+
"no .claude/skills, .agents/skills, or .cursor/skills directory \u2014 run `npx @cavuno/board setup` to install agent skills"
|
|
498
557
|
);
|
|
499
558
|
}
|
|
500
559
|
const corpus = loadSkillCorpus();
|
|
@@ -502,10 +561,10 @@ function checkSkillsFreshness(projectRoot) {
|
|
|
502
561
|
const seen = /* @__PURE__ */ new Set();
|
|
503
562
|
for (const root of roots) {
|
|
504
563
|
for (const skill of corpus.skills) {
|
|
505
|
-
const copied =
|
|
506
|
-
if (!
|
|
564
|
+
const copied = join2(root, skill.name, "SKILL.md");
|
|
565
|
+
if (!existsSync2(copied)) continue;
|
|
507
566
|
seen.add(skill.name);
|
|
508
|
-
if (
|
|
567
|
+
if (readFileSync3(copied, "utf8") !== skill.content) {
|
|
509
568
|
stale.add(skill.name);
|
|
510
569
|
}
|
|
511
570
|
}
|
|
@@ -527,12 +586,16 @@ function checkSkillsFreshness(projectRoot) {
|
|
|
527
586
|
}
|
|
528
587
|
async function runDoctor(options) {
|
|
529
588
|
const fetchImpl = options.fetchImpl ?? fetch;
|
|
589
|
+
const env = {
|
|
590
|
+
...options.env,
|
|
591
|
+
apiUrl: options.env.apiUrl ?? DEFAULT_CAVUNO_API_URL
|
|
592
|
+
};
|
|
530
593
|
const results = [];
|
|
531
|
-
const envResults = checkEnv(
|
|
594
|
+
const envResults = checkEnv(env);
|
|
532
595
|
results.push(...envResults);
|
|
533
596
|
const envOk = envResults.every((r) => r.status === "pass");
|
|
534
|
-
if (
|
|
535
|
-
const api = await checkApiReachable(fetchImpl,
|
|
597
|
+
if (env.apiUrl) {
|
|
598
|
+
const api = await checkApiReachable(fetchImpl, env.apiUrl);
|
|
536
599
|
results.push(
|
|
537
600
|
api ?? STATIC_API("skip", "API URL malformed \u2014 fix env.api-url first")
|
|
538
601
|
);
|
|
@@ -541,13 +604,16 @@ async function runDoctor(options) {
|
|
|
541
604
|
}
|
|
542
605
|
let boardContext = null;
|
|
543
606
|
if (envOk) {
|
|
544
|
-
const resolved = await checkBoardResolves(fetchImpl,
|
|
607
|
+
const resolved = await checkBoardResolves(fetchImpl, env);
|
|
545
608
|
boardContext = resolved.context;
|
|
546
609
|
results.push(resolved.result);
|
|
547
610
|
} else {
|
|
548
611
|
results.push(STATIC_BOARD("skip", "env checks failed \u2014 fix them first"));
|
|
549
612
|
}
|
|
550
613
|
results.push(checkSkillsFreshness(options.projectRoot ?? process.cwd()));
|
|
614
|
+
results.push(
|
|
615
|
+
...checkThemeFreshness(options.projectRoot ?? process.cwd(), boardContext)
|
|
616
|
+
);
|
|
551
617
|
results.push(
|
|
552
618
|
...options.frontendUrl ? await runReadProbes(fetchImpl, options.frontendUrl) : skipReadProbes("no --frontend <url> given")
|
|
553
619
|
);
|
|
@@ -562,7 +628,7 @@ async function runDoctor(options) {
|
|
|
562
628
|
} else {
|
|
563
629
|
results.push(
|
|
564
630
|
...await runWriteProbes({
|
|
565
|
-
env
|
|
631
|
+
env,
|
|
566
632
|
fetchImpl,
|
|
567
633
|
resendApiKey: options.resendApiKey,
|
|
568
634
|
nonce: options.writeProbeNonce,
|
|
@@ -574,12 +640,12 @@ async function runDoctor(options) {
|
|
|
574
640
|
}
|
|
575
641
|
|
|
576
642
|
// src/setup/run.ts
|
|
577
|
-
import { cpSync, existsSync as
|
|
643
|
+
import { cpSync, existsSync as existsSync3, mkdirSync, readFileSync as readFileSync4 } from "fs";
|
|
578
644
|
import { dirname as dirname2, resolve as resolve2 } from "path";
|
|
579
645
|
function detectFramework(cwd) {
|
|
580
646
|
const pkgPath = resolve2(cwd, "package.json");
|
|
581
|
-
if (!
|
|
582
|
-
const pkg = JSON.parse(
|
|
647
|
+
if (!existsSync3(pkgPath)) return null;
|
|
648
|
+
const pkg = JSON.parse(readFileSync4(pkgPath, "utf8"));
|
|
583
649
|
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
584
650
|
if (deps["@tanstack/react-start"]) return "tanstack-start";
|
|
585
651
|
return null;
|
|
@@ -591,10 +657,12 @@ function runSetup(cwd = process.cwd()) {
|
|
|
591
657
|
(skill) => skill.category === "core" || skill.framework === framework
|
|
592
658
|
);
|
|
593
659
|
const roots = [
|
|
660
|
+
resolve2(cwd, ".agents", "skills"),
|
|
594
661
|
resolve2(cwd, ".claude", "skills"),
|
|
595
|
-
resolve2(cwd, ".
|
|
662
|
+
resolve2(cwd, ".codex", "skills"),
|
|
663
|
+
resolve2(cwd, ".cursor", "skills")
|
|
596
664
|
];
|
|
597
|
-
const existing = roots.filter((root) =>
|
|
665
|
+
const existing = roots.filter((root) => existsSync3(root));
|
|
598
666
|
const targetDirs = existing.length > 0 ? existing : [roots[0]];
|
|
599
667
|
const copied = [];
|
|
600
668
|
for (const targetDir of targetDirs) {
|
|
@@ -670,11 +738,13 @@ function main() {
|
|
|
670
738
|
);
|
|
671
739
|
for (const name of result.copied) console.log(` - ${name}`);
|
|
672
740
|
console.log("\nNext steps:");
|
|
673
|
-
console.log(" 1. Set your
|
|
674
|
-
console.log(" PUBLIC_CAVUNO_API_URL=https://api.cavuno.com");
|
|
741
|
+
console.log(" 1. Set your board publishable key:");
|
|
675
742
|
console.log(
|
|
676
743
|
" PUBLIC_CAVUNO_BOARD=pk_... # your board publishable key"
|
|
677
744
|
);
|
|
745
|
+
console.log(
|
|
746
|
+
" # Optional API override: PUBLIC_CAVUNO_API_URL=https://api.cavuno.com"
|
|
747
|
+
);
|
|
678
748
|
console.log(' 2. Ask your coding agent: "set up my Cavuno board".');
|
|
679
749
|
console.log(" It reads the cavuno-board-setup skill first.");
|
|
680
750
|
console.log(
|
package/dist/filters.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { B as BoardLabelOverrides } from './ui-copy-rlfoH9P3.mjs';
|
|
2
|
-
import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-
|
|
2
|
+
import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-BFLMDNEN.mjs';
|
|
3
3
|
|
|
4
4
|
declare const REMOTE_OPTIONS: readonly RemoteOption[];
|
|
5
5
|
/**
|
package/dist/filters.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { B as BoardLabelOverrides } from './ui-copy-rlfoH9P3.js';
|
|
2
|
-
import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-
|
|
2
|
+
import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-BFLMDNEN.js';
|
|
3
3
|
|
|
4
4
|
declare const REMOTE_OPTIONS: readonly RemoteOption[];
|
|
5
5
|
/**
|
package/dist/format.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { P as PublicJob, a as PublicJobCard, C as CustomFieldValues } from './jobs-
|
|
1
|
+
import { P as PublicJob, a as PublicJobCard, C as CustomFieldValues } from './jobs-BFLMDNEN.mjs';
|
|
2
2
|
import { B as BoardLabelOverrides } from './ui-copy-rlfoH9P3.mjs';
|
|
3
3
|
export { A as AlertsCopy, a as ApplyCopy, b as BlogCopy, c as BreadcrumbsCopy, C as CopyLinkCopy, E as EntityCopy, F as FooterCopy, J as JobCardCopy, d as JobDetailCopy, e as JobSearchCopy, N as NavCopy, P as PUBLIC_LABEL_GROUPS, f as PaginationCopy, S as SalaryCopy, U as UiCopy, u as uiCopy } from './ui-copy-rlfoH9P3.mjs';
|
|
4
|
-
import { C as CustomFieldDefinition } from './board-
|
|
4
|
+
import { C as CustomFieldDefinition } from './board-Be8dY9Ba.mjs';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Date display helpers in the board language (required leading parameter,
|
package/dist/format.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { P as PublicJob, a as PublicJobCard, C as CustomFieldValues } from './jobs-
|
|
1
|
+
import { P as PublicJob, a as PublicJobCard, C as CustomFieldValues } from './jobs-BFLMDNEN.js';
|
|
2
2
|
import { B as BoardLabelOverrides } from './ui-copy-rlfoH9P3.js';
|
|
3
3
|
export { A as AlertsCopy, a as ApplyCopy, b as BlogCopy, c as BreadcrumbsCopy, C as CopyLinkCopy, E as EntityCopy, F as FooterCopy, J as JobCardCopy, d as JobDetailCopy, e as JobSearchCopy, N as NavCopy, P as PUBLIC_LABEL_GROUPS, f as PaginationCopy, S as SalaryCopy, U as UiCopy, u as uiCopy } from './ui-copy-rlfoH9P3.js';
|
|
4
|
-
import { C as CustomFieldDefinition } from './board-
|
|
4
|
+
import { C as CustomFieldDefinition } from './board-DsRbgz_D.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Date display helpers in the board language (required leading parameter,
|
package/dist/index.d.mts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { b as Schemas, R as RemoteOption, E as EmploymentType, S as Seniority, L as ListEnvelope, c as components, d as JobsListQuery, e as JobCardListEnvelope, f as JobsSearchBody, g as JobCardSearchEnvelope, h as JobsSimilarQuery, i as SearchEnvelope } from './jobs-
|
|
2
|
-
export { j as CustomFieldValue, C as CustomFieldValues, k as EducationRequirement, l as JobCompany, J as JobSort, O as OfficeLocation, P as PublicJob, a as PublicJobCard,
|
|
3
|
-
export { C as CustomFieldDefinition, a as CustomFieldOption, b as CustomFieldType, P as PublicBoard, c as PublicBoardAnalytics, d as PublicBoardFeatures, e as PublicBoardTheme } from './board-
|
|
4
|
-
import { b as CompaniesListQuery, c as CompanyListEnvelope, d as CompaniesSearchBody, e as CompanyJobsListQuery, f as CompanySimilarQuery, g as CompanyMarketsListQuery, h as SalaryDetailQuery, i as BlogPostsListQuery, j as BlogSimilarQuery, k as BlogSearchBody } from './salaries-
|
|
5
|
-
export { B as BlogAuthorEmbed, l as BlogTagEmbed, C as CompanyCategorySalary, m as CompanyMarket, n as CompanyMarketRef, a as CompanySalary, L as LocationSalaryDetail, o as LocationSkillsIndex, p as LocationTitlesIndex, q as PublicBlogAdjacentPosts, r as PublicBlogAuthor, s as PublicBlogPost, P as PublicBlogPostSummary, t as PublicBlogTag, u as PublicCompany, v as PublicCompanyDetail, w as SalaryCompany, x as SalaryLocation, y as SalarySkill, z as SalaryTitle, A as SkillLocationSalary, D as SkillLocationsIndex, S as SkillSalaryDetail, E as TitleLocationSalary, F as TitleLocationsIndex, T as TitleSalaryDetail } from './salaries-
|
|
1
|
+
import { b as Schemas, R as RemoteOption, E as EmploymentType, S as Seniority, L as ListEnvelope, c as components, d as JobsListQuery, e as JobCardListEnvelope, f as JobsSearchBody, g as JobCardSearchEnvelope, h as JobsSimilarQuery, i as SearchEnvelope } from './jobs-BFLMDNEN.mjs';
|
|
2
|
+
export { j as CustomFieldValue, C as CustomFieldValues, k as EducationRequirement, l as JobCatalogPagination, m as JobCompany, J as JobSort, O as OfficeLocation, n as OffsetPagination, P as PublicJob, a as PublicJobCard, o as RelatedSearch, p as RemotePermit, q as RemoteTimezone, r as StorefrontPagination } from './jobs-BFLMDNEN.mjs';
|
|
3
|
+
export { C as CustomFieldDefinition, a as CustomFieldOption, b as CustomFieldType, P as PublicBoard, c as PublicBoardAnalytics, d as PublicBoardFeatures, e as PublicBoardTheme } from './board-Be8dY9Ba.mjs';
|
|
4
|
+
import { b as CompaniesListQuery, c as CompanyListEnvelope, d as CompaniesSearchBody, e as CompanyJobsListQuery, f as CompanySimilarQuery, g as CompanyMarketsListQuery, h as SalaryDetailQuery, i as BlogPostsListQuery, j as BlogSimilarQuery, k as BlogSearchBody } from './salaries-pO_vGORE.mjs';
|
|
5
|
+
export { B as BlogAuthorEmbed, l as BlogTagEmbed, C as CompanyCategorySalary, m as CompanyMarket, n as CompanyMarketRef, a as CompanySalary, L as LocationSalaryDetail, o as LocationSkillsIndex, p as LocationTitlesIndex, q as PublicBlogAdjacentPosts, r as PublicBlogAuthor, s as PublicBlogPost, P as PublicBlogPostSummary, t as PublicBlogTag, u as PublicCompany, v as PublicCompanyDetail, w as SalaryCompany, x as SalaryLocation, y as SalarySkill, z as SalaryTitle, A as SkillLocationSalary, D as SkillLocationsIndex, S as SkillSalaryDetail, E as TitleLocationSalary, F as TitleLocationsIndex, T as TitleSalaryDetail } from './salaries-pO_vGORE.mjs';
|
|
6
6
|
|
|
7
7
|
type Awaitable<T> = T | Promise<T>;
|
|
8
8
|
/**
|
|
@@ -176,7 +176,7 @@ interface Paginator<P extends PageShape> extends AsyncIterable<ItemOf<P>> {
|
|
|
176
176
|
* an explicit sort/query — see the jobs skill.
|
|
177
177
|
*
|
|
178
178
|
* `offset` is honored for the FIRST page only and dropped afterwards: on
|
|
179
|
-
*
|
|
179
|
+
* job catalog reads let `offset` take precedence over `cursor`, so carrying it
|
|
180
180
|
* forward would re-serve the same page forever.
|
|
181
181
|
*
|
|
182
182
|
* @example
|
|
@@ -204,7 +204,7 @@ declare function paginate<Q extends Record<string, unknown>, P extends PageShape
|
|
|
204
204
|
* constant because the package is platform-neutral and cannot read
|
|
205
205
|
* package.json at runtime.
|
|
206
206
|
*/
|
|
207
|
-
declare const SDK_VERSION = "1.
|
|
207
|
+
declare const SDK_VERSION = "1.35.0";
|
|
208
208
|
|
|
209
209
|
type SavedJob = Schemas['SavedJob'];
|
|
210
210
|
type SavedJobsListQuery = {
|
|
@@ -456,7 +456,7 @@ type EmbedJobsQuery = {
|
|
|
456
456
|
cursor?: string;
|
|
457
457
|
/** Default 8; values above the embed ceiling of 50 are clamped to 50. */
|
|
458
458
|
limit?: number;
|
|
459
|
-
/**
|
|
459
|
+
/** Job catalog page offset; takes precedence over `cursor`. `offset + limit` ≤ 10,000. */
|
|
460
460
|
offset?: number;
|
|
461
461
|
/** Repeated param (up to 10) — OR-matched. Repeat `companyId` per value. */
|
|
462
462
|
companyId?: string[];
|
|
@@ -547,7 +547,7 @@ type AccessCheckoutBody = Schemas['AccessCheckoutBody'];
|
|
|
547
547
|
type AccessPortalBody = Schemas['AccessPortalBody'];
|
|
548
548
|
type PaywallOfferListEnvelope = ListEnvelope<PaywallOffer>;
|
|
549
549
|
|
|
550
|
-
type JobAlertFrequency = '
|
|
550
|
+
type JobAlertFrequency = 'weekly';
|
|
551
551
|
type JobAlertRemoteOption = 'on_site' | 'hybrid' | 'remote';
|
|
552
552
|
/**
|
|
553
553
|
* Alert filters a consumer can capture. Only `jobFunctions` (→ job categories),
|
|
@@ -646,7 +646,8 @@ type PlacesListQuery = {
|
|
|
646
646
|
};
|
|
647
647
|
|
|
648
648
|
interface CreateBoardClientOptions {
|
|
649
|
-
|
|
649
|
+
/** Cavuno API origin. Defaults to the production service. */
|
|
650
|
+
baseUrl?: string;
|
|
650
651
|
/** Board identifier: `pk_…` key (provisioned default) | `boards_…` ID | slug. */
|
|
651
652
|
board: string;
|
|
652
653
|
auth?: {
|
|
@@ -669,7 +670,6 @@ interface CreateBoardClientOptions {
|
|
|
669
670
|
* import { createBoardClient } from '@cavuno/board';
|
|
670
671
|
*
|
|
671
672
|
* const board = createBoardClient({
|
|
672
|
-
* baseUrl: 'https://api.cavuno.com',
|
|
673
673
|
* board: 'pk_a8f3…',
|
|
674
674
|
* });
|
|
675
675
|
* const { data } = await board.jobs.list({ limit: 20 });
|
|
@@ -709,6 +709,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
|
|
|
709
709
|
candidatePaywall: boolean;
|
|
710
710
|
impressum: boolean;
|
|
711
711
|
};
|
|
712
|
+
talentDirectoryVisibility: "off" | "public" | "employers_only";
|
|
712
713
|
analytics: {
|
|
713
714
|
ga4MeasurementId: string | null;
|
|
714
715
|
gtmId: string | null;
|
|
@@ -738,6 +739,21 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
|
|
|
738
739
|
[key: string]: string;
|
|
739
740
|
};
|
|
740
741
|
};
|
|
742
|
+
footer: {
|
|
743
|
+
description: string | null;
|
|
744
|
+
contactEmail: string | null;
|
|
745
|
+
websiteUrl: string | null;
|
|
746
|
+
xUrl: string | null;
|
|
747
|
+
facebookUrl: string | null;
|
|
748
|
+
linkedinUrl: string | null;
|
|
749
|
+
navigationOrder: string[];
|
|
750
|
+
customLinks: {
|
|
751
|
+
id: string;
|
|
752
|
+
label: string;
|
|
753
|
+
url: string;
|
|
754
|
+
}[];
|
|
755
|
+
};
|
|
756
|
+
themeSnapshotHash: string | null;
|
|
741
757
|
}>;
|
|
742
758
|
/**
|
|
743
759
|
* Board SEO infra — `ads.txt`, IndexNow key, Google site-verification, and
|
|
@@ -1886,7 +1902,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
|
|
|
1886
1902
|
id: string;
|
|
1887
1903
|
object: "alert";
|
|
1888
1904
|
label: string | null;
|
|
1889
|
-
frequency: "
|
|
1905
|
+
frequency: "weekly";
|
|
1890
1906
|
isActive: boolean;
|
|
1891
1907
|
filters: {
|
|
1892
1908
|
jobFunctions: string[];
|
|
@@ -1903,7 +1919,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
|
|
|
1903
1919
|
id: string;
|
|
1904
1920
|
object: "alert";
|
|
1905
1921
|
label: string | null;
|
|
1906
|
-
frequency: "
|
|
1922
|
+
frequency: "weekly";
|
|
1907
1923
|
isActive: boolean;
|
|
1908
1924
|
filters: {
|
|
1909
1925
|
jobFunctions: string[];
|
|
@@ -1920,7 +1936,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
|
|
|
1920
1936
|
id: string;
|
|
1921
1937
|
object: "alert";
|
|
1922
1938
|
label: string | null;
|
|
1923
|
-
frequency: "
|
|
1939
|
+
frequency: "weekly";
|
|
1924
1940
|
isActive: boolean;
|
|
1925
1941
|
filters: {
|
|
1926
1942
|
jobFunctions: string[];
|
|
@@ -1937,7 +1953,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
|
|
|
1937
1953
|
id: string;
|
|
1938
1954
|
object: "alert";
|
|
1939
1955
|
label: string | null;
|
|
1940
|
-
frequency: "
|
|
1956
|
+
frequency: "weekly";
|
|
1941
1957
|
isActive: boolean;
|
|
1942
1958
|
filters: {
|
|
1943
1959
|
jobFunctions: string[];
|
|
@@ -2322,7 +2338,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
|
|
|
2322
2338
|
preferences: {
|
|
2323
2339
|
id: string;
|
|
2324
2340
|
label: string | null;
|
|
2325
|
-
frequency:
|
|
2341
|
+
frequency: "weekly";
|
|
2326
2342
|
isActive: boolean;
|
|
2327
2343
|
filters: {
|
|
2328
2344
|
jobFunctions?: string[];
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { b as Schemas, R as RemoteOption, E as EmploymentType, S as Seniority, L as ListEnvelope, c as components, d as JobsListQuery, e as JobCardListEnvelope, f as JobsSearchBody, g as JobCardSearchEnvelope, h as JobsSimilarQuery, i as SearchEnvelope } from './jobs-
|
|
2
|
-
export { j as CustomFieldValue, C as CustomFieldValues, k as EducationRequirement, l as JobCompany, J as JobSort, O as OfficeLocation, P as PublicJob, a as PublicJobCard,
|
|
3
|
-
export { C as CustomFieldDefinition, a as CustomFieldOption, b as CustomFieldType, P as PublicBoard, c as PublicBoardAnalytics, d as PublicBoardFeatures, e as PublicBoardTheme } from './board-
|
|
4
|
-
import { b as CompaniesListQuery, c as CompanyListEnvelope, d as CompaniesSearchBody, e as CompanyJobsListQuery, f as CompanySimilarQuery, g as CompanyMarketsListQuery, h as SalaryDetailQuery, i as BlogPostsListQuery, j as BlogSimilarQuery, k as BlogSearchBody } from './salaries-
|
|
5
|
-
export { B as BlogAuthorEmbed, l as BlogTagEmbed, C as CompanyCategorySalary, m as CompanyMarket, n as CompanyMarketRef, a as CompanySalary, L as LocationSalaryDetail, o as LocationSkillsIndex, p as LocationTitlesIndex, q as PublicBlogAdjacentPosts, r as PublicBlogAuthor, s as PublicBlogPost, P as PublicBlogPostSummary, t as PublicBlogTag, u as PublicCompany, v as PublicCompanyDetail, w as SalaryCompany, x as SalaryLocation, y as SalarySkill, z as SalaryTitle, A as SkillLocationSalary, D as SkillLocationsIndex, S as SkillSalaryDetail, E as TitleLocationSalary, F as TitleLocationsIndex, T as TitleSalaryDetail } from './salaries-
|
|
1
|
+
import { b as Schemas, R as RemoteOption, E as EmploymentType, S as Seniority, L as ListEnvelope, c as components, d as JobsListQuery, e as JobCardListEnvelope, f as JobsSearchBody, g as JobCardSearchEnvelope, h as JobsSimilarQuery, i as SearchEnvelope } from './jobs-BFLMDNEN.js';
|
|
2
|
+
export { j as CustomFieldValue, C as CustomFieldValues, k as EducationRequirement, l as JobCatalogPagination, m as JobCompany, J as JobSort, O as OfficeLocation, n as OffsetPagination, P as PublicJob, a as PublicJobCard, o as RelatedSearch, p as RemotePermit, q as RemoteTimezone, r as StorefrontPagination } from './jobs-BFLMDNEN.js';
|
|
3
|
+
export { C as CustomFieldDefinition, a as CustomFieldOption, b as CustomFieldType, P as PublicBoard, c as PublicBoardAnalytics, d as PublicBoardFeatures, e as PublicBoardTheme } from './board-DsRbgz_D.js';
|
|
4
|
+
import { b as CompaniesListQuery, c as CompanyListEnvelope, d as CompaniesSearchBody, e as CompanyJobsListQuery, f as CompanySimilarQuery, g as CompanyMarketsListQuery, h as SalaryDetailQuery, i as BlogPostsListQuery, j as BlogSimilarQuery, k as BlogSearchBody } from './salaries-negE75t8.js';
|
|
5
|
+
export { B as BlogAuthorEmbed, l as BlogTagEmbed, C as CompanyCategorySalary, m as CompanyMarket, n as CompanyMarketRef, a as CompanySalary, L as LocationSalaryDetail, o as LocationSkillsIndex, p as LocationTitlesIndex, q as PublicBlogAdjacentPosts, r as PublicBlogAuthor, s as PublicBlogPost, P as PublicBlogPostSummary, t as PublicBlogTag, u as PublicCompany, v as PublicCompanyDetail, w as SalaryCompany, x as SalaryLocation, y as SalarySkill, z as SalaryTitle, A as SkillLocationSalary, D as SkillLocationsIndex, S as SkillSalaryDetail, E as TitleLocationSalary, F as TitleLocationsIndex, T as TitleSalaryDetail } from './salaries-negE75t8.js';
|
|
6
6
|
|
|
7
7
|
type Awaitable<T> = T | Promise<T>;
|
|
8
8
|
/**
|
|
@@ -176,7 +176,7 @@ interface Paginator<P extends PageShape> extends AsyncIterable<ItemOf<P>> {
|
|
|
176
176
|
* an explicit sort/query — see the jobs skill.
|
|
177
177
|
*
|
|
178
178
|
* `offset` is honored for the FIRST page only and dropped afterwards: on
|
|
179
|
-
*
|
|
179
|
+
* job catalog reads let `offset` take precedence over `cursor`, so carrying it
|
|
180
180
|
* forward would re-serve the same page forever.
|
|
181
181
|
*
|
|
182
182
|
* @example
|
|
@@ -204,7 +204,7 @@ declare function paginate<Q extends Record<string, unknown>, P extends PageShape
|
|
|
204
204
|
* constant because the package is platform-neutral and cannot read
|
|
205
205
|
* package.json at runtime.
|
|
206
206
|
*/
|
|
207
|
-
declare const SDK_VERSION = "1.
|
|
207
|
+
declare const SDK_VERSION = "1.35.0";
|
|
208
208
|
|
|
209
209
|
type SavedJob = Schemas['SavedJob'];
|
|
210
210
|
type SavedJobsListQuery = {
|
|
@@ -456,7 +456,7 @@ type EmbedJobsQuery = {
|
|
|
456
456
|
cursor?: string;
|
|
457
457
|
/** Default 8; values above the embed ceiling of 50 are clamped to 50. */
|
|
458
458
|
limit?: number;
|
|
459
|
-
/**
|
|
459
|
+
/** Job catalog page offset; takes precedence over `cursor`. `offset + limit` ≤ 10,000. */
|
|
460
460
|
offset?: number;
|
|
461
461
|
/** Repeated param (up to 10) — OR-matched. Repeat `companyId` per value. */
|
|
462
462
|
companyId?: string[];
|
|
@@ -547,7 +547,7 @@ type AccessCheckoutBody = Schemas['AccessCheckoutBody'];
|
|
|
547
547
|
type AccessPortalBody = Schemas['AccessPortalBody'];
|
|
548
548
|
type PaywallOfferListEnvelope = ListEnvelope<PaywallOffer>;
|
|
549
549
|
|
|
550
|
-
type JobAlertFrequency = '
|
|
550
|
+
type JobAlertFrequency = 'weekly';
|
|
551
551
|
type JobAlertRemoteOption = 'on_site' | 'hybrid' | 'remote';
|
|
552
552
|
/**
|
|
553
553
|
* Alert filters a consumer can capture. Only `jobFunctions` (→ job categories),
|
|
@@ -646,7 +646,8 @@ type PlacesListQuery = {
|
|
|
646
646
|
};
|
|
647
647
|
|
|
648
648
|
interface CreateBoardClientOptions {
|
|
649
|
-
|
|
649
|
+
/** Cavuno API origin. Defaults to the production service. */
|
|
650
|
+
baseUrl?: string;
|
|
650
651
|
/** Board identifier: `pk_…` key (provisioned default) | `boards_…` ID | slug. */
|
|
651
652
|
board: string;
|
|
652
653
|
auth?: {
|
|
@@ -669,7 +670,6 @@ interface CreateBoardClientOptions {
|
|
|
669
670
|
* import { createBoardClient } from '@cavuno/board';
|
|
670
671
|
*
|
|
671
672
|
* const board = createBoardClient({
|
|
672
|
-
* baseUrl: 'https://api.cavuno.com',
|
|
673
673
|
* board: 'pk_a8f3…',
|
|
674
674
|
* });
|
|
675
675
|
* const { data } = await board.jobs.list({ limit: 20 });
|
|
@@ -709,6 +709,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
|
|
|
709
709
|
candidatePaywall: boolean;
|
|
710
710
|
impressum: boolean;
|
|
711
711
|
};
|
|
712
|
+
talentDirectoryVisibility: "off" | "public" | "employers_only";
|
|
712
713
|
analytics: {
|
|
713
714
|
ga4MeasurementId: string | null;
|
|
714
715
|
gtmId: string | null;
|
|
@@ -738,6 +739,21 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
|
|
|
738
739
|
[key: string]: string;
|
|
739
740
|
};
|
|
740
741
|
};
|
|
742
|
+
footer: {
|
|
743
|
+
description: string | null;
|
|
744
|
+
contactEmail: string | null;
|
|
745
|
+
websiteUrl: string | null;
|
|
746
|
+
xUrl: string | null;
|
|
747
|
+
facebookUrl: string | null;
|
|
748
|
+
linkedinUrl: string | null;
|
|
749
|
+
navigationOrder: string[];
|
|
750
|
+
customLinks: {
|
|
751
|
+
id: string;
|
|
752
|
+
label: string;
|
|
753
|
+
url: string;
|
|
754
|
+
}[];
|
|
755
|
+
};
|
|
756
|
+
themeSnapshotHash: string | null;
|
|
741
757
|
}>;
|
|
742
758
|
/**
|
|
743
759
|
* Board SEO infra — `ads.txt`, IndexNow key, Google site-verification, and
|
|
@@ -1886,7 +1902,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
|
|
|
1886
1902
|
id: string;
|
|
1887
1903
|
object: "alert";
|
|
1888
1904
|
label: string | null;
|
|
1889
|
-
frequency: "
|
|
1905
|
+
frequency: "weekly";
|
|
1890
1906
|
isActive: boolean;
|
|
1891
1907
|
filters: {
|
|
1892
1908
|
jobFunctions: string[];
|
|
@@ -1903,7 +1919,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
|
|
|
1903
1919
|
id: string;
|
|
1904
1920
|
object: "alert";
|
|
1905
1921
|
label: string | null;
|
|
1906
|
-
frequency: "
|
|
1922
|
+
frequency: "weekly";
|
|
1907
1923
|
isActive: boolean;
|
|
1908
1924
|
filters: {
|
|
1909
1925
|
jobFunctions: string[];
|
|
@@ -1920,7 +1936,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
|
|
|
1920
1936
|
id: string;
|
|
1921
1937
|
object: "alert";
|
|
1922
1938
|
label: string | null;
|
|
1923
|
-
frequency: "
|
|
1939
|
+
frequency: "weekly";
|
|
1924
1940
|
isActive: boolean;
|
|
1925
1941
|
filters: {
|
|
1926
1942
|
jobFunctions: string[];
|
|
@@ -1937,7 +1953,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
|
|
|
1937
1953
|
id: string;
|
|
1938
1954
|
object: "alert";
|
|
1939
1955
|
label: string | null;
|
|
1940
|
-
frequency: "
|
|
1956
|
+
frequency: "weekly";
|
|
1941
1957
|
isActive: boolean;
|
|
1942
1958
|
filters: {
|
|
1943
1959
|
jobFunctions: string[];
|
|
@@ -2322,7 +2338,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
|
|
|
2322
2338
|
preferences: {
|
|
2323
2339
|
id: string;
|
|
2324
2340
|
label: string | null;
|
|
2325
|
-
frequency:
|
|
2341
|
+
frequency: "weekly";
|
|
2326
2342
|
isActive: boolean;
|
|
2327
2343
|
filters: {
|
|
2328
2344
|
jobFunctions?: string[];
|
package/dist/index.js
CHANGED
|
@@ -312,7 +312,7 @@ async function clearSession(storage) {
|
|
|
312
312
|
}
|
|
313
313
|
|
|
314
314
|
// src/version.ts
|
|
315
|
-
var SDK_VERSION = "1.
|
|
315
|
+
var SDK_VERSION = "1.35.0";
|
|
316
316
|
|
|
317
317
|
// src/client.ts
|
|
318
318
|
function isRawBody(body) {
|
|
@@ -403,6 +403,9 @@ var BoardClient = class {
|
|
|
403
403
|
}
|
|
404
404
|
};
|
|
405
405
|
|
|
406
|
+
// src/constants.ts
|
|
407
|
+
var DEFAULT_CAVUNO_API_URL = "https://api.cavuno.com";
|
|
408
|
+
|
|
406
409
|
// src/namespaces/auth.ts
|
|
407
410
|
function authNamespace(client) {
|
|
408
411
|
async function persist(session) {
|
|
@@ -1798,7 +1801,7 @@ function meNamespace(client) {
|
|
|
1798
1801
|
*
|
|
1799
1802
|
* @example
|
|
1800
1803
|
* await board.me.alerts.update(alertId, {
|
|
1801
|
-
* frequency: '
|
|
1804
|
+
* frequency: 'weekly',
|
|
1802
1805
|
* placeIds: ['ChIJ…'],
|
|
1803
1806
|
* });
|
|
1804
1807
|
*/
|
|
@@ -2633,7 +2636,7 @@ function resolveApplyAction(state) {
|
|
|
2633
2636
|
// src/index.ts
|
|
2634
2637
|
function createBoardClient(options) {
|
|
2635
2638
|
const client = new BoardClient({
|
|
2636
|
-
baseUrl: options.baseUrl,
|
|
2639
|
+
baseUrl: options.baseUrl ?? DEFAULT_CAVUNO_API_URL,
|
|
2637
2640
|
board: options.board,
|
|
2638
2641
|
storage: resolveStorage(options.auth?.storage, options.board),
|
|
2639
2642
|
globalHeaders: options.globalHeaders,
|