@cavuno/board 4.33.0 → 4.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.
Files changed (40) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/dist/{_spec-BdqHycDm.d.mts → _spec-DBpKC6Rv.d.mts} +73 -11
  3. package/dist/{_spec-BdqHycDm.d.ts → _spec-DBpKC6Rv.d.ts} +73 -11
  4. package/dist/analytics.d.mts +39 -2
  5. package/dist/analytics.d.ts +39 -2
  6. package/dist/analytics.js +57 -1
  7. package/dist/analytics.mjs +57 -1
  8. package/dist/{blog-D85cD8W0.d.ts → blog-Bk6oHqIR.d.ts} +1 -1
  9. package/dist/{blog-CE0g5csE.d.mts → blog-DXCzYj2q.d.mts} +1 -1
  10. package/dist/{board-CdG7z-Vq.d.mts → board-BpOyLLl_.d.ts} +11 -3
  11. package/dist/{board-CEsr8xMh.d.ts → board-D6yRj3IN.d.mts} +11 -3
  12. package/dist/{breadcrumbs-DmVbf4_6.d.ts → breadcrumbs-B5qrRrgN.d.ts} +2 -2
  13. package/dist/{breadcrumbs-B3n9k95M.d.mts → breadcrumbs-BnYHHx40.d.mts} +2 -2
  14. package/dist/browser/cavuno-board.global.min.js +1 -1
  15. package/dist/filters.d.mts +2 -2
  16. package/dist/filters.d.ts +2 -2
  17. package/dist/format.d.mts +4 -4
  18. package/dist/format.d.ts +4 -4
  19. package/dist/index.d.mts +68 -18
  20. package/dist/index.d.ts +68 -18
  21. package/dist/index.js +1 -1
  22. package/dist/index.mjs +1 -1
  23. package/dist/{jobs-DbZuagy-.d.ts → jobs-Cgh8dwXB.d.mts} +13 -2
  24. package/dist/{jobs-COOBWXWV.d.mts → jobs-DX_wDSzt.d.ts} +13 -2
  25. package/dist/{search-BV2B73ty.d.ts → search-DOmwaBud.d.ts} +1 -1
  26. package/dist/{search-BapnDodc.d.mts → search-DsR5-O8E.d.mts} +1 -1
  27. package/dist/{seo-C_yEotTb.d.mts → seo-DbzhNmAY.d.mts} +1 -1
  28. package/dist/{seo-BcC8Tv0d.d.ts → seo-DtLE8C9q.d.ts} +1 -1
  29. package/dist/seo-files.d.mts +2 -2
  30. package/dist/seo-files.d.ts +2 -2
  31. package/dist/seo.d.mts +6 -6
  32. package/dist/seo.d.ts +6 -6
  33. package/dist/server.d.mts +6 -6
  34. package/dist/server.d.ts +6 -6
  35. package/dist/sitemap.d.mts +6 -6
  36. package/dist/sitemap.d.ts +6 -6
  37. package/dist/suggest.d.mts +2 -2
  38. package/dist/suggest.d.ts +2 -2
  39. package/package.json +1 -1
  40. package/skills/manifest.json +1 -1
package/dist/analytics.js CHANGED
@@ -30,13 +30,14 @@ __export(analytics_exports, {
30
30
  analytics: () => analytics,
31
31
  install: () => install,
32
32
  matchAnalyticsWellKnown: () => matchAnalyticsWellKnown,
33
+ recordConsent: () => recordConsent,
33
34
  track: () => track
34
35
  });
35
36
  module.exports = __toCommonJS(analytics_exports);
36
37
 
37
38
  // src/analytics/defaults.ts
38
39
  var DEFAULT_COLLECT_URL = "https://cavuno.com/api/analytics/collect";
39
- var DEFAULT_SCRIPT_URL = "https://cavuno.com/js/metrics.js?v=1.7.1-cavuno.1";
40
+ var DEFAULT_SCRIPT_URL = "https://cavuno.com/js/metrics.js?v=1.7.1-cavuno.2";
40
41
  var PENDING_TENANT_ID = "boards_pending";
41
42
  var WELL_KNOWN_ANALYTICS_SCRIPT_PATH = "/.well-known/cavuno/analytics.js";
42
43
  var WELL_KNOWN_SCRIPT_PATH = WELL_KNOWN_ANALYTICS_SCRIPT_PATH;
