@cavuno/board 4.61.0 → 4.63.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.
Files changed (67) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/{_spec-B6YOcfhm.d.mts → _spec-D1Qg_Twd.d.mts} +109 -3
  3. package/dist/{_spec-B6YOcfhm.d.ts → _spec-D1Qg_Twd.d.ts} +109 -3
  4. package/dist/bin.mjs +12 -5
  5. package/dist/{blog-Iz3vKyol.d.ts → blog-Dp2jAVVM.d.ts} +1 -1
  6. package/dist/{blog-BazgjIMl.d.mts → blog-e0YbZBjg.d.mts} +1 -1
  7. package/dist/{board-Bd7H1jwl.d.ts → board-BeNZLOYC.d.ts} +2 -2
  8. package/dist/{board-BwOeOQ6v.d.mts → board-Cc3wbTKI.d.mts} +2 -2
  9. package/dist/{breadcrumbs-pccdTbvQ.d.ts → breadcrumbs-BOFeIYEX.d.ts} +2 -2
  10. package/dist/{breadcrumbs-DxlE86G-.d.mts → breadcrumbs-C5WjB8jm.d.mts} +2 -2
  11. package/dist/browser/cavuno-board.global.min.js +1 -1
  12. package/dist/{chunk-R3QB3WM6.mjs → chunk-4KMZZR3A.mjs} +1 -1
  13. package/dist/{chunk-M4CX64RC.mjs → chunk-COHTNSU2.mjs} +9 -1
  14. package/dist/{chunk-LO7D3AIX.mjs → chunk-HHMY3W7T.mjs} +7 -4
  15. package/dist/{chunk-MSY7ERBY.mjs → chunk-RAE63XH5.mjs} +3 -1
  16. package/dist/doctor.js +12 -5
  17. package/dist/doctor.mjs +12 -5
  18. package/dist/filters.d.mts +2 -2
  19. package/dist/filters.d.ts +2 -2
  20. package/dist/format.d.mts +4 -4
  21. package/dist/format.d.ts +4 -4
  22. package/dist/format.js +3 -1
  23. package/dist/format.mjs +2 -2
  24. package/dist/go.js +3 -1
  25. package/dist/go.mjs +1 -1
  26. package/dist/index.d.mts +114 -13
  27. package/dist/index.d.ts +114 -13
  28. package/dist/index.js +82 -6
  29. package/dist/index.mjs +74 -6
  30. package/dist/{jobs-DrDmqiBb.d.mts → jobs-CClqlUld.d.mts} +1 -1
  31. package/dist/{jobs-BwxCoTRJ.d.ts → jobs-D04ngjCP.d.ts} +1 -1
  32. package/dist/paths.d.mts +2 -0
  33. package/dist/paths.d.ts +2 -0
  34. package/dist/paths.js +3 -1
  35. package/dist/paths.mjs +1 -1
  36. package/dist/{roles-B_d0igKI.d.mts → roles-D745cT5b.d.mts} +3 -1
  37. package/dist/{roles-B_d0igKI.d.ts → roles-D745cT5b.d.ts} +3 -1
  38. package/dist/route-contract.d.mts +2 -2
  39. package/dist/route-contract.d.ts +2 -2
  40. package/dist/route-contract.js +9 -4
  41. package/dist/route-contract.mjs +2 -2
  42. package/dist/{search-CbGEG89W.d.mts → search-BtrwcLkc.d.mts} +1 -1
  43. package/dist/{search-D4Uo2bRh.d.ts → search-DZeNdYN6.d.ts} +1 -1
  44. package/dist/{seo-CnqvU41p.d.ts → seo-DLoyZRTo.d.ts} +1 -1
  45. package/dist/{seo-DiJBveAA.d.mts → seo-LfpgbdnO.d.mts} +1 -1
  46. package/dist/seo-files.d.mts +2 -2
  47. package/dist/seo-files.d.ts +2 -2
  48. package/dist/seo.d.mts +6 -6
  49. package/dist/seo.d.ts +6 -6
  50. package/dist/seo.js +3 -1
  51. package/dist/seo.mjs +2 -2
  52. package/dist/server.d.mts +6 -6
  53. package/dist/server.d.ts +6 -6
  54. package/dist/server.mjs +1 -1
  55. package/dist/sitemap.d.mts +6 -6
  56. package/dist/sitemap.d.ts +6 -6
  57. package/dist/sitemap.js +3 -1
  58. package/dist/sitemap.mjs +2 -2
  59. package/dist/suggest.d.mts +2 -2
  60. package/dist/suggest.d.ts +2 -2
  61. package/dist/well-known.d.mts +1 -1
  62. package/dist/well-known.d.ts +1 -1
  63. package/dist/well-known.js +9 -4
  64. package/dist/well-known.mjs +2 -2
  65. package/package.json +1 -1
  66. package/skills/cavuno-board-products/SKILL.md +30 -1
  67. package/skills/manifest.json +2 -2
