@cavuno/board 4.58.0 → 4.59.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.
Files changed (51) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/{_spec-DIzdOWz7.d.mts → _spec-DZV8ME1P.d.mts} +11 -5
  3. package/dist/{_spec-DIzdOWz7.d.ts → _spec-DZV8ME1P.d.ts} +11 -5
  4. package/dist/analytics.js +38 -1
  5. package/dist/analytics.mjs +38 -1
  6. package/dist/bin.mjs +27 -14
  7. package/dist/{blog-DgbGOmzW.d.mts → blog-BfVuJQvO.d.mts} +1 -1
  8. package/dist/{blog-CyvB9C6W.d.ts → blog-CLVfmknV.d.ts} +1 -1
  9. package/dist/{board-leXc6_BM.d.ts → board-Cl6cfS-a.d.ts} +2 -2
  10. package/dist/{board-D3ByAGAb.d.mts → board-gmV8MoLW.d.mts} +2 -2
  11. package/dist/{breadcrumbs-zYG4xzpC.d.mts → breadcrumbs-BOM71gXT.d.mts} +2 -2
  12. package/dist/{breadcrumbs-aCKRBNWX.d.ts → breadcrumbs-dTn6GsKo.d.ts} +2 -2
  13. package/dist/browser/cavuno-board.global.min.js +1 -1
  14. package/dist/{chunk-GUXSUQCP.mjs → chunk-LO7D3AIX.mjs} +8 -10
  15. package/dist/doctor.js +27 -14
  16. package/dist/doctor.mjs +27 -14
  17. package/dist/filters.d.mts +2 -2
  18. package/dist/filters.d.ts +2 -2
  19. package/dist/format.d.mts +12 -4
  20. package/dist/format.d.ts +12 -4
  21. package/dist/format.js +6 -1
  22. package/dist/format.mjs +6 -1
  23. package/dist/index.d.mts +15 -11
  24. package/dist/index.d.ts +15 -11
  25. package/dist/index.js +47 -10
  26. package/dist/index.mjs +47 -10
  27. package/dist/{jobs-nA2K33Nu.d.mts → jobs-DfMyFAYs.d.mts} +1 -1
  28. package/dist/{jobs-DodvFXH2.d.ts → jobs-Di0L5sM1.d.ts} +1 -1
  29. package/dist/route-contract.d.mts +3 -4
  30. package/dist/route-contract.d.ts +3 -4
  31. package/dist/route-contract.js +8 -10
  32. package/dist/route-contract.mjs +1 -1
  33. package/dist/{search-8kX6OW03.d.mts → search-1pxkvj_I.d.mts} +1 -1
  34. package/dist/{search-C1XNGSm6.d.ts → search-BPnMYVa7.d.ts} +1 -1
  35. package/dist/{seo-Bn5gQY8t.d.mts → seo-CJtLrGD_.d.mts} +1 -1
  36. package/dist/{seo-DFAwxGej.d.ts → seo-DFPj-7Rl.d.ts} +1 -1
  37. package/dist/seo-files.d.mts +2 -2
  38. package/dist/seo-files.d.ts +2 -2
  39. package/dist/seo.d.mts +6 -6
  40. package/dist/seo.d.ts +6 -6
  41. package/dist/server.d.mts +6 -6
  42. package/dist/server.d.ts +6 -6
  43. package/dist/sitemap.d.mts +6 -6
  44. package/dist/sitemap.d.ts +6 -6
  45. package/dist/suggest.d.mts +2 -2
  46. package/dist/suggest.d.ts +2 -2
  47. package/dist/well-known.mjs +1 -1
  48. package/package.json +1 -1
  49. package/skills/cavuno-board-auth/SKILL.md +7 -0
  50. package/skills/cavuno-board-format/SKILL.md +5 -1
  51. package/skills/manifest.json +1 -1
package/dist/sitemap.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-DIzdOWz7.js';
3
- import './search-C1XNGSm6.js';
4
- import './jobs-DodvFXH2.js';
5
- import './board-leXc6_BM.js';
6
- import './seo-DFAwxGej.js';
7
- import './blog-CyvB9C6W.js';
2
+ import './_spec-DZV8ME1P.js';
3
+ import './search-BPnMYVa7.js';
4
+ import './jobs-Di0L5sM1.js';
5
+ import './board-Cl6cfS-a.js';
6
+ import './seo-DFPj-7Rl.js';
7
+ import './blog-CLVfmknV.js';
8
8
 
