@thejob/schema 2.0.0 → 2.0.2
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/scheduled_tasks.lock +1 -0
- package/.claude/settings.local.json +138 -2
- package/dist/index.cjs +551 -146
- package/dist/index.d.cts +593 -89
- package/dist/index.d.ts +593 -89
- package/dist/index.js +514 -143
- package/package.json +1 -1
- package/src/common/common.constant.ts +30 -0
- package/src/common/common.schema.ts +14 -0
- package/src/extensions/date-string.extension.ts +1 -1
- package/src/index.ts +17 -0
- package/src/job/job.constant.ts +66 -0
- package/src/job/job.schema.ts +245 -0
- package/src/question/choice-question.schema.ts +96 -0
- package/src/question/index.ts +6 -0
- package/src/question/input-question.schema.ts +24 -0
- package/src/question/question.constant.ts +14 -0
- package/src/question/question.schema.ts +22 -0
- package/src/question/question.utils.ts +23 -0
- package/src/question/read-and-acknowledge.schema.ts +25 -0
- package/src/report/report.constant.ts +20 -0
- package/src/report/report.schema.ts +20 -0
- package/src/social-account/social-account.schema.ts +1 -1
- package/src/user/user-coordinator-profile.schema.ts +1 -1
- package/src/user/user-job-preferences.schema.ts +11 -11
- package/src/user/user-recruiter-profile.schema.ts +1 -1
- package/src/user/user.constant.ts +1 -1
package/dist/index.js
CHANGED
|
@@ -15,8 +15,34 @@ var CompletenessScoreSchema = (minScore = 50) => object().shape({
|
|
|
15
15
|
totalSteps: number().min(0).default(0).label("Total Steps"),
|
|
16
16
|
completedSteps: number().min(0).default(0).label("Completed Steps")
|
|
17
17
|
});
|
|
18
|
+
var UserIdAndCreatedAtSchema = object().shape({
|
|
19
|
+
userId: string().required().label("User Id"),
|
|
20
|
+
createdAt: string().required().label("Created At")
|
|
21
|
+
});
|
|
18
22
|
|
|
19
23
|
// src/common/common.constant.ts
|
|
24
|
+
var Common = /* @__PURE__ */ ((Common2) => {
|
|
25
|
+
Common2["Yes"] = "yes";
|
|
26
|
+
Common2["No"] = "no";
|
|
27
|
+
Common2["DateRangeOption"] = "date_range_option";
|
|
28
|
+
Common2["ExperienceLevel"] = "experience_level";
|
|
29
|
+
Common2["Company"] = "company";
|
|
30
|
+
Common2["EmploymentType"] = "employment_type";
|
|
31
|
+
Common2["WorkMode"] = "work_mode";
|
|
32
|
+
Common2["Location"] = "location";
|
|
33
|
+
Common2["CareerLevel"] = "career_level";
|
|
34
|
+
Common2["Category"] = "category";
|
|
35
|
+
Common2["Designation"] = "designation";
|
|
36
|
+
Common2["EducationLevel"] = "education_level";
|
|
37
|
+
Common2["Language"] = "language";
|
|
38
|
+
Common2["Skill"] = "skill";
|
|
39
|
+
return Common2;
|
|
40
|
+
})(Common || {});
|
|
41
|
+
var EMPTY_STRING = "eMpTyStRiNg";
|
|
42
|
+
var SYSTEM_DATE_FORMAT = "YYYY-MM-DD";
|
|
43
|
+
var DISPLAY_DATE_FORMAT = "LL";
|
|
44
|
+
var DISPLAY_DATE_FORMAT_SHORT = "MMMM, YYYY";
|
|
45
|
+
var SITEMAP_FORMAT = "YYYY-MM-DDThh:mm:ssZ";
|
|
20
46
|
var StudyType = /* @__PURE__ */ ((StudyType2) => {
|
|
21
47
|
StudyType2["FullTime"] = "full_time";
|
|
22
48
|
StudyType2["PartTime"] = "part_time";
|
|
@@ -198,6 +224,9 @@ var GroupMembershipSchema = object3({
|
|
|
198
224
|
updatedAt: number2().optional().label("Updated At")
|
|
199
225
|
});
|
|
200
226
|
|
|
227
|
+
// src/job/job.schema.ts
|
|
228
|
+
import { array as array8, boolean as boolean9, lazy, mixed as mixed3, number as number5, object as object16, string as string13 } from "yup";
|
|
229
|
+
|
|
201
230
|
// src/location/location.schema.ts
|
|
202
231
|
import { array as array2, number as number3, object as object4, string as string3 } from "yup";
|
|
203
232
|
var LocationSchema = object4({
|
|
@@ -330,7 +359,7 @@ var SupportedSocialAccounts = Object.values(SocialAccount);
|
|
|
330
359
|
|
|
331
360
|
// src/social-account/social-account.schema.ts
|
|
332
361
|
var SocialAccountSchema = object9().shape({
|
|
333
|
-
// TODO: Remove isNew
|
|
362
|
+
// TODO: Remove isNew - it's unused. Backend (user-social-accounts.service.ts) just strips it before saving.
|
|
334
363
|
isNew: boolean6().default(false).optional().label("Is New"),
|
|
335
364
|
type: string6().oneOf(SupportedSocialAccounts).required().label("Account Type"),
|
|
336
365
|
url: string6().required().label("URL")
|
|
@@ -376,15 +405,302 @@ var PageSchema = object10().shape({
|
|
|
376
405
|
followersCount: number4().min(0).optional().label("Followers Count")
|
|
377
406
|
}).concat(CompanySchema).concat(InstituteSchema).concat(DbDefaultSchema).noUnknown(true).strict(true).required().label("Page Schema");
|
|
378
407
|
|
|
408
|
+
// src/skill/skill.schema.ts
|
|
409
|
+
import { array as array6, object as object11, string as string8 } from "yup";
|
|
410
|
+
var SkillSchema = object11({
|
|
411
|
+
name: string8().trim().required().label("Skill Name"),
|
|
412
|
+
logo: object11({
|
|
413
|
+
light: string8().required().label("Light Logo"),
|
|
414
|
+
dark: string8().optional().nullable().label("Dark Logo")
|
|
415
|
+
}).optional().nullable().default(null).label("Logo"),
|
|
416
|
+
tags: array6().of(string8().max(50)).max(20).optional().label("Tags")
|
|
417
|
+
}).concat(DbDefaultSchema).noUnknown().strict().label("Skill");
|
|
418
|
+
|
|
419
|
+
// src/question/question.constant.ts
|
|
420
|
+
var QuestionType = /* @__PURE__ */ ((QuestionType2) => {
|
|
421
|
+
QuestionType2["Input"] = "input";
|
|
422
|
+
QuestionType2["Choice"] = "choice";
|
|
423
|
+
QuestionType2["ReadAndAcknowledge"] = "readAndAcknowledge";
|
|
424
|
+
return QuestionType2;
|
|
425
|
+
})(QuestionType || {});
|
|
426
|
+
var SupportedQuestionTypes = Object.values(QuestionType);
|
|
427
|
+
var AnswerChoiceType = /* @__PURE__ */ ((AnswerChoiceType2) => {
|
|
428
|
+
AnswerChoiceType2["Single"] = "single";
|
|
429
|
+
AnswerChoiceType2["Multiple"] = "multiple";
|
|
430
|
+
return AnswerChoiceType2;
|
|
431
|
+
})(AnswerChoiceType || {});
|
|
432
|
+
var SupportedAnswerChoiceTypes = Object.values(AnswerChoiceType);
|
|
433
|
+
|
|
434
|
+
// src/question/question.schema.ts
|
|
435
|
+
import { boolean as boolean8, object as object12, string as string9 } from "yup";
|
|
436
|
+
var QuestionSchema = object12().shape({
|
|
437
|
+
label: string9().max(50).optional().label("Label"),
|
|
438
|
+
default: boolean8().optional().default(false).label("Default"),
|
|
439
|
+
title: string9().required().max(200).label("Title"),
|
|
440
|
+
type: string9().oneOf(SupportedQuestionTypes).required().label("Type"),
|
|
441
|
+
isOptional: boolean8().optional().label("Mark if the question is optional"),
|
|
442
|
+
readonly: boolean8().optional().label("Readonly"),
|
|
443
|
+
isNew: boolean8().optional().label("Is New")
|
|
444
|
+
});
|
|
445
|
+
|
|
446
|
+
// src/question/input-question.schema.ts
|
|
447
|
+
import { object as object13, string as string10 } from "yup";
|
|
448
|
+
var InputQuestionSchema = QuestionSchema.concat(
|
|
449
|
+
object13().shape({
|
|
450
|
+
type: string10().oneOf(["input" /* Input */]).required().label("Question type"),
|
|
451
|
+
preferredAnswer: string10().max(100).optional().label("Preferred Answer"),
|
|
452
|
+
answers: string10().max(500).when("isOptional", {
|
|
453
|
+
is: (isOptional) => Boolean(isOptional),
|
|
454
|
+
then: (schema) => schema.optional(),
|
|
455
|
+
otherwise: (schema) => schema.required()
|
|
456
|
+
}).label("Answer")
|
|
457
|
+
})
|
|
458
|
+
);
|
|
459
|
+
|
|
460
|
+
// src/question/choice-question.schema.ts
|
|
461
|
+
import { array as array7, mixed as mixed2, object as object14, string as string11 } from "yup";
|
|
462
|
+
var ChoicePreferredAnswerSchema = (label = "Preferred answer") => mixed2().when("answerChoiceType", {
|
|
463
|
+
is: (value) => value === "multiple" /* Multiple */,
|
|
464
|
+
then: () => array7(string11()).test(
|
|
465
|
+
"is-valid-option",
|
|
466
|
+
`${label} must be from the provided options`,
|
|
467
|
+
function(answer) {
|
|
468
|
+
const { options = [] } = this.parent;
|
|
469
|
+
if (answer && answer.length > 0) {
|
|
470
|
+
return answer.every((a) => options.includes(a));
|
|
471
|
+
}
|
|
472
|
+
return true;
|
|
473
|
+
}
|
|
474
|
+
).optional().label(label),
|
|
475
|
+
otherwise: () => string11().test(
|
|
476
|
+
"is-valid-option",
|
|
477
|
+
`${label} must be from the provided options`,
|
|
478
|
+
function(answer) {
|
|
479
|
+
const { options = [] } = this.parent;
|
|
480
|
+
return !answer || options.includes(answer);
|
|
481
|
+
}
|
|
482
|
+
).optional().label(label)
|
|
483
|
+
});
|
|
484
|
+
var getChoiceAnswerSchema = (answerChoiceType, isOptional) => {
|
|
485
|
+
if (answerChoiceType === "multiple" /* Multiple */) {
|
|
486
|
+
const multiAnswerSchema = array7(string11().max(500));
|
|
487
|
+
return isOptional ? multiAnswerSchema.optional().default([]) : multiAnswerSchema.min(1, "Select at least one option.").required("Select at least one option.").default([]);
|
|
488
|
+
}
|
|
489
|
+
const singleAnswerSchema = string11().max(500);
|
|
490
|
+
return isOptional ? singleAnswerSchema.optional() : singleAnswerSchema.required("Select an option.");
|
|
491
|
+
};
|
|
492
|
+
var ChoiceQuestionSchema = QuestionSchema.concat(
|
|
493
|
+
object14().shape({
|
|
494
|
+
type: string11().oneOf(["choice" /* Choice */]).required().label("Question type"),
|
|
495
|
+
optionsFrom: string11().oneOf(["skill" /* Skill */, "education_level" /* EducationLevel */, "experience_level" /* ExperienceLevel */]).optional().label("Option field"),
|
|
496
|
+
options: array7(string11().required()).min(1).required().label("Options"),
|
|
497
|
+
answerChoiceType: string11().oneOf(SupportedAnswerChoiceTypes).required().default("single" /* Single */).label("Type"),
|
|
498
|
+
preferredAnswer: ChoicePreferredAnswerSchema("Preferred answer"),
|
|
499
|
+
answers: mixed2().when(
|
|
500
|
+
["answerChoiceType", "isOptional"],
|
|
501
|
+
([answerChoiceType, isOptional]) => getChoiceAnswerSchema(answerChoiceType, isOptional)
|
|
502
|
+
)
|
|
503
|
+
})
|
|
504
|
+
);
|
|
505
|
+
|
|
506
|
+
// src/question/read-and-acknowledge.schema.ts
|
|
507
|
+
import { object as object15, string as string12 } from "yup";
|
|
508
|
+
var AcknowledgeAnswerSchema = string12().oneOf(["yes" /* Yes */, "no" /* No */]).required("This question must be acknowledged.");
|
|
509
|
+
var ReadAndAcknowledgeQuestionSchema = QuestionSchema.concat(
|
|
510
|
+
object15().shape({
|
|
511
|
+
type: string12().oneOf(["readAndAcknowledge" /* ReadAndAcknowledge */]).required().label("Question type"),
|
|
512
|
+
description: string12().max(1e4).required().label("Content"),
|
|
513
|
+
preferredAnswer: AcknowledgeAnswerSchema.label("Preferred Answer"),
|
|
514
|
+
answers: AcknowledgeAnswerSchema.label("Answer")
|
|
515
|
+
})
|
|
516
|
+
);
|
|
517
|
+
|
|
518
|
+
// src/question/question.utils.ts
|
|
519
|
+
var getSchemaByQuestion = (type) => {
|
|
520
|
+
switch (type) {
|
|
521
|
+
case "input" /* Input */:
|
|
522
|
+
return InputQuestionSchema;
|
|
523
|
+
case "choice" /* Choice */:
|
|
524
|
+
return ChoiceQuestionSchema;
|
|
525
|
+
case "readAndAcknowledge" /* ReadAndAcknowledge */:
|
|
526
|
+
return ReadAndAcknowledgeQuestionSchema;
|
|
527
|
+
default:
|
|
528
|
+
throw new Error("Unsupported schema: " + type);
|
|
529
|
+
}
|
|
530
|
+
};
|
|
531
|
+
|
|
532
|
+
// src/job/job.constant.ts
|
|
533
|
+
var JobStatus = /* @__PURE__ */ ((JobStatus2) => {
|
|
534
|
+
JobStatus2["Published"] = "published";
|
|
535
|
+
JobStatus2["Draft"] = "draft";
|
|
536
|
+
JobStatus2["Deleted"] = "deleted";
|
|
537
|
+
JobStatus2["Closed"] = "closed";
|
|
538
|
+
JobStatus2["Expired"] = "expired";
|
|
539
|
+
return JobStatus2;
|
|
540
|
+
})(JobStatus || {});
|
|
541
|
+
var SupportedJobStatuses = Object.values(JobStatus);
|
|
542
|
+
var EmploymentType = /* @__PURE__ */ ((EmploymentType2) => {
|
|
543
|
+
EmploymentType2["Fulltime"] = "full_time";
|
|
544
|
+
EmploymentType2["PartTime"] = "part_time";
|
|
545
|
+
EmploymentType2["Temporary"] = "temporary";
|
|
546
|
+
EmploymentType2["Contract"] = "contract";
|
|
547
|
+
EmploymentType2["Internship"] = "internship";
|
|
548
|
+
EmploymentType2["Freelance"] = "freelance";
|
|
549
|
+
EmploymentType2["Volunteer"] = "volunteer";
|
|
550
|
+
EmploymentType2["PerDiem"] = "per_diem";
|
|
551
|
+
return EmploymentType2;
|
|
552
|
+
})(EmploymentType || {});
|
|
553
|
+
var SupportedEmploymentTypes = Object.values(EmploymentType);
|
|
554
|
+
var WorkMode = /* @__PURE__ */ ((WorkMode2) => {
|
|
555
|
+
WorkMode2["OnSite"] = "on_site";
|
|
556
|
+
WorkMode2["Hybrid"] = "hybrid";
|
|
557
|
+
WorkMode2["Remote"] = "remote";
|
|
558
|
+
return WorkMode2;
|
|
559
|
+
})(WorkMode || {});
|
|
560
|
+
var SupportedWorkModes = Object.values(WorkMode);
|
|
561
|
+
var CompensationType = /* @__PURE__ */ ((CompensationType2) => {
|
|
562
|
+
CompensationType2["Hourly"] = "hourly";
|
|
563
|
+
CompensationType2["Weekly"] = "weekly";
|
|
564
|
+
CompensationType2["Monthly"] = "monthly";
|
|
565
|
+
CompensationType2["Yearly"] = "yearly";
|
|
566
|
+
CompensationType2["OneTime"] = "one-time";
|
|
567
|
+
CompensationType2["Other"] = "other";
|
|
568
|
+
return CompensationType2;
|
|
569
|
+
})(CompensationType || {});
|
|
570
|
+
var SupportedCompensationTypes = Object.values(CompensationType);
|
|
571
|
+
var EmployeeCount = /* @__PURE__ */ ((EmployeeCount2) => {
|
|
572
|
+
EmployeeCount2["_1_2"] = "1_2_employees";
|
|
573
|
+
EmployeeCount2["_3_10"] = "3_10_employees";
|
|
574
|
+
EmployeeCount2["_11_100"] = "11_100_employees";
|
|
575
|
+
EmployeeCount2["_101_1000"] = "101_1000_employees";
|
|
576
|
+
EmployeeCount2["_1001_5000"] = "1001_5000_employees";
|
|
577
|
+
EmployeeCount2["_5001_10000"] = "5001_10000_employees";
|
|
578
|
+
EmployeeCount2["_10001_Plus"] = "10001_plus_employees";
|
|
579
|
+
return EmployeeCount2;
|
|
580
|
+
})(EmployeeCount || {});
|
|
581
|
+
var SupportedEmployeeCounts = Object.values(EmployeeCount);
|
|
582
|
+
var ApplicationReceivePreference = /* @__PURE__ */ ((ApplicationReceivePreference2) => {
|
|
583
|
+
ApplicationReceivePreference2["Inbox"] = "inbox";
|
|
584
|
+
ApplicationReceivePreference2["Email"] = "email";
|
|
585
|
+
ApplicationReceivePreference2["ExternalWebsite"] = "external_website";
|
|
586
|
+
return ApplicationReceivePreference2;
|
|
587
|
+
})(ApplicationReceivePreference || {});
|
|
588
|
+
var SupportedApplicationReceivePreferences = Object.values(
|
|
589
|
+
ApplicationReceivePreference
|
|
590
|
+
);
|
|
591
|
+
|
|
592
|
+
// src/job/job.schema.ts
|
|
593
|
+
var JobSchema = object16({
|
|
594
|
+
/** Unique id usable by external systems to reference the job. */
|
|
595
|
+
uniqueId: string13().optional().label("Unique ID"),
|
|
596
|
+
/** Job title shown in listings and search. */
|
|
597
|
+
headline: string13().required().min(5).max(150).label("Headline"),
|
|
598
|
+
/** User-friendly, unique URL identifier. */
|
|
599
|
+
slug: string13().required().max(250).label("Slug"),
|
|
600
|
+
/** How applications are received (inbox vs external website). */
|
|
601
|
+
applicationReceivePreference: mixed3().oneOf([
|
|
602
|
+
"inbox" /* Inbox */,
|
|
603
|
+
"external_website" /* ExternalWebsite */
|
|
604
|
+
]).required().label("Preference"),
|
|
605
|
+
/** Required when applicationReceivePreference is ExternalWebsite. */
|
|
606
|
+
externalApplyLink: string13().when("applicationReceivePreference", {
|
|
607
|
+
is: (value) => value === "external_website" /* ExternalWebsite */,
|
|
608
|
+
then: (schema) => schema.url().required().label("Apply for Job link"),
|
|
609
|
+
otherwise: (schema) => schema.optional()
|
|
610
|
+
}),
|
|
611
|
+
/** Company the job belongs to (subset of PageSchema). */
|
|
612
|
+
company: PageSchema.pick(["name", "slug", "type", "logo"]).deepPartial().concat(PageSchema.pick(["name", "type"])).required().label("Company"),
|
|
613
|
+
/** @deprecated kept for backwards compatibility. */
|
|
614
|
+
designation: string13().optional().nullable().label("Designation"),
|
|
615
|
+
employmentType: string13().required().label("Employment type"),
|
|
616
|
+
workMode: string13().required().label("Work mode"),
|
|
617
|
+
skills: array8().of(SkillSchema.pick(["name", "logo"]).required().label("Skill")).nullable().optional().label("Skills"),
|
|
618
|
+
bookmarks: array8().of(UserIdAndCreatedAtSchema).optional().label("Bookmarks"),
|
|
619
|
+
embedding: object16({
|
|
620
|
+
vector: array8(number5().required()).optional().label("Embedding vector"),
|
|
621
|
+
model: string13().optional().label("Embedding model")
|
|
622
|
+
}).nullable().optional().label("Embedding"),
|
|
623
|
+
applicants: array8().of(UserIdAndCreatedAtSchema).optional().label("Applicants"),
|
|
624
|
+
applicantCount: number5().optional().label("Applicant count"),
|
|
625
|
+
externalApplicationLinkClickCount: number5().optional().label("External application link click count"),
|
|
626
|
+
description: string13().required().min(100).max(5e4).label("Description"),
|
|
627
|
+
descriptionMarkdown: string13().required().label("Description Markdown"),
|
|
628
|
+
descriptionHTML: string13().optional().label("Description HTML"),
|
|
629
|
+
/**
|
|
630
|
+
* Job locations. Required even for remote roles (compliance/legal). Defaults
|
|
631
|
+
* to an empty array; min(1) is intentionally not enforced yet.
|
|
632
|
+
*/
|
|
633
|
+
locations: array8().of(LocationSchema).default([]).label("Location"),
|
|
634
|
+
educationLevel: array8(string13().oneOf(SupportedEducationLevels)).required().min(1).label("Educational level"),
|
|
635
|
+
/** Posting validity window (start/expiry). */
|
|
636
|
+
validity: DurationSchema({
|
|
637
|
+
format: SYSTEM_DATE_FORMAT,
|
|
638
|
+
startLabel: "Start Date",
|
|
639
|
+
endLabel: "Expiry Date"
|
|
640
|
+
}).label("Validity"),
|
|
641
|
+
experienceLevel: string13().oneOf(SupportedExperienceLevels).nullable().optional().label("Experience level"),
|
|
642
|
+
contactEmail: string13().email().nullable().optional().label("Contact email"),
|
|
643
|
+
workingHoursPerWeek: number5().nullable().optional().min(1).max(24 * 7).label("Working hours per week"),
|
|
644
|
+
tags: array8().max(50).optional().label("Tags"),
|
|
645
|
+
/** Direct/Quick-apply questionnaire. Each item is validated against the
|
|
646
|
+
* concrete question schema for its `type`, with the stored `answers` omitted. */
|
|
647
|
+
questionnaire: array8().of(
|
|
648
|
+
lazy((question) => {
|
|
649
|
+
const schema = getSchemaByQuestion(question.type);
|
|
650
|
+
if (question.type === "input" /* Input */) {
|
|
651
|
+
return schema.omit([
|
|
652
|
+
"answers"
|
|
653
|
+
]);
|
|
654
|
+
} else if (question.type === "choice" /* Choice */) {
|
|
655
|
+
return schema.omit([
|
|
656
|
+
"answers"
|
|
657
|
+
]);
|
|
658
|
+
} else if (question.type === "readAndAcknowledge" /* ReadAndAcknowledge */) {
|
|
659
|
+
return schema.omit(["answers"]);
|
|
660
|
+
}
|
|
661
|
+
return schema;
|
|
662
|
+
})
|
|
663
|
+
).label("Questionnaire"),
|
|
664
|
+
status: string13().oneOf(SupportedJobStatuses).default("draft" /* Draft */).required().label("Status"),
|
|
665
|
+
seoTags: object16({
|
|
666
|
+
description: string13().optional().label("Description"),
|
|
667
|
+
keywords: array8().of(string13()).optional().label("Keywords")
|
|
668
|
+
}).nullable().optional().label("SEO Tags"),
|
|
669
|
+
jdSummary: string13().optional().label("JD Summary"),
|
|
670
|
+
canCreateAlert: boolean9().optional().label("Can create alert"),
|
|
671
|
+
canDirectApply: boolean9().optional().label("Can direct apply"),
|
|
672
|
+
hasApplied: boolean9().optional().label("Has applied"),
|
|
673
|
+
isOwner: boolean9().optional().label("Is owner"),
|
|
674
|
+
hasBookmarked: boolean9().optional().label("Has bookmarked"),
|
|
675
|
+
hasReported: boolean9().optional().label("Has reported"),
|
|
676
|
+
ratePerHour: number5().optional().min(0).label("Rate per hour"),
|
|
677
|
+
isPromoted: boolean9().optional().label("Is promoted"),
|
|
678
|
+
salaryRange: object16({
|
|
679
|
+
currency: string13().required().label("Currency").default("USD"),
|
|
680
|
+
min: number5().nullable().optional().min(0).label("Minimum Salary"),
|
|
681
|
+
max: number5().nullable().optional().min(0).label("Maximum Salary"),
|
|
682
|
+
compensationType: string13().oneOf(SupportedCompensationTypes).nullable().optional().label("Compensation Type"),
|
|
683
|
+
isNegotiable: boolean9().nullable().optional().default(true).label("Is Negotiable")
|
|
684
|
+
}).nullable().optional().label("Salary Range"),
|
|
685
|
+
reports: array8().of(UserIdAndCreatedAtSchema).optional().label("Reports"),
|
|
686
|
+
category: string13().nullable().optional().label("Category"),
|
|
687
|
+
industry: string13().nullable().optional().label("Industry"),
|
|
688
|
+
subCategories: array8().of(string13().trim().required()).nullable().optional().label("Sub Categories"),
|
|
689
|
+
termsAccepted: boolean9().oneOf([true], "Accept terms before proceeding").required("Accept terms before proceeding").label("Terms accepted"),
|
|
690
|
+
isFeatured: boolean9().optional().default(false).label("Is featured"),
|
|
691
|
+
/** Market country codes to feature this job in; empty = global. */
|
|
692
|
+
featuredMarkets: array8().of(string13().required()).optional().default([]).label("Featured markets")
|
|
693
|
+
}).concat(DbDefaultSchema).noUnknown().label("Job");
|
|
694
|
+
|
|
379
695
|
// src/pagination/pagination.schema.ts
|
|
380
|
-
import { number as
|
|
381
|
-
var PaginationSchema =
|
|
382
|
-
page:
|
|
383
|
-
limit:
|
|
384
|
-
sortBy:
|
|
385
|
-
nextPage:
|
|
386
|
-
prevPage:
|
|
387
|
-
sortDirection:
|
|
696
|
+
import { number as number6, object as object17, string as string14 } from "yup";
|
|
697
|
+
var PaginationSchema = object17().shape({
|
|
698
|
+
page: number6().required().min(1).label("Page").default(1),
|
|
699
|
+
limit: number6().required().min(1).max(100).label("Limit").default(10),
|
|
700
|
+
sortBy: string14().notOneOf([""]).optional().label("SortBy"),
|
|
701
|
+
nextPage: string14().optional().label("Next Page Token"),
|
|
702
|
+
prevPage: string14().optional().label("Previous Page Token"),
|
|
703
|
+
sortDirection: string14().oneOf(["asc", "desc"]).optional().label("Sort Direction")
|
|
388
704
|
});
|
|
389
705
|
|
|
390
706
|
// src/pagination/pagination.constant.ts
|
|
@@ -399,19 +715,40 @@ var DefaultPaginationOptions = {
|
|
|
399
715
|
limit: 10
|
|
400
716
|
};
|
|
401
717
|
|
|
402
|
-
// src/
|
|
403
|
-
import {
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
718
|
+
// src/report/report.schema.ts
|
|
719
|
+
import { mixed as mixed4, object as object18, string as string15 } from "yup";
|
|
720
|
+
|
|
721
|
+
// src/report/report.constant.ts
|
|
722
|
+
var ResourceType = /* @__PURE__ */ ((ResourceType3) => {
|
|
723
|
+
ResourceType3["Job"] = "job";
|
|
724
|
+
ResourceType3["User"] = "user";
|
|
725
|
+
ResourceType3["Resume"] = "resume";
|
|
726
|
+
ResourceType3["Company"] = "company";
|
|
727
|
+
return ResourceType3;
|
|
728
|
+
})(ResourceType || {});
|
|
729
|
+
var SupportedResourceTypes = Object.values(ResourceType);
|
|
730
|
+
var ReportReason = /* @__PURE__ */ ((ReportReason3) => {
|
|
731
|
+
ReportReason3["OffensiveOrHarassing"] = "offensive_or_harassing";
|
|
732
|
+
ReportReason3["JobExpired"] = "job_expired";
|
|
733
|
+
ReportReason3["AskingMoney"] = "asking_money";
|
|
734
|
+
ReportReason3["FakeJob"] = "fake_job";
|
|
735
|
+
ReportReason3["IncorrectJobDetails"] = "incorrect_job_details";
|
|
736
|
+
ReportReason3["SellingSomething"] = "selling_something";
|
|
737
|
+
ReportReason3["Other"] = "other";
|
|
738
|
+
return ReportReason3;
|
|
739
|
+
})(ReportReason || {});
|
|
740
|
+
var SupportedReportReasons = Object.values(ReportReason);
|
|
741
|
+
|
|
742
|
+
// src/report/report.schema.ts
|
|
743
|
+
var ReportSchema = object18({
|
|
744
|
+
type: mixed4().oneOf(SupportedResourceTypes).required().label("Type"),
|
|
745
|
+
resourceId: string15().required().label("Resource ID"),
|
|
746
|
+
reason: mixed4().oneOf(SupportedReportReasons).required("Please choose a reason").label("Reason"),
|
|
747
|
+
comment: string15().max(1e3).optional().label("Comment")
|
|
748
|
+
}).label("Report Schema");
|
|
412
749
|
|
|
413
750
|
// src/user/user.schema.ts
|
|
414
|
-
import { array as
|
|
751
|
+
import { array as array12, number as number8, object as object30, string as string28 } from "yup";
|
|
415
752
|
|
|
416
753
|
// src/user/user.constant.ts
|
|
417
754
|
var UserRole = /* @__PURE__ */ ((UserRole2) => {
|
|
@@ -493,51 +830,51 @@ var MIN_SALARY_LOWER_BOUND = 0;
|
|
|
493
830
|
var MIN_SALARY_UPPER_BOUND = 1e6;
|
|
494
831
|
|
|
495
832
|
// src/user/work-experience.schema.ts
|
|
496
|
-
import { boolean as
|
|
497
|
-
var WorkExperienceSchema =
|
|
833
|
+
import { boolean as boolean10, object as object19, string as string16 } from "yup";
|
|
834
|
+
var WorkExperienceSchema = object19().shape({
|
|
498
835
|
company: PageSchema.pick(["name", "slug", "type", "logo"]).deepPartial().concat(PageSchema.pick(["name", "type"])).required().label("Company"),
|
|
499
|
-
designation:
|
|
836
|
+
designation: string16().trim().required().label("Designation"),
|
|
500
837
|
duration: DurationSchema({
|
|
501
838
|
format: "YYYY-MM",
|
|
502
839
|
startLabel: "Start Date",
|
|
503
840
|
endLabel: "End Date"
|
|
504
841
|
}).required().label("Duration"),
|
|
505
|
-
description:
|
|
842
|
+
description: string16().trim().max(3e3).optional().label("Description"),
|
|
506
843
|
location: LocationSchema.required().label("Location"),
|
|
507
|
-
isRemote:
|
|
844
|
+
isRemote: boolean10().oneOf([true, false]).default(false).label("Is Remote")
|
|
508
845
|
}).noUnknown().strict().label("Work Experience");
|
|
509
846
|
|
|
510
847
|
// src/user/education.schema.ts
|
|
511
|
-
import { boolean as
|
|
512
|
-
var EducationSchema =
|
|
848
|
+
import { boolean as boolean11, object as object20, string as string17 } from "yup";
|
|
849
|
+
var EducationSchema = object20({
|
|
513
850
|
institute: PageSchema.pick(["name", "slug", "type", "logo"]).deepPartial().concat(PageSchema.pick(["name", "type"])).required().label("Institute"),
|
|
514
|
-
course:
|
|
515
|
-
fieldOfStudy:
|
|
851
|
+
course: string17().trim().required().label("Course"),
|
|
852
|
+
fieldOfStudy: string17().trim().required().label("Field of Study"),
|
|
516
853
|
duration: DurationSchema({
|
|
517
854
|
format: "YYYY-MM",
|
|
518
855
|
startLabel: "Start Date",
|
|
519
856
|
endLabel: "End Date"
|
|
520
857
|
}).required().label("Duration"),
|
|
521
|
-
description:
|
|
522
|
-
isDistanceLearning:
|
|
858
|
+
description: string17().trim().max(3e3).optional().label("Description"),
|
|
859
|
+
isDistanceLearning: boolean11().default(false).label("Is Distance Learning"),
|
|
523
860
|
location: LocationSchema.required().label("Location"),
|
|
524
|
-
studyType:
|
|
861
|
+
studyType: string17().oneOf(SupportedStudyTypes).trim().max(50).required().label("Study Type")
|
|
525
862
|
}).noUnknown().strict().label("Education");
|
|
526
863
|
|
|
527
864
|
// src/user/user-skill.schema.ts
|
|
528
|
-
import { object as
|
|
529
|
-
var UserSkillSchema =
|
|
530
|
-
name:
|
|
531
|
-
proficiencyLevel:
|
|
865
|
+
import { object as object21, string as string18 } from "yup";
|
|
866
|
+
var UserSkillSchema = object21({
|
|
867
|
+
name: string18().required().label("Name"),
|
|
868
|
+
proficiencyLevel: string18().oneOf(SupportedProficiencyLevels).required().label("Proficiency Level"),
|
|
532
869
|
lastUsed: dateString().format("YYYY-MM").nullable().optional().label("Last Used")
|
|
533
870
|
}).noUnknown().strict().label("Skill");
|
|
534
871
|
|
|
535
872
|
// src/user/project.schema.ts
|
|
536
|
-
import { object as
|
|
537
|
-
var UserProjectSchema =
|
|
538
|
-
name:
|
|
539
|
-
url:
|
|
540
|
-
description:
|
|
873
|
+
import { object as object22, string as string19 } from "yup";
|
|
874
|
+
var UserProjectSchema = object22({
|
|
875
|
+
name: string19().trim().max(50).required().label("Name"),
|
|
876
|
+
url: string19().optional().label("URL"),
|
|
877
|
+
description: string19().trim().min(100).max(3e3).required().label("Description"),
|
|
541
878
|
duration: DurationSchema({
|
|
542
879
|
format: "YYYY-MM",
|
|
543
880
|
startLabel: "Start Date",
|
|
@@ -546,118 +883,118 @@ var UserProjectSchema = object16({
|
|
|
546
883
|
}).noUnknown().strict().label("Project");
|
|
547
884
|
|
|
548
885
|
// src/user/user-certification.schema.ts
|
|
549
|
-
import { object as
|
|
550
|
-
var UserCertificationSchema =
|
|
551
|
-
name:
|
|
886
|
+
import { object as object23, string as string20 } from "yup";
|
|
887
|
+
var UserCertificationSchema = object23({
|
|
888
|
+
name: string20().trim().max(100).required().label("Name"),
|
|
552
889
|
// TODO: Add validation for authority
|
|
553
|
-
authority:
|
|
554
|
-
licenseNumber:
|
|
890
|
+
authority: string20().trim().max(100).required().label("Authority"),
|
|
891
|
+
licenseNumber: string20().trim().max(50).optional().label("License Number"),
|
|
555
892
|
duration: DurationSchema({
|
|
556
893
|
format: "YYYY-MM",
|
|
557
894
|
startLabel: "Start Date",
|
|
558
895
|
endLabel: "End Date"
|
|
559
896
|
}).optional().nullable().label("Duration"),
|
|
560
|
-
url:
|
|
897
|
+
url: string20().optional().label("URL")
|
|
561
898
|
}).noUnknown().strict().label("Certification");
|
|
562
899
|
|
|
563
900
|
// src/user/user-interest.schema.ts
|
|
564
|
-
import { string as
|
|
565
|
-
var UserInterestSchema =
|
|
901
|
+
import { string as string21 } from "yup";
|
|
902
|
+
var UserInterestSchema = string21().trim().required().label("Interest");
|
|
566
903
|
|
|
567
904
|
// src/user/user-language.schema.ts
|
|
568
|
-
import { object as
|
|
569
|
-
var UserLanguageSchema =
|
|
570
|
-
name:
|
|
571
|
-
proficiencyLevel:
|
|
905
|
+
import { object as object24, string as string22 } from "yup";
|
|
906
|
+
var UserLanguageSchema = object24({
|
|
907
|
+
name: string22().trim().required().label("Name"),
|
|
908
|
+
proficiencyLevel: string22().oneOf(SupportedProficiencyLevels).trim().max(50).required().label("Proficiency Level")
|
|
572
909
|
}).noUnknown().strict().label("Language");
|
|
573
910
|
|
|
574
911
|
// src/user/user-additional-info.schema.ts
|
|
575
|
-
import { object as
|
|
576
|
-
var UserAdditionalInfoSchema =
|
|
577
|
-
title:
|
|
578
|
-
description:
|
|
912
|
+
import { object as object25, string as string23 } from "yup";
|
|
913
|
+
var UserAdditionalInfoSchema = object25({
|
|
914
|
+
title: string23().trim().max(60).required().label("Title"),
|
|
915
|
+
description: string23().trim().max(1e3).required().label("Description")
|
|
579
916
|
}).noUnknown().strict().label("User Additional Info");
|
|
580
917
|
|
|
581
918
|
// src/user/general-detail.schema.ts
|
|
582
|
-
import { object as
|
|
583
|
-
var UserGeneralDetailSchema =
|
|
584
|
-
id:
|
|
585
|
-
name:
|
|
586
|
-
first:
|
|
587
|
-
last:
|
|
919
|
+
import { object as object26, string as string24 } from "yup";
|
|
920
|
+
var UserGeneralDetailSchema = object26({
|
|
921
|
+
id: string24().optional().label("ID"),
|
|
922
|
+
name: object26().shape({
|
|
923
|
+
first: string24().trim().max(50).required().label("First Name"),
|
|
924
|
+
last: string24().trim().max(50).optional().label("Last Name")
|
|
588
925
|
}).required().label("Name"),
|
|
589
|
-
headline:
|
|
590
|
-
image:
|
|
591
|
-
aboutMe:
|
|
592
|
-
email:
|
|
593
|
-
mobile:
|
|
594
|
-
emailVerified:
|
|
595
|
-
mobileVerified:
|
|
596
|
-
experienceLevel:
|
|
926
|
+
headline: string24().trim().max(200).optional().label("Headline"),
|
|
927
|
+
image: string24().optional().label("Image"),
|
|
928
|
+
aboutMe: string24().trim().max(3e3).optional().label("About Me"),
|
|
929
|
+
email: string24().required().label("Email"),
|
|
930
|
+
mobile: string24().nullable().optional().label("Mobile"),
|
|
931
|
+
emailVerified: string24().nullable().optional().label("Email Verified"),
|
|
932
|
+
mobileVerified: string24().nullable().optional().label("Mobile Verified"),
|
|
933
|
+
experienceLevel: string24().oneOf(SupportedExperienceLevels).required().label("Experience level"),
|
|
597
934
|
location: LocationSchema.required().label("Location"),
|
|
598
|
-
region:
|
|
599
|
-
country:
|
|
600
|
-
lang:
|
|
935
|
+
region: object26().shape({
|
|
936
|
+
country: string24().trim().required().label("Region Country"),
|
|
937
|
+
lang: string24().trim().required().label("Region Language")
|
|
601
938
|
}).optional().default(void 0).label("Region"),
|
|
602
|
-
profileVisibility:
|
|
939
|
+
profileVisibility: string24().oneOf(SupportedUserProfileVisibilities).default("public" /* Public */).label("Profile Visibility")
|
|
603
940
|
}).noUnknown().strict().label("General Detail");
|
|
604
941
|
|
|
605
942
|
// src/user/user-job-preferences.schema.ts
|
|
606
|
-
import { array as
|
|
607
|
-
var UserJobPreferencesSchema =
|
|
943
|
+
import { array as array9, boolean as boolean12, date as date2, number as number7, object as object27, string as string25 } from "yup";
|
|
944
|
+
var UserJobPreferencesSchema = object27({
|
|
608
945
|
/**
|
|
609
946
|
* Whether the job seeker is openly signalling availability. Surfaces the
|
|
610
947
|
* "Open to work" badge on the public profile and boosts visibility in
|
|
611
|
-
* recruiter search. Defaults to `false`
|
|
948
|
+
* recruiter search. Defaults to `false` - users must opt in.
|
|
612
949
|
*/
|
|
613
|
-
openToWork:
|
|
950
|
+
openToWork: boolean12().default(false).label("Open to Work"),
|
|
614
951
|
/**
|
|
615
952
|
* How urgently the user is looking for their next job. Drives match scoring
|
|
616
953
|
* and can downgrade the visibility of expired or low-relevance postings for
|
|
617
954
|
* users in `passively_browsing` mode.
|
|
618
955
|
*/
|
|
619
|
-
jobSearchUrgency:
|
|
956
|
+
jobSearchUrgency: string25().oneOf(SupportedJobSearchUrgencies).required().label("Job Search Urgency"),
|
|
620
957
|
/**
|
|
621
958
|
* Locations the user wants to work in. Stores the full `LocationSchema`
|
|
622
959
|
* shape (country, city, state, geo, etc.) as returned by the locations
|
|
623
960
|
* autocomplete API.
|
|
624
961
|
*/
|
|
625
|
-
jobLocations:
|
|
962
|
+
jobLocations: array9().of(LocationSchema.required().label("Job Location")).min(1, "Pick at least one preferred location.").required().label("Job Locations"),
|
|
626
963
|
/**
|
|
627
964
|
* Seniority levels the user wants jobs to be matched against. Multi-select
|
|
628
965
|
* (up to 2) for borderline candidates.
|
|
629
966
|
*
|
|
630
967
|
* Distinct from the singular `experienceLevel` field on `UserSchema`
|
|
631
|
-
* (concat'd via `UserGeneralDetailSchema`)
|
|
968
|
+
* (concat'd via `UserGeneralDetailSchema`) - that field captures the user's
|
|
632
969
|
* own current seniority, while these are the levels they want to *target*.
|
|
633
970
|
* Both reuse the same `ExperienceLevel` taxonomy from `common.constant.ts`
|
|
634
971
|
* so search/match logic doesn't have to translate between two vocabularies.
|
|
635
972
|
*/
|
|
636
|
-
targetExperienceLevels:
|
|
973
|
+
targetExperienceLevels: array9().of(string25().oneOf(SupportedExperienceLevels).required()).min(1, "Pick at least one experience level.").max(2, "You can select at most 2 experience levels.").required().label("Target Experience Levels"),
|
|
637
974
|
/**
|
|
638
|
-
* Specializations the user is searching for
|
|
975
|
+
* Specializations the user is searching for - free-form titles.
|
|
639
976
|
*
|
|
640
977
|
* Job titles are an open vocabulary (think O*NET, ESCO, LinkedIn's title
|
|
641
978
|
* graph), so the schema only enforces length bounds per entry. The wizard
|
|
642
979
|
* surfaces a curated "Popular Roles" picker for discovery, but the user
|
|
643
980
|
* can ultimately add any title; matching/normalization happens downstream.
|
|
644
981
|
*/
|
|
645
|
-
jobRoles:
|
|
982
|
+
jobRoles: array9().of(string25().trim().max(120).required()).min(1, "Pick at least one role.").required().label("Job Roles"),
|
|
646
983
|
/**
|
|
647
984
|
* Minimum acceptable annual base salary, in `minSalaryCurrency`.
|
|
648
985
|
* Stored as an integer in the currency's major unit (e.g. dollars, not cents).
|
|
649
|
-
* Defaults to 0 ("any salary") rather than being optional
|
|
986
|
+
* Defaults to 0 ("any salary") rather than being optional - every job-seeker
|
|
650
987
|
* has a floor, even if it's zero.
|
|
651
988
|
*/
|
|
652
|
-
minSalary:
|
|
653
|
-
minSalaryCurrency:
|
|
989
|
+
minSalary: number7().integer().min(MIN_SALARY_LOWER_BOUND).max(MIN_SALARY_UPPER_BOUND).default(0).required().label("Minimum Salary"),
|
|
990
|
+
minSalaryCurrency: string25().oneOf(SupportedSalaryCurrencies).default("USD").required().label("Minimum Salary Currency"),
|
|
654
991
|
/**
|
|
655
992
|
* Marketing-attribution capture from the final onboarding step.
|
|
656
993
|
*/
|
|
657
|
-
referralSource:
|
|
994
|
+
referralSource: string25().oneOf(SupportedReferralSources).required().label("Referral Source"),
|
|
658
995
|
/**
|
|
659
996
|
* Resumes the user has uploaded. Embedded directly on the user document
|
|
660
|
-
* (capped at 5)
|
|
997
|
+
* (capped at 5) - they're cheap to denormalize, every wizard step that
|
|
661
998
|
* cares about them is already loading the user doc, and the cap keeps the
|
|
662
999
|
* subdoc bounded.
|
|
663
1000
|
*
|
|
@@ -665,21 +1002,21 @@ var UserJobPreferencesSchema = object21({
|
|
|
665
1002
|
* the API can sign for download is kept here.
|
|
666
1003
|
*
|
|
667
1004
|
* Distinct from the `Resumes` collection used by the (currently unused)
|
|
668
|
-
* AI resume-builder flow
|
|
1005
|
+
* AI resume-builder flow - onboarding uploads land here, AI-built resumes
|
|
669
1006
|
* live in their own collection.
|
|
670
1007
|
*/
|
|
671
|
-
resumes:
|
|
672
|
-
|
|
673
|
-
// Stable id assigned on upload
|
|
1008
|
+
resumes: array9().of(
|
|
1009
|
+
object27({
|
|
1010
|
+
// Stable id assigned on upload - used to address a specific entry
|
|
674
1011
|
// for delete / set-primary operations without exposing the GCS URL
|
|
675
1012
|
// as a route key.
|
|
676
|
-
id:
|
|
677
|
-
url:
|
|
678
|
-
filename:
|
|
679
|
-
sizeBytes:
|
|
680
|
-
mimeType:
|
|
1013
|
+
id: string25().required().label("ID"),
|
|
1014
|
+
url: string25().required().label("Resume URL"),
|
|
1015
|
+
filename: string25().trim().max(255).optional().label("Filename"),
|
|
1016
|
+
sizeBytes: number7().integer().min(0).optional().label("Size (bytes)"),
|
|
1017
|
+
mimeType: string25().trim().max(120).optional().label("MIME Type"),
|
|
681
1018
|
uploadedAt: date2().required().label("Uploaded At"),
|
|
682
|
-
isPrimary:
|
|
1019
|
+
isPrimary: boolean12().default(false).label("Is Primary")
|
|
683
1020
|
}).noUnknown().strict().label("Resume")
|
|
684
1021
|
).max(5, "You can keep at most 5 resumes on file.").default([]).label("Resumes"),
|
|
685
1022
|
/**
|
|
@@ -689,123 +1026,123 @@ var UserJobPreferencesSchema = object21({
|
|
|
689
1026
|
onboardingCompletedAt: date2().nullable().optional().label("Onboarding Completed At"),
|
|
690
1027
|
/**
|
|
691
1028
|
* Parser-suggested values for wizard fields, written by the resume-upload
|
|
692
|
-
* flow. Every parser-derived field lands here
|
|
1029
|
+
* flow. Every parser-derived field lands here - including profile-shaped
|
|
693
1030
|
* fields (headline, aboutMe, mobile, location, experienceLevel,
|
|
694
|
-
* socialAccounts, workExperiences, educations)
|
|
1031
|
+
* socialAccounts, workExperiences, educations) - so nothing reaches the
|
|
695
1032
|
* top-level user document until the user confirms it on the matching
|
|
696
1033
|
* wizard step. When a user clicks Next on a step, the API drops the
|
|
697
1034
|
* matching key from this sub-doc so a re-uploaded resume can't overwrite
|
|
698
1035
|
* confirmed answers.
|
|
699
1036
|
*
|
|
700
|
-
* READ RULE
|
|
1037
|
+
* READ RULE - strict:
|
|
701
1038
|
* `pendingPrefill.<field>` is ONLY for seeding a wizard step's form
|
|
702
1039
|
* initial value (e.g. `prefer(user.<field>, user.pendingPrefill?.<field>)`
|
|
703
|
-
* in a step's `load`). It is NOT the user's actual value
|
|
1040
|
+
* in a step's `load`). It is NOT the user's actual value - it's an
|
|
704
1041
|
* unconfirmed suggestion. Never substitute it as a fallback in profile
|
|
705
1042
|
* pages, search/match, recommendations, public profile, dashboards, or
|
|
706
1043
|
* APIs. If `user.<field>` is empty there, the correct behavior is empty,
|
|
707
1044
|
* because the user has not confirmed it yet.
|
|
708
1045
|
*/
|
|
709
|
-
pendingPrefill:
|
|
710
|
-
headline:
|
|
711
|
-
aboutMe:
|
|
712
|
-
mobile:
|
|
1046
|
+
pendingPrefill: object27({
|
|
1047
|
+
headline: string25().trim().optional().label("Pending Headline"),
|
|
1048
|
+
aboutMe: string25().trim().optional().label("Pending About Me"),
|
|
1049
|
+
mobile: string25().trim().optional().label("Pending Mobile"),
|
|
713
1050
|
location: LocationSchema.optional().default(void 0).label("Pending Location"),
|
|
714
|
-
experienceLevel:
|
|
715
|
-
socialAccounts:
|
|
716
|
-
workExperiences:
|
|
717
|
-
educations:
|
|
1051
|
+
experienceLevel: string25().oneOf(SupportedExperienceLevels).optional().label("Pending Experience Level"),
|
|
1052
|
+
socialAccounts: array9().of(SocialAccountSchema.required()).optional().label("Pending Social Accounts"),
|
|
1053
|
+
workExperiences: array9().of(WorkExperienceSchema.required()).optional().label("Pending Work Experiences"),
|
|
1054
|
+
educations: array9().of(EducationSchema.required()).optional().label("Pending Educations")
|
|
718
1055
|
}).nullable().optional().default(void 0).label("Pending Prefill")
|
|
719
1056
|
}).noUnknown().strict().label("User Job Preferences Schema");
|
|
720
1057
|
|
|
721
1058
|
// src/user/user-recruiter-profile.schema.ts
|
|
722
|
-
import { array as
|
|
723
|
-
var RecruiterPageLinkSchema =
|
|
1059
|
+
import { array as array10, object as object28, string as string26 } from "yup";
|
|
1060
|
+
var RecruiterPageLinkSchema = object28({
|
|
724
1061
|
page: PageSchema.pick(["name", "slug", "type", "logo"]).deepPartial().concat(PageSchema.pick(["name", "type"])).required().label("Company Page"),
|
|
725
|
-
jobTitle:
|
|
1062
|
+
jobTitle: string26().trim().max(100).optional().label("Job Title")
|
|
726
1063
|
}).noUnknown().strict().label("Recruiter Page Link");
|
|
727
|
-
var UserRecruiterProfileSchema =
|
|
728
|
-
recruiterProfile:
|
|
729
|
-
hiringFor:
|
|
1064
|
+
var UserRecruiterProfileSchema = object28({
|
|
1065
|
+
recruiterProfile: object28({
|
|
1066
|
+
hiringFor: array10().of(RecruiterPageLinkSchema).default([]).label("Hiring For")
|
|
730
1067
|
}).optional().default(void 0).label("Recruiter Profile")
|
|
731
1068
|
}).noUnknown().strict().label("User Recruiter Profile");
|
|
732
1069
|
|
|
733
1070
|
// src/user/user-coordinator-profile.schema.ts
|
|
734
|
-
import { array as
|
|
735
|
-
var CoordinatorPageLinkSchema =
|
|
1071
|
+
import { array as array11, object as object29, string as string27 } from "yup";
|
|
1072
|
+
var CoordinatorPageLinkSchema = object29({
|
|
736
1073
|
page: PageSchema.pick(["name", "slug", "type", "logo"]).deepPartial().concat(PageSchema.pick(["name", "type"])).required().label("Institute Page"),
|
|
737
|
-
jobTitle:
|
|
1074
|
+
jobTitle: string27().trim().max(100).optional().label("Job Title")
|
|
738
1075
|
}).noUnknown().strict().label("Coordinator Page Link");
|
|
739
|
-
var UserCoordinatorProfileSchema =
|
|
740
|
-
coordinatorProfile:
|
|
741
|
-
coordinatesAt:
|
|
1076
|
+
var UserCoordinatorProfileSchema = object29({
|
|
1077
|
+
coordinatorProfile: object29({
|
|
1078
|
+
coordinatesAt: array11().of(CoordinatorPageLinkSchema).default([]).label("Coordinates At")
|
|
742
1079
|
}).optional().default(void 0).label("Coordinator Profile")
|
|
743
1080
|
}).noUnknown().strict().label("User Coordinator Profile");
|
|
744
1081
|
|
|
745
1082
|
// src/user/user.schema.ts
|
|
746
|
-
var UserSchema =
|
|
1083
|
+
var UserSchema = object30({
|
|
747
1084
|
/**
|
|
748
1085
|
* Related auth account id from auth Server (e.g. Better auth https://auth.thejob.dev)
|
|
749
1086
|
*/
|
|
750
|
-
authAccountId:
|
|
1087
|
+
authAccountId: string28().required().label("Auth Account ID"),
|
|
751
1088
|
/**
|
|
752
1089
|
* Social media information about the user (e.g. LinkedIn, GitHub, etc.)
|
|
753
1090
|
*/
|
|
754
|
-
socialAccounts:
|
|
1091
|
+
socialAccounts: array12().of(SocialAccountSchema).default([]).label("Social Accounts"),
|
|
755
1092
|
/**
|
|
756
1093
|
* Work experience information about the user
|
|
757
1094
|
*/
|
|
758
|
-
workExperiences:
|
|
1095
|
+
workExperiences: array12().of(WorkExperienceSchema).required().default([]).label("Work Experiences"),
|
|
759
1096
|
/**
|
|
760
1097
|
* Education information about the user
|
|
761
1098
|
*/
|
|
762
|
-
educations:
|
|
1099
|
+
educations: array12().of(EducationSchema).required().default([]).label("Educations"),
|
|
763
1100
|
/**
|
|
764
1101
|
* Skills information about the user
|
|
765
1102
|
*/
|
|
766
|
-
skills:
|
|
1103
|
+
skills: array12().of(UserSkillSchema).required().default([]).label("Skills"),
|
|
767
1104
|
/**
|
|
768
1105
|
* Projects information about the user
|
|
769
1106
|
*/
|
|
770
|
-
projects:
|
|
1107
|
+
projects: array12().of(UserProjectSchema).default([]).label("Projects"),
|
|
771
1108
|
/**
|
|
772
1109
|
* Certifications information about the user
|
|
773
1110
|
*/
|
|
774
|
-
certifications:
|
|
1111
|
+
certifications: array12().of(UserCertificationSchema).default([]).label("Certifications"),
|
|
775
1112
|
/**
|
|
776
1113
|
* Interests information about the user.
|
|
777
1114
|
*/
|
|
778
|
-
interests:
|
|
1115
|
+
interests: array12().of(UserInterestSchema).optional().default([]).label("Interests"),
|
|
779
1116
|
/**
|
|
780
1117
|
* Languages information about the user
|
|
781
1118
|
*/
|
|
782
|
-
languages:
|
|
1119
|
+
languages: array12().of(UserLanguageSchema).required().default([]).label("Languages"),
|
|
783
1120
|
/**
|
|
784
1121
|
* Additional information about the user
|
|
785
1122
|
*/
|
|
786
|
-
additionalInfo:
|
|
1123
|
+
additionalInfo: array12().of(UserAdditionalInfoSchema).default([]).label("Additional Information"),
|
|
787
1124
|
/**
|
|
788
1125
|
* Status of the user account
|
|
789
1126
|
*/
|
|
790
|
-
status:
|
|
1127
|
+
status: string28().oneOf(SupportedUserStatuses).required().label("Status"),
|
|
791
1128
|
/**
|
|
792
1129
|
* Roles assigned to the user
|
|
793
1130
|
*/
|
|
794
|
-
roles:
|
|
1131
|
+
roles: array12().of(string28().oneOf(SupportedUserRoles)).required().default(DefaultUserRoles).label("Roles"),
|
|
795
1132
|
/**
|
|
796
1133
|
* Vector embedding of the user's profile for semantic/hybrid search.
|
|
797
1134
|
* Generated from a structured summary of skills, experience, education, etc.
|
|
798
1135
|
* Only generated for public profiles with sufficient completeness (≥60%).
|
|
799
1136
|
*/
|
|
800
|
-
embedding:
|
|
801
|
-
vector:
|
|
802
|
-
model:
|
|
1137
|
+
embedding: object30({
|
|
1138
|
+
vector: array12(number8().required()).optional().label("Embedding vector"),
|
|
1139
|
+
model: string28().optional().label("Embedding model")
|
|
803
1140
|
}).nullable().optional().label("Embedding")
|
|
804
1141
|
}).concat(UserGeneralDetailSchema).concat(UserJobPreferencesSchema).concat(UserRecruiterProfileSchema).concat(UserCoordinatorProfileSchema).noUnknown().strict().label("User Schema");
|
|
805
1142
|
|
|
806
1143
|
// src/user/user-completeness.schema.ts
|
|
807
|
-
import { object as
|
|
808
|
-
var UserCompletenessSchema =
|
|
1144
|
+
import { object as object31 } from "yup";
|
|
1145
|
+
var UserCompletenessSchema = object31({
|
|
809
1146
|
additionalInfo: CompletenessScoreSchema(0).label("Additional Info"),
|
|
810
1147
|
// Optional
|
|
811
1148
|
certifications: CompletenessScoreSchema(0).label("Certifications"),
|
|
@@ -827,17 +1164,27 @@ var StudentCompletenessSchema = UserCompletenessSchema.omit([
|
|
|
827
1164
|
"workExperiences" /* WorkExperiences */
|
|
828
1165
|
]);
|
|
829
1166
|
export {
|
|
1167
|
+
AnswerChoiceType,
|
|
1168
|
+
ApplicationReceivePreference,
|
|
1169
|
+
ChoiceQuestionSchema,
|
|
1170
|
+
Common,
|
|
1171
|
+
CompensationType,
|
|
830
1172
|
CompletenessScoreSchema,
|
|
831
1173
|
ContactTypes,
|
|
832
1174
|
CoordinatorPageLinkSchema,
|
|
1175
|
+
DISPLAY_DATE_FORMAT,
|
|
1176
|
+
DISPLAY_DATE_FORMAT_SHORT,
|
|
833
1177
|
DateStringSchema,
|
|
834
1178
|
DbDefaultSchema,
|
|
835
1179
|
DefaultPaginatedResponse,
|
|
836
1180
|
DefaultPaginationOptions,
|
|
837
1181
|
DefaultUserRoles,
|
|
838
1182
|
DurationSchema,
|
|
1183
|
+
EMPTY_STRING,
|
|
839
1184
|
EducationLevel,
|
|
840
1185
|
EducationSchema,
|
|
1186
|
+
EmployeeCount,
|
|
1187
|
+
EmploymentType,
|
|
841
1188
|
ExperienceLevel,
|
|
842
1189
|
GeneraDetailFields,
|
|
843
1190
|
GroupManagedBy,
|
|
@@ -847,7 +1194,10 @@ export {
|
|
|
847
1194
|
GroupStatus,
|
|
848
1195
|
GroupTranslationSchema,
|
|
849
1196
|
GroupVisibility,
|
|
1197
|
+
InputQuestionSchema,
|
|
1198
|
+
JobSchema,
|
|
850
1199
|
JobSearchUrgency,
|
|
1200
|
+
JobStatus,
|
|
851
1201
|
LocationSchema,
|
|
852
1202
|
MIN_SALARY_LOWER_BOUND,
|
|
853
1203
|
MIN_SALARY_UPPER_BOUND,
|
|
@@ -856,27 +1206,45 @@ export {
|
|
|
856
1206
|
PageType,
|
|
857
1207
|
PaginationSchema,
|
|
858
1208
|
ProficiencyLevel,
|
|
1209
|
+
QuestionSchema,
|
|
1210
|
+
QuestionType,
|
|
1211
|
+
ReadAndAcknowledgeQuestionSchema,
|
|
859
1212
|
RecruiterPageLinkSchema,
|
|
860
1213
|
ReferralSource,
|
|
1214
|
+
ReportReason,
|
|
1215
|
+
ReportSchema,
|
|
1216
|
+
ResourceType,
|
|
1217
|
+
SITEMAP_FORMAT,
|
|
1218
|
+
SYSTEM_DATE_FORMAT,
|
|
861
1219
|
SkillSchema,
|
|
862
1220
|
SocialAccount,
|
|
863
1221
|
SocialAccountSchema,
|
|
864
1222
|
StudentCompletenessSchema,
|
|
865
1223
|
StudyType,
|
|
1224
|
+
SupportedAnswerChoiceTypes,
|
|
1225
|
+
SupportedApplicationReceivePreferences,
|
|
1226
|
+
SupportedCompensationTypes,
|
|
866
1227
|
SupportedContactTypes,
|
|
867
1228
|
SupportedEducationLevels,
|
|
1229
|
+
SupportedEmployeeCounts,
|
|
1230
|
+
SupportedEmploymentTypes,
|
|
868
1231
|
SupportedExperienceLevels,
|
|
869
1232
|
SupportedJobSearchUrgencies,
|
|
1233
|
+
SupportedJobStatuses,
|
|
870
1234
|
SupportedPageStatuses,
|
|
871
1235
|
SupportedPageTypes,
|
|
872
1236
|
SupportedProficiencyLevels,
|
|
1237
|
+
SupportedQuestionTypes,
|
|
873
1238
|
SupportedReferralSources,
|
|
1239
|
+
SupportedReportReasons,
|
|
1240
|
+
SupportedResourceTypes,
|
|
874
1241
|
SupportedSalaryCurrencies,
|
|
875
1242
|
SupportedSocialAccounts,
|
|
876
1243
|
SupportedStudyTypes,
|
|
877
1244
|
SupportedUserProfileVisibilities,
|
|
878
1245
|
SupportedUserRoles,
|
|
879
1246
|
SupportedUserStatuses,
|
|
1247
|
+
SupportedWorkModes,
|
|
880
1248
|
TermsAcceptedSchema,
|
|
881
1249
|
UserAdditionalInfoSchema,
|
|
882
1250
|
UserCertificationSchema,
|
|
@@ -884,6 +1252,7 @@ export {
|
|
|
884
1252
|
UserCoordinatorProfileSchema,
|
|
885
1253
|
UserDetailType,
|
|
886
1254
|
UserGeneralDetailSchema,
|
|
1255
|
+
UserIdAndCreatedAtSchema,
|
|
887
1256
|
UserInterestSchema,
|
|
888
1257
|
UserJobPreferencesSchema,
|
|
889
1258
|
UserLanguageSchema,
|
|
@@ -895,5 +1264,7 @@ export {
|
|
|
895
1264
|
UserSkillSchema,
|
|
896
1265
|
UserStatus,
|
|
897
1266
|
WorkExperienceSchema,
|
|
898
|
-
|
|
1267
|
+
WorkMode,
|
|
1268
|
+
dateString,
|
|
1269
|
+
getSchemaByQuestion
|
|
899
1270
|
};
|