@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/index.js CHANGED
@@ -53,7 +53,8 @@ __export(src_exports, {
53
53
  parseOAuthCompletion: () => parseOAuthCompletion,
54
54
  resolveApplyAction: () => resolveApplyAction,
55
55
  resolveApplyDecision: () => resolveApplyDecision,
56
- ssoLinkProofBindingStore: () => ssoLinkProofBindingStore
56
+ ssoLinkProofBindingStore: () => ssoLinkProofBindingStore,
57
+ tipCoverFeeCents: () => tipCoverFeeCents
57
58
  });
58
59
  module.exports = __toCommonJS(src_exports);
59
60
 
@@ -259,7 +260,15 @@ var BOARD_API_ERROR_CODES = [
259
260
  // false for it, and retrying never helps.
260
261
  "purchase_download_limit_reached",
261
262
  "purchase_review_invalid",
262
- "purchase_download_all_unavailable"
263
+ "purchase_download_all_unavailable",
264
+ // Tip jar
265
+ "tip_jar_not_found",
266
+ "tip_checkout_not_found",
267
+ "tip_amount_below_minimum",
268
+ "tip_amount_invalid",
269
+ "tip_note_not_allowed",
270
+ "tip_note_too_long",
271
+ "tip_fee_cover_not_allowed"
263
272
  ];