@@ -210,9 +211,64 @@ function track(action, payload) {
210
211
  }
211
212
  postCollectJson(installed, trimmed, payload);
212
213
  }
214
+ var CONSENT_CHOICES = [
215
+ "accepted",
216
+ "denied",
217
+ "withdrawn"
218
+ ];
219
+ var CONSENT_ID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
220
+ var BANNER_VERSION_MAX_LENGTH = 128;
221
+ function recordConsent(input) {
222
+ const publishableKey = input.publishableKey.trim();
223
+ if (!publishableKey.startsWith("pk_")) {
224
+ throw new Error(
225
+ "analytics.recordConsent requires a publishable key (pk_\u2026)"
226
+ );
227
+ }
228
+ const consentId = input.consentId.trim().toLowerCase();
229
+ if (!CONSENT_ID_PATTERN.test(consentId)) {
230
+ throw new Error("analytics.recordConsent requires a UUID consentId");
231
+ }
232
+ if (!CONSENT_CHOICES.includes(input.choice)) {
233
+ throw new Error(
234
+ "analytics.recordConsent choice must be 'accepted', 'denied' or 'withdrawn'"
235
+ );
236
+ }
237
+ const bannerVersion = input.bannerVersion.trim();
238
+ if (bannerVersion.length === 0 || bannerVersion.length > BANNER_VERSION_MAX_LENGTH) {
239
+ throw new Error(
240
+ "analytics.recordConsent requires a bannerVersion of 1\u2013128 characters"
241
+ );
242
+ }
243
+ const collectUrl = normalizeCollectUrl(
244
+ (input.collectUrl ?? resolveDefaultCollectUrl()).trim() || resolveDefaultCollectUrl()
245
+ );
246
+ void fetch(collectUrl, {
247
+ method: "POST",
248
+ headers: {
249
+ Authorization: `Bearer ${publishableKey}`,
250
+ "Content-Type": "application/json",
251
+ Accept: "application/json"
252
+ },
253
+ body: JSON.stringify({
254
+ publishableKey,
255
+ action: "consent",
256
+ payload: {
257
+ consent_id: consentId,
258
+ choice: input.choice,
259
+ banner_version: bannerVersion
260
+ }
261
+ }),
262
+ // A consent record must not travel with cookies, first-party or not.
263
+ credentials: "omit",
264
+ keepalive: true
265
+ }).catch(() => {
266
+ });
267
+ }
213
268
  var analytics = {
214
269
  install,
215
270
  track,
271
+ recordConsent,
216
272
  matchAnalyticsWellKnown,
217
273
  DEFAULT_COLLECT_URL,
218
274
  DEFAULT_SCRIPT_URL,
@@ -1,6 +1,6 @@
1
1
  // src/analytics/defaults.ts
2
2
  var DEFAULT_COLLECT_URL = "https://cavuno.com/api/analytics/collect";
3
- var DEFAULT_SCRIPT_URL = "https://cavuno.com/js/metrics.js?v=1.7.1-cavuno.1";
3
+ var DEFAULT_SCRIPT_URL = "https://cavuno.com/js/metrics.js?v=1.7.1-cavuno.2";
4
4
  var PENDING_TENANT_ID = "boards_pending";
5
5
  var WELL_KNOWN_ANALYTICS_SCRIPT_PATH = "/.well-known/cavuno/analytics.js";
6
6
  var WELL_KNOWN_SCRIPT_PATH = WELL_KNOWN_ANALYTICS_SCRIPT_PATH;
@@ -174,9 +174,64 @@ function track(action, payload) {
174
174
  }
175
175
  postCollectJson(installed, trimmed, payload);
176
176
  }
