@thejob/schema 2.1.8 → 2.2.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/dist/index.d.ts CHANGED
@@ -42,6 +42,170 @@ declare const UserIdAndCreatedAtSchema: yup.ObjectSchema<{
42
42
  }, "">;
43
43
  type TUserIdAndCreatedAtSchema = InferType<typeof UserIdAndCreatedAtSchema>;
44
44
 
45
+ /**
46
+ * An open vocabulary: skills, companies, institutes. Any token matches (OR
47
+ * within a facet); facets AND together.
48
+ */
49
+ declare const tokens: (label: string) => yup.ArraySchema<string[] | undefined, yup.AnyObject, never[], "d">;
50
+ /**
51
+ * An open vocabulary of CODES, normalised to uppercase.
52
+ *
53
+ * For short closed-ish codes stored uppercase (ISO country, state). The
54
+ * service matches these case-insensitively anyway, so this is belt-and-braces
55
+ * — but a filter that reads back `["in"]` after saving looks broken to an
56
+ * admin, and any consumer comparing the saved value to a stored one would be
57
+ * comparing "in" against "IN".
58
+ */
59
+ declare const codeTokens: (label: string) => yup.ArraySchema<string[] | undefined, yup.AnyObject, never[], "d">;
60
+ /** A closed vocabulary, rendered as a chip picker. */
61
+ declare const enumFacet: (values: readonly string[], label: string) => yup.ArraySchema<string[] | undefined, yup.AnyObject, never[], "d">;
62
+ /**
63
+ * A relative window in whole days, resolved to an absolute bound at query time.
64
+ *
65
+ * Relative rather than absolute because a saved filter is re-resolved on every
66
+ * run: "within 30 days" keeps meaning what its author intended, while a stored
67
+ * timestamp rots. Bounded so a typo cannot become an unbounded scan.
68
+ */
69
+ declare const days: (label: string) => yup.NumberSchema<number | undefined, yup.AnyObject, undefined, "">;
70
+ /** A relative window in whole months. See `days`. */
71
+ declare const months: (label: string) => yup.NumberSchema<number | undefined, yup.AnyObject, undefined, "">;
72
+ /** A 0-100 percentage bound. */
73
+ declare const percent: (label: string) => yup.NumberSchema<number | undefined, yup.AnyObject, undefined, "">;
74
+ /**
75
+ * Absolute epoch milliseconds.
76
+ *
77
+ * `widget: "date"` because the STORED form and the ENTERED form are not the
78
+ * same thing. Epoch ms is right for storage and comparison — `createdAt` is an
79
+ * integer, and a coerced date string would not compare — but it is not
80
+ * something anyone types. Rendered as a plain number box, "8" is accepted and
81
+ * silently means 8ms after 1 Jan 1970, so a filter meant to say "this week"
82
+ * matches every record ever created and looks correctly configured doing it.
83
+ *
84
+ * The form converts; the wire format does not change.
85
+ */
86
+ declare const epoch: (label: string) => yup.NumberSchema<number | undefined, yup.AnyObject, undefined, "">;
87
+ /**
88
+ * A money bound that is only meaningful once the filter pins ONE currency.
89
+ *
90
+ * Salary is stored as a bare integer with the currency in a separate field, so
91
+ * "at least 50000" across USD/EUR/GBP/SEK/INR is not a comparison at all — it
92
+ * silently ranks a Swedish krona salary against a US dollar one. Rather than
93
+ * return a wrong set, the bound is rejected unless exactly one currency is
94
+ * selected.
95
+ *
96
+ * `currencyField` is a PARAMETER because the sibling facet is named differently
97
+ * per resource: a user filter pins `salaryCurrencies` against the salary a
98
+ * candidate wants, while a job filter pins its own currency facet against the
99
+ * band a job advertises. Hardcoding one name would make this builder silently
100
+ * inert everywhere else — the `.when` would watch a field that does not exist,
101
+ * the test would never run, and cross-currency bounds would sail through.
102
+ */
103
+ declare const currencyBound: (label: string, currencyField: string) => yup.NumberSchema<number | undefined, yup.AnyObject, undefined, "">;
104
+ /**
105
+ * A facet over an array of OBJECTS, where the parts must describe the SAME entry.
106
+ *
107
+ * The problem this solves, measured on production users:
108
+ *
109
+ * skills[]=python & skillProficiencyLevels[]=expert -> 301 users
110
+ * one skill entry that is BOTH python AND expert -> 103 users
111
+ *
112
+ * Those 198 extra people are expert at something else and happen to also list
113
+ * Python. As two independent facets the query is `{'skills.name': python,
114
+ * 'skills.proficiencyLevel': expert}`, and Mongo satisfies each from a
115
+ * DIFFERENT array entry. English + expert over-counted by 1,755 the same way.
116
+ *
117
+ * It is silent: the count is plausible, the filter reads correctly, and the
118
+ * only symptom is mail reaching people who do not match what the admin chose.
119
+ *
120
+ * So the pair is ONE facet with the qualifier nested inside it, not two facets
121
+ * that a caller is trusted to combine. A single value cannot express the wrong
122
+ * query, which is the same reason `currencyBound` refuses a bound without
123
+ * exactly one currency: if a combination is only meaningful together, the
124
+ * schema should make the meaningless form unsayable rather than answer it
125
+ * wrongly.
126
+ *
127
+ * Each entry is `{ name, <qualifier> }`, where `name` is required (a qualifier
128
+ * alone means "expert at anything", which is not a segment anyone wants) and
129
+ * the qualifier is optional (naming the skill without a level is a perfectly
130
+ * good filter). Entries OR together, matching every other list facet.
131
+ */
132
+ declare const qualified: (qualifierValues: readonly string[] | "open", qualifierKey: string, label: string) => yup.ArraySchema<{
133
+ [x: string]: string | undefined;
134
+ [x: number]: string | undefined;
135
+ }[] | undefined, yup.AnyObject, never[], "d">;
136
+ /**
137
+ * A facet over an array of objects where SEVERAL fields describe one entry and
138
+ * none of them is "the name" the others qualify.
139
+ *
140
+ * `qualified` above covers `{ name, <qualifier> }`, where the qualifier is
141
+ * meaningless alone ("expert" at nothing). This covers the other shape: one
142
+ * work-history entry is a company AND a job title, one education entry is an
143
+ * institute AND a course AND a field of study, and each part is a perfectly
144
+ * good filter on its own.
145
+ *
146
+ * That is why the flat `companies` / `designations` facets REMAIN beside this
147
+ * one rather than being replaced. "Worked at Google" and "was an engineer,
148
+ * somewhere" are real questions, and an admin asking for both usually does mean
149
+ * "has each of these somewhere in their history". What was missing is the
150
+ * narrower question — "was an engineer AT Google" — which as two flat facets
151
+ * silently also matched someone who was an engineer at Acme and a designer at
152
+ * Google. Measured on production: VIT + B.Tech returned 71 users where 64 had
153
+ * one education entry that was both.
154
+ *
155
+ * So this ADDS a way to say the precise thing; it does not take away the loose
156
+ * one. Every field is optional, but an entry must carry at least one — an
157
+ * all-empty entry would match every row and silently widen the audience, which
158
+ * is the failure this whole family of facets exists to prevent. Entries OR
159
+ * together, like every other list facet.
160
+ *
161
+ * ── Field types ─────────────────────────────────────────────────────────────
162
+ * A field is text by default. Pass an object to type it instead:
163
+ *
164
+ * conjunction(["company", "designation", { name: "isCurrent", type: "boolean" }], …)
165
+ *
166
+ * The typed forms exist because not every part of an entry is free text. A work
167
+ * entry is also "is this their CURRENT job" (`duration.isActive`) and "was it
168
+ * remote" (`isRemote`), and an education entry has a `studyType` from a closed
169
+ * vocabulary. Those are the parts that make a same-entry filter worth asking:
170
+ * "engineer at Google" is a different question from "engineer at Google NOW".
171
+ *
172
+ * A boolean field is only a constraint when present. `false` is a real value
173
+ * here ("not their current job"), so it is NOT dropped as empty the way a blank
174
+ * string is — which is also why a boolean alone satisfies "at least one field".
175
+ */
176
+ type ConjunctionField = string | {
177
+ name: string;
178
+ type: "string" | "boolean";
179
+ oneOf?: readonly string[];
180
+ };
181
+ declare const conjunction: (fields: readonly ConjunctionField[], label: string) => yup.ArraySchema<{
182
+ [x: string]: any;
183
+ [x: number]: any;
184
+ [x: symbol]: any;
185
+ }[] | undefined, yup.AnyObject, never[], "d">;
186
+ /**
187
+ * Reject keys a schema does not declare, WITHOUT turning on strict mode.
188
+ *
189
+ * A silently dropped key is the dangerous failure: a filter whose "Has Resume"
190
+ * checkbox arrives under a misspelled name is not a narrower query, it is the
191
+ * unfiltered one, and it mails everyone while looking correctly configured. The
192
+ * caller sees a plausible result and no error, so the mistake survives review.
193
+ *
194
+ * Yup's own `.noUnknown()` only ERRORS under `.strict()`, and strict mode also
195
+ * disables coercion — which would reject the `"80"` and `"true"` strings that
196
+ * HTML form payloads legitimately send. This is written as a `.test()` instead
197
+ * so both hold at once: unknown keys fail, coercion stays on.
198
+ *
199
+ * `allowed` is a FUNCTION, not an array, for two reasons: it is evaluated at
200
+ * validation time rather than module-load time (so a schema may reference keys
201
+ * declared later in the file), and it lets two schemas built from the same shape
202
+ * permit different key sets — which is how a filter's `or` branch forbids a
203
+ * nested `or` while the top-level filter allows one.
204
+ */
205
+ declare const rejectUnknownKeys: <T extends {
206
+ test: (...a: never[]) => T;
207
+ }>(schema: T, allowed: () => readonly string[]) => T;
208
+
45
209
  /**
46
210
  * Common option keys shared across schemas. `Yes`/`No` are used by acknowledge
47
211
  * questions; `Skill`/`EducationLevel`/`ExperienceLevel`/etc. tag where a choice
@@ -144,6 +308,18 @@ declare enum GroupStatus {
144
308
  Active = "active",
145
309
  Archived = "archived"
146
310
  }
311
+ /**
312
+ * The enum values as arrays, for schemas that need `.oneOf(...)`.
313
+ *
314
+ * The same `Object.values(...)` form `page.constant.ts` already exports
315
+ * (`SupportedPageTypes`, `SupportedPageStatuses`). Derived rather than written
316
+ * out, so a new enum member cannot be added to one list and forgotten in the
317
+ * other.
318
+ */
319
+ declare const SupportedGroupStatuses: GroupStatus[];
320
+ declare const SupportedGroupVisibilities: GroupVisibility[];
321
+ declare const SupportedGroupManagedBy: GroupManagedBy[];
322
+ declare const SupportedGroupMembershipStatuses: GroupMembershipStatus[];
147
323
 
148
324
  declare const GroupTranslationSchema: yup.ObjectSchema<{
149
325
  language: string;
@@ -197,8 +373,8 @@ declare const GroupSchema: yup.ObjectSchema<{
197
373
  description?: string | undefined;
198
374
  keywords?: string[] | undefined;
199
375
  } | undefined;
200
- language: string;
201
376
  name: string;
377
+ language: string;
202
378
  }[] | undefined;
203
379
  managedBy: GroupManagedBy;
204
380
  status: GroupStatus;
@@ -247,6 +423,33 @@ declare const GroupMembershipSchema: yup.ObjectSchema<{
247
423
  updatedAt: undefined;
248
424
  }, "">;
249
425
 
426
+ /**
427
+ * THE group filter.
428
+ *
429
+ * Wrapped in `rejectUnknownKeys` following `UserFilterSchema` rather than
430
+ * `JobFilterSchema`: an unknown key here is silently dropped by yup and then
431
+ * matches nothing downstream, so it must fail loudly at the point it is written.
432
+ */
433
+ declare const GroupFilterSchema: yup.ObjectSchema<{
434
+ status: string[];
435
+ visibility: string[];
436
+ managedBy: string[];
437
+ isFeatured: boolean | undefined;
438
+ isDiscoverable: boolean | undefined;
439
+ countries: string[];
440
+ featuredMarkets: string[];
441
+ slugs: string[];
442
+ }, yup.AnyObject, {
443
+ status: never[];
444
+ visibility: never[];
445
+ managedBy: never[];
446
+ isFeatured: undefined;
447
+ isDiscoverable: undefined;
448
+ countries: never[];
449
+ featuredMarkets: never[];
450
+ slugs: never[];
451
+ }, "">;
452
+
250
453
  declare enum JobStatus {
251
454
  Published = "published",
252
455
  Draft = "draft",
@@ -430,8 +633,8 @@ declare const JobSchema: ObjectSchema<{
430
633
  dark?: string | null | undefined;
431
634
  light?: string | undefined;
432
635
  } | null | undefined;
433
- type: PageType;
434
636
  name: string;
637
+ type: PageType;
435
638
  };
436
639
  designation: string | null | undefined;
437
640
  employmentType: string;
@@ -702,6 +905,80 @@ declare const JobSchema: ObjectSchema<{
702
905
  }, "">;
703
906
  type TJobSchema = InferType<typeof JobSchema>;
704
907
 