9
9
  /**
10
10
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
@@ -1,5 +1,5 @@
1
- import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-8kX6OW03.mjs';
2
- import './_spec-DIzdOWz7.mjs';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-1pxkvj_I.mjs';
2
+ import './_spec-DZV8ME1P.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-C1XNGSm6.js';
2
- import './_spec-DIzdOWz7.js';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-BPnMYVa7.js';
2
+ import './_spec-DZV8ME1P.js';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/suggest` — framework-agnostic headless search-suggest
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  compileManifest
3
- } from "./chunk-GUXSUQCP.mjs";
3
+ } from "./chunk-LO7D3AIX.mjs";
4
4
  import "./chunk-MSY7ERBY.mjs";
5
5
 
6
6
  // src/well-known/handler.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cavuno/board",
3
- "version": "4.58.0",
3
+ "version": "4.59.1",
4
4
  "description": "Build custom job boards and careers pages with Cavuno’s TypeScript SDK.",
5
5
  "keywords": [
6
6
  "api-client",
@@ -90,3 +90,10 @@ The signed-in OTP verification, resend, magic-link, and OAuth branches use their
90
90
  ## Cavuno SDK reference
91
91
 
92
92
  For setup and API details beyond this workflow, use the [Cavuno Board SDK documentation](https://cavuno.com/docs/sdk).
93
+
94
+
95
+ ### OAuth browser proof
96
+
97
+ SSO sign-ins require proof from the browser that started authorization. Google and LinkedIn sign-ins accept and check the same proof whenever it is supplied, and it will become required for them in a later release. The browser SDK establishes and retains a random secret before `getOAuthAuthorizationUrl` or `getSsoAuthorizationUrl`, sends only its SHA-256 hash to authorization, and supplies the secret when `exchangeOAuth` runs. Keep browser storage available through the provider round trip. Never take a binding secret from a completion URL or copy another browser's completion token.
98
+
99
+ Server callers (a Worker or other server runtime without browser storage) should generate a random secret, retain it securely in the visitor's session (for example an HttpOnly cookie), pass its lowercase SHA-256 hex as `browserBindingHash` to `getOAuthAuthorizationUrl`, and pass the original secret as `browserBinding` to `exchangeOAuth`. Without a `browserBindingHash`, the SDK sends a Google or LinkedIn request unbound from a server runtime; that is accepted today so existing deployments keep working, and will be refused once proof becomes required. A sign-in started with proof must finish with the matching secret: failed proof leaves the one-time token unconsumed. Automatic OAuth proof is cleared if authorization fails or once exchange succeeds; a rejected exchange keeps the proof available for retry.
@@ -59,7 +59,9 @@ formatSalaryStatRange(language, 90000, 120000, detail.currency);
59
59
  formatSalaryStatRange(language, 90000, 120000, detail.currency, 'standard');
60
60
 
61
61
  // Custom fields — language first. number → kind: 'number' (raw);
62
- // multi_select → kind: 'multi_select' with values: string[] (labels).
62
+ // multi_select → kind: 'multi_select' with values: string[] (labels);
63
+ // rich_text → kind: 'rich_text' with API-sanitized HTML: render it as HTML.
64
+ // kind: 'text' stays plain text, so keep escaping it.
63
65
  // Do not String(n). Do not join multi-select in the SDK — app owns list
64
66
  // style (conjunction / short / chips):
65
67
  // new Intl.ListFormat(language, { style: 'long', type: 'conjunction' })
@@ -121,6 +123,8 @@ const jobBadges = resolveCustomFieldDisplay(
121
123
  switch (entry.kind) {
122
124
  case 'text': // a single_select resolves to its option label
123
125
  return [entry.value];
126
+ case 'rich_text': // sanitized HTML: render in a detail section, not a badge
127
+ return [];
124
128
  case 'multi_select':
125
129
  return entry.values;
126
130
  case 'boolean':
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.58.0",
2
+ "version": "4.59.1",
3
3
  "skills": [
4
4
  {
5
5
  "name": "cavuno-board-account",