177
+ var CONSENT_CHOICES = [
178
+ "accepted",
179
+ "denied",
180
+ "withdrawn"
181
+ ];
182
+ var CONSENT_ID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
183
+ var BANNER_VERSION_MAX_LENGTH = 128;
184
+ function recordConsent(input) {
185
+ const publishableKey = input.publishableKey.trim();
186
+ if (!publishableKey.startsWith("pk_")) {
187
+ throw new Error(
188
+ "analytics.recordConsent requires a publishable key (pk_\u2026)"
189
+ );
190
+ }
191
+ const consentId = input.consentId.trim().toLowerCase();
192
+ if (!CONSENT_ID_PATTERN.test(consentId)) {
193
+ throw new Error("analytics.recordConsent requires a UUID consentId");
194
+ }
195
+ if (!CONSENT_CHOICES.includes(input.choice)) {
196
+ throw new Error(
197
+ "analytics.recordConsent choice must be 'accepted', 'denied' or 'withdrawn'"
198
+ );
199
+ }
200
+ const bannerVersion = input.bannerVersion.trim();
201
+ if (bannerVersion.length === 0 || bannerVersion.length > BANNER_VERSION_MAX_LENGTH) {
202
+ throw new Error(
203
+ "analytics.recordConsent requires a bannerVersion of 1\u2013128 characters"
204
+ );
205
+ }
206
+ const collectUrl = normalizeCollectUrl(
207
+ (input.collectUrl ?? resolveDefaultCollectUrl()).trim() || resolveDefaultCollectUrl()
208
+ );
209
+ void fetch(collectUrl, {
210
+ method: "POST",
211
+ headers: {
212
+ Authorization: `Bearer ${publishableKey}`,
213
+ "Content-Type": "application/json",
214
+ Accept: "application/json"
215
+ },
216
+ body: JSON.stringify({
217
+ publishableKey,
218
+ action: "consent",
219
+ payload: {
220
+ consent_id: consentId,
221
+ choice: input.choice,
222
+ banner_version: bannerVersion
223
+ }
224
+ }),
225
+ // A consent record must not travel with cookies, first-party or not.
226
+ credentials: "omit",
227
+ keepalive: true
228
+ }).catch(() => {
229
+ });
230
+ }
177
231
  var analytics = {
178
232
  install,
179
233
  track,
234
+ recordConsent,
180
235
  matchAnalyticsWellKnown,
181
236
  DEFAULT_COLLECT_URL,
182
237
  DEFAULT_SCRIPT_URL,
@@ -197,5 +252,6 @@ export {
197
252
  analytics,
198
253
  install,
199
254
  matchAnalyticsWellKnown,
255
+ recordConsent,
200
256
  track
201
257
  };
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-BdqHycDm.js';
1
+ import { S as Schemas } from './_spec-DBpKC6Rv.js';
2
2
 
3
3
  /** Author shape embedded on posts (no `object` discriminator). */
4
4
  type BlogAuthorEmbed = Schemas['PublicBlogAuthorEmbed'];
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-BdqHycDm.mjs';
1
+ import { S as Schemas } from './_spec-DBpKC6Rv.mjs';
2
2
 
3
3
  /** Author shape embedded on posts (no `object` discriminator). */
4
4
  type BlogAuthorEmbed = Schemas['PublicBlogAuthorEmbed'];
@@ -1,5 +1,5 @@
1
- import { S as Schemas } from './_spec-BdqHycDm.mjs';
2
- import { L as ListEnvelope, s as RelatedSearch, a as CustomFieldFilter, O as ObjectReferenceFilter } from './jobs-COOBWXWV.mjs';
1
+ import { S as Schemas } from './_spec-DBpKC6Rv.js';
2
+ import { L as ListEnvelope, t as RelatedSearch, a as CustomFieldFilter, O as ObjectReferenceFilter } from './jobs-DX_wDSzt.js';
3
3
 
4
4
  type PublicCompany = Schemas['CompanyPublic'];
5
5
  /** A market (sector) a company operates in — name + its source slug. */
@@ -123,6 +123,14 @@ type PublicBoardFeatures = PublicBoard['features'];
123
123
  type PublicBoardAnalytics = PublicBoard['analytics'];
124
124
  type PublicBoardAds = PublicBoard['ads'];
125
125
  type PublicBoardJobForm = PublicBoard['jobForm'];
126
+ /**
127
+ * One of the board's custom employment types from
128
+ * `board.context().jobForm.employmentType.customTypes`. Offer it in the
129
+ * posting form next to the built-ins when `offered` is true, in
130
+ * `jobForm.employmentType.order`; send `key` as `customEmploymentType`
131
+ * and `employmentType` (its built-in Google equivalent) together.
132
+ */
133
+ type BoardCustomEmploymentType = Schemas['BoardCustomEmploymentType'];
126
134
  /**
127
135
  * Sign-in options per role from `board.context().signIn`: which built-in
128
136
  * methods to offer and the board's SSO connections. Render the sign-in page
@@ -165,4 +173,4 @@ type CustomFieldDefinition = Schemas['CustomFieldDefinition'];
165
173
  type CustomFieldType = CustomFieldDefinition['type'];
166
174
  type CustomFieldOption = Schemas['CustomFieldOption'];
167
175
 
168
- export type { PublicBoardJobForm as A, BoardFormBuiltinField as B, CustomFieldDefinition as C, PublicBoardSignIn as D, PublicCompany as E, PublicCompanyDetail as F, PublicCompanyMembership as G, SalaryCompany as H, SalaryLocation as I, SalarySkill as J, SalaryTitle as K, LocationSalaryDetail as L, SkillLocationSalary as M, SkillLocationsIndex as N, TitleLocationSalary as O, PublicBoard as P, TitleLocationsIndex as Q, SkillSalaryDetail as S, TitleSalaryDetail as T, CompanyCategorySalary as a, CompanySalary as b, CompaniesListQuery as c, CompanyListEnvelope as d, CompaniesSearchBody as e, CompanyJobsListQuery as f, CompanySimilarQuery as g, CompanyMarketsListQuery as h, SalaryDetailQuery as i, BoardFormField as j, BoardFormLayout as k, BoardFormLockReason as l, BoardJobFormField as m, BoardProfileFormField as n, BoardRoleSignIn as o, BoardSignInSsoConnection as p, CompanyMarket as q, CompanyMarketRef as r, CompanySalarySummary as s, CustomFieldOption as t, CustomFieldType as u, LocationSkillsIndex as v, LocationTitlesIndex as w, PublicBoardAds as x, PublicBoardAnalytics as y, PublicBoardFeatures as z };
176
+ export type { PublicBoardFeatures as A, BoardCustomEmploymentType as B, CustomFieldDefinition as C, PublicBoardJobForm as D, PublicBoardSignIn as E, PublicCompany as F, PublicCompanyDetail as G, PublicCompanyMembership as H, SalaryCompany as I, SalaryLocation as J, SalarySkill as K, LocationSalaryDetail as L, SalaryTitle as M, SkillLocationSalary as N, SkillLocationsIndex as O, PublicBoard as P, TitleLocationSalary as Q, TitleLocationsIndex as R, SkillSalaryDetail as S, TitleSalaryDetail as T, CompanyCategorySalary as a, CompanySalary as b, CompaniesListQuery as c, CompanyListEnvelope as d, CompaniesSearchBody as e, CompanyJobsListQuery as f, CompanySimilarQuery as g, CompanyMarketsListQuery as h, SalaryDetailQuery as i, BoardFormBuiltinField as j, BoardFormField as k, BoardFormLayout as l, BoardFormLockReason as m, BoardJobFormField as n, BoardProfileFormField as o, BoardRoleSignIn as p, BoardSignInSsoConnection as q, CompanyMarket as r, CompanyMarketRef as s, CompanySalarySummary as t, CustomFieldOption as u, CustomFieldType as v, LocationSkillsIndex as w, LocationTitlesIndex as x, PublicBoardAds as y, PublicBoardAnalytics as z };
@@ -1,5 +1,5 @@
1
- import { S as Schemas } from './_spec-BdqHycDm.js';
2
- import { L as ListEnvelope, s as RelatedSearch, a as CustomFieldFilter, O as ObjectReferenceFilter } from './jobs-DbZuagy-.js';
1
+ import { S as Schemas } from './_spec-DBpKC6Rv.mjs';
2
+ import { L as ListEnvelope, t as RelatedSearch, a as CustomFieldFilter, O as ObjectReferenceFilter } from './jobs-Cgh8dwXB.mjs';
3
3
 
4
4
  type PublicCompany = Schemas['CompanyPublic'];
5
5
  /** A market (sector) a company operates in — name + its source slug. */
@@ -123,6 +123,14 @@ type PublicBoardFeatures = PublicBoard['features'];
123
123
  type PublicBoardAnalytics = PublicBoard['analytics'];
124
124
  type PublicBoardAds = PublicBoard['ads'];
125
125
  type PublicBoardJobForm = PublicBoard['jobForm'];
126
+ /**
127
+ * One of the board's custom employment types from
128
+ * `board.context().jobForm.employmentType.customTypes`. Offer it in the
129
+ * posting form next to the built-ins when `offered` is true, in
130
+ * `jobForm.employmentType.order`; send `key` as `customEmploymentType`
131
+ * and `employmentType` (its built-in Google equivalent) together.
132
+ */
133
+ type BoardCustomEmploymentType = Schemas['BoardCustomEmploymentType'];
126
134
  /**
127
135
  * Sign-in options per role from `board.context().signIn`: which built-in
128
136
  * methods to offer and the board's SSO connections. Render the sign-in page
@@ -165,4 +173,4 @@ type CustomFieldDefinition = Schemas['CustomFieldDefinition'];
165
173
  type CustomFieldType = CustomFieldDefinition['type'];
166
174
  type CustomFieldOption = Schemas['CustomFieldOption'];
167
175
 
168
- export type { PublicBoardJobForm as A, BoardFormBuiltinField as B, CustomFieldDefinition as C, PublicBoardSignIn as D, PublicCompany as E, PublicCompanyDetail as F, PublicCompanyMembership as G, SalaryCompany as H, SalaryLocation as I, SalarySkill as J, SalaryTitle as K, LocationSalaryDetail as L, SkillLocationSalary as M, SkillLocationsIndex as N, TitleLocationSalary as O, PublicBoard as P, TitleLocationsIndex as Q, SkillSalaryDetail as S, TitleSalaryDetail as T, CompanyCategorySalary as a, CompanySalary as b, CompaniesListQuery as c, CompanyListEnvelope as d, CompaniesSearchBody as e, CompanyJobsListQuery as f, CompanySimilarQuery as g, CompanyMarketsListQuery as h, SalaryDetailQuery as i, BoardFormField as j, BoardFormLayout as k, BoardFormLockReason as l, BoardJobFormField as m, BoardProfileFormField as n, BoardRoleSignIn as o, BoardSignInSsoConnection as p, CompanyMarket as q, CompanyMarketRef as r, CompanySalarySummary as s, CustomFieldOption as t, CustomFieldType as u, LocationSkillsIndex as v, LocationTitlesIndex as w, PublicBoardAds as x, PublicBoardAnalytics as y, PublicBoardFeatures as z };
176
+ export type { PublicBoardFeatures as A, BoardCustomEmploymentType as B, CustomFieldDefinition as C, PublicBoardJobForm as D, PublicBoardSignIn as E, PublicCompany as F, PublicCompanyDetail as G, PublicCompanyMembership as H, SalaryCompany as I, SalaryLocation as J, SalarySkill as K, LocationSalaryDetail as L, SalaryTitle as M, SkillLocationSalary as N, SkillLocationsIndex as O, PublicBoard as P, TitleLocationSalary as Q, TitleLocationsIndex as R, SkillSalaryDetail as S, TitleSalaryDetail as T, CompanyCategorySalary as a, CompanySalary as b, CompaniesListQuery as c, CompanyListEnvelope as d, CompaniesSearchBody as e, CompanyJobsListQuery as f, CompanySimilarQuery as g, CompanyMarketsListQuery as h, SalaryDetailQuery as i, BoardFormBuiltinField as j, BoardFormField as k, BoardFormLayout as l, BoardFormLockReason as m, BoardJobFormField as n, BoardProfileFormField as o, BoardRoleSignIn as p, BoardSignInSsoConnection as q, CompanyMarket as r, CompanyMarketRef as s, CompanySalarySummary as t, CustomFieldOption as u, CustomFieldType as v, LocationSkillsIndex as w, LocationTitlesIndex as x, PublicBoardAds as y, PublicBoardAnalytics as z };
@@ -1,5 +1,5 @@
1
- import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-CEsr8xMh.js';
2
- import { P as PublicJob } from './jobs-DbZuagy-.js';
1
+ import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-BpOyLLl_.js';
2
+ import { P as PublicJob } from './jobs-DX_wDSzt.js';
3
3
 
4
4
  /**
5
5
  * Wire enum for `salaryTimeframe`. Defined here (not re-exported from any
@@ -1,5 +1,5 @@
1
- import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-CdG7z-Vq.mjs';
2
- import { P as PublicJob } from './jobs-COOBWXWV.mjs';
1
+ import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-D6yRj3IN.mjs';
2
+ import { P as PublicJob } from './jobs-Cgh8dwXB.mjs';
3
3
 
4
4
  /**
5
5
  * Wire enum for `salaryTimeframe`. Defined here (not re-exported from any