908
+ /**
909
+ * THE job filter, with unknown keys REJECTED.
910
+ *
911
+ * The guard its three sibling filter schemas (user, group, page) already carry,
912
+ * and this one was written without. Yup's own `.noUnknown()` is not an
913
+ * alternative: it only errors under `.strict()`, and strict mode also disables
914
+ * coercion — which would reject the `"7"` and `"true"` strings every query
915
+ * string is made of. `rejectUnknownKeys` is a `.test()` so both hold at once.
916
+ *
917
+ * Why it matters more here than anywhere else: a job filter arrives from a
918
+ * caller-controlled URL. Without this, a typo'd facet (`workplaceType`) and the
919
+ * retired `filter[workMode]=remote` form both VALIDATE, then reach the service
920
+ * as a facet no job document has — a 200 with a plausible full page, which is
921
+ * indistinguishable from a working search. Three consumers each hand-rolled an
922
+ * `assertKnownFacets` over `Object.keys` of this schema to compensate; this is
923
+ * the declaration those existed to substitute for.
924
+ */
925
+ declare const JobFilterSchema: yup.ObjectSchema<{
926
+ employmentType: string[];
927
+ workMode: string[];
928
+ experienceLevel: string[];
929
+ educationLevel: string[];
930
+ status: string[];
931
+ category: string[];
932
+ industry: string[];
933
+ subCategories: string[];
934
+ tags: string[];
935
+ jobIds: string[];
936
+ skills: string[];
937
+ companies: string[];
938
+ companyNames: string[];
939
+ countryCodes: string[];
940
+ stateCodes: string[];
941
+ states: string[];
942
+ cities: string[];
943
+ isFeatured: boolean | undefined;
944
+ isPromoted: boolean | undefined;
945
+ featuredMarkets: string[];
946
+ salary: {
947
+ min?: number | undefined;
948
+ max?: number | undefined;
949
+ currency?: "USD" | "EUR" | "GBP" | "SEK" | "INR" | undefined;
950
+ } | undefined;
951
+ postedWithinDays: number | undefined;
952
+ createdAt: {
953
+ min?: number | undefined;
954
+ max?: number | undefined;
955
+ } | undefined;
956
+ }, yup.AnyObject, {
957
+ employmentType: never[];
958
+ workMode: never[];
959
+ experienceLevel: never[];
960
+ educationLevel: never[];
961
+ status: never[];
962
+ category: never[];
963
+ industry: never[];
964
+ subCategories: never[];
965
+ tags: never[];
966
+ jobIds: never[];
967
+ skills: never[];
968
+ companies: never[];
969
+ companyNames: never[];
970
+ countryCodes: never[];
971
+ stateCodes: never[];
972
+ states: never[];
973
+ cities: never[];
974
+ isFeatured: undefined;
975
+ isPromoted: undefined;
976
+ featuredMarkets: never[];
977
+ salary: undefined;
978
+ postedWithinDays: undefined;
979
+ createdAt: undefined;
980
+ }, "">;
981
+
705
982
  /**
706
983
  * Job classification taxonomy: category -> industry -> subCategory.
707
984
  *
@@ -1145,6 +1422,464 @@ declare const LocationSchema: yup.ObjectSchema<{
1145
1422
  };
1146
1423
  }, "">;
1147
1424
 
1425
+ /**
1426
+ * Constants for the geo reference data (countries / states / cities).
1427
+ *
1428
+ * The data is a MIRROR of the dr5hn/countries-states-cities-database, refreshed
1429
+ * wholesale by common-service rather than authored here. That is why these are
1430
+ * sync/administrative vocabularies: the records themselves have no lifecycle of
1431
+ * their own, only the job that replaces them does.
1432
+ */
1433
+ /** Which level of the hierarchy a combined `/geo/search` hit came from. */
1434
+ declare enum GeoKind {
1435
+ Country = "country",
1436
+ State = "state",
1437
+ City = "city"
1438
+ }
1439
+ declare const SupportedGeoKinds: GeoKind[];
1440
+ /**
1441
+ * The state machine of one geo refresh run.
1442
+ *
1443
+ * `Skipped` is a SUCCESS, not a failure: the upstream release tag had not
1444
+ * changed, so there was nothing to fetch. Keeping it distinct from `Succeeded`
1445
+ * is what lets the admin dashboard say "already up to date" instead of showing
1446
+ * a progress bar that completes instantly and implies work happened.
1447
+ */
1448
+ declare enum GeoSyncStatus {
1449
+ Pending = "pending",
1450
+ Running = "running",
1451
+ Succeeded = "succeeded",
1452
+ Failed = "failed",
1453
+ Skipped = "skipped"
1454
+ }
1455
+ declare const SupportedGeoSyncStatuses: GeoSyncStatus[];
1456
+ /** Terminal states. A run in any other state is still in flight. */
1457
+ declare const TerminalGeoSyncStatuses: readonly [GeoSyncStatus.Succeeded, GeoSyncStatus.Failed, GeoSyncStatus.Skipped];
1458
+ /** Which phase a running job is in, for the progress display. */
1459
+ declare enum GeoSyncPhase {
1460
+ Checking = "checking",
1461
+ Countries = "countries",
1462
+ States = "states",
1463
+ Cities = "cities",
1464
+ Indexing = "indexing",
1465
+ Done = "done"
1466
+ }
1467
+ declare const SupportedGeoSyncPhases: GeoSyncPhase[];
1468
+ /** What triggered a run. `Boot` is reserved; today every run is `Manual`. */
1469
+ declare enum GeoSyncTrigger {
1470
+ Manual = "manual",
1471
+ Boot = "boot"
1472
+ }
1473
+ declare const SupportedGeoSyncTriggers: GeoSyncTrigger[];
1474
+ /** Mongo collection names, so service and consumers cannot disagree on them. */
1475
+ declare const GEO_COLLECTIONS: {
1476
+ readonly countries: "geo_countries";
1477
+ readonly states: "geo_states";
1478
+ readonly cities: "geo_cities";
1479
+ readonly syncRuns: "geo_sync_runs";
1480
+ };
1481
+ /**
1482
+ * Max length of a `?search=` term on any `/geo` endpoint.
1483
+ *
1484
+ * Bounded because the term reaches an Atlas `$search` autocomplete clause, and
1485
+ * an unbounded one is a needlessly expensive query for input no human types.
1486
+ */
1487
+ declare const GEO_SEARCH_MAX = 64;
1488
+
1489
+ /**
1490
+ * A country in the geo reference mirror, backing `GET /geo/countries`.
1491
+ *
1492
+ * Sourced from dr5hn/countries-states-cities-database and refreshed wholesale by
1493
+ * common-service. The upstream record is kept WHOLE — `translations`, `timezones`,
1494
+ * `gdp`, `emoji` and all — and callers narrow with `?fields=` instead. Storing a
1495
+ * projection would mean a re-ingest of 150k+ records every time someone wanted a
1496
+ * field we had decided in advance nobody needed.
1497
+ *
1498
+ * Two deliberate departures from the house style for record schemas:
1499
+ *
1500
+ * • NOT `.noUnknown().strict()`. `SkillSchema` is strict because it validates
1501
+ * user INPUT; this types a STORED shape whose upstream fields we keep
1502
+ * wholesale, so strict mode would reject documents the ingest legitimately
1503
+ * writes the moment dr5hn adds a column.
1504
+ * • NOT `.concat(DbDefaultSchema)`. These records have no `shortId` or
1505
+ * `createdBy` — nobody authors them. They carry the upstream `id` (which is
1506
+ * also the upsert key) plus our own `syncedAt`.
1507
+ *
1508
+ * Almost everything is nullable because the dataset genuinely has holes:
1509
+ * `capital`, `gdp` and `postalCodeRegex` are absent on many rows. Only the
1510
+ * identity fields are required.
1511
+ */
1512
+ declare const CountrySchema: yup.ObjectSchema<{
1513
+ id: number;
1514
+ name: string;
1515
+ countryCode: string;
1516
+ iso3: string | null | undefined;
1517
+ numericCode: string | null | undefined;
1518
+ phonecode: string | null | undefined;
1519
+ capital: string | null | undefined;
1520
+ currency: string | null | undefined;
1521
+ currencyName: string | null | undefined;
1522
+ currencySymbol: string | null | undefined;
1523
+ tld: string | null | undefined;
1524
+ native: string | null | undefined;
1525
+ population: number | null | undefined;
1526
+ gdp: number | null | undefined;
1527
+ region: string | null | undefined;
1528
+ regionId: number | null | undefined;
1529
+ subregion: string | null | undefined;
1530
+ subregionId: number | null | undefined;
1531
+ nationality: string | null | undefined;
1532
+ areaSqKm: number | null | undefined;
1533
+ postalCodeFormat: string | null | undefined;
1534
+ postalCodeRegex: string | null | undefined;
1535
+ timezones: {
1536
+ zoneName?: string | null | undefined;
1537
+ gmtOffset?: number | null | undefined;
1538
+ gmtOffsetName?: string | null | undefined;
1539
+ abbreviation?: string | null | undefined;
1540
+ tzName?: string | null | undefined;
1541
+ }[] | null | undefined;
1542
+ translations: {} | null | undefined;
1543
+ latitude: number | null | undefined;
1544
+ longitude: number | null | undefined;
1545
+ emoji: string | null | undefined;
1546
+ emojiU: string | null | undefined;
1547
+ searchDefault: string[];
1548
+ searchByLocale: {} | null | undefined;
1549
+ syncedAt: number | null | undefined;
1550
+ }, yup.AnyObject, {
1551
+ id: undefined;
1552
+ name: undefined;
1553
+ countryCode: undefined;
1554
+ iso3: undefined;
1555
+ numericCode: undefined;
1556
+ phonecode: undefined;
1557
+ capital: undefined;
1558
+ currency: undefined;
1559
+ currencyName: undefined;
1560
+ currencySymbol: undefined;
1561
+ tld: undefined;
1562
+ native: undefined;
1563
+ population: undefined;
1564
+ gdp: undefined;
1565
+ region: undefined;
1566
+ regionId: undefined;
1567
+ subregion: undefined;
1568
+ subregionId: undefined;
1569
+ nationality: undefined;
1570
+ areaSqKm: undefined;
1571
+ postalCodeFormat: undefined;
1572
+ postalCodeRegex: undefined;
1573
+ timezones: "";
1574
+ translations: {};
1575
+ latitude: undefined;
1576
+ longitude: undefined;
1577
+ emoji: undefined;
1578
+ emojiU: undefined;
1579
+ searchDefault: never[];
1580
+ searchByLocale: {};
1581
+ syncedAt: undefined;
1582
+ }, "">;
1583
+ type Country = InferType<typeof CountrySchema>;
1584
+ /** A single entry of `CountrySchema.timezones`. */
1585
+ type CountryTimezone = NonNullable<Country["timezones"]>[number];
1586
+ /**
1587
+ * The localized-name map, keyed by locale.
1588
+ *
1589
+ * Declared as a type rather than a yup shape for the reason given on
1590
+ * `translations` above: the key set belongs to upstream. Shared by all three
1591
+ * geo record types.
1592
+ */
1593
+ type GeoTranslations = Record<string, string>;
1594
+
1595
+ /**
1596
+ * A state / province / subdivision in the geo reference mirror, backing
1597
+ * `GET /geo/countries/:countryCode/states` and `GET /geo/states`.
1598
+ *
1599
+ * Sourced from dr5hn and refreshed wholesale; the upstream record is kept whole.
1600
+ * See `CountrySchema` for why this is neither `.strict()` nor concatenated with
1601
+ * `DbDefaultSchema`.
1602
+ *
1603
+ * The parent country's `countryCode` and `countryName` are stored DENORMALIZED,
1604
+ * as upstream ships them. That is deliberate: a flat search hit ("Karnataka")
1605
+ * has to be enough for a UI to back-fill the country dropdown to India without a
1606
+ * second round trip, which is the whole point of searching states without first
1607
+ * picking a country.
1608
+ */
1609
+ declare const StateSchema: yup.ObjectSchema<{
1610
+ id: number;
1611
+ name: string;
1612
+ countryId: number | null | undefined;
1613
+ countryCode: string;
1614
+ countryName: string | null | undefined;
1615
+ stateCode: string | null | undefined;
1616
+ stateCodeIso: string | null | undefined;
1617
+ fipsCode: string | null | undefined;
1618
+ type: string | null | undefined;
1619
+ level: number | null | undefined;
1620
+ parentId: number | null | undefined;
1621
+ native: string | null | undefined;
1622
+ latitude: number | null | undefined;
1623
+ longitude: number | null | undefined;
1624
+ timezone: string | null | undefined;
1625
+ translations: {} | null | undefined;
1626
+ searchDefault: string[];
1627
+ searchByLocale: {} | null | undefined;
1628
+ syncedAt: number | null | undefined;
1629
+ }, yup.AnyObject, {
1630
+ id: undefined;
1631
+ name: undefined;
1632
+ countryId: undefined;
1633
+ countryCode: undefined;
1634
+ countryName: undefined;
1635
+ stateCode: undefined;
1636
+ stateCodeIso: undefined;
1637
+ fipsCode: undefined;
1638
+ type: undefined;
1639
+ level: undefined;
1640
+ parentId: undefined;
1641
+ native: undefined;
1642
+ latitude: undefined;
1643
+ longitude: undefined;
1644
+ timezone: undefined;
1645
+ translations: {};
1646
+ searchDefault: never[];
1647
+ searchByLocale: {};
1648
+ syncedAt: undefined;
1649
+ }, "">;
1650
+ type State = InferType<typeof StateSchema>;
1651
+
1652
+ /**
1653
+ * A city in the geo reference mirror, backing
1654
+ * `GET /geo/countries/:countryCode/states/:stateCode/cities` and `GET /geo/cities`.
1655
+ *
1656
+ * The big one: ~153,000 rows, ingested by STREAMING the 182 MB upstream JSON
1657
+ * rather than parsing it. See `CountrySchema` for why this is neither `.strict()`
1658
+ * nor concatenated with `DbDefaultSchema`.
1659
+ *
1660
+ * Both parent levels are stored denormalized (`stateCode`/`stateName` and
1661
+ * `countryCode`/`countryName`), as upstream ships them, so a flat search hit
1662
+ * carries everything a UI needs to back-fill the whole cascade.
1663
+ */
1664
+ declare const CitySchema: yup.ObjectSchema<{
1665
+ id: number;
1666
+ name: string;
1667
+ stateId: number | null | undefined;
1668
+ stateCode: string | null | undefined;
1669
+ stateCodeIso: string | null | undefined;
1670
+ stateName: string | null | undefined;
1671
+ countryId: number | null | undefined;
1672
+ countryCode: string;
1673
+ countryName: string | null | undefined;
1674
+ latitude: number | null | undefined;
1675
+ longitude: number | null | undefined;
1676
+ native: string | null | undefined;
1677
+ type: string | null | undefined;
1678
+ level: number | null | undefined;
1679
+ parentId: number | null | undefined;
1680
+ population: number | null | undefined;
1681
+ timezone: string | null | undefined;
1682
+ translations: {} | null | undefined;
1683
+ searchDefault: string[];
1684
+ searchByLocale: {} | null | undefined;
1685
+ syncedAt: number | null | undefined;
1686
+ }, yup.AnyObject, {
1687
+ id: undefined;
1688
+ name: undefined;
1689
+ stateId: undefined;
1690
+ stateCode: undefined;
1691
+ stateCodeIso: undefined;
1692
+ stateName: undefined;
1693
+ countryId: undefined;
1694
+ countryCode: undefined;
1695
+ countryName: undefined;
1696
+ latitude: undefined;
1697
+ longitude: undefined;
1698
+ native: undefined;
1699
+ type: undefined;
1700
+ level: undefined;
1701
+ parentId: undefined;
1702
+ population: undefined;
1703
+ timezone: undefined;
1704
+ translations: {};
1705
+ searchDefault: never[];
1706
+ searchByLocale: {};
1707
+ syncedAt: undefined;
1708
+ }, "">;
1709
+ type City = InferType<typeof CitySchema>;
1710
+
1711
+ /**
1712
+ * Wrapped so an unknown key is REJECTED rather than silently ignored. See
1713
+ * `SkillFilterSchema` for why this is a `.test()` and not `.noUnknown()`.
1714
+ */
1715
+ declare const CountryFilterSchema: yup.ObjectSchema<{
1716
+ countryCodes: string[];
1717
+ iso3s: string[];
1718
+ regions: string[];
1719
+ subregions: string[];
1720
+ names: string[];
1721
+ }, yup.AnyObject, {
1722
+ countryCodes: never[];
1723
+ iso3s: never[];
1724
+ regions: never[];
1725
+ subregions: never[];
1726
+ names: never[];
1727
+ }, "">;
1728
+
1729
+ /**
1730
+ * Wrapped so an unknown key is REJECTED rather than silently ignored. See
1731
+ * `SkillFilterSchema` for why this is a `.test()` and not `.noUnknown()`.
1732
+ */
1733
+ declare const StateFilterSchema: yup.ObjectSchema<{
1734
+ countryCodes: string[];
1735
+ stateCodes: string[];
1736
+ names: string[];
1737
+ types: string[];
1738
+ }, yup.AnyObject, {
1739
+ countryCodes: never[];
1740
+ stateCodes: never[];
1741
+ names: never[];
1742
+ types: never[];
1743
+ }, "">;
1744
+
1745
+ /**
1746
+ * Wrapped so an unknown key is REJECTED rather than silently ignored. See
1747
+ * `SkillFilterSchema` for why this is a `.test()` and not `.noUnknown()`.
1748
+ */
1749
+ declare const CityFilterSchema: yup.ObjectSchema<{
1750
+ countryCodes: string[];
1751
+ stateCodes: string[];
1752
+ names: string[];
1753
+ }, yup.AnyObject, {
1754
+ countryCodes: never[];
1755
+ stateCodes: never[];
1756
+ names: never[];
1757
+ }, "">;
1758
+
1759
+ /**
1760
+ * Per-collection tally of one ingest pass.
1761
+ *
1762
+ * `upserted` vs `modified` is the assertion worth reading: a re-run over
1763
+ * unchanged upstream data must be ALL `modified` and ZERO `upserted`. Any
1764
+ * `upserted` on a second run means the `id`-keyed upsert is not matching, and
1765
+ * the collection is quietly accumulating duplicates.
1766
+ */
1767
+ declare const GeoSyncCountsSchema: yup.ObjectSchema<{
1768
+ read: number;
1769
+ upserted: number;
1770
+ modified: number;
1771
+ matched: number;
1772
+ pruned: number;
1773
+ prunedSkipped: boolean;
1774
+ }, yup.AnyObject, {
1775
+ read: 0;
1776
+ upserted: 0;
1777
+ modified: 0;
1778
+ matched: 0;
1779
+ pruned: 0;
1780
+ prunedSkipped: false;
1781
+ }, "">;
1782
+ /**
1783
+ * One run of the geo refresh job, as stored in `geo_sync_runs` and returned by
1784
+ * `GET /geo/refresh/status`.
1785
+ *
1786
+ * The run document is the ONLY shared state between the job and the status
1787
+ * endpoint: the job writes phase and progress onto it, the dashboard polls it.
1788
+ * Nothing reaches into the job's memory, which is what lets the job be a plain
1789
+ * in-process async function rather than a queue.
1790
+ */
1791
+ declare const GeoSyncRunSchema: yup.ObjectSchema<{
1792
+ jobId: string;
1793
+ status: NonNullable<GeoSyncStatus | undefined>;
1794
+ trigger: GeoSyncTrigger | undefined;
1795
+ force: boolean;
1796
+ releaseTag: string | null | undefined;
1797
+ previousReleaseTag: string | null | undefined;
1798
+ startedAt: number;
1799
+ finishedAt: number | null | undefined;
1800
+ durationMs: number | null | undefined;
1801
+ phase: GeoSyncPhase | null | undefined;
1802
+ progress: {
1803
+ collection?: string | null | undefined;
1804
+ total?: number | null | undefined;
1805
+ processed: number;
1806
+ } | null | undefined;
1807
+ counts: {
1808
+ countries?: {
1809
+ read: number;
1810
+ upserted: number;
1811
+ modified: number;
1812
+ matched: number;
1813
+ pruned: number;
1814
+ prunedSkipped: boolean;
1815
+ } | null | undefined;
1816
+ states?: {
1817
+ read: number;
1818
+ upserted: number;
1819
+ modified: number;
1820
+ matched: number;
1821
+ pruned: number;
1822
+ prunedSkipped: boolean;
1823
+ } | null | undefined;
1824
+ cities?: {
1825
+ read: number;
1826
+ upserted: number;
1827
+ modified: number;
1828
+ matched: number;
1829
+ pruned: number;
1830
+ prunedSkipped: boolean;
1831
+ } | null | undefined;
1832
+ } | null | undefined;
1833
+ reason: string | null | undefined;
1834
+ error: string | null | undefined;
1835
+ }, yup.AnyObject, {
1836
+ jobId: undefined;
1837
+ status: undefined;
1838
+ trigger: undefined;
1839
+ force: false;
1840
+ releaseTag: undefined;
1841
+ previousReleaseTag: undefined;
1842
+ startedAt: undefined;
1843
+ finishedAt: undefined;
1844
+ durationMs: undefined;
1845
+ phase: undefined;
1846
+ progress: {
1847
+ collection: undefined;
1848
+ processed: 0;
1849
+ total: undefined;
1850
+ };
1851
+ counts: {
1852
+ countries: {
1853
+ read: 0;
1854
+ upserted: 0;
1855
+ modified: 0;
1856
+ matched: 0;
1857
+ pruned: 0;
1858
+ prunedSkipped: false;
1859
+ };
1860
+ states: {
1861
+ read: 0;
1862
+ upserted: 0;
1863
+ modified: 0;
1864
+ matched: 0;
1865
+ pruned: 0;
1866
+ prunedSkipped: false;
1867
+ };
1868
+ cities: {
1869
+ read: 0;
1870
+ upserted: 0;
1871
+ modified: 0;
1872
+ matched: 0;
1873
+ pruned: 0;
1874
+ prunedSkipped: false;
1875
+ };
1876
+ };
1877
+ reason: undefined;
1878
+ error: undefined;
1879
+ }, "">;
1880
+ type GeoSyncRun = InferType<typeof GeoSyncRunSchema>;
1881
+ type GeoSyncCounts = InferType<typeof GeoSyncCountsSchema>;
1882
+
1148
1883
  declare enum PageType {
1149
1884
  Institute = "institute",
1150
1885
  Company = "company"
@@ -1257,25 +1992,107 @@ declare const PageSchema: yup.ObjectSchema<NonNullable<{
1257
1992
  updatedAt: undefined;
1258
1993
  }, "">;
1259
1994
 
1995
+ /**
1996
+ * Wrapped so an unknown key is REJECTED rather than silently ignored. See
1997
+ * `SkillFilterSchema` for why this is a `.test()` and not `.noUnknown()`.
1998
+ */
1999
+ declare const LanguageFilterSchema: yup.ObjectSchema<{
2000
+ names: string[];
2001
+ }, yup.AnyObject, {
2002
+ names: never[];
2003
+ }, "">;
2004
+
2005
+ /** THE page filter. See `GroupFilterSchema` for why unknown keys must fail loudly. */
2006
+ declare const PageFilterSchema: yup.ObjectSchema<{
2007
+ type: string[];
2008
+ status: string[];
2009
+ isFeatured: boolean | undefined;
2010
+ featuredMarkets: string[];
2011
+ slugs: string[];
2012
+ }, yup.AnyObject, {
2013
+ type: never[];
2014
+ status: never[];
2015
+ isFeatured: undefined;
2016
+ featuredMarkets: never[];
2017
+ slugs: never[];
2018
+ }, "">;
2019
+
2020
+ /**
2021
+ * Where a campaign is in its life, as an OPERATOR would describe it.
2022
+ *
2023
+ * The states answer "what is this campaign doing?", not "what is the engine
2024
+ * doing this second". That distinction is the whole design: a repeating
2025
+ * campaign spends almost all its time between occurrences, and a status that
2026
+ * tracked the send itself left it reading `sent` while it had years of mail
2027
+ * still to go, indistinguishable from a one-shot that was finished forever.
2028
+ *
2029
+ * Per-occurrence detail (which run sent, how many, what failed) lives on the
2030
+ * occurrence rows. This field is about the CAMPAIGN.
2031
+ *
2032
+ * draft ──activate──> running ──pause──> paused ──resume──> running
2033
+ * │ │
2034
+ * ├──────stop────────┤
2035
+ * │ │
2036
+ * v v
2037
+ * stopped stopped (terminal)
2038
+ * │
2039
+ * end condition met
2040
+ * v
2041
+ * completed (terminal)
2042
+ *
2043
+ * `failed` is reachable from `running` when a send throws, and is terminal.
2044
+ */
1260
2045
  declare enum CampaignStatus {
2046
+ /** Being written. Has never sent and is not considered by the scheduler. */
1261
2047
  Draft = "draft",
1262
- Sending = "sending",
1263
- Sent = "sent",
2048
+ /**
2049
+ * Live: the scheduler will fire it whenever its schedule says so.
2050
+ *
2051
+ * A campaign is `running` from activation until something ends it, INCLUDING
2052
+ * the gaps between occurrences. An "every day, forever" campaign is therefore
2053
+ * `running` permanently, which is the honest answer — it is never finished.
2054
+ */
2055
+ Running = "running",
2056
+ /**
2057
+ * Halted by a person, and resumable.
2058
+ *
2059
+ * Moments that pass while paused are MISSED, and missed moments are skipped
2060
+ * rather than replayed, so resuming does not produce a burst of backdated
2061
+ * mail. An `afterOccurrences` campaign keeps its remaining budget, because
2062
+ * that budget counts sends that happened.
2063
+ */
2064
+ Paused = "paused",
2065
+ /** Halted by a person, permanently. Cannot be resumed; clone it instead. */
2066
+ Stopped = "stopped",
2067
+ /** Its end condition is satisfied: afterOccurrences spent, or onDate passed. */
2068
+ Completed = "completed",
2069
+ /** A send threw and the run could not be completed. */
1264
2070
  Failed = "failed"
1265
2071
  }
1266
2072
  declare const SupportedCampaignStatuses: CampaignStatus[];
2073
+ /** No transition leaves these. */
2074
+ declare const TerminalCampaignStatuses: readonly [CampaignStatus.Stopped, CampaignStatus.Completed, CampaignStatus.Failed];
2075
+ /**
2076
+ * The only status changes allowed, keyed by where the campaign is now.
2077
+ *
2078
+ * Declared as data rather than written as `if` chains in each route, so an
2079
+ * illegal move (resuming a stopped campaign, pausing a draft) is refused in one
2080
+ * place and the diagram above cannot quietly drift from the code.
2081
+ */
2082
+ declare const CampaignStatusTransitions: Record<CampaignStatus, readonly CampaignStatus[]>;
2083
+ /** Whether a campaign may move from `from` to `to`. */
2084
+ declare function canTransitionCampaign(from: CampaignStatus, to: CampaignStatus): boolean;
1267
2085
  /**
1268
2086
  * How a campaign decides when to send.
1269
2087
  *
1270
- * The two scheduled kinds dedupe differently, and that difference is the reason
1271
- * they are separate kinds rather than one kind with a flag:
2088
+ * Every kind here fires on a wall clock, so an occurrence is a shared moment:
2089
+ * its identity is the occurrence itself, and a recipient may legitimately be
2090
+ * mailed again on the next one.
1272
2091
  *
1273
- * • `Schedule` fires on a wall clock. Every occurrence is a shared moment, so
1274
- * its identity is the occurrence itself and a recipient may legitimately be
1275
- * mailed again next occurrence.
1276
- * • `Lifecycle` fires relative to each user's own anchor date (signup, …), so
1277
- * there is no shared moment. Identity is the user, permanently: a lifecycle
1278
- * campaign mails a given person at most once, ever.
2092
+ * A `Lifecycle` kind (per-user, N days after that user's own anchor date) was
2093
+ * removed; it was never used by any campaign. It did not belong beside these:
2094
+ * having no shared moment, it deduped on the USER permanently rather than on
2095
+ * the occurrence, which is a different engine wearing the same word.
1279
2096
  */
1280
2097
  declare enum CampaignTriggerKind {
1281
2098
  /** Admin presses send. Also the dry-run test path. */
@@ -1283,9 +2100,7 @@ declare enum CampaignTriggerKind {
1283
2100
  /** One send, at one future instant. */
1284
2101
  Once = "once",
1285
2102
  /** Repeats on a wall-clock schedule until its end condition. */
1286
- Schedule = "schedule",
1287
- /** Fires per user, N days after that user's anchor date. Once per user ever. */
1288
- Lifecycle = "lifecycle"
2103
+ Schedule = "schedule"
1289
2104
  }
1290
2105
  declare const SupportedCampaignTriggerKinds: CampaignTriggerKind[];
1291
2106
  /** Repeat unit for a `schedule` trigger. */
@@ -1302,18 +2117,6 @@ declare enum CampaignEndKind {
1302
2117
  OnDate = "onDate"
1303
2118
  }
1304
2119
  declare const SupportedCampaignEndKinds: CampaignEndKind[];
1305
- /**
1306
- * The user-document date a `lifecycle` trigger counts its offset from. A closed
1307
- * list because each value must be a real, indexed, immutable-enough date on the
1308
- * user: an anchor that moves would re-fire the campaign for someone already
1309
- * mailed, which the permanent idempotency key would then silently suppress.
1310
- */
1311
- declare enum CampaignAnchorField {
1312
- CreatedAt = "createdAt",
1313
- OnboardingCompletedAt = "onboardingCompletedAt",
1314
- MarketingConsentUpdatedAt = "marketingConsent.updatedAt"
1315
- }
1316
- declare const SupportedCampaignAnchorFields: CampaignAnchorField[];
1317
2120
  /**
1318
2121
  * Where a single template variable's value comes from. The admin picks one per
1319
2122
  * variable the chosen template declares.
@@ -1322,7 +2125,18 @@ declare const SupportedCampaignAnchorFields: CampaignAnchorField[];
1322
2125
  * personalised iff any binding is `Recipient` or `Source`. A stored flag could
1323
2126
  * disagree with the bindings it describes.
1324
2127
  */
1325
- declare enum BindingKind {
2128
+ /**
2129
+ * Where ONE template variable's value comes from.
2130
+ *
2131
+ * A campaign names a template, the template declares its variables, and each
2132
+ * variable needs a source: a fixed string, something about the recipient, a
2133
+ * link, or a field of whatever the campaign's data source returned. That
2134
+ * mapping is a "binding".
2135
+ *
2136
+ * The string VALUES are stored in campaign documents — renaming one is a data
2137
+ * migration, not a refactor.
2138
+ */
2139
+ declare enum TemplateVariableBindingKind {
1326
2140
  /** A literal typed by the admin. Same for everyone. */
1327
2141
  Static = "static",
1328
2142
  /** A field of the resolved recipient, e.g. `name`. */
@@ -1332,7 +2146,7 @@ declare enum BindingKind {
1332
2146
  /** A field of the campaign's data source output, e.g. `matchedJobs`. */
1333
2147
  Source = "source"
1334
2148
  }
1335
- declare const SupportedBindingKinds: BindingKind[];
2149
+ declare const SupportedTemplateVariableBindingKinds: TemplateVariableBindingKind[];
1336
2150
  /** Lifecycle of one materialised occurrence of a scheduled campaign. */
1337
2151
  declare enum OccurrenceStatus {
1338
2152
  Pending = "pending",
@@ -1343,19 +2157,32 @@ declare enum OccurrenceStatus {
1343
2157
  }
1344
2158
  declare const SupportedOccurrenceStatuses: OccurrenceStatus[];
1345
2159
  /**
1346
- * Hard ceiling on recipients per scheduled/lifecycle send, enforced in code and
1347
- * not overridable by config. Distinct from the one-shot audience cap: a campaign
2160
+ * Hard ceiling on recipients per scheduled send, enforced in code and not
2161
+ * overridable by config. Distinct from the one-shot audience cap: a campaign
1348
2162
  * that repeats forever gets the tighter bound, because a misconfigured filter
1349
2163
  * that mails too many people does it again every occurrence.
1350
2164
  */
1351
2165
  declare const CAMPAIGN_MAX_RECIPIENTS_CEILING = 5000;
1352
2166
 
1353
2167
  /**
1354
- * Every clause except `or`. Declared separately so `ListFilterSchema` can embed
1355
- * it as its branch type without referring to itself: the union is deliberately
1356
- * one level deep, and a non-recursive definition is what enforces that.
2168
+ * A mailing list's saved audience query.
2169
+ *
2170
+ * The SAME filter user-service validates, re-exported under the name it carries
2171
+ * where it is stored. Not a separate vocabulary: a list resolves against
2172
+ * user-service, so anything it can save must be something that service accepts.
2173
+ * Defined in `user/user-filter.schema.ts` because it describes users.
2174
+ *
2175
+ * @todo SVELTE-UI-SCHEMA-RENAME — this was `ListFilterSchema`, and
2176
+ * `thejob-svelte-ui` still imports THAT name in
2177
+ * `src/lib/services/admin.service.ts` (3 lines: the import, a doc reference and
2178
+ * the `InferType` argument). It will not typecheck against this build until
2179
+ * those are updated. Deliberately left unmigrated rather than fixed in passing:
2180
+ * renaming an export here is a change to every consumer, and each one is its
2181
+ * own decision. No back-compat alias, so the break is loud rather than silent.
1357
2182
  */
1358
- declare const ListFilterBranchSchema: yup.ObjectSchema<{
2183
+ declare const MailingListFilterSchema: yup.ObjectSchema<{
2184
+ emails: string[];
2185
+ authAccountIds: string[];
1359
2186
  countries: string[];
1360
2187
  roles: string[];
1361
2188
  experienceLevels: string[];
@@ -1364,21 +2191,37 @@ declare const ListFilterBranchSchema: yup.ObjectSchema<{
1364
2191
  referralSources: string[];
1365
2192
  statuses: string[];
1366
2193
  profileVisibilities: string[];
1367
- skillProficiencyLevels: string[];
1368
- languageProficiencyLevels: string[];
1369
2194
  studyTypes: string[];
1370
2195
  socialAccountTypes: string[];
1371
2196
  salaryCurrencies: string[];
1372
- skills: string[];
1373
- languages: string[];
2197
+ skills: {
2198
+ [x: string]: string | undefined;
2199
+ [x: number]: string | undefined;
2200
+ }[];
2201
+ languages: {
2202
+ [x: string]: string | undefined;
2203
+ [x: number]: string | undefined;
2204
+ }[];
1374
2205
  interests: string[];
1375
2206
  companies: string[];
1376
2207
  designations: string[];
1377
2208
  institutes: string[];
1378
2209
  courses: string[];
1379
2210
  fieldsOfStudy: string[];
1380
- certifications: string[];
1381
- certificationAuthorities: string[];
2211
+ workHistory: {
2212
+ [x: string]: any;
2213
+ [x: number]: any;
2214
+ [x: symbol]: any;
2215
+ }[];
2216
+ educationHistory: {
2217
+ [x: string]: any;
2218
+ [x: number]: any;
2219
+ [x: symbol]: any;
2220
+ }[];
2221
+ certifications: {
2222
+ [x: string]: string | undefined;
2223
+ [x: number]: string | undefined;
2224
+ }[];
1382
2225
  projects: string[];
1383
2226
  jobRoles: string[];
1384
2227
  jobLocations: string[];
@@ -1415,13 +2258,17 @@ declare const ListFilterBranchSchema: yup.ObjectSchema<{
1415
2258
  signupLocales: string[];
1416
2259
  signupSources: string[];
1417
2260
  educationLevels: string[];
2261
+ marketingSubscribed: boolean | undefined;
1418
2262
  jobAlertFrequencies: string[];
1419
2263
  consentSources: string[];
1420
2264
  consentUpdatedWithinDays: number | undefined;
2265
+ consentUpdatedAfter: number | undefined;
1421
2266
  notificationChannelsEnabled: string[];
1422
2267
  currentlyEmployed: boolean;
1423
2268
  graduatedWithinMonths: number | undefined;
1424
2269
  skillUsedWithinMonths: number | undefined;
2270
+ graduatedAfter: string | undefined;
2271
+ skillUsedAfter: string | undefined;
1425
2272
  hasImage: boolean;
1426
2273
  hasHeadline: boolean;
1427
2274
  hasAboutMe: boolean;
@@ -1432,316 +2279,7 @@ declare const ListFilterBranchSchema: yup.ObjectSchema<{
1432
2279
  hasJobAlert: boolean | undefined;
1433
2280
  hasApplied: boolean | undefined;
1434
2281
  appliedWithinDays: number | undefined;
1435
- search: string | undefined;
1436
- }, yup.AnyObject, {
1437
- countries: never[];
1438
- roles: never[];
1439
- experienceLevels: never[];
1440
- targetExperienceLevels: never[];
1441
- jobSearchUrgencies: never[];
1442
- referralSources: never[];
1443
- statuses: never[];
1444
- profileVisibilities: never[];
1445
- skillProficiencyLevels: never[];
1446
- languageProficiencyLevels: never[];
1447
- studyTypes: never[];
1448
- socialAccountTypes: never[];
1449
- salaryCurrencies: never[];
1450
- skills: never[];
1451
- languages: never[];
1452
- interests: never[];
1453
- companies: never[];
1454
- designations: never[];
1455
- institutes: never[];
1456
- courses: never[];
1457
- fieldsOfStudy: never[];
1458
- certifications: never[];
1459
- certificationAuthorities: never[];
1460
- projects: never[];
1461
- jobRoles: never[];
1462
- jobLocations: never[];
1463
- hiringForCompanies: never[];
1464
- coordinatesAtInstitutes: never[];
1465
- keywords: never[];
1466
- minSalaryFloor: undefined;
1467
- minSalaryCeil: undefined;
1468
- openToWorkOnly: false;
1469
- remoteExperienceOnly: false;
1470
- hasResumeOnly: false;
1471
- onboardingCompletedOnly: false;
1472
- emailVerifiedOnly: false;
1473
- mobileVerifiedOnly: false;
1474
- lastSeenBeforeDays: undefined;
1475
- lastSeenAfterDays: undefined;
1476
- createdAtWithinDays: undefined;
1477
- createdAtOlderThanDays: undefined;
1478
- completenessMin: undefined;
1479
- completenessMax: undefined;
1480
- lastSeenBefore: undefined;
1481
- lastSeenAfter: undefined;
1482
- createdAtFrom: undefined;
1483
- createdAtBefore: undefined;
1484
- states: never[];
1485
- stateCodes: never[];
1486
- cities: never[];
1487
- withinRadius: undefined;
1488
- signupCountries: never[];
1489
- signupLocales: never[];
1490
- signupSources: never[];
1491
- educationLevels: never[];
1492
- jobAlertFrequencies: never[];
1493
- consentSources: never[];
1494
- consentUpdatedWithinDays: undefined;
1495
- notificationChannelsEnabled: never[];
1496
- currentlyEmployed: false;
1497
- graduatedWithinMonths: undefined;
1498
- skillUsedWithinMonths: undefined;
1499
- hasImage: false;
1500
- hasHeadline: false;
1501
- hasAboutMe: false;
1502
- hasMobile: false;
1503
- missingSections: never[];
1504
- companyTypes: never[];
1505
- instituteTypes: never[];
1506
- hasJobAlert: undefined;
1507
- hasApplied: undefined;
1508
- appliedWithinDays: undefined;
1509
- search: undefined;
1510
- }, "">;
1511
- /** A branch of `or`: every clause except `or` itself, so unions cannot nest. */
1512
- declare const ListFilterBranch: yup.ObjectSchema<{
1513
- countries: string[];
1514
- roles: string[];
1515
- experienceLevels: string[];
1516
- targetExperienceLevels: string[];
1517
- jobSearchUrgencies: string[];
1518
- referralSources: string[];
1519
- statuses: string[];
1520
- profileVisibilities: string[];
1521
- skillProficiencyLevels: string[];
1522
- languageProficiencyLevels: string[];
1523
- studyTypes: string[];
1524
- socialAccountTypes: string[];
1525
- salaryCurrencies: string[];
1526
- skills: string[];
1527
- languages: string[];
1528
- interests: string[];
1529
- companies: string[];
1530
- designations: string[];
1531
- institutes: string[];
1532
- courses: string[];
1533
- fieldsOfStudy: string[];
1534
- certifications: string[];
1535
- certificationAuthorities: string[];
1536
- projects: string[];
1537
- jobRoles: string[];
1538
- jobLocations: string[];
1539
- hiringForCompanies: string[];
1540
- coordinatesAtInstitutes: string[];
1541
- keywords: string[];
1542
- minSalaryFloor: number | undefined;
1543
- minSalaryCeil: number | undefined;
1544
- openToWorkOnly: boolean;
1545
- remoteExperienceOnly: boolean;
1546
- hasResumeOnly: boolean;
1547
- onboardingCompletedOnly: boolean;
1548
- emailVerifiedOnly: boolean;
1549
- mobileVerifiedOnly: boolean;
1550
- lastSeenBeforeDays: number | undefined;
1551
- lastSeenAfterDays: number | undefined;
1552
- createdAtWithinDays: number | undefined;
1553
- createdAtOlderThanDays: number | undefined;
1554
- completenessMin: number | undefined;
1555
- completenessMax: number | undefined;
1556
- lastSeenBefore: number | undefined;
1557
- lastSeenAfter: number | undefined;
1558
- createdAtFrom: number | undefined;
1559
- createdAtBefore: number | undefined;
1560
- states: string[];
1561
- stateCodes: string[];
1562
- cities: string[];
1563
- withinRadius: {
1564
- lat: number;
1565
- lng: number;
1566
- km: number;
1567
- } | undefined;
1568
- signupCountries: string[];
1569
- signupLocales: string[];
1570
- signupSources: string[];
1571
- educationLevels: string[];
1572
- jobAlertFrequencies: string[];
1573
- consentSources: string[];
1574
- consentUpdatedWithinDays: number | undefined;
1575
- notificationChannelsEnabled: string[];
1576
- currentlyEmployed: boolean;
1577
- graduatedWithinMonths: number | undefined;
1578
- skillUsedWithinMonths: number | undefined;
1579
- hasImage: boolean;
1580
- hasHeadline: boolean;
1581
- hasAboutMe: boolean;
1582
- hasMobile: boolean;
1583
- missingSections: string[];
1584
- companyTypes: string[];
1585
- instituteTypes: string[];
1586
- hasJobAlert: boolean | undefined;
1587
- hasApplied: boolean | undefined;
1588
- appliedWithinDays: number | undefined;
1589
- search: string | undefined;
1590
- }, yup.AnyObject, {
1591
- countries: never[];
1592
- roles: never[];
1593
- experienceLevels: never[];
1594
- targetExperienceLevels: never[];
1595
- jobSearchUrgencies: never[];
1596
- referralSources: never[];
1597
- statuses: never[];
1598
- profileVisibilities: never[];
1599
- skillProficiencyLevels: never[];
1600
- languageProficiencyLevels: never[];
1601
- studyTypes: never[];
1602
- socialAccountTypes: never[];
1603
- salaryCurrencies: never[];
1604
- skills: never[];
1605
- languages: never[];
1606
- interests: never[];
1607
- companies: never[];
1608
- designations: never[];
1609
- institutes: never[];
1610
- courses: never[];
1611
- fieldsOfStudy: never[];
1612
- certifications: never[];
1613
- certificationAuthorities: never[];
1614
- projects: never[];
1615
- jobRoles: never[];
1616
- jobLocations: never[];
1617
- hiringForCompanies: never[];
1618
- coordinatesAtInstitutes: never[];
1619
- keywords: never[];
1620
- minSalaryFloor: undefined;
1621
- minSalaryCeil: undefined;
1622
- openToWorkOnly: false;
1623
- remoteExperienceOnly: false;
1624
- hasResumeOnly: false;
1625
- onboardingCompletedOnly: false;
1626
- emailVerifiedOnly: false;
1627
- mobileVerifiedOnly: false;
1628
- lastSeenBeforeDays: undefined;
1629
- lastSeenAfterDays: undefined;
1630
- createdAtWithinDays: undefined;
1631
- createdAtOlderThanDays: undefined;
1632
- completenessMin: undefined;
1633
- completenessMax: undefined;
1634
- lastSeenBefore: undefined;
1635
- lastSeenAfter: undefined;
1636
- createdAtFrom: undefined;
1637
- createdAtBefore: undefined;
1638
- states: never[];
1639
- stateCodes: never[];
1640
- cities: never[];
1641
- withinRadius: undefined;
1642
- signupCountries: never[];
1643
- signupLocales: never[];
1644
- signupSources: never[];
1645
- educationLevels: never[];
1646
- jobAlertFrequencies: never[];
1647
- consentSources: never[];
1648
- consentUpdatedWithinDays: undefined;
1649
- notificationChannelsEnabled: never[];
1650
- currentlyEmployed: false;
1651
- graduatedWithinMonths: undefined;
1652
- skillUsedWithinMonths: undefined;
1653
- hasImage: false;
1654
- hasHeadline: false;
1655
- hasAboutMe: false;
1656
- hasMobile: false;
1657
- missingSections: never[];
1658
- companyTypes: never[];
1659
- instituteTypes: never[];
1660
- hasJobAlert: undefined;
1661
- hasApplied: undefined;
1662
- appliedWithinDays: undefined;
1663
- search: undefined;
1664
- }, "">;
1665
- declare const ListFilterSchema: yup.ObjectSchema<{
1666
- countries: string[];
1667
- roles: string[];
1668
- experienceLevels: string[];
1669
- targetExperienceLevels: string[];
1670
- jobSearchUrgencies: string[];
1671
- referralSources: string[];
1672
- statuses: string[];
1673
- profileVisibilities: string[];
1674
- skillProficiencyLevels: string[];
1675
- languageProficiencyLevels: string[];
1676
- studyTypes: string[];
1677
- socialAccountTypes: string[];
1678
- salaryCurrencies: string[];
1679
- skills: string[];
1680
- languages: string[];
1681
- interests: string[];
1682
- companies: string[];
1683
- designations: string[];
1684
- institutes: string[];
1685
- courses: string[];
1686
- fieldsOfStudy: string[];
1687
- certifications: string[];
1688
- certificationAuthorities: string[];
1689
- projects: string[];
1690
- jobRoles: string[];
1691
- jobLocations: string[];
1692
- hiringForCompanies: string[];
1693
- coordinatesAtInstitutes: string[];
1694
- keywords: string[];
1695
- minSalaryFloor: number | undefined;
1696
- minSalaryCeil: number | undefined;
1697
- openToWorkOnly: boolean;
1698
- remoteExperienceOnly: boolean;
1699
- hasResumeOnly: boolean;
1700
- onboardingCompletedOnly: boolean;
1701
- emailVerifiedOnly: boolean;
1702
- mobileVerifiedOnly: boolean;
1703
- lastSeenBeforeDays: number | undefined;
1704
- lastSeenAfterDays: number | undefined;
1705
- createdAtWithinDays: number | undefined;
1706
- createdAtOlderThanDays: number | undefined;
1707
- completenessMin: number | undefined;
1708
- completenessMax: number | undefined;
1709
- lastSeenBefore: number | undefined;
1710
- lastSeenAfter: number | undefined;
1711
- createdAtFrom: number | undefined;
1712
- createdAtBefore: number | undefined;
1713
- states: string[];
1714
- stateCodes: string[];
1715
- cities: string[];
1716
- withinRadius: {
1717
- lat: number;
1718
- lng: number;
1719
- km: number;
1720
- } | undefined;
1721
- signupCountries: string[];
1722
- signupLocales: string[];
1723
- signupSources: string[];
1724
- educationLevels: string[];
1725
- jobAlertFrequencies: string[];
1726
- consentSources: string[];
1727
- consentUpdatedWithinDays: number | undefined;
1728
- notificationChannelsEnabled: string[];
1729
- currentlyEmployed: boolean;
1730
- graduatedWithinMonths: number | undefined;
1731
- skillUsedWithinMonths: number | undefined;
1732
- hasImage: boolean;
1733
- hasHeadline: boolean;
1734
- hasAboutMe: boolean;
1735
- hasMobile: boolean;
1736
- missingSections: string[];
1737
- companyTypes: string[];
1738
- instituteTypes: string[];
1739
- hasJobAlert: boolean | undefined;
1740
- hasApplied: boolean | undefined;
1741
- appliedWithinDays: number | undefined;
1742
- search: string | undefined;
1743
2282
  or: {
1744
- search?: string | undefined;
1745
2283
  hasApplied?: boolean | undefined;
1746
2284
  minSalaryFloor?: number | undefined;
1747
2285
  minSalaryCeil?: number | undefined;
@@ -1760,19 +2298,38 @@ declare const ListFilterSchema: yup.ObjectSchema<{
1760
2298
  lng: number;
1761
2299
  km: number;
1762
2300
  } | undefined;
2301
+ marketingSubscribed?: boolean | undefined;
1763
2302
  consentUpdatedWithinDays?: number | undefined;
2303
+ consentUpdatedAfter?: number | undefined;
1764
2304
  graduatedWithinMonths?: number | undefined;
1765
2305
  skillUsedWithinMonths?: number | undefined;
2306
+ graduatedAfter?: string | undefined;
2307
+ skillUsedAfter?: string | undefined;
1766
2308
  hasJobAlert?: boolean | undefined;
1767
2309
  appliedWithinDays?: number | undefined;
1768
2310
  keywords: string[];
1769
2311
  countries: string[];
1770
2312
  courses: string[];
1771
- skills: string[];
1772
- languages: string[];
1773
- certifications: string[];
2313
+ skills: {
2314
+ [x: string]: string | undefined;
2315
+ [x: number]: string | undefined;
2316
+ }[];
2317
+ languages: {
2318
+ [x: string]: string | undefined;
2319
+ [x: number]: string | undefined;
2320
+ }[];
2321
+ certifications: {
2322
+ [x: string]: string | undefined;
2323
+ [x: number]: string | undefined;
2324
+ }[];
1774
2325
  interests: string[];
1775
2326
  projects: string[];
2327
+ companies: string[];
2328
+ stateCodes: string[];
2329
+ states: string[];
2330
+ cities: string[];
2331
+ emails: string[];
2332
+ authAccountIds: string[];
1776
2333
  roles: string[];
1777
2334
  experienceLevels: string[];
1778
2335
  targetExperienceLevels: string[];
@@ -1780,16 +2337,22 @@ declare const ListFilterSchema: yup.ObjectSchema<{
1780
2337
  referralSources: string[];
1781
2338
  statuses: string[];
1782
2339
  profileVisibilities: string[];
1783
- skillProficiencyLevels: string[];
1784
- languageProficiencyLevels: string[];
1785
2340
  studyTypes: string[];
1786
2341
  socialAccountTypes: string[];
1787
2342
  salaryCurrencies: string[];
1788
- companies: string[];
1789
2343
  designations: string[];
1790
2344
  institutes: string[];
1791
2345
  fieldsOfStudy: string[];
1792
- certificationAuthorities: string[];
2346
+ workHistory: {
2347
+ [x: string]: any;
2348
+ [x: number]: any;
2349
+ [x: symbol]: any;
2350
+ }[];
2351
+ educationHistory: {
2352
+ [x: string]: any;
2353
+ [x: number]: any;
2354
+ [x: symbol]: any;
2355
+ }[];
1793
2356
  jobRoles: string[];
1794
2357
  jobLocations: string[];
1795
2358
  hiringForCompanies: string[];
@@ -1800,9 +2363,6 @@ declare const ListFilterSchema: yup.ObjectSchema<{
1800
2363
  onboardingCompletedOnly: boolean;
1801
2364
  emailVerifiedOnly: boolean;
1802
2365
  mobileVerifiedOnly: boolean;
1803
- states: string[];
1804
- stateCodes: string[];
1805
- cities: string[];
1806
2366
  signupCountries: string[];
1807
2367
  signupLocales: string[];
1808
2368
  signupSources: string[];
@@ -1820,6 +2380,8 @@ declare const ListFilterSchema: yup.ObjectSchema<{
1820
2380
  instituteTypes: string[];
1821
2381
  }[];
1822
2382
  }, yup.AnyObject, {
2383
+ emails: never[];
2384
+ authAccountIds: never[];
1823
2385
  countries: never[];
1824
2386
  roles: never[];
1825
2387
  experienceLevels: never[];
@@ -1828,8 +2390,6 @@ declare const ListFilterSchema: yup.ObjectSchema<{
1828
2390
  referralSources: never[];
1829
2391
  statuses: never[];
1830
2392
  profileVisibilities: never[];
1831
- skillProficiencyLevels: never[];
1832
- languageProficiencyLevels: never[];
1833
2393
  studyTypes: never[];
1834
2394
  socialAccountTypes: never[];
1835
2395
  salaryCurrencies: never[];
@@ -1841,8 +2401,9 @@ declare const ListFilterSchema: yup.ObjectSchema<{
1841
2401
  institutes: never[];
1842
2402
  courses: never[];
1843
2403
  fieldsOfStudy: never[];
2404
+ workHistory: never[];
2405
+ educationHistory: never[];
1844
2406
  certifications: never[];
1845
- certificationAuthorities: never[];
1846
2407
  projects: never[];
1847
2408
  jobRoles: never[];
1848
2409
  jobLocations: never[];
@@ -1875,13 +2436,17 @@ declare const ListFilterSchema: yup.ObjectSchema<{
1875
2436
  signupLocales: never[];
1876
2437
  signupSources: never[];
1877
2438
  educationLevels: never[];
2439
+ marketingSubscribed: undefined;
1878
2440
  jobAlertFrequencies: never[];
1879
2441
  consentSources: never[];
1880
2442
  consentUpdatedWithinDays: undefined;
2443
+ consentUpdatedAfter: undefined;
1881
2444
  notificationChannelsEnabled: never[];
1882
2445
  currentlyEmployed: false;
1883
2446
  graduatedWithinMonths: undefined;
1884
2447
  skillUsedWithinMonths: undefined;
2448
+ graduatedAfter: undefined;
2449
+ skillUsedAfter: undefined;
1885
2450
  hasImage: false;
1886
2451
  hasHeadline: false;
1887
2452
  hasAboutMe: false;
@@ -1892,14 +2457,12 @@ declare const ListFilterSchema: yup.ObjectSchema<{
1892
2457
  hasJobAlert: undefined;
1893
2458
  hasApplied: undefined;
1894
2459
  appliedWithinDays: undefined;
1895
- search: undefined;
1896
2460
  or: never[];
1897
2461
  }, "">;
1898
2462
  declare const MailingListSchema: yup.ObjectSchema<{
1899
2463
  name: string;
1900
2464
  description: string | undefined;
1901
2465
  filter: {
1902
- search?: string | undefined;
1903
2466
  hasApplied?: boolean | undefined;
1904
2467
  minSalaryFloor?: number | undefined;
1905
2468
  minSalaryCeil?: number | undefined;
@@ -1918,19 +2481,38 @@ declare const MailingListSchema: yup.ObjectSchema<{
1918
2481
  lng: number;
1919
2482
  km: number;
1920
2483
  } | undefined;
2484
+ marketingSubscribed?: boolean | undefined;
1921
2485
  consentUpdatedWithinDays?: number | undefined;
2486
+ consentUpdatedAfter?: number | undefined;
1922
2487
  graduatedWithinMonths?: number | undefined;
1923
2488
  skillUsedWithinMonths?: number | undefined;
2489
+ graduatedAfter?: string | undefined;
2490
+ skillUsedAfter?: string | undefined;
1924
2491
  hasJobAlert?: boolean | undefined;
1925
2492
  appliedWithinDays?: number | undefined;
1926
2493
  keywords: string[];
1927
2494
  countries: string[];
1928
2495
  courses: string[];
1929
- skills: string[];
1930
- languages: string[];
1931
- certifications: string[];
2496
+ skills: {
2497
+ [x: string]: string | undefined;
2498
+ [x: number]: string | undefined;
2499
+ }[];
2500
+ languages: {
2501
+ [x: string]: string | undefined;
2502
+ [x: number]: string | undefined;
2503
+ }[];
2504
+ certifications: {
2505
+ [x: string]: string | undefined;
2506
+ [x: number]: string | undefined;
2507
+ }[];
1932
2508
  interests: string[];
1933
2509
  projects: string[];
2510
+ companies: string[];
2511
+ stateCodes: string[];
2512
+ states: string[];
2513
+ cities: string[];
2514
+ emails: string[];
2515
+ authAccountIds: string[];
1934
2516
  roles: string[];
1935
2517
  experienceLevels: string[];
1936
2518
  targetExperienceLevels: string[];
@@ -1938,16 +2520,22 @@ declare const MailingListSchema: yup.ObjectSchema<{
1938
2520
  referralSources: string[];
1939
2521
  statuses: string[];
1940
2522
  profileVisibilities: string[];
1941
- skillProficiencyLevels: string[];
1942
- languageProficiencyLevels: string[];
1943
2523
  studyTypes: string[];
1944
2524
  socialAccountTypes: string[];
1945
2525
  salaryCurrencies: string[];
1946
- companies: string[];
1947
2526
  designations: string[];
1948
2527
  institutes: string[];
1949
2528
  fieldsOfStudy: string[];
1950
- certificationAuthorities: string[];
2529
+ workHistory: {
2530
+ [x: string]: any;
2531
+ [x: number]: any;
2532
+ [x: symbol]: any;
2533
+ }[];
2534
+ educationHistory: {
2535
+ [x: string]: any;
2536
+ [x: number]: any;
2537
+ [x: symbol]: any;
2538
+ }[];
1951
2539
  jobRoles: string[];
1952
2540
  jobLocations: string[];
1953
2541
  hiringForCompanies: string[];
@@ -1958,9 +2546,6 @@ declare const MailingListSchema: yup.ObjectSchema<{
1958
2546
  onboardingCompletedOnly: boolean;
1959
2547
  emailVerifiedOnly: boolean;
1960
2548
  mobileVerifiedOnly: boolean;
1961
- states: string[];
1962
- stateCodes: string[];
1963
- cities: string[];
1964
2549
  signupCountries: string[];
1965
2550
  signupLocales: string[];
1966
2551
  signupSources: string[];
@@ -1977,7 +2562,6 @@ declare const MailingListSchema: yup.ObjectSchema<{
1977
2562
  companyTypes: string[];
1978
2563
  instituteTypes: string[];
1979
2564
  or: {
1980
- search?: string | undefined;
1981
2565
  hasApplied?: boolean | undefined;
1982
2566
  minSalaryFloor?: number | undefined;
1983
2567
  minSalaryCeil?: number | undefined;
@@ -1996,19 +2580,38 @@ declare const MailingListSchema: yup.ObjectSchema<{
1996
2580
  lng: number;
1997
2581
  km: number;
1998
2582
  } | undefined;
2583
+ marketingSubscribed?: boolean | undefined;
1999
2584
  consentUpdatedWithinDays?: number | undefined;
2585
+ consentUpdatedAfter?: number | undefined;
2000
2586
  graduatedWithinMonths?: number | undefined;
2001
2587
  skillUsedWithinMonths?: number | undefined;
2588
+ graduatedAfter?: string | undefined;
2589
+ skillUsedAfter?: string | undefined;
2002
2590
  hasJobAlert?: boolean | undefined;
2003
2591
  appliedWithinDays?: number | undefined;
2004
2592
  keywords: string[];
2005
2593
  countries: string[];
2006
2594
  courses: string[];
2007
- skills: string[];
2008
- languages: string[];
2009
- certifications: string[];
2595
+ skills: {
2596
+ [x: string]: string | undefined;
2597
+ [x: number]: string | undefined;
2598
+ }[];
2599
+ languages: {
2600
+ [x: string]: string | undefined;
2601
+ [x: number]: string | undefined;
2602
+ }[];
2603
+ certifications: {
2604
+ [x: string]: string | undefined;
2605
+ [x: number]: string | undefined;
2606
+ }[];
2010
2607
  interests: string[];
2011
2608
  projects: string[];
2609
+ companies: string[];
2610
+ stateCodes: string[];
2611
+ states: string[];
2612
+ cities: string[];
2613
+ emails: string[];
2614
+ authAccountIds: string[];
2012
2615
  roles: string[];
2013
2616
  experienceLevels: string[];
2014
2617
  targetExperienceLevels: string[];
@@ -2016,16 +2619,22 @@ declare const MailingListSchema: yup.ObjectSchema<{
2016
2619
  referralSources: string[];
2017
2620
  statuses: string[];
2018
2621
  profileVisibilities: string[];
2019
- skillProficiencyLevels: string[];
2020
- languageProficiencyLevels: string[];
2021
2622
  studyTypes: string[];
2022
2623
  socialAccountTypes: string[];
2023
2624
  salaryCurrencies: string[];
2024
- companies: string[];
2025
2625
  designations: string[];
2026
2626
  institutes: string[];
2027
2627
  fieldsOfStudy: string[];
2028
- certificationAuthorities: string[];
2628
+ workHistory: {
2629
+ [x: string]: any;
2630
+ [x: number]: any;
2631
+ [x: symbol]: any;
2632
+ }[];
2633
+ educationHistory: {
2634
+ [x: string]: any;
2635
+ [x: number]: any;
2636
+ [x: symbol]: any;
2637
+ }[];
2029
2638
  jobRoles: string[];
2030
2639
  jobLocations: string[];
2031
2640
  hiringForCompanies: string[];
@@ -2036,9 +2645,6 @@ declare const MailingListSchema: yup.ObjectSchema<{
2036
2645
  onboardingCompletedOnly: boolean;
2037
2646
  emailVerifiedOnly: boolean;
2038
2647
  mobileVerifiedOnly: boolean;
2039
- states: string[];
2040
- stateCodes: string[];
2041
- cities: string[];
2042
2648
  signupCountries: string[];
2043
2649
  signupLocales: string[];
2044
2650
  signupSources: string[];
@@ -2060,6 +2666,8 @@ declare const MailingListSchema: yup.ObjectSchema<{
2060
2666
  name: undefined;
2061
2667
  description: undefined;
2062
2668
  filter: {
2669
+ emails: never[];
2670
+ authAccountIds: never[];
2063
2671
  countries: never[];
2064
2672
  roles: never[];
2065
2673
  experienceLevels: never[];
@@ -2068,8 +2676,6 @@ declare const MailingListSchema: yup.ObjectSchema<{
2068
2676
  referralSources: never[];
2069
2677
  statuses: never[];
2070
2678
  profileVisibilities: never[];
2071
- skillProficiencyLevels: never[];
2072
- languageProficiencyLevels: never[];
2073
2679
  studyTypes: never[];
2074
2680
  socialAccountTypes: never[];
2075
2681
  salaryCurrencies: never[];
@@ -2081,8 +2687,9 @@ declare const MailingListSchema: yup.ObjectSchema<{
2081
2687
  institutes: never[];
2082
2688
  courses: never[];
2083
2689
  fieldsOfStudy: never[];
2690
+ workHistory: never[];
2691
+ educationHistory: never[];
2084
2692
  certifications: never[];
2085
- certificationAuthorities: never[];
2086
2693
  projects: never[];
2087
2694
  jobRoles: never[];
2088
2695
  jobLocations: never[];
@@ -2115,13 +2722,17 @@ declare const MailingListSchema: yup.ObjectSchema<{
2115
2722
  signupLocales: never[];
2116
2723
  signupSources: never[];
2117
2724
  educationLevels: never[];
2725
+ marketingSubscribed: undefined;
2118
2726
  jobAlertFrequencies: never[];
2119
2727
  consentSources: never[];
2120
2728
  consentUpdatedWithinDays: undefined;
2729
+ consentUpdatedAfter: undefined;
2121
2730
  notificationChannelsEnabled: never[];
2122
2731
  currentlyEmployed: false;
2123
2732
  graduatedWithinMonths: undefined;
2124
2733
  skillUsedWithinMonths: undefined;
2734
+ graduatedAfter: undefined;
2735
+ skillUsedAfter: undefined;
2125
2736
  hasImage: false;
2126
2737
  hasHeadline: false;
2127
2738
  hasAboutMe: false;
@@ -2132,13 +2743,12 @@ declare const MailingListSchema: yup.ObjectSchema<{
2132
2743
  hasJobAlert: undefined;
2133
2744
  hasApplied: undefined;
2134
2745
  appliedWithinDays: undefined;
2135
- search: undefined;
2136
2746
  or: never[];
2137
2747
  };
2138
2748
  }, "">;
2139
2749
  /**
2140
2750
  * When a campaign sends. Discriminated by `kind`; the fields each kind needs are
2141
- * required only for that kind, so one stored shape covers all four.
2751
+ * required only for that kind, so one stored shape covers them all.
2142
2752
  */
2143
2753
  declare const CampaignTriggerSchema: yup.ObjectSchema<{
2144
2754
  kind: NonNullable<CampaignTriggerKind | undefined>;
@@ -2153,13 +2763,10 @@ declare const CampaignTriggerSchema: yup.ObjectSchema<{
2153
2763
  byWeekday: number[];
2154
2764
  byMonthday: number | undefined;
2155
2765
  end: {
2156
- occurrences?: number | undefined;
2157
2766
  date?: number | undefined;
2767
+ occurrences?: number | undefined;
2158
2768
  kind: NonNullable<CampaignEndKind | undefined>;
2159
2769
  };
2160
- anchorField: CampaignAnchorField | undefined;
2161
- offsetDays: number | undefined;
2162
- windowDays: number;
2163
2770
  }, yup.AnyObject, {
2164
2771
  kind: CampaignTriggerKind.Manual;
2165
2772
  timezone: "UTC";
@@ -2172,16 +2779,36 @@ declare const CampaignTriggerSchema: yup.ObjectSchema<{
2172
2779
  end: {
2173
2780
  kind: CampaignEndKind;
2174
2781
  };
2175
- anchorField: undefined;
2176
- offsetDays: undefined;
2177
- windowDays: 2;
2178
2782
  }, "">;
2179
2783
  /**
2180
- * Where one template variable's value comes from. `value` carries the literal for
2181
- * `static`/`url`, and the field path for `recipient`/`source`.
2784
+ * ONE data source a campaign draws content from: which source, how it is
2785
+ * configured, and whether it personalises.
2786
+ *
2787
+ * Extracted so `CampaignSchema.dataSources` can hold several. A campaign used
2788
+ * to store exactly one, which meant a template could never combine (say) jobs
2789
+ * and groups in one mail.
2182
2790
  */
2183
- declare const BindingSchema: yup.ObjectSchema<{
2184
- kind: NonNullable<BindingKind | undefined>;
2791
+ declare const CampaignDataSourceSchema: yup.ObjectSchema<{
2792
+ id: string;
2793
+ personalised: boolean | undefined;
2794
+ params: {
2795
+ [x: string]: {} | undefined;
2796
+ [x: number]: {} | undefined;
2797
+ };
2798
+ }, yup.AnyObject, {
2799
+ id: undefined;
2800
+ personalised: undefined;
2801
+ params: undefined;
2802
+ }, "">;
2803
+ /**
2804
+ * Where ONE template variable's value comes from.
2805
+ *
2806
+ * `value` carries the literal for `static`/`url`, and the field path for
2807
+ * `recipient`/`source`. Named for what it binds: "binding" alone says nothing
2808
+ * about what is being bound to what.
2809
+ */
2810
+ declare const TemplateVariableBindingSchema: yup.ObjectSchema<{
2811
+ kind: NonNullable<TemplateVariableBindingKind | undefined>;
2185
2812
  value: string;
2186
2813
  }, yup.AnyObject, {
2187
2814
  kind: undefined;
@@ -2193,24 +2820,26 @@ declare const CampaignSchema: yup.ObjectSchema<{
2193
2820
  html: string | undefined;
2194
2821
  text: string | undefined;
2195
2822
  listId: string;
2823
+ status: CampaignStatus;
2196
2824
  templateKey: string | undefined;
2197
2825
  bindings: {
2198
2826
  [x: string]: {
2199
2827
  value: string;
2200
- kind: NonNullable<BindingKind | undefined>;
2828
+ kind: NonNullable<TemplateVariableBindingKind | undefined>;
2201
2829
  };
2202
2830
  [x: number]: {
2203
2831
  value: string;
2204
- kind: NonNullable<BindingKind | undefined>;
2832
+ kind: NonNullable<TemplateVariableBindingKind | undefined>;
2205
2833
  };
2206
2834
  };
2207
- dataSource: {
2835
+ dataSources: {
2836
+ personalised?: boolean | undefined;
2208
2837
  id: string;
2209
2838
  params: {
2210
2839
  [x: string]: {} | undefined;
2211
2840
  [x: number]: {} | undefined;
2212
2841
  };
2213
- } | undefined;
2842
+ }[] | undefined;
2214
2843
  trigger: {
2215
2844
  runAt?: number | undefined;
2216
2845
  startAt?: number | undefined;
@@ -2219,20 +2848,16 @@ declare const CampaignSchema: yup.ObjectSchema<{
2219
2848
  unit: NonNullable<CampaignIntervalUnit | undefined>;
2220
2849
  } | undefined;
2221
2850
  byMonthday?: number | undefined;
2222
- anchorField?: CampaignAnchorField | undefined;
2223
- offsetDays?: number | undefined;
2224
- kind: NonNullable<CampaignTriggerKind | undefined>;
2225
2851
  timezone: string;
2852
+ kind: NonNullable<CampaignTriggerKind | undefined>;
2226
2853
  timeOfDay: string;
2227
2854
  byWeekday: number[];
2228
2855
  end: {
2229
- occurrences?: number | undefined;
2230
2856
  date?: number | undefined;
2857
+ occurrences?: number | undefined;
2231
2858
  kind: NonNullable<CampaignEndKind | undefined>;
2232
2859
  };
2233
- windowDays: number;
2234
2860
  };
2235
- enabled: boolean;
2236
2861
  dryRun: boolean;
2237
2862
  maxRecipients: number | undefined;
2238
2863
  utm: {
@@ -2245,9 +2870,10 @@ declare const CampaignSchema: yup.ObjectSchema<{
2245
2870
  html: undefined;
2246
2871
  text: undefined;
2247
2872
  listId: undefined;
2873
+ status: CampaignStatus.Draft;
2248
2874
  templateKey: undefined;
2249
2875
  bindings: undefined;
2250
- dataSource: undefined;
2876
+ dataSources: undefined;
2251
2877
  trigger: {
2252
2878
  kind: CampaignTriggerKind.Manual;
2253
2879
  timezone: "UTC";
@@ -2260,11 +2886,7 @@ declare const CampaignSchema: yup.ObjectSchema<{
2260
2886
  end: {
2261
2887
  kind: CampaignEndKind;
2262
2888
  };
2263
- anchorField: undefined;
2264
- offsetDays: undefined;
2265
- windowDays: 2;
2266
2889
  };
2267
- enabled: false;
2268
2890
  dryRun: true;
2269
2891
  maxRecipients: undefined;
2270
2892
  utm: undefined;
@@ -2404,16 +3026,28 @@ declare enum JobAlertFrequency {
2404
3026
  }
2405
3027
  declare const SupportedJobAlertFrequencies: JobAlertFrequency[];
2406
3028
  /**
2407
- * Channels of NOTIFICATION email — mail about activity on the user's own
2408
- * account (a group invite, a job of theirs expiring). Distinct from marketing:
2409
- * notifications are opt-OUT (default on, see `notificationPrefs`), marketing is
2410
- * opt-IN (`marketingConsent.subscribed`). Transactional mail (magic-link,
2411
- * verification) is governed by neither and always sends.
3029
+ * KINDS of notification, by subject matter — what a message is ABOUT, not how
3030
+ * it reaches the user. A notification of a given kind may be delivered over any
3031
+ * transport (email, web push, and later whatsapp or in-app); this enum is the
3032
+ * user's per-subject mute switch and applies across all of them.
3033
+ *
3034
+ * Named `NotificationType` rather than `...Channel` precisely because "channel"
3035
+ * reads as a delivery route. Muting `groupActivity` mutes group activity
3036
+ * everywhere, not merely in the mail.
3037
+ *
3038
+ * Distinct from marketing: notifications are opt-OUT (default on, see
3039
+ * `notificationPrefs`), marketing is opt-IN (`marketingConsent.subscribed`).
3040
+ * Transactional mail (magic-link, verification) is governed by neither and
3041
+ * always sends.
2412
3042
  *
2413
- * Deliberately coarse: four channels a user will actually reason about, rather
3043
+ * Deliberately coarse: four kinds a user will actually reason about, rather
2414
3044
  * than one toggle per email template.
3045
+ *
3046
+ * The VALUES are stored in Mongo as the keys of `notificationPrefs`, so they
3047
+ * are data, not style. Renaming the enum is a type-level change; renaming a
3048
+ * value would be a data migration.
2415
3049
  */
2416
- declare enum NotificationChannel {
3050
+ declare enum NotificationType {
2417
3051
  /** Group invites, join requests, membership approved/rejected. */
2418
3052
  GroupActivity = "groupActivity",
2419
3053
  /** Activity on jobs the user posted, e.g. a listing expiring. */
@@ -2423,7 +3057,7 @@ declare enum NotificationChannel {
2423
3057
  /** Product announcements and feature news. */
2424
3058
  ProductUpdates = "productUpdates"
2425
3059
  }
2426
- declare const SupportedNotificationChannels: NotificationChannel[];
3060
+ declare const SupportedNotificationTypes: NotificationType[];
2427
3061
  /** ISO-4217 currency codes accepted for the salary preference (extend as needed). */
2428
3062
  declare const SupportedSalaryCurrencies: readonly ["USD", "EUR", "GBP", "SEK", "INR"];
2429
3063
  type SupportedSalaryCurrency = (typeof SupportedSalaryCurrencies)[number];
@@ -2527,6 +3161,19 @@ declare const ReportSchema: yup.ObjectSchema<{
2527
3161
  comment: undefined;
2528
3162
  }, "">;
2529
3163
 
3164
+ /**
3165
+ * Wrapped so an unknown key is REJECTED rather than silently ignored, which is
3166
+ * the whole point here: the hand-rolled reader this replaces ignored not just
3167
+ * unknown KEYS but unknown VALUES too.
3168
+ */
3169
+ declare const FeedbackFilterSchema: yup.ObjectSchema<{
3170
+ type: string[];
3171
+ status: string[];
3172
+ }, yup.AnyObject, {
3173
+ type: never[];
3174
+ status: never[];
3175
+ }, "">;
3176
+
2530
3177
  declare enum FeedbackType {
2531
3178
  Bug = "bug",
2532
3179
  Feature = "feature",
@@ -2565,6 +3212,23 @@ declare const FeedbackSchema: yup.ObjectSchema<{
2565
3212
  status: undefined;
2566
3213
  }, "">;
2567
3214
 
3215
+ /**
3216
+ * Wrapped so an unknown key is REJECTED rather than silently ignored.
3217
+ *
3218
+ * Yup gives you unknown-key rejection or coercion, never both: `.noUnknown()`
3219
+ * alone accepts `{bogus:1}`, and with `strict: true` it rejects but then throws
3220
+ * on the string values every query param arrives as. Hence a `.test()`.
3221
+ */
3222
+ declare const SkillFilterSchema: yup.ObjectSchema<{
3223
+ names: string[];
3224
+ conceptIds: string[];
3225
+ tags: string[];
3226
+ }, yup.AnyObject, {
3227
+ names: never[];
3228
+ conceptIds: never[];
3229
+ tags: never[];
3230
+ }, "">;
3231
+
2568
3232
  declare const SkillSchema: yup.ObjectSchema<{
2569
3233
  name: string;
2570
3234
  conceptId: string | null | undefined;
@@ -2589,9 +3253,379 @@ declare const SkillSchema: yup.ObjectSchema<{
2589
3253
  shortId: undefined;
2590
3254
  createdBy: undefined;
2591
3255
  createdAt: undefined;
2592
- updatedBy: undefined;
3256
+ updatedBy: undefined;
3257
+ updatedAt: undefined;
3258
+ }, "">;
3259
+
3260
+ /**
3261
+ * Billing vocabulary (Paddle).
3262
+ *
3263
+ * Two conventions in this module differ from the rest of the package, both
3264
+ * deliberately and both load-bearing. Read them before editing:
3265
+ *
3266
+ * 1. **Paddle's wire values win.** `SubscriptionStatus` and `TransactionStatus`
3267
+ * mirror Paddle verbatim, underscores included (`past_due`). The house style
3268
+ * is lowercase-hyphen, but these values arrive in webhooks and are compared
3269
+ * as literals; normalising them would silently stop matching live events.
3270
+ * Never invent a member Paddle does not send.
3271
+ *
3272
+ * 2. **Money is in MINOR units.** Every other amount in this package (salary) is
3273
+ * a bare integer in the currency's MAJOR unit. Paddle is the opposite. See
3274
+ * `MoneySchema` in `billing.schema.ts`.
3275
+ */
3276
+ /** Whether buying this plan starts a recurring subscription or is a one-time purchase. */
3277
+ declare enum PlanKind {
3278
+ Subscription = "subscription",
3279
+ OneOff = "one-off"
3280
+ }
3281
+ declare const SupportedPlanKinds: PlanKind[];
3282
+ /** Whether a plan can currently be bought. Archived plans still grant to existing owners. */
3283
+ declare enum PlanStatus {
3284
+ Draft = "draft",
3285
+ Active = "active",
3286
+ Archived = "archived"
3287
+ }
3288
+ declare const SupportedPlanStatuses: PlanStatus[];
3289
+ /**
3290
+ * How a grant gives access to a feature.
3291
+ *
3292
+ * - `boolean` — plain on/off for as long as the plan is held.
3293
+ * - `quota` — N uses per period, refreshed each period.
3294
+ * - `credit` — N uses that do not expire, from a one-off purchase.
3295
+ *
3296
+ * Quota is spent before credit, so an included monthly allowance is used up
3297
+ * before a purchased pack is touched.
3298
+ */
3299
+ declare enum GrantType {
3300
+ Boolean = "boolean",
3301
+ Quota = "quota",
3302
+ Credit = "credit"
3303
+ }
3304
+ declare const SupportedGrantTypes: GrantType[];
3305
+ /** The window a quota refreshes on, anchored to the subscription's billing date. */
3306
+ declare enum QuotaPeriod {
3307
+ Month = "month",
3308
+ Year = "year",
3309
+ /** Never refreshes: N uses for the lifetime of the subscription. */
3310
+ Lifetime = "lifetime"
3311
+ }
3312
+ declare const SupportedQuotaPeriods: QuotaPeriod[];
3313
+ /**
3314
+ * How often a subscription plan BILLS.
3315
+ *
3316
+ * Deliberately NOT `QuotaPeriod`, though the two share `month` and `year`. They
3317
+ * answer different questions: `QuotaPeriod` is how often a grant refreshes,
3318
+ * this is how often the customer is charged, and a plan may bill yearly while
3319
+ * refreshing its quota monthly (`employer-annual` does exactly that). Reusing
3320
+ * `QuotaPeriod` here would also admit `lifetime`, which is not a billing
3321
+ * interval for a subscription.
3322
+ *
3323
+ * Absent on one-off plans, which are not billed on an interval at all.
3324
+ */
3325
+ declare enum BillingPeriod {
3326
+ Month = "month",
3327
+ Year = "year"
3328
+ }
3329
+ declare const SupportedBillingPeriods: BillingPeriod[];
3330
+ /**
3331
+ * Paddle subscription status, verbatim.
3332
+ *
3333
+ * `active`, `trialing` and `past_due` all currently GRANT access: dunning is a
3334
+ * payment problem, and cutting a paying customer off mid-retry is worse than
3335
+ * carrying them for a few days. `paused` and `canceled` do not grant.
3336
+ */
3337
+ declare enum SubscriptionStatus {
3338
+ Active = "active",
3339
+ Trialing = "trialing",
3340
+ PastDue = "past_due",
3341
+ Paused = "paused",
3342
+ Canceled = "canceled"
3343
+ }
3344
+ declare const SupportedSubscriptionStatuses: SubscriptionStatus[];
3345
+ /** Subscription statuses that currently entitle the holder to their plan's grants. */
3346
+ declare const EntitlingSubscriptionStatuses: SubscriptionStatus[];
3347
+ /** Paddle transaction status, verbatim. `completed` is where a one-off is fulfilled. */
3348
+ declare enum TransactionStatus {
3349
+ Draft = "draft",
3350
+ Ready = "ready",
3351
+ Billed = "billed",
3352
+ Paid = "paid",
3353
+ Completed = "completed",
3354
+ Canceled = "canceled",
3355
+ PastDue = "past_due"
3356
+ }
3357
+ declare const SupportedTransactionStatuses: TransactionStatus[];
3358
+ /** Which Paddle environment an identifier belongs to. Sandbox and live IDs never match. */
3359
+ declare enum PaddleEnvironment {
3360
+ Sandbox = "sandbox",
3361
+ Production = "production"
3362
+ }
3363
+ declare const SupportedPaddleEnvironments: PaddleEnvironment[];
3364
+ /**
3365
+ * Feature keys currently known to the platform.
3366
+ *
3367
+ * INFORMATIONAL ONLY — for autocomplete and for grepping who gates what.
3368
+ *
3369
+ * Do NOT constrain a stored field with `.oneOf(SupportedFeatureKeys)`. Feature
3370
+ * keys are data owned by billing-service, and the entire point of the design is
3371
+ * that putting a feature behind a paywall is a database change. Validating
3372
+ * against this enum would make every new paywall a release of this package plus
3373
+ * a redeploy of every service that holds it — exactly what the design avoids.
3374
+ *
3375
+ * Keys are dot-namespaced `<domain>.<capability>` and are permanent once sold:
3376
+ * renaming one orphans the grants already stored against it.
3377
+ */
3378
+ declare enum FeatureKey {
3379
+ JobPost = "job.post",
3380
+ JobAlerts = "job.alerts",
3381
+ PageCreate = "page.create",
3382
+ GroupCreate = "group.create",
3383
+ CandidateFinder = "candidate.finder",
3384
+ SearchAdvanced = "search.advanced",
3385
+ GetDiscovered = "get-discovered"
3386
+ }
3387
+ declare const SupportedFeatureKeys: FeatureKey[];
3388
+ /** Why a gate refused, so the UI can tell "buy this" apart from "wait". */
3389
+ declare enum EntitlementDenialReason {
3390
+ /** No plan grants this feature at all. */
3391
+ NotEntitled = "not-entitled",
3392
+ /** Entitled, but the period's quota is spent. */
3393
+ QuotaExhausted = "quota-exhausted",
3394
+ /** Entitled, but the credit balance is zero. */
3395
+ NoCredits = "no-credits"
3396
+ }
3397
+ declare const SupportedEntitlementDenialReasons: EntitlementDenialReason[];
3398
+ /** A single grant cannot hand out more than this per period. Guards a typo'd plan. */
3399
+ declare const GRANT_MAX_LIMIT = 100000;
3400
+ /** Ceiling on units consumed in one call. A gate spends one unit in the normal case. */
3401
+ declare const CONSUME_MAX_UNITS = 1000;
3402
+
3403
+ /**
3404
+ * An amount of money as Paddle expresses it.
3405
+ *
3406
+ * ⚠️ MINOR UNITS. `999` here is $9.99, not $999. This is the OPPOSITE of every
3407
+ * other amount in this package: `salaryRange.min`, `minSalary` and friends are
3408
+ * bare integers in the currency's MAJOR unit. Mixing the two is a 100x error in
3409
+ * either direction, which is why the field is named `amountMinor` rather than
3410
+ * `amount` — a bare `amount` next to a bare `currency` would read exactly like
3411
+ * the salary fields and be wrong.
3412
+ *
3413
+ * Paddle transmits this as a STRING of minor units; billing-service parses it to
3414
+ * a number on ingest and keeps the unit. Never render it without dividing by the
3415
+ * currency's exponent.
3416
+ */
3417
+ declare const MoneySchema: yup.ObjectSchema<{
3418
+ amountMinor: number;
3419
+ currencyCode: string;
3420
+ }, yup.AnyObject, {
3421
+ amountMinor: undefined;
3422
+ currencyCode: undefined;
3423
+ }, "">;
3424
+ /**
3425
+ * One thing a plan gives you.
3426
+ *
3427
+ * `limit` applies to quota grants, `amount` to credit grants, and neither to
3428
+ * boolean. They are optional at the schema level and enforced by `.when`, so a
3429
+ * malformed plan is caught when an operator saves it rather than when a user's
3430
+ * entitlements silently resolve to nothing.
3431
+ */
3432
+ declare const PlanGrantSchema: yup.ObjectSchema<{
3433
+ feature: string;
3434
+ type: NonNullable<GrantType | undefined>;
3435
+ limit: number | undefined;
3436
+ period: QuotaPeriod;
3437
+ amount: number | undefined;
3438
+ }, yup.AnyObject, {
3439
+ feature: undefined;
3440
+ type: GrantType.Boolean;
3441
+ limit: undefined;
3442
+ period: QuotaPeriod.Month;
3443
+ amount: undefined;
3444
+ }, "">;
3445
+ /**
3446
+ * Paddle price identifiers, split by environment.
3447
+ *
3448
+ * Keyed rather than flat because sandbox and live price IDs are different
3449
+ * strings for the same product. Shipping sandbox IDs to production does not fail
3450
+ * at checkout — it fails later, when a webhook arrives carrying a price nothing
3451
+ * maps to, and reads as "plan not found" rather than "wrong environment".
3452
+ */
3453
+ declare const PaddlePriceIdsSchema: yup.ObjectSchema<{
3454
+ sandbox: string[];
3455
+ live: string[];
3456
+ }, yup.AnyObject, {
3457
+ sandbox: never[];
3458
+ live: never[];
3459
+ }, "">;
3460
+ /**
3461
+ * What can be bought, and what it grants.
3462
+ *
3463
+ * This document is the paywall. Putting a feature behind it, taking one out, or
3464
+ * changing a quota is an edit here plus a cache bust — no service redeploys.
3465
+ */
3466
+ declare const PlanSchema: yup.ObjectSchema<{
3467
+ key: string;
3468
+ name: string;
3469
+ description: string | undefined;
3470
+ kind: NonNullable<PlanKind | undefined>;
3471
+ status: NonNullable<PlanStatus | undefined>;
3472
+ paddlePriceIds: {
3473
+ sandbox: string[];
3474
+ live: string[];
3475
+ };
3476
+ grants: {
3477
+ limit?: number | undefined;
3478
+ amount?: number | undefined;
3479
+ type: NonNullable<GrantType | undefined>;
3480
+ feature: string;
3481
+ period: QuotaPeriod;
3482
+ }[];
3483
+ price: {
3484
+ amountMinor: number;
3485
+ currencyCode: string;
3486
+ } | undefined;
3487
+ billingPeriod: BillingPeriod | undefined;
3488
+ sortOrder: number;
3489
+ createdAt: number | undefined;
3490
+ updatedAt: number | undefined;
3491
+ }, yup.AnyObject, {
3492
+ key: undefined;
3493
+ name: undefined;
3494
+ description: undefined;
3495
+ kind: PlanKind.Subscription;
3496
+ status: PlanStatus.Draft;
3497
+ paddlePriceIds: {
3498
+ sandbox: never[];
3499
+ live: never[];
3500
+ };
3501
+ grants: "";
3502
+ price: undefined;
3503
+ billingPeriod: undefined;
3504
+ sortOrder: 0;
3505
+ createdAt: undefined;
3506
+ updatedAt: undefined;
3507
+ }, "">;
3508
+ /**
3509
+ * A user's Paddle subscription, mirrored locally.
3510
+ *
3511
+ * Paddle is the source of truth; this is a cache kept current by webhooks and
3512
+ * repaired by the reconciler. `lastEventAt` is what makes that safe: Paddle
3513
+ * guarantees no ordering, so every write is conditional on this advancing, and a
3514
+ * late `subscription.updated` cannot resurrect a canceled subscription.
3515
+ */
3516
+ declare const BillingSubscriptionSchema: yup.ObjectSchema<{
3517
+ userId: string;
3518
+ paddleSubscriptionId: string;
3519
+ paddleCustomerId: string;
3520
+ planKey: string;
3521
+ priceIds: string[];
3522
+ status: NonNullable<SubscriptionStatus | undefined>;
3523
+ currentPeriodStart: number | undefined;
3524
+ currentPeriodEnd: number | undefined;
3525
+ canceledAt: number | undefined;
3526
+ lastEventAt: number;
3527
+ createdAt: number | undefined;
3528
+ updatedAt: number | undefined;
3529
+ }, yup.AnyObject, {
3530
+ userId: undefined;
3531
+ paddleSubscriptionId: undefined;
3532
+ paddleCustomerId: undefined;
3533
+ planKey: undefined;
3534
+ priceIds: "";
3535
+ status: undefined;
3536
+ currentPeriodStart: undefined;
3537
+ currentPeriodEnd: undefined;
3538
+ canceledAt: undefined;
3539
+ lastEventAt: 0;
3540
+ createdAt: undefined;
3541
+ updatedAt: undefined;
3542
+ }, "">;
3543
+ /** A completed Paddle payment. One-off purchases are fulfilled from these. */
3544
+ declare const BillingTransactionSchema: yup.ObjectSchema<{
3545
+ userId: string;
3546
+ paddleTransactionId: string;
3547
+ paddleCustomerId: string | undefined;
3548
+ paddleSubscriptionId: string | undefined;
3549
+ planKey: string | undefined;
3550
+ priceIds: string[];
3551
+ status: NonNullable<TransactionStatus | undefined>;
3552
+ total: {
3553
+ amountMinor: number;
3554
+ currencyCode: string;
3555
+ } | undefined;
3556
+ billedAt: number | undefined;
3557
+ lastEventAt: number;
3558
+ createdAt: number | undefined;
3559
+ updatedAt: number | undefined;
3560
+ }, yup.AnyObject, {
3561
+ userId: undefined;
3562
+ paddleTransactionId: undefined;
3563
+ paddleCustomerId: undefined;
3564
+ paddleSubscriptionId: undefined;
3565
+ planKey: undefined;
3566
+ priceIds: "";
3567
+ status: undefined;
3568
+ total: undefined;
3569
+ billedAt: undefined;
3570
+ lastEventAt: 0;
3571
+ createdAt: undefined;
2593
3572
  updatedAt: undefined;
2594
3573
  }, "">;
3574
+ /**
3575
+ * The resolved state of one feature for one user.
3576
+ *
3577
+ * Both halves of the answer travel together: `allowed` is what a gate checks,
3578
+ * and the counts are what the UI and the 402 body need. Only `allowed` becomes a
3579
+ * CASL rule — see `defineEntitlementRules` in `@thejob/permission` for why counts
3580
+ * cannot.
3581
+ */
3582
+ declare const FeatureEntitlementSchema: yup.ObjectSchema<{
3583
+ feature: string;
3584
+ type: NonNullable<GrantType | undefined>;
3585
+ allowed: NonNullable<boolean | undefined>;
3586
+ limit: number | undefined;
3587
+ used: number | undefined;
3588
+ remaining: number | undefined;
3589
+ credits: number | undefined;
3590
+ resetsAt: number | undefined;
3591
+ }, yup.AnyObject, {
3592
+ feature: undefined;
3593
+ type: undefined;
3594
+ allowed: false;
3595
+ limit: undefined;
3596
+ used: undefined;
3597
+ remaining: undefined;
3598
+ credits: undefined;
3599
+ resetsAt: undefined;
3600
+ }, "">;
3601
+ /** Why a gate refused, with the numbers behind it. The body of a 402. */
3602
+ declare const EntitlementDenialSchema: yup.ObjectSchema<{
3603
+ feature: string;
3604
+ reason: NonNullable<EntitlementDenialReason | undefined>;
3605
+ limit: number | undefined;
3606
+ used: number | undefined;
3607
+ resetsAt: number | undefined;
3608
+ upgradeUrl: string | undefined;
3609
+ }, yup.AnyObject, {
3610
+ feature: undefined;
3611
+ reason: undefined;
3612
+ limit: undefined;
3613
+ used: undefined;
3614
+ resetsAt: undefined;
3615
+ upgradeUrl: undefined;
3616
+ }, "">;
3617
+ /** What a service asks for when spending a unit of a metered feature. */
3618
+ declare const EntitlementConsumeSchema: yup.ObjectSchema<{
3619
+ userId: string;
3620
+ feature: string;
3621
+ units: number;
3622
+ idempotencyKey: string;
3623
+ }, yup.AnyObject, {
3624
+ userId: undefined;
3625
+ feature: undefined;
3626
+ units: 1;
3627
+ idempotencyKey: undefined;
3628
+ }, "">;
2595
3629
 
2596
3630
  declare enum SocialAccount {
2597
3631
  Facebook = "facebook",
@@ -2651,8 +3685,8 @@ declare const UserSchema: yup.ObjectSchema<{
2651
3685
  dark?: string | null | undefined;
2652
3686
  light?: string | undefined;
2653
3687
  } | null | undefined;
2654
- type: PageType;
2655
3688
  name: string;
3689
+ type: PageType;
2656
3690
  };
2657
3691
  location: {
2658
3692
  placeId?: string | null | undefined;
@@ -2668,11 +3702,11 @@ declare const UserSchema: yup.ObjectSchema<{
2668
3702
  };
2669
3703
  };
2670
3704
  designation: string;
3705
+ isRemote: boolean;
2671
3706
  duration: {
2672
3707
  [x: string]: string | boolean;
2673
3708
  [x: number]: string | boolean;
2674
3709
  };
2675
- isRemote: boolean;
2676
3710
  }[];
2677
3711
  educations: {
2678
3712
  description?: string | undefined;
@@ -2695,18 +3729,18 @@ declare const UserSchema: yup.ObjectSchema<{
2695
3729
  dark?: string | null | undefined;
2696
3730
  light?: string | undefined;
2697
3731
  } | null | undefined;
2698
- type: PageType;
2699
3732
  name: string;
3733
+ type: PageType;
2700
3734
  };
3735
+ course: string;
3736
+ fieldOfStudy: string;
3737
+ studyType: NonNullable<StudyType | undefined>;
3738
+ isDistanceLearning: boolean;
2701
3739
  duration: {
2702
3740
  startDate: string;
2703
3741
  endDate: string | null;
2704
3742
  isActive: boolean;
2705
3743
  };
2706
- course: string;
2707
- fieldOfStudy: string;
2708
- isDistanceLearning: boolean;
2709
- studyType: NonNullable<StudyType | undefined>;
2710
3744
  }[];
2711
3745
  skills: {
2712
3746
  lastUsed?: string | null | undefined;
@@ -2732,7 +3766,11 @@ declare const UserSchema: yup.ObjectSchema<{
2732
3766
  name: string;
2733
3767
  authority: string;
2734
3768
  }[];
2735
- interests: string[];
3769
+ interests: {
3770
+ name: string;
3771
+ logo: string;
3772
+ id: string;
3773
+ }[];
2736
3774
  languages: {
2737
3775
  name: string;
2738
3776
  proficiencyLevel: NonNullable<ProficiencyLevel | undefined>;
@@ -2755,10 +3793,16 @@ declare const UserSchema: yup.ObjectSchema<{
2755
3793
  applicationUpdates: boolean;
2756
3794
  productUpdates: boolean;
2757
3795
  };
3796
+ pushConsent: {
3797
+ updatedAt?: number | undefined;
3798
+ source?: string | undefined;
3799
+ subscribed: boolean;
3800
+ };
2758
3801
  embedding: {
2759
3802
  vector?: number[] | undefined;
2760
3803
  model?: string | undefined;
2761
3804
  } | null | undefined;
3805
+ createdAt: number | undefined;
2762
3806
  id: string | undefined;
2763
3807
  name: {
2764
3808
  last?: string | undefined;
@@ -2766,6 +3810,7 @@ declare const UserSchema: yup.ObjectSchema<{
2766
3810
  };
2767
3811
  headline: string | undefined;
2768
3812
  image: string | undefined;
3813
+ imageOriginal: string | undefined;
2769
3814
  aboutMe: string | undefined;
2770
3815
  email: string;
2771
3816
  mobile: string | null | undefined;
@@ -2852,8 +3897,8 @@ declare const UserSchema: yup.ObjectSchema<{
2852
3897
  dark?: string | null | undefined;
2853
3898
  light?: string | undefined;
2854
3899
  } | null | undefined;
2855
- type: PageType;
2856
3900
  name: string;
3901
+ type: PageType;
2857
3902
  };
2858
3903
  location: {
2859
3904
  placeId?: string | null | undefined;
@@ -2869,11 +3914,11 @@ declare const UserSchema: yup.ObjectSchema<{
2869
3914
  };
2870
3915
  };
2871
3916
  designation: string;
3917
+ isRemote: boolean;
2872
3918
  duration: {
2873
3919
  [x: string]: string | boolean;
2874
3920
  [x: number]: string | boolean;
2875
3921
  };
2876
- isRemote: boolean;
2877
3922
  }[] | undefined;
2878
3923
  educations?: {
2879
3924
  description?: string | undefined;
@@ -2896,18 +3941,18 @@ declare const UserSchema: yup.ObjectSchema<{
2896
3941
  dark?: string | null | undefined;
2897
3942
  light?: string | undefined;
2898
3943
  } | null | undefined;
2899
- type: PageType;
2900
3944
  name: string;
3945
+ type: PageType;
2901
3946
  };
3947
+ course: string;
3948
+ fieldOfStudy: string;
3949
+ studyType: NonNullable<StudyType | undefined>;
3950
+ isDistanceLearning: boolean;
2902
3951
  duration: {
2903
3952
  startDate: string;
2904
3953
  endDate: string | null;
2905
3954
  isActive: boolean;
2906
3955
  };
2907
- course: string;
2908
- fieldOfStudy: string;
2909
- isDistanceLearning: boolean;
2910
- studyType: NonNullable<StudyType | undefined>;
2911
3956
  }[] | undefined;
2912
3957
  aboutMe?: string | undefined;
2913
3958
  mobile?: string | undefined;
@@ -2921,94 +3966,443 @@ declare const UserSchema: yup.ObjectSchema<{
2921
3966
  dark?: string | null | undefined;
2922
3967
  light?: string | undefined;
2923
3968
  } | null | undefined;
3969
+ name: string;
2924
3970
  type: PageType;
3971
+ };
3972
+ }[];
3973
+ } | undefined;
3974
+ } & {
3975
+ coordinatorProfile: {
3976
+ coordinatesAt: {
3977
+ jobTitle?: string | undefined;
3978
+ page: {
3979
+ slug?: string | undefined;
3980
+ logo?: {
3981
+ dark?: string | null | undefined;
3982
+ light?: string | undefined;
3983
+ } | null | undefined;
2925
3984
  name: string;
3985
+ type: PageType;
2926
3986
  };
2927
3987
  }[];
2928
- } | undefined;
2929
- } & {
2930
- coordinatorProfile: {
2931
- coordinatesAt: {
2932
- jobTitle?: string | undefined;
2933
- page: {
2934
- slug?: string | undefined;
2935
- logo?: {
2936
- dark?: string | null | undefined;
2937
- light?: string | undefined;
2938
- } | null | undefined;
2939
- type: PageType;
2940
- name: string;
2941
- };
3988
+ } | undefined;
3989
+ }, yup.AnyObject, {
3990
+ authAccountId: undefined;
3991
+ socialAccounts: never[];
3992
+ workExperiences: never[];
3993
+ educations: never[];
3994
+ skills: never[];
3995
+ projects: never[];
3996
+ certifications: never[];
3997
+ interests: never[];
3998
+ languages: never[];
3999
+ additionalInfo: never[];
4000
+ status: undefined;
4001
+ roles: UserRole[];
4002
+ marketingConsent: {
4003
+ subscribed: boolean;
4004
+ };
4005
+ notificationPrefs: {
4006
+ groupActivity: boolean;
4007
+ jobActivity: boolean;
4008
+ applicationUpdates: boolean;
4009
+ productUpdates: boolean;
4010
+ };
4011
+ pushConsent: {
4012
+ subscribed: boolean;
4013
+ };
4014
+ embedding: {
4015
+ vector: undefined;
4016
+ model: undefined;
4017
+ };
4018
+ createdAt: undefined;
4019
+ id: undefined;
4020
+ name: {
4021
+ first: undefined;
4022
+ last: undefined;
4023
+ };
4024
+ headline: undefined;
4025
+ image: undefined;
4026
+ imageOriginal: undefined;
4027
+ aboutMe: undefined;
4028
+ email: undefined;
4029
+ mobile: undefined;
4030
+ emailVerified: undefined;
4031
+ mobileVerified: undefined;
4032
+ experienceLevel: undefined;
4033
+ educationLevel: undefined;
4034
+ location: {
4035
+ placeId: undefined;
4036
+ country: undefined;
4037
+ countryCode: undefined;
4038
+ state: undefined;
4039
+ stateCode: undefined;
4040
+ city: undefined;
4041
+ address: undefined;
4042
+ geo: {
4043
+ type: "Point";
4044
+ coordinates: "";
4045
+ };
4046
+ };
4047
+ signupContext: undefined;
4048
+ profileVisibility: UserProfileVisibility.Public;
4049
+ openToWork: false;
4050
+ jobSearchUrgency: undefined;
4051
+ jobLocations: "";
4052
+ targetExperienceLevels: "";
4053
+ jobRoles: "";
4054
+ minSalary: 0;
4055
+ minSalaryCurrency: "USD";
4056
+ referralSource: undefined;
4057
+ resumes: never[];
4058
+ onboardingCompletedAt: undefined;
4059
+ pendingPrefill: undefined;
4060
+ recruiterProfile: undefined;
4061
+ coordinatorProfile: undefined;
4062
+ }, "">;
4063
+
4064
+ /**
4065
+ * THE user filter. One declaration, three derived uses:
4066
+ *
4067
+ * - `@thejob/users-client` derives its `UserFilter` type with `InferType`.
4068
+ * - `thejob-user-service` derives `USER_FILTER_FACETS` with
4069
+ * `Object.keys(UserFilterSchema.fields)` — the closed vocabulary it 400s
4070
+ * against.
4071
+ * - `MailingListSchema.filter` stores one, as does the audience preview.
4072
+ *
4073
+ * It was previously written out three times: a yup schema here, a hand-written
4074
+ * TS interface in the client, and a hand-listed `Set` of ~74 strings in the
4075
+ * service. Three lists of the same names drift, and the drift is invisible — a
4076
+ * facet the schema accepts but the service does not is a 400 on a send that
4077
+ * validated cleanly when it was saved.
4078
+ *
4079
+ * A FILTER, not an audience: it says which users match and nothing about what a
4080
+ * caller intends to do with them. Marketing narrows it one way, an admin list
4081
+ * another, and neither meaning belongs here.
4082
+ *
4083
+ * Every clause AND-s together; `or` unions the whole filter with each branch,
4084
+ * deduplicating by user, for audiences that are genuinely a union rather than an
4085
+ * intersection ("signed up recently OR active recently"). One level only:
4086
+ * branches do not nest, which the non-recursive definition above enforces.
4087
+ */
4088
+ declare const UserFilterSchema: yup.ObjectSchema<{
4089
+ emails: string[];
4090
+ authAccountIds: string[];
4091
+ countries: string[];
4092
+ roles: string[];
4093
+ experienceLevels: string[];
4094
+ targetExperienceLevels: string[];
4095
+ jobSearchUrgencies: string[];
4096
+ referralSources: string[];
4097
+ statuses: string[];
4098
+ profileVisibilities: string[];
4099
+ studyTypes: string[];
4100
+ socialAccountTypes: string[];
4101
+ salaryCurrencies: string[];
4102
+ skills: {
4103
+ [x: string]: string | undefined;
4104
+ [x: number]: string | undefined;
4105
+ }[];
4106
+ languages: {
4107
+ [x: string]: string | undefined;
4108
+ [x: number]: string | undefined;
4109
+ }[];
4110
+ interests: string[];
4111
+ companies: string[];
4112
+ designations: string[];
4113
+ institutes: string[];
4114
+ courses: string[];
4115
+ fieldsOfStudy: string[];
4116
+ workHistory: {
4117
+ [x: string]: any;
4118
+ [x: number]: any;
4119
+ [x: symbol]: any;
4120
+ }[];
4121
+ educationHistory: {
4122
+ [x: string]: any;
4123
+ [x: number]: any;
4124
+ [x: symbol]: any;
4125
+ }[];
4126
+ certifications: {
4127
+ [x: string]: string | undefined;
4128
+ [x: number]: string | undefined;
4129
+ }[];
4130
+ projects: string[];
4131
+ jobRoles: string[];
4132
+ jobLocations: string[];
4133
+ hiringForCompanies: string[];
4134
+ coordinatesAtInstitutes: string[];
4135
+ keywords: string[];
4136
+ minSalaryFloor: number | undefined;
4137
+ minSalaryCeil: number | undefined;
4138
+ openToWorkOnly: boolean;
4139
+ remoteExperienceOnly: boolean;
4140
+ hasResumeOnly: boolean;
4141
+ onboardingCompletedOnly: boolean;
4142
+ emailVerifiedOnly: boolean;
4143
+ mobileVerifiedOnly: boolean;
4144
+ lastSeenBeforeDays: number | undefined;
4145
+ lastSeenAfterDays: number | undefined;
4146
+ createdAtWithinDays: number | undefined;
4147
+ createdAtOlderThanDays: number | undefined;
4148
+ completenessMin: number | undefined;
4149
+ completenessMax: number | undefined;
4150
+ lastSeenBefore: number | undefined;
4151
+ lastSeenAfter: number | undefined;
4152
+ createdAtFrom: number | undefined;
4153
+ createdAtBefore: number | undefined;
4154
+ states: string[];
4155
+ stateCodes: string[];
4156
+ cities: string[];
4157
+ withinRadius: {
4158
+ lat: number;
4159
+ lng: number;
4160
+ km: number;
4161
+ } | undefined;
4162
+ signupCountries: string[];
4163
+ signupLocales: string[];
4164
+ signupSources: string[];
4165
+ educationLevels: string[];
4166
+ marketingSubscribed: boolean | undefined;
4167
+ jobAlertFrequencies: string[];
4168
+ consentSources: string[];
4169
+ consentUpdatedWithinDays: number | undefined;
4170
+ consentUpdatedAfter: number | undefined;
4171
+ notificationChannelsEnabled: string[];
4172
+ currentlyEmployed: boolean;
4173
+ graduatedWithinMonths: number | undefined;
4174
+ skillUsedWithinMonths: number | undefined;
4175
+ graduatedAfter: string | undefined;
4176
+ skillUsedAfter: string | undefined;
4177
+ hasImage: boolean;
4178
+ hasHeadline: boolean;
4179
+ hasAboutMe: boolean;
4180
+ hasMobile: boolean;
4181
+ missingSections: string[];
4182
+ companyTypes: string[];
4183
+ instituteTypes: string[];
4184
+ hasJobAlert: boolean | undefined;
4185
+ hasApplied: boolean | undefined;
4186
+ appliedWithinDays: number | undefined;
4187
+ or: {
4188
+ hasApplied?: boolean | undefined;
4189
+ minSalaryFloor?: number | undefined;
4190
+ minSalaryCeil?: number | undefined;
4191
+ lastSeenBeforeDays?: number | undefined;
4192
+ lastSeenAfterDays?: number | undefined;
4193
+ createdAtWithinDays?: number | undefined;
4194
+ createdAtOlderThanDays?: number | undefined;
4195
+ completenessMin?: number | undefined;
4196
+ completenessMax?: number | undefined;
4197
+ lastSeenBefore?: number | undefined;
4198
+ lastSeenAfter?: number | undefined;
4199
+ createdAtFrom?: number | undefined;
4200
+ createdAtBefore?: number | undefined;
4201
+ withinRadius?: {
4202
+ lat: number;
4203
+ lng: number;
4204
+ km: number;
4205
+ } | undefined;
4206
+ marketingSubscribed?: boolean | undefined;
4207
+ consentUpdatedWithinDays?: number | undefined;
4208
+ consentUpdatedAfter?: number | undefined;
4209
+ graduatedWithinMonths?: number | undefined;
4210
+ skillUsedWithinMonths?: number | undefined;
4211
+ graduatedAfter?: string | undefined;
4212
+ skillUsedAfter?: string | undefined;
4213
+ hasJobAlert?: boolean | undefined;
4214
+ appliedWithinDays?: number | undefined;
4215
+ keywords: string[];
4216
+ countries: string[];
4217
+ courses: string[];
4218
+ skills: {
4219
+ [x: string]: string | undefined;
4220
+ [x: number]: string | undefined;
4221
+ }[];
4222
+ languages: {
4223
+ [x: string]: string | undefined;
4224
+ [x: number]: string | undefined;
2942
4225
  }[];
2943
- } | undefined;
4226
+ certifications: {
4227
+ [x: string]: string | undefined;
4228
+ [x: number]: string | undefined;
4229
+ }[];
4230
+ interests: string[];
4231
+ projects: string[];
4232
+ companies: string[];
4233
+ stateCodes: string[];
4234
+ states: string[];
4235
+ cities: string[];
4236
+ emails: string[];
4237
+ authAccountIds: string[];
4238
+ roles: string[];
4239
+ experienceLevels: string[];
4240
+ targetExperienceLevels: string[];
4241
+ jobSearchUrgencies: string[];
4242
+ referralSources: string[];
4243
+ statuses: string[];
4244
+ profileVisibilities: string[];
4245
+ studyTypes: string[];
4246
+ socialAccountTypes: string[];
4247
+ salaryCurrencies: string[];
4248
+ designations: string[];
4249
+ institutes: string[];
4250
+ fieldsOfStudy: string[];
4251
+ workHistory: {
4252
+ [x: string]: any;
4253
+ [x: number]: any;
4254
+ [x: symbol]: any;
4255
+ }[];
4256
+ educationHistory: {
4257
+ [x: string]: any;
4258
+ [x: number]: any;
4259
+ [x: symbol]: any;
4260
+ }[];
4261
+ jobRoles: string[];
4262
+ jobLocations: string[];
4263
+ hiringForCompanies: string[];
4264
+ coordinatesAtInstitutes: string[];
4265
+ openToWorkOnly: boolean;
4266
+ remoteExperienceOnly: boolean;
4267
+ hasResumeOnly: boolean;
4268
+ onboardingCompletedOnly: boolean;
4269
+ emailVerifiedOnly: boolean;
4270
+ mobileVerifiedOnly: boolean;
4271
+ signupCountries: string[];
4272
+ signupLocales: string[];
4273
+ signupSources: string[];
4274
+ educationLevels: string[];
4275
+ jobAlertFrequencies: string[];
4276
+ consentSources: string[];
4277
+ notificationChannelsEnabled: string[];
4278
+ currentlyEmployed: boolean;
4279
+ hasImage: boolean;
4280
+ hasHeadline: boolean;
4281
+ hasAboutMe: boolean;
4282
+ hasMobile: boolean;
4283
+ missingSections: string[];
4284
+ companyTypes: string[];
4285
+ instituteTypes: string[];
4286
+ }[];
2944
4287
  }, yup.AnyObject, {
2945
- authAccountId: undefined;
2946
- socialAccounts: never[];
2947
- workExperiences: never[];
2948
- educations: never[];
4288
+ emails: never[];
4289
+ authAccountIds: never[];
4290
+ countries: never[];
4291
+ roles: never[];
4292
+ experienceLevels: never[];
4293
+ targetExperienceLevels: never[];
4294
+ jobSearchUrgencies: never[];
4295
+ referralSources: never[];
4296
+ statuses: never[];
4297
+ profileVisibilities: never[];
4298
+ studyTypes: never[];
4299
+ socialAccountTypes: never[];
4300
+ salaryCurrencies: never[];
2949
4301
  skills: never[];
2950
- projects: never[];
2951
- certifications: never[];
2952
- interests: never[];
2953
4302
  languages: never[];
2954
- additionalInfo: never[];
2955
- status: undefined;
2956
- roles: UserRole[];
2957
- marketingConsent: {
2958
- subscribed: boolean;
2959
- };
2960
- notificationPrefs: {
2961
- groupActivity: boolean;
2962
- jobActivity: boolean;
2963
- applicationUpdates: boolean;
2964
- productUpdates: boolean;
2965
- };
2966
- embedding: {
2967
- vector: undefined;
2968
- model: undefined;
2969
- };
2970
- id: undefined;
2971
- name: {
2972
- first: undefined;
2973
- last: undefined;
4303
+ interests: never[];
4304
+ companies: never[];
4305
+ designations: never[];
4306
+ institutes: never[];
4307
+ courses: never[];
4308
+ fieldsOfStudy: never[];
4309
+ workHistory: never[];
4310
+ educationHistory: never[];
4311
+ certifications: never[];
4312
+ projects: never[];
4313
+ jobRoles: never[];
4314
+ jobLocations: never[];
4315
+ hiringForCompanies: never[];
4316
+ coordinatesAtInstitutes: never[];
4317
+ keywords: never[];
4318
+ minSalaryFloor: undefined;
4319
+ minSalaryCeil: undefined;
4320
+ openToWorkOnly: false;
4321
+ remoteExperienceOnly: false;
4322
+ hasResumeOnly: false;
4323
+ onboardingCompletedOnly: false;
4324
+ emailVerifiedOnly: false;
4325
+ mobileVerifiedOnly: false;
4326
+ lastSeenBeforeDays: undefined;
4327
+ lastSeenAfterDays: undefined;
4328
+ createdAtWithinDays: undefined;
4329
+ createdAtOlderThanDays: undefined;
4330
+ completenessMin: undefined;
4331
+ completenessMax: undefined;
4332
+ lastSeenBefore: undefined;
4333
+ lastSeenAfter: undefined;
4334
+ createdAtFrom: undefined;
4335
+ createdAtBefore: undefined;
4336
+ states: never[];
4337
+ stateCodes: never[];
4338
+ cities: never[];
4339
+ withinRadius: undefined;
4340
+ signupCountries: never[];
4341
+ signupLocales: never[];
4342
+ signupSources: never[];
4343
+ educationLevels: never[];
4344
+ marketingSubscribed: undefined;
4345
+ jobAlertFrequencies: never[];
4346
+ consentSources: never[];
4347
+ consentUpdatedWithinDays: undefined;
4348
+ consentUpdatedAfter: undefined;
4349
+ notificationChannelsEnabled: never[];
4350
+ currentlyEmployed: false;
4351
+ graduatedWithinMonths: undefined;
4352
+ skillUsedWithinMonths: undefined;
4353
+ graduatedAfter: undefined;
4354
+ skillUsedAfter: undefined;
4355
+ hasImage: false;
4356
+ hasHeadline: false;
4357
+ hasAboutMe: false;
4358
+ hasMobile: false;
4359
+ missingSections: never[];
4360
+ companyTypes: never[];
4361
+ instituteTypes: never[];
4362
+ hasJobAlert: undefined;
4363
+ hasApplied: undefined;
4364
+ appliedWithinDays: undefined;
4365
+ or: never[];
4366
+ }, "">;
4367
+
4368
+ /**
4369
+ * A single browser's Web Push subscription.
4370
+ *
4371
+ * This is the DEVICE grant, distinct from `user.pushConsent`, which is the
4372
+ * user's intent. Both are required to deliver: consent without a subscription
4373
+ * has nowhere to send, and a subscription without consent must not be used.
4374
+ *
4375
+ * Shape dictated by the Push API, not by us. `endpoint` and `keys` come back
4376
+ * verbatim from `PushSubscription.toJSON()` in the browser and are passed
4377
+ * verbatim to the sender, so nothing here may be normalised or reformatted —
4378
+ * `p256dh` and `auth` are base64url and case-sensitive.
4379
+ *
4380
+ * MANY per user, one per browser profile per device, which is why this is its
4381
+ * own collection rather than a field on the user. The same person on a phone
4382
+ * and a laptop is two rows, and both should receive.
4383
+ */
4384
+ declare const PushSubscriptionSchema: yup.ObjectSchema<{
4385
+ userShortId: string;
4386
+ endpoint: string;
4387
+ keys: {
4388
+ p256dh: string;
4389
+ auth: string;
2974
4390
  };
2975
- headline: undefined;
2976
- image: undefined;
2977
- aboutMe: undefined;
2978
- email: undefined;
2979
- mobile: undefined;
2980
- emailVerified: undefined;
2981
- mobileVerified: undefined;
2982
- experienceLevel: undefined;
2983
- educationLevel: undefined;
2984
- location: {
2985
- placeId: undefined;
2986
- country: undefined;
2987
- countryCode: undefined;
2988
- state: undefined;
2989
- stateCode: undefined;
2990
- city: undefined;
2991
- address: undefined;
2992
- geo: {
2993
- type: "Point";
2994
- coordinates: "";
2995
- };
4391
+ expirationTime: number | null | undefined;
4392
+ userAgent: string | undefined;
4393
+ createdAt: number | undefined;
4394
+ lastSeenAt: number | undefined;
4395
+ }, yup.AnyObject, {
4396
+ userShortId: undefined;
4397
+ endpoint: undefined;
4398
+ keys: {
4399
+ p256dh: undefined;
4400
+ auth: undefined;
2996
4401
  };
2997
- signupContext: undefined;
2998
- profileVisibility: UserProfileVisibility.Public;
2999
- openToWork: false;
3000
- jobSearchUrgency: undefined;
3001
- jobLocations: "";
3002
- targetExperienceLevels: "";
3003
- jobRoles: "";
3004
- minSalary: 0;
3005
- minSalaryCurrency: "USD";
3006
- referralSource: undefined;
3007
- resumes: never[];
3008
- onboardingCompletedAt: undefined;
3009
- pendingPrefill: undefined;
3010
- recruiterProfile: undefined;
3011
- coordinatorProfile: undefined;
4402
+ expirationTime: undefined;
4403
+ userAgent: undefined;
4404
+ createdAt: undefined;
4405
+ lastSeenAt: undefined;
3012
4406
  }, "">;
3013
4407
 
3014
4408
  declare const UserLanguageSchema: yup.ObjectSchema<{
@@ -3027,6 +4421,7 @@ declare const UserGeneralDetailSchema: yup.ObjectSchema<{
3027
4421
  };
3028
4422
  headline: string | undefined;
3029
4423
  image: string | undefined;
4424
+ imageOriginal: string | undefined;
3030
4425
  aboutMe: string | undefined;
3031
4426
  email: string;
3032
4427
  mobile: string | null | undefined;
@@ -3062,6 +4457,7 @@ declare const UserGeneralDetailSchema: yup.ObjectSchema<{
3062
4457
  };
3063
4458
  headline: undefined;
3064
4459
  image: undefined;
4460
+ imageOriginal: undefined;
3065
4461
  aboutMe: undefined;
3066
4462
  email: undefined;
3067
4463
  mobile: undefined;
@@ -3103,8 +4499,8 @@ declare const WorkExperienceSchema: ObjectSchema<{
3103
4499
  dark?: string | null | undefined;
3104
4500
  light?: string | undefined;
3105
4501
  } | null | undefined;
3106
- type: PageType;
3107
4502
  name: string;
4503
+ type: PageType;
3108
4504
  };
3109
4505
  designation: string;
3110
4506
  duration: {
@@ -3187,8 +4583,8 @@ declare const EducationSchema: ObjectSchema<{
3187
4583
  dark?: string | null | undefined;
3188
4584
  light?: string | undefined;
3189
4585
  } | null | undefined;
3190
- type: PageType;
3191
4586
  name: string;
4587
+ type: PageType;
3192
4588
  };
3193
4589
  course: string;
3194
4590
  fieldOfStudy: string;
@@ -3266,7 +4662,38 @@ declare const EducationSchema: ObjectSchema<{
3266
4662
  studyType: undefined;
3267
4663
  }, "">;
3268
4664
 
3269
- declare const UserInterestSchema: yup.StringSchema<string, yup.AnyObject, undefined, "">;
4665
+ /**
4666
+ * One interest on a user profile, as a REFERENCE to a taxonomy entry.
4667
+ *
4668
+ * This was declared as a bare `string()` and that was simply wrong about the
4669
+ * data: a full census of the live users collection found 41,822 interest
4670
+ * entries, 100% of them objects, with `id`, `name` and `logo` present on every
4671
+ * single one. Not one string.
4672
+ *
4673
+ * The damage was silent and reached the UI. Because the schema said `string`,
4674
+ * every type derived from it said `string[]`, so an admin panel rendering
4675
+ * `{interest}` type-checked cleanly and printed `[object Object]` to the
4676
+ * operator. The public profile page had already worked around it by declaring
4677
+ * its own local `Interest` interface with the real shape, which is how a wrong
4678
+ * declaration survives: each consumer patches around it privately instead of
4679
+ * one fix at the source.
4680
+ *
4681
+ * `logo` is a material-symbols icon NAME (`cloud`, `code`, `psychology`), not a
4682
+ * URL or a storage key, so it is rendered as an icon rather than fetched.
4683
+ *
4684
+ * Every field is required because the data says so: there is no partial entry
4685
+ * among the 41,822, and these are written by picking an existing taxonomy
4686
+ * entry rather than typed free-hand.
4687
+ */
4688
+ declare const UserInterestSchema: yup.ObjectSchema<{
4689
+ id: string;
4690
+ name: string;
4691
+ logo: string;
4692
+ }, yup.AnyObject, {
4693
+ id: undefined;
4694
+ name: undefined;
4695
+ logo: undefined;
4696
+ }, "">;
3270
4697
 
3271
4698
  declare const UserProjectSchema: yup.ObjectSchema<{
3272
4699
  name: string;
@@ -3384,8 +4811,8 @@ declare const UserJobPreferencesSchema: yup.ObjectSchema<{
3384
4811
  dark?: string | null | undefined;
3385
4812
  light?: string | undefined;
3386
4813
  } | null | undefined;
3387
- type: PageType;
3388
4814
  name: string;
4815
+ type: PageType;
3389
4816
  };
3390
4817
  location: {
3391
4818
  placeId?: string | null | undefined;
@@ -3401,11 +4828,11 @@ declare const UserJobPreferencesSchema: yup.ObjectSchema<{
3401
4828
  };
3402
4829
  };
3403
4830
  designation: string;
4831
+ isRemote: boolean;
3404
4832
  duration: {
3405
4833
  [x: string]: string | boolean;
3406
4834
  [x: number]: string | boolean;
3407
4835
  };
3408
- isRemote: boolean;
3409
4836
  }[] | undefined;
3410
4837
  educations?: {
3411
4838
  description?: string | undefined;
@@ -3428,18 +4855,18 @@ declare const UserJobPreferencesSchema: yup.ObjectSchema<{
3428
4855
  dark?: string | null | undefined;
3429
4856
  light?: string | undefined;
3430
4857
  } | null | undefined;
3431
- type: PageType;
3432
4858
  name: string;
4859
+ type: PageType;
3433
4860
  };
4861
+ course: string;
4862
+ fieldOfStudy: string;
4863
+ studyType: NonNullable<StudyType | undefined>;
4864
+ isDistanceLearning: boolean;
3434
4865
  duration: {
3435
4866
  startDate: string;
3436
4867
  endDate: string | null;
3437
4868
  isActive: boolean;
3438
4869
  };
3439
- course: string;
3440
- fieldOfStudy: string;
3441
- isDistanceLearning: boolean;
3442
- studyType: NonNullable<StudyType | undefined>;
3443
4870
  }[] | undefined;
3444
4871
  aboutMe?: string | undefined;
3445
4872
  mobile?: string | undefined;
@@ -3476,8 +4903,8 @@ declare const RecruiterPageLinkSchema: yup.ObjectSchema<{
3476
4903
  dark?: string | null | undefined;
3477
4904
  light?: string | undefined;
3478
4905
  } | null | undefined;
3479
- type: PageType;
3480
4906
  name: string;
4907
+ type: PageType;
3481
4908
  };
3482
4909
  jobTitle: string | undefined;
3483
4910
  }, yup.AnyObject, {
@@ -3529,8 +4956,8 @@ declare const UserRecruiterProfileSchema: yup.ObjectSchema<{
3529
4956
  dark?: string | null | undefined;
3530
4957
  light?: string | undefined;
3531
4958
  } | null | undefined;
3532
- type: PageType;
3533
4959
  name: string;
4960
+ type: PageType;
3534
4961
  };
3535
4962
  }[];
3536
4963
  } | undefined;
@@ -3556,8 +4983,8 @@ declare const CoordinatorPageLinkSchema: yup.ObjectSchema<{
3556
4983
  dark?: string | null | undefined;
3557
4984
  light?: string | undefined;
3558
4985
  } | null | undefined;
3559
- type: PageType;
3560
4986
  name: string;
4987
+ type: PageType;
3561
4988
  };
3562
4989
  jobTitle: string | undefined;
3563
4990
  }, yup.AnyObject, {
@@ -3609,8 +5036,8 @@ declare const UserCoordinatorProfileSchema: yup.ObjectSchema<{
3609
5036
  dark?: string | null | undefined;
3610
5037
  light?: string | undefined;
3611
5038
  } | null | undefined;
3612
- type: PageType;
3613
5039
  name: string;
5040
+ type: PageType;
3614
5041
  };
3615
5042
  }[];
3616
5043
  } | undefined;
@@ -3618,6 +5045,37 @@ declare const UserCoordinatorProfileSchema: yup.ObjectSchema<{
3618
5045
  coordinatorProfile: undefined;
3619
5046
  }, "">;
3620
5047
 
5048
+ /**
5049
+ * A user, as this package defines one.
5050
+ *
5051
+ * DERIVED from `UserSchema`, never hand-written, so it cannot drift from the
5052
+ * shape the schema validates. Consumers project subsets of it (a listing
5053
+ * returns a handful of fields, a profile read returns more), which is why
5054
+ * every field a projection may omit is optional at the schema level.
5055
+ *
5056
+ * `shortId` and `slug` are assigned by the STORING service and are not part of
5057
+ * the validated input shape, so they are added here rather than in the schema.
5058
+ * `shortId` is the identifier to use everywhere; `authAccountId` is Better
5059
+ * Auth's id and belongs only in auth-related paths.
5060
+ */
5061
+ type User = InferType<typeof UserSchema> & {
5062
+ /** Public identifier, server-assigned. The id to key on. */
5063
+ shortId?: string;
5064
+ /** Public profile handle, server-assigned. */
5065
+ slug?: string;
5066
+ };
5067
+ /**
5068
+ * A stored push subscription, with the identifier the storing service assigns.
5069
+ *
5070
+ * Same split as `User`: `shortId` is server-assigned and so is not part of the
5071
+ * validated input shape. Note that the identifier consumers actually key on
5072
+ * here is `endpoint`, not `shortId` — it is what the browser re-sends on
5073
+ * re-subscribe and what a dead-subscription response names.
5074
+ */
5075
+ type PushSubscriptionRecord = InferType<typeof PushSubscriptionSchema> & {
5076
+ /** Public identifier, server-assigned. */
5077
+ shortId?: string;
5078
+ };
3621
5079
  type UserProfileOverview = {
3622
5080
  name: InferType<typeof UserGeneralDetailSchema>["name"];
3623
5081
  email: string;
@@ -3856,4 +5314,4 @@ declare const StudentCompletenessSchema: yup.ObjectSchema<{
3856
5314
  };
3857
5315
  }, "">;
3858
5316
 
3859
- export { AnswerChoiceType, ApplicationReceivePreference, BindingKind, BindingSchema, CAMPAIGN_MAX_RECIPIENTS_CEILING, CampaignAnchorField, CampaignEndKind, CampaignIntervalUnit, CampaignSchema, CampaignStatus, CampaignTriggerKind, CampaignTriggerSchema, ChoiceQuestionSchema, Common, CompensationType, CompletenessScoreSchema, ContactTypes, CoordinatorPageLinkSchema, DISPLAY_DATE_FORMAT, DISPLAY_DATE_FORMAT_SHORT, DateStringSchema, DbDefaultSchema, DefaultPaginatedResponse, DefaultPaginationOptions, DefaultUserRoles, DurationSchema, EMPTY_STRING, EducationLevel, EducationSchema, EmployeeCount, EmploymentType, ExperienceLevel, FEEDBACK_MESSAGE_MAX, FeedbackSchema, FeedbackStatus, FeedbackType, GeneraDetailFields, GroupManagedBy, GroupMembershipSchema, GroupMembershipStatus, GroupSchema, GroupStatus, GroupTranslationSchema, GroupVisibility, InputQuestionSchema, JOB_TAXONOMY, JobAlertFrequency, JobCategory, JobIndustry, JobSchema, JobSearchUrgency, JobStatus, JobSubCategory, ListFilterBranch, ListFilterBranchSchema, ListFilterSchema, LocationSchema, MIN_SALARY_LOWER_BOUND, MIN_SALARY_UPPER_BOUND, MailingListSchema, NotificationChannel, OccurrenceStatus, PREFILL_MIRRORED_KEYS, PRIVATE_PROFILE_FIELDS, PageSchema, PageStatus, PageType, type PaginatedResponse, PaginationSchema, PostSchema, PostStatus, type PrefillMirroredKey, type PrivateProfileField, ProficiencyLevel, QuestionSchema, QuestionType, ReadAndAcknowledgeQuestionSchema, RecruiterPageLinkSchema, ReferralSource, ReportReason, ReportSchema, ResourceType, SITEMAP_FORMAT, SYSTEM_DATE_FORMAT, SavedSearchSchema, SavedSearchStatus, SignupContextSource, SkillSchema, SocialAccount, SocialAccountSchema, StudentCompletenessSchema, StudyType, SupportedAnswerChoiceTypes, SupportedApplicationReceivePreferences, SupportedBindingKinds, SupportedCampaignAnchorFields, SupportedCampaignEndKinds, SupportedCampaignIntervalUnits, SupportedCampaignStatuses, SupportedCampaignTriggerKinds, SupportedCompensationTypes, SupportedContactTypes, SupportedEducationLevels, SupportedEmployeeCounts, SupportedEmploymentTypes, SupportedExperienceLevels, SupportedFeedbackStatuses, SupportedFeedbackTypes, SupportedJobAlertFrequencies, SupportedJobCategories, SupportedJobIndustries, SupportedJobSearchUrgencies, SupportedJobStatuses, SupportedJobSubCategories, SupportedNotificationChannels, SupportedOccurrenceStatuses, SupportedPageStatuses, SupportedPageTypes, SupportedPostStatuses, SupportedProficiencyLevels, SupportedQuestionTypes, SupportedReferralSources, SupportedReportReasons, SupportedResourceTypes, SupportedSalaryCurrencies, type SupportedSalaryCurrency, SupportedSavedSearchStatuses, SupportedSignupContextSources, SupportedSocialAccounts, SupportedStudyTypes, SupportedUserProfileVisibilities, SupportedUserRoles, SupportedUserStatuses, SupportedWorkModes, TAXONOMY_LABELS, type TChoiceQuestionSchema, type TDurationSchema, type TInputQuestionSchema, type TJobSchema, type TPostSchema, type TQuestionSchema, type TReadAndAcknowledgeQuestionSchema, type TUserIdAndCreatedAtSchema, TermsAcceptedSchema, UserAdditionalInfoSchema, UserCertificationSchema, UserCompletenessSchema, UserCoordinatorProfileSchema, UserDetailType, UserGeneralDetailSchema, UserIdAndCreatedAtSchema, UserInterestSchema, UserJobPreferencesSchema, UserLanguageSchema, type UserProfileOverview, UserProfileVisibility, UserProjectSchema, UserRecruiterProfileSchema, UserRole, UserSchema, UserSkillSchema, UserStatus, WorkExperienceSchema, WorkMode, categoryOfIndustry, categoryOfSubCategory, dateString, deriveIndustry, getSchemaByQuestion, industriesOfCategory, industryOfSubCategory, subCategoriesOfIndustry };
5317
+ export { AnswerChoiceType, ApplicationReceivePreference, BillingPeriod, BillingSubscriptionSchema, BillingTransactionSchema, CAMPAIGN_MAX_RECIPIENTS_CEILING, CONSUME_MAX_UNITS, CampaignDataSourceSchema, CampaignEndKind, CampaignIntervalUnit, CampaignSchema, CampaignStatus, CampaignStatusTransitions, CampaignTriggerKind, CampaignTriggerSchema, ChoiceQuestionSchema, type City, CityFilterSchema, CitySchema, Common, CompensationType, CompletenessScoreSchema, ContactTypes, CoordinatorPageLinkSchema, type Country, CountryFilterSchema, CountrySchema, type CountryTimezone, DISPLAY_DATE_FORMAT, DISPLAY_DATE_FORMAT_SHORT, DateStringSchema, DbDefaultSchema, DefaultPaginatedResponse, DefaultPaginationOptions, DefaultUserRoles, DurationSchema, EMPTY_STRING, EducationLevel, EducationSchema, EmployeeCount, EmploymentType, EntitlementConsumeSchema, EntitlementDenialReason, EntitlementDenialSchema, EntitlingSubscriptionStatuses, ExperienceLevel, FEEDBACK_MESSAGE_MAX, FeatureEntitlementSchema, FeatureKey, FeedbackFilterSchema, FeedbackSchema, FeedbackStatus, FeedbackType, GEO_COLLECTIONS, GEO_SEARCH_MAX, GRANT_MAX_LIMIT, GeneraDetailFields, GeoKind, type GeoSyncCounts, GeoSyncPhase, type GeoSyncRun, GeoSyncRunSchema, GeoSyncStatus, GeoSyncTrigger, type GeoTranslations, GrantType, GroupFilterSchema, GroupManagedBy, GroupMembershipSchema, GroupMembershipStatus, GroupSchema, GroupStatus, GroupTranslationSchema, GroupVisibility, InputQuestionSchema, JOB_TAXONOMY, JobAlertFrequency, JobCategory, JobFilterSchema, JobIndustry, JobSchema, JobSearchUrgency, JobStatus, JobSubCategory, LanguageFilterSchema, LocationSchema, MIN_SALARY_LOWER_BOUND, MIN_SALARY_UPPER_BOUND, MailingListFilterSchema, MailingListSchema, MoneySchema, NotificationType, OccurrenceStatus, PREFILL_MIRRORED_KEYS, PRIVATE_PROFILE_FIELDS, PaddleEnvironment, PaddlePriceIdsSchema, PageFilterSchema, PageSchema, PageStatus, PageType, type PaginatedResponse, PaginationSchema, PlanGrantSchema, PlanKind, PlanSchema, PlanStatus, PostSchema, PostStatus, type PrefillMirroredKey, type PrivateProfileField, ProficiencyLevel, type PushSubscriptionRecord, PushSubscriptionSchema, QuestionSchema, QuestionType, QuotaPeriod, ReadAndAcknowledgeQuestionSchema, RecruiterPageLinkSchema, ReferralSource, ReportReason, ReportSchema, ResourceType, SITEMAP_FORMAT, SYSTEM_DATE_FORMAT, SavedSearchSchema, SavedSearchStatus, SignupContextSource, SkillFilterSchema, SkillSchema, SocialAccount, SocialAccountSchema, type State, StateFilterSchema, StateSchema, StudentCompletenessSchema, StudyType, SubscriptionStatus, SupportedAnswerChoiceTypes, SupportedApplicationReceivePreferences, SupportedBillingPeriods, SupportedCampaignEndKinds, SupportedCampaignIntervalUnits, SupportedCampaignStatuses, SupportedCampaignTriggerKinds, SupportedCompensationTypes, SupportedContactTypes, SupportedEducationLevels, SupportedEmployeeCounts, SupportedEmploymentTypes, SupportedEntitlementDenialReasons, SupportedExperienceLevels, SupportedFeatureKeys, SupportedFeedbackStatuses, SupportedFeedbackTypes, SupportedGeoKinds, SupportedGeoSyncPhases, SupportedGeoSyncStatuses, SupportedGeoSyncTriggers, SupportedGrantTypes, SupportedGroupManagedBy, SupportedGroupMembershipStatuses, SupportedGroupStatuses, SupportedGroupVisibilities, SupportedJobAlertFrequencies, SupportedJobCategories, SupportedJobIndustries, SupportedJobSearchUrgencies, SupportedJobStatuses, SupportedJobSubCategories, SupportedNotificationTypes, SupportedOccurrenceStatuses, SupportedPaddleEnvironments, SupportedPageStatuses, SupportedPageTypes, SupportedPlanKinds, SupportedPlanStatuses, SupportedPostStatuses, SupportedProficiencyLevels, SupportedQuestionTypes, SupportedQuotaPeriods, SupportedReferralSources, SupportedReportReasons, SupportedResourceTypes, SupportedSalaryCurrencies, type SupportedSalaryCurrency, SupportedSavedSearchStatuses, SupportedSignupContextSources, SupportedSocialAccounts, SupportedStudyTypes, SupportedSubscriptionStatuses, SupportedTemplateVariableBindingKinds, SupportedTransactionStatuses, SupportedUserProfileVisibilities, SupportedUserRoles, SupportedUserStatuses, SupportedWorkModes, TAXONOMY_LABELS, type TChoiceQuestionSchema, type TDurationSchema, type TInputQuestionSchema, type TJobSchema, type TPostSchema, type TQuestionSchema, type TReadAndAcknowledgeQuestionSchema, type TUserIdAndCreatedAtSchema, TemplateVariableBindingKind, TemplateVariableBindingSchema, TerminalCampaignStatuses, TerminalGeoSyncStatuses, TermsAcceptedSchema, TransactionStatus, type User, UserAdditionalInfoSchema, UserCertificationSchema, UserCompletenessSchema, UserCoordinatorProfileSchema, UserDetailType, UserFilterSchema, UserGeneralDetailSchema, UserIdAndCreatedAtSchema, UserInterestSchema, UserJobPreferencesSchema, UserLanguageSchema, type UserProfileOverview, UserProfileVisibility, UserProjectSchema, UserRecruiterProfileSchema, UserRole, UserSchema, UserSkillSchema, UserStatus, WorkExperienceSchema, WorkMode, canTransitionCampaign, categoryOfIndustry, categoryOfSubCategory, codeTokens, conjunction, currencyBound, dateString, days, deriveIndustry, enumFacet, epoch, getSchemaByQuestion, industriesOfCategory, industryOfSubCategory, months, percent, qualified, rejectUnknownKeys, subCategoriesOfIndustry, tokens };