264
273
  var BoardApiError = class extends Error {
265
274
  status;
@@ -432,7 +441,7 @@ async function clearSession(storage) {
432
441
  }
433
442
 
434
443
  // src/version.ts
435
- var SDK_VERSION = "4.61.0";
444
+ var SDK_VERSION = "4.63.0";
436
445
 
437
446
  // src/client.ts
438
447
  function isRawBody(body) {
@@ -1831,11 +1840,15 @@ function meNamespace(client) {
1831
1840
  );
1832
1841
  },
1833
1842
  /**
1834
- * List the verification status of the items on my profile (experience,
1835
- * education and collection entries). Items not listed are unverified.
1843
+ * List the items on my profile that can be verified (experience,
1844
+ * education and collection entries) with their status. Each row's
1845
+ * `nextStep` says which step the item allows now (an email check
1846
+ * can still be rate limited), and `emailCheck` is set while an
1847
+ * emailed code is waiting to be typed.
1836
1848
  *
1837
1849
  * @example
1838
1850
  * const { data } = await board.me.profile.listVerifications();
1851
+ * const canEmail = data.filter((item) => item.nextStep === 'email');
1839
1852
  */
1840
1853
  listVerifications(options) {
1841
1854
  return client.fetch(
@@ -2069,7 +2082,10 @@ function meNamespace(client) {
2069
2082
  { ...options, method: "PUT", body }
2070
2083
  );
2071
2084
  },
2072
- /** List the verification status of the items on one of my companies. */
2085
+ /**
2086
+ * List the items on one of my companies that can be verified, with
2087
+ * their status and `nextStep`.
2088
+ */
2073
2089
  listVerifications(slug, options) {
2074
2090
  return client.fetch(
2075
2091
  `/me/companies/${encodeURIComponent(slug)}/verifications`,
@@ -4486,6 +4502,55 @@ function taxonomyNamespace(client) {
4486
4502
  };
4487
4503
  }
4488
4504
 
4505
+ // src/namespaces/tip-jar.ts
4506
+ function tipJarNamespace(client) {
4507
+ return {
4508
+ /**
4509
+ * The board's tip page. A `tip_jar_not_found` error (404) means the
4510
+ * board has no tip jar or it is archived: hide the page and its links.
4511
+ *
4512
+ * @example
4513
+ * const jar = await board.tipJar.get();
4514
+ * jar.suggestedCents; // [300, 500, 1000]
4515
+ */
4516
+ get(options) {
4517
+ return client.fetch("/tip-jar", options);
4518
+ },
4519
+ /**
4520
+ * Start a tip: returns an embedded Stripe Checkout mount kit (it expires
4521
+ * after 30 minutes). Signed in, the visitor's email is filled in on
4522
+ * Stripe's form. `amountCents` is at least `minimumCents`; send a `note`
4523
+ * only when `allowNote` is true.
4524
+ *
4525
+ * @example
4526
+ * const kit = await board.tipJar.checkout({ amountCents: 500 });
4527
+ * // mount Stripe's embedded checkout with kit.clientSecret
4528
+ */
4529
+ checkout(body, options) {
4530
+ return client.fetch("/tip-jar/checkout", {
4531
+ ...options,
4532
+ method: "POST",
4533
+ body
4534
+ });
4535
+ },
4536
+ /**
4537
+ * After Stripe returns the tipper (`session_id` on the return URL):
4538
+ * `processing` while a delayed payment clears, then `paid`, with the
4539
+ * amount, the masked receipt email and the thank-you message.
4540
+ *
4541
+ * @example
4542
+ * const s = await board.tipJar.getCheckout(sessionId);
4543
+ * if (s.status === 'paid') showThanks(s.thankYouMessage);
4544
+ */
4545
+ getCheckout(sessionId, options) {
4546
+ return client.fetch(
4547
+ `/tip-jar/checkout/${encodeURIComponent(sessionId)}`,
4548
+ options
4549
+ );
4550
+ }
4551
+ };
4552
+ }
4553
+
4489
4554
  // src/pagination.ts
4490
4555
  function paginate(listFn, query, options) {
4491
4556
  async function* pages() {
@@ -4604,6 +4669,16 @@ function parseJobAlertUnsubscribeParams(url) {
4604
4669
  return { alertId, emailId };
4605
4670
  }
4606
4671
 
4672
+ // src/tip-cover-fee.ts
4673
+ function tipCoverFeeCents(amountCents, coverFee) {
4674
+ if (!coverFee || !Number.isInteger(amountCents) || amountCents <= 0) {
4675
+ return 0;
4676
+ }
4677
+ const keepBps = 1e4 - coverFee.percentBps;
4678
+ const numerator = (amountCents + coverFee.fixedMinor) * 1e4;
4679
+ return Math.floor((numerator + keepBps - 1) / keepBps) - amountCents;
4680
+ }
4681
+
4607
4682
  // src/index.ts
4608
4683
  function createBoardClient(options) {
4609
4684
  const client = new BoardClient({
@@ -4667,6 +4742,7 @@ function createBoardClient(options) {
4667
4742
  paywall: paywallNamespace(client),
4668
4743
  products: productsNamespace(client),
4669
4744
  purchases: purchasesNamespace(client),
4745
+ tipJar: tipJarNamespace(client),
4670
4746
  sitemap: sitemapNamespace(client)
4671
4747
  };
4672
4748
  }
package/dist/index.mjs CHANGED
@@ -25,7 +25,7 @@ import {
25
25
  isSsoRequired,
26
26
  isUnauthorized,
27
27
  isValidationError
28
- } from "./chunk-M4CX64RC.mjs";
28
+ } from "./chunk-COHTNSU2.mjs";
29
29
 
30
30
  // src/query.ts
31
31
  function toSearchParams(query) {
@@ -46,7 +46,7 @@ function toSearchParams(query) {
46
46
  }
47
47
 
48
48
  // src/version.ts
49
- var SDK_VERSION = "4.61.0";
49
+ var SDK_VERSION = "4.63.0";
50
50
 
51
51
  // src/client.ts
52
52
  function isRawBody(body) {
@@ -1445,11 +1445,15 @@ function meNamespace(client) {
1445
1445
  );
1446
1446
  },
1447
1447
  /**
1448
- * List the verification status of the items on my profile (experience,
1449
- * education and collection entries). Items not listed are unverified.
1448
+ * List the items on my profile that can be verified (experience,
1449
+ * education and collection entries) with their status. Each row's
1450
+ * `nextStep` says which step the item allows now (an email check
1451
+ * can still be rate limited), and `emailCheck` is set while an
1452
+ * emailed code is waiting to be typed.
1450
1453
  *
1451
1454
  * @example
1452
1455
  * const { data } = await board.me.profile.listVerifications();
1456
+ * const canEmail = data.filter((item) => item.nextStep === 'email');
1453
1457
  */
1454
1458
  listVerifications(options) {
1455
1459
  return client.fetch(
@@ -1683,7 +1687,10 @@ function meNamespace(client) {
1683
1687
  { ...options, method: "PUT", body }
1684
1688
  );
1685
1689
  },
1686
- /** List the verification status of the items on one of my companies. */
1690
+ /**
1691
+ * List the items on one of my companies that can be verified, with
1692
+ * their status and `nextStep`.
1693
+ */
1687
1694
  listVerifications(slug, options) {
1688
1695
  return client.fetch(
1689
1696
  `/me/companies/${encodeURIComponent(slug)}/verifications`,
@@ -4100,6 +4107,55 @@ function taxonomyNamespace(client) {
4100
4107
  };
4101
4108
  }
4102
4109
 
4110
+ // src/namespaces/tip-jar.ts
4111
+ function tipJarNamespace(client) {
4112
+ return {
4113
+ /**
4114
+ * The board's tip page. A `tip_jar_not_found` error (404) means the
4115
+ * board has no tip jar or it is archived: hide the page and its links.
4116
+ *
4117
+ * @example
4118
+ * const jar = await board.tipJar.get();
4119
+ * jar.suggestedCents; // [300, 500, 1000]
4120
+ */
4121
+ get(options) {
4122
+ return client.fetch("/tip-jar", options);
4123
+ },
4124
+ /**
4125
+ * Start a tip: returns an embedded Stripe Checkout mount kit (it expires
4126
+ * after 30 minutes). Signed in, the visitor's email is filled in on
4127
+ * Stripe's form. `amountCents` is at least `minimumCents`; send a `note`
4128
+ * only when `allowNote` is true.
4129
+ *
4130
+ * @example
4131
+ * const kit = await board.tipJar.checkout({ amountCents: 500 });
4132
+ * // mount Stripe's embedded checkout with kit.clientSecret
4133
+ */
4134
+ checkout(body, options) {
4135
+ return client.fetch("/tip-jar/checkout", {
4136
+ ...options,
4137
+ method: "POST",
4138
+ body
4139
+ });
4140
+ },
4141
+ /**
4142
+ * After Stripe returns the tipper (`session_id` on the return URL):
4143
+ * `processing` while a delayed payment clears, then `paid`, with the
4144
+ * amount, the masked receipt email and the thank-you message.
4145
+ *
4146
+ * @example
4147
+ * const s = await board.tipJar.getCheckout(sessionId);
4148
+ * if (s.status === 'paid') showThanks(s.thankYouMessage);
4149
+ */
4150
+ getCheckout(sessionId, options) {
4151
+ return client.fetch(
4152
+ `/tip-jar/checkout/${encodeURIComponent(sessionId)}`,
4153
+ options
4154
+ );
4155
+ }
4156
+ };
4157
+ }
4158
+
4103
4159
  // src/messaging-derive.ts
4104
4160
  function isOwnMessage(message, counterpartyId) {
4105
4161
  return message.authorBoardUserId !== counterpartyId;
@@ -4188,6 +4244,16 @@ function parseJobAlertUnsubscribeParams(url) {
4188
4244
  return { alertId, emailId };
4189
4245
  }
4190
4246
 
4247
+ // src/tip-cover-fee.ts
4248
+ function tipCoverFeeCents(amountCents, coverFee) {
4249
+ if (!coverFee || !Number.isInteger(amountCents) || amountCents <= 0) {
4250
+ return 0;
4251
+ }
4252
+ const keepBps = 1e4 - coverFee.percentBps;
4253
+ const numerator = (amountCents + coverFee.fixedMinor) * 1e4;
4254
+ return Math.floor((numerator + keepBps - 1) / keepBps) - amountCents;
4255
+ }
4256
+
4191
4257
  // src/index.ts
4192
4258
  function createBoardClient(options) {
4193
4259
  const client = new BoardClient({
@@ -4251,6 +4317,7 @@ function createBoardClient(options) {
4251
4317
  paywall: paywallNamespace(client),
4252
4318
  products: productsNamespace(client),
4253
4319
  purchases: purchasesNamespace(client),
4320
+ tipJar: tipJarNamespace(client),
4254
4321
  sitemap: sitemapNamespace(client)
4255
4322
  };
4256
4323
  }
@@ -4288,5 +4355,6 @@ export {
4288
4355
  parseOAuthCompletion,
4289
4356
  resolveApplyAction,
4290
4357
  resolveApplyDecision,
4291
- ssoLinkProofBindingStore
4358
+ ssoLinkProofBindingStore,
4359
+ tipCoverFeeCents
4292
4360
  };
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-B6YOcfhm.mjs';
1
+ import { S as Schemas } from './_spec-D1Qg_Twd.mjs';
2
2
 
3
3
  /**
4
4
  * Optional pagination metadata returned by Board API list operations.
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-B6YOcfhm.js';
1
+ import { S as Schemas } from './_spec-D1Qg_Twd.js';
2
2
 
3
3
  /**
4
4
  * Optional pagination metadata returned by Board API list operations.
package/dist/paths.d.mts CHANGED
@@ -186,6 +186,8 @@ declare const BOARD_PATHS: {
186
186
  readonly products: "/products";
187
187
  /** A signed-in board user's purchased products. */
188
188
  readonly mePurchases: "/me/purchases";
189
+ /** The tip page: visitors tip the board through its tip jar. */
190
+ readonly tip: "/tip";
189
191
  };
190
192
  /**
191
193
  * Email `/go` indirection paths. Pure builders so
package/dist/paths.d.ts CHANGED
@@ -186,6 +186,8 @@ declare const BOARD_PATHS: {
186
186
  readonly products: "/products";
187
187
  /** A signed-in board user's purchased products. */
188
188
  readonly mePurchases: "/me/purchases";
189
+ /** The tip page: visitors tip the board through its tip jar. */
190
+ readonly tip: "/tip";
189
191
  };
190
192
  /**
191
193
  * Email `/go` indirection paths. Pure builders so
package/dist/paths.js CHANGED
@@ -171,7 +171,9 @@ var BOARD_PATHS = {
171
171
  /** The digital product catalogue. */
172
172
  products: "/products",
173
173
  /** A signed-in board user's purchased products. */
174
- mePurchases: "/me/purchases"
174
+ mePurchases: "/me/purchases",
175
+ /** The tip page: visitors tip the board through its tip jar. */
176
+ tip: "/tip"
175
177
  };
176
178
  function goJobPath(jobId) {
177
179
  return `/go/job/${jobId}`;
package/dist/paths.mjs CHANGED
@@ -25,7 +25,7 @@ import {
25
25
  suggestionPath,
26
26
  talentLocationPath,
27
27
  talentProfilePath
28
- } from "./chunk-MSY7ERBY.mjs";
28
+ } from "./chunk-RAE63XH5.mjs";
29
29
  export {
30
30
  BOARD_PATHS,
31
31
  blogAuthorPath,
@@ -67,7 +67,9 @@ type RouteRole = 'jobDetail' | 'jobsCategory' | 'jobsSkill' | 'jobsLocation' | '
67
67
  /** A digital product's page. */
68
68
  | 'product'
69
69
  /** A purchase's download page (emails link here). */
70
- | 'purchase' | 'home' | 'jobs' | 'companies' | 'salaries' | 'salaryCompanies' | 'salaryTitles' | 'salarySkills' | 'salaryLocations' | 'blog' | 'about' | 'privacyPolicy' | 'termsOfService' | 'cookiePolicy' | 'impressum' | 'talent' | 'employers' | 'alertsManage' | 'alertsConfirm' | 'products' | 'mePurchases';
70
+ | 'purchase' | 'home' | 'jobs' | 'companies' | 'salaries' | 'salaryCompanies' | 'salaryTitles' | 'salarySkills' | 'salaryLocations' | 'blog' | 'about' | 'privacyPolicy' | 'termsOfService' | 'cookiePolicy' | 'impressum' | 'talent' | 'employers' | 'alertsManage' | 'alertsConfirm' | 'products' | 'mePurchases'
71
+ /** The tip page (the board's tip jar); optional, never required. */
72
+ | 'tip';
71
73
  /**
72
74
  * Exact param-name set per role, derived from each helper's signature.
73
75
  * Empty arrays = static / zero-param roles (never inferred by signature).
@@ -67,7 +67,9 @@ type RouteRole = 'jobDetail' | 'jobsCategory' | 'jobsSkill' | 'jobsLocation' | '
67
67
  /** A digital product's page. */
68
68
  | 'product'
69
69
  /** A purchase's download page (emails link here). */
70
- | 'purchase' | 'home' | 'jobs' | 'companies' | 'salaries' | 'salaryCompanies' | 'salaryTitles' | 'salarySkills' | 'salaryLocations' | 'blog' | 'about' | 'privacyPolicy' | 'termsOfService' | 'cookiePolicy' | 'impressum' | 'talent' | 'employers' | 'alertsManage' | 'alertsConfirm' | 'products' | 'mePurchases';
70
+ | 'purchase' | 'home' | 'jobs' | 'companies' | 'salaries' | 'salaryCompanies' | 'salaryTitles' | 'salarySkills' | 'salaryLocations' | 'blog' | 'about' | 'privacyPolicy' | 'termsOfService' | 'cookiePolicy' | 'impressum' | 'talent' | 'employers' | 'alertsManage' | 'alertsConfirm' | 'products' | 'mePurchases'
71
+ /** The tip page (the board's tip jar); optional, never required. */
72
+ | 'tip';
71
73
  /**
72
74
  * Exact param-name set per role, derived from each helper's signature.
73
75
  * Empty arrays = static / zero-param roles (never inferred by signature).
@@ -1,5 +1,5 @@
1
- import { R as RouteEntry, a as RouteRole, C as ClassifyResult, b as CompileResult, V as ValidateManifestError, c as ValidateManifestResult, M as ManifestV1 } from './roles-B_d0igKI.mjs';
2
- export { A as ALL_ROLES, d as Ambiguity, e as CANONICAL_MANIFEST, f as REQUIRED_ROLES, g as ROLE_PARAM_REGISTRY, i as isRouteRole } from './roles-B_d0igKI.mjs';
1
+ import { R as RouteEntry, a as RouteRole, C as ClassifyResult, b as CompileResult, V as ValidateManifestError, c as ValidateManifestResult, M as ManifestV1 } from './roles-D745cT5b.mjs';
2
+ export { A as ALL_ROLES, d as Ambiguity, e as CANONICAL_MANIFEST, f as REQUIRED_ROLES, g as ROLE_PARAM_REGISTRY, i as isRouteRole } from './roles-D745cT5b.mjs';
3
3
 
4
4
  /**
5
5
  * Classify routes into role assignments. Markers (keyed by `sourcePath`)
@@ -1,5 +1,5 @@
1
- import { R as RouteEntry, a as RouteRole, C as ClassifyResult, b as CompileResult, V as ValidateManifestError, c as ValidateManifestResult, M as ManifestV1 } from './roles-B_d0igKI.js';
2
- export { A as ALL_ROLES, d as Ambiguity, e as CANONICAL_MANIFEST, f as REQUIRED_ROLES, g as ROLE_PARAM_REGISTRY, i as isRouteRole } from './roles-B_d0igKI.js';
1
+ import { R as RouteEntry, a as RouteRole, C as ClassifyResult, b as CompileResult, V as ValidateManifestError, c as ValidateManifestResult, M as ManifestV1 } from './roles-D745cT5b.js';
2
+ export { A as ALL_ROLES, d as Ambiguity, e as CANONICAL_MANIFEST, f as REQUIRED_ROLES, g as ROLE_PARAM_REGISTRY, i as isRouteRole } from './roles-D745cT5b.js';
3
3
 
4
4
  /**
5
5
  * Classify routes into role assignments. Markers (keyed by `sourcePath`)
@@ -137,7 +137,9 @@ var BOARD_PATHS = {
137
137
  /** The digital product catalogue. */
138
138
  products: "/products",
139
139
  /** A signed-in board user's purchased products. */
140
- mePurchases: "/me/purchases"
140
+ mePurchases: "/me/purchases",
141
+ /** The tip page: visitors tip the board through its tip jar. */
142
+ tip: "/tip"
141
143
  };
142
144
 
143
145
  // src/route-contract/roles.ts
@@ -177,7 +179,8 @@ var ROLE_PARAM_REGISTRY = {
177
179
  alertsManage: [],
178
180
  alertsConfirm: [],
179
181
  products: [],
180
- mePurchases: []
182
+ mePurchases: [],
183
+ tip: []
181
184
  };
182
185
  var REQUIRED_ROLES = [
183
186
  "jobDetail",
@@ -229,7 +232,8 @@ var CANONICAL_MANIFEST = {
229
232
  alertsManage: "/alerts/manage",
230
233
  alertsConfirm: "/alerts/confirm",
231
234
  products: BOARD_PATHS.products,
232
- mePurchases: BOARD_PATHS.mePurchases
235
+ mePurchases: BOARD_PATHS.mePurchases,
236
+ tip: BOARD_PATHS.tip
233
237
  }
234
238
  };
235
239
 
@@ -1155,7 +1159,8 @@ var ROLE_INDEX_PATHS = {
1155
1159
  product: BOARD_PATHS.products,
1156
1160
  purchase: BOARD_PATHS.home,
1157
1161
  products: BOARD_PATHS.products,
1158
- mePurchases: BOARD_PATHS.home
1162
+ mePurchases: BOARD_PATHS.home,
1163
+ tip: BOARD_PATHS.home
1159
1164
  };
1160
1165
  function splitSegments(path) {
1161
1166
  const withoutLeading = path.startsWith("/") ? path.slice(1) : path;
@@ -26,8 +26,8 @@ import {
26
26
  parseTanStackRoutes,
27
27
  sameParamSet,
28
28
  validateManifest
29
- } from "./chunk-LO7D3AIX.mjs";
30
- import "./chunk-MSY7ERBY.mjs";
29
+ } from "./chunk-HHMY3W7T.mjs";
30
+ import "./chunk-RAE63XH5.mjs";
31
31
  export {
32
32
  ALL_ROLES,
33
33
  CANONICAL_MANIFEST,
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-B6YOcfhm.mjs';
1
+ import { S as Schemas } from './_spec-D1Qg_Twd.mjs';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-B6YOcfhm.js';
1
+ import { S as Schemas } from './_spec-D1Qg_Twd.js';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-B6YOcfhm.js';
1
+ import { S as Schemas } from './_spec-D1Qg_Twd.js';
2
2
 
3
3
  /**
4
4
  * The public SEO-infra payload (`board.seo()`) — platform infrastructure a
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-B6YOcfhm.mjs';
1
+ import { S as Schemas } from './_spec-D1Qg_Twd.mjs';
2
2
 
3
3
  /**
4
4
  * The public SEO-infra payload (`board.seo()`) — platform infrastructure a
@@ -1,5 +1,5 @@
1
- import { B as BoardSeo } from './seo-DiJBveAA.mjs';
2
- import './_spec-B6YOcfhm.mjs';
1
+ import { B as BoardSeo } from './seo-LfpgbdnO.mjs';
2
+ import './_spec-D1Qg_Twd.mjs';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/seo-files` — platform-owned crawler/identity file bodies
@@ -1,5 +1,5 @@
1
- import { B as BoardSeo } from './seo-CnqvU41p.js';
2
- import './_spec-B6YOcfhm.js';
1
+ import { B as BoardSeo } from './seo-DLoyZRTo.js';
2
+ import './_spec-D1Qg_Twd.js';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/seo-files` — platform-owned crawler/identity file bodies
package/dist/seo.d.mts CHANGED
@@ -1,9 +1,9 @@
1
- import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-BazgjIMl.mjs';
2
- import { e as JsonLdObject } from './breadcrumbs-DxlE86G-.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-DxlE86G-.mjs';
4
- import './_spec-B6YOcfhm.mjs';
5
- import './board-BwOeOQ6v.mjs';
6
- import './jobs-DrDmqiBb.mjs';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-e0YbZBjg.mjs';
2
+ import { e as JsonLdObject } from './breadcrumbs-C5WjB8jm.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-C5WjB8jm.mjs';
4
+ import './_spec-D1Qg_Twd.mjs';
5
+ import './board-Cc3wbTKI.mjs';
6
+ import './jobs-CClqlUld.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-Iz3vKyol.js';
2
- import { e as JsonLdObject } from './breadcrumbs-pccdTbvQ.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-pccdTbvQ.js';
4
- import './_spec-B6YOcfhm.js';
5
- import './board-Bd7H1jwl.js';
6
- import './jobs-BwxCoTRJ.js';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-Dp2jAVVM.js';
2
+ import { e as JsonLdObject } from './breadcrumbs-BOFeIYEX.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-BOFeIYEX.js';
4
+ import './_spec-D1Qg_Twd.js';
5
+ import './board-BeNZLOYC.js';
6
+ import './jobs-D04ngjCP.js';
7
7
 
8
8
  /**
9
9
  * Blog structured data on the `@cavuno/board` wire types, transcribed from
package/dist/seo.js CHANGED
@@ -211,7 +211,9 @@ var BOARD_PATHS = {
211
211
  /** The digital product catalogue. */
212
212
  products: "/products",
213
213
  /** A signed-in board user's purchased products. */
214
- mePurchases: "/me/purchases"
214
+ mePurchases: "/me/purchases",
215
+ /** The tip page: visitors tip the board through its tip jar. */
216
+ tip: "/tip"
215
217
  };
216
218
  function boardUrl(origin, path) {
217
219
  return `${origin.replace(/\/+$/, "")}${path}`;
package/dist/seo.mjs CHANGED
@@ -17,11 +17,11 @@ import {
17
17
  skillSalaryJsonLd,
18
18
  sortBySeniority,
19
19
  titleSalaryJsonLd
20
- } from "./chunk-R3QB3WM6.mjs";
20
+ } from "./chunk-4KMZZR3A.mjs";
21
21
  import {
22
22
  boardUrl,
23
23
  jobDetailPath
24
- } from "./chunk-MSY7ERBY.mjs";
24
+ } from "./chunk-RAE63XH5.mjs";
25
25
 
26
26
  // src/seo/blog.ts
27
27
  function createBlogArticleJsonLd({
package/dist/server.d.mts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-B6YOcfhm.mjs';
3
- import './search-CbGEG89W.mjs';
4
- import './jobs-DrDmqiBb.mjs';
5
- import './board-BwOeOQ6v.mjs';
6
- import './seo-DiJBveAA.mjs';
7
- import './blog-BazgjIMl.mjs';
2
+ import './_spec-D1Qg_Twd.mjs';
3
+ import './search-BtrwcLkc.mjs';
4
+ import './jobs-CClqlUld.mjs';
5
+ import './board-Cc3wbTKI.mjs';
6
+ import './seo-LfpgbdnO.mjs';
7
+ import './blog-e0YbZBjg.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-B6YOcfhm.js';
3
- import './search-D4Uo2bRh.js';
4
- import './jobs-BwxCoTRJ.js';
5
- import './board-Bd7H1jwl.js';
6
- import './seo-CnqvU41p.js';
7
- import './blog-Iz3vKyol.js';
2
+ import './_spec-D1Qg_Twd.js';
3
+ import './search-DZeNdYN6.js';
4
+ import './jobs-D04ngjCP.js';
5
+ import './board-BeNZLOYC.js';
6
+ import './seo-DLoyZRTo.js';
7
+ import './blog-Dp2jAVVM.js';
8
8
 
9
9
  /**
10
10
  * Session cookie codec — pure (no framework imports, no node imports) so it
package/dist/server.mjs CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-Z4ALWIGS.mjs";
5
5
  import {
6
6
  isUnauthorized
7
- } from "./chunk-M4CX64RC.mjs";
7
+ } from "./chunk-COHTNSU2.mjs";
8
8
 
9
9
  // src/server/cookie.ts
10
10
  var COOKIE_ATTRIBUTES = "Path=/; HttpOnly; Secure; SameSite=Lax";
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-B6YOcfhm.mjs';
3
- import './search-CbGEG89W.mjs';
4
- import './jobs-DrDmqiBb.mjs';
5
- import './board-BwOeOQ6v.mjs';
6
- import './seo-DiJBveAA.mjs';
7
- import './blog-BazgjIMl.mjs';
2
+ import './_spec-D1Qg_Twd.mjs';
3
+ import './search-BtrwcLkc.mjs';
4
+ import './jobs-CClqlUld.mjs';
5
+ import './board-Cc3wbTKI.mjs';
6
+ import './seo-LfpgbdnO.mjs';
7
+ import './blog-e0YbZBjg.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-B6YOcfhm.js';
3
- import './search-D4Uo2bRh.js';
4
- import './jobs-BwxCoTRJ.js';
5
- import './board-Bd7H1jwl.js';
6
- import './seo-CnqvU41p.js';
7
- import './blog-Iz3vKyol.js';
2
+ import './_spec-D1Qg_Twd.js';
3
+ import './search-DZeNdYN6.js';
4
+ import './jobs-D04ngjCP.js';
5
+ import './board-BeNZLOYC.js';
6
+ import './seo-DLoyZRTo.js';
7
+ import './blog-Dp2jAVVM.js';
8
8
 
9
9
  /**
10
10
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
package/dist/sitemap.js CHANGED
@@ -252,7 +252,9 @@ var BOARD_PATHS = {
252
252
  /** The digital product catalogue. */
253
253
  products: "/products",
254
254
  /** A signed-in board user's purchased products. */
255
- mePurchases: "/me/purchases"
255
+ mePurchases: "/me/purchases",
256
+ /** The tip page: visitors tip the board through its tip jar. */
257
+ tip: "/tip"
256
258
  };
257
259
 
258
260
  // src/sitemap/walker.ts