package/dist/sitemap.mjs CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-DLSO6XXY.mjs";
4
4
  import {
5
5
  isNotFound
6
- } from "./chunk-M4CX64RC.mjs";
6
+ } from "./chunk-COHTNSU2.mjs";
7
7
  import {
8
8
  BOARD_PATHS,
9
9
  blogAuthorPath,
@@ -19,7 +19,7 @@ import {
19
19
  salaryLocationPath,
20
20
  salarySkillPath,
21
21
  salaryTitlePath
22
- } from "./chunk-MSY7ERBY.mjs";
22
+ } from "./chunk-RAE63XH5.mjs";
23
23
 
24
24
  // src/sitemap/xml.ts
25
25
  var SITEMAP_BUCKETS = [
@@ -1,5 +1,5 @@
1
- import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-CbGEG89W.mjs';
2
- import './_spec-B6YOcfhm.mjs';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-BtrwcLkc.mjs';
2
+ import './_spec-D1Qg_Twd.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-D4Uo2bRh.js';
2
- import './_spec-B6YOcfhm.js';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-DZeNdYN6.js';
2
+ import './_spec-D1Qg_Twd.js';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/suggest` — framework-agnostic headless search-suggest
@@ -1,4 +1,4 @@
1
- import { R as RouteEntry, a as RouteRole } from './roles-B_d0igKI.mjs';
1
+ import { R as RouteEntry, a as RouteRole } from './roles-D745cT5b.mjs';
2
2
 
3
3
  /**
4
4
  * Runtime well-known endpoint — Request → Response serving ManifestV1
@@ -1,4 +1,4 @@
1
- import { R as RouteEntry, a as RouteRole } from './roles-B_d0igKI.js';
1
+ import { R as RouteEntry, a as RouteRole } from './roles-D745cT5b.js';
2
2
 
3
3
  /**
4
4
  * Runtime well-known endpoint — Request → Response serving ManifestV1
@@ -118,7 +118,9 @@ var BOARD_PATHS = {
118
118
  /** The digital product catalogue. */
119
119
  products: "/products",
120
120
  /** A signed-in board user's purchased products. */
121
- mePurchases: "/me/purchases"
121
+ mePurchases: "/me/purchases",
122
+ /** The tip page: visitors tip the board through its tip jar. */
123
+ tip: "/tip"
122
124
  };
123
125
 
124
126
  // src/route-contract/roles.ts
@@ -158,7 +160,8 @@ var ROLE_PARAM_REGISTRY = {
158
160
  alertsManage: [],
159
161
  alertsConfirm: [],
160
162
  products: [],
161
- mePurchases: []
163
+ mePurchases: [],
164
+ tip: []
162
165
  };
163
166
  var REQUIRED_ROLES = [
164
167
  "jobDetail",
@@ -207,7 +210,8 @@ var CANONICAL_MANIFEST = {
207
210
  alertsManage: "/alerts/manage",
208
211
  alertsConfirm: "/alerts/confirm",
209
212
  products: BOARD_PATHS.products,
210
- mePurchases: BOARD_PATHS.mePurchases
213
+ mePurchases: BOARD_PATHS.mePurchases,
214
+ tip: BOARD_PATHS.tip
211
215
  }
212
216
  };
213
217
 
@@ -500,7 +504,8 @@ var ROLE_INDEX_PATHS = {
500
504
  product: BOARD_PATHS.products,
501
505
  purchase: BOARD_PATHS.home,
502
506
  products: BOARD_PATHS.products,
503
- mePurchases: BOARD_PATHS.home
507
+ mePurchases: BOARD_PATHS.home,
508
+ tip: BOARD_PATHS.home
504
509
  };
505
510
 
506
511
  // src/well-known/handler.ts
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  compileManifest
3
- } from "./chunk-LO7D3AIX.mjs";
4
- import "./chunk-MSY7ERBY.mjs";
3
+ } from "./chunk-HHMY3W7T.mjs";
4
+ import "./chunk-RAE63XH5.mjs";
5
5
 
6
6
  // src/well-known/handler.ts
7
7
  var WELL_KNOWN_CACHE_CONTROL = "public, max-age=300";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cavuno/board",
3
- "version": "4.61.0",
3
+ "version": "4.63.0",
4
4
  "description": "Build custom job boards and careers pages with Cavuno’s TypeScript SDK.",
5
5
  "keywords": [
6
6
  "api-client",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: cavuno-board-products
3
- description: Digital product storefront with @cavuno/board. Use for product lists and pages, reviews, free claims, embedded paid checkout, the purchase download page with its email confirmation, downloads, buyer reviews, resending the link, or the signed-in buyer's purchases.
3
+ description: Digital product storefront with @cavuno/board. Use for product lists and pages, reviews, free claims, embedded paid checkout, the purchase download page with its email confirmation, downloads, buyer reviews, resending the link, the signed-in buyer's purchases, or the tip jar's tip page and tip checkout.
4
4
  ---
5
5
 
6
6
  # Digital product storefront
@@ -122,6 +122,34 @@ const { data: mine } = await board.purchases.mine({ cache: 'no-store' });
122
122
 
123
123
  `review` replaces the buyer's earlier review; `product_reviews_disabled` (404) when ratings are off, `purchase_refunded` (409), `purchase_review_invalid` (400). `mine` needs a board user session and lists purchases made while signed in plus those made with the user's verified email, each with `downloadUrl`.
124
124
 
125
+ ## Tip jar
126
+
127
+ A board can have one tip jar: visitors tip any amount at or above a minimum on the tip page, `BOARD_PATHS.tip` (`/tip`), the `tip` route role. `board.tipJar` reads it and takes tips; the types are `TipJar`, `TipJarCheckoutBody`, `TipJarCheckout` and `TipJarCheckoutStatus`.
128
+
129
+ ```ts snippet
130
+ const jar = await board.tipJar.get(); // tip_jar_not_found (404): hide the tip page and its links
131
+ // jar.suggestedCents: three amounts, smallest first; jar.minimumCents; jar.allowNote
132
+ // jar.tipCount is null unless the board shows the number of tips
133
+ // jar.coverFee: the card rate, or null when the board does not offer to cover the card fee;
134
+ // tipCoverFeeCents(amountCents, jar.coverFee) is the fee to show ("Add {fee} to cover the card fee")
135
+
136
+ const kit = await board.tipJar.checkout({
137
+ amountCents: 500, // at least jar.minimumCents
138
+ note: 'Thanks for the weekly roundup!', // only when jar.allowNote; 280 characters max
139
+ coverFee: true, // the tipper ticked "cover the card fee"; only when jar.coverFee is not null
140
+ returnPath: '/tip',
141
+ website: '', // honeypot: render hidden, send empty
142
+ });
143
+ // Mount like a paid product: loadStripe(kit.publishableKey, { stripeAccount: kit.stripeAccountId })
144
+ // then initEmbeddedCheckout({ clientSecret: kit.clientSecret }). Expires after 30 minutes.
145
+
146
+ const status = await board.tipJar.getCheckout(sessionId, { cache: 'no-store' });
147
+ if (status.status === 'paid') showThanks(status.thankYouMessage, status.receiptEmail);
148
+ // 'processing' until the payment clears: poll briefly
149
+ ```
150
+
151
+ Stripe collects the tipper's email (prefilled for a signed-in board user), so the form asks only for the amount and the note. Render the note as a plain `textarea`. `receiptEmail` is masked (`m•••@gmail.com`) because the session id is in a shareable URL. Link to the tip page with `jar.url`, which follows the board's route manifest. Errors: `tip_amount_below_minimum` (400, `details.minimumCents`), `tip_amount_invalid`, `tip_note_not_allowed`, `tip_note_too_long`, `tip_fee_cover_not_allowed` (400), `tip_jar_not_found` (404), `stripe_not_connected` (409), `rate_limited` (429), `rate_limit_unavailable` (503); `getCheckout` with an unknown session is `tip_checkout_not_found` (404). The API never returns other tippers' emails or notes.
152
+
125
153
  ## Completion gate
126
154
 
127
155
  - The list shows listed products only; a link-only product page renders with `noindex`.
@@ -129,6 +157,7 @@ const { data: mine } = await board.purchases.mine({ cache: 'no-store' });
129
157
  - A forwarded download link asks for the email, and the confirmation survives a reload through your own cookie.
130
158
  - Downloads start from a button; `purchase_download_limit_reached` disables the button instead of retrying.
131
159
  - Download pages, checkout status and `mine()` are `no-store`; purchase paths never reach analytics or the sitemap.
160
+ - The tip page hides when `board.tipJar.get()` is `tip_jar_not_found`; a test tip returns with `session_id` and `getCheckout` reaches `paid`.
132
161
 
133
162
  ## Cavuno SDK reference
134
163
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.61.0",
2
+ "version": "4.63.0",
3
3
  "skills": [
4
4
  {
5
5
  "name": "cavuno-board-account",
@@ -115,7 +115,7 @@
115
115
  },
116
116
  {
117
117
  "name": "cavuno-board-products",
118
- "description": "Digital product storefront with @cavuno/board. Use for product lists and pages, reviews, free claims, embedded paid checkout, the purchase download page with its email confirmation, downloads, buyer reviews, resending the link, or the signed-in buyer's purchases.",
118
+ "description": "Digital product storefront with @cavuno/board. Use for product lists and pages, reviews, free claims, embedded paid checkout, the purchase download page with its email confirmation, downloads, buyer reviews, resending the link, the signed-in buyer's purchases, or the tip jar's tip page and tip checkout.",
119
119
  "path": "skills/cavuno-board-products/SKILL.md",
120
120
  "framework": null,
121
121
  "category": "core"