@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/CLAUDE.md +17 -0
- package/dist/index.cjs +2174 -722
- package/dist/index.d.cts +1992 -534
- package/dist/index.d.ts +1992 -534
- package/dist/index.js +2075 -696
- package/package.json +1 -1
- package/src/billing/billing.constant.ts +179 -0
- package/src/billing/billing.schema.ts +280 -0
- package/src/common/facet.schema.ts +342 -0
- package/src/feedback/feedback-filter.schema.ts +39 -0
- package/src/geo/city-filter.schema.ts +41 -0
- package/src/geo/city.schema.ts +104 -0
- package/src/geo/country-filter.schema.ts +47 -0
- package/src/geo/country.schema.ts +148 -0
- package/src/geo/geo-sync.schema.ts +116 -0
- package/src/geo/geo.constant.ts +78 -0
- package/src/geo/state-filter.schema.ts +57 -0
- package/src/geo/state.schema.ts +101 -0
- package/src/group/group-filter.schema.ts +81 -0
- package/src/group/group.constant.ts +15 -0
- package/src/index.ts +35 -0
- package/src/job/job-filter.schema.ts +266 -0
- package/src/language/language-filter.schema.ts +40 -0
- package/src/marketing/marketing.constant.ts +105 -30
- package/src/marketing/marketing.schema.ts +118 -403
- package/src/page/page-filter.schema.ts +67 -0
- package/src/skill/skill-filter.schema.ts +61 -0
- package/src/user/general-detail.schema.ts +7 -0
- package/src/user/push-subscription.schema.ts +86 -0
- package/src/user/user-filter.schema.ts +438 -0
- package/src/user/user-interest.schema.ts +34 -2
- package/src/user/user.constant.ts +20 -8
- package/src/user/user.schema.ts +45 -0
- package/src/user/user.types.ts +35 -0
package/dist/index.d.cts
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
|
-
|
|
1263
|
-
|
|
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
|
-
*
|
|
1271
|
-
*
|
|
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
|
-
*
|
|
1274
|
-
*
|
|
1275
|
-
*
|
|
1276
|
-
*
|
|
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
|
-
|
|
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
|
|
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
|
|
1347
|
-
*
|
|
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
|
-
*
|
|
1355
|
-
*
|
|
1356
|
-
*
|
|
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
|
|
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:
|
|
1373
|
-
|
|
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
|
-
|
|
1381
|
-
|
|
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:
|
|
1772
|
-
|
|
1773
|
-
|
|
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
|
-
|
|
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:
|
|
1930
|
-
|
|
1931
|
-
|
|
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
|
-
|
|
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:
|
|
2008
|
-
|
|
2009
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
*
|
|
2181
|
-
*
|
|
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
|
|
2184
|
-
|
|
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<
|
|
2828
|
+
kind: NonNullable<TemplateVariableBindingKind | undefined>;
|
|
2201
2829
|
};
|
|
2202
2830
|
[x: number]: {
|
|
2203
2831
|
value: string;
|
|
2204
|
-
kind: NonNullable<
|
|
2832
|
+
kind: NonNullable<TemplateVariableBindingKind | undefined>;
|
|
2205
2833
|
};
|
|
2206
2834
|
};
|
|
2207
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
2408
|
-
*
|
|
2409
|
-
*
|
|
2410
|
-
*
|
|
2411
|
-
*
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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
|
-
|
|
2931
|
-
|
|
2932
|
-
|
|
2933
|
-
|
|
2934
|
-
|
|
2935
|
-
|
|
2936
|
-
|
|
2937
|
-
|
|
2938
|
-
|
|
2939
|
-
|
|
2940
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2946
|
-
|
|
2947
|
-
|
|
2948
|
-
|
|
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
|
-
|
|
2955
|
-
|
|
2956
|
-
|
|
2957
|
-
|
|
2958
|
-
|
|
2959
|
-
|
|
2960
|
-
|
|
2961
|
-
|
|
2962
|
-
|
|
2963
|
-
|
|
2964
|
-
|
|
2965
|
-
|
|
2966
|
-
|
|
2967
|
-
|
|
2968
|
-
|
|
2969
|
-
|
|
2970
|
-
|
|
2971
|
-
|
|
2972
|
-
|
|
2973
|
-
|
|
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
|
-
|
|
2976
|
-
|
|
2977
|
-
|
|
2978
|
-
|
|
2979
|
-
|
|
2980
|
-
|
|
2981
|
-
|
|
2982
|
-
|
|
2983
|
-
|
|
2984
|
-
|
|
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
|
-
|
|
2998
|
-
|
|
2999
|
-
|
|
3000
|
-
|
|
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
|
-
|
|
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,
|
|
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 };
|