🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@testgorilla/e2e-framework

Package Overview
Dependencies
Maintainers
2
Versions
5
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@testgorilla/e2e-framework - npm Package Compare versions

Comparing version
0.1.3
to
0.2.0
dist/chunk-6HR5SXUC.mjs

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

+696
import {
baseURL,
isLocalEnvironment
} from "./chunk-TJHUXULD.mjs";
// src/enums/tests.ts
var TestName = /* @__PURE__ */ ((TestName2) => {
TestName2["CultureAdd"] = "Culture add";
TestName2["Communication"] = "Communication";
TestName2["Motivation"] = "Motivation";
TestName2["Disc"] = "DISC";
TestName2["CustomQuestion"] = "Custom questions";
TestName2["PHPCoding_stage"] = "PHP (coding): object-oriented programming";
TestName2["PHPCoding_prod"] = "PHP (Coding): Object-Oriented Programming";
TestName2["PythonCodingDebugging"] = "Coding: Debugging";
TestName2["PythonCodingDebugging_prod"] = "Python (Coding): Debugging";
TestName2["PythonCodingEntryLevel"] = "Python (coding): entry-level algorithms";
TestName2["AttentionToDetail"] = "Attention to Detail (Textual)";
TestName2["EnglishProficiency"] = "English C1 (Advanced)";
TestName2["EnglishIntermediate"] = "English (intermediate/B1)";
TestName2["RubyOnRails"] = "Ruby on Rails";
TestName2["JavaScriptCodingEntryLevel"] = "JavaScript (Coding): Entry-Level Algorithms";
TestName2["TypeScriptCodingEntryLevel"] = "TypeScript (coding): entry-level algorithms";
TestName2["PhpEntryLevel"] = "PHP (coding): intermediate-level algorithms";
TestName2["SqliteIntermediate"] = "SQLite (coding): intermediate-level querying";
TestName2["SQLiteEntryLevel"] = "SQLite (coding): entry-level database operations";
TestName2["JavaEntryLevel"] = "Java (coding): entry-level algorithms";
TestName2["CCodingEntryLevel"] = "C (coding): entry-level algorithms";
TestName2["CPPCodingEntryLevel"] = "C++ (coding): entry-level algorithms";
TestName2["CHashCodingEntryLevel"] = "C# (coding): entry-level algorithms";
TestName2["RubyEntryLevel"] = "Ruby (coding): entry-level algorithms";
TestName2["Enn\xE9agramme"] = "Enn\xE9agramme";
TestName2["AttentionToDetailVisual"] = "Attention to detail (visual)";
TestName2["WorkingWithData"] = "Working with data";
TestName2["ReadingComprehension"] = "Reading comprehension";
TestName2["TypingSpeedLowerCase"] = "Typing Speed (Lowercase Only)";
TestName2["TypingSpeedCapitalization"] = "Typing Speed (Capitalization and Punctuation)";
TestName2["TypingSpeedNumbersOnly"] = "Typing Speed (Numbers Only)";
TestName2["VerbalReasoning"] = "Verbal Reasoning";
TestName2["ProblemSolving"] = "Problem Solving";
TestName2["ProblemSolvingStaging"] = "Problem solving";
TestName2["Big5"] = "Big 5 (OCEAN)";
TestName2["TimeManagement"] = "Time Management";
TestName2["TimeManagementStaging"] = "Time management";
TestName2["RubyDebugging"] = "Ruby (coding): debugging";
TestName2["CodingEntryLevel"] = "Coding: Entry-level algorithms";
TestName2["Tableau"] = "Tableau";
TestName2["FollowingInstructions"] = "Following instructions";
TestName2["UnderstandingInstructions"] = "Understanding instructions";
TestName2["GoogleSpreadsheetSimulation"] = "Google Sheets Spreadsheet Simulation";
TestName2["CloudSystemAdministration"] = "Cloud System Administration";
TestName2["AndroidKotlin"] = "Android Development Using Kotlin";
TestName2["ActiveListening"] = "Active Listening";
TestName2["MySQL"] = "MySQL";
TestName2["SpreadsheetSimulation"] = "Spreadsheet Simulation: Google Sheets (Intermediate)";
TestName2["UniversalSkillsProfiler"] = "Universal Skills Profiler";
TestName2["Enneagram"] = "Enneagram";
TestName2["HTML5"] = "HTML5";
TestName2["CriticalThinking"] = "Critical thinking";
TestName2["HubspotCRM"] = "Hubspot CRM";
TestName2["Shopify"] = "Shopify";
TestName2["Laravel"] = "Laravel";
TestName2["Flutter"] = "Flutter";
TestName2["IntermediateMath"] = "Intermediate Math";
TestName2["Zendesk"] = "Zendesk CS";
TestName2["PurchaseManager"] = "Purchase Manager";
TestName2["SQLQuerying"] = "SQLite (Coding): Intermediate-Level Querying";
TestName2["ImmersiveTest"] = "Customer Service (Immersive Role-Play)";
TestName2["AIResume"] = "AI Resume Scoring";
TestName2["SoftwareArchitect"] = "Software architect";
TestName2["AWS"] = "AWS";
return TestName2;
})(TestName || {});
var ProgrammingLanguages = /* @__PURE__ */ ((ProgrammingLanguages2) => {
ProgrammingLanguages2["Python"] = "Python";
ProgrammingLanguages2["JavaScript"] = "JavaScript";
ProgrammingLanguages2["TypeScript"] = "TypeScript";
ProgrammingLanguages2["Php"] = "PHP";
ProgrammingLanguages2["Sqlite"] = "SQLite";
ProgrammingLanguages2["Java"] = "Java";
ProgrammingLanguages2["C"] = "C";
ProgrammingLanguages2["CPP"] = "C++";
ProgrammingLanguages2["CHash"] = "C#";
ProgrammingLanguages2["Ruby"] = "Ruby";
return ProgrammingLanguages2;
})(ProgrammingLanguages || {});
var TestDuration = getTestDuration();
function getTestDuration() {
if (baseURL.includes("app")) {
return {
CultureAdd: "10",
AttentionToDetail: "12",
AttentionToDetailVisual: "10",
EnglishProficiency: "10",
CustomTest: "10",
PythonCoding: "14"
};
} else if (isLocalEnvironment) {
return {
CultureAdd: "10",
AttentionToDetail: "12",
AttentionToDetailVisual: "10",
EnglishProficiency: "10",
CustomTest: "10",
PythonCoding: "8"
};
} else {
return {
CultureAdd: "10",
AttentionToDetail: "10",
AttentionToDetailVisual: "10",
EnglishProficiency: "10",
CustomTest: "10",
PythonCoding: "14"
};
}
}
var CodingTaskOutput = /* @__PURE__ */ ((CodingTaskOutput2) => {
CodingTaskOutput2["TaskSuccess"] = "Code executed successfully";
CodingTaskOutput2["TaskFailure"] = "Task finished with errors.Traceback (most recent call last):";
CodingTaskOutput2["TaskMessage"] = "Task";
CodingTaskOutput2["EmptyScriptTaskMessage"] = "Run tests to check your code";
return CodingTaskOutput2;
})(CodingTaskOutput || {});
var PersonalityAndCultureTestName = /* @__PURE__ */ ((PersonalityAndCultureTestName2) => {
PersonalityAndCultureTestName2["CultureAddSurvey"] = "Culture add survey";
PersonalityAndCultureTestName2["MotivationTestSurvey"] = "Motivation test survey";
return PersonalityAndCultureTestName2;
})(PersonalityAndCultureTestName || {});
var TestKeyWord = /* @__PURE__ */ ((TestKeyWord2) => {
TestKeyWord2["Motivation"] = "Motivation";
return TestKeyWord2;
})(TestKeyWord || {});
var TestType = /* @__PURE__ */ ((TestType2) => {
TestType2["PersonalityAndCulture"] = "Personality & culture";
TestType2["ProgrammingSkills"] = "Programming skills";
return TestType2;
})(TestType || {});
var TestFormat = /* @__PURE__ */ ((TestFormat2) => {
TestFormat2["MultipleChoice"] = "Multiple-choice";
TestFormat2["Coding"] = "Coding";
TestFormat2["Typing"] = "Typing";
TestFormat2["Questionnaire"] = "Questionnaire";
TestFormat2["Simulation"] = "Simulation";
return TestFormat2;
})(TestFormat || {});
var TestDurations = /* @__PURE__ */ ((TestDurations2) => {
TestDurations2["ZeroToTenMinutes"] = "Up to 10 mins";
TestDurations2["ElevenToTwentyMinutes"] = "11 to 20 mins";
TestDurations2["TwentyoneToThirtyMinutes"] = "21 to 30 mins";
TestDurations2["ThirtyoneTosixtyMinutes"] = "31 to 60 mins";
return TestDurations2;
})(TestDurations || {});
var TestsCount = /* @__PURE__ */ ((TestsCount2) => {
TestsCount2["ZeroTests"] = "0 added";
TestsCount2["OneTests"] = "1 test";
TestsCount2["TwoTests"] = "2 added";
TestsCount2["ThreeTests"] = "3 test";
TestsCount2["FourTests"] = "4 test";
TestsCount2["FiveTests"] = "5 added";
return TestsCount2;
})(TestsCount || {});
var TestFilterNames = /* @__PURE__ */ ((TestFilterNames2) => {
TestFilterNames2["Library"] = "Show tests from";
TestFilterNames2["RoleSpecific"] = "Skills for";
TestFilterNames2["Focus"] = "Focus";
TestFilterNames2["Duration"] = "Duration";
TestFilterNames2["Format"] = "Format";
TestFilterNames2["Highlights"] = "Highlights";
return TestFilterNames2;
})(TestFilterNames || {});
var CodingQuestions = /* @__PURE__ */ ((CodingQuestions2) => {
CodingQuestions2["Python"] = "Python";
return CodingQuestions2;
})(CodingQuestions || {});
var CreateCodingTestHeaders = /* @__PURE__ */ ((CreateCodingTestHeaders2) => {
CreateCodingTestHeaders2["FunctionSignature"] = "Function signature";
CreateCodingTestHeaders2["InitialCode"] = "Initial code";
CreateCodingTestHeaders2["TestCases"] = "Test cases";
CreateCodingTestHeaders2["VerificationCode"] = "Verification code";
return CreateCodingTestHeaders2;
})(CreateCodingTestHeaders || {});
var PracticeQuestions = /* @__PURE__ */ ((PracticeQuestions2) => {
PracticeQuestions2["AttentionToDetail"] = "info This is the first practice question. You are in charge of sending invitations for a class reunion next month. You compare the address on file for one participant with the address available in the yearbook, which are as shown below";
PracticeQuestions2["CodingQuestion"] = "The purpose of this question is to show you how coding tests work. You are not being scored for anything in this question.";
PracticeQuestions2["EnglishProficiency"] = "Read the text and choose the synonym of the underlined word.";
PracticeQuestions2["RubyOnRails"] = "Which of the available queries returns the authors who have written at least one book?";
return PracticeQuestions2;
})(PracticeQuestions || {});
// src/enums/ui.ts
var PageSize = /* @__PURE__ */ ((PageSize2) => {
PageSize2[PageSize2["Ten"] = 10] = "Ten";
PageSize2[PageSize2["TwentyFive"] = 25] = "TwentyFive";
PageSize2[PageSize2["Fifty"] = 50] = "Fifty";
return PageSize2;
})(PageSize || {});
var MyAssessmentTableHeader = /* @__PURE__ */ ((MyAssessmentTableHeader2) => {
MyAssessmentTableHeader2["DateCreated"] = "Job Created";
MyAssessmentTableHeader2["LastActivity"] = "Last activity";
return MyAssessmentTableHeader2;
})(MyAssessmentTableHeader || {});
var TalentAssessmentTableHeader = /* @__PURE__ */ ((TalentAssessmentTableHeader2) => {
TalentAssessmentTableHeader2["CompanyName"] = "COMPANY NAME";
TalentAssessmentTableHeader2["InvitedOn"] = "INVITED ON";
TalentAssessmentTableHeader2["LastActivity"] = "LAST ACTIVITY";
return TalentAssessmentTableHeader2;
})(TalentAssessmentTableHeader || {});
var Sort = /* @__PURE__ */ ((Sort2) => {
Sort2["Ascending"] = "ascending";
Sort2["Decending"] = "descending";
return Sort2;
})(Sort || {});
var MenuItem = /* @__PURE__ */ ((MenuItem2) => {
MenuItem2["TeamManagement"] = "Team Management";
MenuItem2["Integrations"] = "Integrations";
MenuItem2["MyCompany"] = "My company";
MenuItem2["Logout"] = "Log out";
MenuItem2["PlanAndBilling"] = "Plan & billing";
MenuItem2["MyProfile"] = "My profile";
MenuItem2["AccountProfile"] = "Profile";
MenuItem2["LogOut"] = "Log out";
MenuItem2["Notifications"] = "Notifications";
MenuItem2["AssessmentSettings"] = "Settings";
return MenuItem2;
})(MenuItem || {});
var SideNavItem = /* @__PURE__ */ ((SideNavItem2) => {
SideNavItem2["Home"] = "Home";
SideNavItem2["Jobs"] = "Jobs";
SideNavItem2["Sourcing"] = "Sourcing";
SideNavItem2["Candidates"] = "Candidates";
SideNavItem2["Analytics"] = "Analytics";
SideNavItem2["TestLibrary"] = "Test library";
SideNavItem2["WhatsNew"] = "What's new";
SideNavItem2["HelpCenter"] = "Help center";
return SideNavItem2;
})(SideNavItem || {});
var Colour = /* @__PURE__ */ ((Colour2) => {
Colour2["Black"] = "#000000";
return Colour2;
})(Colour || {});
var Benchmark = /* @__PURE__ */ ((Benchmark2) => {
Benchmark2["PercentageCorrect"] = "Percentage of correct answers";
Benchmark2["AllCandidates"] = "All candidates";
Benchmark2["Percentile"] = "Percentile";
return Benchmark2;
})(Benchmark || {});
var HiringStage = /* @__PURE__ */ ((HiringStage2) => {
HiringStage2["Interviewed"] = "Interviewed";
HiringStage2["Hired"] = " Hired \u{1F389}";
return HiringStage2;
})(HiringStage || {});
var CheatingMonitorList = /* @__PURE__ */ ((CheatingMonitorList2) => {
CheatingMonitorList2["DeviceUsed"] = "Device used\nDesktop";
CheatingMonitorList2["WebcamEnabled"] = "Webcam enabled?\nYes";
CheatingMonitorList2["FullScreenMode"] = "Full-screen mode always active?\nYes";
CheatingMonitorList2["MousePosition"] = "Mouse always in assessment window?\nYes";
return CheatingMonitorList2;
})(CheatingMonitorList || {});
var DownloadFormat = /* @__PURE__ */ ((DownloadFormat2) => {
DownloadFormat2["Csv"] = "CSV";
DownloadFormat2["Excel"] = "Excel";
DownloadFormat2["Pdf"] = "PDF";
return DownloadFormat2;
})(DownloadFormat || {});
var URLs = /* @__PURE__ */ ((URLs2) => {
URLs2["TestGorillaPublicUrl"] = "https://www.testgorilla.com/";
URLs2["TestGorillaPublicPage"] = "TestGorilla";
URLs2["TestGorillaHelpPage"] = "Help center";
URLs2["TestGorillaFacebook"] = "Facebook";
URLs2["TestGorillaInstagram"] = "Instagram";
URLs2["TestGorillaLinkedin"] = "LinkedIn";
URLs2["Support"] = "support.testgorilla.com";
URLs2["CandidateSupport"] = "candidates.testgorilla.com";
URLs2["CandidateHub"] = "talent-staging.testgorilla.com/create-account";
URLs2["TasOldFlow"] = "https://assessment.testgorilla.com/testtaker/takeinvitation/";
URLs2["TasNewFlow"] = "https://talent-assessment.testgorilla.com/";
URLs2["privacyPolicyLink"] = "https://www.testgorilla.com/terms/privacy-policy";
URLs2["CandidateTerms"] = "https://www.testgorilla.com/candidate-terms";
return URLs2;
})(URLs || {});
var CreatingAssessmentsSteps = /* @__PURE__ */ ((CreatingAssessmentsSteps2) => {
CreatingAssessmentsSteps2["Step1"] = "Job details";
CreatingAssessmentsSteps2["Step2"] = "Assessment";
CreatingAssessmentsSteps2["Step3"] = "Configuration";
CreatingAssessmentsSteps2["Step4"] = "Finalize";
return CreatingAssessmentsSteps2;
})(CreatingAssessmentsSteps || {});
var TestGorillaTheme = /* @__PURE__ */ ((TestGorillaTheme2) => {
TestGorillaTheme2["BgColor"] = "#d410aa";
return TestGorillaTheme2;
})(TestGorillaTheme || {});
// src/enums/candidates.ts
var AssessmentStatus = /* @__PURE__ */ ((AssessmentStatus2) => {
AssessmentStatus2["Completed"] = "Completed";
AssessmentStatus2["Invited"] = "Invited";
AssessmentStatus2["Closed"] = "Closed";
return AssessmentStatus2;
})(AssessmentStatus || {});
var AssessmentResultStatus = /* @__PURE__ */ ((AssessmentResultStatus2) => {
AssessmentResultStatus2["Unavailable"] = "Unavailable";
return AssessmentResultStatus2;
})(AssessmentResultStatus || {});
var Pronoun = /* @__PURE__ */ ((Pronoun2) => {
Pronoun2["HeHim"] = "He/Him";
return Pronoun2;
})(Pronoun || {});
var JobSearchStatus = /* @__PURE__ */ ((JobSearchStatus2) => {
JobSearchStatus2["ActivelySearching"] = "Actively searching";
JobSearchStatus2["OpenToNewChallenges"] = "Open to new challenges";
JobSearchStatus2["NotLookingRightNow"] = "Not looking right now";
return JobSearchStatus2;
})(JobSearchStatus || {});
var Proficiency = /* @__PURE__ */ ((Proficiency2) => {
Proficiency2["None"] = "None";
return Proficiency2;
})(Proficiency || {});
var CandidateStatusFilters = /* @__PURE__ */ ((CandidateStatusFilters2) => {
CandidateStatusFilters2["Started"] = "Started";
CandidateStatusFilters2["Invited"] = "Invitation delivered";
CandidateStatusFilters2["Completed"] = "Completed";
return CandidateStatusFilters2;
})(CandidateStatusFilters || {});
var CandidateMeta = /* @__PURE__ */ ((CandidateMeta2) => {
CandidateMeta2["TestInfoTimerText"] = "Please stay on this screen. The timer for your next test has started and cannot be paused. The timer continues if you close the browser.";
CandidateMeta2["TestInfoTimer30MText"] = "Please stay on this screen. The timer for your next test has started and cannot be paused. The timer continues if you close the browser.";
CandidateMeta2["TestInfoTimerPlainText"] = "Please stay on this screen. The timer for your next test has started and cannot be paused. You must complete this test in the next ";
CandidateMeta2["TestInfoTimerTextTasFlow"] = "Please stay on this screen. The timer for your next test has started and cannot be paused. The timer continues even when you close the browser.";
return CandidateMeta2;
})(CandidateMeta || {});
var BehaviourLogFlags = /* @__PURE__ */ ((BehaviourLogFlags2) => {
BehaviourLogFlags2["DeviceUsed"] = "Device used";
BehaviourLogFlags2["FilledOutOnceFromIP"] = "Filled out only once from IP address?";
BehaviourLogFlags2["WebcamAlwaysEnabled"] = "Webcam always enabled?";
BehaviourLogFlags2["FullScreenExit"] = "Full-screen mode exit";
BehaviourLogFlags2["TabSwitch"] = "Tab switch";
BehaviourLogFlags2["DevToolsOpened"] = "Developer tools opened";
return BehaviourLogFlags2;
})(BehaviourLogFlags || {});
var TalentFilters = /* @__PURE__ */ ((TalentFilters2) => {
TalentFilters2["JobRole"] = "Kitchen Assistant";
TalentFilters2["LocationName"] = "Lusaka, Zambia";
TalentFilters2["YearsOfExperience"] = "10";
TalentFilters2["MinSalary"] = "125000";
TalentFilters2["MaxSalary"] = "395000";
TalentFilters2["MinSalaryDefault"] = "0";
TalentFilters2["MaxSalaryDefault"] = "500000";
TalentFilters2["SalaryType"] = "Annually";
return TalentFilters2;
})(TalentFilters || {});
var KitchenAssistantTalentDetails = /* @__PURE__ */ ((KitchenAssistantTalentDetails2) => {
KitchenAssistantTalentDetails2["JobRole"] = "Kitchen Assistant";
KitchenAssistantTalentDetails2["LocationName"] = "Lusaka, Zambia";
KitchenAssistantTalentDetails2["Salary"] = "$30,000/yr";
KitchenAssistantTalentDetails2["YearsOfExperience"] = "15 years exp.";
KitchenAssistantTalentDetails2["JobTitle"] = "Kitchen Assistant at Kitchen Company";
return KitchenAssistantTalentDetails2;
})(KitchenAssistantTalentDetails || {});
var DogTrainerTalentDetails = /* @__PURE__ */ ((DogTrainerTalentDetails2) => {
DogTrainerTalentDetails2["JobRole"] = "Dog Trainer";
DogTrainerTalentDetails2["LocationName"] = "Sydney, Australia";
DogTrainerTalentDetails2["Salary"] = "$60,000/yr";
DogTrainerTalentDetails2["YearsOfExperience"] = "30 years exp.";
DogTrainerTalentDetails2["JobTitle"] = "Dog trainer at Dog trainer organization";
DogTrainerTalentDetails2["WorkExperienceTitle"] = "Dog trainer";
DogTrainerTalentDetails2["WorkExperienceDescription"] = "Training dogs";
DogTrainerTalentDetails2["VerifiedSkill_1"] = "HTML5";
return DogTrainerTalentDetails2;
})(DogTrainerTalentDetails || {});
var SourcingInvitationMessage = /* @__PURE__ */ ((SourcingInvitationMessage2) => {
SourcingInvitationMessage2["Custom"] = "Hello, \n\n we would like to invite you. Please find the details below. \n Details";
return SourcingInvitationMessage2;
})(SourcingInvitationMessage || {});
// src/enums/integrations.ts
var IntegrationsImageSrc = /* @__PURE__ */ ((IntegrationsImageSrc2) => {
IntegrationsImageSrc2["Breezy"] = "assets/integrations/brz.png";
IntegrationsImageSrc2["GreenHouse"] = "assets/integrations/ghs.png";
IntegrationsImageSrc2["JazzHR"] = "assets/integrations/jhr.png";
IntegrationsImageSrc2["Personio"] = "assets/integrations/psn.png";
IntegrationsImageSrc2["Recruitee"] = "assets/integrations/rct.png";
return IntegrationsImageSrc2;
})(IntegrationsImageSrc || {});
var Integrations = /* @__PURE__ */ ((Integrations2) => {
Integrations2["Breezy"] = "Breezy";
Integrations2["GreenHouse"] = "Greenhouse";
Integrations2["JazzHR"] = "JazzHR";
Integrations2["Recruitee"] = "Recruitee";
return Integrations2;
})(Integrations || {});
// src/enums/customQuestions.ts
var OneWayInterviewQuestionName = /* @__PURE__ */ ((OneWayInterviewQuestionName2) => {
OneWayInterviewQuestionName2["SellingAPen"] = "Selling a pen";
OneWayInterviewQuestionName2["PrioritizingTasks"] = "Prioritizing tasks";
OneWayInterviewQuestionName2["TacklingChallenges"] = "Tackling challenges";
OneWayInterviewQuestionName2["ExceedingExpectations"] = "Exceeding expectations";
return OneWayInterviewQuestionName2;
})(OneWayInterviewQuestionName || {});
var CustomQuestionName = /* @__PURE__ */ ((CustomQuestionName2) => {
CustomQuestionName2["Video"] = "Video";
CustomQuestionName2["Essay"] = "Essay";
CustomQuestionName2["MultipleChoice"] = "Multiple-choice";
CustomQuestionName2["FileUpload"] = "File upload";
CustomQuestionName2["Code"] = "Code";
CustomQuestionName2["AllQuestionCategories"] = "Select all question categories";
CustomQuestionName2["PriorExperience"] = "Prior experience";
CustomQuestionName2["Motivation"] = "Motivation";
CustomQuestionName2["SoftSkills"] = "Soft skills";
CustomQuestionName2["JobSkills"] = "Job skills";
CustomQuestionName2["Finance"] = "Finance";
CustomQuestionName2["CustomerService"] = "Customer service";
CustomQuestionName2["Sales"] = "Sales";
CustomQuestionName2["Marketing"] = "Marketing";
CustomQuestionName2["IT"] = "IT";
CustomQuestionName2["AdministrativeSupport"] = "Administrative support";
CustomQuestionName2["Management"] = "Management";
CustomQuestionName2["SellingAPen"] = "Selling a pen";
CustomQuestionName2["TacklingChallenges"] = "Tackling challenges";
CustomQuestionName2["HandlingUnreasonableRequests"] = "Handling unreasonable requests";
return CustomQuestionName2;
})(CustomQuestionName || {});
var CustomQuestionDescription = /* @__PURE__ */ ((CustomQuestionDescription2) => {
CustomQuestionDescription2["SellingAPen"] = "Sell me the first pen within reach.";
CustomQuestionDescription2["TacklingChallenges"] = "Describe an especially difficult assignment or project you have worked on. What was your role? How did you approach the requirements, and what was the outcome?";
CustomQuestionDescription2["HandlingUnreasonableRequests"] = "Describe a time when you had to handle an unfair or unreasonable complaint or a request from a customer. What did the customer ask, and how did you handle it?";
return CustomQuestionDescription2;
})(CustomQuestionDescription || {});
var Duration = /* @__PURE__ */ ((Duration2) => {
Duration2["ThirtySeconds"] = "30 secs";
Duration2["FiveMinutes"] = "5 mins";
Duration2["TwoMinutes"] = "2 mins";
Duration2["TenMinutes"] = "10 mins";
Duration2["ZeroMinutes"] = "0 mins";
Duration2["SixMinutes"] = "6 mins";
Duration2["FifteenMinutes"] = "15 mins";
Duration2["FiftyFiveMinues"] = "55 mins";
Duration2["FiftyMinues"] = "50 mins";
Duration2["FortyMinutes"] = "40 mins";
Duration2["FortyTwoMinutes"] = "42 mins";
Duration2["FortyFourMinutes"] = "44 mins";
Duration2["FiftyNineMinutes"] = "59 mins";
Duration2["FiftyFourMinutes"] = "54 mins";
Duration2["FiftyEightMinutes"] = "58 mins";
Duration2["SixtyNineMinutes"] = "69 mins";
Duration2["SeventyThreeMinutes"] = "73 mins";
return Duration2;
})(Duration || {});
var CustomQuestionsFilters = /* @__PURE__ */ ((CustomQuestionsFilters2) => {
CustomQuestionsFilters2["Assessment"] = "Assessment name";
CustomQuestionsFilters2["Library"] = "Library";
CustomQuestionsFilters2["Format"] = "Format";
CustomQuestionsFilters2["Topic"] = "Topic";
CustomQuestionsFilters2["RoleSpecific"] = "Role specific";
return CustomQuestionsFilters2;
})(CustomQuestionsFilters || {});
var CustomQuestions = /* @__PURE__ */ ((CustomQuestions2) => {
CustomQuestions2["TestGorillaLibrary"] = "TestGorilla library";
CustomQuestions2["MyLibrary"] = "My library";
CustomQuestions2["AddingValue"] = "Adding value";
CustomQuestions2["AddingValueDescription"] = "How do you plan to add value to this organization?";
CustomQuestions2["HowAreYou"] = "How are you?";
CustomQuestions2["WhereAreYouFrom"] = "Where are you from?";
CustomQuestions2["UploadYourResume"] = "Upload your resume";
CustomQuestions2["ValidateRegex"] = "Validate Regex";
CustomQuestions2["CreateIntroVideo"] = "Create intro video of yourself";
CustomQuestions2["IntroducingYourself"] = "Introducing yourself";
CustomQuestions2["TacklingChallenges"] = "Tackling challenges";
CustomQuestions2["TacklingChallengesDescription"] = "Describe an especially difficult assignment or project you have worked on. What was your role? How did you approach the requirements, and what was the outcome?";
return CustomQuestions2;
})(CustomQuestions || {});
var CustomQuestionsContent = /* @__PURE__ */ ((CustomQuestionsContent2) => {
CustomQuestionsContent2["IntroducingYourself"] = "Introduce yourself in 60 seconds and explain why you're a great";
CustomQuestionsContent2["AddingValue"] = "How do you plan to add value to this organization?";
CustomQuestionsContent2["FailingToDeliver"] = "Tell me about a time when you didn't deliver on your key objectives. What did you learn?";
CustomQuestionsContent2["FindingAGreaterPurpose"] = "How would working in this role help you fulfill a greater personal purpose?";
CustomQuestionsContent2["WorkingCrossFunctionally"] = "How do you transcend your role as a finance professional and interact cross-functionally with people in other departments?";
return CustomQuestionsContent2;
})(CustomQuestionsContent || {});
// src/enums/locations.ts
var City = /* @__PURE__ */ ((City2) => {
City2["Ardamata"] = "Ardamata";
City2["Aiea"] = "Aiea";
City2["Nairobi"] = "Nairobi";
return City2;
})(City || {});
var Cities = /* @__PURE__ */ ((Cities2) => {
Cities2["Amsterdam"] = "Amsterdam";
Cities2["London"] = "London";
Cities2["Nairobi"] = "Nairobi";
Cities2["MexicoCity"] = "Mexico City";
Cities2["Berlin"] = "Berlin";
return Cities2;
})(Cities || {});
var Countries = /* @__PURE__ */ ((Countries2) => {
Countries2["Zambia"] = "Zambia";
Countries2["Australia"] = "Australia";
return Countries2;
})(Countries || {});
var WorkArrangements = /* @__PURE__ */ ((WorkArrangements2) => {
WorkArrangements2["Remote"] = "Remote";
WorkArrangements2["Hybrid"] = "Hybrid";
WorkArrangements2["OnSite"] = "On/Site";
return WorkArrangements2;
})(WorkArrangements || {});
var JobRoles = /* @__PURE__ */ ((JobRoles2) => {
JobRoles2["NetDeveloper"] = ".NET Developer";
JobRoles2["AcademicEditor"] = "Academic Editor";
JobRoles2["FullStackDeveloper"] = "Full Stack Developer";
JobRoles2["AccountManager"] = "Account Manager";
JobRoles2["AcademicSupportOfficer"] = "Academic Support Officer";
JobRoles2["PythonDeveloper"] = "Python Developer";
JobRoles2["Developer"] = "Developer";
JobRoles2["EssentialSkillsTemplate"] = "Essential Skills Template";
JobRoles2["DataAnalyst"] = "Data Analyst";
return JobRoles2;
})(JobRoles || {});
var AcademicEditorTemplate = /* @__PURE__ */ ((AcademicEditorTemplate2) => {
AcademicEditorTemplate2["AcademicEditor"] = "Communication Culture English Working ";
return AcademicEditorTemplate2;
})(AcademicEditorTemplate || {});
// src/enums/company.ts
var CompanyName = /* @__PURE__ */ ((CompanyName2) => {
CompanyName2["Testgorilla"] = "TestGorilla";
return CompanyName2;
})(CompanyName || {});
var Currency = /* @__PURE__ */ ((Currency2) => {
Currency2["USD"] = "USD";
return Currency2;
})(Currency || {});
var Plans = /* @__PURE__ */ ((Plans2) => {
Plans2["PayAsYouGo"] = "Pay as you go";
Plans2["Scale"] = "Scale";
Plans2["Business"] = "Business";
Plans2["Free"] = "Free";
Plans2["Starter"] = "Starter";
Plans2["Pro"] = "Pro";
Plans2["Lite"] = "Lite";
Plans2["Core"] = "Core";
return Plans2;
})(Plans || {});
var TeamRoles = /* @__PURE__ */ ((TeamRoles2) => {
TeamRoles2["HiringManager"] = "Hiring Manager";
TeamRoles2["Admin"] = "Admin";
TeamRoles2["Recruiter"] = "Recruiter";
TeamRoles2["Owner"] = "Owner";
return TeamRoles2;
})(TeamRoles || {});
var PasswordStrengthTexts = /* @__PURE__ */ ((PasswordStrengthTexts2) => {
PasswordStrengthTexts2["LowerCharacter"] = "contains at least one lower character";
PasswordStrengthTexts2["UpperCharacter"] = "contains at least one upper character";
PasswordStrengthTexts2["DigitCharacter"] = "contains at least one digit";
PasswordStrengthTexts2["SpecialCharacter"] = "contains at least one special character";
PasswordStrengthTexts2["CountText"] = "contains at least 12 characters";
PasswordStrengthTexts2["LowerCaseNew"] = "Contains at least one lowercase";
PasswordStrengthTexts2["UpperCaseNew"] = "Contains at least one uppercase";
PasswordStrengthTexts2["DigitNew"] = "Contains at least one number";
PasswordStrengthTexts2["SpecialCharacterNew"] = "Contains at least one special character";
PasswordStrengthTexts2["CountTextNew"] = "Contains at least 12 characters";
return PasswordStrengthTexts2;
})(PasswordStrengthTexts || {});
// src/enums/languages.ts
var Language = /* @__PURE__ */ ((Language2) => {
Language2["English"] = "English";
Language2["French"] = "French";
Language2["Dutch"] = "Dutch";
Language2["German"] = "German";
Language2["Spanish"] = "Spanish";
Language2["Italian"] = "Italian";
Language2["Japanese"] = "Japanese";
Language2["PortugueseBrazil"] = "Portuguese (Brazil)";
Language2["Danish"] = "Danish";
Language2["Norwegian"] = "Norwegian";
Language2["Polish"] = "Polish";
Language2["Swedish"] = "Swedish";
return Language2;
})(Language || {});
var LanguageCode = {
["English" /* English */]: "en",
["French" /* French */]: "fr",
["Dutch" /* Dutch */]: "nl",
["German" /* German */]: "de",
["Spanish" /* Spanish */]: "es",
["Italian" /* Italian */]: "it",
["Japanese" /* Japanese */]: "ja",
["Portuguese (Brazil)" /* PortugueseBrazil */]: "pt-br",
["Danish" /* Danish */]: "da",
["Norwegian" /* Norwegian */]: "nb",
["Polish" /* Polish */]: "pl",
["Swedish" /* Swedish */]: "sv"
};
// src/enums/evaluationTools.ts
var EVALUATION_TOOLS = {
SkillsTests: {
displayName: "Skills tests",
label: "evaluation_tool_skill_test",
step4Name: "Tests"
},
CustomQuestions: {
displayName: "Custom questions",
label: "evaluation_tool_custom_questions",
step4Name: "Custom questions"
},
AIVideoInterview: {
displayName: "AI interview",
label: "evaluation_tool_two_ways_ai_interview",
step4Name: "AI interview"
},
AIResumeScoring: {
displayName: "Resume scoring",
label: "evaluation_tool_ai_resume",
step4Name: "Resume scoring"
},
OneWayInterview: {
displayName: "Video questions",
label: "evaluation_tool_one_way_ai_interview",
step4Name: "Video questions"
},
QualifyingQuestions: {
displayName: "Qualifying questions",
label: "evaluation_tool_knockout_questions",
step4Name: "Qualifying questions"
}
};
export {
TestName,
ProgrammingLanguages,
TestDuration,
CodingTaskOutput,
PersonalityAndCultureTestName,
TestKeyWord,
TestType,
TestFormat,
TestDurations,
TestsCount,
TestFilterNames,
CodingQuestions,
CreateCodingTestHeaders,
PracticeQuestions,
PageSize,
MyAssessmentTableHeader,
TalentAssessmentTableHeader,
Sort,
MenuItem,
SideNavItem,
Colour,
Benchmark,
HiringStage,
CheatingMonitorList,
DownloadFormat,
URLs,
CreatingAssessmentsSteps,
TestGorillaTheme,
AssessmentStatus,
AssessmentResultStatus,
Pronoun,
JobSearchStatus,
Proficiency,
CandidateStatusFilters,
CandidateMeta,
BehaviourLogFlags,
TalentFilters,
KitchenAssistantTalentDetails,
DogTrainerTalentDetails,
SourcingInvitationMessage,
IntegrationsImageSrc,
Integrations,
OneWayInterviewQuestionName,
CustomQuestionName,
CustomQuestionDescription,
Duration,
CustomQuestionsFilters,
CustomQuestions,
CustomQuestionsContent,
City,
Cities,
Countries,
WorkArrangements,
JobRoles,
AcademicEditorTemplate,
CompanyName,
Currency,
Plans,
TeamRoles,
PasswordStrengthTexts,
Language,
LanguageCode,
EVALUATION_TOOLS
};
//# sourceMappingURL=chunk-B64Y5SGV.mjs.map
{"version":3,"sources":["../src/enums/tests.ts","../src/enums/ui.ts","../src/enums/candidates.ts","../src/enums/integrations.ts","../src/enums/customQuestions.ts","../src/enums/locations.ts","../src/enums/company.ts","../src/enums/languages.ts","../src/enums/evaluationTools.ts"],"sourcesContent":["import { baseURL, isLocalEnvironment } from '../config';\n\nexport enum TestName {\n CultureAdd = 'Culture add',\n Communication = 'Communication',\n Motivation = 'Motivation',\n Disc = 'DISC',\n CustomQuestion = 'Custom questions',\n PHPCoding_stage = 'PHP (coding): object-oriented programming',\n PHPCoding_prod = 'PHP (Coding): Object-Oriented Programming',\n PythonCodingDebugging = 'Coding: Debugging',\n PythonCodingDebugging_prod = 'Python (Coding): Debugging',\n PythonCodingEntryLevel = 'Python (coding): entry-level algorithms',\n AttentionToDetail = 'Attention to Detail (Textual)',\n EnglishProficiency = 'English C1 (Advanced)',\n EnglishIntermediate = 'English (intermediate/B1)',\n RubyOnRails = 'Ruby on Rails',\n JavaScriptCodingEntryLevel = 'JavaScript (Coding): Entry-Level Algorithms',\n TypeScriptCodingEntryLevel = 'TypeScript (coding): entry-level algorithms',\n PhpEntryLevel = 'PHP (coding): intermediate-level algorithms',\n SqliteIntermediate = 'SQLite (coding): intermediate-level querying',\n SQLiteEntryLevel = 'SQLite (coding): entry-level database operations',\n JavaEntryLevel = 'Java (coding): entry-level algorithms',\n CCodingEntryLevel = 'C (coding): entry-level algorithms',\n CPPCodingEntryLevel = 'C++ (coding): entry-level algorithms',\n CHashCodingEntryLevel = 'C# (coding): entry-level algorithms',\n RubyEntryLevel = 'Ruby (coding): entry-level algorithms',\n Ennéagramme = 'Ennéagramme',\n AttentionToDetailVisual = 'Attention to detail (visual)',\n WorkingWithData = 'Working with data',\n ReadingComprehension = 'Reading comprehension',\n TypingSpeedLowerCase = 'Typing Speed (Lowercase Only)',\n TypingSpeedCapitalization = 'Typing Speed (Capitalization and Punctuation)',\n TypingSpeedNumbersOnly = 'Typing Speed (Numbers Only)',\n VerbalReasoning = 'Verbal Reasoning',\n ProblemSolving = 'Problem Solving',\n ProblemSolvingStaging = 'Problem solving',\n Big5 = 'Big 5 (OCEAN)',\n TimeManagement = 'Time Management',\n TimeManagementStaging = 'Time management',\n RubyDebugging = 'Ruby (coding): debugging',\n CodingEntryLevel = 'Coding: Entry-level algorithms',\n Tableau = 'Tableau',\n FollowingInstructions = 'Following instructions',\n UnderstandingInstructions = 'Understanding instructions',\n GoogleSpreadsheetSimulation = 'Google Sheets Spreadsheet Simulation',\n CloudSystemAdministration = 'Cloud System Administration',\n AndroidKotlin = 'Android Development Using Kotlin',\n ActiveListening = 'Active Listening',\n MySQL = 'MySQL',\n SpreadsheetSimulation = 'Spreadsheet Simulation: Google Sheets (Intermediate)',\n UniversalSkillsProfiler = 'Universal Skills Profiler',\n Enneagram = 'Enneagram',\n HTML5 = 'HTML5',\n CriticalThinking = 'Critical thinking',\n HubspotCRM = 'Hubspot CRM',\n Shopify = 'Shopify',\n Laravel = 'Laravel',\n Flutter = 'Flutter',\n IntermediateMath = 'Intermediate Math',\n Zendesk = 'Zendesk CS',\n PurchaseManager = 'Purchase Manager',\n SQLQuerying = 'SQLite (Coding): Intermediate-Level Querying',\n ImmersiveTest = 'Customer Service (Immersive Role-Play)',\n AIResume = 'AI Resume Scoring',\n SoftwareArchitect = 'Software architect',\n AWS = 'AWS',\n}\n\nexport enum ProgrammingLanguages {\n Python = 'Python',\n JavaScript = 'JavaScript',\n TypeScript = 'TypeScript',\n Php = 'PHP',\n Sqlite = 'SQLite',\n Java = 'Java',\n C = 'C',\n CPP = 'C++',\n CHash = 'C#',\n Ruby = 'Ruby',\n}\n\nexport const TestDuration = getTestDuration();\n\nfunction getTestDuration() {\n if (baseURL.includes('app')) {\n return {\n CultureAdd: '10',\n AttentionToDetail: '12',\n AttentionToDetailVisual: '10',\n EnglishProficiency: '10',\n CustomTest: '10',\n PythonCoding: '14',\n };\n } else if (isLocalEnvironment) {\n return {\n CultureAdd: '10',\n AttentionToDetail: '12',\n AttentionToDetailVisual: '10',\n EnglishProficiency: '10',\n CustomTest: '10',\n PythonCoding: '8',\n };\n } else {\n return {\n CultureAdd: '10',\n AttentionToDetail: '10',\n AttentionToDetailVisual: '10',\n EnglishProficiency: '10',\n CustomTest: '10',\n PythonCoding: '14',\n };\n }\n}\n\nexport enum CodingTaskOutput {\n TaskSuccess = 'Code executed successfully',\n TaskFailure = 'Task finished with errors.Traceback (most recent call last):',\n TaskMessage = 'Task',\n EmptyScriptTaskMessage = 'Run tests to check your code',\n}\n\nexport enum PersonalityAndCultureTestName {\n CultureAddSurvey = 'Culture add survey',\n MotivationTestSurvey = 'Motivation test survey',\n}\n\nexport enum TestKeyWord {\n Motivation = 'Motivation',\n}\n\nexport enum TestType {\n PersonalityAndCulture = 'Personality & culture',\n ProgrammingSkills = 'Programming skills',\n}\n\nexport enum TestFormat {\n MultipleChoice = 'Multiple-choice',\n Coding = 'Coding',\n Typing = 'Typing',\n Questionnaire = 'Questionnaire',\n Simulation = 'Simulation',\n}\n\nexport enum TestDurations {\n ZeroToTenMinutes = 'Up to 10 mins',\n ElevenToTwentyMinutes = '11 to 20 mins',\n TwentyoneToThirtyMinutes = '21 to 30 mins',\n ThirtyoneTosixtyMinutes = '31 to 60 mins',\n}\n\nexport enum TestsCount {\n ZeroTests = '0 added',\n OneTests = '1 test',\n TwoTests = '2 added',\n ThreeTests = '3 test',\n FourTests = '4 test',\n FiveTests = '5 added',\n}\n\nexport enum TestFilterNames {\n Library = 'Show tests from',\n RoleSpecific = 'Skills for',\n Focus = 'Focus',\n Duration = 'Duration',\n Format = 'Format',\n Highlights = 'Highlights',\n}\n\nexport enum CodingQuestions {\n Python = 'Python',\n}\n\nexport enum CreateCodingTestHeaders {\n FunctionSignature = 'Function signature',\n InitialCode = 'Initial code',\n TestCases = 'Test cases',\n VerificationCode = 'Verification code',\n}\n\nexport enum PracticeQuestions {\n AttentionToDetail = 'info This is the first practice question. You are in charge of sending invitations for a class reunion next month. You compare the address on file for one participant with the address available in the yearbook, which are as shown below',\n CodingQuestion = 'The purpose of this question is to show you how coding tests work. You are not being scored for anything in this question.',\n EnglishProficiency = 'Read the text and choose the synonym of the underlined word.',\n RubyOnRails = 'Which of the available queries returns the authors who have written at least one book?',\n}\n","export enum PageSize {\n Ten = 10,\n TwentyFive = 25,\n Fifty = 50,\n}\n\nexport enum MyAssessmentTableHeader {\n DateCreated = 'Job Created',\n LastActivity = 'Last activity',\n}\n\nexport enum TalentAssessmentTableHeader {\n CompanyName = 'COMPANY NAME',\n InvitedOn = 'INVITED ON',\n LastActivity = 'LAST ACTIVITY',\n}\n\nexport enum Sort {\n Ascending = 'ascending',\n Decending = 'descending',\n}\n\nexport enum MenuItem {\n TeamManagement = 'Team Management',\n Integrations = 'Integrations',\n MyCompany = 'My company',\n Logout = 'Log out',\n PlanAndBilling = 'Plan & billing',\n MyProfile = 'My profile',\n // Restricted roles (e.g. Hiring Manager) label the account-menu entry \"Profile\";\n // the substring also matches the full-access \"My profile\" label.\n AccountProfile = 'Profile',\n LogOut = 'Log out',\n Notifications = 'Notifications',\n AssessmentSettings = 'Settings',\n}\n\nexport enum SideNavItem {\n Home = 'Home',\n Jobs = 'Jobs',\n Sourcing = 'Sourcing',\n Candidates = 'Candidates',\n Analytics = 'Analytics',\n TestLibrary = 'Test library',\n WhatsNew = \"What's new\",\n HelpCenter = 'Help center',\n}\n\nexport enum Colour {\n Black = '#000000',\n}\n\nexport enum Benchmark {\n PercentageCorrect = 'Percentage of correct answers',\n AllCandidates = 'All candidates',\n Percentile = 'Percentile',\n}\n\nexport enum HiringStage {\n Interviewed = 'Interviewed',\n Hired = ' Hired 🎉',\n}\n\nexport enum CheatingMonitorList {\n DeviceUsed = 'Device used\\nDesktop',\n WebcamEnabled = 'Webcam enabled?\\nYes',\n FullScreenMode = 'Full-screen mode always active?\\nYes',\n MousePosition = 'Mouse always in assessment window?\\nYes',\n}\n\nexport enum DownloadFormat {\n Csv = 'CSV',\n Excel = 'Excel',\n Pdf = 'PDF',\n}\n\nexport enum URLs {\n TestGorillaPublicUrl = 'https://www.testgorilla.com/',\n TestGorillaPublicPage = 'TestGorilla',\n TestGorillaHelpPage = 'Help center',\n TestGorillaFacebook = 'Facebook',\n TestGorillaInstagram = 'Instagram',\n TestGorillaLinkedin = 'LinkedIn',\n Support = 'support.testgorilla.com',\n CandidateSupport = 'candidates.testgorilla.com',\n CandidateHub = 'talent-staging.testgorilla.com/create-account',\n TasOldFlow = 'https://assessment.testgorilla.com/testtaker/takeinvitation/',\n TasNewFlow = 'https://talent-assessment.testgorilla.com/',\n privacyPolicyLink = 'https://www.testgorilla.com/terms/privacy-policy',\n CandidateTerms = 'https://www.testgorilla.com/candidate-terms',\n}\n\nexport enum CreatingAssessmentsSteps {\n Step1 = 'Job details',\n Step2 = 'Assessment',\n Step3 = 'Configuration',\n Step4 = 'Finalize',\n}\n\nexport enum TestGorillaTheme {\n BgColor = '#d410aa',\n}\n","export enum AssessmentStatus {\n Completed = 'Completed',\n Invited = 'Invited',\n Closed = 'Closed',\n}\n\nexport enum AssessmentResultStatus {\n Unavailable = 'Unavailable',\n}\n\nexport enum Pronoun {\n HeHim = 'He/Him',\n}\n\nexport enum JobSearchStatus {\n ActivelySearching = 'Actively searching',\n OpenToNewChallenges = 'Open to new challenges',\n NotLookingRightNow = 'Not looking right now',\n}\n\nexport enum Proficiency {\n None = 'None',\n}\n\nexport enum CandidateStatusFilters {\n Started = 'Started',\n Invited = 'Invitation delivered',\n Completed = 'Completed',\n}\n\nexport enum CandidateMeta {\n TestInfoTimerText = 'Please stay on this screen. The timer for your next test has started and cannot be paused. The timer continues if you close the browser.',\n TestInfoTimer30MText = 'Please stay on this screen. The timer for your next test has started and cannot be paused. The timer continues if you close the browser.',\n TestInfoTimerPlainText = 'Please stay on this screen. The timer for your next test has started and cannot be paused. You must complete this test in the next ',\n TestInfoTimerTextTasFlow = 'Please stay on this screen. The timer for your next test has started and cannot be paused. The timer continues even when you close the browser.',\n}\n\nexport enum BehaviourLogFlags {\n DeviceUsed = 'Device used',\n FilledOutOnceFromIP = 'Filled out only once from IP address?',\n WebcamAlwaysEnabled = 'Webcam always enabled?',\n FullScreenExit = 'Full-screen mode exit',\n TabSwitch = 'Tab switch',\n DevToolsOpened = 'Developer tools opened',\n}\n\nexport enum TalentFilters {\n JobRole = 'Kitchen Assistant',\n LocationName = 'Lusaka, Zambia',\n YearsOfExperience = '10',\n MinSalary = '125000',\n MaxSalary = '395000',\n MinSalaryDefault = '0',\n MaxSalaryDefault = '500000',\n SalaryType = 'Annually',\n}\n\nexport enum KitchenAssistantTalentDetails {\n JobRole = 'Kitchen Assistant',\n LocationName = 'Lusaka, Zambia',\n Salary = '$30,000/yr',\n YearsOfExperience = '15 years exp.',\n JobTitle = 'Kitchen Assistant at Kitchen Company',\n}\n\nexport enum DogTrainerTalentDetails {\n JobRole = 'Dog Trainer',\n LocationName = 'Sydney, Australia',\n Salary = '$60,000/yr',\n YearsOfExperience = '30 years exp.',\n JobTitle = 'Dog trainer at Dog trainer organization',\n WorkExperienceTitle = 'Dog trainer',\n WorkExperienceDescription = 'Training dogs',\n VerifiedSkill_1 = 'HTML5',\n}\n\nexport enum SourcingInvitationMessage {\n Custom = 'Hello, \\n\\n we would like to invite you. Please find the details below. \\n Details',\n}\n","export enum IntegrationsImageSrc {\n Breezy = 'assets/integrations/brz.png',\n GreenHouse = 'assets/integrations/ghs.png',\n JazzHR = 'assets/integrations/jhr.png',\n Personio = 'assets/integrations/psn.png',\n Recruitee = 'assets/integrations/rct.png',\n}\n\nexport enum Integrations {\n Breezy = 'Breezy',\n GreenHouse = 'Greenhouse',\n JazzHR = 'JazzHR',\n Recruitee = 'Recruitee',\n}\n","export enum OneWayInterviewQuestionName {\n SellingAPen = 'Selling a pen',\n PrioritizingTasks = 'Prioritizing tasks',\n TacklingChallenges = 'Tackling challenges',\n ExceedingExpectations = 'Exceeding expectations',\n}\n\nexport enum CustomQuestionName {\n Video = 'Video',\n Essay = 'Essay',\n MultipleChoice = 'Multiple-choice',\n FileUpload = 'File upload',\n Code = 'Code',\n AllQuestionCategories = 'Select all question categories',\n PriorExperience = 'Prior experience',\n Motivation = 'Motivation',\n SoftSkills = 'Soft skills',\n JobSkills = 'Job skills',\n Finance = 'Finance',\n CustomerService = 'Customer service',\n Sales = 'Sales',\n Marketing = 'Marketing',\n IT = 'IT',\n AdministrativeSupport = 'Administrative support',\n Management = 'Management',\n SellingAPen = 'Selling a pen',\n TacklingChallenges = 'Tackling challenges',\n HandlingUnreasonableRequests = 'Handling unreasonable requests',\n}\n\nexport enum CustomQuestionDescription {\n SellingAPen = 'Sell me the first pen within reach.',\n TacklingChallenges = 'Describe an especially difficult assignment or project you have worked on. What was your role? How did you approach the requirements, and what was the outcome?',\n HandlingUnreasonableRequests = 'Describe a time when you had to handle an unfair or unreasonable complaint or a request from a customer. What did the customer ask, and how did you handle it?',\n}\n\nexport enum Duration {\n ThirtySeconds = '30 secs',\n FiveMinutes = '5 mins',\n TwoMinutes = '2 mins',\n TenMinutes = '10 mins',\n ZeroMinutes = '0 mins',\n SixMinutes = '6 mins',\n FifteenMinutes = '15 mins',\n FiftyFiveMinues = '55 mins',\n FiftyMinues = '50 mins',\n FortyMinutes = '40 mins',\n FortyTwoMinutes = '42 mins',\n FortyFourMinutes = '44 mins',\n FiftyNineMinutes = '59 mins',\n FiftyFourMinutes = '54 mins',\n FiftyEightMinutes = '58 mins',\n SixtyNineMinutes = '69 mins',\n SeventyThreeMinutes = '73 mins',\n}\n\nexport enum CustomQuestionsFilters {\n Assessment = 'Assessment name',\n Library = 'Library',\n Format = 'Format',\n Topic = 'Topic',\n RoleSpecific = 'Role specific',\n}\n\nexport enum CustomQuestions {\n TestGorillaLibrary = 'TestGorilla library',\n MyLibrary = 'My library',\n AddingValue = 'Adding value',\n AddingValueDescription = 'How do you plan to add value to this organization?',\n HowAreYou = 'How are you?',\n WhereAreYouFrom = 'Where are you from?',\n UploadYourResume = 'Upload your resume',\n ValidateRegex = 'Validate Regex',\n CreateIntroVideo = 'Create intro video of yourself',\n IntroducingYourself = 'Introducing yourself',\n TacklingChallenges = 'Tackling challenges',\n TacklingChallengesDescription = 'Describe an especially difficult assignment or project you have worked on. What was your role? How did you approach the requirements, and what was the outcome?',\n}\n\nexport enum CustomQuestionsContent {\n IntroducingYourself = \"Introduce yourself in 60 seconds and explain why you're a great\",\n AddingValue = 'How do you plan to add value to this organization?',\n FailingToDeliver = \"Tell me about a time when you didn't deliver on your key objectives. What did you learn?\",\n FindingAGreaterPurpose = 'How would working in this role help you fulfill a greater personal purpose?',\n WorkingCrossFunctionally = 'How do you transcend your role as a finance professional and interact cross-functionally with people in other departments?',\n}\n","export enum City {\n Ardamata = 'Ardamata',\n Aiea = 'Aiea',\n Nairobi = 'Nairobi',\n}\n\nexport enum Cities {\n Amsterdam = 'Amsterdam',\n London = 'London',\n Nairobi = 'Nairobi',\n MexicoCity = 'Mexico City',\n Berlin = 'Berlin',\n}\n\nexport enum Countries {\n Zambia = 'Zambia',\n Australia = 'Australia',\n}\n\nexport enum WorkArrangements {\n Remote = 'Remote',\n Hybrid = 'Hybrid',\n OnSite = 'On/Site',\n}\n\nexport enum JobRoles {\n NetDeveloper = '.NET Developer',\n AcademicEditor = 'Academic Editor',\n FullStackDeveloper = 'Full Stack Developer',\n AccountManager = 'Account Manager',\n AcademicSupportOfficer = 'Academic Support Officer',\n PythonDeveloper = 'Python Developer',\n Developer = 'Developer',\n EssentialSkillsTemplate = 'Essential Skills Template',\n DataAnalyst = 'Data Analyst',\n}\n\nexport enum AcademicEditorTemplate {\n AcademicEditor = 'Communication Culture English Working ',\n}\n","export enum CompanyName {\n Testgorilla = 'TestGorilla',\n}\n\nexport enum Currency {\n USD = 'USD',\n}\n\nexport enum Plans {\n PayAsYouGo = 'Pay as you go',\n Scale = 'Scale',\n Business = 'Business',\n Free = 'Free',\n Starter = 'Starter',\n Pro = 'Pro',\n Lite = 'Lite',\n Core = 'Core',\n}\n\nexport enum TeamRoles {\n HiringManager = 'Hiring Manager',\n Admin = 'Admin',\n Recruiter = 'Recruiter',\n Owner = 'Owner',\n}\n\nexport enum PasswordStrengthTexts {\n LowerCharacter = 'contains at least one lower character',\n UpperCharacter = 'contains at least one upper character',\n DigitCharacter = 'contains at least one digit',\n SpecialCharacter = 'contains at least one special character',\n CountText = 'contains at least 12 characters',\n LowerCaseNew = 'Contains at least one lowercase',\n UpperCaseNew = 'Contains at least one uppercase',\n DigitNew = 'Contains at least one number',\n SpecialCharacterNew = 'Contains at least one special character',\n CountTextNew = 'Contains at least 12 characters',\n}\n","export enum Language {\n English = 'English',\n French = 'French',\n Dutch = 'Dutch',\n German = 'German',\n Spanish = 'Spanish',\n Italian = 'Italian',\n Japanese = 'Japanese',\n PortugueseBrazil = 'Portuguese (Brazil)',\n Danish = 'Danish',\n Norwegian = 'Norwegian',\n Polish = 'Polish',\n Swedish = 'Swedish',\n}\n\nexport const LanguageCode: Record<Language, string> = {\n [Language.English]: 'en',\n [Language.French]: 'fr',\n [Language.Dutch]: 'nl',\n [Language.German]: 'de',\n [Language.Spanish]: 'es',\n [Language.Italian]: 'it',\n [Language.Japanese]: 'ja',\n [Language.PortugueseBrazil]: 'pt-br',\n [Language.Danish]: 'da',\n [Language.Norwegian]: 'nb',\n [Language.Polish]: 'pl',\n [Language.Swedish]: 'sv',\n};\n","/**\n * Single source of truth for evaluation tools\n * Contains display names, labels, and step-specific names\n */\nexport const EVALUATION_TOOLS = {\n SkillsTests: {\n displayName: 'Skills tests',\n label: 'evaluation_tool_skill_test',\n step4Name: 'Tests',\n },\n CustomQuestions: {\n displayName: 'Custom questions',\n label: 'evaluation_tool_custom_questions',\n step4Name: 'Custom questions',\n },\n AIVideoInterview: {\n displayName: 'AI interview',\n label: 'evaluation_tool_two_ways_ai_interview',\n step4Name: 'AI interview',\n },\n AIResumeScoring: {\n displayName: 'Resume scoring',\n label: 'evaluation_tool_ai_resume',\n step4Name: 'Resume scoring',\n },\n OneWayInterview: {\n displayName: 'Video questions',\n label: 'evaluation_tool_one_way_ai_interview',\n step4Name: 'Video questions',\n },\n QualifyingQuestions: {\n displayName: 'Qualifying questions',\n label: 'evaluation_tool_knockout_questions',\n step4Name: 'Qualifying questions',\n },\n} as const;\n\n// Type-safe accessors for the unified definition\nexport type EvaluationToolKey = keyof typeof EVALUATION_TOOLS;\n\n// Helper type to get display name values\nexport type EvaluationToolDisplayName = (typeof EVALUATION_TOOLS)[EvaluationToolKey]['displayName'];\n\n// Helper type to get label values\nexport type EvaluationToolLabel = (typeof EVALUATION_TOOLS)[EvaluationToolKey]['label'];\n\n// Helper type to get step4 name values\nexport type EvaluationToolStep4Name = (typeof EVALUATION_TOOLS)[EvaluationToolKey]['step4Name'];\n"],"mappings":"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","names":["TestName","ProgrammingLanguages","CodingTaskOutput","PersonalityAndCultureTestName","TestKeyWord","TestType","TestFormat","TestDurations","TestsCount","TestFilterNames","CodingQuestions","CreateCodingTestHeaders","PracticeQuestions","PageSize","MyAssessmentTableHeader","TalentAssessmentTableHeader","Sort","MenuItem","SideNavItem","Colour","Benchmark","HiringStage","CheatingMonitorList","DownloadFormat","URLs","CreatingAssessmentsSteps","TestGorillaTheme","AssessmentStatus","AssessmentResultStatus","Pronoun","JobSearchStatus","Proficiency","CandidateStatusFilters","CandidateMeta","BehaviourLogFlags","TalentFilters","KitchenAssistantTalentDetails","DogTrainerTalentDetails","SourcingInvitationMessage","IntegrationsImageSrc","Integrations","OneWayInterviewQuestionName","CustomQuestionName","CustomQuestionDescription","Duration","CustomQuestionsFilters","CustomQuestions","CustomQuestionsContent","City","Cities","Countries","WorkArrangements","JobRoles","AcademicEditorTemplate","CompanyName","Currency","Plans","TeamRoles","PasswordStrengthTexts","Language"]}
// src/config/resolve.ts
var EPHEMERAL_PREFIX_PATTERN = /https?:\/\/(.+?)-(\d+)-[^.]+\.dev\.testgorilla\.com/;
var LOCAL_MAILHOG_URL = "http://localhost:8025";
function defineRequiredSecret(target, property, value, envVar) {
Object.defineProperty(target, property, {
enumerable: false,
configurable: true,
get() {
if (value === void 0 || value === "") {
throw new Error(
`[e2e-framework] ${envVar} is not set. The framework ships no credential defaults \u2014 export ${envVar} (see your team's 1Password e2e .env entry) before running tests.`
);
}
return value;
}
});
}
function resolveAccounts(env3) {
const nodeIndexedOrganizer = env3.CIRCLE_NODE_TOTAL ? `dummy.tests+organizer${env3.CIRCLE_NODE_INDEX}@testgorilla.com` : `dummy.tests+organizer11@testgorilla.com`;
const accountIndex = env3.E2E_ACCOUNT_INDEX;
const accounts2 = {
organizerEmail: env3.userEmail ?? (accountIndex !== void 0 ? `dummy.tests+organizer${accountIndex}@testgorilla.com` : nodeIndexedOrganizer),
candidateEmail: env3.candidateEmail ?? "dummy.tests@testgorilla.com",
hiringManagerEmail: env3.hiringManagerEmail ?? "dummy.tests+hiringmanager01@testgorilla.com",
recruiterEmail: env3.recruiterEmail ?? "dummy.tests+recruiter1@testgorilla.com",
adminEmail: env3.adminEmail ?? "dummy.tests+admin1@testgorilla.com",
newAdminEmail: env3.newAdminEmail ?? "dummy.tests+newadmin@testgorilla.com",
freeUserEmail: env3.freeUserEmail ?? "dummy.tests+free0@testgorilla.com",
corePlanUserEmail: env3.corePlanUserEmail ?? "dummy.tests+coreplan@testgorilla.com",
plusPlanUserEmail: env3.plusPlanUserEmail ?? "dummy.tests+plus@testgorilla.com",
proPlanUserEmail: env3.proPlanUserEmail ?? "dummy.tests+pro@testgorilla.com",
businessPlanUserEmail: env3.businessPlanUserEmail ?? "dummy.tests+business@testgorilla.com",
starterPlanUserEmail: env3.starterPlanUserEmail ?? "dummy.tests+starter@testgorilla.com",
myProfileUserEmail: env3.myProfileUserEmail ?? "dummy.tests+myprofile@testgorilla.com",
atsIntegrationsEmail: env3.atsIntegrationsEmail ?? "dummy.tests+ats-integrations@testgorilla.com"
};
defineRequiredSecret(accounts2, "password", env3.E2E_PASSWORD ?? env3.e2e_password, "E2E_PASSWORD");
defineRequiredSecret(
accounts2,
"candidatePassword",
env3.E2E_CANDIDATE_PASSWORD,
"E2E_CANDIDATE_PASSWORD"
);
return accounts2;
}
function resolveUrls(baseURL2, ephemeralPrefix2, ephemeralId2) {
const isEphemeral = !!ephemeralId2;
const ephemeralHost = (service) => `https://${ephemeralPrefix2}-${ephemeralId2}-${service}.dev.testgorilla.com`;
const isProd = baseURL2.includes("app.testgorilla");
const isDev = baseURL2.includes("dev.testgorilla");
const isLocalhost = baseURL2.includes("localhost");
return {
talentBase: isEphemeral ? ephemeralHost("talent") : isProd ? "https://talent.testgorilla.com" : isDev ? "https://talent-dev.testgorilla.com" : isLocalhost ? "http://localhost:4100" : "https://talent-staging.testgorilla.com",
talentAssessment: isEphemeral ? ephemeralHost("talent-assessment") : isProd ? "https://talent-assessment.testgorilla.com" : isDev ? "https://talent-assessment-dev.testgorilla.com" : isLocalhost ? "http://localhost:4100" : "https://talent-assessment-staging.testgorilla.com",
talentApi: isEphemeral ? ephemeralHost("api-talent") : isProd ? "https://api-talent.testgorilla.com" : isDev ? "https://api-talent-dev.testgorilla.com" : isLocalhost ? "http://localhost:4200" : "https://api-talent-staging.testgorilla.com",
codeRunnerApi: isProd ? "https://cr-v2.testgorilla.com" : isDev ? "https://cr-v2-dev.testgorilla.com" : "https://cr-v2-staging.testgorilla.com",
websiteBase: isProd ? "https://www.testgorilla.com" : isDev && !isEphemeral ? "https://website-dev.testgorilla.com" : "https://website-staging.testgorilla.com",
mailpit: isEphemeral ? ephemeralHost("mailpit") : LOCAL_MAILHOG_URL,
localstack: isEphemeral ? ephemeralHost("localstack") : null
};
}
function resolveTgEnvironment(env3 = process.env) {
const baseURL2 = env3.baseURL || "https://staging.testgorilla.com";
const ephemeralMatch = baseURL2.match(EPHEMERAL_PREFIX_PATTERN);
const declaredEnvironment = env3.E2E_ENVIRONMENT?.toLowerCase();
const isEphemeralEnvironment2 = declaredEnvironment ? declaredEnvironment === "ephemeral" : !!ephemeralMatch;
if (isEphemeralEnvironment2 && !ephemeralMatch) {
throw new Error(
`[e2e-framework] E2E_ENVIRONMENT=ephemeral but baseURL "${baseURL2}" does not match <prefix>-<id>-<service>.dev.testgorilla.com \u2014 sibling service URLs cannot be derived.`
);
}
const ephemeralPrefix2 = isEphemeralEnvironment2 && ephemeralMatch ? ephemeralMatch[1] : null;
const ephemeralId2 = isEphemeralEnvironment2 && ephemeralMatch ? ephemeralMatch[2] : null;
const environment2 = baseURL2.split(".testgorilla.com")[0].split("https://")[1] || "staging";
const adminURL2 = env3.adminURL || (isEphemeralEnvironment2 ? `https://${ephemeralPrefix2}-${ephemeralId2}-backend.dev.testgorilla.com` : environment2 === "app" ? `https://new-admin.testgorilla.com` : `https://${environment2}-new-admin.testgorilla.com`);
const isProd = baseURL2.includes("app.testgorilla");
const isDev = baseURL2.includes("dev.testgorilla");
const isLocalhost = baseURL2.includes("localhost");
return {
baseURL: baseURL2,
environment: environment2,
isEphemeralEnvironment: isEphemeralEnvironment2,
ephemeralPrefix: ephemeralPrefix2,
ephemeralId: ephemeralId2,
isLocalEnvironment: env3.localEnvironment === "true" || isEphemeralEnvironment2,
adminURL: adminURL2,
urls: resolveUrls(baseURL2, ephemeralPrefix2, ephemeralId2),
emails: {
signupFrom: isProd ? "hello@testgorilla.com" : isLocalhost ? "noreply@example" : isDev || isEphemeralEnvironment2 ? "hello@maildev.testgorilla.com" : "hello@mailstaging.testgorilla.com",
assessmentsFrom: isProd ? "assessments@testgorilla.com" : isLocalhost ? "assessments@example.com" : isDev || isEphemeralEnvironment2 ? "assessments@maildev.testgorilla.com" : "assessments@mailstaging.testgorilla.com"
},
accounts: resolveAccounts(env3)
};
}
// src/config/runId.ts
import * as os from "os";
import { env } from "process";
function getRunId() {
if (!env.E2E_RUN_ID) {
env.E2E_RUN_ID = env.CI ? `ci${shortHash(env.CIRCLE_WORKFLOW_ID ?? "")}` : localRunId();
}
return env.E2E_RUN_ID;
}
function shortHash(input) {
let hash = 0;
for (const char of input) {
hash = hash * 31 + char.charCodeAt(0) >>> 0;
}
return hash.toString(36).padStart(6, "0").slice(-6);
}
function localRunId() {
let user = "";
try {
user = os.userInfo().username.toLowerCase().replace(/[^a-z0-9]/g, "").slice(0, 8);
} catch {
}
const now = /* @__PURE__ */ new Date();
const pad = (n) => String(n).padStart(2, "0");
const stamp = `${pad(now.getMonth() + 1)}${pad(now.getDate())}${pad(now.getHours())}${pad(
now.getMinutes()
)}`;
return `loc${user || "unknown"}${stamp}`;
}
// src/config/algolia.ts
var ALGOLIA_APP_ID = process.env.ALGOLIA_APP_ID || "V8Y626J4K8";
var ALGOLIA_PROD_INDEX = process.env.ALGOLIA_PROD_INDEX || "production_tests_index";
var ALGOLIA_STAGING_INDEX = process.env.ALGOLIA_STAGING_INDEX || "staging_tests_index";
var ALGOLIA_EPHEMERAL_INDEX = process.env.ALGOLIA_EPHEMERAL_INDEX || "ephemeral_tests_index";
var ALGOLIA_PROD_API_KEY = process.env.ALGOLIA_PROD_API_KEY || "NDc2N2JlMmY5ZGE2NzM4NDIwOWM2ODkyMWY0Yjk5YjYyNTA5NTViNDg2YzNlN2VlZDE4MmYyOWE3YmRjNjg1ZXJlc3RyaWN0SW5kaWNlcz1wcm9kdWN0aW9uX3Rlc3RzX2luZGV4";
var ALGOLIA_STAGING_API_KEY = process.env.ALGOLIA_STAGING_API_KEY || "ZjZmYWMwYjNkN2IxZjViYzA0OTZkZGE3OWY5MmVjYWMzN2RlYWJlYjcyOWRlMWQ3YjMwM2RjYjk0NDNjZGY0MXJlc3RyaWN0SW5kaWNlcz1zdGFnaW5nX3Rlc3RzX2luZGV4";
var ALGOLIA_EPHEMERAL_API_KEY = process.env.ALGOLIA_EPHEMERAL_API_KEY || "5beea78e78134e8270214f93b7032e7b";
var getAlgoliaUrl = () => {
const isProduction = baseURL.includes("app.testgorilla");
if (isEphemeralEnvironment) {
return `https://v8y626j4k8-dsn.algolia.net/1/indexes/${ALGOLIA_EPHEMERAL_INDEX}/query`;
}
const index = isProduction ? ALGOLIA_PROD_INDEX : ALGOLIA_STAGING_INDEX;
const domain = isProduction ? "algolianet.com" : "algolia.net";
const subdomain = isProduction ? "v8y626j4k8-2" : "v8y626j4k8-dsn";
return `https://${subdomain}.${domain}/1/indexes/${index}/query`;
};
var getAlgoliaHeaders = () => {
const isProduction = baseURL.includes("app.testgorilla");
let apiKey;
if (isEphemeralEnvironment) {
apiKey = ALGOLIA_EPHEMERAL_API_KEY;
} else {
apiKey = isProduction ? ALGOLIA_PROD_API_KEY : ALGOLIA_STAGING_API_KEY;
}
return {
"content-type": "application/x-www-form-urlencoded",
"x-algolia-api-key": apiKey,
"x-algolia-application-id": ALGOLIA_APP_ID
};
};
// src/config/constants.ts
import { env as env2 } from "process";
var DEFAULT_RETRY_COUNTER = 10;
var INCREASED_RETRY_COUNTER_50 = DEFAULT_RETRY_COUNTER * 1.5;
var INCREASED_RETRY_COUNTER_80 = DEFAULT_RETRY_COUNTER * 1.8;
var INCREASED_RETRY_COUNTER_200 = DEFAULT_RETRY_COUNTER * 2;
var INCREASED_RETRY_COUNTER_300 = DEFAULT_RETRY_COUNTER * 3;
var rawLogLevel = env2.LOG_LEVEL?.toUpperCase() || env2.API_LOG_LEVEL?.toUpperCase() || "WARN";
if (!env2.LOG_LEVEL && env2.API_LOG_LEVEL && !env2._LOG_DEPRECATION_WARNED) {
process.stderr.write(
"[logger] API_LOG_LEVEL is deprecated; use LOG_LEVEL instead (same values).\n"
);
env2._LOG_DEPRECATION_WARNED = "1";
}
var logLevel = rawLogLevel;
var logFile = env2.LOG_FILE || env2.API_LOG_FILE || "";
var apiLogLevel = logLevel;
var apiLogFile = logFile;
var assessmentList = JSON.parse(env2.assessments || "{}");
var MAILPIT_SERVER = "http://localhost:8025";
var simpleAssessmentName = `New Simple Assessment - ${Date.now()}`;
var invitationEmailSubject = "Your application at TestGorilla";
var emailReception = { slowEmailAPI: false };
// src/config/recaptcha.ts
var keyProvider;
function setRecaptchaBypassKeyProvider(provider) {
keyProvider = provider;
}
async function getRecaptchaBypassKey(backendEnvironment) {
const fromEnv = isEphemeralEnvironment ? process.env.RECAPTCHA_BYPASS_KEY_STAGE : process.env.RECAPTCHA_BYPASS_KEY;
if (fromEnv) {
return fromEnv;
}
const fromProvider = keyProvider ? await keyProvider(backendEnvironment) : void 0;
return fromProvider || "Not Set";
}
// src/config/randomData.ts
var FIRST_NAMES = [
"Alice",
"Bruno",
"Carmen",
"Diego",
"Elena",
"Felix",
"Greta",
"Hugo",
"Irene",
"Jonas",
"Katia",
"Liam",
"Marta",
"Nadia",
"Oscar",
"Paula",
"Quentin",
"Rosa",
"Sofia",
"Tomas",
"Ursula",
"Victor",
"Wanda",
"Xavier",
"Yara",
"Zoe",
"Andre",
"Bianca",
"Cesar",
"Dora"
];
var LAST_NAMES = [
"Almeida",
"Bauer",
"Castro",
"Dubois",
"Eriksen",
"Fischer",
"Garcia",
"Hansen",
"Ibrahim",
"Jansen",
"Keller",
"Lopez",
"Meyer",
"Novak",
"Olsen",
"Peeters",
"Quinn",
"Rossi",
"Schmidt",
"Torres",
"Ueda",
"Vargas",
"Weber",
"Xu",
"Yilmaz",
"Zhang"
];
var JOB_TITLE_AREAS = [
"Marketing",
"Product",
"Operations",
"Finance",
"Support",
"Engineering",
"Design",
"Sales",
"Research",
"Quality"
];
var JOB_TITLE_ROLES = [
"Manager",
"Specialist",
"Analyst",
"Coordinator",
"Engineer",
"Consultant",
"Associate",
"Director",
"Assistant",
"Lead"
];
var PHRASE_VERBS = [
"streamline",
"orchestrate",
"benchmark",
"optimize",
"aggregate",
"harness",
"incentivize",
"synthesize",
"iterate",
"scale"
];
var PHRASE_ADJECTIVES = [
"scalable",
"seamless",
"dynamic",
"proactive",
"granular",
"robust",
"frictionless",
"holistic",
"intuitive",
"compelling"
];
var PHRASE_NOUNS = [
"workflows",
"channels",
"metrics",
"platforms",
"roadmaps",
"pipelines",
"paradigms",
"synergies",
"deliverables",
"interfaces"
];
var CITIES = [
"Amsterdam",
"Barcelona",
"Copenhagen",
"Dublin",
"Edinburgh",
"Florence",
"Geneva",
"Hamburg",
"Istanbul",
"Jakarta",
"Krakow",
"Lisbon",
"Madrid",
"Nairobi",
"Oslo",
"Porto",
"Quito",
"Rotterdam",
"Seville",
"Tallinn"
];
var WORDS = [
"amber",
"breeze",
"cedar",
"delta",
"ember",
"fjord",
"garnet",
"harbor",
"indigo",
"juniper",
"karma",
"lagoon",
"meadow",
"nectar",
"onyx",
"prairie",
"quartz",
"ripple",
"summit",
"tundra"
];
var ALPHANUMERIC = "abcdefghijklmnopqrstuvwxyz0123456789";
var pick = (pool) => pool[Math.floor(Math.random() * pool.length)];
var randomFirstName = () => pick(FIRST_NAMES);
var randomLastName = () => pick(LAST_NAMES);
var randomFullName = () => `${randomFirstName()} ${randomLastName()}`;
var randomJobTitle = () => `${pick(JOB_TITLE_AREAS)} ${pick(JOB_TITLE_ROLES)}`;
var randomPhrase = () => `${pick(PHRASE_VERBS)} ${pick(PHRASE_ADJECTIVES)} ${pick(PHRASE_NOUNS)}`;
var randomWords = (count = 2) => Array.from({ length: count }, () => pick(WORDS)).join(" ");
var randomAlphaNumeric = (length = 1) => Array.from({ length }, () => ALPHANUMERIC[Math.floor(Math.random() * ALPHANUMERIC.length)]).join(
""
);
var randomCity = () => pick(CITIES);
var randomNumber = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
function convertPhoneNumberToString(phone) {
return phone.replaceAll(" ", "");
}
function generateRandomSpanishPhone() {
const eightLastDigits = Math.floor(Math.random() * 9e7);
return (6e8 + eightLastDigits).toString();
}
function randomizeName() {
return randomFirstName();
}
function randomizeUsername(email2) {
const [username, domain] = email2.split("@");
const epochTimestamp = Math.floor(Date.now() / 1e3);
const newUsername = `${username}+${epochTimestamp}`;
return `${newUsername}@${domain}`;
}
// src/config/index.ts
var cfg = resolveTgEnvironment();
var baseURL = cfg.baseURL;
var environment = cfg.environment;
var isEphemeralEnvironment = cfg.isEphemeralEnvironment;
var ephemeralPrefix = cfg.ephemeralPrefix;
var ephemeralId = cfg.ephemeralId;
var isLocalEnvironment = cfg.isLocalEnvironment;
var adminURL = cfg.adminURL;
var localMailHogURL = "http://localhost:8025";
var mailpitURL = () => cfg.urls.mailpit;
var localstackURL = () => cfg.urls.localstack;
var talentBaseURL = () => cfg.urls.talentBase;
var talentAssessmentURL = () => cfg.urls.talentAssessment;
var talentApiURL = () => cfg.urls.talentApi;
var codeRunnerApiURL = () => cfg.urls.codeRunnerApi;
var websiteBaseURL = () => cfg.urls.websiteBase;
var signupFromEmail = () => cfg.emails.signupFrom;
var assessmentsFromEmail = () => cfg.emails.assessmentsFrom;
var ifNotStagingRun = () => !cfg.baseURL.includes("staging.testgorilla");
var ifNotStagingOrEphemeralRun = () => ifNotStagingRun() && !cfg.isEphemeralEnvironment;
var ifNotLocalhostRun = () => !cfg.baseURL.includes("localhost");
var rewriteSignupUrlForEnv = (signupUrl) => {
const targetHost = new URL(cfg.baseURL).host;
return signupUrl.replace(/app\.testgorilla\.com/i, targetHost);
};
var prodTesttakerUrlString = "https://assessment.testgorilla.com";
var prodTASUrlString = "https://talent-assessment.testgorilla.com";
var stageTesttakerUrlString = "https://staging-assessment.testgorilla.com";
var stageTASUrlString = "https://talent-assessment-staging.testgorilla.com";
var devTASUrlString = "https://talent-assessment-dev.testgorilla.com";
var localTASUrlString = "http://localhost:4100";
var stagingTASAPIUrl = "https://api-talent-staging.testgorilla.com";
var CandidateInviteAssessment = "Candidate-Invite-Assessment-4-Do-not-archive";
var candidateExpiredAssessment = "Candidate-Expired-Assessment-1-Do-not-archive";
var candidateArchivedAssessment = "Candidate-Archived-Assessment-1-Do-not-archive";
var tasSimpleMcqAssessment = "TAS-MCQ-Assessment";
var tasCustomTestAssessment = "TAS-Custom-Test-Assessment";
var tasSimpleBulkAssessment = "TAS-Bulk-Assessment";
var accounts = cfg.accounts;
var email = cfg.accounts.organizerEmail;
var password = process.env.E2E_PASSWORD ?? process.env.e2e_password ?? "";
var candidateEmail = cfg.accounts.candidateEmail;
var hiringManagerEmail = cfg.accounts.hiringManagerEmail;
var recruiterEmail = cfg.accounts.recruiterEmail;
var adminEmail = cfg.accounts.adminEmail;
var newAdminEmail = cfg.accounts.newAdminEmail;
var freeUserEmail = cfg.accounts.freeUserEmail;
var corePlanUserEmail = cfg.accounts.corePlanUserEmail;
var plusPlanUserEmail = cfg.accounts.plusPlanUserEmail;
var proPlanUserEmail = cfg.accounts.proPlanUserEmail;
var businessPlanUserEmail = cfg.accounts.businessPlanUserEmail;
var starterPlanUserEmail = cfg.accounts.starterPlanUserEmail;
var myProfileUserEmail = cfg.accounts.myProfileUserEmail;
var atsIntegrationsEmail = cfg.accounts.atsIntegrationsEmail;
var EMAIL_DOMAIN = "@testgorilla.com";
var DUMMY_TESTS_PREFIX = "dummy.tests";
var mintCounter = 0;
var mintSuffix = () => `${getRunId()}x${Date.now().toString(36)}${mintCounter++}`;
var randCandidateEmail = (rand = "") => `${DUMMY_TESTS_PREFIX}+cand${rand}${mintSuffix()}${EMAIL_DOMAIN}`;
var randCustomerEmail = (rand = "") => `${DUMMY_TESTS_PREFIX}+cust${rand}${mintSuffix()}${EMAIL_DOMAIN}`;
var randTeamMemberEmail = (rand = "") => `${DUMMY_TESTS_PREFIX}+t${rand}${cfg.environment}+${mintSuffix()}${EMAIL_DOMAIN}`;
export {
resolveTgEnvironment,
getRunId,
getAlgoliaUrl,
getAlgoliaHeaders,
DEFAULT_RETRY_COUNTER,
INCREASED_RETRY_COUNTER_50,
INCREASED_RETRY_COUNTER_80,
INCREASED_RETRY_COUNTER_200,
INCREASED_RETRY_COUNTER_300,
logLevel,
logFile,
apiLogLevel,
apiLogFile,
assessmentList,
MAILPIT_SERVER,
simpleAssessmentName,
invitationEmailSubject,
emailReception,
setRecaptchaBypassKeyProvider,
getRecaptchaBypassKey,
randomFirstName,
randomLastName,
randomFullName,
randomJobTitle,
randomPhrase,
randomWords,
randomAlphaNumeric,
randomCity,
randomNumber,
convertPhoneNumberToString,
generateRandomSpanishPhone,
randomizeName,
randomizeUsername,
baseURL,
environment,
isEphemeralEnvironment,
ephemeralPrefix,
ephemeralId,
isLocalEnvironment,
adminURL,
localMailHogURL,
mailpitURL,
localstackURL,
talentBaseURL,
talentAssessmentURL,
talentApiURL,
codeRunnerApiURL,
websiteBaseURL,
signupFromEmail,
assessmentsFromEmail,
ifNotStagingRun,
ifNotStagingOrEphemeralRun,
ifNotLocalhostRun,
rewriteSignupUrlForEnv,
prodTesttakerUrlString,
prodTASUrlString,
stageTesttakerUrlString,
stageTASUrlString,
devTASUrlString,
localTASUrlString,
stagingTASAPIUrl,
CandidateInviteAssessment,
candidateExpiredAssessment,
candidateArchivedAssessment,
tasSimpleMcqAssessment,
tasCustomTestAssessment,
tasSimpleBulkAssessment,
accounts,
email,
password,
candidateEmail,
hiringManagerEmail,
recruiterEmail,
adminEmail,
newAdminEmail,
freeUserEmail,
corePlanUserEmail,
plusPlanUserEmail,
proPlanUserEmail,
businessPlanUserEmail,
starterPlanUserEmail,
myProfileUserEmail,
atsIntegrationsEmail,
randCandidateEmail,
randCustomerEmail,
randTeamMemberEmail
};
//# sourceMappingURL=chunk-TJHUXULD.mjs.map
{"version":3,"sources":["../src/config/resolve.ts","../src/config/runId.ts","../src/config/algolia.ts","../src/config/constants.ts","../src/config/recaptcha.ts","../src/config/randomData.ts","../src/config/index.ts"],"sourcesContent":["import type { E2eAccounts, E2eConfig, E2eUrls } from './types';\n\n/**\n * Ephemeral environment detection.\n *\n * CI declares the target via `E2E_ENVIRONMENT` (the e2e-tests orb's\n * `environment` job parameter): `ephemeral` means ephemeral, any other value\n * means not — even if the URL happens to look ephemeral. When the variable is\n * unset (local runs, orb versions that don't export it yet), the baseURL\n * shape is the fallback signal.\n *\n * The URL parse itself stays either way: sibling service hosts are rebuilt\n * from the captured `<prefix>` and `<id>`. It is generic — no per-repo prefix\n * whitelist, so `backend-1234-…`, `talent-api-1756-…`,\n * `talent-assessment-987-…` and any future deployment prefix all match\n * `<prefix>-<id>-<service>.dev.testgorilla.com` without a framework release.\n * Lazy `(.+?)` splits at the FIRST `-<digits>-` segment so service names\n * containing digits (e.g. `cr-v2`) cannot mis-split the prefix.\n */\nconst EPHEMERAL_PREFIX_PATTERN = /https?:\\/\\/(.+?)-(\\d+)-[^.]+\\.dev\\.testgorilla\\.com/;\n\nconst LOCAL_MAILHOG_URL = 'http://localhost:8025';\n\n/**\n * Build a lazily-throwing secret accessor: the property reads as a normal\n * string when the env var is set, and throws with setup guidance the first\n * time it is READ while unset. Importing the config never throws.\n *\n * Non-enumerable so JSON-serializing an E2eConfig (e.g. passing it through\n * `test.use` in playwright.config, which serializes options to workers) can\n * neither leak the credential nor trip the missing-env error.\n */\nfunction defineRequiredSecret(\n target: object,\n property: string,\n value: string | undefined,\n envVar: string,\n): void {\n Object.defineProperty(target, property, {\n enumerable: false,\n configurable: true,\n get(): string {\n if (value === undefined || value === '') {\n throw new Error(\n `[e2e-framework] ${envVar} is not set. The framework ships no credential defaults — ` +\n `export ${envVar} (see your team's 1Password e2e .env entry) before running tests.`,\n );\n }\n return value;\n },\n });\n}\n\nfunction resolveAccounts(env: NodeJS.ProcessEnv): E2eAccounts {\n const nodeIndexedOrganizer = env.CIRCLE_NODE_TOTAL\n ? `dummy.tests+organizer${env.CIRCLE_NODE_INDEX}@testgorilla.com`\n : `dummy.tests+organizer11@testgorilla.com`;\n const accountIndex = env.E2E_ACCOUNT_INDEX;\n\n const accounts = {\n organizerEmail:\n env.userEmail ??\n (accountIndex !== undefined\n ? `dummy.tests+organizer${accountIndex}@testgorilla.com`\n : nodeIndexedOrganizer),\n candidateEmail: env.candidateEmail ?? 'dummy.tests@testgorilla.com',\n hiringManagerEmail: env.hiringManagerEmail ?? 'dummy.tests+hiringmanager01@testgorilla.com',\n recruiterEmail: env.recruiterEmail ?? 'dummy.tests+recruiter1@testgorilla.com',\n adminEmail: env.adminEmail ?? 'dummy.tests+admin1@testgorilla.com',\n newAdminEmail: env.newAdminEmail ?? 'dummy.tests+newadmin@testgorilla.com',\n freeUserEmail: env.freeUserEmail ?? 'dummy.tests+free0@testgorilla.com',\n corePlanUserEmail: env.corePlanUserEmail ?? 'dummy.tests+coreplan@testgorilla.com',\n plusPlanUserEmail: env.plusPlanUserEmail ?? 'dummy.tests+plus@testgorilla.com',\n proPlanUserEmail: env.proPlanUserEmail ?? 'dummy.tests+pro@testgorilla.com',\n businessPlanUserEmail: env.businessPlanUserEmail ?? 'dummy.tests+business@testgorilla.com',\n starterPlanUserEmail: env.starterPlanUserEmail ?? 'dummy.tests+starter@testgorilla.com',\n myProfileUserEmail: env.myProfileUserEmail ?? 'dummy.tests+myprofile@testgorilla.com',\n atsIntegrationsEmail:\n env.atsIntegrationsEmail ?? 'dummy.tests+ats-integrations@testgorilla.com',\n } as E2eAccounts;\n\n defineRequiredSecret(accounts, 'password', env.E2E_PASSWORD ?? env.e2e_password, 'E2E_PASSWORD');\n defineRequiredSecret(\n accounts,\n 'candidatePassword',\n env.E2E_CANDIDATE_PASSWORD,\n 'E2E_CANDIDATE_PASSWORD',\n );\n\n return accounts;\n}\n\nfunction resolveUrls(\n baseURL: string,\n ephemeralPrefix: string | null,\n ephemeralId: string | null,\n): E2eUrls {\n const isEphemeral = !!ephemeralId;\n const ephemeralHost = (service: string) =>\n `https://${ephemeralPrefix}-${ephemeralId}-${service}.dev.testgorilla.com`;\n const isProd = baseURL.includes('app.testgorilla');\n const isDev = baseURL.includes('dev.testgorilla');\n const isLocalhost = baseURL.includes('localhost');\n\n return {\n talentBase: isEphemeral\n ? ephemeralHost('talent')\n : isProd\n ? 'https://talent.testgorilla.com'\n : isDev\n ? 'https://talent-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4100'\n : 'https://talent-staging.testgorilla.com',\n talentAssessment: isEphemeral\n ? ephemeralHost('talent-assessment')\n : isProd\n ? 'https://talent-assessment.testgorilla.com'\n : isDev\n ? 'https://talent-assessment-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4100'\n : 'https://talent-assessment-staging.testgorilla.com',\n talentApi: isEphemeral\n ? ephemeralHost('api-talent')\n : isProd\n ? 'https://api-talent.testgorilla.com'\n : isDev\n ? 'https://api-talent-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4200'\n : 'https://api-talent-staging.testgorilla.com',\n codeRunnerApi: isProd\n ? 'https://cr-v2.testgorilla.com'\n : isDev\n ? 'https://cr-v2-dev.testgorilla.com'\n : 'https://cr-v2-staging.testgorilla.com',\n websiteBase: isProd\n ? 'https://www.testgorilla.com'\n : isDev && !isEphemeral\n ? 'https://website-dev.testgorilla.com'\n : 'https://website-staging.testgorilla.com',\n mailpit: isEphemeral ? ephemeralHost('mailpit') : LOCAL_MAILHOG_URL,\n localstack: isEphemeral ? ephemeralHost('localstack') : null,\n };\n}\n\n/**\n * Resolve the full e2e run configuration from environment variables, using\n * TestGorilla's environment naming conventions (staging default, ephemeral\n * `<prefix>-<id>-<service>` dev deployments, production `app`). CI declares\n * ephemerality explicitly via `E2E_ENVIRONMENT=ephemeral`; unset falls back\n * to baseURL-shape detection (see EPHEMERAL_PREFIX_PATTERN above).\n *\n * Pure with respect to its input: pass a custom env for testing; defaults to\n * `process.env`. Never throws on missing secrets — required credentials\n * (`E2E_PASSWORD`, `E2E_CANDIDATE_PASSWORD`) throw with guidance only when\n * first read. The one eager throw is a declared-ephemeral baseURL that the\n * ephemeral host pattern cannot parse (a CI wiring error).\n */\nexport function resolveTgEnvironment(env: NodeJS.ProcessEnv = process.env): E2eConfig {\n const baseURL = env.baseURL || 'https://staging.testgorilla.com';\n\n const ephemeralMatch = baseURL.match(EPHEMERAL_PREFIX_PATTERN);\n const declaredEnvironment = env.E2E_ENVIRONMENT?.toLowerCase();\n const isEphemeralEnvironment = declaredEnvironment\n ? declaredEnvironment === 'ephemeral'\n : !!ephemeralMatch;\n if (isEphemeralEnvironment && !ephemeralMatch) {\n // Config error, CI-only by construction (the variable is CI-set): every\n // derived sibling URL would be wrong, so fail fast instead of letting\n // tests fail confusingly against staging fallback hosts.\n throw new Error(\n `[e2e-framework] E2E_ENVIRONMENT=ephemeral but baseURL \"${baseURL}\" does not match ` +\n `<prefix>-<id>-<service>.dev.testgorilla.com — sibling service URLs cannot be derived.`,\n );\n }\n const ephemeralPrefix = isEphemeralEnvironment && ephemeralMatch ? ephemeralMatch[1] : null;\n const ephemeralId = isEphemeralEnvironment && ephemeralMatch ? ephemeralMatch[2] : null;\n\n const environment = baseURL.split('.testgorilla.com')[0].split('https://')[1] || 'staging';\n\n const adminURL =\n env.adminURL ||\n (isEphemeralEnvironment\n ? `https://${ephemeralPrefix}-${ephemeralId}-backend.dev.testgorilla.com`\n : environment === 'app'\n ? `https://new-admin.testgorilla.com`\n : `https://${environment}-new-admin.testgorilla.com`);\n\n const isProd = baseURL.includes('app.testgorilla');\n const isDev = baseURL.includes('dev.testgorilla');\n const isLocalhost = baseURL.includes('localhost');\n\n return {\n baseURL,\n environment,\n isEphemeralEnvironment,\n ephemeralPrefix,\n ephemeralId,\n isLocalEnvironment: env.localEnvironment === 'true' || isEphemeralEnvironment,\n adminURL,\n urls: resolveUrls(baseURL, ephemeralPrefix, ephemeralId),\n emails: {\n signupFrom: isProd\n ? 'hello@testgorilla.com'\n : isLocalhost\n ? 'noreply@example'\n : isDev || isEphemeralEnvironment\n ? 'hello@maildev.testgorilla.com'\n : 'hello@mailstaging.testgorilla.com',\n assessmentsFrom: isProd\n ? 'assessments@testgorilla.com'\n : isLocalhost\n ? 'assessments@example.com'\n : isDev || isEphemeralEnvironment\n ? 'assessments@maildev.testgorilla.com'\n : 'assessments@mailstaging.testgorilla.com',\n },\n accounts: resolveAccounts(env),\n };\n}\n","import * as os from 'os';\nimport { env } from 'process';\n\n/**\n * Run identity for synthetic test data.\n *\n * Every identity the generators mint embeds this id, so any row on the shared\n * (append-only) staging database is attributable to the run that created it —\n * CI or somebody's laptop — and purge jobs can select marked data instead of\n * relying on heuristics (.github/instructions/07-test-data.md).\n *\n * Resolution order:\n * 1. `E2E_RUN_ID` env var (explicit label, e.g. `E2E_RUN_ID=debug-foo`)\n * 2. CI: `ci<hash>` derived from the CircleCI workflow id\n * 3. local: `loc<user><MMDDhhmm>`\n *\n * The computed value is published back to `process.env.E2E_RUN_ID`, so\n * Playwright worker processes (which inherit env from the runner) all agree —\n * the same mechanism the auth-token contract uses. Alphanumeric only, ≤ 16\n * chars, so generated email local-parts stay inside the 64-char limit.\n */\nexport function getRunId(): string {\n if (!env.E2E_RUN_ID) {\n env.E2E_RUN_ID = env.CI ? `ci${shortHash(env.CIRCLE_WORKFLOW_ID ?? '')}` : localRunId();\n }\n return env.E2E_RUN_ID;\n}\n\n/** Deterministic 6-char base-36 hash — enough to tell workflows apart. */\nfunction shortHash(input: string): string {\n let hash = 0;\n for (const char of input) {\n hash = (hash * 31 + char.charCodeAt(0)) >>> 0;\n }\n return hash.toString(36).padStart(6, '0').slice(-6);\n}\n\nfunction localRunId(): string {\n let user = '';\n try {\n user = os\n .userInfo()\n .username.toLowerCase()\n .replace(/[^a-z0-9]/g, '')\n .slice(0, 8);\n } catch {\n // Containers whose uid has no passwd entry throw here; identity\n // generation must never crash a run, so fall back to 'unknown'.\n }\n const now = new Date();\n const pad = (n: number) => String(n).padStart(2, '0');\n const stamp = `${pad(now.getMonth() + 1)}${pad(now.getDate())}${pad(now.getHours())}${pad(\n now.getMinutes(),\n )}`;\n return `loc${user || 'unknown'}${stamp}`;\n}\n","/**\n * Algolia Configuration\n *\n * Test-library search used during assessment creation. The bundled defaults\n * are the same index-restricted, search-only keys the customer frontend ships\n * to browsers (not admin keys); override any of them via the ALGOLIA_* env\n * vars below without a code change (e.g. on key rotation).\n */\n\nimport { baseURL, isEphemeralEnvironment } from './index';\n\nconst ALGOLIA_APP_ID = process.env.ALGOLIA_APP_ID || 'V8Y626J4K8';\n\n// Algolia Index Names\nconst ALGOLIA_PROD_INDEX = process.env.ALGOLIA_PROD_INDEX || 'production_tests_index';\nconst ALGOLIA_STAGING_INDEX = process.env.ALGOLIA_STAGING_INDEX || 'staging_tests_index';\nconst ALGOLIA_EPHEMERAL_INDEX = process.env.ALGOLIA_EPHEMERAL_INDEX || 'ephemeral_tests_index';\n\n// Algolia API Keys (search-only, restricted to the specific indices)\nconst ALGOLIA_PROD_API_KEY =\n process.env.ALGOLIA_PROD_API_KEY ||\n 'NDc2N2JlMmY5ZGE2NzM4NDIwOWM2ODkyMWY0Yjk5YjYyNTA5NTViNDg2YzNlN2VlZDE4MmYyOWE3YmRjNjg1ZXJlc3RyaWN0SW5kaWNlcz1wcm9kdWN0aW9uX3Rlc3RzX2luZGV4';\nconst ALGOLIA_STAGING_API_KEY =\n process.env.ALGOLIA_STAGING_API_KEY ||\n 'ZjZmYWMwYjNkN2IxZjViYzA0OTZkZGE3OWY5MmVjYWMzN2RlYWJlYjcyOWRlMWQ3YjMwM2RjYjk0NDNjZGY0MXJlc3RyaWN0SW5kaWNlcz1zdGFnaW5nX3Rlc3RzX2luZGV4';\nconst ALGOLIA_EPHEMERAL_API_KEY =\n process.env.ALGOLIA_EPHEMERAL_API_KEY || '5beea78e78134e8270214f93b7032e7b';\n\n/**\n * Returns environment-specific Algolia API URL\n */\nexport const getAlgoliaUrl = (): string => {\n const isProduction = baseURL.includes('app.testgorilla');\n\n if (isEphemeralEnvironment) {\n return `https://v8y626j4k8-dsn.algolia.net/1/indexes/${ALGOLIA_EPHEMERAL_INDEX}/query`;\n }\n\n const index = isProduction ? ALGOLIA_PROD_INDEX : ALGOLIA_STAGING_INDEX;\n const domain = isProduction ? 'algolianet.com' : 'algolia.net';\n const subdomain = isProduction ? 'v8y626j4k8-2' : 'v8y626j4k8-dsn';\n\n return `https://${subdomain}.${domain}/1/indexes/${index}/query`;\n};\n\n/**\n * Returns environment-specific Algolia API headers\n */\nexport const getAlgoliaHeaders = (): Record<string, string> => {\n const isProduction = baseURL.includes('app.testgorilla');\n\n let apiKey: string;\n if (isEphemeralEnvironment) {\n apiKey = ALGOLIA_EPHEMERAL_API_KEY;\n } else {\n apiKey = isProduction ? ALGOLIA_PROD_API_KEY : ALGOLIA_STAGING_API_KEY;\n }\n\n return {\n 'content-type': 'application/x-www-form-urlencoded',\n 'x-algolia-api-key': apiKey,\n 'x-algolia-application-id': ALGOLIA_APP_ID,\n };\n};\n","/**\n * Constants & Retries\n *\n * Contains global retry counters and other application constants.\n */\n\nimport { env } from 'process';\n\n// Retry counters - used to determine retry behavior in tests\nexport const DEFAULT_RETRY_COUNTER = 10;\nexport const INCREASED_RETRY_COUNTER_50 = DEFAULT_RETRY_COUNTER * 1.5;\nexport const INCREASED_RETRY_COUNTER_80 = DEFAULT_RETRY_COUNTER * 1.8;\nexport const INCREASED_RETRY_COUNTER_200 = DEFAULT_RETRY_COUNTER * 2;\nexport const INCREASED_RETRY_COUNTER_300 = DEFAULT_RETRY_COUNTER * 3;\n\n// Logger configuration. Default: WARN both in CI and locally — opt in to INFO for milestones\n// or DEBUG for per-request chatter via the LOG_LEVEL env var.\n// API_LOG_LEVEL / API_LOG_FILE are accepted for back-compat with a one-time deprecation note.\nconst rawLogLevel = env.LOG_LEVEL?.toUpperCase() || env.API_LOG_LEVEL?.toUpperCase() || 'WARN';\nif (!env.LOG_LEVEL && env.API_LOG_LEVEL && !env._LOG_DEPRECATION_WARNED) {\n process.stderr.write(\n '[logger] API_LOG_LEVEL is deprecated; use LOG_LEVEL instead (same values).\\n',\n );\n env._LOG_DEPRECATION_WARNED = '1';\n}\nexport const logLevel = rawLogLevel as 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'NONE';\nexport const logFile = env.LOG_FILE || env.API_LOG_FILE || '';\n\n// Back-compat aliases — prefer logLevel / logFile in new code.\nexport const apiLogLevel = logLevel;\nexport const apiLogFile = logFile;\n\n// Assessment configuration — the name→id map published by global setup\n// (process.env.assessments; see @testgorilla/e2e-framework/setup).\nexport const assessmentList = JSON.parse(env.assessments || '{}');\n\n// Other constants\nexport const MAILPIT_SERVER = 'http://localhost:8025';\nexport const simpleAssessmentName = `New Simple Assessment - ${Date.now()}`;\nexport const invitationEmailSubject = 'Your application at TestGorilla';\n\n// Email reception tracking\nexport const emailReception = { slowEmailAPI: false };\n","import { isEphemeralEnvironment } from './index';\n\n/**\n * Supplies the backend's recaptcha bypass key for a given backend environment\n * name (e.g. 'staging', 'dev', 'app'). tgo-qa-automation registers an AWS\n * SSM-backed provider; other consumers typically rely on the env vars alone.\n */\nexport type RecaptchaKeyProvider = (\n backendEnvironment: string,\n) => Promise<string | null | undefined>;\n\nlet keyProvider: RecaptchaKeyProvider | undefined;\n\n/**\n * Registers a fallback source for the recaptcha bypass key, consulted only\n * when the RECAPTCHA_BYPASS_KEY / RECAPTCHA_BYPASS_KEY_STAGE env vars are\n * unset. The framework itself ships no AWS/SSM dependency — the consumer\n * decides where keys come from.\n */\nexport function setRecaptchaBypassKeyProvider(provider: RecaptchaKeyProvider): void {\n keyProvider = provider;\n}\n\n/**\n * Resolves the recaptcha bypass key with the historical precedence:\n * env var (RECAPTCHA_BYPASS_KEY_STAGE on ephemeral envs, RECAPTCHA_BYPASS_KEY\n * otherwise) → registered provider → the literal 'Not Set' (requests then\n * proceed without a working bypass, matching previous behavior).\n */\nexport async function getRecaptchaBypassKey(backendEnvironment: string): Promise<string> {\n const fromEnv = isEphemeralEnvironment\n ? process.env.RECAPTCHA_BYPASS_KEY_STAGE\n : process.env.RECAPTCHA_BYPASS_KEY;\n if (fromEnv) {\n return fromEnv;\n }\n const fromProvider = keyProvider ? await keyProvider(backendEnvironment) : undefined;\n return fromProvider || 'Not Set';\n}\n","/**\n * Random test-data generators (names, phrases, cities, alphanumerics).\n *\n * Replaces the suite's former @faker-js/faker usage (~28 MB installed) with\n * small curated pools — e2e tests only need plausible-looking values, not\n * locale-aware realism. None of these guarantee uniqueness; call sites that\n * need unique values append `Date.now()` (as they always have).\n */\n\nconst FIRST_NAMES = [\n 'Alice',\n 'Bruno',\n 'Carmen',\n 'Diego',\n 'Elena',\n 'Felix',\n 'Greta',\n 'Hugo',\n 'Irene',\n 'Jonas',\n 'Katia',\n 'Liam',\n 'Marta',\n 'Nadia',\n 'Oscar',\n 'Paula',\n 'Quentin',\n 'Rosa',\n 'Sofia',\n 'Tomas',\n 'Ursula',\n 'Victor',\n 'Wanda',\n 'Xavier',\n 'Yara',\n 'Zoe',\n 'Andre',\n 'Bianca',\n 'Cesar',\n 'Dora',\n];\n\nconst LAST_NAMES = [\n 'Almeida',\n 'Bauer',\n 'Castro',\n 'Dubois',\n 'Eriksen',\n 'Fischer',\n 'Garcia',\n 'Hansen',\n 'Ibrahim',\n 'Jansen',\n 'Keller',\n 'Lopez',\n 'Meyer',\n 'Novak',\n 'Olsen',\n 'Peeters',\n 'Quinn',\n 'Rossi',\n 'Schmidt',\n 'Torres',\n 'Ueda',\n 'Vargas',\n 'Weber',\n 'Xu',\n 'Yilmaz',\n 'Zhang',\n];\n\nconst JOB_TITLE_AREAS = [\n 'Marketing',\n 'Product',\n 'Operations',\n 'Finance',\n 'Support',\n 'Engineering',\n 'Design',\n 'Sales',\n 'Research',\n 'Quality',\n];\nconst JOB_TITLE_ROLES = [\n 'Manager',\n 'Specialist',\n 'Analyst',\n 'Coordinator',\n 'Engineer',\n 'Consultant',\n 'Associate',\n 'Director',\n 'Assistant',\n 'Lead',\n];\n\nconst PHRASE_VERBS = [\n 'streamline',\n 'orchestrate',\n 'benchmark',\n 'optimize',\n 'aggregate',\n 'harness',\n 'incentivize',\n 'synthesize',\n 'iterate',\n 'scale',\n];\nconst PHRASE_ADJECTIVES = [\n 'scalable',\n 'seamless',\n 'dynamic',\n 'proactive',\n 'granular',\n 'robust',\n 'frictionless',\n 'holistic',\n 'intuitive',\n 'compelling',\n];\nconst PHRASE_NOUNS = [\n 'workflows',\n 'channels',\n 'metrics',\n 'platforms',\n 'roadmaps',\n 'pipelines',\n 'paradigms',\n 'synergies',\n 'deliverables',\n 'interfaces',\n];\n\nconst CITIES = [\n 'Amsterdam',\n 'Barcelona',\n 'Copenhagen',\n 'Dublin',\n 'Edinburgh',\n 'Florence',\n 'Geneva',\n 'Hamburg',\n 'Istanbul',\n 'Jakarta',\n 'Krakow',\n 'Lisbon',\n 'Madrid',\n 'Nairobi',\n 'Oslo',\n 'Porto',\n 'Quito',\n 'Rotterdam',\n 'Seville',\n 'Tallinn',\n];\n\nconst WORDS = [\n 'amber',\n 'breeze',\n 'cedar',\n 'delta',\n 'ember',\n 'fjord',\n 'garnet',\n 'harbor',\n 'indigo',\n 'juniper',\n 'karma',\n 'lagoon',\n 'meadow',\n 'nectar',\n 'onyx',\n 'prairie',\n 'quartz',\n 'ripple',\n 'summit',\n 'tundra',\n];\n\nconst ALPHANUMERIC = 'abcdefghijklmnopqrstuvwxyz0123456789';\n\nconst pick = <T>(pool: readonly T[]): T => pool[Math.floor(Math.random() * pool.length)];\n\n/** Random plausible first name (ASCII, form-validation safe). */\nexport const randomFirstName = (): string => pick(FIRST_NAMES);\n\n/** Random plausible last name (ASCII, form-validation safe). */\nexport const randomLastName = (): string => pick(LAST_NAMES);\n\n/** Random \"First Last\" full name. */\nexport const randomFullName = (): string => `${randomFirstName()} ${randomLastName()}`;\n\n/** Random plausible job title, e.g. \"Product Analyst\". */\nexport const randomJobTitle = (): string => `${pick(JOB_TITLE_AREAS)} ${pick(JOB_TITLE_ROLES)}`;\n\n/**\n * Random buzzword phrase, e.g. \"streamline scalable workflows\". Used as a\n * readable label for generated tests/assessments; append `Date.now()` when\n * the value must be unique.\n */\nexport const randomPhrase = (): string =>\n `${pick(PHRASE_VERBS)} ${pick(PHRASE_ADJECTIVES)} ${pick(PHRASE_NOUNS)}`;\n\n/** Random space-separated words from a small neutral pool. */\nexport const randomWords = (count = 2): string =>\n Array.from({ length: count }, () => pick(WORDS)).join(' ');\n\n/** Random lowercase alphanumeric string of the given length. */\nexport const randomAlphaNumeric = (length = 1): string =>\n Array.from({ length }, () => ALPHANUMERIC[Math.floor(Math.random() * ALPHANUMERIC.length)]).join(\n '',\n );\n\n/** Random city name. */\nexport const randomCity = (): string => pick(CITIES);\n\n/** Random integer between min and max, both inclusive. */\nexport const randomNumber = (min: number, max: number): number =>\n Math.floor(Math.random() * (max - min + 1)) + min;\n\n// --- username/phone utilities (formerly the suite's helpers/usernameUtils) ---\n\n/** Strips spaces from a phone number string. */\nexport function convertPhoneNumberToString(phone: string) {\n return phone.replaceAll(' ', '');\n}\n\n/** Random Spanish mobile number (9 digits starting with 6). */\nexport function generateRandomSpanishPhone(): string {\n const eightLastDigits: number = Math.floor(Math.random() * 90000000);\n return (600000000 + eightLastDigits).toString();\n}\n\n/** Random plausible first name — kept for compatibility with the historical helper name. */\nexport function randomizeName(): string {\n return randomFirstName();\n}\n\n/**\n * Appends an epoch-timestamp suffix to the local part of an email address,\n * producing a unique username while keeping the original domain.\n */\nexport function randomizeUsername(email: string): string {\n const [username, domain] = email.split('@');\n const epochTimestamp = Math.floor(Date.now() / 1000);\n const newUsername = `${username}+${epochTimestamp}`;\n return `${newUsername}@${domain}`;\n}\n","/**\n * Compatibility surface over {@link resolveTgEnvironment}.\n *\n * Every export here preserves the NAME and SHAPE (const vs function) of the\n * corresponding export in tgo-qa-automation's `helpers/config`, so consumers\n * migrate with a module-specifier-only import rewrite. The values come from a\n * single module-load resolution of `process.env` — the same timing the suite\n * relies on today (env is inherited by every Playwright worker process).\n *\n * Credentials ship with NO defaults: `password` is empty when `E2E_PASSWORD`\n * is unset (the structured `accounts.password` accessor throws with guidance\n * instead).\n */\nimport { resolveTgEnvironment } from './resolve';\nimport { getRunId } from './runId';\n\nexport type { E2eAccounts, E2eConfig, E2eUrls } from './types';\nexport { resolveTgEnvironment } from './resolve';\n\nconst cfg = resolveTgEnvironment();\n\n// --- Environment & URLs (parity with helpers/config/environment.ts) ---\n\nexport const baseURL = cfg.baseURL;\nexport const environment = cfg.environment;\nexport const isEphemeralEnvironment = cfg.isEphemeralEnvironment;\nexport const ephemeralPrefix = cfg.ephemeralPrefix;\nexport const ephemeralId = cfg.ephemeralId;\nexport const isLocalEnvironment = cfg.isLocalEnvironment;\nexport const adminURL = cfg.adminURL;\nexport const localMailHogURL = 'http://localhost:8025';\n\n/** Returns environment-specific mailpit (ephemeral) or local MailHog URL. */\nexport const mailpitURL = (): string => cfg.urls.mailpit;\n\n/**\n * Returns the LocalStack URL for the current ephemeral environment, or `null`\n * when not running against one.\n */\nexport const localstackURL = (): string | null => cfg.urls.localstack;\n\n/** Returns environment-specific talent base URL. */\nexport const talentBaseURL = (): string => cfg.urls.talentBase;\n\n/** Returns environment-specific talent assessment URL. */\nexport const talentAssessmentURL = (): string => cfg.urls.talentAssessment;\n\n/** Returns environment-specific talent API URL. */\nexport const talentApiURL = (): string => cfg.urls.talentApi;\n\n/** Returns environment-specific code runner API URL. */\nexport const codeRunnerApiURL = (): string => cfg.urls.codeRunnerApi;\n\n/** Returns environment-specific website base URL. */\nexport const websiteBaseURL = (): string => cfg.urls.websiteBase;\n\n/** Returns environment-specific signup sender address. */\nexport const signupFromEmail = (): string => cfg.emails.signupFrom;\n\n/** Returns environment-specific assessments sender address. */\nexport const assessmentsFromEmail = (): string => cfg.emails.assessmentsFrom;\n\n/** Check if current environment is NOT staging. */\nexport const ifNotStagingRun = (): boolean => !cfg.baseURL.includes('staging.testgorilla');\n\n/**\n * Check if current environment is NEITHER staging NOR an ephemeral dev env.\n * Use this to skip tests that depend on the website → app signup flow.\n */\nexport const ifNotStagingOrEphemeralRun = (): boolean =>\n ifNotStagingRun() && !cfg.isEphemeralEnvironment;\n\n/** Check if current environment is NOT localhost. */\nexport const ifNotLocalhostRun = (): boolean => !cfg.baseURL.includes('localhost');\n\n/**\n * Rewrites a signup URL produced by the marketing website (which always\n * points at app.testgorilla.com) so it targets the current environment.\n */\nexport const rewriteSignupUrlForEnv = (signupUrl: string): string => {\n const targetHost = new URL(cfg.baseURL).host;\n return signupUrl.replace(/app\\.testgorilla\\.com/i, targetHost);\n};\n\n// --- Environment URL constants (parity with helpers/config/environment.ts) ---\n\nexport const prodTesttakerUrlString = 'https://assessment.testgorilla.com';\nexport const prodTASUrlString = 'https://talent-assessment.testgorilla.com';\nexport const stageTesttakerUrlString = 'https://staging-assessment.testgorilla.com';\nexport const stageTASUrlString = 'https://talent-assessment-staging.testgorilla.com';\nexport const devTASUrlString = 'https://talent-assessment-dev.testgorilla.com';\nexport const localTASUrlString = 'http://localhost:4100';\nexport const stagingTASAPIUrl = 'https://api-talent-staging.testgorilla.com';\n\n// --- Seed assessment names (product constants, non-secret) ---\n\nexport const CandidateInviteAssessment = 'Candidate-Invite-Assessment-4-Do-not-archive';\nexport const candidateExpiredAssessment = 'Candidate-Expired-Assessment-1-Do-not-archive';\nexport const candidateArchivedAssessment = 'Candidate-Archived-Assessment-1-Do-not-archive';\nexport const tasSimpleMcqAssessment = 'TAS-MCQ-Assessment';\nexport const tasCustomTestAssessment = 'TAS-Custom-Test-Assessment';\nexport const tasSimpleBulkAssessment = 'TAS-Bulk-Assessment';\n\n// --- Test accounts (parity with helpers/config/testAccounts.ts, secrets stripped) ---\n\n/** Structured account set; `accounts.password` throws with guidance if `E2E_PASSWORD` is unset. */\nexport const accounts = cfg.accounts;\n\n/** Main organizer account email for this run. */\nexport const email = cfg.accounts.organizerEmail;\n\n/**\n * Organizer password from `E2E_PASSWORD` (legacy `e2e_password`). Empty string\n * when unset — the framework ships no credential defaults. Prefer\n * `accounts.password`, which throws with setup guidance instead of silently\n * yielding ''.\n */\nexport const password = process.env.E2E_PASSWORD ?? process.env.e2e_password ?? '';\n\nexport const candidateEmail = cfg.accounts.candidateEmail;\nexport const hiringManagerEmail = cfg.accounts.hiringManagerEmail;\nexport const recruiterEmail = cfg.accounts.recruiterEmail;\nexport const adminEmail = cfg.accounts.adminEmail;\nexport const newAdminEmail = cfg.accounts.newAdminEmail;\nexport const freeUserEmail = cfg.accounts.freeUserEmail;\nexport const corePlanUserEmail = cfg.accounts.corePlanUserEmail;\nexport const plusPlanUserEmail = cfg.accounts.plusPlanUserEmail;\nexport const proPlanUserEmail = cfg.accounts.proPlanUserEmail;\nexport const businessPlanUserEmail = cfg.accounts.businessPlanUserEmail;\nexport const starterPlanUserEmail = cfg.accounts.starterPlanUserEmail;\nexport const myProfileUserEmail = cfg.accounts.myProfileUserEmail;\nexport const atsIntegrationsEmail = cfg.accounts.atsIntegrationsEmail;\n\nconst EMAIL_DOMAIN = '@testgorilla.com';\nconst DUMMY_TESTS_PREFIX = 'dummy.tests';\n\n// Per-process tie-breaker so two mints in the same millisecond never collide.\nlet mintCounter = 0;\n\n/**\n * Unique, run-attributable suffix for generated identities:\n * `<runId>x<epoch36><counter>`. Embedding the run id makes every row on the\n * shared staging DB traceable to the CI workflow or local user that created\n * it, and lets purge jobs select marked data (.github/instructions/07-test-data.md).\n */\nconst mintSuffix = (): string => `${getRunId()}x${Date.now().toString(36)}${mintCounter++}`;\n\n/**\n * Generate a random candidate email.\n * Format: `dummy.tests+cand<rand><runId>x<timestamp>@testgorilla.com`.\n */\nexport const randCandidateEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+cand${rand}${mintSuffix()}${EMAIL_DOMAIN}`;\n\n/**\n * Generate a random customer email.\n * Format: `dummy.tests+cust<rand><runId>x<timestamp>@testgorilla.com`.\n */\nexport const randCustomerEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+cust${rand}${mintSuffix()}${EMAIL_DOMAIN}`;\n\n// --- Algolia, constants, recaptcha (parity with helpers/config) ---\n// Lazily circular: algolia/recaptcha read baseURL/isEphemeralEnvironment from\n// this barrel inside their functions only, never at module load.\n\nexport { getAlgoliaUrl, getAlgoliaHeaders } from './algolia';\nexport * from './constants';\nexport { getRecaptchaBypassKey, setRecaptchaBypassKeyProvider } from './recaptcha';\nexport type { RecaptchaKeyProvider } from './recaptcha';\n\n/**\n * Generate a random team-member email tagged with the current environment.\n * Format: `dummy.tests+t<rand><env>+<runId>x<timestamp>@testgorilla.com`.\n */\nexport const randTeamMemberEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+t${rand}${cfg.environment}+${mintSuffix()}${EMAIL_DOMAIN}`;\n\n// Random test-data generators (faker replacement) + username/phone utilities\nexport * from './randomData';\nexport { getRunId };\n"],"mappings":"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","names":["env","accounts","baseURL","ephemeralPrefix","ephemeralId","isEphemeralEnvironment","environment","adminURL","env","email"]}
import {
baseURL
} from "./chunk-TJHUXULD.mjs";
// src/stubs/subscriptions/business-eur.json
var business_eur_default = {
name: "Base plan: Business EUR",
plan: {
name: "Base plan: Business EUR",
short_name: "Business",
chargebee_id: "Base-plan-tier-Business-EUR",
number_of_credits: 12500,
is_trial: false,
currency_code: "EUR",
period: "year",
monthly_price: 22200,
addon_price: 0.6,
price_for_analytics: 22200,
legacy: false,
tier: 6,
fte_band: null,
trial_period: null
},
legacy: false,
next_invoice: "2023-09-18",
addon_subscription: {
next_invoice: "2023-01-18",
additional_candidate_credits: 0,
additional_assessment_credits: 42
},
is_trial: false,
subscription_id: "Azz5akTHt88pcmbU",
currency_code: "EUR",
change_pending: false,
next_plan: null,
next_plan_short_name: null,
active_chargebee_id: "Base-plan-tier-Business-EUR",
next_chargebee_id: null,
candidate_credits: {
initials_credits_included_in_the_plan: 12500,
credits_from_previous_plan: 0,
complimentary: 0,
consumed: -1017,
total_available: 11483,
additional_credit_price: 0.6,
general: {
cost: 0.6,
quantity: 0
},
billed: {
amount: 0,
quantity: 0
},
paid: {
amount: 0,
quantity: 0
},
payment_due: {
amount: 0,
quantity: 0
},
unbilled_charges: {
amount: 0,
quantity: 0
}
},
assessment_credits: {
initials_credits_included_in_the_plan: 125,
credits_from_previous_plan: 0,
complimentary: 0,
consumed: -603,
total_available: 0,
additional_credit_price: 80,
general: {
cost: 80,
quantity: 478
},
billed: {
amount: 0,
quantity: 0
},
paid: {
amount: 0,
quantity: 0
},
payment_due: {
amount: 0,
quantity: 0
},
unbilled_charges: {
amount: 38240,
quantity: 478
}
},
tier: 6,
renewal_date: "2025-09-18"
};
// src/stubs/subscriptions/core-eur.json
var core_eur_default = {
plan: {
name: "Core EUR",
short_name: "Core",
chargebee_id: "gen4-plan-core-EUR",
number_of_credits: 0,
is_trial: false,
currency_code: "EUR",
payment_price: 525,
addon_price: null,
price_for_analytics: 525,
tier: 120,
fte_band: null,
trial_period: null,
payment_period: "year",
contract_period: "year",
is_legacy: false
},
credit_tier: 450,
credit_tier_price: 1500,
available_credits: 450,
status: "active",
is_scheduled_for_cancellation: false,
next_invoice: "2026-11-25",
next_change_date: "2026-11-25",
subscription_id: "169lVHV3YKGm9oUe",
change_pending: false,
next_plan: {
name: "Core EUR",
short_name: "Core",
chargebee_id: "gen4-plan-core-EUR",
number_of_credits: 0,
is_trial: false,
currency_code: "EUR",
payment_price: 525,
addon_price: null,
price_for_analytics: 525,
tier: 120,
fte_band: null,
trial_period: null,
payment_period: "year",
contract_period: "year",
is_legacy: false
},
renewal_date: "2026-11-25",
trial_end: null,
gtm_sync_required: false,
active_assessments_slots: null,
older_than_two_months: false
};
// src/stubs/subscriptions/free.json
var free_default = {
status: null,
change_pending: false,
renewal_date: null,
trial_end: null,
gtm_sync_required: false,
active_assessments_slots: null
};
// src/stubs/subscriptions/plus-eur.json
var plus_eur_default = {
plan: {
name: "Plus EUR",
short_name: "Plus",
chargebee_id: "gen4-plan-plus-EUR",
number_of_credits: 0,
is_trial: false,
currency_code: "EUR",
payment_price: 4300,
addon_price: null,
price_for_analytics: 4300,
tier: 130,
fte_band: null,
trial_period: null,
payment_period: "year",
contract_period: "year",
is_legacy: false
},
credit_tier: 2500,
credit_tier_price: 6e3,
available_credits: 2500,
status: "active",
is_scheduled_for_cancellation: false,
next_invoice: "2026-11-25",
next_change_date: "2026-11-25",
subscription_id: "16BTwHV3YL0ocour",
change_pending: false,
next_plan: {
name: "Plus EUR",
short_name: "Plus",
chargebee_id: "gen4-plan-plus-EUR",
number_of_credits: 0,
is_trial: false,
currency_code: "EUR",
payment_price: 4300,
addon_price: null,
price_for_analytics: 4300,
tier: 130,
fte_band: null,
trial_period: null,
payment_period: "year",
contract_period: "year",
is_legacy: false
},
renewal_date: "2026-11-25",
trial_end: null,
gtm_sync_required: false,
active_assessments_slots: null,
older_than_two_months: true
};
// src/stubs/subscriptions/pro-eur.json
var pro_eur_default = {
plan: {
name: "Pro Annually 201 to 300 EUR",
short_name: "Pro",
chargebee_id: "d-plan-pro-yearly-201-300-EUR",
number_of_credits: 0,
is_trial: false,
currency_code: "EUR",
payment_price: 17424,
addon_price: null,
price_for_analytics: 17424,
tier: 9,
fte_band: "201-300",
trial_period: 15,
payment_period: "year",
contract_period: "year",
is_legacy: true
},
credit_tier: null,
credit_tier_price: null,
available_credits: 0,
status: "active",
is_scheduled_for_cancellation: false,
next_invoice: "2026-11-25",
next_change_date: "2026-11-25",
subscription_id: "16CRVrV3YMe0jpqT",
change_pending: false,
next_plan: {
name: "Pro Annually 201 to 300 EUR",
short_name: "Pro",
chargebee_id: "d-plan-pro-yearly-201-300-EUR",
number_of_credits: 0,
is_trial: false,
currency_code: "EUR",
payment_price: 17424,
addon_price: null,
price_for_analytics: 17424,
tier: 9,
fte_band: "201-300",
trial_period: 15,
payment_period: "year",
contract_period: "year",
is_legacy: true
},
renewal_date: "2026-11-25",
trial_end: null,
gtm_sync_required: false,
active_assessments_slots: null,
older_than_two_months: true
};
// src/stubs/subscriptions/starter-eur.json
var starter_eur_default = {
plan: {
name: "Starter Annually 201 to 300 EUR",
short_name: "Starter",
chargebee_id: "d-plan-starter-yearly-201-300-EUR",
number_of_credits: 0,
is_trial: false,
currency_code: "EUR",
payment_price: 12606,
addon_price: null,
price_for_analytics: 12606,
tier: 8,
fte_band: "201-300",
trial_period: 15,
payment_period: "year",
contract_period: "year",
is_legacy: true
},
credit_tier: null,
credit_tier_price: null,
available_credits: 0,
status: "active",
is_scheduled_for_cancellation: false,
next_invoice: "2026-11-25",
next_change_date: "2026-11-25",
subscription_id: "169lVHV3YNUvxqIQ",
change_pending: false,
next_plan: {
name: "Starter Annually 201 to 300 EUR",
short_name: "Starter",
chargebee_id: "d-plan-starter-yearly-201-300-EUR",
number_of_credits: 0,
is_trial: false,
currency_code: "EUR",
payment_price: 12606,
addon_price: null,
price_for_analytics: 12606,
tier: 8,
fte_band: "201-300",
trial_period: 15,
payment_period: "year",
contract_period: "year",
is_legacy: true
},
renewal_date: "2026-11-25",
trial_end: null,
gtm_sync_required: false,
active_assessments_slots: null,
older_than_two_months: false
};
// src/stubs/currentSubscription.ts
var PLANS = {
"business-eur": business_eur_default,
"starter-eur": starter_eur_default,
"pro-eur": pro_eur_default,
"core-eur": core_eur_default,
"plus-eur": plus_eur_default,
free: free_default
};
var CurrentSubscription = class {
constructor(page, baseUrl = baseURL) {
this.page = page;
this.baseUrl = baseUrl;
}
/**
* Stubs the current subscription endpoint with a specific plan
* @param planName - The subscription plan payload to serve.
* Options: 'business-eur' (default), 'starter-eur', 'pro-eur', 'core-eur', 'plus-eur', 'free'
* @param overridePayload - Optional custom payload to serve instead of the bundled plan JSON.
*/
async stubCurrentSubscriptionEndpoint(planName = "business-eur", overridePayload) {
const subscriptionData = overridePayload ?? PLANS[planName];
await this.page.route(
`${this.baseUrl}/api/accounting/current-subscription/`,
(route) => route.fulfill({
status: 200,
body: JSON.stringify(subscriptionData)
})
);
}
};
export {
CurrentSubscription
};
//# sourceMappingURL=chunk-WEZDVQDT.mjs.map
{"version":3,"sources":["../src/stubs/subscriptions/business-eur.json","../src/stubs/subscriptions/core-eur.json","../src/stubs/subscriptions/free.json","../src/stubs/subscriptions/plus-eur.json","../src/stubs/subscriptions/pro-eur.json","../src/stubs/subscriptions/starter-eur.json","../src/stubs/currentSubscription.ts"],"sourcesContent":["{\n \"name\": \"Base plan: Business EUR\",\n \"plan\": {\n \"name\": \"Base plan: Business EUR\",\n \"short_name\": \"Business\",\n \"chargebee_id\": \"Base-plan-tier-Business-EUR\",\n \"number_of_credits\": 12500,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"period\": \"year\",\n \"monthly_price\": 22200.0,\n \"addon_price\": 0.6,\n \"price_for_analytics\": 22200.0,\n \"legacy\": false,\n \"tier\": 6,\n \"fte_band\": null,\n \"trial_period\": null\n },\n \"legacy\": false,\n \"next_invoice\": \"2023-09-18\",\n \"addon_subscription\": {\n \"next_invoice\": \"2023-01-18\",\n \"additional_candidate_credits\": 0,\n \"additional_assessment_credits\": 42\n },\n \"is_trial\": false,\n \"subscription_id\": \"Azz5akTHt88pcmbU\",\n \"currency_code\": \"EUR\",\n \"change_pending\": false,\n \"next_plan\": null,\n \"next_plan_short_name\": null,\n \"active_chargebee_id\": \"Base-plan-tier-Business-EUR\",\n \"next_chargebee_id\": null,\n \"candidate_credits\": {\n \"initials_credits_included_in_the_plan\": 12500,\n \"credits_from_previous_plan\": 0,\n \"complimentary\": 0,\n \"consumed\": -1017,\n \"total_available\": 11483,\n \"additional_credit_price\": 0.6,\n \"general\": {\n \"cost\": 0.6,\n \"quantity\": 0\n },\n \"billed\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"paid\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"payment_due\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"unbilled_charges\": {\n \"amount\": 0.0,\n \"quantity\": 0\n }\n },\n \"assessment_credits\": {\n \"initials_credits_included_in_the_plan\": 125,\n \"credits_from_previous_plan\": 0,\n \"complimentary\": 0,\n \"consumed\": -603,\n \"total_available\": 0,\n \"additional_credit_price\": 80.0,\n \"general\": {\n \"cost\": 80.0,\n \"quantity\": 478\n },\n \"billed\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"paid\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"payment_due\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"unbilled_charges\": {\n \"amount\": 38240.0,\n \"quantity\": 478\n }\n },\n \"tier\": 6,\n \"renewal_date\": \"2025-09-18\"\n}\n","{\n \"plan\": {\n \"name\": \"Core EUR\",\n \"short_name\": \"Core\",\n \"chargebee_id\": \"gen4-plan-core-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 525,\n \"addon_price\": null,\n \"price_for_analytics\": 525.0,\n \"tier\": 120,\n \"fte_band\": null,\n \"trial_period\": null,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": false\n },\n \"credit_tier\": 450,\n \"credit_tier_price\": 1500.0,\n \"available_credits\": 450,\n \"status\": \"active\",\n \"is_scheduled_for_cancellation\": false,\n \"next_invoice\": \"2026-11-25\",\n \"next_change_date\": \"2026-11-25\",\n \"subscription_id\": \"169lVHV3YKGm9oUe\",\n \"change_pending\": false,\n \"next_plan\": {\n \"name\": \"Core EUR\",\n \"short_name\": \"Core\",\n \"chargebee_id\": \"gen4-plan-core-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 525,\n \"addon_price\": null,\n \"price_for_analytics\": 525.0,\n \"tier\": 120,\n \"fte_band\": null,\n \"trial_period\": null,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": false\n },\n \"renewal_date\": \"2026-11-25\",\n \"trial_end\": null,\n \"gtm_sync_required\": false,\n \"active_assessments_slots\": null,\n \"older_than_two_months\": false\n}\n","{\n \"status\": null,\n \"change_pending\": false,\n \"renewal_date\": null,\n \"trial_end\": null,\n \"gtm_sync_required\": false,\n \"active_assessments_slots\": null\n}\n","{\n \"plan\": {\n \"name\": \"Plus EUR\",\n \"short_name\": \"Plus\",\n \"chargebee_id\": \"gen4-plan-plus-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 4300,\n \"addon_price\": null,\n \"price_for_analytics\": 4300.0,\n \"tier\": 130,\n \"fte_band\": null,\n \"trial_period\": null,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": false\n },\n \"credit_tier\": 2500,\n \"credit_tier_price\": 6000.0,\n \"available_credits\": 2500,\n \"status\": \"active\",\n \"is_scheduled_for_cancellation\": false,\n \"next_invoice\": \"2026-11-25\",\n \"next_change_date\": \"2026-11-25\",\n \"subscription_id\": \"16BTwHV3YL0ocour\",\n \"change_pending\": false,\n \"next_plan\": {\n \"name\": \"Plus EUR\",\n \"short_name\": \"Plus\",\n \"chargebee_id\": \"gen4-plan-plus-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 4300,\n \"addon_price\": null,\n \"price_for_analytics\": 4300.0,\n \"tier\": 130,\n \"fte_band\": null,\n \"trial_period\": null,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": false\n },\n \"renewal_date\": \"2026-11-25\",\n \"trial_end\": null,\n \"gtm_sync_required\": false,\n \"active_assessments_slots\": null,\n \"older_than_two_months\": true\n}\n","{\n \"plan\": {\n \"name\": \"Pro Annually 201 to 300 EUR\",\n \"short_name\": \"Pro\",\n \"chargebee_id\": \"d-plan-pro-yearly-201-300-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 17424,\n \"addon_price\": null,\n \"price_for_analytics\": 17424.0,\n \"tier\": 9,\n \"fte_band\": \"201-300\",\n \"trial_period\": 15,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": true\n },\n \"credit_tier\": null,\n \"credit_tier_price\": null,\n \"available_credits\": 0,\n \"status\": \"active\",\n \"is_scheduled_for_cancellation\": false,\n \"next_invoice\": \"2026-11-25\",\n \"next_change_date\": \"2026-11-25\",\n \"subscription_id\": \"16CRVrV3YMe0jpqT\",\n \"change_pending\": false,\n \"next_plan\": {\n \"name\": \"Pro Annually 201 to 300 EUR\",\n \"short_name\": \"Pro\",\n \"chargebee_id\": \"d-plan-pro-yearly-201-300-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 17424,\n \"addon_price\": null,\n \"price_for_analytics\": 17424.0,\n \"tier\": 9,\n \"fte_band\": \"201-300\",\n \"trial_period\": 15,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": true\n },\n \"renewal_date\": \"2026-11-25\",\n \"trial_end\": null,\n \"gtm_sync_required\": false,\n \"active_assessments_slots\": null,\n \"older_than_two_months\": true\n}\n","{\n \"plan\": {\n \"name\": \"Starter Annually 201 to 300 EUR\",\n \"short_name\": \"Starter\",\n \"chargebee_id\": \"d-plan-starter-yearly-201-300-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 12606,\n \"addon_price\": null,\n \"price_for_analytics\": 12606.0,\n \"tier\": 8,\n \"fte_band\": \"201-300\",\n \"trial_period\": 15,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": true\n },\n \"credit_tier\": null,\n \"credit_tier_price\": null,\n \"available_credits\": 0,\n \"status\": \"active\",\n \"is_scheduled_for_cancellation\": false,\n \"next_invoice\": \"2026-11-25\",\n \"next_change_date\": \"2026-11-25\",\n \"subscription_id\": \"169lVHV3YNUvxqIQ\",\n \"change_pending\": false,\n \"next_plan\": {\n \"name\": \"Starter Annually 201 to 300 EUR\",\n \"short_name\": \"Starter\",\n \"chargebee_id\": \"d-plan-starter-yearly-201-300-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 12606,\n \"addon_price\": null,\n \"price_for_analytics\": 12606.0,\n \"tier\": 8,\n \"fte_band\": \"201-300\",\n \"trial_period\": 15,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": true\n },\n \"renewal_date\": \"2026-11-25\",\n \"trial_end\": null,\n \"gtm_sync_required\": false,\n \"active_assessments_slots\": null,\n \"older_than_two_months\": false\n}\n","import type { Page } from '@playwright/test';\nimport { baseURL as configBaseURL } from '../config';\nimport businessEur from './subscriptions/business-eur.json';\nimport coreEur from './subscriptions/core-eur.json';\nimport free from './subscriptions/free.json';\nimport plusEur from './subscriptions/plus-eur.json';\nimport proEur from './subscriptions/pro-eur.json';\nimport starterEur from './subscriptions/starter-eur.json';\n\nexport type SubscriptionPlan =\n | 'business-eur'\n | 'starter-eur'\n | 'pro-eur'\n | 'core-eur'\n | 'plus-eur'\n | 'free';\n\n// Payloads are inlined into the bundle (no fs/__dirname at runtime), so the\n// stub works identically from an installed npm package and from source.\nconst PLANS: Record<SubscriptionPlan, Record<string, unknown>> = {\n 'business-eur': businessEur,\n 'starter-eur': starterEur,\n 'pro-eur': proEur,\n 'core-eur': coreEur,\n 'plus-eur': plusEur,\n free,\n};\n\nexport class CurrentSubscription {\n readonly page: Page;\n private readonly baseUrl: string;\n\n constructor(page: Page, baseUrl: string = configBaseURL) {\n this.page = page;\n this.baseUrl = baseUrl;\n }\n\n /**\n * Stubs the current subscription endpoint with a specific plan\n * @param planName - The subscription plan payload to serve.\n * Options: 'business-eur' (default), 'starter-eur', 'pro-eur', 'core-eur', 'plus-eur', 'free'\n * @param overridePayload - Optional custom payload to serve instead of the bundled plan JSON.\n */\n async stubCurrentSubscriptionEndpoint(\n planName: SubscriptionPlan = 'business-eur',\n overridePayload?: Record<string, unknown>,\n ) {\n const subscriptionData = overridePayload ?? PLANS[planName];\n\n await this.page.route(`${this.baseUrl}/api/accounting/current-subscription/`, (route) =>\n route.fulfill({\n status: 200,\n body: JSON.stringify(subscriptionData),\n }),\n );\n }\n}\n"],"mappings":"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","names":[]}
/**
* Structured configuration for a TestGorilla e2e run.
*
* Produced by {@link resolveTgEnvironment} from environment variables and
* consumed both as the `e2eConfig` Playwright option fixture and (via the
* compatibility surface in `./index.ts`) as the module-level named exports
* that page objects and API clients import today.
*/
interface E2eAccounts {
/** Main organizer account the run logs in with (today: `email`). */
organizerEmail: string;
/**
* Organizer password. Sourced from `E2E_PASSWORD` (or legacy `e2e_password`).
* The framework ships NO default — reading this without the env var set
* throws with setup guidance.
*/
password: string;
/** Shared candidate inbox account. */
candidateEmail: string;
/**
* IMAP app password for the candidate inbox. Sourced from
* `E2E_CANDIDATE_PASSWORD`. No default ships with the framework.
*/
candidatePassword: string;
hiringManagerEmail: string;
recruiterEmail: string;
adminEmail: string;
newAdminEmail: string;
freeUserEmail: string;
corePlanUserEmail: string;
plusPlanUserEmail: string;
proPlanUserEmail: string;
businessPlanUserEmail: string;
starterPlanUserEmail: string;
myProfileUserEmail: string;
atsIntegrationsEmail: string;
}
/** Per-environment service URLs derived from the run's `baseURL`. */
interface E2eUrls {
talentBase: string;
talentAssessment: string;
talentApi: string;
codeRunnerApi: string;
websiteBase: string;
mailpit: string;
/** Only provisioned on ephemeral dev deployments; `null` elsewhere. */
localstack: string | null;
}
interface E2eConfig {
/** Customer-app base URL (the `baseURL` env var; staging by default). */
baseURL: string;
/** Short environment name derived from the base URL (e.g. `staging`, `app`). */
environment: string;
isEphemeralEnvironment: boolean;
/**
* Deployment prefix on ephemeral envs (`backend`, `talent-api`,
* `talent-assessment`, …), else null. Not a closed set: any repo that
* provisions `<prefix>-<id>-<service>.dev.testgorilla.com` envs is valid.
*/
ephemeralPrefix: string | null;
ephemeralId: string | null;
isLocalEnvironment: boolean;
adminURL: string;
urls: E2eUrls;
emails: {
signupFrom: string;
assessmentsFrom: string;
};
accounts: E2eAccounts;
}
export type { E2eConfig as E, E2eAccounts as a, E2eUrls as b };
/**
* Structured configuration for a TestGorilla e2e run.
*
* Produced by {@link resolveTgEnvironment} from environment variables and
* consumed both as the `e2eConfig` Playwright option fixture and (via the
* compatibility surface in `./index.ts`) as the module-level named exports
* that page objects and API clients import today.
*/
interface E2eAccounts {
/** Main organizer account the run logs in with (today: `email`). */
organizerEmail: string;
/**
* Organizer password. Sourced from `E2E_PASSWORD` (or legacy `e2e_password`).
* The framework ships NO default — reading this without the env var set
* throws with setup guidance.
*/
password: string;
/** Shared candidate inbox account. */
candidateEmail: string;
/**
* IMAP app password for the candidate inbox. Sourced from
* `E2E_CANDIDATE_PASSWORD`. No default ships with the framework.
*/
candidatePassword: string;
hiringManagerEmail: string;
recruiterEmail: string;
adminEmail: string;
newAdminEmail: string;
freeUserEmail: string;
corePlanUserEmail: string;
plusPlanUserEmail: string;
proPlanUserEmail: string;
businessPlanUserEmail: string;
starterPlanUserEmail: string;
myProfileUserEmail: string;
atsIntegrationsEmail: string;
}
/** Per-environment service URLs derived from the run's `baseURL`. */
interface E2eUrls {
talentBase: string;
talentAssessment: string;
talentApi: string;
codeRunnerApi: string;
websiteBase: string;
mailpit: string;
/** Only provisioned on ephemeral dev deployments; `null` elsewhere. */
localstack: string | null;
}
interface E2eConfig {
/** Customer-app base URL (the `baseURL` env var; staging by default). */
baseURL: string;
/** Short environment name derived from the base URL (e.g. `staging`, `app`). */
environment: string;
isEphemeralEnvironment: boolean;
/**
* Deployment prefix on ephemeral envs (`backend`, `talent-api`,
* `talent-assessment`, …), else null. Not a closed set: any repo that
* provisions `<prefix>-<id>-<service>.dev.testgorilla.com` envs is valid.
*/
ephemeralPrefix: string | null;
ephemeralId: string | null;
isLocalEnvironment: boolean;
adminURL: string;
urls: E2eUrls;
emails: {
signupFrom: string;
assessmentsFrom: string;
};
accounts: E2eAccounts;
}
export type { E2eConfig as E, E2eAccounts as a, E2eUrls as b };
+3
-3

@@ -37,8 +37,8 @@ import {

TeamManagementAPI
} from "./chunk-XW3CPEDR.mjs";
} from "./chunk-6HR5SXUC.mjs";
import "./chunk-DTRYG7JP.mjs";
import "./chunk-ZVF6EZ5L.mjs";
import "./chunk-ATYQC4YE.mjs";
import "./chunk-U7YT53U2.mjs";
import "./chunk-DW4V5VUB.mjs";
import "./chunk-B64Y5SGV.mjs";
import "./chunk-TJHUXULD.mjs";
export {

@@ -45,0 +45,0 @@ AccessManagement,

@@ -200,3 +200,3 @@ var __create = Object.create;

// src/config/resolve.ts
var EPHEMERAL_PREFIX_PATTERN = /https?:\/\/(backend|talent-api)-(\d+)-[^.]+\.dev\.testgorilla\.com/;
var EPHEMERAL_PREFIX_PATTERN = /https?:\/\/(.+?)-(\d+)-[^.]+\.dev\.testgorilla\.com/;
var LOCAL_MAILHOG_URL = "http://localhost:8025";

@@ -264,5 +264,11 @@ function defineRequiredSecret(target, property, value, envVar) {

const ephemeralMatch = baseURL2.match(EPHEMERAL_PREFIX_PATTERN);
const ephemeralPrefix2 = ephemeralMatch ? ephemeralMatch[1] : null;
const ephemeralId2 = ephemeralMatch ? ephemeralMatch[2] : null;
const isEphemeralEnvironment2 = !!ephemeralId2;
const declaredEnvironment = env3.E2E_ENVIRONMENT?.toLowerCase();
const isEphemeralEnvironment2 = declaredEnvironment ? declaredEnvironment === "ephemeral" : !!ephemeralMatch;
if (isEphemeralEnvironment2 && !ephemeralMatch) {
throw new Error(
`[e2e-framework] E2E_ENVIRONMENT=ephemeral but baseURL "${baseURL2}" does not match <prefix>-<id>-<service>.dev.testgorilla.com \u2014 sibling service URLs cannot be derived.`
);
}
const ephemeralPrefix2 = isEphemeralEnvironment2 && ephemeralMatch ? ephemeralMatch[1] : null;
const ephemeralId2 = isEphemeralEnvironment2 && ephemeralMatch ? ephemeralMatch[2] : null;
const environment2 = baseURL2.split(".testgorilla.com")[0].split("https://")[1] || "staging";

@@ -269,0 +275,0 @@ const adminURL2 = env3.adminURL || (isEphemeralEnvironment2 ? `https://${ephemeralPrefix2}-${ephemeralId2}-backend.dev.testgorilla.com` : environment2 === "app" ? `https://new-admin.testgorilla.com` : `https://${environment2}-new-admin.testgorilla.com`);

import {
LoginAPI
} from "./chunk-XW3CPEDR.mjs";
} from "./chunk-6HR5SXUC.mjs";
import "./chunk-DTRYG7JP.mjs";

@@ -9,3 +9,3 @@ import "./chunk-ZVF6EZ5L.mjs";

} from "./chunk-ATYQC4YE.mjs";
import "./chunk-U7YT53U2.mjs";
import "./chunk-B64Y5SGV.mjs";
import {

@@ -23,3 +23,3 @@ adminEmail,

starterPlanUserEmail
} from "./chunk-DW4V5VUB.mjs";
} from "./chunk-TJHUXULD.mjs";

@@ -26,0 +26,0 @@ // src/auth/credentials.ts

@@ -39,3 +39,3 @@ var __create = Object.create;

// src/config/resolve.ts
var EPHEMERAL_PREFIX_PATTERN = /https?:\/\/(backend|talent-api)-(\d+)-[^.]+\.dev\.testgorilla\.com/;
var EPHEMERAL_PREFIX_PATTERN = /https?:\/\/(.+?)-(\d+)-[^.]+\.dev\.testgorilla\.com/;
var LOCAL_MAILHOG_URL = "http://localhost:8025";

@@ -103,5 +103,11 @@ function defineRequiredSecret(target, property, value, envVar) {

const ephemeralMatch = baseURL2.match(EPHEMERAL_PREFIX_PATTERN);
const ephemeralPrefix2 = ephemeralMatch ? ephemeralMatch[1] : null;
const ephemeralId2 = ephemeralMatch ? ephemeralMatch[2] : null;
const isEphemeralEnvironment2 = !!ephemeralId2;
const declaredEnvironment = env3.E2E_ENVIRONMENT?.toLowerCase();
const isEphemeralEnvironment2 = declaredEnvironment ? declaredEnvironment === "ephemeral" : !!ephemeralMatch;
if (isEphemeralEnvironment2 && !ephemeralMatch) {
throw new Error(
`[e2e-framework] E2E_ENVIRONMENT=ephemeral but baseURL "${baseURL2}" does not match <prefix>-<id>-<service>.dev.testgorilla.com \u2014 sibling service URLs cannot be derived.`
);
}
const ephemeralPrefix2 = isEphemeralEnvironment2 && ephemeralMatch ? ephemeralMatch[1] : null;
const ephemeralId2 = isEphemeralEnvironment2 && ephemeralMatch ? ephemeralMatch[2] : null;
const environment2 = baseURL2.split(".testgorilla.com")[0].split("https://")[1] || "staging";

@@ -108,0 +114,0 @@ const adminURL2 = env3.adminURL || (isEphemeralEnvironment2 ? `https://${ephemeralPrefix2}-${ephemeralId2}-backend.dev.testgorilla.com` : environment2 === "app" ? `https://new-admin.testgorilla.com` : `https://${environment2}-new-admin.testgorilla.com`);

@@ -9,3 +9,3 @@ import {

baseURL
} from "./chunk-DW4V5VUB.mjs";
} from "./chunk-TJHUXULD.mjs";

@@ -12,0 +12,0 @@ // src/chargebee/index.ts

@@ -122,3 +122,3 @@ var __create = Object.create;

// src/config/resolve.ts
var EPHEMERAL_PREFIX_PATTERN = /https?:\/\/(backend|talent-api)-(\d+)-[^.]+\.dev\.testgorilla\.com/;
var EPHEMERAL_PREFIX_PATTERN = /https?:\/\/(.+?)-(\d+)-[^.]+\.dev\.testgorilla\.com/;
var LOCAL_MAILHOG_URL = "http://localhost:8025";

@@ -186,5 +186,11 @@ function defineRequiredSecret(target, property, value, envVar) {

const ephemeralMatch = baseURL2.match(EPHEMERAL_PREFIX_PATTERN);
const ephemeralPrefix2 = ephemeralMatch ? ephemeralMatch[1] : null;
const ephemeralId2 = ephemeralMatch ? ephemeralMatch[2] : null;
const isEphemeralEnvironment2 = !!ephemeralId2;
const declaredEnvironment = env3.E2E_ENVIRONMENT?.toLowerCase();
const isEphemeralEnvironment2 = declaredEnvironment ? declaredEnvironment === "ephemeral" : !!ephemeralMatch;
if (isEphemeralEnvironment2 && !ephemeralMatch) {
throw new Error(
`[e2e-framework] E2E_ENVIRONMENT=ephemeral but baseURL "${baseURL2}" does not match <prefix>-<id>-<service>.dev.testgorilla.com \u2014 sibling service URLs cannot be derived.`
);
}
const ephemeralPrefix2 = isEphemeralEnvironment2 && ephemeralMatch ? ephemeralMatch[1] : null;
const ephemeralId2 = isEphemeralEnvironment2 && ephemeralMatch ? ephemeralMatch[2] : null;
const environment2 = baseURL2.split(".testgorilla.com")[0].split("https://")[1] || "staging";

@@ -191,0 +197,0 @@ const adminURL2 = env3.adminURL || (isEphemeralEnvironment2 ? `https://${ephemeralPrefix2}-${ephemeralId2}-backend.dev.testgorilla.com` : environment2 === "app" ? `https://new-admin.testgorilla.com` : `https://${environment2}-new-admin.testgorilla.com`);

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/config/index.ts","../src/config/resolve.ts","../src/config/runId.ts","../src/config/algolia.ts","../src/config/constants.ts","../src/config/recaptcha.ts","../src/config/randomData.ts"],"sourcesContent":["/**\n * Compatibility surface over {@link resolveTgEnvironment}.\n *\n * Every export here preserves the NAME and SHAPE (const vs function) of the\n * corresponding export in tgo-qa-automation's `helpers/config`, so consumers\n * migrate with a module-specifier-only import rewrite. The values come from a\n * single module-load resolution of `process.env` — the same timing the suite\n * relies on today (env is inherited by every Playwright worker process).\n *\n * Credentials ship with NO defaults: `password` is empty when `E2E_PASSWORD`\n * is unset (the structured `accounts.password` accessor throws with guidance\n * instead).\n */\nimport { resolveTgEnvironment } from './resolve';\nimport { getRunId } from './runId';\n\nexport type { E2eAccounts, E2eConfig, E2eUrls } from './types';\nexport { resolveTgEnvironment } from './resolve';\n\nconst cfg = resolveTgEnvironment();\n\n// --- Environment & URLs (parity with helpers/config/environment.ts) ---\n\nexport const baseURL = cfg.baseURL;\nexport const environment = cfg.environment;\nexport const isEphemeralEnvironment = cfg.isEphemeralEnvironment;\nexport const ephemeralPrefix = cfg.ephemeralPrefix;\nexport const ephemeralId = cfg.ephemeralId;\nexport const isLocalEnvironment = cfg.isLocalEnvironment;\nexport const adminURL = cfg.adminURL;\nexport const localMailHogURL = 'http://localhost:8025';\n\n/** Returns environment-specific mailpit (ephemeral) or local MailHog URL. */\nexport const mailpitURL = (): string => cfg.urls.mailpit;\n\n/**\n * Returns the LocalStack URL for the current ephemeral environment, or `null`\n * when not running against one.\n */\nexport const localstackURL = (): string | null => cfg.urls.localstack;\n\n/** Returns environment-specific talent base URL. */\nexport const talentBaseURL = (): string => cfg.urls.talentBase;\n\n/** Returns environment-specific talent assessment URL. */\nexport const talentAssessmentURL = (): string => cfg.urls.talentAssessment;\n\n/** Returns environment-specific talent API URL. */\nexport const talentApiURL = (): string => cfg.urls.talentApi;\n\n/** Returns environment-specific code runner API URL. */\nexport const codeRunnerApiURL = (): string => cfg.urls.codeRunnerApi;\n\n/** Returns environment-specific website base URL. */\nexport const websiteBaseURL = (): string => cfg.urls.websiteBase;\n\n/** Returns environment-specific signup sender address. */\nexport const signupFromEmail = (): string => cfg.emails.signupFrom;\n\n/** Returns environment-specific assessments sender address. */\nexport const assessmentsFromEmail = (): string => cfg.emails.assessmentsFrom;\n\n/** Check if current environment is NOT staging. */\nexport const ifNotStagingRun = (): boolean => !cfg.baseURL.includes('staging.testgorilla');\n\n/**\n * Check if current environment is NEITHER staging NOR an ephemeral dev env.\n * Use this to skip tests that depend on the website → app signup flow.\n */\nexport const ifNotStagingOrEphemeralRun = (): boolean =>\n ifNotStagingRun() && !cfg.isEphemeralEnvironment;\n\n/** Check if current environment is NOT localhost. */\nexport const ifNotLocalhostRun = (): boolean => !cfg.baseURL.includes('localhost');\n\n/**\n * Rewrites a signup URL produced by the marketing website (which always\n * points at app.testgorilla.com) so it targets the current environment.\n */\nexport const rewriteSignupUrlForEnv = (signupUrl: string): string => {\n const targetHost = new URL(cfg.baseURL).host;\n return signupUrl.replace(/app\\.testgorilla\\.com/i, targetHost);\n};\n\n// --- Environment URL constants (parity with helpers/config/environment.ts) ---\n\nexport const prodTesttakerUrlString = 'https://assessment.testgorilla.com';\nexport const prodTASUrlString = 'https://talent-assessment.testgorilla.com';\nexport const stageTesttakerUrlString = 'https://staging-assessment.testgorilla.com';\nexport const stageTASUrlString = 'https://talent-assessment-staging.testgorilla.com';\nexport const devTASUrlString = 'https://talent-assessment-dev.testgorilla.com';\nexport const localTASUrlString = 'http://localhost:4100';\nexport const stagingTASAPIUrl = 'https://api-talent-staging.testgorilla.com';\n\n// --- Seed assessment names (product constants, non-secret) ---\n\nexport const CandidateInviteAssessment = 'Candidate-Invite-Assessment-4-Do-not-archive';\nexport const candidateExpiredAssessment = 'Candidate-Expired-Assessment-1-Do-not-archive';\nexport const candidateArchivedAssessment = 'Candidate-Archived-Assessment-1-Do-not-archive';\nexport const tasSimpleMcqAssessment = 'TAS-MCQ-Assessment';\nexport const tasCustomTestAssessment = 'TAS-Custom-Test-Assessment';\nexport const tasSimpleBulkAssessment = 'TAS-Bulk-Assessment';\n\n// --- Test accounts (parity with helpers/config/testAccounts.ts, secrets stripped) ---\n\n/** Structured account set; `accounts.password` throws with guidance if `E2E_PASSWORD` is unset. */\nexport const accounts = cfg.accounts;\n\n/** Main organizer account email for this run. */\nexport const email = cfg.accounts.organizerEmail;\n\n/**\n * Organizer password from `E2E_PASSWORD` (legacy `e2e_password`). Empty string\n * when unset — the framework ships no credential defaults. Prefer\n * `accounts.password`, which throws with setup guidance instead of silently\n * yielding ''.\n */\nexport const password = process.env.E2E_PASSWORD ?? process.env.e2e_password ?? '';\n\nexport const candidateEmail = cfg.accounts.candidateEmail;\nexport const hiringManagerEmail = cfg.accounts.hiringManagerEmail;\nexport const recruiterEmail = cfg.accounts.recruiterEmail;\nexport const adminEmail = cfg.accounts.adminEmail;\nexport const newAdminEmail = cfg.accounts.newAdminEmail;\nexport const freeUserEmail = cfg.accounts.freeUserEmail;\nexport const corePlanUserEmail = cfg.accounts.corePlanUserEmail;\nexport const plusPlanUserEmail = cfg.accounts.plusPlanUserEmail;\nexport const proPlanUserEmail = cfg.accounts.proPlanUserEmail;\nexport const businessPlanUserEmail = cfg.accounts.businessPlanUserEmail;\nexport const starterPlanUserEmail = cfg.accounts.starterPlanUserEmail;\nexport const myProfileUserEmail = cfg.accounts.myProfileUserEmail;\nexport const atsIntegrationsEmail = cfg.accounts.atsIntegrationsEmail;\n\nconst EMAIL_DOMAIN = '@testgorilla.com';\nconst DUMMY_TESTS_PREFIX = 'dummy.tests';\n\n// Per-process tie-breaker so two mints in the same millisecond never collide.\nlet mintCounter = 0;\n\n/**\n * Unique, run-attributable suffix for generated identities:\n * `<runId>x<epoch36><counter>`. Embedding the run id makes every row on the\n * shared staging DB traceable to the CI workflow or local user that created\n * it, and lets purge jobs select marked data (.github/instructions/07-test-data.md).\n */\nconst mintSuffix = (): string => `${getRunId()}x${Date.now().toString(36)}${mintCounter++}`;\n\n/**\n * Generate a random candidate email.\n * Format: `dummy.tests+cand<rand><runId>x<timestamp>@testgorilla.com`.\n */\nexport const randCandidateEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+cand${rand}${mintSuffix()}${EMAIL_DOMAIN}`;\n\n/**\n * Generate a random customer email.\n * Format: `dummy.tests+cust<rand><runId>x<timestamp>@testgorilla.com`.\n */\nexport const randCustomerEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+cust${rand}${mintSuffix()}${EMAIL_DOMAIN}`;\n\n// --- Algolia, constants, recaptcha (parity with helpers/config) ---\n// Lazily circular: algolia/recaptcha read baseURL/isEphemeralEnvironment from\n// this barrel inside their functions only, never at module load.\n\nexport { getAlgoliaUrl, getAlgoliaHeaders } from './algolia';\nexport * from './constants';\nexport { getRecaptchaBypassKey, setRecaptchaBypassKeyProvider } from './recaptcha';\nexport type { RecaptchaKeyProvider } from './recaptcha';\n\n/**\n * Generate a random team-member email tagged with the current environment.\n * Format: `dummy.tests+t<rand><env>+<runId>x<timestamp>@testgorilla.com`.\n */\nexport const randTeamMemberEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+t${rand}${cfg.environment}+${mintSuffix()}${EMAIL_DOMAIN}`;\n\n// Random test-data generators (faker replacement) + username/phone utilities\nexport * from './randomData';\nexport { getRunId };\n","import type { E2eAccounts, E2eConfig, E2eUrls } from './types';\n\n/**\n * Ephemeral environment detection.\n * Supported prefixes:\n * - `backend` → backend-led deployments (e.g. https://backend-1234-talent.dev.testgorilla.com)\n * - `talent-api` → Talent-app-led deployments (e.g. https://talent-api-1756-talent.dev.testgorilla.com)\n * Add a new alternative to the regex if/when another deployment prefix is introduced.\n */\nconst EPHEMERAL_PREFIX_PATTERN =\n /https?:\\/\\/(backend|talent-api)-(\\d+)-[^.]+\\.dev\\.testgorilla\\.com/;\n\nconst LOCAL_MAILHOG_URL = 'http://localhost:8025';\n\n/**\n * Build a lazily-throwing secret accessor: the property reads as a normal\n * string when the env var is set, and throws with setup guidance the first\n * time it is READ while unset. Importing the config never throws.\n *\n * Non-enumerable so JSON-serializing an E2eConfig (e.g. passing it through\n * `test.use` in playwright.config, which serializes options to workers) can\n * neither leak the credential nor trip the missing-env error.\n */\nfunction defineRequiredSecret(\n target: object,\n property: string,\n value: string | undefined,\n envVar: string,\n): void {\n Object.defineProperty(target, property, {\n enumerable: false,\n configurable: true,\n get(): string {\n if (value === undefined || value === '') {\n throw new Error(\n `[e2e-framework] ${envVar} is not set. The framework ships no credential defaults — ` +\n `export ${envVar} (see your team's 1Password e2e .env entry) before running tests.`,\n );\n }\n return value;\n },\n });\n}\n\nfunction resolveAccounts(env: NodeJS.ProcessEnv): E2eAccounts {\n const nodeIndexedOrganizer = env.CIRCLE_NODE_TOTAL\n ? `dummy.tests+organizer${env.CIRCLE_NODE_INDEX}@testgorilla.com`\n : `dummy.tests+organizer11@testgorilla.com`;\n const accountIndex = env.E2E_ACCOUNT_INDEX;\n\n const accounts = {\n organizerEmail:\n env.userEmail ??\n (accountIndex !== undefined\n ? `dummy.tests+organizer${accountIndex}@testgorilla.com`\n : nodeIndexedOrganizer),\n candidateEmail: env.candidateEmail ?? 'dummy.tests@testgorilla.com',\n hiringManagerEmail: env.hiringManagerEmail ?? 'dummy.tests+hiringmanager01@testgorilla.com',\n recruiterEmail: env.recruiterEmail ?? 'dummy.tests+recruiter1@testgorilla.com',\n adminEmail: env.adminEmail ?? 'dummy.tests+admin1@testgorilla.com',\n newAdminEmail: env.newAdminEmail ?? 'dummy.tests+newadmin@testgorilla.com',\n freeUserEmail: env.freeUserEmail ?? 'dummy.tests+free0@testgorilla.com',\n corePlanUserEmail: env.corePlanUserEmail ?? 'dummy.tests+coreplan@testgorilla.com',\n plusPlanUserEmail: env.plusPlanUserEmail ?? 'dummy.tests+plus@testgorilla.com',\n proPlanUserEmail: env.proPlanUserEmail ?? 'dummy.tests+pro@testgorilla.com',\n businessPlanUserEmail: env.businessPlanUserEmail ?? 'dummy.tests+business@testgorilla.com',\n starterPlanUserEmail: env.starterPlanUserEmail ?? 'dummy.tests+starter@testgorilla.com',\n myProfileUserEmail: env.myProfileUserEmail ?? 'dummy.tests+myprofile@testgorilla.com',\n atsIntegrationsEmail:\n env.atsIntegrationsEmail ?? 'dummy.tests+ats-integrations@testgorilla.com',\n } as E2eAccounts;\n\n defineRequiredSecret(accounts, 'password', env.E2E_PASSWORD ?? env.e2e_password, 'E2E_PASSWORD');\n defineRequiredSecret(\n accounts,\n 'candidatePassword',\n env.E2E_CANDIDATE_PASSWORD,\n 'E2E_CANDIDATE_PASSWORD',\n );\n\n return accounts;\n}\n\nfunction resolveUrls(\n baseURL: string,\n ephemeralPrefix: string | null,\n ephemeralId: string | null,\n): E2eUrls {\n const isEphemeral = !!ephemeralId;\n const ephemeralHost = (service: string) =>\n `https://${ephemeralPrefix}-${ephemeralId}-${service}.dev.testgorilla.com`;\n const isProd = baseURL.includes('app.testgorilla');\n const isDev = baseURL.includes('dev.testgorilla');\n const isLocalhost = baseURL.includes('localhost');\n\n return {\n talentBase: isEphemeral\n ? ephemeralHost('talent')\n : isProd\n ? 'https://talent.testgorilla.com'\n : isDev\n ? 'https://talent-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4100'\n : 'https://talent-staging.testgorilla.com',\n talentAssessment: isEphemeral\n ? ephemeralHost('talent-assessment')\n : isProd\n ? 'https://talent-assessment.testgorilla.com'\n : isDev\n ? 'https://talent-assessment-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4100'\n : 'https://talent-assessment-staging.testgorilla.com',\n talentApi: isEphemeral\n ? ephemeralHost('api-talent')\n : isProd\n ? 'https://api-talent.testgorilla.com'\n : isDev\n ? 'https://api-talent-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4200'\n : 'https://api-talent-staging.testgorilla.com',\n codeRunnerApi: isProd\n ? 'https://cr-v2.testgorilla.com'\n : isDev\n ? 'https://cr-v2-dev.testgorilla.com'\n : 'https://cr-v2-staging.testgorilla.com',\n websiteBase: isProd\n ? 'https://www.testgorilla.com'\n : isDev && !isEphemeral\n ? 'https://website-dev.testgorilla.com'\n : 'https://website-staging.testgorilla.com',\n mailpit: isEphemeral ? ephemeralHost('mailpit') : LOCAL_MAILHOG_URL,\n localstack: isEphemeral ? ephemeralHost('localstack') : null,\n };\n}\n\n/**\n * Resolve the full e2e run configuration from environment variables, using\n * TestGorilla's environment naming conventions (staging default, ephemeral\n * `backend-<id>` / `talent-api-<id>` dev deployments, production `app`).\n *\n * Pure with respect to its input: pass a custom env for testing; defaults to\n * `process.env`. Never throws on missing secrets — required credentials\n * (`E2E_PASSWORD`, `E2E_CANDIDATE_PASSWORD`) throw with guidance only when\n * first read.\n */\nexport function resolveTgEnvironment(env: NodeJS.ProcessEnv = process.env): E2eConfig {\n const baseURL = env.baseURL || 'https://staging.testgorilla.com';\n\n const ephemeralMatch = baseURL.match(EPHEMERAL_PREFIX_PATTERN);\n const ephemeralPrefix = (ephemeralMatch ? ephemeralMatch[1] : null) as\n | 'backend'\n | 'talent-api'\n | null;\n const ephemeralId = ephemeralMatch ? ephemeralMatch[2] : null;\n const isEphemeralEnvironment = !!ephemeralId;\n\n const environment = baseURL.split('.testgorilla.com')[0].split('https://')[1] || 'staging';\n\n const adminURL =\n env.adminURL ||\n (isEphemeralEnvironment\n ? `https://${ephemeralPrefix}-${ephemeralId}-backend.dev.testgorilla.com`\n : environment === 'app'\n ? `https://new-admin.testgorilla.com`\n : `https://${environment}-new-admin.testgorilla.com`);\n\n const isProd = baseURL.includes('app.testgorilla');\n const isDev = baseURL.includes('dev.testgorilla');\n const isLocalhost = baseURL.includes('localhost');\n\n return {\n baseURL,\n environment,\n isEphemeralEnvironment,\n ephemeralPrefix,\n ephemeralId,\n isLocalEnvironment: env.localEnvironment === 'true' || isEphemeralEnvironment,\n adminURL,\n urls: resolveUrls(baseURL, ephemeralPrefix, ephemeralId),\n emails: {\n signupFrom: isProd\n ? 'hello@testgorilla.com'\n : isLocalhost\n ? 'noreply@example'\n : isDev || isEphemeralEnvironment\n ? 'hello@maildev.testgorilla.com'\n : 'hello@mailstaging.testgorilla.com',\n assessmentsFrom: isProd\n ? 'assessments@testgorilla.com'\n : isLocalhost\n ? 'assessments@example.com'\n : isDev || isEphemeralEnvironment\n ? 'assessments@maildev.testgorilla.com'\n : 'assessments@mailstaging.testgorilla.com',\n },\n accounts: resolveAccounts(env),\n };\n}\n","import * as os from 'os';\nimport { env } from 'process';\n\n/**\n * Run identity for synthetic test data.\n *\n * Every identity the generators mint embeds this id, so any row on the shared\n * (append-only) staging database is attributable to the run that created it —\n * CI or somebody's laptop — and purge jobs can select marked data instead of\n * relying on heuristics (.github/instructions/07-test-data.md).\n *\n * Resolution order:\n * 1. `E2E_RUN_ID` env var (explicit label, e.g. `E2E_RUN_ID=debug-foo`)\n * 2. CI: `ci<hash>` derived from the CircleCI workflow id\n * 3. local: `loc<user><MMDDhhmm>`\n *\n * The computed value is published back to `process.env.E2E_RUN_ID`, so\n * Playwright worker processes (which inherit env from the runner) all agree —\n * the same mechanism the auth-token contract uses. Alphanumeric only, ≤ 16\n * chars, so generated email local-parts stay inside the 64-char limit.\n */\nexport function getRunId(): string {\n if (!env.E2E_RUN_ID) {\n env.E2E_RUN_ID = env.CI ? `ci${shortHash(env.CIRCLE_WORKFLOW_ID ?? '')}` : localRunId();\n }\n return env.E2E_RUN_ID;\n}\n\n/** Deterministic 6-char base-36 hash — enough to tell workflows apart. */\nfunction shortHash(input: string): string {\n let hash = 0;\n for (const char of input) {\n hash = (hash * 31 + char.charCodeAt(0)) >>> 0;\n }\n return hash.toString(36).padStart(6, '0').slice(-6);\n}\n\nfunction localRunId(): string {\n let user = '';\n try {\n user = os\n .userInfo()\n .username.toLowerCase()\n .replace(/[^a-z0-9]/g, '')\n .slice(0, 8);\n } catch {\n // Containers whose uid has no passwd entry throw here; identity\n // generation must never crash a run, so fall back to 'unknown'.\n }\n const now = new Date();\n const pad = (n: number) => String(n).padStart(2, '0');\n const stamp = `${pad(now.getMonth() + 1)}${pad(now.getDate())}${pad(now.getHours())}${pad(\n now.getMinutes(),\n )}`;\n return `loc${user || 'unknown'}${stamp}`;\n}\n","/**\n * Algolia Configuration\n *\n * Test-library search used during assessment creation. The bundled defaults\n * are the same index-restricted, search-only keys the customer frontend ships\n * to browsers (not admin keys); override any of them via the ALGOLIA_* env\n * vars below without a code change (e.g. on key rotation).\n */\n\nimport { baseURL, isEphemeralEnvironment } from './index';\n\nconst ALGOLIA_APP_ID = process.env.ALGOLIA_APP_ID || 'V8Y626J4K8';\n\n// Algolia Index Names\nconst ALGOLIA_PROD_INDEX = process.env.ALGOLIA_PROD_INDEX || 'production_tests_index';\nconst ALGOLIA_STAGING_INDEX = process.env.ALGOLIA_STAGING_INDEX || 'staging_tests_index';\nconst ALGOLIA_EPHEMERAL_INDEX = process.env.ALGOLIA_EPHEMERAL_INDEX || 'ephemeral_tests_index';\n\n// Algolia API Keys (search-only, restricted to the specific indices)\nconst ALGOLIA_PROD_API_KEY =\n process.env.ALGOLIA_PROD_API_KEY ||\n 'NDc2N2JlMmY5ZGE2NzM4NDIwOWM2ODkyMWY0Yjk5YjYyNTA5NTViNDg2YzNlN2VlZDE4MmYyOWE3YmRjNjg1ZXJlc3RyaWN0SW5kaWNlcz1wcm9kdWN0aW9uX3Rlc3RzX2luZGV4';\nconst ALGOLIA_STAGING_API_KEY =\n process.env.ALGOLIA_STAGING_API_KEY ||\n 'ZjZmYWMwYjNkN2IxZjViYzA0OTZkZGE3OWY5MmVjYWMzN2RlYWJlYjcyOWRlMWQ3YjMwM2RjYjk0NDNjZGY0MXJlc3RyaWN0SW5kaWNlcz1zdGFnaW5nX3Rlc3RzX2luZGV4';\nconst ALGOLIA_EPHEMERAL_API_KEY =\n process.env.ALGOLIA_EPHEMERAL_API_KEY || '5beea78e78134e8270214f93b7032e7b';\n\n/**\n * Returns environment-specific Algolia API URL\n */\nexport const getAlgoliaUrl = (): string => {\n const isProduction = baseURL.includes('app.testgorilla');\n\n if (isEphemeralEnvironment) {\n return `https://v8y626j4k8-dsn.algolia.net/1/indexes/${ALGOLIA_EPHEMERAL_INDEX}/query`;\n }\n\n const index = isProduction ? ALGOLIA_PROD_INDEX : ALGOLIA_STAGING_INDEX;\n const domain = isProduction ? 'algolianet.com' : 'algolia.net';\n const subdomain = isProduction ? 'v8y626j4k8-2' : 'v8y626j4k8-dsn';\n\n return `https://${subdomain}.${domain}/1/indexes/${index}/query`;\n};\n\n/**\n * Returns environment-specific Algolia API headers\n */\nexport const getAlgoliaHeaders = (): Record<string, string> => {\n const isProduction = baseURL.includes('app.testgorilla');\n\n let apiKey: string;\n if (isEphemeralEnvironment) {\n apiKey = ALGOLIA_EPHEMERAL_API_KEY;\n } else {\n apiKey = isProduction ? ALGOLIA_PROD_API_KEY : ALGOLIA_STAGING_API_KEY;\n }\n\n return {\n 'content-type': 'application/x-www-form-urlencoded',\n 'x-algolia-api-key': apiKey,\n 'x-algolia-application-id': ALGOLIA_APP_ID,\n };\n};\n","/**\n * Constants & Retries\n *\n * Contains global retry counters and other application constants.\n */\n\nimport { env } from 'process';\n\n// Retry counters - used to determine retry behavior in tests\nexport const DEFAULT_RETRY_COUNTER = 10;\nexport const INCREASED_RETRY_COUNTER_50 = DEFAULT_RETRY_COUNTER * 1.5;\nexport const INCREASED_RETRY_COUNTER_80 = DEFAULT_RETRY_COUNTER * 1.8;\nexport const INCREASED_RETRY_COUNTER_200 = DEFAULT_RETRY_COUNTER * 2;\nexport const INCREASED_RETRY_COUNTER_300 = DEFAULT_RETRY_COUNTER * 3;\n\n// Logger configuration. Default: WARN both in CI and locally — opt in to INFO for milestones\n// or DEBUG for per-request chatter via the LOG_LEVEL env var.\n// API_LOG_LEVEL / API_LOG_FILE are accepted for back-compat with a one-time deprecation note.\nconst rawLogLevel = env.LOG_LEVEL?.toUpperCase() || env.API_LOG_LEVEL?.toUpperCase() || 'WARN';\nif (!env.LOG_LEVEL && env.API_LOG_LEVEL && !env._LOG_DEPRECATION_WARNED) {\n process.stderr.write(\n '[logger] API_LOG_LEVEL is deprecated; use LOG_LEVEL instead (same values).\\n',\n );\n env._LOG_DEPRECATION_WARNED = '1';\n}\nexport const logLevel = rawLogLevel as 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'NONE';\nexport const logFile = env.LOG_FILE || env.API_LOG_FILE || '';\n\n// Back-compat aliases — prefer logLevel / logFile in new code.\nexport const apiLogLevel = logLevel;\nexport const apiLogFile = logFile;\n\n// Assessment configuration — the name→id map published by global setup\n// (process.env.assessments; see @testgorilla/e2e-framework/setup).\nexport const assessmentList = JSON.parse(env.assessments || '{}');\n\n// Other constants\nexport const MAILPIT_SERVER = 'http://localhost:8025';\nexport const simpleAssessmentName = `New Simple Assessment - ${Date.now()}`;\nexport const invitationEmailSubject = 'Your application at TestGorilla';\n\n// Email reception tracking\nexport const emailReception = { slowEmailAPI: false };\n","import { isEphemeralEnvironment } from './index';\n\n/**\n * Supplies the backend's recaptcha bypass key for a given backend environment\n * name (e.g. 'staging', 'dev', 'app'). tgo-qa-automation registers an AWS\n * SSM-backed provider; other consumers typically rely on the env vars alone.\n */\nexport type RecaptchaKeyProvider = (\n backendEnvironment: string,\n) => Promise<string | null | undefined>;\n\nlet keyProvider: RecaptchaKeyProvider | undefined;\n\n/**\n * Registers a fallback source for the recaptcha bypass key, consulted only\n * when the RECAPTCHA_BYPASS_KEY / RECAPTCHA_BYPASS_KEY_STAGE env vars are\n * unset. The framework itself ships no AWS/SSM dependency — the consumer\n * decides where keys come from.\n */\nexport function setRecaptchaBypassKeyProvider(provider: RecaptchaKeyProvider): void {\n keyProvider = provider;\n}\n\n/**\n * Resolves the recaptcha bypass key with the historical precedence:\n * env var (RECAPTCHA_BYPASS_KEY_STAGE on ephemeral envs, RECAPTCHA_BYPASS_KEY\n * otherwise) → registered provider → the literal 'Not Set' (requests then\n * proceed without a working bypass, matching previous behavior).\n */\nexport async function getRecaptchaBypassKey(backendEnvironment: string): Promise<string> {\n const fromEnv = isEphemeralEnvironment\n ? process.env.RECAPTCHA_BYPASS_KEY_STAGE\n : process.env.RECAPTCHA_BYPASS_KEY;\n if (fromEnv) {\n return fromEnv;\n }\n const fromProvider = keyProvider ? await keyProvider(backendEnvironment) : undefined;\n return fromProvider || 'Not Set';\n}\n","/**\n * Random test-data generators (names, phrases, cities, alphanumerics).\n *\n * Replaces the suite's former @faker-js/faker usage (~28 MB installed) with\n * small curated pools — e2e tests only need plausible-looking values, not\n * locale-aware realism. None of these guarantee uniqueness; call sites that\n * need unique values append `Date.now()` (as they always have).\n */\n\nconst FIRST_NAMES = [\n 'Alice',\n 'Bruno',\n 'Carmen',\n 'Diego',\n 'Elena',\n 'Felix',\n 'Greta',\n 'Hugo',\n 'Irene',\n 'Jonas',\n 'Katia',\n 'Liam',\n 'Marta',\n 'Nadia',\n 'Oscar',\n 'Paula',\n 'Quentin',\n 'Rosa',\n 'Sofia',\n 'Tomas',\n 'Ursula',\n 'Victor',\n 'Wanda',\n 'Xavier',\n 'Yara',\n 'Zoe',\n 'Andre',\n 'Bianca',\n 'Cesar',\n 'Dora',\n];\n\nconst LAST_NAMES = [\n 'Almeida',\n 'Bauer',\n 'Castro',\n 'Dubois',\n 'Eriksen',\n 'Fischer',\n 'Garcia',\n 'Hansen',\n 'Ibrahim',\n 'Jansen',\n 'Keller',\n 'Lopez',\n 'Meyer',\n 'Novak',\n 'Olsen',\n 'Peeters',\n 'Quinn',\n 'Rossi',\n 'Schmidt',\n 'Torres',\n 'Ueda',\n 'Vargas',\n 'Weber',\n 'Xu',\n 'Yilmaz',\n 'Zhang',\n];\n\nconst JOB_TITLE_AREAS = [\n 'Marketing',\n 'Product',\n 'Operations',\n 'Finance',\n 'Support',\n 'Engineering',\n 'Design',\n 'Sales',\n 'Research',\n 'Quality',\n];\nconst JOB_TITLE_ROLES = [\n 'Manager',\n 'Specialist',\n 'Analyst',\n 'Coordinator',\n 'Engineer',\n 'Consultant',\n 'Associate',\n 'Director',\n 'Assistant',\n 'Lead',\n];\n\nconst PHRASE_VERBS = [\n 'streamline',\n 'orchestrate',\n 'benchmark',\n 'optimize',\n 'aggregate',\n 'harness',\n 'incentivize',\n 'synthesize',\n 'iterate',\n 'scale',\n];\nconst PHRASE_ADJECTIVES = [\n 'scalable',\n 'seamless',\n 'dynamic',\n 'proactive',\n 'granular',\n 'robust',\n 'frictionless',\n 'holistic',\n 'intuitive',\n 'compelling',\n];\nconst PHRASE_NOUNS = [\n 'workflows',\n 'channels',\n 'metrics',\n 'platforms',\n 'roadmaps',\n 'pipelines',\n 'paradigms',\n 'synergies',\n 'deliverables',\n 'interfaces',\n];\n\nconst CITIES = [\n 'Amsterdam',\n 'Barcelona',\n 'Copenhagen',\n 'Dublin',\n 'Edinburgh',\n 'Florence',\n 'Geneva',\n 'Hamburg',\n 'Istanbul',\n 'Jakarta',\n 'Krakow',\n 'Lisbon',\n 'Madrid',\n 'Nairobi',\n 'Oslo',\n 'Porto',\n 'Quito',\n 'Rotterdam',\n 'Seville',\n 'Tallinn',\n];\n\nconst WORDS = [\n 'amber',\n 'breeze',\n 'cedar',\n 'delta',\n 'ember',\n 'fjord',\n 'garnet',\n 'harbor',\n 'indigo',\n 'juniper',\n 'karma',\n 'lagoon',\n 'meadow',\n 'nectar',\n 'onyx',\n 'prairie',\n 'quartz',\n 'ripple',\n 'summit',\n 'tundra',\n];\n\nconst ALPHANUMERIC = 'abcdefghijklmnopqrstuvwxyz0123456789';\n\nconst pick = <T>(pool: readonly T[]): T => pool[Math.floor(Math.random() * pool.length)];\n\n/** Random plausible first name (ASCII, form-validation safe). */\nexport const randomFirstName = (): string => pick(FIRST_NAMES);\n\n/** Random plausible last name (ASCII, form-validation safe). */\nexport const randomLastName = (): string => pick(LAST_NAMES);\n\n/** Random \"First Last\" full name. */\nexport const randomFullName = (): string => `${randomFirstName()} ${randomLastName()}`;\n\n/** Random plausible job title, e.g. \"Product Analyst\". */\nexport const randomJobTitle = (): string => `${pick(JOB_TITLE_AREAS)} ${pick(JOB_TITLE_ROLES)}`;\n\n/**\n * Random buzzword phrase, e.g. \"streamline scalable workflows\". Used as a\n * readable label for generated tests/assessments; append `Date.now()` when\n * the value must be unique.\n */\nexport const randomPhrase = (): string =>\n `${pick(PHRASE_VERBS)} ${pick(PHRASE_ADJECTIVES)} ${pick(PHRASE_NOUNS)}`;\n\n/** Random space-separated words from a small neutral pool. */\nexport const randomWords = (count = 2): string =>\n Array.from({ length: count }, () => pick(WORDS)).join(' ');\n\n/** Random lowercase alphanumeric string of the given length. */\nexport const randomAlphaNumeric = (length = 1): string =>\n Array.from({ length }, () => ALPHANUMERIC[Math.floor(Math.random() * ALPHANUMERIC.length)]).join(\n '',\n );\n\n/** Random city name. */\nexport const randomCity = (): string => pick(CITIES);\n\n/** Random integer between min and max, both inclusive. */\nexport const randomNumber = (min: number, max: number): number =>\n Math.floor(Math.random() * (max - min + 1)) + min;\n\n// --- username/phone utilities (formerly the suite's helpers/usernameUtils) ---\n\n/** Strips spaces from a phone number string. */\nexport function convertPhoneNumberToString(phone: string) {\n return phone.replaceAll(' ', '');\n}\n\n/** Random Spanish mobile number (9 digits starting with 6). */\nexport function generateRandomSpanishPhone(): string {\n const eightLastDigits: number = Math.floor(Math.random() * 90000000);\n return (600000000 + eightLastDigits).toString();\n}\n\n/** Random plausible first name — kept for compatibility with the historical helper name. */\nexport function randomizeName(): string {\n return randomFirstName();\n}\n\n/**\n * Appends an epoch-timestamp suffix to the local part of an email address,\n * producing a unique username while keeping the original domain.\n */\nexport function randomizeUsername(email: string): string {\n const [username, domain] = email.split('@');\n const epochTimestamp = Math.floor(Date.now() / 1000);\n const newUsername = `${username}+${epochTimestamp}`;\n return `${newUsername}@${domain}`;\n}\n"],"mappings":"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","names":["env","accounts","baseURL","ephemeralPrefix","ephemeralId","isEphemeralEnvironment","environment","adminURL","import_process","email"]}
{"version":3,"sources":["../src/config/index.ts","../src/config/resolve.ts","../src/config/runId.ts","../src/config/algolia.ts","../src/config/constants.ts","../src/config/recaptcha.ts","../src/config/randomData.ts"],"sourcesContent":["/**\n * Compatibility surface over {@link resolveTgEnvironment}.\n *\n * Every export here preserves the NAME and SHAPE (const vs function) of the\n * corresponding export in tgo-qa-automation's `helpers/config`, so consumers\n * migrate with a module-specifier-only import rewrite. The values come from a\n * single module-load resolution of `process.env` — the same timing the suite\n * relies on today (env is inherited by every Playwright worker process).\n *\n * Credentials ship with NO defaults: `password` is empty when `E2E_PASSWORD`\n * is unset (the structured `accounts.password` accessor throws with guidance\n * instead).\n */\nimport { resolveTgEnvironment } from './resolve';\nimport { getRunId } from './runId';\n\nexport type { E2eAccounts, E2eConfig, E2eUrls } from './types';\nexport { resolveTgEnvironment } from './resolve';\n\nconst cfg = resolveTgEnvironment();\n\n// --- Environment & URLs (parity with helpers/config/environment.ts) ---\n\nexport const baseURL = cfg.baseURL;\nexport const environment = cfg.environment;\nexport const isEphemeralEnvironment = cfg.isEphemeralEnvironment;\nexport const ephemeralPrefix = cfg.ephemeralPrefix;\nexport const ephemeralId = cfg.ephemeralId;\nexport const isLocalEnvironment = cfg.isLocalEnvironment;\nexport const adminURL = cfg.adminURL;\nexport const localMailHogURL = 'http://localhost:8025';\n\n/** Returns environment-specific mailpit (ephemeral) or local MailHog URL. */\nexport const mailpitURL = (): string => cfg.urls.mailpit;\n\n/**\n * Returns the LocalStack URL for the current ephemeral environment, or `null`\n * when not running against one.\n */\nexport const localstackURL = (): string | null => cfg.urls.localstack;\n\n/** Returns environment-specific talent base URL. */\nexport const talentBaseURL = (): string => cfg.urls.talentBase;\n\n/** Returns environment-specific talent assessment URL. */\nexport const talentAssessmentURL = (): string => cfg.urls.talentAssessment;\n\n/** Returns environment-specific talent API URL. */\nexport const talentApiURL = (): string => cfg.urls.talentApi;\n\n/** Returns environment-specific code runner API URL. */\nexport const codeRunnerApiURL = (): string => cfg.urls.codeRunnerApi;\n\n/** Returns environment-specific website base URL. */\nexport const websiteBaseURL = (): string => cfg.urls.websiteBase;\n\n/** Returns environment-specific signup sender address. */\nexport const signupFromEmail = (): string => cfg.emails.signupFrom;\n\n/** Returns environment-specific assessments sender address. */\nexport const assessmentsFromEmail = (): string => cfg.emails.assessmentsFrom;\n\n/** Check if current environment is NOT staging. */\nexport const ifNotStagingRun = (): boolean => !cfg.baseURL.includes('staging.testgorilla');\n\n/**\n * Check if current environment is NEITHER staging NOR an ephemeral dev env.\n * Use this to skip tests that depend on the website → app signup flow.\n */\nexport const ifNotStagingOrEphemeralRun = (): boolean =>\n ifNotStagingRun() && !cfg.isEphemeralEnvironment;\n\n/** Check if current environment is NOT localhost. */\nexport const ifNotLocalhostRun = (): boolean => !cfg.baseURL.includes('localhost');\n\n/**\n * Rewrites a signup URL produced by the marketing website (which always\n * points at app.testgorilla.com) so it targets the current environment.\n */\nexport const rewriteSignupUrlForEnv = (signupUrl: string): string => {\n const targetHost = new URL(cfg.baseURL).host;\n return signupUrl.replace(/app\\.testgorilla\\.com/i, targetHost);\n};\n\n// --- Environment URL constants (parity with helpers/config/environment.ts) ---\n\nexport const prodTesttakerUrlString = 'https://assessment.testgorilla.com';\nexport const prodTASUrlString = 'https://talent-assessment.testgorilla.com';\nexport const stageTesttakerUrlString = 'https://staging-assessment.testgorilla.com';\nexport const stageTASUrlString = 'https://talent-assessment-staging.testgorilla.com';\nexport const devTASUrlString = 'https://talent-assessment-dev.testgorilla.com';\nexport const localTASUrlString = 'http://localhost:4100';\nexport const stagingTASAPIUrl = 'https://api-talent-staging.testgorilla.com';\n\n// --- Seed assessment names (product constants, non-secret) ---\n\nexport const CandidateInviteAssessment = 'Candidate-Invite-Assessment-4-Do-not-archive';\nexport const candidateExpiredAssessment = 'Candidate-Expired-Assessment-1-Do-not-archive';\nexport const candidateArchivedAssessment = 'Candidate-Archived-Assessment-1-Do-not-archive';\nexport const tasSimpleMcqAssessment = 'TAS-MCQ-Assessment';\nexport const tasCustomTestAssessment = 'TAS-Custom-Test-Assessment';\nexport const tasSimpleBulkAssessment = 'TAS-Bulk-Assessment';\n\n// --- Test accounts (parity with helpers/config/testAccounts.ts, secrets stripped) ---\n\n/** Structured account set; `accounts.password` throws with guidance if `E2E_PASSWORD` is unset. */\nexport const accounts = cfg.accounts;\n\n/** Main organizer account email for this run. */\nexport const email = cfg.accounts.organizerEmail;\n\n/**\n * Organizer password from `E2E_PASSWORD` (legacy `e2e_password`). Empty string\n * when unset — the framework ships no credential defaults. Prefer\n * `accounts.password`, which throws with setup guidance instead of silently\n * yielding ''.\n */\nexport const password = process.env.E2E_PASSWORD ?? process.env.e2e_password ?? '';\n\nexport const candidateEmail = cfg.accounts.candidateEmail;\nexport const hiringManagerEmail = cfg.accounts.hiringManagerEmail;\nexport const recruiterEmail = cfg.accounts.recruiterEmail;\nexport const adminEmail = cfg.accounts.adminEmail;\nexport const newAdminEmail = cfg.accounts.newAdminEmail;\nexport const freeUserEmail = cfg.accounts.freeUserEmail;\nexport const corePlanUserEmail = cfg.accounts.corePlanUserEmail;\nexport const plusPlanUserEmail = cfg.accounts.plusPlanUserEmail;\nexport const proPlanUserEmail = cfg.accounts.proPlanUserEmail;\nexport const businessPlanUserEmail = cfg.accounts.businessPlanUserEmail;\nexport const starterPlanUserEmail = cfg.accounts.starterPlanUserEmail;\nexport const myProfileUserEmail = cfg.accounts.myProfileUserEmail;\nexport const atsIntegrationsEmail = cfg.accounts.atsIntegrationsEmail;\n\nconst EMAIL_DOMAIN = '@testgorilla.com';\nconst DUMMY_TESTS_PREFIX = 'dummy.tests';\n\n// Per-process tie-breaker so two mints in the same millisecond never collide.\nlet mintCounter = 0;\n\n/**\n * Unique, run-attributable suffix for generated identities:\n * `<runId>x<epoch36><counter>`. Embedding the run id makes every row on the\n * shared staging DB traceable to the CI workflow or local user that created\n * it, and lets purge jobs select marked data (.github/instructions/07-test-data.md).\n */\nconst mintSuffix = (): string => `${getRunId()}x${Date.now().toString(36)}${mintCounter++}`;\n\n/**\n * Generate a random candidate email.\n * Format: `dummy.tests+cand<rand><runId>x<timestamp>@testgorilla.com`.\n */\nexport const randCandidateEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+cand${rand}${mintSuffix()}${EMAIL_DOMAIN}`;\n\n/**\n * Generate a random customer email.\n * Format: `dummy.tests+cust<rand><runId>x<timestamp>@testgorilla.com`.\n */\nexport const randCustomerEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+cust${rand}${mintSuffix()}${EMAIL_DOMAIN}`;\n\n// --- Algolia, constants, recaptcha (parity with helpers/config) ---\n// Lazily circular: algolia/recaptcha read baseURL/isEphemeralEnvironment from\n// this barrel inside their functions only, never at module load.\n\nexport { getAlgoliaUrl, getAlgoliaHeaders } from './algolia';\nexport * from './constants';\nexport { getRecaptchaBypassKey, setRecaptchaBypassKeyProvider } from './recaptcha';\nexport type { RecaptchaKeyProvider } from './recaptcha';\n\n/**\n * Generate a random team-member email tagged with the current environment.\n * Format: `dummy.tests+t<rand><env>+<runId>x<timestamp>@testgorilla.com`.\n */\nexport const randTeamMemberEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+t${rand}${cfg.environment}+${mintSuffix()}${EMAIL_DOMAIN}`;\n\n// Random test-data generators (faker replacement) + username/phone utilities\nexport * from './randomData';\nexport { getRunId };\n","import type { E2eAccounts, E2eConfig, E2eUrls } from './types';\n\n/**\n * Ephemeral environment detection.\n *\n * CI declares the target via `E2E_ENVIRONMENT` (the e2e-tests orb's\n * `environment` job parameter): `ephemeral` means ephemeral, any other value\n * means not — even if the URL happens to look ephemeral. When the variable is\n * unset (local runs, orb versions that don't export it yet), the baseURL\n * shape is the fallback signal.\n *\n * The URL parse itself stays either way: sibling service hosts are rebuilt\n * from the captured `<prefix>` and `<id>`. It is generic — no per-repo prefix\n * whitelist, so `backend-1234-…`, `talent-api-1756-…`,\n * `talent-assessment-987-…` and any future deployment prefix all match\n * `<prefix>-<id>-<service>.dev.testgorilla.com` without a framework release.\n * Lazy `(.+?)` splits at the FIRST `-<digits>-` segment so service names\n * containing digits (e.g. `cr-v2`) cannot mis-split the prefix.\n */\nconst EPHEMERAL_PREFIX_PATTERN = /https?:\\/\\/(.+?)-(\\d+)-[^.]+\\.dev\\.testgorilla\\.com/;\n\nconst LOCAL_MAILHOG_URL = 'http://localhost:8025';\n\n/**\n * Build a lazily-throwing secret accessor: the property reads as a normal\n * string when the env var is set, and throws with setup guidance the first\n * time it is READ while unset. Importing the config never throws.\n *\n * Non-enumerable so JSON-serializing an E2eConfig (e.g. passing it through\n * `test.use` in playwright.config, which serializes options to workers) can\n * neither leak the credential nor trip the missing-env error.\n */\nfunction defineRequiredSecret(\n target: object,\n property: string,\n value: string | undefined,\n envVar: string,\n): void {\n Object.defineProperty(target, property, {\n enumerable: false,\n configurable: true,\n get(): string {\n if (value === undefined || value === '') {\n throw new Error(\n `[e2e-framework] ${envVar} is not set. The framework ships no credential defaults — ` +\n `export ${envVar} (see your team's 1Password e2e .env entry) before running tests.`,\n );\n }\n return value;\n },\n });\n}\n\nfunction resolveAccounts(env: NodeJS.ProcessEnv): E2eAccounts {\n const nodeIndexedOrganizer = env.CIRCLE_NODE_TOTAL\n ? `dummy.tests+organizer${env.CIRCLE_NODE_INDEX}@testgorilla.com`\n : `dummy.tests+organizer11@testgorilla.com`;\n const accountIndex = env.E2E_ACCOUNT_INDEX;\n\n const accounts = {\n organizerEmail:\n env.userEmail ??\n (accountIndex !== undefined\n ? `dummy.tests+organizer${accountIndex}@testgorilla.com`\n : nodeIndexedOrganizer),\n candidateEmail: env.candidateEmail ?? 'dummy.tests@testgorilla.com',\n hiringManagerEmail: env.hiringManagerEmail ?? 'dummy.tests+hiringmanager01@testgorilla.com',\n recruiterEmail: env.recruiterEmail ?? 'dummy.tests+recruiter1@testgorilla.com',\n adminEmail: env.adminEmail ?? 'dummy.tests+admin1@testgorilla.com',\n newAdminEmail: env.newAdminEmail ?? 'dummy.tests+newadmin@testgorilla.com',\n freeUserEmail: env.freeUserEmail ?? 'dummy.tests+free0@testgorilla.com',\n corePlanUserEmail: env.corePlanUserEmail ?? 'dummy.tests+coreplan@testgorilla.com',\n plusPlanUserEmail: env.plusPlanUserEmail ?? 'dummy.tests+plus@testgorilla.com',\n proPlanUserEmail: env.proPlanUserEmail ?? 'dummy.tests+pro@testgorilla.com',\n businessPlanUserEmail: env.businessPlanUserEmail ?? 'dummy.tests+business@testgorilla.com',\n starterPlanUserEmail: env.starterPlanUserEmail ?? 'dummy.tests+starter@testgorilla.com',\n myProfileUserEmail: env.myProfileUserEmail ?? 'dummy.tests+myprofile@testgorilla.com',\n atsIntegrationsEmail:\n env.atsIntegrationsEmail ?? 'dummy.tests+ats-integrations@testgorilla.com',\n } as E2eAccounts;\n\n defineRequiredSecret(accounts, 'password', env.E2E_PASSWORD ?? env.e2e_password, 'E2E_PASSWORD');\n defineRequiredSecret(\n accounts,\n 'candidatePassword',\n env.E2E_CANDIDATE_PASSWORD,\n 'E2E_CANDIDATE_PASSWORD',\n );\n\n return accounts;\n}\n\nfunction resolveUrls(\n baseURL: string,\n ephemeralPrefix: string | null,\n ephemeralId: string | null,\n): E2eUrls {\n const isEphemeral = !!ephemeralId;\n const ephemeralHost = (service: string) =>\n `https://${ephemeralPrefix}-${ephemeralId}-${service}.dev.testgorilla.com`;\n const isProd = baseURL.includes('app.testgorilla');\n const isDev = baseURL.includes('dev.testgorilla');\n const isLocalhost = baseURL.includes('localhost');\n\n return {\n talentBase: isEphemeral\n ? ephemeralHost('talent')\n : isProd\n ? 'https://talent.testgorilla.com'\n : isDev\n ? 'https://talent-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4100'\n : 'https://talent-staging.testgorilla.com',\n talentAssessment: isEphemeral\n ? ephemeralHost('talent-assessment')\n : isProd\n ? 'https://talent-assessment.testgorilla.com'\n : isDev\n ? 'https://talent-assessment-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4100'\n : 'https://talent-assessment-staging.testgorilla.com',\n talentApi: isEphemeral\n ? ephemeralHost('api-talent')\n : isProd\n ? 'https://api-talent.testgorilla.com'\n : isDev\n ? 'https://api-talent-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4200'\n : 'https://api-talent-staging.testgorilla.com',\n codeRunnerApi: isProd\n ? 'https://cr-v2.testgorilla.com'\n : isDev\n ? 'https://cr-v2-dev.testgorilla.com'\n : 'https://cr-v2-staging.testgorilla.com',\n websiteBase: isProd\n ? 'https://www.testgorilla.com'\n : isDev && !isEphemeral\n ? 'https://website-dev.testgorilla.com'\n : 'https://website-staging.testgorilla.com',\n mailpit: isEphemeral ? ephemeralHost('mailpit') : LOCAL_MAILHOG_URL,\n localstack: isEphemeral ? ephemeralHost('localstack') : null,\n };\n}\n\n/**\n * Resolve the full e2e run configuration from environment variables, using\n * TestGorilla's environment naming conventions (staging default, ephemeral\n * `<prefix>-<id>-<service>` dev deployments, production `app`). CI declares\n * ephemerality explicitly via `E2E_ENVIRONMENT=ephemeral`; unset falls back\n * to baseURL-shape detection (see EPHEMERAL_PREFIX_PATTERN above).\n *\n * Pure with respect to its input: pass a custom env for testing; defaults to\n * `process.env`. Never throws on missing secrets — required credentials\n * (`E2E_PASSWORD`, `E2E_CANDIDATE_PASSWORD`) throw with guidance only when\n * first read. The one eager throw is a declared-ephemeral baseURL that the\n * ephemeral host pattern cannot parse (a CI wiring error).\n */\nexport function resolveTgEnvironment(env: NodeJS.ProcessEnv = process.env): E2eConfig {\n const baseURL = env.baseURL || 'https://staging.testgorilla.com';\n\n const ephemeralMatch = baseURL.match(EPHEMERAL_PREFIX_PATTERN);\n const declaredEnvironment = env.E2E_ENVIRONMENT?.toLowerCase();\n const isEphemeralEnvironment = declaredEnvironment\n ? declaredEnvironment === 'ephemeral'\n : !!ephemeralMatch;\n if (isEphemeralEnvironment && !ephemeralMatch) {\n // Config error, CI-only by construction (the variable is CI-set): every\n // derived sibling URL would be wrong, so fail fast instead of letting\n // tests fail confusingly against staging fallback hosts.\n throw new Error(\n `[e2e-framework] E2E_ENVIRONMENT=ephemeral but baseURL \"${baseURL}\" does not match ` +\n `<prefix>-<id>-<service>.dev.testgorilla.com — sibling service URLs cannot be derived.`,\n );\n }\n const ephemeralPrefix = isEphemeralEnvironment && ephemeralMatch ? ephemeralMatch[1] : null;\n const ephemeralId = isEphemeralEnvironment && ephemeralMatch ? ephemeralMatch[2] : null;\n\n const environment = baseURL.split('.testgorilla.com')[0].split('https://')[1] || 'staging';\n\n const adminURL =\n env.adminURL ||\n (isEphemeralEnvironment\n ? `https://${ephemeralPrefix}-${ephemeralId}-backend.dev.testgorilla.com`\n : environment === 'app'\n ? `https://new-admin.testgorilla.com`\n : `https://${environment}-new-admin.testgorilla.com`);\n\n const isProd = baseURL.includes('app.testgorilla');\n const isDev = baseURL.includes('dev.testgorilla');\n const isLocalhost = baseURL.includes('localhost');\n\n return {\n baseURL,\n environment,\n isEphemeralEnvironment,\n ephemeralPrefix,\n ephemeralId,\n isLocalEnvironment: env.localEnvironment === 'true' || isEphemeralEnvironment,\n adminURL,\n urls: resolveUrls(baseURL, ephemeralPrefix, ephemeralId),\n emails: {\n signupFrom: isProd\n ? 'hello@testgorilla.com'\n : isLocalhost\n ? 'noreply@example'\n : isDev || isEphemeralEnvironment\n ? 'hello@maildev.testgorilla.com'\n : 'hello@mailstaging.testgorilla.com',\n assessmentsFrom: isProd\n ? 'assessments@testgorilla.com'\n : isLocalhost\n ? 'assessments@example.com'\n : isDev || isEphemeralEnvironment\n ? 'assessments@maildev.testgorilla.com'\n : 'assessments@mailstaging.testgorilla.com',\n },\n accounts: resolveAccounts(env),\n };\n}\n","import * as os from 'os';\nimport { env } from 'process';\n\n/**\n * Run identity for synthetic test data.\n *\n * Every identity the generators mint embeds this id, so any row on the shared\n * (append-only) staging database is attributable to the run that created it —\n * CI or somebody's laptop — and purge jobs can select marked data instead of\n * relying on heuristics (.github/instructions/07-test-data.md).\n *\n * Resolution order:\n * 1. `E2E_RUN_ID` env var (explicit label, e.g. `E2E_RUN_ID=debug-foo`)\n * 2. CI: `ci<hash>` derived from the CircleCI workflow id\n * 3. local: `loc<user><MMDDhhmm>`\n *\n * The computed value is published back to `process.env.E2E_RUN_ID`, so\n * Playwright worker processes (which inherit env from the runner) all agree —\n * the same mechanism the auth-token contract uses. Alphanumeric only, ≤ 16\n * chars, so generated email local-parts stay inside the 64-char limit.\n */\nexport function getRunId(): string {\n if (!env.E2E_RUN_ID) {\n env.E2E_RUN_ID = env.CI ? `ci${shortHash(env.CIRCLE_WORKFLOW_ID ?? '')}` : localRunId();\n }\n return env.E2E_RUN_ID;\n}\n\n/** Deterministic 6-char base-36 hash — enough to tell workflows apart. */\nfunction shortHash(input: string): string {\n let hash = 0;\n for (const char of input) {\n hash = (hash * 31 + char.charCodeAt(0)) >>> 0;\n }\n return hash.toString(36).padStart(6, '0').slice(-6);\n}\n\nfunction localRunId(): string {\n let user = '';\n try {\n user = os\n .userInfo()\n .username.toLowerCase()\n .replace(/[^a-z0-9]/g, '')\n .slice(0, 8);\n } catch {\n // Containers whose uid has no passwd entry throw here; identity\n // generation must never crash a run, so fall back to 'unknown'.\n }\n const now = new Date();\n const pad = (n: number) => String(n).padStart(2, '0');\n const stamp = `${pad(now.getMonth() + 1)}${pad(now.getDate())}${pad(now.getHours())}${pad(\n now.getMinutes(),\n )}`;\n return `loc${user || 'unknown'}${stamp}`;\n}\n","/**\n * Algolia Configuration\n *\n * Test-library search used during assessment creation. The bundled defaults\n * are the same index-restricted, search-only keys the customer frontend ships\n * to browsers (not admin keys); override any of them via the ALGOLIA_* env\n * vars below without a code change (e.g. on key rotation).\n */\n\nimport { baseURL, isEphemeralEnvironment } from './index';\n\nconst ALGOLIA_APP_ID = process.env.ALGOLIA_APP_ID || 'V8Y626J4K8';\n\n// Algolia Index Names\nconst ALGOLIA_PROD_INDEX = process.env.ALGOLIA_PROD_INDEX || 'production_tests_index';\nconst ALGOLIA_STAGING_INDEX = process.env.ALGOLIA_STAGING_INDEX || 'staging_tests_index';\nconst ALGOLIA_EPHEMERAL_INDEX = process.env.ALGOLIA_EPHEMERAL_INDEX || 'ephemeral_tests_index';\n\n// Algolia API Keys (search-only, restricted to the specific indices)\nconst ALGOLIA_PROD_API_KEY =\n process.env.ALGOLIA_PROD_API_KEY ||\n 'NDc2N2JlMmY5ZGE2NzM4NDIwOWM2ODkyMWY0Yjk5YjYyNTA5NTViNDg2YzNlN2VlZDE4MmYyOWE3YmRjNjg1ZXJlc3RyaWN0SW5kaWNlcz1wcm9kdWN0aW9uX3Rlc3RzX2luZGV4';\nconst ALGOLIA_STAGING_API_KEY =\n process.env.ALGOLIA_STAGING_API_KEY ||\n 'ZjZmYWMwYjNkN2IxZjViYzA0OTZkZGE3OWY5MmVjYWMzN2RlYWJlYjcyOWRlMWQ3YjMwM2RjYjk0NDNjZGY0MXJlc3RyaWN0SW5kaWNlcz1zdGFnaW5nX3Rlc3RzX2luZGV4';\nconst ALGOLIA_EPHEMERAL_API_KEY =\n process.env.ALGOLIA_EPHEMERAL_API_KEY || '5beea78e78134e8270214f93b7032e7b';\n\n/**\n * Returns environment-specific Algolia API URL\n */\nexport const getAlgoliaUrl = (): string => {\n const isProduction = baseURL.includes('app.testgorilla');\n\n if (isEphemeralEnvironment) {\n return `https://v8y626j4k8-dsn.algolia.net/1/indexes/${ALGOLIA_EPHEMERAL_INDEX}/query`;\n }\n\n const index = isProduction ? ALGOLIA_PROD_INDEX : ALGOLIA_STAGING_INDEX;\n const domain = isProduction ? 'algolianet.com' : 'algolia.net';\n const subdomain = isProduction ? 'v8y626j4k8-2' : 'v8y626j4k8-dsn';\n\n return `https://${subdomain}.${domain}/1/indexes/${index}/query`;\n};\n\n/**\n * Returns environment-specific Algolia API headers\n */\nexport const getAlgoliaHeaders = (): Record<string, string> => {\n const isProduction = baseURL.includes('app.testgorilla');\n\n let apiKey: string;\n if (isEphemeralEnvironment) {\n apiKey = ALGOLIA_EPHEMERAL_API_KEY;\n } else {\n apiKey = isProduction ? ALGOLIA_PROD_API_KEY : ALGOLIA_STAGING_API_KEY;\n }\n\n return {\n 'content-type': 'application/x-www-form-urlencoded',\n 'x-algolia-api-key': apiKey,\n 'x-algolia-application-id': ALGOLIA_APP_ID,\n };\n};\n","/**\n * Constants & Retries\n *\n * Contains global retry counters and other application constants.\n */\n\nimport { env } from 'process';\n\n// Retry counters - used to determine retry behavior in tests\nexport const DEFAULT_RETRY_COUNTER = 10;\nexport const INCREASED_RETRY_COUNTER_50 = DEFAULT_RETRY_COUNTER * 1.5;\nexport const INCREASED_RETRY_COUNTER_80 = DEFAULT_RETRY_COUNTER * 1.8;\nexport const INCREASED_RETRY_COUNTER_200 = DEFAULT_RETRY_COUNTER * 2;\nexport const INCREASED_RETRY_COUNTER_300 = DEFAULT_RETRY_COUNTER * 3;\n\n// Logger configuration. Default: WARN both in CI and locally — opt in to INFO for milestones\n// or DEBUG for per-request chatter via the LOG_LEVEL env var.\n// API_LOG_LEVEL / API_LOG_FILE are accepted for back-compat with a one-time deprecation note.\nconst rawLogLevel = env.LOG_LEVEL?.toUpperCase() || env.API_LOG_LEVEL?.toUpperCase() || 'WARN';\nif (!env.LOG_LEVEL && env.API_LOG_LEVEL && !env._LOG_DEPRECATION_WARNED) {\n process.stderr.write(\n '[logger] API_LOG_LEVEL is deprecated; use LOG_LEVEL instead (same values).\\n',\n );\n env._LOG_DEPRECATION_WARNED = '1';\n}\nexport const logLevel = rawLogLevel as 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'NONE';\nexport const logFile = env.LOG_FILE || env.API_LOG_FILE || '';\n\n// Back-compat aliases — prefer logLevel / logFile in new code.\nexport const apiLogLevel = logLevel;\nexport const apiLogFile = logFile;\n\n// Assessment configuration — the name→id map published by global setup\n// (process.env.assessments; see @testgorilla/e2e-framework/setup).\nexport const assessmentList = JSON.parse(env.assessments || '{}');\n\n// Other constants\nexport const MAILPIT_SERVER = 'http://localhost:8025';\nexport const simpleAssessmentName = `New Simple Assessment - ${Date.now()}`;\nexport const invitationEmailSubject = 'Your application at TestGorilla';\n\n// Email reception tracking\nexport const emailReception = { slowEmailAPI: false };\n","import { isEphemeralEnvironment } from './index';\n\n/**\n * Supplies the backend's recaptcha bypass key for a given backend environment\n * name (e.g. 'staging', 'dev', 'app'). tgo-qa-automation registers an AWS\n * SSM-backed provider; other consumers typically rely on the env vars alone.\n */\nexport type RecaptchaKeyProvider = (\n backendEnvironment: string,\n) => Promise<string | null | undefined>;\n\nlet keyProvider: RecaptchaKeyProvider | undefined;\n\n/**\n * Registers a fallback source for the recaptcha bypass key, consulted only\n * when the RECAPTCHA_BYPASS_KEY / RECAPTCHA_BYPASS_KEY_STAGE env vars are\n * unset. The framework itself ships no AWS/SSM dependency — the consumer\n * decides where keys come from.\n */\nexport function setRecaptchaBypassKeyProvider(provider: RecaptchaKeyProvider): void {\n keyProvider = provider;\n}\n\n/**\n * Resolves the recaptcha bypass key with the historical precedence:\n * env var (RECAPTCHA_BYPASS_KEY_STAGE on ephemeral envs, RECAPTCHA_BYPASS_KEY\n * otherwise) → registered provider → the literal 'Not Set' (requests then\n * proceed without a working bypass, matching previous behavior).\n */\nexport async function getRecaptchaBypassKey(backendEnvironment: string): Promise<string> {\n const fromEnv = isEphemeralEnvironment\n ? process.env.RECAPTCHA_BYPASS_KEY_STAGE\n : process.env.RECAPTCHA_BYPASS_KEY;\n if (fromEnv) {\n return fromEnv;\n }\n const fromProvider = keyProvider ? await keyProvider(backendEnvironment) : undefined;\n return fromProvider || 'Not Set';\n}\n","/**\n * Random test-data generators (names, phrases, cities, alphanumerics).\n *\n * Replaces the suite's former @faker-js/faker usage (~28 MB installed) with\n * small curated pools — e2e tests only need plausible-looking values, not\n * locale-aware realism. None of these guarantee uniqueness; call sites that\n * need unique values append `Date.now()` (as they always have).\n */\n\nconst FIRST_NAMES = [\n 'Alice',\n 'Bruno',\n 'Carmen',\n 'Diego',\n 'Elena',\n 'Felix',\n 'Greta',\n 'Hugo',\n 'Irene',\n 'Jonas',\n 'Katia',\n 'Liam',\n 'Marta',\n 'Nadia',\n 'Oscar',\n 'Paula',\n 'Quentin',\n 'Rosa',\n 'Sofia',\n 'Tomas',\n 'Ursula',\n 'Victor',\n 'Wanda',\n 'Xavier',\n 'Yara',\n 'Zoe',\n 'Andre',\n 'Bianca',\n 'Cesar',\n 'Dora',\n];\n\nconst LAST_NAMES = [\n 'Almeida',\n 'Bauer',\n 'Castro',\n 'Dubois',\n 'Eriksen',\n 'Fischer',\n 'Garcia',\n 'Hansen',\n 'Ibrahim',\n 'Jansen',\n 'Keller',\n 'Lopez',\n 'Meyer',\n 'Novak',\n 'Olsen',\n 'Peeters',\n 'Quinn',\n 'Rossi',\n 'Schmidt',\n 'Torres',\n 'Ueda',\n 'Vargas',\n 'Weber',\n 'Xu',\n 'Yilmaz',\n 'Zhang',\n];\n\nconst JOB_TITLE_AREAS = [\n 'Marketing',\n 'Product',\n 'Operations',\n 'Finance',\n 'Support',\n 'Engineering',\n 'Design',\n 'Sales',\n 'Research',\n 'Quality',\n];\nconst JOB_TITLE_ROLES = [\n 'Manager',\n 'Specialist',\n 'Analyst',\n 'Coordinator',\n 'Engineer',\n 'Consultant',\n 'Associate',\n 'Director',\n 'Assistant',\n 'Lead',\n];\n\nconst PHRASE_VERBS = [\n 'streamline',\n 'orchestrate',\n 'benchmark',\n 'optimize',\n 'aggregate',\n 'harness',\n 'incentivize',\n 'synthesize',\n 'iterate',\n 'scale',\n];\nconst PHRASE_ADJECTIVES = [\n 'scalable',\n 'seamless',\n 'dynamic',\n 'proactive',\n 'granular',\n 'robust',\n 'frictionless',\n 'holistic',\n 'intuitive',\n 'compelling',\n];\nconst PHRASE_NOUNS = [\n 'workflows',\n 'channels',\n 'metrics',\n 'platforms',\n 'roadmaps',\n 'pipelines',\n 'paradigms',\n 'synergies',\n 'deliverables',\n 'interfaces',\n];\n\nconst CITIES = [\n 'Amsterdam',\n 'Barcelona',\n 'Copenhagen',\n 'Dublin',\n 'Edinburgh',\n 'Florence',\n 'Geneva',\n 'Hamburg',\n 'Istanbul',\n 'Jakarta',\n 'Krakow',\n 'Lisbon',\n 'Madrid',\n 'Nairobi',\n 'Oslo',\n 'Porto',\n 'Quito',\n 'Rotterdam',\n 'Seville',\n 'Tallinn',\n];\n\nconst WORDS = [\n 'amber',\n 'breeze',\n 'cedar',\n 'delta',\n 'ember',\n 'fjord',\n 'garnet',\n 'harbor',\n 'indigo',\n 'juniper',\n 'karma',\n 'lagoon',\n 'meadow',\n 'nectar',\n 'onyx',\n 'prairie',\n 'quartz',\n 'ripple',\n 'summit',\n 'tundra',\n];\n\nconst ALPHANUMERIC = 'abcdefghijklmnopqrstuvwxyz0123456789';\n\nconst pick = <T>(pool: readonly T[]): T => pool[Math.floor(Math.random() * pool.length)];\n\n/** Random plausible first name (ASCII, form-validation safe). */\nexport const randomFirstName = (): string => pick(FIRST_NAMES);\n\n/** Random plausible last name (ASCII, form-validation safe). */\nexport const randomLastName = (): string => pick(LAST_NAMES);\n\n/** Random \"First Last\" full name. */\nexport const randomFullName = (): string => `${randomFirstName()} ${randomLastName()}`;\n\n/** Random plausible job title, e.g. \"Product Analyst\". */\nexport const randomJobTitle = (): string => `${pick(JOB_TITLE_AREAS)} ${pick(JOB_TITLE_ROLES)}`;\n\n/**\n * Random buzzword phrase, e.g. \"streamline scalable workflows\". Used as a\n * readable label for generated tests/assessments; append `Date.now()` when\n * the value must be unique.\n */\nexport const randomPhrase = (): string =>\n `${pick(PHRASE_VERBS)} ${pick(PHRASE_ADJECTIVES)} ${pick(PHRASE_NOUNS)}`;\n\n/** Random space-separated words from a small neutral pool. */\nexport const randomWords = (count = 2): string =>\n Array.from({ length: count }, () => pick(WORDS)).join(' ');\n\n/** Random lowercase alphanumeric string of the given length. */\nexport const randomAlphaNumeric = (length = 1): string =>\n Array.from({ length }, () => ALPHANUMERIC[Math.floor(Math.random() * ALPHANUMERIC.length)]).join(\n '',\n );\n\n/** Random city name. */\nexport const randomCity = (): string => pick(CITIES);\n\n/** Random integer between min and max, both inclusive. */\nexport const randomNumber = (min: number, max: number): number =>\n Math.floor(Math.random() * (max - min + 1)) + min;\n\n// --- username/phone utilities (formerly the suite's helpers/usernameUtils) ---\n\n/** Strips spaces from a phone number string. */\nexport function convertPhoneNumberToString(phone: string) {\n return phone.replaceAll(' ', '');\n}\n\n/** Random Spanish mobile number (9 digits starting with 6). */\nexport function generateRandomSpanishPhone(): string {\n const eightLastDigits: number = Math.floor(Math.random() * 90000000);\n return (600000000 + eightLastDigits).toString();\n}\n\n/** Random plausible first name — kept for compatibility with the historical helper name. */\nexport function randomizeName(): string {\n return randomFirstName();\n}\n\n/**\n * Appends an epoch-timestamp suffix to the local part of an email address,\n * producing a unique username while keeping the original domain.\n */\nexport function randomizeUsername(email: string): string {\n const [username, domain] = email.split('@');\n const epochTimestamp = Math.floor(Date.now() / 1000);\n const newUsername = `${username}+${epochTimestamp}`;\n return `${newUsername}@${domain}`;\n}\n"],"mappings":"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","names":["env","accounts","baseURL","ephemeralPrefix","ephemeralId","isEphemeralEnvironment","environment","adminURL","import_process","email"]}

@@ -1,3 +0,3 @@

import { E as E2eConfig, a as E2eAccounts } from './types-DXyBL4wj.mjs';
export { b as E2eUrls } from './types-DXyBL4wj.mjs';
import { E as E2eConfig, a as E2eAccounts } from './types-fOfzSmvR.mjs';
export { b as E2eUrls } from './types-fOfzSmvR.mjs';

@@ -27,3 +27,5 @@ /**

* TestGorilla's environment naming conventions (staging default, ephemeral
* `backend-<id>` / `talent-api-<id>` dev deployments, production `app`).
* `<prefix>-<id>-<service>` dev deployments, production `app`). CI declares
* ephemerality explicitly via `E2E_ENVIRONMENT=ephemeral`; unset falls back
* to baseURL-shape detection (see EPHEMERAL_PREFIX_PATTERN above).
*

@@ -33,3 +35,4 @@ * Pure with respect to its input: pass a custom env for testing; defaults to

* (`E2E_PASSWORD`, `E2E_CANDIDATE_PASSWORD`) throw with guidance only when
* first read.
* first read. The one eager throw is a declared-ephemeral baseURL that the
* ephemeral host pattern cannot parse (a CI wiring error).
*/

@@ -143,3 +146,3 @@ declare function resolveTgEnvironment(env?: NodeJS.ProcessEnv): E2eConfig;

declare const isEphemeralEnvironment: boolean;
declare const ephemeralPrefix: "backend" | "talent-api";
declare const ephemeralPrefix: string;
declare const ephemeralId: string;

@@ -146,0 +149,0 @@ declare const isLocalEnvironment: boolean;

@@ -1,3 +0,3 @@

import { E as E2eConfig, a as E2eAccounts } from './types-DXyBL4wj.js';
export { b as E2eUrls } from './types-DXyBL4wj.js';
import { E as E2eConfig, a as E2eAccounts } from './types-fOfzSmvR.js';
export { b as E2eUrls } from './types-fOfzSmvR.js';

@@ -27,3 +27,5 @@ /**

* TestGorilla's environment naming conventions (staging default, ephemeral
* `backend-<id>` / `talent-api-<id>` dev deployments, production `app`).
* `<prefix>-<id>-<service>` dev deployments, production `app`). CI declares
* ephemerality explicitly via `E2E_ENVIRONMENT=ephemeral`; unset falls back
* to baseURL-shape detection (see EPHEMERAL_PREFIX_PATTERN above).
*

@@ -33,3 +35,4 @@ * Pure with respect to its input: pass a custom env for testing; defaults to

* (`E2E_PASSWORD`, `E2E_CANDIDATE_PASSWORD`) throw with guidance only when
* first read.
* first read. The one eager throw is a declared-ephemeral baseURL that the
* ephemeral host pattern cannot parse (a CI wiring error).
*/

@@ -143,3 +146,3 @@ declare function resolveTgEnvironment(env?: NodeJS.ProcessEnv): E2eConfig;

declare const isEphemeralEnvironment: boolean;
declare const ephemeralPrefix: "backend" | "talent-api";
declare const ephemeralPrefix: string;
declare const ephemeralId: string;

@@ -146,0 +149,0 @@ declare const isLocalEnvironment: boolean;

@@ -88,3 +88,3 @@ import {

websiteBaseURL
} from "./chunk-DW4V5VUB.mjs";
} from "./chunk-TJHUXULD.mjs";
export {

@@ -91,0 +91,0 @@ CandidateInviteAssessment,

@@ -373,3 +373,3 @@ var __create = Object.create;

// src/config/resolve.ts
var EPHEMERAL_PREFIX_PATTERN = /https?:\/\/(backend|talent-api)-(\d+)-[^.]+\.dev\.testgorilla\.com/;
var EPHEMERAL_PREFIX_PATTERN = /https?:\/\/(.+?)-(\d+)-[^.]+\.dev\.testgorilla\.com/;
var LOCAL_MAILHOG_URL = "http://localhost:8025";

@@ -437,5 +437,11 @@ function defineRequiredSecret(target, property, value, envVar) {

const ephemeralMatch = baseURL2.match(EPHEMERAL_PREFIX_PATTERN);
const ephemeralPrefix2 = ephemeralMatch ? ephemeralMatch[1] : null;
const ephemeralId2 = ephemeralMatch ? ephemeralMatch[2] : null;
const isEphemeralEnvironment2 = !!ephemeralId2;
const declaredEnvironment = env2.E2E_ENVIRONMENT?.toLowerCase();
const isEphemeralEnvironment2 = declaredEnvironment ? declaredEnvironment === "ephemeral" : !!ephemeralMatch;
if (isEphemeralEnvironment2 && !ephemeralMatch) {
throw new Error(
`[e2e-framework] E2E_ENVIRONMENT=ephemeral but baseURL "${baseURL2}" does not match <prefix>-<id>-<service>.dev.testgorilla.com \u2014 sibling service URLs cannot be derived.`
);
}
const ephemeralPrefix2 = isEphemeralEnvironment2 && ephemeralMatch ? ephemeralMatch[1] : null;
const ephemeralId2 = isEphemeralEnvironment2 && ephemeralMatch ? ephemeralMatch[2] : null;
const environment2 = baseURL2.split(".testgorilla.com")[0].split("https://")[1] || "staging";

@@ -442,0 +448,0 @@ const adminURL2 = env2.adminURL || (isEphemeralEnvironment2 ? `https://${ephemeralPrefix2}-${ephemeralId2}-backend.dev.testgorilla.com` : environment2 === "app" ? `https://new-admin.testgorilla.com` : `https://${environment2}-new-admin.testgorilla.com`);

import { S as SessionArtifactStore } from './sessionStore-CzL5wGod.mjs';
export { A as APILogger, L as LogLevel, a as Logger, g as getAPILogger, l as log, r as resetAPILogger } from './sessionStore-CzL5wGod.mjs';
import { Page, TestType, PlaywrightTestArgs, PlaywrightTestOptions, PlaywrightWorkerArgs, PlaywrightWorkerOptions, Expect, ConsoleMessage, Locator, Response } from '@playwright/test';
import { E as E2eConfig } from './types-DXyBL4wj.mjs';
import { E as E2eConfig } from './types-fOfzSmvR.mjs';
import { S as SubscriptionPlan } from './currentSubscription-C6tVrO3n.mjs';

@@ -6,0 +6,0 @@

import { S as SessionArtifactStore } from './sessionStore-CzL5wGod.js';
export { A as APILogger, L as LogLevel, a as Logger, g as getAPILogger, l as log, r as resetAPILogger } from './sessionStore-CzL5wGod.js';
import { Page, TestType, PlaywrightTestArgs, PlaywrightTestOptions, PlaywrightWorkerArgs, PlaywrightWorkerOptions, Expect, ConsoleMessage, Locator, Response } from '@playwright/test';
import { E as E2eConfig } from './types-DXyBL4wj.js';
import { E as E2eConfig } from './types-fOfzSmvR.js';
import { S as SubscriptionPlan } from './currentSubscription-C6tVrO3n.js';

@@ -6,0 +6,0 @@

import {
CurrentSubscription
} from "./chunk-37W5EZF5.mjs";
} from "./chunk-WEZDVQDT.mjs";
import {

@@ -23,3 +23,3 @@ defaultSessionStore

resolveTgEnvironment
} from "./chunk-DW4V5VUB.mjs";
} from "./chunk-TJHUXULD.mjs";

@@ -26,0 +26,0 @@ // src/core/monitoring/consoleMonitor.config.ts

@@ -67,3 +67,3 @@ var __create = Object.create;

// src/config/resolve.ts
var EPHEMERAL_PREFIX_PATTERN = /https?:\/\/(backend|talent-api)-(\d+)-[^.]+\.dev\.testgorilla\.com/;
var EPHEMERAL_PREFIX_PATTERN = /https?:\/\/(.+?)-(\d+)-[^.]+\.dev\.testgorilla\.com/;
var LOCAL_MAILHOG_URL = "http://localhost:8025";

@@ -131,5 +131,11 @@ function defineRequiredSecret(target, property, value, envVar) {

const ephemeralMatch = baseURL2.match(EPHEMERAL_PREFIX_PATTERN);
const ephemeralPrefix2 = ephemeralMatch ? ephemeralMatch[1] : null;
const ephemeralId2 = ephemeralMatch ? ephemeralMatch[2] : null;
const isEphemeralEnvironment2 = !!ephemeralId2;
const declaredEnvironment = env3.E2E_ENVIRONMENT?.toLowerCase();
const isEphemeralEnvironment2 = declaredEnvironment ? declaredEnvironment === "ephemeral" : !!ephemeralMatch;
if (isEphemeralEnvironment2 && !ephemeralMatch) {
throw new Error(
`[e2e-framework] E2E_ENVIRONMENT=ephemeral but baseURL "${baseURL2}" does not match <prefix>-<id>-<service>.dev.testgorilla.com \u2014 sibling service URLs cannot be derived.`
);
}
const ephemeralPrefix2 = isEphemeralEnvironment2 && ephemeralMatch ? ephemeralMatch[1] : null;
const ephemeralId2 = isEphemeralEnvironment2 && ephemeralMatch ? ephemeralMatch[2] : null;
const environment2 = baseURL2.split(".testgorilla.com")[0].split("https://")[1] || "staging";

@@ -136,0 +142,0 @@ const adminURL2 = env3.adminURL || (isEphemeralEnvironment2 ? `https://${ephemeralPrefix2}-${ephemeralId2}-backend.dev.testgorilla.com` : environment2 === "app" ? `https://new-admin.testgorilla.com` : `https://${environment2}-new-admin.testgorilla.com`);

@@ -15,3 +15,3 @@ import {

mailpitURL
} from "./chunk-DW4V5VUB.mjs";
} from "./chunk-TJHUXULD.mjs";

@@ -18,0 +18,0 @@ // src/email/email.ts

@@ -89,3 +89,3 @@ var __defProp = Object.defineProperty;

// src/config/resolve.ts
var EPHEMERAL_PREFIX_PATTERN = /https?:\/\/(backend|talent-api)-(\d+)-[^.]+\.dev\.testgorilla\.com/;
var EPHEMERAL_PREFIX_PATTERN = /https?:\/\/(.+?)-(\d+)-[^.]+\.dev\.testgorilla\.com/;
var LOCAL_MAILHOG_URL = "http://localhost:8025";

@@ -153,5 +153,11 @@ function defineRequiredSecret(target, property, value, envVar) {

const ephemeralMatch = baseURL2.match(EPHEMERAL_PREFIX_PATTERN);
const ephemeralPrefix2 = ephemeralMatch ? ephemeralMatch[1] : null;
const ephemeralId2 = ephemeralMatch ? ephemeralMatch[2] : null;
const isEphemeralEnvironment2 = !!ephemeralId2;
const declaredEnvironment = env2.E2E_ENVIRONMENT?.toLowerCase();
const isEphemeralEnvironment2 = declaredEnvironment ? declaredEnvironment === "ephemeral" : !!ephemeralMatch;
if (isEphemeralEnvironment2 && !ephemeralMatch) {
throw new Error(
`[e2e-framework] E2E_ENVIRONMENT=ephemeral but baseURL "${baseURL2}" does not match <prefix>-<id>-<service>.dev.testgorilla.com \u2014 sibling service URLs cannot be derived.`
);
}
const ephemeralPrefix2 = isEphemeralEnvironment2 && ephemeralMatch ? ephemeralMatch[1] : null;
const ephemeralId2 = isEphemeralEnvironment2 && ephemeralMatch ? ephemeralMatch[2] : null;
const environment2 = baseURL2.split(".testgorilla.com")[0].split("https://")[1] || "staging";

@@ -158,0 +164,0 @@ const adminURL2 = env2.adminURL || (isEphemeralEnvironment2 ? `https://${ephemeralPrefix2}-${ephemeralId2}-backend.dev.testgorilla.com` : environment2 === "app" ? `https://new-admin.testgorilla.com` : `https://${environment2}-new-admin.testgorilla.com`);

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/enums/index.ts","../src/config/resolve.ts","../src/config/algolia.ts","../src/config/constants.ts","../src/config/index.ts","../src/enums/tests.ts","../src/enums/ui.ts","../src/enums/candidates.ts","../src/enums/integrations.ts","../src/enums/customQuestions.ts","../src/enums/locations.ts","../src/enums/company.ts","../src/enums/languages.ts","../src/enums/evaluationTools.ts"],"sourcesContent":["// Re-export all enums from domain-specific modules\nexport * from './tests';\nexport * from './ui';\nexport * from './candidates';\nexport * from './integrations';\nexport * from './customQuestions';\nexport * from './locations';\nexport * from './company';\nexport * from './languages';\nexport * from './evaluationTools';\n","import type { E2eAccounts, E2eConfig, E2eUrls } from './types';\n\n/**\n * Ephemeral environment detection.\n * Supported prefixes:\n * - `backend` → backend-led deployments (e.g. https://backend-1234-talent.dev.testgorilla.com)\n * - `talent-api` → Talent-app-led deployments (e.g. https://talent-api-1756-talent.dev.testgorilla.com)\n * Add a new alternative to the regex if/when another deployment prefix is introduced.\n */\nconst EPHEMERAL_PREFIX_PATTERN =\n /https?:\\/\\/(backend|talent-api)-(\\d+)-[^.]+\\.dev\\.testgorilla\\.com/;\n\nconst LOCAL_MAILHOG_URL = 'http://localhost:8025';\n\n/**\n * Build a lazily-throwing secret accessor: the property reads as a normal\n * string when the env var is set, and throws with setup guidance the first\n * time it is READ while unset. Importing the config never throws.\n *\n * Non-enumerable so JSON-serializing an E2eConfig (e.g. passing it through\n * `test.use` in playwright.config, which serializes options to workers) can\n * neither leak the credential nor trip the missing-env error.\n */\nfunction defineRequiredSecret(\n target: object,\n property: string,\n value: string | undefined,\n envVar: string,\n): void {\n Object.defineProperty(target, property, {\n enumerable: false,\n configurable: true,\n get(): string {\n if (value === undefined || value === '') {\n throw new Error(\n `[e2e-framework] ${envVar} is not set. The framework ships no credential defaults — ` +\n `export ${envVar} (see your team's 1Password e2e .env entry) before running tests.`,\n );\n }\n return value;\n },\n });\n}\n\nfunction resolveAccounts(env: NodeJS.ProcessEnv): E2eAccounts {\n const nodeIndexedOrganizer = env.CIRCLE_NODE_TOTAL\n ? `dummy.tests+organizer${env.CIRCLE_NODE_INDEX}@testgorilla.com`\n : `dummy.tests+organizer11@testgorilla.com`;\n const accountIndex = env.E2E_ACCOUNT_INDEX;\n\n const accounts = {\n organizerEmail:\n env.userEmail ??\n (accountIndex !== undefined\n ? `dummy.tests+organizer${accountIndex}@testgorilla.com`\n : nodeIndexedOrganizer),\n candidateEmail: env.candidateEmail ?? 'dummy.tests@testgorilla.com',\n hiringManagerEmail: env.hiringManagerEmail ?? 'dummy.tests+hiringmanager01@testgorilla.com',\n recruiterEmail: env.recruiterEmail ?? 'dummy.tests+recruiter1@testgorilla.com',\n adminEmail: env.adminEmail ?? 'dummy.tests+admin1@testgorilla.com',\n newAdminEmail: env.newAdminEmail ?? 'dummy.tests+newadmin@testgorilla.com',\n freeUserEmail: env.freeUserEmail ?? 'dummy.tests+free0@testgorilla.com',\n corePlanUserEmail: env.corePlanUserEmail ?? 'dummy.tests+coreplan@testgorilla.com',\n plusPlanUserEmail: env.plusPlanUserEmail ?? 'dummy.tests+plus@testgorilla.com',\n proPlanUserEmail: env.proPlanUserEmail ?? 'dummy.tests+pro@testgorilla.com',\n businessPlanUserEmail: env.businessPlanUserEmail ?? 'dummy.tests+business@testgorilla.com',\n starterPlanUserEmail: env.starterPlanUserEmail ?? 'dummy.tests+starter@testgorilla.com',\n myProfileUserEmail: env.myProfileUserEmail ?? 'dummy.tests+myprofile@testgorilla.com',\n atsIntegrationsEmail:\n env.atsIntegrationsEmail ?? 'dummy.tests+ats-integrations@testgorilla.com',\n } as E2eAccounts;\n\n defineRequiredSecret(accounts, 'password', env.E2E_PASSWORD ?? env.e2e_password, 'E2E_PASSWORD');\n defineRequiredSecret(\n accounts,\n 'candidatePassword',\n env.E2E_CANDIDATE_PASSWORD,\n 'E2E_CANDIDATE_PASSWORD',\n );\n\n return accounts;\n}\n\nfunction resolveUrls(\n baseURL: string,\n ephemeralPrefix: string | null,\n ephemeralId: string | null,\n): E2eUrls {\n const isEphemeral = !!ephemeralId;\n const ephemeralHost = (service: string) =>\n `https://${ephemeralPrefix}-${ephemeralId}-${service}.dev.testgorilla.com`;\n const isProd = baseURL.includes('app.testgorilla');\n const isDev = baseURL.includes('dev.testgorilla');\n const isLocalhost = baseURL.includes('localhost');\n\n return {\n talentBase: isEphemeral\n ? ephemeralHost('talent')\n : isProd\n ? 'https://talent.testgorilla.com'\n : isDev\n ? 'https://talent-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4100'\n : 'https://talent-staging.testgorilla.com',\n talentAssessment: isEphemeral\n ? ephemeralHost('talent-assessment')\n : isProd\n ? 'https://talent-assessment.testgorilla.com'\n : isDev\n ? 'https://talent-assessment-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4100'\n : 'https://talent-assessment-staging.testgorilla.com',\n talentApi: isEphemeral\n ? ephemeralHost('api-talent')\n : isProd\n ? 'https://api-talent.testgorilla.com'\n : isDev\n ? 'https://api-talent-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4200'\n : 'https://api-talent-staging.testgorilla.com',\n codeRunnerApi: isProd\n ? 'https://cr-v2.testgorilla.com'\n : isDev\n ? 'https://cr-v2-dev.testgorilla.com'\n : 'https://cr-v2-staging.testgorilla.com',\n websiteBase: isProd\n ? 'https://www.testgorilla.com'\n : isDev && !isEphemeral\n ? 'https://website-dev.testgorilla.com'\n : 'https://website-staging.testgorilla.com',\n mailpit: isEphemeral ? ephemeralHost('mailpit') : LOCAL_MAILHOG_URL,\n localstack: isEphemeral ? ephemeralHost('localstack') : null,\n };\n}\n\n/**\n * Resolve the full e2e run configuration from environment variables, using\n * TestGorilla's environment naming conventions (staging default, ephemeral\n * `backend-<id>` / `talent-api-<id>` dev deployments, production `app`).\n *\n * Pure with respect to its input: pass a custom env for testing; defaults to\n * `process.env`. Never throws on missing secrets — required credentials\n * (`E2E_PASSWORD`, `E2E_CANDIDATE_PASSWORD`) throw with guidance only when\n * first read.\n */\nexport function resolveTgEnvironment(env: NodeJS.ProcessEnv = process.env): E2eConfig {\n const baseURL = env.baseURL || 'https://staging.testgorilla.com';\n\n const ephemeralMatch = baseURL.match(EPHEMERAL_PREFIX_PATTERN);\n const ephemeralPrefix = (ephemeralMatch ? ephemeralMatch[1] : null) as\n | 'backend'\n | 'talent-api'\n | null;\n const ephemeralId = ephemeralMatch ? ephemeralMatch[2] : null;\n const isEphemeralEnvironment = !!ephemeralId;\n\n const environment = baseURL.split('.testgorilla.com')[0].split('https://')[1] || 'staging';\n\n const adminURL =\n env.adminURL ||\n (isEphemeralEnvironment\n ? `https://${ephemeralPrefix}-${ephemeralId}-backend.dev.testgorilla.com`\n : environment === 'app'\n ? `https://new-admin.testgorilla.com`\n : `https://${environment}-new-admin.testgorilla.com`);\n\n const isProd = baseURL.includes('app.testgorilla');\n const isDev = baseURL.includes('dev.testgorilla');\n const isLocalhost = baseURL.includes('localhost');\n\n return {\n baseURL,\n environment,\n isEphemeralEnvironment,\n ephemeralPrefix,\n ephemeralId,\n isLocalEnvironment: env.localEnvironment === 'true' || isEphemeralEnvironment,\n adminURL,\n urls: resolveUrls(baseURL, ephemeralPrefix, ephemeralId),\n emails: {\n signupFrom: isProd\n ? 'hello@testgorilla.com'\n : isLocalhost\n ? 'noreply@example'\n : isDev || isEphemeralEnvironment\n ? 'hello@maildev.testgorilla.com'\n : 'hello@mailstaging.testgorilla.com',\n assessmentsFrom: isProd\n ? 'assessments@testgorilla.com'\n : isLocalhost\n ? 'assessments@example.com'\n : isDev || isEphemeralEnvironment\n ? 'assessments@maildev.testgorilla.com'\n : 'assessments@mailstaging.testgorilla.com',\n },\n accounts: resolveAccounts(env),\n };\n}\n","/**\n * Algolia Configuration\n *\n * Test-library search used during assessment creation. The bundled defaults\n * are the same index-restricted, search-only keys the customer frontend ships\n * to browsers (not admin keys); override any of them via the ALGOLIA_* env\n * vars below without a code change (e.g. on key rotation).\n */\n\nimport { baseURL, isEphemeralEnvironment } from './index';\n\nconst ALGOLIA_APP_ID = process.env.ALGOLIA_APP_ID || 'V8Y626J4K8';\n\n// Algolia Index Names\nconst ALGOLIA_PROD_INDEX = process.env.ALGOLIA_PROD_INDEX || 'production_tests_index';\nconst ALGOLIA_STAGING_INDEX = process.env.ALGOLIA_STAGING_INDEX || 'staging_tests_index';\nconst ALGOLIA_EPHEMERAL_INDEX = process.env.ALGOLIA_EPHEMERAL_INDEX || 'ephemeral_tests_index';\n\n// Algolia API Keys (search-only, restricted to the specific indices)\nconst ALGOLIA_PROD_API_KEY =\n process.env.ALGOLIA_PROD_API_KEY ||\n 'NDc2N2JlMmY5ZGE2NzM4NDIwOWM2ODkyMWY0Yjk5YjYyNTA5NTViNDg2YzNlN2VlZDE4MmYyOWE3YmRjNjg1ZXJlc3RyaWN0SW5kaWNlcz1wcm9kdWN0aW9uX3Rlc3RzX2luZGV4';\nconst ALGOLIA_STAGING_API_KEY =\n process.env.ALGOLIA_STAGING_API_KEY ||\n 'ZjZmYWMwYjNkN2IxZjViYzA0OTZkZGE3OWY5MmVjYWMzN2RlYWJlYjcyOWRlMWQ3YjMwM2RjYjk0NDNjZGY0MXJlc3RyaWN0SW5kaWNlcz1zdGFnaW5nX3Rlc3RzX2luZGV4';\nconst ALGOLIA_EPHEMERAL_API_KEY =\n process.env.ALGOLIA_EPHEMERAL_API_KEY || '5beea78e78134e8270214f93b7032e7b';\n\n/**\n * Returns environment-specific Algolia API URL\n */\nexport const getAlgoliaUrl = (): string => {\n const isProduction = baseURL.includes('app.testgorilla');\n\n if (isEphemeralEnvironment) {\n return `https://v8y626j4k8-dsn.algolia.net/1/indexes/${ALGOLIA_EPHEMERAL_INDEX}/query`;\n }\n\n const index = isProduction ? ALGOLIA_PROD_INDEX : ALGOLIA_STAGING_INDEX;\n const domain = isProduction ? 'algolianet.com' : 'algolia.net';\n const subdomain = isProduction ? 'v8y626j4k8-2' : 'v8y626j4k8-dsn';\n\n return `https://${subdomain}.${domain}/1/indexes/${index}/query`;\n};\n\n/**\n * Returns environment-specific Algolia API headers\n */\nexport const getAlgoliaHeaders = (): Record<string, string> => {\n const isProduction = baseURL.includes('app.testgorilla');\n\n let apiKey: string;\n if (isEphemeralEnvironment) {\n apiKey = ALGOLIA_EPHEMERAL_API_KEY;\n } else {\n apiKey = isProduction ? ALGOLIA_PROD_API_KEY : ALGOLIA_STAGING_API_KEY;\n }\n\n return {\n 'content-type': 'application/x-www-form-urlencoded',\n 'x-algolia-api-key': apiKey,\n 'x-algolia-application-id': ALGOLIA_APP_ID,\n };\n};\n","/**\n * Constants & Retries\n *\n * Contains global retry counters and other application constants.\n */\n\nimport { env } from 'process';\n\n// Retry counters - used to determine retry behavior in tests\nexport const DEFAULT_RETRY_COUNTER = 10;\nexport const INCREASED_RETRY_COUNTER_50 = DEFAULT_RETRY_COUNTER * 1.5;\nexport const INCREASED_RETRY_COUNTER_80 = DEFAULT_RETRY_COUNTER * 1.8;\nexport const INCREASED_RETRY_COUNTER_200 = DEFAULT_RETRY_COUNTER * 2;\nexport const INCREASED_RETRY_COUNTER_300 = DEFAULT_RETRY_COUNTER * 3;\n\n// Logger configuration. Default: WARN both in CI and locally — opt in to INFO for milestones\n// or DEBUG for per-request chatter via the LOG_LEVEL env var.\n// API_LOG_LEVEL / API_LOG_FILE are accepted for back-compat with a one-time deprecation note.\nconst rawLogLevel = env.LOG_LEVEL?.toUpperCase() || env.API_LOG_LEVEL?.toUpperCase() || 'WARN';\nif (!env.LOG_LEVEL && env.API_LOG_LEVEL && !env._LOG_DEPRECATION_WARNED) {\n process.stderr.write(\n '[logger] API_LOG_LEVEL is deprecated; use LOG_LEVEL instead (same values).\\n',\n );\n env._LOG_DEPRECATION_WARNED = '1';\n}\nexport const logLevel = rawLogLevel as 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'NONE';\nexport const logFile = env.LOG_FILE || env.API_LOG_FILE || '';\n\n// Back-compat aliases — prefer logLevel / logFile in new code.\nexport const apiLogLevel = logLevel;\nexport const apiLogFile = logFile;\n\n// Assessment configuration — the name→id map published by global setup\n// (process.env.assessments; see @testgorilla/e2e-framework/setup).\nexport const assessmentList = JSON.parse(env.assessments || '{}');\n\n// Other constants\nexport const MAILPIT_SERVER = 'http://localhost:8025';\nexport const simpleAssessmentName = `New Simple Assessment - ${Date.now()}`;\nexport const invitationEmailSubject = 'Your application at TestGorilla';\n\n// Email reception tracking\nexport const emailReception = { slowEmailAPI: false };\n","/**\n * Compatibility surface over {@link resolveTgEnvironment}.\n *\n * Every export here preserves the NAME and SHAPE (const vs function) of the\n * corresponding export in tgo-qa-automation's `helpers/config`, so consumers\n * migrate with a module-specifier-only import rewrite. The values come from a\n * single module-load resolution of `process.env` — the same timing the suite\n * relies on today (env is inherited by every Playwright worker process).\n *\n * Credentials ship with NO defaults: `password` is empty when `E2E_PASSWORD`\n * is unset (the structured `accounts.password` accessor throws with guidance\n * instead).\n */\nimport { resolveTgEnvironment } from './resolve';\nimport { getRunId } from './runId';\n\nexport type { E2eAccounts, E2eConfig, E2eUrls } from './types';\nexport { resolveTgEnvironment } from './resolve';\n\nconst cfg = resolveTgEnvironment();\n\n// --- Environment & URLs (parity with helpers/config/environment.ts) ---\n\nexport const baseURL = cfg.baseURL;\nexport const environment = cfg.environment;\nexport const isEphemeralEnvironment = cfg.isEphemeralEnvironment;\nexport const ephemeralPrefix = cfg.ephemeralPrefix;\nexport const ephemeralId = cfg.ephemeralId;\nexport const isLocalEnvironment = cfg.isLocalEnvironment;\nexport const adminURL = cfg.adminURL;\nexport const localMailHogURL = 'http://localhost:8025';\n\n/** Returns environment-specific mailpit (ephemeral) or local MailHog URL. */\nexport const mailpitURL = (): string => cfg.urls.mailpit;\n\n/**\n * Returns the LocalStack URL for the current ephemeral environment, or `null`\n * when not running against one.\n */\nexport const localstackURL = (): string | null => cfg.urls.localstack;\n\n/** Returns environment-specific talent base URL. */\nexport const talentBaseURL = (): string => cfg.urls.talentBase;\n\n/** Returns environment-specific talent assessment URL. */\nexport const talentAssessmentURL = (): string => cfg.urls.talentAssessment;\n\n/** Returns environment-specific talent API URL. */\nexport const talentApiURL = (): string => cfg.urls.talentApi;\n\n/** Returns environment-specific code runner API URL. */\nexport const codeRunnerApiURL = (): string => cfg.urls.codeRunnerApi;\n\n/** Returns environment-specific website base URL. */\nexport const websiteBaseURL = (): string => cfg.urls.websiteBase;\n\n/** Returns environment-specific signup sender address. */\nexport const signupFromEmail = (): string => cfg.emails.signupFrom;\n\n/** Returns environment-specific assessments sender address. */\nexport const assessmentsFromEmail = (): string => cfg.emails.assessmentsFrom;\n\n/** Check if current environment is NOT staging. */\nexport const ifNotStagingRun = (): boolean => !cfg.baseURL.includes('staging.testgorilla');\n\n/**\n * Check if current environment is NEITHER staging NOR an ephemeral dev env.\n * Use this to skip tests that depend on the website → app signup flow.\n */\nexport const ifNotStagingOrEphemeralRun = (): boolean =>\n ifNotStagingRun() && !cfg.isEphemeralEnvironment;\n\n/** Check if current environment is NOT localhost. */\nexport const ifNotLocalhostRun = (): boolean => !cfg.baseURL.includes('localhost');\n\n/**\n * Rewrites a signup URL produced by the marketing website (which always\n * points at app.testgorilla.com) so it targets the current environment.\n */\nexport const rewriteSignupUrlForEnv = (signupUrl: string): string => {\n const targetHost = new URL(cfg.baseURL).host;\n return signupUrl.replace(/app\\.testgorilla\\.com/i, targetHost);\n};\n\n// --- Environment URL constants (parity with helpers/config/environment.ts) ---\n\nexport const prodTesttakerUrlString = 'https://assessment.testgorilla.com';\nexport const prodTASUrlString = 'https://talent-assessment.testgorilla.com';\nexport const stageTesttakerUrlString = 'https://staging-assessment.testgorilla.com';\nexport const stageTASUrlString = 'https://talent-assessment-staging.testgorilla.com';\nexport const devTASUrlString = 'https://talent-assessment-dev.testgorilla.com';\nexport const localTASUrlString = 'http://localhost:4100';\nexport const stagingTASAPIUrl = 'https://api-talent-staging.testgorilla.com';\n\n// --- Seed assessment names (product constants, non-secret) ---\n\nexport const CandidateInviteAssessment = 'Candidate-Invite-Assessment-4-Do-not-archive';\nexport const candidateExpiredAssessment = 'Candidate-Expired-Assessment-1-Do-not-archive';\nexport const candidateArchivedAssessment = 'Candidate-Archived-Assessment-1-Do-not-archive';\nexport const tasSimpleMcqAssessment = 'TAS-MCQ-Assessment';\nexport const tasCustomTestAssessment = 'TAS-Custom-Test-Assessment';\nexport const tasSimpleBulkAssessment = 'TAS-Bulk-Assessment';\n\n// --- Test accounts (parity with helpers/config/testAccounts.ts, secrets stripped) ---\n\n/** Structured account set; `accounts.password` throws with guidance if `E2E_PASSWORD` is unset. */\nexport const accounts = cfg.accounts;\n\n/** Main organizer account email for this run. */\nexport const email = cfg.accounts.organizerEmail;\n\n/**\n * Organizer password from `E2E_PASSWORD` (legacy `e2e_password`). Empty string\n * when unset — the framework ships no credential defaults. Prefer\n * `accounts.password`, which throws with setup guidance instead of silently\n * yielding ''.\n */\nexport const password = process.env.E2E_PASSWORD ?? process.env.e2e_password ?? '';\n\nexport const candidateEmail = cfg.accounts.candidateEmail;\nexport const hiringManagerEmail = cfg.accounts.hiringManagerEmail;\nexport const recruiterEmail = cfg.accounts.recruiterEmail;\nexport const adminEmail = cfg.accounts.adminEmail;\nexport const newAdminEmail = cfg.accounts.newAdminEmail;\nexport const freeUserEmail = cfg.accounts.freeUserEmail;\nexport const corePlanUserEmail = cfg.accounts.corePlanUserEmail;\nexport const plusPlanUserEmail = cfg.accounts.plusPlanUserEmail;\nexport const proPlanUserEmail = cfg.accounts.proPlanUserEmail;\nexport const businessPlanUserEmail = cfg.accounts.businessPlanUserEmail;\nexport const starterPlanUserEmail = cfg.accounts.starterPlanUserEmail;\nexport const myProfileUserEmail = cfg.accounts.myProfileUserEmail;\nexport const atsIntegrationsEmail = cfg.accounts.atsIntegrationsEmail;\n\nconst EMAIL_DOMAIN = '@testgorilla.com';\nconst DUMMY_TESTS_PREFIX = 'dummy.tests';\n\n// Per-process tie-breaker so two mints in the same millisecond never collide.\nlet mintCounter = 0;\n\n/**\n * Unique, run-attributable suffix for generated identities:\n * `<runId>x<epoch36><counter>`. Embedding the run id makes every row on the\n * shared staging DB traceable to the CI workflow or local user that created\n * it, and lets purge jobs select marked data (.github/instructions/07-test-data.md).\n */\nconst mintSuffix = (): string => `${getRunId()}x${Date.now().toString(36)}${mintCounter++}`;\n\n/**\n * Generate a random candidate email.\n * Format: `dummy.tests+cand<rand><runId>x<timestamp>@testgorilla.com`.\n */\nexport const randCandidateEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+cand${rand}${mintSuffix()}${EMAIL_DOMAIN}`;\n\n/**\n * Generate a random customer email.\n * Format: `dummy.tests+cust<rand><runId>x<timestamp>@testgorilla.com`.\n */\nexport const randCustomerEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+cust${rand}${mintSuffix()}${EMAIL_DOMAIN}`;\n\n// --- Algolia, constants, recaptcha (parity with helpers/config) ---\n// Lazily circular: algolia/recaptcha read baseURL/isEphemeralEnvironment from\n// this barrel inside their functions only, never at module load.\n\nexport { getAlgoliaUrl, getAlgoliaHeaders } from './algolia';\nexport * from './constants';\nexport { getRecaptchaBypassKey, setRecaptchaBypassKeyProvider } from './recaptcha';\nexport type { RecaptchaKeyProvider } from './recaptcha';\n\n/**\n * Generate a random team-member email tagged with the current environment.\n * Format: `dummy.tests+t<rand><env>+<runId>x<timestamp>@testgorilla.com`.\n */\nexport const randTeamMemberEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+t${rand}${cfg.environment}+${mintSuffix()}${EMAIL_DOMAIN}`;\n\n// Random test-data generators (faker replacement) + username/phone utilities\nexport * from './randomData';\nexport { getRunId };\n","import { baseURL, isLocalEnvironment } from '../config';\n\nexport enum TestName {\n CultureAdd = 'Culture add',\n Communication = 'Communication',\n Motivation = 'Motivation',\n Disc = 'DISC',\n CustomQuestion = 'Custom questions',\n PHPCoding_stage = 'PHP (coding): object-oriented programming',\n PHPCoding_prod = 'PHP (Coding): Object-Oriented Programming',\n PythonCodingDebugging = 'Coding: Debugging',\n PythonCodingDebugging_prod = 'Python (Coding): Debugging',\n PythonCodingEntryLevel = 'Python (coding): entry-level algorithms',\n AttentionToDetail = 'Attention to Detail (Textual)',\n EnglishProficiency = 'English C1 (Advanced)',\n EnglishIntermediate = 'English (intermediate/B1)',\n RubyOnRails = 'Ruby on Rails',\n JavaScriptCodingEntryLevel = 'JavaScript (Coding): Entry-Level Algorithms',\n TypeScriptCodingEntryLevel = 'TypeScript (coding): entry-level algorithms',\n PhpEntryLevel = 'PHP (coding): intermediate-level algorithms',\n SqliteIntermediate = 'SQLite (coding): intermediate-level querying',\n SQLiteEntryLevel = 'SQLite (coding): entry-level database operations',\n JavaEntryLevel = 'Java (coding): entry-level algorithms',\n CCodingEntryLevel = 'C (coding): entry-level algorithms',\n CPPCodingEntryLevel = 'C++ (coding): entry-level algorithms',\n CHashCodingEntryLevel = 'C# (coding): entry-level algorithms',\n RubyEntryLevel = 'Ruby (coding): entry-level algorithms',\n Ennéagramme = 'Ennéagramme',\n AttentionToDetailVisual = 'Attention to detail (visual)',\n WorkingWithData = 'Working with data',\n ReadingComprehension = 'Reading comprehension',\n TypingSpeedLowerCase = 'Typing Speed (Lowercase Only)',\n TypingSpeedCapitalization = 'Typing Speed (Capitalization and Punctuation)',\n TypingSpeedNumbersOnly = 'Typing Speed (Numbers Only)',\n VerbalReasoning = 'Verbal Reasoning',\n ProblemSolving = 'Problem Solving',\n ProblemSolvingStaging = 'Problem solving',\n Big5 = 'Big 5 (OCEAN)',\n TimeManagement = 'Time Management',\n TimeManagementStaging = 'Time management',\n RubyDebugging = 'Ruby (coding): debugging',\n CodingEntryLevel = 'Coding: Entry-level algorithms',\n Tableau = 'Tableau',\n FollowingInstructions = 'Following instructions',\n UnderstandingInstructions = 'Understanding instructions',\n GoogleSpreadsheetSimulation = 'Google Sheets Spreadsheet Simulation',\n CloudSystemAdministration = 'Cloud System Administration',\n AndroidKotlin = 'Android Development Using Kotlin',\n ActiveListening = 'Active Listening',\n MySQL = 'MySQL',\n SpreadsheetSimulation = 'Spreadsheet Simulation: Google Sheets (Intermediate)',\n UniversalSkillsProfiler = 'Universal Skills Profiler',\n Enneagram = 'Enneagram',\n HTML5 = 'HTML5',\n CriticalThinking = 'Critical thinking',\n HubspotCRM = 'Hubspot CRM',\n Shopify = 'Shopify',\n Laravel = 'Laravel',\n Flutter = 'Flutter',\n IntermediateMath = 'Intermediate Math',\n Zendesk = 'Zendesk CS',\n PurchaseManager = 'Purchase Manager',\n SQLQuerying = 'SQLite (Coding): Intermediate-Level Querying',\n ImmersiveTest = 'Customer Service (Immersive Role-Play)',\n AIResume = 'AI Resume Scoring',\n SoftwareArchitect = 'Software architect',\n AWS = 'AWS',\n}\n\nexport enum ProgrammingLanguages {\n Python = 'Python',\n JavaScript = 'JavaScript',\n TypeScript = 'TypeScript',\n Php = 'PHP',\n Sqlite = 'SQLite',\n Java = 'Java',\n C = 'C',\n CPP = 'C++',\n CHash = 'C#',\n Ruby = 'Ruby',\n}\n\nexport const TestDuration = getTestDuration();\n\nfunction getTestDuration() {\n if (baseURL.includes('app')) {\n return {\n CultureAdd: '10',\n AttentionToDetail: '12',\n AttentionToDetailVisual: '10',\n EnglishProficiency: '10',\n CustomTest: '10',\n PythonCoding: '14',\n };\n } else if (isLocalEnvironment) {\n return {\n CultureAdd: '10',\n AttentionToDetail: '12',\n AttentionToDetailVisual: '10',\n EnglishProficiency: '10',\n CustomTest: '10',\n PythonCoding: '8',\n };\n } else {\n return {\n CultureAdd: '10',\n AttentionToDetail: '10',\n AttentionToDetailVisual: '10',\n EnglishProficiency: '10',\n CustomTest: '10',\n PythonCoding: '14',\n };\n }\n}\n\nexport enum CodingTaskOutput {\n TaskSuccess = 'Code executed successfully',\n TaskFailure = 'Task finished with errors.Traceback (most recent call last):',\n TaskMessage = 'Task',\n EmptyScriptTaskMessage = 'Run tests to check your code',\n}\n\nexport enum PersonalityAndCultureTestName {\n CultureAddSurvey = 'Culture add survey',\n MotivationTestSurvey = 'Motivation test survey',\n}\n\nexport enum TestKeyWord {\n Motivation = 'Motivation',\n}\n\nexport enum TestType {\n PersonalityAndCulture = 'Personality & culture',\n ProgrammingSkills = 'Programming skills',\n}\n\nexport enum TestFormat {\n MultipleChoice = 'Multiple-choice',\n Coding = 'Coding',\n Typing = 'Typing',\n Questionnaire = 'Questionnaire',\n Simulation = 'Simulation',\n}\n\nexport enum TestDurations {\n ZeroToTenMinutes = 'Up to 10 mins',\n ElevenToTwentyMinutes = '11 to 20 mins',\n TwentyoneToThirtyMinutes = '21 to 30 mins',\n ThirtyoneTosixtyMinutes = '31 to 60 mins',\n}\n\nexport enum TestsCount {\n ZeroTests = '0 added',\n OneTests = '1 test',\n TwoTests = '2 added',\n ThreeTests = '3 test',\n FourTests = '4 test',\n FiveTests = '5 added',\n}\n\nexport enum TestFilterNames {\n Library = 'Show tests from',\n RoleSpecific = 'Skills for',\n Focus = 'Focus',\n Duration = 'Duration',\n Format = 'Format',\n Highlights = 'Highlights',\n}\n\nexport enum CodingQuestions {\n Python = 'Python',\n}\n\nexport enum CreateCodingTestHeaders {\n FunctionSignature = 'Function signature',\n InitialCode = 'Initial code',\n TestCases = 'Test cases',\n VerificationCode = 'Verification code',\n}\n\nexport enum PracticeQuestions {\n AttentionToDetail = 'info This is the first practice question. You are in charge of sending invitations for a class reunion next month. You compare the address on file for one participant with the address available in the yearbook, which are as shown below',\n CodingQuestion = 'The purpose of this question is to show you how coding tests work. You are not being scored for anything in this question.',\n EnglishProficiency = 'Read the text and choose the synonym of the underlined word.',\n RubyOnRails = 'Which of the available queries returns the authors who have written at least one book?',\n}\n","export enum PageSize {\n Ten = 10,\n TwentyFive = 25,\n Fifty = 50,\n}\n\nexport enum MyAssessmentTableHeader {\n DateCreated = 'Job Created',\n LastActivity = 'Last activity',\n}\n\nexport enum TalentAssessmentTableHeader {\n CompanyName = 'COMPANY NAME',\n InvitedOn = 'INVITED ON',\n LastActivity = 'LAST ACTIVITY',\n}\n\nexport enum Sort {\n Ascending = 'ascending',\n Decending = 'descending',\n}\n\nexport enum MenuItem {\n TeamManagement = 'Team Management',\n Integrations = 'Integrations',\n MyCompany = 'My company',\n Logout = 'Log out',\n PlanAndBilling = 'Plan & billing',\n MyProfile = 'My profile',\n // Restricted roles (e.g. Hiring Manager) label the account-menu entry \"Profile\";\n // the substring also matches the full-access \"My profile\" label.\n AccountProfile = 'Profile',\n LogOut = 'Log out',\n Notifications = 'Notifications',\n AssessmentSettings = 'Settings',\n}\n\nexport enum SideNavItem {\n Home = 'Home',\n Jobs = 'Jobs',\n Sourcing = 'Sourcing',\n Candidates = 'Candidates',\n Analytics = 'Analytics',\n TestLibrary = 'Test library',\n WhatsNew = \"What's new\",\n HelpCenter = 'Help center',\n}\n\nexport enum Colour {\n Black = '#000000',\n}\n\nexport enum Benchmark {\n PercentageCorrect = 'Percentage of correct answers',\n AllCandidates = 'All candidates',\n Percentile = 'Percentile',\n}\n\nexport enum HiringStage {\n Interviewed = 'Interviewed',\n Hired = ' Hired 🎉',\n}\n\nexport enum CheatingMonitorList {\n DeviceUsed = 'Device used\\nDesktop',\n WebcamEnabled = 'Webcam enabled?\\nYes',\n FullScreenMode = 'Full-screen mode always active?\\nYes',\n MousePosition = 'Mouse always in assessment window?\\nYes',\n}\n\nexport enum DownloadFormat {\n Csv = 'CSV',\n Excel = 'Excel',\n Pdf = 'PDF',\n}\n\nexport enum URLs {\n TestGorillaPublicUrl = 'https://www.testgorilla.com/',\n TestGorillaPublicPage = 'TestGorilla',\n TestGorillaHelpPage = 'Help center',\n TestGorillaFacebook = 'Facebook',\n TestGorillaInstagram = 'Instagram',\n TestGorillaLinkedin = 'LinkedIn',\n Support = 'support.testgorilla.com',\n CandidateSupport = 'candidates.testgorilla.com',\n CandidateHub = 'talent-staging.testgorilla.com/create-account',\n TasOldFlow = 'https://assessment.testgorilla.com/testtaker/takeinvitation/',\n TasNewFlow = 'https://talent-assessment.testgorilla.com/',\n privacyPolicyLink = 'https://www.testgorilla.com/terms/privacy-policy',\n CandidateTerms = 'https://www.testgorilla.com/candidate-terms',\n}\n\nexport enum CreatingAssessmentsSteps {\n Step1 = 'Job details',\n Step2 = 'Assessment',\n Step3 = 'Configuration',\n Step4 = 'Finalize',\n}\n\nexport enum TestGorillaTheme {\n BgColor = '#d410aa',\n}\n","export enum AssessmentStatus {\n Completed = 'Completed',\n Invited = 'Invited',\n Closed = 'Closed',\n}\n\nexport enum AssessmentResultStatus {\n Unavailable = 'Unavailable',\n}\n\nexport enum Pronoun {\n HeHim = 'He/Him',\n}\n\nexport enum JobSearchStatus {\n ActivelySearching = 'Actively searching',\n OpenToNewChallenges = 'Open to new challenges',\n NotLookingRightNow = 'Not looking right now',\n}\n\nexport enum Proficiency {\n None = 'None',\n}\n\nexport enum CandidateStatusFilters {\n Started = 'Started',\n Invited = 'Invitation delivered',\n Completed = 'Completed',\n}\n\nexport enum CandidateMeta {\n TestInfoTimerText = 'Please stay on this screen. The timer for your next test has started and cannot be paused. The timer continues if you close the browser.',\n TestInfoTimer30MText = 'Please stay on this screen. The timer for your next test has started and cannot be paused. The timer continues if you close the browser.',\n TestInfoTimerPlainText = 'Please stay on this screen. The timer for your next test has started and cannot be paused. You must complete this test in the next ',\n TestInfoTimerTextTasFlow = 'Please stay on this screen. The timer for your next test has started and cannot be paused. The timer continues even when you close the browser.',\n}\n\nexport enum BehaviourLogFlags {\n DeviceUsed = 'Device used',\n FilledOutOnceFromIP = 'Filled out only once from IP address?',\n WebcamAlwaysEnabled = 'Webcam always enabled?',\n FullScreenExit = 'Full-screen mode exit',\n TabSwitch = 'Tab switch',\n DevToolsOpened = 'Developer tools opened',\n}\n\nexport enum TalentFilters {\n JobRole = 'Kitchen Assistant',\n LocationName = 'Lusaka, Zambia',\n YearsOfExperience = '10',\n MinSalary = '125000',\n MaxSalary = '395000',\n MinSalaryDefault = '0',\n MaxSalaryDefault = '500000',\n SalaryType = 'Annually',\n}\n\nexport enum KitchenAssistantTalentDetails {\n JobRole = 'Kitchen Assistant',\n LocationName = 'Lusaka, Zambia',\n Salary = '$30,000/yr',\n YearsOfExperience = '15 years exp.',\n JobTitle = 'Kitchen Assistant at Kitchen Company',\n}\n\nexport enum DogTrainerTalentDetails {\n JobRole = 'Dog Trainer',\n LocationName = 'Sydney, Australia',\n Salary = '$60,000/yr',\n YearsOfExperience = '30 years exp.',\n JobTitle = 'Dog trainer at Dog trainer organization',\n WorkExperienceTitle = 'Dog trainer',\n WorkExperienceDescription = 'Training dogs',\n VerifiedSkill_1 = 'HTML5',\n}\n\nexport enum SourcingInvitationMessage {\n Custom = 'Hello, \\n\\n we would like to invite you. Please find the details below. \\n Details',\n}\n","export enum IntegrationsImageSrc {\n Breezy = 'assets/integrations/brz.png',\n GreenHouse = 'assets/integrations/ghs.png',\n JazzHR = 'assets/integrations/jhr.png',\n Personio = 'assets/integrations/psn.png',\n Recruitee = 'assets/integrations/rct.png',\n}\n\nexport enum Integrations {\n Breezy = 'Breezy',\n GreenHouse = 'Greenhouse',\n JazzHR = 'JazzHR',\n Recruitee = 'Recruitee',\n}\n","export enum OneWayInterviewQuestionName {\n SellingAPen = 'Selling a pen',\n PrioritizingTasks = 'Prioritizing tasks',\n TacklingChallenges = 'Tackling challenges',\n ExceedingExpectations = 'Exceeding expectations',\n}\n\nexport enum CustomQuestionName {\n Video = 'Video',\n Essay = 'Essay',\n MultipleChoice = 'Multiple-choice',\n FileUpload = 'File upload',\n Code = 'Code',\n AllQuestionCategories = 'Select all question categories',\n PriorExperience = 'Prior experience',\n Motivation = 'Motivation',\n SoftSkills = 'Soft skills',\n JobSkills = 'Job skills',\n Finance = 'Finance',\n CustomerService = 'Customer service',\n Sales = 'Sales',\n Marketing = 'Marketing',\n IT = 'IT',\n AdministrativeSupport = 'Administrative support',\n Management = 'Management',\n SellingAPen = 'Selling a pen',\n TacklingChallenges = 'Tackling challenges',\n HandlingUnreasonableRequests = 'Handling unreasonable requests',\n}\n\nexport enum CustomQuestionDescription {\n SellingAPen = 'Sell me the first pen within reach.',\n TacklingChallenges = 'Describe an especially difficult assignment or project you have worked on. What was your role? How did you approach the requirements, and what was the outcome?',\n HandlingUnreasonableRequests = 'Describe a time when you had to handle an unfair or unreasonable complaint or a request from a customer. What did the customer ask, and how did you handle it?',\n}\n\nexport enum Duration {\n ThirtySeconds = '30 secs',\n FiveMinutes = '5 mins',\n TwoMinutes = '2 mins',\n TenMinutes = '10 mins',\n ZeroMinutes = '0 mins',\n SixMinutes = '6 mins',\n FifteenMinutes = '15 mins',\n FiftyFiveMinues = '55 mins',\n FiftyMinues = '50 mins',\n FortyMinutes = '40 mins',\n FortyTwoMinutes = '42 mins',\n FortyFourMinutes = '44 mins',\n FiftyNineMinutes = '59 mins',\n FiftyFourMinutes = '54 mins',\n FiftyEightMinutes = '58 mins',\n SixtyNineMinutes = '69 mins',\n SeventyThreeMinutes = '73 mins',\n}\n\nexport enum CustomQuestionsFilters {\n Assessment = 'Assessment name',\n Library = 'Library',\n Format = 'Format',\n Topic = 'Topic',\n RoleSpecific = 'Role specific',\n}\n\nexport enum CustomQuestions {\n TestGorillaLibrary = 'TestGorilla library',\n MyLibrary = 'My library',\n AddingValue = 'Adding value',\n AddingValueDescription = 'How do you plan to add value to this organization?',\n HowAreYou = 'How are you?',\n WhereAreYouFrom = 'Where are you from?',\n UploadYourResume = 'Upload your resume',\n ValidateRegex = 'Validate Regex',\n CreateIntroVideo = 'Create intro video of yourself',\n IntroducingYourself = 'Introducing yourself',\n TacklingChallenges = 'Tackling challenges',\n TacklingChallengesDescription = 'Describe an especially difficult assignment or project you have worked on. What was your role? How did you approach the requirements, and what was the outcome?',\n}\n\nexport enum CustomQuestionsContent {\n IntroducingYourself = \"Introduce yourself in 60 seconds and explain why you're a great\",\n AddingValue = 'How do you plan to add value to this organization?',\n FailingToDeliver = \"Tell me about a time when you didn't deliver on your key objectives. What did you learn?\",\n FindingAGreaterPurpose = 'How would working in this role help you fulfill a greater personal purpose?',\n WorkingCrossFunctionally = 'How do you transcend your role as a finance professional and interact cross-functionally with people in other departments?',\n}\n","export enum City {\n Ardamata = 'Ardamata',\n Aiea = 'Aiea',\n Nairobi = 'Nairobi',\n}\n\nexport enum Cities {\n Amsterdam = 'Amsterdam',\n London = 'London',\n Nairobi = 'Nairobi',\n MexicoCity = 'Mexico City',\n Berlin = 'Berlin',\n}\n\nexport enum Countries {\n Zambia = 'Zambia',\n Australia = 'Australia',\n}\n\nexport enum WorkArrangements {\n Remote = 'Remote',\n Hybrid = 'Hybrid',\n OnSite = 'On/Site',\n}\n\nexport enum JobRoles {\n NetDeveloper = '.NET Developer',\n AcademicEditor = 'Academic Editor',\n FullStackDeveloper = 'Full Stack Developer',\n AccountManager = 'Account Manager',\n AcademicSupportOfficer = 'Academic Support Officer',\n PythonDeveloper = 'Python Developer',\n Developer = 'Developer',\n EssentialSkillsTemplate = 'Essential Skills Template',\n DataAnalyst = 'Data Analyst',\n}\n\nexport enum AcademicEditorTemplate {\n AcademicEditor = 'Communication Culture English Working ',\n}\n","export enum CompanyName {\n Testgorilla = 'TestGorilla',\n}\n\nexport enum Currency {\n USD = 'USD',\n}\n\nexport enum Plans {\n PayAsYouGo = 'Pay as you go',\n Scale = 'Scale',\n Business = 'Business',\n Free = 'Free',\n Starter = 'Starter',\n Pro = 'Pro',\n Lite = 'Lite',\n Core = 'Core',\n}\n\nexport enum TeamRoles {\n HiringManager = 'Hiring Manager',\n Admin = 'Admin',\n Recruiter = 'Recruiter',\n Owner = 'Owner',\n}\n\nexport enum PasswordStrengthTexts {\n LowerCharacter = 'contains at least one lower character',\n UpperCharacter = 'contains at least one upper character',\n DigitCharacter = 'contains at least one digit',\n SpecialCharacter = 'contains at least one special character',\n CountText = 'contains at least 12 characters',\n LowerCaseNew = 'Contains at least one lowercase',\n UpperCaseNew = 'Contains at least one uppercase',\n DigitNew = 'Contains at least one number',\n SpecialCharacterNew = 'Contains at least one special character',\n CountTextNew = 'Contains at least 12 characters',\n}\n","export enum Language {\n English = 'English',\n French = 'French',\n Dutch = 'Dutch',\n German = 'German',\n Spanish = 'Spanish',\n Italian = 'Italian',\n Japanese = 'Japanese',\n PortugueseBrazil = 'Portuguese (Brazil)',\n Danish = 'Danish',\n Norwegian = 'Norwegian',\n Polish = 'Polish',\n Swedish = 'Swedish',\n}\n\nexport const LanguageCode: Record<Language, string> = {\n [Language.English]: 'en',\n [Language.French]: 'fr',\n [Language.Dutch]: 'nl',\n [Language.German]: 'de',\n [Language.Spanish]: 'es',\n [Language.Italian]: 'it',\n [Language.Japanese]: 'ja',\n [Language.PortugueseBrazil]: 'pt-br',\n [Language.Danish]: 'da',\n [Language.Norwegian]: 'nb',\n [Language.Polish]: 'pl',\n [Language.Swedish]: 'sv',\n};\n","/**\n * Single source of truth for evaluation tools\n * Contains display names, labels, and step-specific names\n */\nexport const EVALUATION_TOOLS = {\n SkillsTests: {\n displayName: 'Skills tests',\n label: 'evaluation_tool_skill_test',\n step4Name: 'Tests',\n },\n CustomQuestions: {\n displayName: 'Custom questions',\n label: 'evaluation_tool_custom_questions',\n step4Name: 'Custom questions',\n },\n AIVideoInterview: {\n displayName: 'AI interview',\n label: 'evaluation_tool_two_ways_ai_interview',\n step4Name: 'AI interview',\n },\n AIResumeScoring: {\n displayName: 'Resume scoring',\n label: 'evaluation_tool_ai_resume',\n step4Name: 'Resume scoring',\n },\n OneWayInterview: {\n displayName: 'Video questions',\n label: 'evaluation_tool_one_way_ai_interview',\n step4Name: 'Video questions',\n },\n QualifyingQuestions: {\n displayName: 'Qualifying questions',\n label: 'evaluation_tool_knockout_questions',\n step4Name: 'Qualifying questions',\n },\n} as const;\n\n// Type-safe accessors for the unified definition\nexport type EvaluationToolKey = keyof typeof EVALUATION_TOOLS;\n\n// Helper type to get display name values\nexport type EvaluationToolDisplayName = (typeof EVALUATION_TOOLS)[EvaluationToolKey]['displayName'];\n\n// Helper type to get label values\nexport type EvaluationToolLabel = (typeof EVALUATION_TOOLS)[EvaluationToolKey]['label'];\n\n// Helper type to get step4 name values\nexport type EvaluationToolStep4Name = (typeof EVALUATION_TOOLS)[EvaluationToolKey]['step4Name'];\n"],"mappings":"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","names":["env","accounts","baseURL","ephemeralPrefix","ephemeralId","isEphemeralEnvironment","environment","adminURL","TestName","ProgrammingLanguages","CodingTaskOutput","PersonalityAndCultureTestName","TestKeyWord","TestType","TestFormat","TestDurations","TestsCount","TestFilterNames","CodingQuestions","CreateCodingTestHeaders","PracticeQuestions","PageSize","MyAssessmentTableHeader","TalentAssessmentTableHeader","Sort","MenuItem","SideNavItem","Colour","Benchmark","HiringStage","CheatingMonitorList","DownloadFormat","URLs","CreatingAssessmentsSteps","TestGorillaTheme","AssessmentStatus","AssessmentResultStatus","Pronoun","JobSearchStatus","Proficiency","CandidateStatusFilters","CandidateMeta","BehaviourLogFlags","TalentFilters","KitchenAssistantTalentDetails","DogTrainerTalentDetails","SourcingInvitationMessage","IntegrationsImageSrc","Integrations","OneWayInterviewQuestionName","CustomQuestionName","CustomQuestionDescription","Duration","CustomQuestionsFilters","CustomQuestions","CustomQuestionsContent","City","Cities","Countries","WorkArrangements","JobRoles","AcademicEditorTemplate","CompanyName","Currency","Plans","TeamRoles","PasswordStrengthTexts","Language"]}
{"version":3,"sources":["../src/enums/index.ts","../src/config/resolve.ts","../src/config/algolia.ts","../src/config/constants.ts","../src/config/index.ts","../src/enums/tests.ts","../src/enums/ui.ts","../src/enums/candidates.ts","../src/enums/integrations.ts","../src/enums/customQuestions.ts","../src/enums/locations.ts","../src/enums/company.ts","../src/enums/languages.ts","../src/enums/evaluationTools.ts"],"sourcesContent":["// Re-export all enums from domain-specific modules\nexport * from './tests';\nexport * from './ui';\nexport * from './candidates';\nexport * from './integrations';\nexport * from './customQuestions';\nexport * from './locations';\nexport * from './company';\nexport * from './languages';\nexport * from './evaluationTools';\n","import type { E2eAccounts, E2eConfig, E2eUrls } from './types';\n\n/**\n * Ephemeral environment detection.\n *\n * CI declares the target via `E2E_ENVIRONMENT` (the e2e-tests orb's\n * `environment` job parameter): `ephemeral` means ephemeral, any other value\n * means not — even if the URL happens to look ephemeral. When the variable is\n * unset (local runs, orb versions that don't export it yet), the baseURL\n * shape is the fallback signal.\n *\n * The URL parse itself stays either way: sibling service hosts are rebuilt\n * from the captured `<prefix>` and `<id>`. It is generic — no per-repo prefix\n * whitelist, so `backend-1234-…`, `talent-api-1756-…`,\n * `talent-assessment-987-…` and any future deployment prefix all match\n * `<prefix>-<id>-<service>.dev.testgorilla.com` without a framework release.\n * Lazy `(.+?)` splits at the FIRST `-<digits>-` segment so service names\n * containing digits (e.g. `cr-v2`) cannot mis-split the prefix.\n */\nconst EPHEMERAL_PREFIX_PATTERN = /https?:\\/\\/(.+?)-(\\d+)-[^.]+\\.dev\\.testgorilla\\.com/;\n\nconst LOCAL_MAILHOG_URL = 'http://localhost:8025';\n\n/**\n * Build a lazily-throwing secret accessor: the property reads as a normal\n * string when the env var is set, and throws with setup guidance the first\n * time it is READ while unset. Importing the config never throws.\n *\n * Non-enumerable so JSON-serializing an E2eConfig (e.g. passing it through\n * `test.use` in playwright.config, which serializes options to workers) can\n * neither leak the credential nor trip the missing-env error.\n */\nfunction defineRequiredSecret(\n target: object,\n property: string,\n value: string | undefined,\n envVar: string,\n): void {\n Object.defineProperty(target, property, {\n enumerable: false,\n configurable: true,\n get(): string {\n if (value === undefined || value === '') {\n throw new Error(\n `[e2e-framework] ${envVar} is not set. The framework ships no credential defaults — ` +\n `export ${envVar} (see your team's 1Password e2e .env entry) before running tests.`,\n );\n }\n return value;\n },\n });\n}\n\nfunction resolveAccounts(env: NodeJS.ProcessEnv): E2eAccounts {\n const nodeIndexedOrganizer = env.CIRCLE_NODE_TOTAL\n ? `dummy.tests+organizer${env.CIRCLE_NODE_INDEX}@testgorilla.com`\n : `dummy.tests+organizer11@testgorilla.com`;\n const accountIndex = env.E2E_ACCOUNT_INDEX;\n\n const accounts = {\n organizerEmail:\n env.userEmail ??\n (accountIndex !== undefined\n ? `dummy.tests+organizer${accountIndex}@testgorilla.com`\n : nodeIndexedOrganizer),\n candidateEmail: env.candidateEmail ?? 'dummy.tests@testgorilla.com',\n hiringManagerEmail: env.hiringManagerEmail ?? 'dummy.tests+hiringmanager01@testgorilla.com',\n recruiterEmail: env.recruiterEmail ?? 'dummy.tests+recruiter1@testgorilla.com',\n adminEmail: env.adminEmail ?? 'dummy.tests+admin1@testgorilla.com',\n newAdminEmail: env.newAdminEmail ?? 'dummy.tests+newadmin@testgorilla.com',\n freeUserEmail: env.freeUserEmail ?? 'dummy.tests+free0@testgorilla.com',\n corePlanUserEmail: env.corePlanUserEmail ?? 'dummy.tests+coreplan@testgorilla.com',\n plusPlanUserEmail: env.plusPlanUserEmail ?? 'dummy.tests+plus@testgorilla.com',\n proPlanUserEmail: env.proPlanUserEmail ?? 'dummy.tests+pro@testgorilla.com',\n businessPlanUserEmail: env.businessPlanUserEmail ?? 'dummy.tests+business@testgorilla.com',\n starterPlanUserEmail: env.starterPlanUserEmail ?? 'dummy.tests+starter@testgorilla.com',\n myProfileUserEmail: env.myProfileUserEmail ?? 'dummy.tests+myprofile@testgorilla.com',\n atsIntegrationsEmail:\n env.atsIntegrationsEmail ?? 'dummy.tests+ats-integrations@testgorilla.com',\n } as E2eAccounts;\n\n defineRequiredSecret(accounts, 'password', env.E2E_PASSWORD ?? env.e2e_password, 'E2E_PASSWORD');\n defineRequiredSecret(\n accounts,\n 'candidatePassword',\n env.E2E_CANDIDATE_PASSWORD,\n 'E2E_CANDIDATE_PASSWORD',\n );\n\n return accounts;\n}\n\nfunction resolveUrls(\n baseURL: string,\n ephemeralPrefix: string | null,\n ephemeralId: string | null,\n): E2eUrls {\n const isEphemeral = !!ephemeralId;\n const ephemeralHost = (service: string) =>\n `https://${ephemeralPrefix}-${ephemeralId}-${service}.dev.testgorilla.com`;\n const isProd = baseURL.includes('app.testgorilla');\n const isDev = baseURL.includes('dev.testgorilla');\n const isLocalhost = baseURL.includes('localhost');\n\n return {\n talentBase: isEphemeral\n ? ephemeralHost('talent')\n : isProd\n ? 'https://talent.testgorilla.com'\n : isDev\n ? 'https://talent-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4100'\n : 'https://talent-staging.testgorilla.com',\n talentAssessment: isEphemeral\n ? ephemeralHost('talent-assessment')\n : isProd\n ? 'https://talent-assessment.testgorilla.com'\n : isDev\n ? 'https://talent-assessment-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4100'\n : 'https://talent-assessment-staging.testgorilla.com',\n talentApi: isEphemeral\n ? ephemeralHost('api-talent')\n : isProd\n ? 'https://api-talent.testgorilla.com'\n : isDev\n ? 'https://api-talent-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4200'\n : 'https://api-talent-staging.testgorilla.com',\n codeRunnerApi: isProd\n ? 'https://cr-v2.testgorilla.com'\n : isDev\n ? 'https://cr-v2-dev.testgorilla.com'\n : 'https://cr-v2-staging.testgorilla.com',\n websiteBase: isProd\n ? 'https://www.testgorilla.com'\n : isDev && !isEphemeral\n ? 'https://website-dev.testgorilla.com'\n : 'https://website-staging.testgorilla.com',\n mailpit: isEphemeral ? ephemeralHost('mailpit') : LOCAL_MAILHOG_URL,\n localstack: isEphemeral ? ephemeralHost('localstack') : null,\n };\n}\n\n/**\n * Resolve the full e2e run configuration from environment variables, using\n * TestGorilla's environment naming conventions (staging default, ephemeral\n * `<prefix>-<id>-<service>` dev deployments, production `app`). CI declares\n * ephemerality explicitly via `E2E_ENVIRONMENT=ephemeral`; unset falls back\n * to baseURL-shape detection (see EPHEMERAL_PREFIX_PATTERN above).\n *\n * Pure with respect to its input: pass a custom env for testing; defaults to\n * `process.env`. Never throws on missing secrets — required credentials\n * (`E2E_PASSWORD`, `E2E_CANDIDATE_PASSWORD`) throw with guidance only when\n * first read. The one eager throw is a declared-ephemeral baseURL that the\n * ephemeral host pattern cannot parse (a CI wiring error).\n */\nexport function resolveTgEnvironment(env: NodeJS.ProcessEnv = process.env): E2eConfig {\n const baseURL = env.baseURL || 'https://staging.testgorilla.com';\n\n const ephemeralMatch = baseURL.match(EPHEMERAL_PREFIX_PATTERN);\n const declaredEnvironment = env.E2E_ENVIRONMENT?.toLowerCase();\n const isEphemeralEnvironment = declaredEnvironment\n ? declaredEnvironment === 'ephemeral'\n : !!ephemeralMatch;\n if (isEphemeralEnvironment && !ephemeralMatch) {\n // Config error, CI-only by construction (the variable is CI-set): every\n // derived sibling URL would be wrong, so fail fast instead of letting\n // tests fail confusingly against staging fallback hosts.\n throw new Error(\n `[e2e-framework] E2E_ENVIRONMENT=ephemeral but baseURL \"${baseURL}\" does not match ` +\n `<prefix>-<id>-<service>.dev.testgorilla.com — sibling service URLs cannot be derived.`,\n );\n }\n const ephemeralPrefix = isEphemeralEnvironment && ephemeralMatch ? ephemeralMatch[1] : null;\n const ephemeralId = isEphemeralEnvironment && ephemeralMatch ? ephemeralMatch[2] : null;\n\n const environment = baseURL.split('.testgorilla.com')[0].split('https://')[1] || 'staging';\n\n const adminURL =\n env.adminURL ||\n (isEphemeralEnvironment\n ? `https://${ephemeralPrefix}-${ephemeralId}-backend.dev.testgorilla.com`\n : environment === 'app'\n ? `https://new-admin.testgorilla.com`\n : `https://${environment}-new-admin.testgorilla.com`);\n\n const isProd = baseURL.includes('app.testgorilla');\n const isDev = baseURL.includes('dev.testgorilla');\n const isLocalhost = baseURL.includes('localhost');\n\n return {\n baseURL,\n environment,\n isEphemeralEnvironment,\n ephemeralPrefix,\n ephemeralId,\n isLocalEnvironment: env.localEnvironment === 'true' || isEphemeralEnvironment,\n adminURL,\n urls: resolveUrls(baseURL, ephemeralPrefix, ephemeralId),\n emails: {\n signupFrom: isProd\n ? 'hello@testgorilla.com'\n : isLocalhost\n ? 'noreply@example'\n : isDev || isEphemeralEnvironment\n ? 'hello@maildev.testgorilla.com'\n : 'hello@mailstaging.testgorilla.com',\n assessmentsFrom: isProd\n ? 'assessments@testgorilla.com'\n : isLocalhost\n ? 'assessments@example.com'\n : isDev || isEphemeralEnvironment\n ? 'assessments@maildev.testgorilla.com'\n : 'assessments@mailstaging.testgorilla.com',\n },\n accounts: resolveAccounts(env),\n };\n}\n","/**\n * Algolia Configuration\n *\n * Test-library search used during assessment creation. The bundled defaults\n * are the same index-restricted, search-only keys the customer frontend ships\n * to browsers (not admin keys); override any of them via the ALGOLIA_* env\n * vars below without a code change (e.g. on key rotation).\n */\n\nimport { baseURL, isEphemeralEnvironment } from './index';\n\nconst ALGOLIA_APP_ID = process.env.ALGOLIA_APP_ID || 'V8Y626J4K8';\n\n// Algolia Index Names\nconst ALGOLIA_PROD_INDEX = process.env.ALGOLIA_PROD_INDEX || 'production_tests_index';\nconst ALGOLIA_STAGING_INDEX = process.env.ALGOLIA_STAGING_INDEX || 'staging_tests_index';\nconst ALGOLIA_EPHEMERAL_INDEX = process.env.ALGOLIA_EPHEMERAL_INDEX || 'ephemeral_tests_index';\n\n// Algolia API Keys (search-only, restricted to the specific indices)\nconst ALGOLIA_PROD_API_KEY =\n process.env.ALGOLIA_PROD_API_KEY ||\n 'NDc2N2JlMmY5ZGE2NzM4NDIwOWM2ODkyMWY0Yjk5YjYyNTA5NTViNDg2YzNlN2VlZDE4MmYyOWE3YmRjNjg1ZXJlc3RyaWN0SW5kaWNlcz1wcm9kdWN0aW9uX3Rlc3RzX2luZGV4';\nconst ALGOLIA_STAGING_API_KEY =\n process.env.ALGOLIA_STAGING_API_KEY ||\n 'ZjZmYWMwYjNkN2IxZjViYzA0OTZkZGE3OWY5MmVjYWMzN2RlYWJlYjcyOWRlMWQ3YjMwM2RjYjk0NDNjZGY0MXJlc3RyaWN0SW5kaWNlcz1zdGFnaW5nX3Rlc3RzX2luZGV4';\nconst ALGOLIA_EPHEMERAL_API_KEY =\n process.env.ALGOLIA_EPHEMERAL_API_KEY || '5beea78e78134e8270214f93b7032e7b';\n\n/**\n * Returns environment-specific Algolia API URL\n */\nexport const getAlgoliaUrl = (): string => {\n const isProduction = baseURL.includes('app.testgorilla');\n\n if (isEphemeralEnvironment) {\n return `https://v8y626j4k8-dsn.algolia.net/1/indexes/${ALGOLIA_EPHEMERAL_INDEX}/query`;\n }\n\n const index = isProduction ? ALGOLIA_PROD_INDEX : ALGOLIA_STAGING_INDEX;\n const domain = isProduction ? 'algolianet.com' : 'algolia.net';\n const subdomain = isProduction ? 'v8y626j4k8-2' : 'v8y626j4k8-dsn';\n\n return `https://${subdomain}.${domain}/1/indexes/${index}/query`;\n};\n\n/**\n * Returns environment-specific Algolia API headers\n */\nexport const getAlgoliaHeaders = (): Record<string, string> => {\n const isProduction = baseURL.includes('app.testgorilla');\n\n let apiKey: string;\n if (isEphemeralEnvironment) {\n apiKey = ALGOLIA_EPHEMERAL_API_KEY;\n } else {\n apiKey = isProduction ? ALGOLIA_PROD_API_KEY : ALGOLIA_STAGING_API_KEY;\n }\n\n return {\n 'content-type': 'application/x-www-form-urlencoded',\n 'x-algolia-api-key': apiKey,\n 'x-algolia-application-id': ALGOLIA_APP_ID,\n };\n};\n","/**\n * Constants & Retries\n *\n * Contains global retry counters and other application constants.\n */\n\nimport { env } from 'process';\n\n// Retry counters - used to determine retry behavior in tests\nexport const DEFAULT_RETRY_COUNTER = 10;\nexport const INCREASED_RETRY_COUNTER_50 = DEFAULT_RETRY_COUNTER * 1.5;\nexport const INCREASED_RETRY_COUNTER_80 = DEFAULT_RETRY_COUNTER * 1.8;\nexport const INCREASED_RETRY_COUNTER_200 = DEFAULT_RETRY_COUNTER * 2;\nexport const INCREASED_RETRY_COUNTER_300 = DEFAULT_RETRY_COUNTER * 3;\n\n// Logger configuration. Default: WARN both in CI and locally — opt in to INFO for milestones\n// or DEBUG for per-request chatter via the LOG_LEVEL env var.\n// API_LOG_LEVEL / API_LOG_FILE are accepted for back-compat with a one-time deprecation note.\nconst rawLogLevel = env.LOG_LEVEL?.toUpperCase() || env.API_LOG_LEVEL?.toUpperCase() || 'WARN';\nif (!env.LOG_LEVEL && env.API_LOG_LEVEL && !env._LOG_DEPRECATION_WARNED) {\n process.stderr.write(\n '[logger] API_LOG_LEVEL is deprecated; use LOG_LEVEL instead (same values).\\n',\n );\n env._LOG_DEPRECATION_WARNED = '1';\n}\nexport const logLevel = rawLogLevel as 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'NONE';\nexport const logFile = env.LOG_FILE || env.API_LOG_FILE || '';\n\n// Back-compat aliases — prefer logLevel / logFile in new code.\nexport const apiLogLevel = logLevel;\nexport const apiLogFile = logFile;\n\n// Assessment configuration — the name→id map published by global setup\n// (process.env.assessments; see @testgorilla/e2e-framework/setup).\nexport const assessmentList = JSON.parse(env.assessments || '{}');\n\n// Other constants\nexport const MAILPIT_SERVER = 'http://localhost:8025';\nexport const simpleAssessmentName = `New Simple Assessment - ${Date.now()}`;\nexport const invitationEmailSubject = 'Your application at TestGorilla';\n\n// Email reception tracking\nexport const emailReception = { slowEmailAPI: false };\n","/**\n * Compatibility surface over {@link resolveTgEnvironment}.\n *\n * Every export here preserves the NAME and SHAPE (const vs function) of the\n * corresponding export in tgo-qa-automation's `helpers/config`, so consumers\n * migrate with a module-specifier-only import rewrite. The values come from a\n * single module-load resolution of `process.env` — the same timing the suite\n * relies on today (env is inherited by every Playwright worker process).\n *\n * Credentials ship with NO defaults: `password` is empty when `E2E_PASSWORD`\n * is unset (the structured `accounts.password` accessor throws with guidance\n * instead).\n */\nimport { resolveTgEnvironment } from './resolve';\nimport { getRunId } from './runId';\n\nexport type { E2eAccounts, E2eConfig, E2eUrls } from './types';\nexport { resolveTgEnvironment } from './resolve';\n\nconst cfg = resolveTgEnvironment();\n\n// --- Environment & URLs (parity with helpers/config/environment.ts) ---\n\nexport const baseURL = cfg.baseURL;\nexport const environment = cfg.environment;\nexport const isEphemeralEnvironment = cfg.isEphemeralEnvironment;\nexport const ephemeralPrefix = cfg.ephemeralPrefix;\nexport const ephemeralId = cfg.ephemeralId;\nexport const isLocalEnvironment = cfg.isLocalEnvironment;\nexport const adminURL = cfg.adminURL;\nexport const localMailHogURL = 'http://localhost:8025';\n\n/** Returns environment-specific mailpit (ephemeral) or local MailHog URL. */\nexport const mailpitURL = (): string => cfg.urls.mailpit;\n\n/**\n * Returns the LocalStack URL for the current ephemeral environment, or `null`\n * when not running against one.\n */\nexport const localstackURL = (): string | null => cfg.urls.localstack;\n\n/** Returns environment-specific talent base URL. */\nexport const talentBaseURL = (): string => cfg.urls.talentBase;\n\n/** Returns environment-specific talent assessment URL. */\nexport const talentAssessmentURL = (): string => cfg.urls.talentAssessment;\n\n/** Returns environment-specific talent API URL. */\nexport const talentApiURL = (): string => cfg.urls.talentApi;\n\n/** Returns environment-specific code runner API URL. */\nexport const codeRunnerApiURL = (): string => cfg.urls.codeRunnerApi;\n\n/** Returns environment-specific website base URL. */\nexport const websiteBaseURL = (): string => cfg.urls.websiteBase;\n\n/** Returns environment-specific signup sender address. */\nexport const signupFromEmail = (): string => cfg.emails.signupFrom;\n\n/** Returns environment-specific assessments sender address. */\nexport const assessmentsFromEmail = (): string => cfg.emails.assessmentsFrom;\n\n/** Check if current environment is NOT staging. */\nexport const ifNotStagingRun = (): boolean => !cfg.baseURL.includes('staging.testgorilla');\n\n/**\n * Check if current environment is NEITHER staging NOR an ephemeral dev env.\n * Use this to skip tests that depend on the website → app signup flow.\n */\nexport const ifNotStagingOrEphemeralRun = (): boolean =>\n ifNotStagingRun() && !cfg.isEphemeralEnvironment;\n\n/** Check if current environment is NOT localhost. */\nexport const ifNotLocalhostRun = (): boolean => !cfg.baseURL.includes('localhost');\n\n/**\n * Rewrites a signup URL produced by the marketing website (which always\n * points at app.testgorilla.com) so it targets the current environment.\n */\nexport const rewriteSignupUrlForEnv = (signupUrl: string): string => {\n const targetHost = new URL(cfg.baseURL).host;\n return signupUrl.replace(/app\\.testgorilla\\.com/i, targetHost);\n};\n\n// --- Environment URL constants (parity with helpers/config/environment.ts) ---\n\nexport const prodTesttakerUrlString = 'https://assessment.testgorilla.com';\nexport const prodTASUrlString = 'https://talent-assessment.testgorilla.com';\nexport const stageTesttakerUrlString = 'https://staging-assessment.testgorilla.com';\nexport const stageTASUrlString = 'https://talent-assessment-staging.testgorilla.com';\nexport const devTASUrlString = 'https://talent-assessment-dev.testgorilla.com';\nexport const localTASUrlString = 'http://localhost:4100';\nexport const stagingTASAPIUrl = 'https://api-talent-staging.testgorilla.com';\n\n// --- Seed assessment names (product constants, non-secret) ---\n\nexport const CandidateInviteAssessment = 'Candidate-Invite-Assessment-4-Do-not-archive';\nexport const candidateExpiredAssessment = 'Candidate-Expired-Assessment-1-Do-not-archive';\nexport const candidateArchivedAssessment = 'Candidate-Archived-Assessment-1-Do-not-archive';\nexport const tasSimpleMcqAssessment = 'TAS-MCQ-Assessment';\nexport const tasCustomTestAssessment = 'TAS-Custom-Test-Assessment';\nexport const tasSimpleBulkAssessment = 'TAS-Bulk-Assessment';\n\n// --- Test accounts (parity with helpers/config/testAccounts.ts, secrets stripped) ---\n\n/** Structured account set; `accounts.password` throws with guidance if `E2E_PASSWORD` is unset. */\nexport const accounts = cfg.accounts;\n\n/** Main organizer account email for this run. */\nexport const email = cfg.accounts.organizerEmail;\n\n/**\n * Organizer password from `E2E_PASSWORD` (legacy `e2e_password`). Empty string\n * when unset — the framework ships no credential defaults. Prefer\n * `accounts.password`, which throws with setup guidance instead of silently\n * yielding ''.\n */\nexport const password = process.env.E2E_PASSWORD ?? process.env.e2e_password ?? '';\n\nexport const candidateEmail = cfg.accounts.candidateEmail;\nexport const hiringManagerEmail = cfg.accounts.hiringManagerEmail;\nexport const recruiterEmail = cfg.accounts.recruiterEmail;\nexport const adminEmail = cfg.accounts.adminEmail;\nexport const newAdminEmail = cfg.accounts.newAdminEmail;\nexport const freeUserEmail = cfg.accounts.freeUserEmail;\nexport const corePlanUserEmail = cfg.accounts.corePlanUserEmail;\nexport const plusPlanUserEmail = cfg.accounts.plusPlanUserEmail;\nexport const proPlanUserEmail = cfg.accounts.proPlanUserEmail;\nexport const businessPlanUserEmail = cfg.accounts.businessPlanUserEmail;\nexport const starterPlanUserEmail = cfg.accounts.starterPlanUserEmail;\nexport const myProfileUserEmail = cfg.accounts.myProfileUserEmail;\nexport const atsIntegrationsEmail = cfg.accounts.atsIntegrationsEmail;\n\nconst EMAIL_DOMAIN = '@testgorilla.com';\nconst DUMMY_TESTS_PREFIX = 'dummy.tests';\n\n// Per-process tie-breaker so two mints in the same millisecond never collide.\nlet mintCounter = 0;\n\n/**\n * Unique, run-attributable suffix for generated identities:\n * `<runId>x<epoch36><counter>`. Embedding the run id makes every row on the\n * shared staging DB traceable to the CI workflow or local user that created\n * it, and lets purge jobs select marked data (.github/instructions/07-test-data.md).\n */\nconst mintSuffix = (): string => `${getRunId()}x${Date.now().toString(36)}${mintCounter++}`;\n\n/**\n * Generate a random candidate email.\n * Format: `dummy.tests+cand<rand><runId>x<timestamp>@testgorilla.com`.\n */\nexport const randCandidateEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+cand${rand}${mintSuffix()}${EMAIL_DOMAIN}`;\n\n/**\n * Generate a random customer email.\n * Format: `dummy.tests+cust<rand><runId>x<timestamp>@testgorilla.com`.\n */\nexport const randCustomerEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+cust${rand}${mintSuffix()}${EMAIL_DOMAIN}`;\n\n// --- Algolia, constants, recaptcha (parity with helpers/config) ---\n// Lazily circular: algolia/recaptcha read baseURL/isEphemeralEnvironment from\n// this barrel inside their functions only, never at module load.\n\nexport { getAlgoliaUrl, getAlgoliaHeaders } from './algolia';\nexport * from './constants';\nexport { getRecaptchaBypassKey, setRecaptchaBypassKeyProvider } from './recaptcha';\nexport type { RecaptchaKeyProvider } from './recaptcha';\n\n/**\n * Generate a random team-member email tagged with the current environment.\n * Format: `dummy.tests+t<rand><env>+<runId>x<timestamp>@testgorilla.com`.\n */\nexport const randTeamMemberEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+t${rand}${cfg.environment}+${mintSuffix()}${EMAIL_DOMAIN}`;\n\n// Random test-data generators (faker replacement) + username/phone utilities\nexport * from './randomData';\nexport { getRunId };\n","import { baseURL, isLocalEnvironment } from '../config';\n\nexport enum TestName {\n CultureAdd = 'Culture add',\n Communication = 'Communication',\n Motivation = 'Motivation',\n Disc = 'DISC',\n CustomQuestion = 'Custom questions',\n PHPCoding_stage = 'PHP (coding): object-oriented programming',\n PHPCoding_prod = 'PHP (Coding): Object-Oriented Programming',\n PythonCodingDebugging = 'Coding: Debugging',\n PythonCodingDebugging_prod = 'Python (Coding): Debugging',\n PythonCodingEntryLevel = 'Python (coding): entry-level algorithms',\n AttentionToDetail = 'Attention to Detail (Textual)',\n EnglishProficiency = 'English C1 (Advanced)',\n EnglishIntermediate = 'English (intermediate/B1)',\n RubyOnRails = 'Ruby on Rails',\n JavaScriptCodingEntryLevel = 'JavaScript (Coding): Entry-Level Algorithms',\n TypeScriptCodingEntryLevel = 'TypeScript (coding): entry-level algorithms',\n PhpEntryLevel = 'PHP (coding): intermediate-level algorithms',\n SqliteIntermediate = 'SQLite (coding): intermediate-level querying',\n SQLiteEntryLevel = 'SQLite (coding): entry-level database operations',\n JavaEntryLevel = 'Java (coding): entry-level algorithms',\n CCodingEntryLevel = 'C (coding): entry-level algorithms',\n CPPCodingEntryLevel = 'C++ (coding): entry-level algorithms',\n CHashCodingEntryLevel = 'C# (coding): entry-level algorithms',\n RubyEntryLevel = 'Ruby (coding): entry-level algorithms',\n Ennéagramme = 'Ennéagramme',\n AttentionToDetailVisual = 'Attention to detail (visual)',\n WorkingWithData = 'Working with data',\n ReadingComprehension = 'Reading comprehension',\n TypingSpeedLowerCase = 'Typing Speed (Lowercase Only)',\n TypingSpeedCapitalization = 'Typing Speed (Capitalization and Punctuation)',\n TypingSpeedNumbersOnly = 'Typing Speed (Numbers Only)',\n VerbalReasoning = 'Verbal Reasoning',\n ProblemSolving = 'Problem Solving',\n ProblemSolvingStaging = 'Problem solving',\n Big5 = 'Big 5 (OCEAN)',\n TimeManagement = 'Time Management',\n TimeManagementStaging = 'Time management',\n RubyDebugging = 'Ruby (coding): debugging',\n CodingEntryLevel = 'Coding: Entry-level algorithms',\n Tableau = 'Tableau',\n FollowingInstructions = 'Following instructions',\n UnderstandingInstructions = 'Understanding instructions',\n GoogleSpreadsheetSimulation = 'Google Sheets Spreadsheet Simulation',\n CloudSystemAdministration = 'Cloud System Administration',\n AndroidKotlin = 'Android Development Using Kotlin',\n ActiveListening = 'Active Listening',\n MySQL = 'MySQL',\n SpreadsheetSimulation = 'Spreadsheet Simulation: Google Sheets (Intermediate)',\n UniversalSkillsProfiler = 'Universal Skills Profiler',\n Enneagram = 'Enneagram',\n HTML5 = 'HTML5',\n CriticalThinking = 'Critical thinking',\n HubspotCRM = 'Hubspot CRM',\n Shopify = 'Shopify',\n Laravel = 'Laravel',\n Flutter = 'Flutter',\n IntermediateMath = 'Intermediate Math',\n Zendesk = 'Zendesk CS',\n PurchaseManager = 'Purchase Manager',\n SQLQuerying = 'SQLite (Coding): Intermediate-Level Querying',\n ImmersiveTest = 'Customer Service (Immersive Role-Play)',\n AIResume = 'AI Resume Scoring',\n SoftwareArchitect = 'Software architect',\n AWS = 'AWS',\n}\n\nexport enum ProgrammingLanguages {\n Python = 'Python',\n JavaScript = 'JavaScript',\n TypeScript = 'TypeScript',\n Php = 'PHP',\n Sqlite = 'SQLite',\n Java = 'Java',\n C = 'C',\n CPP = 'C++',\n CHash = 'C#',\n Ruby = 'Ruby',\n}\n\nexport const TestDuration = getTestDuration();\n\nfunction getTestDuration() {\n if (baseURL.includes('app')) {\n return {\n CultureAdd: '10',\n AttentionToDetail: '12',\n AttentionToDetailVisual: '10',\n EnglishProficiency: '10',\n CustomTest: '10',\n PythonCoding: '14',\n };\n } else if (isLocalEnvironment) {\n return {\n CultureAdd: '10',\n AttentionToDetail: '12',\n AttentionToDetailVisual: '10',\n EnglishProficiency: '10',\n CustomTest: '10',\n PythonCoding: '8',\n };\n } else {\n return {\n CultureAdd: '10',\n AttentionToDetail: '10',\n AttentionToDetailVisual: '10',\n EnglishProficiency: '10',\n CustomTest: '10',\n PythonCoding: '14',\n };\n }\n}\n\nexport enum CodingTaskOutput {\n TaskSuccess = 'Code executed successfully',\n TaskFailure = 'Task finished with errors.Traceback (most recent call last):',\n TaskMessage = 'Task',\n EmptyScriptTaskMessage = 'Run tests to check your code',\n}\n\nexport enum PersonalityAndCultureTestName {\n CultureAddSurvey = 'Culture add survey',\n MotivationTestSurvey = 'Motivation test survey',\n}\n\nexport enum TestKeyWord {\n Motivation = 'Motivation',\n}\n\nexport enum TestType {\n PersonalityAndCulture = 'Personality & culture',\n ProgrammingSkills = 'Programming skills',\n}\n\nexport enum TestFormat {\n MultipleChoice = 'Multiple-choice',\n Coding = 'Coding',\n Typing = 'Typing',\n Questionnaire = 'Questionnaire',\n Simulation = 'Simulation',\n}\n\nexport enum TestDurations {\n ZeroToTenMinutes = 'Up to 10 mins',\n ElevenToTwentyMinutes = '11 to 20 mins',\n TwentyoneToThirtyMinutes = '21 to 30 mins',\n ThirtyoneTosixtyMinutes = '31 to 60 mins',\n}\n\nexport enum TestsCount {\n ZeroTests = '0 added',\n OneTests = '1 test',\n TwoTests = '2 added',\n ThreeTests = '3 test',\n FourTests = '4 test',\n FiveTests = '5 added',\n}\n\nexport enum TestFilterNames {\n Library = 'Show tests from',\n RoleSpecific = 'Skills for',\n Focus = 'Focus',\n Duration = 'Duration',\n Format = 'Format',\n Highlights = 'Highlights',\n}\n\nexport enum CodingQuestions {\n Python = 'Python',\n}\n\nexport enum CreateCodingTestHeaders {\n FunctionSignature = 'Function signature',\n InitialCode = 'Initial code',\n TestCases = 'Test cases',\n VerificationCode = 'Verification code',\n}\n\nexport enum PracticeQuestions {\n AttentionToDetail = 'info This is the first practice question. You are in charge of sending invitations for a class reunion next month. You compare the address on file for one participant with the address available in the yearbook, which are as shown below',\n CodingQuestion = 'The purpose of this question is to show you how coding tests work. You are not being scored for anything in this question.',\n EnglishProficiency = 'Read the text and choose the synonym of the underlined word.',\n RubyOnRails = 'Which of the available queries returns the authors who have written at least one book?',\n}\n","export enum PageSize {\n Ten = 10,\n TwentyFive = 25,\n Fifty = 50,\n}\n\nexport enum MyAssessmentTableHeader {\n DateCreated = 'Job Created',\n LastActivity = 'Last activity',\n}\n\nexport enum TalentAssessmentTableHeader {\n CompanyName = 'COMPANY NAME',\n InvitedOn = 'INVITED ON',\n LastActivity = 'LAST ACTIVITY',\n}\n\nexport enum Sort {\n Ascending = 'ascending',\n Decending = 'descending',\n}\n\nexport enum MenuItem {\n TeamManagement = 'Team Management',\n Integrations = 'Integrations',\n MyCompany = 'My company',\n Logout = 'Log out',\n PlanAndBilling = 'Plan & billing',\n MyProfile = 'My profile',\n // Restricted roles (e.g. Hiring Manager) label the account-menu entry \"Profile\";\n // the substring also matches the full-access \"My profile\" label.\n AccountProfile = 'Profile',\n LogOut = 'Log out',\n Notifications = 'Notifications',\n AssessmentSettings = 'Settings',\n}\n\nexport enum SideNavItem {\n Home = 'Home',\n Jobs = 'Jobs',\n Sourcing = 'Sourcing',\n Candidates = 'Candidates',\n Analytics = 'Analytics',\n TestLibrary = 'Test library',\n WhatsNew = \"What's new\",\n HelpCenter = 'Help center',\n}\n\nexport enum Colour {\n Black = '#000000',\n}\n\nexport enum Benchmark {\n PercentageCorrect = 'Percentage of correct answers',\n AllCandidates = 'All candidates',\n Percentile = 'Percentile',\n}\n\nexport enum HiringStage {\n Interviewed = 'Interviewed',\n Hired = ' Hired 🎉',\n}\n\nexport enum CheatingMonitorList {\n DeviceUsed = 'Device used\\nDesktop',\n WebcamEnabled = 'Webcam enabled?\\nYes',\n FullScreenMode = 'Full-screen mode always active?\\nYes',\n MousePosition = 'Mouse always in assessment window?\\nYes',\n}\n\nexport enum DownloadFormat {\n Csv = 'CSV',\n Excel = 'Excel',\n Pdf = 'PDF',\n}\n\nexport enum URLs {\n TestGorillaPublicUrl = 'https://www.testgorilla.com/',\n TestGorillaPublicPage = 'TestGorilla',\n TestGorillaHelpPage = 'Help center',\n TestGorillaFacebook = 'Facebook',\n TestGorillaInstagram = 'Instagram',\n TestGorillaLinkedin = 'LinkedIn',\n Support = 'support.testgorilla.com',\n CandidateSupport = 'candidates.testgorilla.com',\n CandidateHub = 'talent-staging.testgorilla.com/create-account',\n TasOldFlow = 'https://assessment.testgorilla.com/testtaker/takeinvitation/',\n TasNewFlow = 'https://talent-assessment.testgorilla.com/',\n privacyPolicyLink = 'https://www.testgorilla.com/terms/privacy-policy',\n CandidateTerms = 'https://www.testgorilla.com/candidate-terms',\n}\n\nexport enum CreatingAssessmentsSteps {\n Step1 = 'Job details',\n Step2 = 'Assessment',\n Step3 = 'Configuration',\n Step4 = 'Finalize',\n}\n\nexport enum TestGorillaTheme {\n BgColor = '#d410aa',\n}\n","export enum AssessmentStatus {\n Completed = 'Completed',\n Invited = 'Invited',\n Closed = 'Closed',\n}\n\nexport enum AssessmentResultStatus {\n Unavailable = 'Unavailable',\n}\n\nexport enum Pronoun {\n HeHim = 'He/Him',\n}\n\nexport enum JobSearchStatus {\n ActivelySearching = 'Actively searching',\n OpenToNewChallenges = 'Open to new challenges',\n NotLookingRightNow = 'Not looking right now',\n}\n\nexport enum Proficiency {\n None = 'None',\n}\n\nexport enum CandidateStatusFilters {\n Started = 'Started',\n Invited = 'Invitation delivered',\n Completed = 'Completed',\n}\n\nexport enum CandidateMeta {\n TestInfoTimerText = 'Please stay on this screen. The timer for your next test has started and cannot be paused. The timer continues if you close the browser.',\n TestInfoTimer30MText = 'Please stay on this screen. The timer for your next test has started and cannot be paused. The timer continues if you close the browser.',\n TestInfoTimerPlainText = 'Please stay on this screen. The timer for your next test has started and cannot be paused. You must complete this test in the next ',\n TestInfoTimerTextTasFlow = 'Please stay on this screen. The timer for your next test has started and cannot be paused. The timer continues even when you close the browser.',\n}\n\nexport enum BehaviourLogFlags {\n DeviceUsed = 'Device used',\n FilledOutOnceFromIP = 'Filled out only once from IP address?',\n WebcamAlwaysEnabled = 'Webcam always enabled?',\n FullScreenExit = 'Full-screen mode exit',\n TabSwitch = 'Tab switch',\n DevToolsOpened = 'Developer tools opened',\n}\n\nexport enum TalentFilters {\n JobRole = 'Kitchen Assistant',\n LocationName = 'Lusaka, Zambia',\n YearsOfExperience = '10',\n MinSalary = '125000',\n MaxSalary = '395000',\n MinSalaryDefault = '0',\n MaxSalaryDefault = '500000',\n SalaryType = 'Annually',\n}\n\nexport enum KitchenAssistantTalentDetails {\n JobRole = 'Kitchen Assistant',\n LocationName = 'Lusaka, Zambia',\n Salary = '$30,000/yr',\n YearsOfExperience = '15 years exp.',\n JobTitle = 'Kitchen Assistant at Kitchen Company',\n}\n\nexport enum DogTrainerTalentDetails {\n JobRole = 'Dog Trainer',\n LocationName = 'Sydney, Australia',\n Salary = '$60,000/yr',\n YearsOfExperience = '30 years exp.',\n JobTitle = 'Dog trainer at Dog trainer organization',\n WorkExperienceTitle = 'Dog trainer',\n WorkExperienceDescription = 'Training dogs',\n VerifiedSkill_1 = 'HTML5',\n}\n\nexport enum SourcingInvitationMessage {\n Custom = 'Hello, \\n\\n we would like to invite you. Please find the details below. \\n Details',\n}\n","export enum IntegrationsImageSrc {\n Breezy = 'assets/integrations/brz.png',\n GreenHouse = 'assets/integrations/ghs.png',\n JazzHR = 'assets/integrations/jhr.png',\n Personio = 'assets/integrations/psn.png',\n Recruitee = 'assets/integrations/rct.png',\n}\n\nexport enum Integrations {\n Breezy = 'Breezy',\n GreenHouse = 'Greenhouse',\n JazzHR = 'JazzHR',\n Recruitee = 'Recruitee',\n}\n","export enum OneWayInterviewQuestionName {\n SellingAPen = 'Selling a pen',\n PrioritizingTasks = 'Prioritizing tasks',\n TacklingChallenges = 'Tackling challenges',\n ExceedingExpectations = 'Exceeding expectations',\n}\n\nexport enum CustomQuestionName {\n Video = 'Video',\n Essay = 'Essay',\n MultipleChoice = 'Multiple-choice',\n FileUpload = 'File upload',\n Code = 'Code',\n AllQuestionCategories = 'Select all question categories',\n PriorExperience = 'Prior experience',\n Motivation = 'Motivation',\n SoftSkills = 'Soft skills',\n JobSkills = 'Job skills',\n Finance = 'Finance',\n CustomerService = 'Customer service',\n Sales = 'Sales',\n Marketing = 'Marketing',\n IT = 'IT',\n AdministrativeSupport = 'Administrative support',\n Management = 'Management',\n SellingAPen = 'Selling a pen',\n TacklingChallenges = 'Tackling challenges',\n HandlingUnreasonableRequests = 'Handling unreasonable requests',\n}\n\nexport enum CustomQuestionDescription {\n SellingAPen = 'Sell me the first pen within reach.',\n TacklingChallenges = 'Describe an especially difficult assignment or project you have worked on. What was your role? How did you approach the requirements, and what was the outcome?',\n HandlingUnreasonableRequests = 'Describe a time when you had to handle an unfair or unreasonable complaint or a request from a customer. What did the customer ask, and how did you handle it?',\n}\n\nexport enum Duration {\n ThirtySeconds = '30 secs',\n FiveMinutes = '5 mins',\n TwoMinutes = '2 mins',\n TenMinutes = '10 mins',\n ZeroMinutes = '0 mins',\n SixMinutes = '6 mins',\n FifteenMinutes = '15 mins',\n FiftyFiveMinues = '55 mins',\n FiftyMinues = '50 mins',\n FortyMinutes = '40 mins',\n FortyTwoMinutes = '42 mins',\n FortyFourMinutes = '44 mins',\n FiftyNineMinutes = '59 mins',\n FiftyFourMinutes = '54 mins',\n FiftyEightMinutes = '58 mins',\n SixtyNineMinutes = '69 mins',\n SeventyThreeMinutes = '73 mins',\n}\n\nexport enum CustomQuestionsFilters {\n Assessment = 'Assessment name',\n Library = 'Library',\n Format = 'Format',\n Topic = 'Topic',\n RoleSpecific = 'Role specific',\n}\n\nexport enum CustomQuestions {\n TestGorillaLibrary = 'TestGorilla library',\n MyLibrary = 'My library',\n AddingValue = 'Adding value',\n AddingValueDescription = 'How do you plan to add value to this organization?',\n HowAreYou = 'How are you?',\n WhereAreYouFrom = 'Where are you from?',\n UploadYourResume = 'Upload your resume',\n ValidateRegex = 'Validate Regex',\n CreateIntroVideo = 'Create intro video of yourself',\n IntroducingYourself = 'Introducing yourself',\n TacklingChallenges = 'Tackling challenges',\n TacklingChallengesDescription = 'Describe an especially difficult assignment or project you have worked on. What was your role? How did you approach the requirements, and what was the outcome?',\n}\n\nexport enum CustomQuestionsContent {\n IntroducingYourself = \"Introduce yourself in 60 seconds and explain why you're a great\",\n AddingValue = 'How do you plan to add value to this organization?',\n FailingToDeliver = \"Tell me about a time when you didn't deliver on your key objectives. What did you learn?\",\n FindingAGreaterPurpose = 'How would working in this role help you fulfill a greater personal purpose?',\n WorkingCrossFunctionally = 'How do you transcend your role as a finance professional and interact cross-functionally with people in other departments?',\n}\n","export enum City {\n Ardamata = 'Ardamata',\n Aiea = 'Aiea',\n Nairobi = 'Nairobi',\n}\n\nexport enum Cities {\n Amsterdam = 'Amsterdam',\n London = 'London',\n Nairobi = 'Nairobi',\n MexicoCity = 'Mexico City',\n Berlin = 'Berlin',\n}\n\nexport enum Countries {\n Zambia = 'Zambia',\n Australia = 'Australia',\n}\n\nexport enum WorkArrangements {\n Remote = 'Remote',\n Hybrid = 'Hybrid',\n OnSite = 'On/Site',\n}\n\nexport enum JobRoles {\n NetDeveloper = '.NET Developer',\n AcademicEditor = 'Academic Editor',\n FullStackDeveloper = 'Full Stack Developer',\n AccountManager = 'Account Manager',\n AcademicSupportOfficer = 'Academic Support Officer',\n PythonDeveloper = 'Python Developer',\n Developer = 'Developer',\n EssentialSkillsTemplate = 'Essential Skills Template',\n DataAnalyst = 'Data Analyst',\n}\n\nexport enum AcademicEditorTemplate {\n AcademicEditor = 'Communication Culture English Working ',\n}\n","export enum CompanyName {\n Testgorilla = 'TestGorilla',\n}\n\nexport enum Currency {\n USD = 'USD',\n}\n\nexport enum Plans {\n PayAsYouGo = 'Pay as you go',\n Scale = 'Scale',\n Business = 'Business',\n Free = 'Free',\n Starter = 'Starter',\n Pro = 'Pro',\n Lite = 'Lite',\n Core = 'Core',\n}\n\nexport enum TeamRoles {\n HiringManager = 'Hiring Manager',\n Admin = 'Admin',\n Recruiter = 'Recruiter',\n Owner = 'Owner',\n}\n\nexport enum PasswordStrengthTexts {\n LowerCharacter = 'contains at least one lower character',\n UpperCharacter = 'contains at least one upper character',\n DigitCharacter = 'contains at least one digit',\n SpecialCharacter = 'contains at least one special character',\n CountText = 'contains at least 12 characters',\n LowerCaseNew = 'Contains at least one lowercase',\n UpperCaseNew = 'Contains at least one uppercase',\n DigitNew = 'Contains at least one number',\n SpecialCharacterNew = 'Contains at least one special character',\n CountTextNew = 'Contains at least 12 characters',\n}\n","export enum Language {\n English = 'English',\n French = 'French',\n Dutch = 'Dutch',\n German = 'German',\n Spanish = 'Spanish',\n Italian = 'Italian',\n Japanese = 'Japanese',\n PortugueseBrazil = 'Portuguese (Brazil)',\n Danish = 'Danish',\n Norwegian = 'Norwegian',\n Polish = 'Polish',\n Swedish = 'Swedish',\n}\n\nexport const LanguageCode: Record<Language, string> = {\n [Language.English]: 'en',\n [Language.French]: 'fr',\n [Language.Dutch]: 'nl',\n [Language.German]: 'de',\n [Language.Spanish]: 'es',\n [Language.Italian]: 'it',\n [Language.Japanese]: 'ja',\n [Language.PortugueseBrazil]: 'pt-br',\n [Language.Danish]: 'da',\n [Language.Norwegian]: 'nb',\n [Language.Polish]: 'pl',\n [Language.Swedish]: 'sv',\n};\n","/**\n * Single source of truth for evaluation tools\n * Contains display names, labels, and step-specific names\n */\nexport const EVALUATION_TOOLS = {\n SkillsTests: {\n displayName: 'Skills tests',\n label: 'evaluation_tool_skill_test',\n step4Name: 'Tests',\n },\n CustomQuestions: {\n displayName: 'Custom questions',\n label: 'evaluation_tool_custom_questions',\n step4Name: 'Custom questions',\n },\n AIVideoInterview: {\n displayName: 'AI interview',\n label: 'evaluation_tool_two_ways_ai_interview',\n step4Name: 'AI interview',\n },\n AIResumeScoring: {\n displayName: 'Resume scoring',\n label: 'evaluation_tool_ai_resume',\n step4Name: 'Resume scoring',\n },\n OneWayInterview: {\n displayName: 'Video questions',\n label: 'evaluation_tool_one_way_ai_interview',\n step4Name: 'Video questions',\n },\n QualifyingQuestions: {\n displayName: 'Qualifying questions',\n label: 'evaluation_tool_knockout_questions',\n step4Name: 'Qualifying questions',\n },\n} as const;\n\n// Type-safe accessors for the unified definition\nexport type EvaluationToolKey = keyof typeof EVALUATION_TOOLS;\n\n// Helper type to get display name values\nexport type EvaluationToolDisplayName = (typeof EVALUATION_TOOLS)[EvaluationToolKey]['displayName'];\n\n// Helper type to get label values\nexport type EvaluationToolLabel = (typeof EVALUATION_TOOLS)[EvaluationToolKey]['label'];\n\n// Helper type to get step4 name values\nexport type EvaluationToolStep4Name = (typeof EVALUATION_TOOLS)[EvaluationToolKey]['step4Name'];\n"],"mappings":"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","names":["env","accounts","baseURL","ephemeralPrefix","ephemeralId","isEphemeralEnvironment","environment","adminURL","TestName","ProgrammingLanguages","CodingTaskOutput","PersonalityAndCultureTestName","TestKeyWord","TestType","TestFormat","TestDurations","TestsCount","TestFilterNames","CodingQuestions","CreateCodingTestHeaders","PracticeQuestions","PageSize","MyAssessmentTableHeader","TalentAssessmentTableHeader","Sort","MenuItem","SideNavItem","Colour","Benchmark","HiringStage","CheatingMonitorList","DownloadFormat","URLs","CreatingAssessmentsSteps","TestGorillaTheme","AssessmentStatus","AssessmentResultStatus","Pronoun","JobSearchStatus","Proficiency","CandidateStatusFilters","CandidateMeta","BehaviourLogFlags","TalentFilters","KitchenAssistantTalentDetails","DogTrainerTalentDetails","SourcingInvitationMessage","IntegrationsImageSrc","Integrations","OneWayInterviewQuestionName","CustomQuestionName","CustomQuestionDescription","Duration","CustomQuestionsFilters","CustomQuestions","CustomQuestionsContent","City","Cities","Countries","WorkArrangements","JobRoles","AcademicEditorTemplate","CompanyName","Currency","Plans","TeamRoles","PasswordStrengthTexts","Language"]}

@@ -65,4 +65,4 @@ import {

WorkArrangements
} from "./chunk-U7YT53U2.mjs";
import "./chunk-DW4V5VUB.mjs";
} from "./chunk-B64Y5SGV.mjs";
import "./chunk-TJHUXULD.mjs";
export {

@@ -69,0 +69,0 @@ AcademicEditorTemplate,

@@ -11,3 +11,3 @@ import {

writeSetupFailureFlag
} from "./chunk-XW3CPEDR.mjs";
} from "./chunk-6HR5SXUC.mjs";
import {

@@ -19,4 +19,4 @@ createFileSessionStore,

import "./chunk-ATYQC4YE.mjs";
import "./chunk-U7YT53U2.mjs";
import "./chunk-DW4V5VUB.mjs";
import "./chunk-B64Y5SGV.mjs";
import "./chunk-TJHUXULD.mjs";
export {

@@ -23,0 +23,0 @@ AssessmentArchiver,

@@ -28,3 +28,3 @@ var __defProp = Object.defineProperty;

// src/config/resolve.ts
var EPHEMERAL_PREFIX_PATTERN = /https?:\/\/(backend|talent-api)-(\d+)-[^.]+\.dev\.testgorilla\.com/;
var EPHEMERAL_PREFIX_PATTERN = /https?:\/\/(.+?)-(\d+)-[^.]+\.dev\.testgorilla\.com/;
var LOCAL_MAILHOG_URL = "http://localhost:8025";

@@ -92,5 +92,11 @@ function defineRequiredSecret(target, property, value, envVar) {

const ephemeralMatch = baseURL2.match(EPHEMERAL_PREFIX_PATTERN);
const ephemeralPrefix2 = ephemeralMatch ? ephemeralMatch[1] : null;
const ephemeralId2 = ephemeralMatch ? ephemeralMatch[2] : null;
const isEphemeralEnvironment2 = !!ephemeralId2;
const declaredEnvironment = env2.E2E_ENVIRONMENT?.toLowerCase();
const isEphemeralEnvironment2 = declaredEnvironment ? declaredEnvironment === "ephemeral" : !!ephemeralMatch;
if (isEphemeralEnvironment2 && !ephemeralMatch) {
throw new Error(
`[e2e-framework] E2E_ENVIRONMENT=ephemeral but baseURL "${baseURL2}" does not match <prefix>-<id>-<service>.dev.testgorilla.com \u2014 sibling service URLs cannot be derived.`
);
}
const ephemeralPrefix2 = isEphemeralEnvironment2 && ephemeralMatch ? ephemeralMatch[1] : null;
const ephemeralId2 = isEphemeralEnvironment2 && ephemeralMatch ? ephemeralMatch[2] : null;
const environment2 = baseURL2.split(".testgorilla.com")[0].split("https://")[1] || "staging";

@@ -97,0 +103,0 @@ const adminURL2 = env2.adminURL || (isEphemeralEnvironment2 ? `https://${ephemeralPrefix2}-${ephemeralId2}-backend.dev.testgorilla.com` : environment2 === "app" ? `https://new-admin.testgorilla.com` : `https://${environment2}-new-admin.testgorilla.com`);

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/stubs/index.ts","../src/config/resolve.ts","../src/config/algolia.ts","../src/config/constants.ts","../src/config/index.ts","../src/stubs/subscriptions/business-eur.json","../src/stubs/subscriptions/core-eur.json","../src/stubs/subscriptions/free.json","../src/stubs/subscriptions/plus-eur.json","../src/stubs/subscriptions/pro-eur.json","../src/stubs/subscriptions/starter-eur.json","../src/stubs/currentSubscription.ts","../src/stubs/stubSubscription.ts"],"sourcesContent":["export { CurrentSubscription } from './currentSubscription';\nexport type { SubscriptionPlan } from './currentSubscription';\nexport { stubSubscription } from './stubSubscription';\n","import type { E2eAccounts, E2eConfig, E2eUrls } from './types';\n\n/**\n * Ephemeral environment detection.\n * Supported prefixes:\n * - `backend` → backend-led deployments (e.g. https://backend-1234-talent.dev.testgorilla.com)\n * - `talent-api` → Talent-app-led deployments (e.g. https://talent-api-1756-talent.dev.testgorilla.com)\n * Add a new alternative to the regex if/when another deployment prefix is introduced.\n */\nconst EPHEMERAL_PREFIX_PATTERN =\n /https?:\\/\\/(backend|talent-api)-(\\d+)-[^.]+\\.dev\\.testgorilla\\.com/;\n\nconst LOCAL_MAILHOG_URL = 'http://localhost:8025';\n\n/**\n * Build a lazily-throwing secret accessor: the property reads as a normal\n * string when the env var is set, and throws with setup guidance the first\n * time it is READ while unset. Importing the config never throws.\n *\n * Non-enumerable so JSON-serializing an E2eConfig (e.g. passing it through\n * `test.use` in playwright.config, which serializes options to workers) can\n * neither leak the credential nor trip the missing-env error.\n */\nfunction defineRequiredSecret(\n target: object,\n property: string,\n value: string | undefined,\n envVar: string,\n): void {\n Object.defineProperty(target, property, {\n enumerable: false,\n configurable: true,\n get(): string {\n if (value === undefined || value === '') {\n throw new Error(\n `[e2e-framework] ${envVar} is not set. The framework ships no credential defaults — ` +\n `export ${envVar} (see your team's 1Password e2e .env entry) before running tests.`,\n );\n }\n return value;\n },\n });\n}\n\nfunction resolveAccounts(env: NodeJS.ProcessEnv): E2eAccounts {\n const nodeIndexedOrganizer = env.CIRCLE_NODE_TOTAL\n ? `dummy.tests+organizer${env.CIRCLE_NODE_INDEX}@testgorilla.com`\n : `dummy.tests+organizer11@testgorilla.com`;\n const accountIndex = env.E2E_ACCOUNT_INDEX;\n\n const accounts = {\n organizerEmail:\n env.userEmail ??\n (accountIndex !== undefined\n ? `dummy.tests+organizer${accountIndex}@testgorilla.com`\n : nodeIndexedOrganizer),\n candidateEmail: env.candidateEmail ?? 'dummy.tests@testgorilla.com',\n hiringManagerEmail: env.hiringManagerEmail ?? 'dummy.tests+hiringmanager01@testgorilla.com',\n recruiterEmail: env.recruiterEmail ?? 'dummy.tests+recruiter1@testgorilla.com',\n adminEmail: env.adminEmail ?? 'dummy.tests+admin1@testgorilla.com',\n newAdminEmail: env.newAdminEmail ?? 'dummy.tests+newadmin@testgorilla.com',\n freeUserEmail: env.freeUserEmail ?? 'dummy.tests+free0@testgorilla.com',\n corePlanUserEmail: env.corePlanUserEmail ?? 'dummy.tests+coreplan@testgorilla.com',\n plusPlanUserEmail: env.plusPlanUserEmail ?? 'dummy.tests+plus@testgorilla.com',\n proPlanUserEmail: env.proPlanUserEmail ?? 'dummy.tests+pro@testgorilla.com',\n businessPlanUserEmail: env.businessPlanUserEmail ?? 'dummy.tests+business@testgorilla.com',\n starterPlanUserEmail: env.starterPlanUserEmail ?? 'dummy.tests+starter@testgorilla.com',\n myProfileUserEmail: env.myProfileUserEmail ?? 'dummy.tests+myprofile@testgorilla.com',\n atsIntegrationsEmail:\n env.atsIntegrationsEmail ?? 'dummy.tests+ats-integrations@testgorilla.com',\n } as E2eAccounts;\n\n defineRequiredSecret(accounts, 'password', env.E2E_PASSWORD ?? env.e2e_password, 'E2E_PASSWORD');\n defineRequiredSecret(\n accounts,\n 'candidatePassword',\n env.E2E_CANDIDATE_PASSWORD,\n 'E2E_CANDIDATE_PASSWORD',\n );\n\n return accounts;\n}\n\nfunction resolveUrls(\n baseURL: string,\n ephemeralPrefix: string | null,\n ephemeralId: string | null,\n): E2eUrls {\n const isEphemeral = !!ephemeralId;\n const ephemeralHost = (service: string) =>\n `https://${ephemeralPrefix}-${ephemeralId}-${service}.dev.testgorilla.com`;\n const isProd = baseURL.includes('app.testgorilla');\n const isDev = baseURL.includes('dev.testgorilla');\n const isLocalhost = baseURL.includes('localhost');\n\n return {\n talentBase: isEphemeral\n ? ephemeralHost('talent')\n : isProd\n ? 'https://talent.testgorilla.com'\n : isDev\n ? 'https://talent-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4100'\n : 'https://talent-staging.testgorilla.com',\n talentAssessment: isEphemeral\n ? ephemeralHost('talent-assessment')\n : isProd\n ? 'https://talent-assessment.testgorilla.com'\n : isDev\n ? 'https://talent-assessment-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4100'\n : 'https://talent-assessment-staging.testgorilla.com',\n talentApi: isEphemeral\n ? ephemeralHost('api-talent')\n : isProd\n ? 'https://api-talent.testgorilla.com'\n : isDev\n ? 'https://api-talent-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4200'\n : 'https://api-talent-staging.testgorilla.com',\n codeRunnerApi: isProd\n ? 'https://cr-v2.testgorilla.com'\n : isDev\n ? 'https://cr-v2-dev.testgorilla.com'\n : 'https://cr-v2-staging.testgorilla.com',\n websiteBase: isProd\n ? 'https://www.testgorilla.com'\n : isDev && !isEphemeral\n ? 'https://website-dev.testgorilla.com'\n : 'https://website-staging.testgorilla.com',\n mailpit: isEphemeral ? ephemeralHost('mailpit') : LOCAL_MAILHOG_URL,\n localstack: isEphemeral ? ephemeralHost('localstack') : null,\n };\n}\n\n/**\n * Resolve the full e2e run configuration from environment variables, using\n * TestGorilla's environment naming conventions (staging default, ephemeral\n * `backend-<id>` / `talent-api-<id>` dev deployments, production `app`).\n *\n * Pure with respect to its input: pass a custom env for testing; defaults to\n * `process.env`. Never throws on missing secrets — required credentials\n * (`E2E_PASSWORD`, `E2E_CANDIDATE_PASSWORD`) throw with guidance only when\n * first read.\n */\nexport function resolveTgEnvironment(env: NodeJS.ProcessEnv = process.env): E2eConfig {\n const baseURL = env.baseURL || 'https://staging.testgorilla.com';\n\n const ephemeralMatch = baseURL.match(EPHEMERAL_PREFIX_PATTERN);\n const ephemeralPrefix = (ephemeralMatch ? ephemeralMatch[1] : null) as\n | 'backend'\n | 'talent-api'\n | null;\n const ephemeralId = ephemeralMatch ? ephemeralMatch[2] : null;\n const isEphemeralEnvironment = !!ephemeralId;\n\n const environment = baseURL.split('.testgorilla.com')[0].split('https://')[1] || 'staging';\n\n const adminURL =\n env.adminURL ||\n (isEphemeralEnvironment\n ? `https://${ephemeralPrefix}-${ephemeralId}-backend.dev.testgorilla.com`\n : environment === 'app'\n ? `https://new-admin.testgorilla.com`\n : `https://${environment}-new-admin.testgorilla.com`);\n\n const isProd = baseURL.includes('app.testgorilla');\n const isDev = baseURL.includes('dev.testgorilla');\n const isLocalhost = baseURL.includes('localhost');\n\n return {\n baseURL,\n environment,\n isEphemeralEnvironment,\n ephemeralPrefix,\n ephemeralId,\n isLocalEnvironment: env.localEnvironment === 'true' || isEphemeralEnvironment,\n adminURL,\n urls: resolveUrls(baseURL, ephemeralPrefix, ephemeralId),\n emails: {\n signupFrom: isProd\n ? 'hello@testgorilla.com'\n : isLocalhost\n ? 'noreply@example'\n : isDev || isEphemeralEnvironment\n ? 'hello@maildev.testgorilla.com'\n : 'hello@mailstaging.testgorilla.com',\n assessmentsFrom: isProd\n ? 'assessments@testgorilla.com'\n : isLocalhost\n ? 'assessments@example.com'\n : isDev || isEphemeralEnvironment\n ? 'assessments@maildev.testgorilla.com'\n : 'assessments@mailstaging.testgorilla.com',\n },\n accounts: resolveAccounts(env),\n };\n}\n","/**\n * Algolia Configuration\n *\n * Test-library search used during assessment creation. The bundled defaults\n * are the same index-restricted, search-only keys the customer frontend ships\n * to browsers (not admin keys); override any of them via the ALGOLIA_* env\n * vars below without a code change (e.g. on key rotation).\n */\n\nimport { baseURL, isEphemeralEnvironment } from './index';\n\nconst ALGOLIA_APP_ID = process.env.ALGOLIA_APP_ID || 'V8Y626J4K8';\n\n// Algolia Index Names\nconst ALGOLIA_PROD_INDEX = process.env.ALGOLIA_PROD_INDEX || 'production_tests_index';\nconst ALGOLIA_STAGING_INDEX = process.env.ALGOLIA_STAGING_INDEX || 'staging_tests_index';\nconst ALGOLIA_EPHEMERAL_INDEX = process.env.ALGOLIA_EPHEMERAL_INDEX || 'ephemeral_tests_index';\n\n// Algolia API Keys (search-only, restricted to the specific indices)\nconst ALGOLIA_PROD_API_KEY =\n process.env.ALGOLIA_PROD_API_KEY ||\n 'NDc2N2JlMmY5ZGE2NzM4NDIwOWM2ODkyMWY0Yjk5YjYyNTA5NTViNDg2YzNlN2VlZDE4MmYyOWE3YmRjNjg1ZXJlc3RyaWN0SW5kaWNlcz1wcm9kdWN0aW9uX3Rlc3RzX2luZGV4';\nconst ALGOLIA_STAGING_API_KEY =\n process.env.ALGOLIA_STAGING_API_KEY ||\n 'ZjZmYWMwYjNkN2IxZjViYzA0OTZkZGE3OWY5MmVjYWMzN2RlYWJlYjcyOWRlMWQ3YjMwM2RjYjk0NDNjZGY0MXJlc3RyaWN0SW5kaWNlcz1zdGFnaW5nX3Rlc3RzX2luZGV4';\nconst ALGOLIA_EPHEMERAL_API_KEY =\n process.env.ALGOLIA_EPHEMERAL_API_KEY || '5beea78e78134e8270214f93b7032e7b';\n\n/**\n * Returns environment-specific Algolia API URL\n */\nexport const getAlgoliaUrl = (): string => {\n const isProduction = baseURL.includes('app.testgorilla');\n\n if (isEphemeralEnvironment) {\n return `https://v8y626j4k8-dsn.algolia.net/1/indexes/${ALGOLIA_EPHEMERAL_INDEX}/query`;\n }\n\n const index = isProduction ? ALGOLIA_PROD_INDEX : ALGOLIA_STAGING_INDEX;\n const domain = isProduction ? 'algolianet.com' : 'algolia.net';\n const subdomain = isProduction ? 'v8y626j4k8-2' : 'v8y626j4k8-dsn';\n\n return `https://${subdomain}.${domain}/1/indexes/${index}/query`;\n};\n\n/**\n * Returns environment-specific Algolia API headers\n */\nexport const getAlgoliaHeaders = (): Record<string, string> => {\n const isProduction = baseURL.includes('app.testgorilla');\n\n let apiKey: string;\n if (isEphemeralEnvironment) {\n apiKey = ALGOLIA_EPHEMERAL_API_KEY;\n } else {\n apiKey = isProduction ? ALGOLIA_PROD_API_KEY : ALGOLIA_STAGING_API_KEY;\n }\n\n return {\n 'content-type': 'application/x-www-form-urlencoded',\n 'x-algolia-api-key': apiKey,\n 'x-algolia-application-id': ALGOLIA_APP_ID,\n };\n};\n","/**\n * Constants & Retries\n *\n * Contains global retry counters and other application constants.\n */\n\nimport { env } from 'process';\n\n// Retry counters - used to determine retry behavior in tests\nexport const DEFAULT_RETRY_COUNTER = 10;\nexport const INCREASED_RETRY_COUNTER_50 = DEFAULT_RETRY_COUNTER * 1.5;\nexport const INCREASED_RETRY_COUNTER_80 = DEFAULT_RETRY_COUNTER * 1.8;\nexport const INCREASED_RETRY_COUNTER_200 = DEFAULT_RETRY_COUNTER * 2;\nexport const INCREASED_RETRY_COUNTER_300 = DEFAULT_RETRY_COUNTER * 3;\n\n// Logger configuration. Default: WARN both in CI and locally — opt in to INFO for milestones\n// or DEBUG for per-request chatter via the LOG_LEVEL env var.\n// API_LOG_LEVEL / API_LOG_FILE are accepted for back-compat with a one-time deprecation note.\nconst rawLogLevel = env.LOG_LEVEL?.toUpperCase() || env.API_LOG_LEVEL?.toUpperCase() || 'WARN';\nif (!env.LOG_LEVEL && env.API_LOG_LEVEL && !env._LOG_DEPRECATION_WARNED) {\n process.stderr.write(\n '[logger] API_LOG_LEVEL is deprecated; use LOG_LEVEL instead (same values).\\n',\n );\n env._LOG_DEPRECATION_WARNED = '1';\n}\nexport const logLevel = rawLogLevel as 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'NONE';\nexport const logFile = env.LOG_FILE || env.API_LOG_FILE || '';\n\n// Back-compat aliases — prefer logLevel / logFile in new code.\nexport const apiLogLevel = logLevel;\nexport const apiLogFile = logFile;\n\n// Assessment configuration — the name→id map published by global setup\n// (process.env.assessments; see @testgorilla/e2e-framework/setup).\nexport const assessmentList = JSON.parse(env.assessments || '{}');\n\n// Other constants\nexport const MAILPIT_SERVER = 'http://localhost:8025';\nexport const simpleAssessmentName = `New Simple Assessment - ${Date.now()}`;\nexport const invitationEmailSubject = 'Your application at TestGorilla';\n\n// Email reception tracking\nexport const emailReception = { slowEmailAPI: false };\n","/**\n * Compatibility surface over {@link resolveTgEnvironment}.\n *\n * Every export here preserves the NAME and SHAPE (const vs function) of the\n * corresponding export in tgo-qa-automation's `helpers/config`, so consumers\n * migrate with a module-specifier-only import rewrite. The values come from a\n * single module-load resolution of `process.env` — the same timing the suite\n * relies on today (env is inherited by every Playwright worker process).\n *\n * Credentials ship with NO defaults: `password` is empty when `E2E_PASSWORD`\n * is unset (the structured `accounts.password` accessor throws with guidance\n * instead).\n */\nimport { resolveTgEnvironment } from './resolve';\nimport { getRunId } from './runId';\n\nexport type { E2eAccounts, E2eConfig, E2eUrls } from './types';\nexport { resolveTgEnvironment } from './resolve';\n\nconst cfg = resolveTgEnvironment();\n\n// --- Environment & URLs (parity with helpers/config/environment.ts) ---\n\nexport const baseURL = cfg.baseURL;\nexport const environment = cfg.environment;\nexport const isEphemeralEnvironment = cfg.isEphemeralEnvironment;\nexport const ephemeralPrefix = cfg.ephemeralPrefix;\nexport const ephemeralId = cfg.ephemeralId;\nexport const isLocalEnvironment = cfg.isLocalEnvironment;\nexport const adminURL = cfg.adminURL;\nexport const localMailHogURL = 'http://localhost:8025';\n\n/** Returns environment-specific mailpit (ephemeral) or local MailHog URL. */\nexport const mailpitURL = (): string => cfg.urls.mailpit;\n\n/**\n * Returns the LocalStack URL for the current ephemeral environment, or `null`\n * when not running against one.\n */\nexport const localstackURL = (): string | null => cfg.urls.localstack;\n\n/** Returns environment-specific talent base URL. */\nexport const talentBaseURL = (): string => cfg.urls.talentBase;\n\n/** Returns environment-specific talent assessment URL. */\nexport const talentAssessmentURL = (): string => cfg.urls.talentAssessment;\n\n/** Returns environment-specific talent API URL. */\nexport const talentApiURL = (): string => cfg.urls.talentApi;\n\n/** Returns environment-specific code runner API URL. */\nexport const codeRunnerApiURL = (): string => cfg.urls.codeRunnerApi;\n\n/** Returns environment-specific website base URL. */\nexport const websiteBaseURL = (): string => cfg.urls.websiteBase;\n\n/** Returns environment-specific signup sender address. */\nexport const signupFromEmail = (): string => cfg.emails.signupFrom;\n\n/** Returns environment-specific assessments sender address. */\nexport const assessmentsFromEmail = (): string => cfg.emails.assessmentsFrom;\n\n/** Check if current environment is NOT staging. */\nexport const ifNotStagingRun = (): boolean => !cfg.baseURL.includes('staging.testgorilla');\n\n/**\n * Check if current environment is NEITHER staging NOR an ephemeral dev env.\n * Use this to skip tests that depend on the website → app signup flow.\n */\nexport const ifNotStagingOrEphemeralRun = (): boolean =>\n ifNotStagingRun() && !cfg.isEphemeralEnvironment;\n\n/** Check if current environment is NOT localhost. */\nexport const ifNotLocalhostRun = (): boolean => !cfg.baseURL.includes('localhost');\n\n/**\n * Rewrites a signup URL produced by the marketing website (which always\n * points at app.testgorilla.com) so it targets the current environment.\n */\nexport const rewriteSignupUrlForEnv = (signupUrl: string): string => {\n const targetHost = new URL(cfg.baseURL).host;\n return signupUrl.replace(/app\\.testgorilla\\.com/i, targetHost);\n};\n\n// --- Environment URL constants (parity with helpers/config/environment.ts) ---\n\nexport const prodTesttakerUrlString = 'https://assessment.testgorilla.com';\nexport const prodTASUrlString = 'https://talent-assessment.testgorilla.com';\nexport const stageTesttakerUrlString = 'https://staging-assessment.testgorilla.com';\nexport const stageTASUrlString = 'https://talent-assessment-staging.testgorilla.com';\nexport const devTASUrlString = 'https://talent-assessment-dev.testgorilla.com';\nexport const localTASUrlString = 'http://localhost:4100';\nexport const stagingTASAPIUrl = 'https://api-talent-staging.testgorilla.com';\n\n// --- Seed assessment names (product constants, non-secret) ---\n\nexport const CandidateInviteAssessment = 'Candidate-Invite-Assessment-4-Do-not-archive';\nexport const candidateExpiredAssessment = 'Candidate-Expired-Assessment-1-Do-not-archive';\nexport const candidateArchivedAssessment = 'Candidate-Archived-Assessment-1-Do-not-archive';\nexport const tasSimpleMcqAssessment = 'TAS-MCQ-Assessment';\nexport const tasCustomTestAssessment = 'TAS-Custom-Test-Assessment';\nexport const tasSimpleBulkAssessment = 'TAS-Bulk-Assessment';\n\n// --- Test accounts (parity with helpers/config/testAccounts.ts, secrets stripped) ---\n\n/** Structured account set; `accounts.password` throws with guidance if `E2E_PASSWORD` is unset. */\nexport const accounts = cfg.accounts;\n\n/** Main organizer account email for this run. */\nexport const email = cfg.accounts.organizerEmail;\n\n/**\n * Organizer password from `E2E_PASSWORD` (legacy `e2e_password`). Empty string\n * when unset — the framework ships no credential defaults. Prefer\n * `accounts.password`, which throws with setup guidance instead of silently\n * yielding ''.\n */\nexport const password = process.env.E2E_PASSWORD ?? process.env.e2e_password ?? '';\n\nexport const candidateEmail = cfg.accounts.candidateEmail;\nexport const hiringManagerEmail = cfg.accounts.hiringManagerEmail;\nexport const recruiterEmail = cfg.accounts.recruiterEmail;\nexport const adminEmail = cfg.accounts.adminEmail;\nexport const newAdminEmail = cfg.accounts.newAdminEmail;\nexport const freeUserEmail = cfg.accounts.freeUserEmail;\nexport const corePlanUserEmail = cfg.accounts.corePlanUserEmail;\nexport const plusPlanUserEmail = cfg.accounts.plusPlanUserEmail;\nexport const proPlanUserEmail = cfg.accounts.proPlanUserEmail;\nexport const businessPlanUserEmail = cfg.accounts.businessPlanUserEmail;\nexport const starterPlanUserEmail = cfg.accounts.starterPlanUserEmail;\nexport const myProfileUserEmail = cfg.accounts.myProfileUserEmail;\nexport const atsIntegrationsEmail = cfg.accounts.atsIntegrationsEmail;\n\nconst EMAIL_DOMAIN = '@testgorilla.com';\nconst DUMMY_TESTS_PREFIX = 'dummy.tests';\n\n// Per-process tie-breaker so two mints in the same millisecond never collide.\nlet mintCounter = 0;\n\n/**\n * Unique, run-attributable suffix for generated identities:\n * `<runId>x<epoch36><counter>`. Embedding the run id makes every row on the\n * shared staging DB traceable to the CI workflow or local user that created\n * it, and lets purge jobs select marked data (.github/instructions/07-test-data.md).\n */\nconst mintSuffix = (): string => `${getRunId()}x${Date.now().toString(36)}${mintCounter++}`;\n\n/**\n * Generate a random candidate email.\n * Format: `dummy.tests+cand<rand><runId>x<timestamp>@testgorilla.com`.\n */\nexport const randCandidateEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+cand${rand}${mintSuffix()}${EMAIL_DOMAIN}`;\n\n/**\n * Generate a random customer email.\n * Format: `dummy.tests+cust<rand><runId>x<timestamp>@testgorilla.com`.\n */\nexport const randCustomerEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+cust${rand}${mintSuffix()}${EMAIL_DOMAIN}`;\n\n// --- Algolia, constants, recaptcha (parity with helpers/config) ---\n// Lazily circular: algolia/recaptcha read baseURL/isEphemeralEnvironment from\n// this barrel inside their functions only, never at module load.\n\nexport { getAlgoliaUrl, getAlgoliaHeaders } from './algolia';\nexport * from './constants';\nexport { getRecaptchaBypassKey, setRecaptchaBypassKeyProvider } from './recaptcha';\nexport type { RecaptchaKeyProvider } from './recaptcha';\n\n/**\n * Generate a random team-member email tagged with the current environment.\n * Format: `dummy.tests+t<rand><env>+<runId>x<timestamp>@testgorilla.com`.\n */\nexport const randTeamMemberEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+t${rand}${cfg.environment}+${mintSuffix()}${EMAIL_DOMAIN}`;\n\n// Random test-data generators (faker replacement) + username/phone utilities\nexport * from './randomData';\nexport { getRunId };\n","{\n \"name\": \"Base plan: Business EUR\",\n \"plan\": {\n \"name\": \"Base plan: Business EUR\",\n \"short_name\": \"Business\",\n \"chargebee_id\": \"Base-plan-tier-Business-EUR\",\n \"number_of_credits\": 12500,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"period\": \"year\",\n \"monthly_price\": 22200.0,\n \"addon_price\": 0.6,\n \"price_for_analytics\": 22200.0,\n \"legacy\": false,\n \"tier\": 6,\n \"fte_band\": null,\n \"trial_period\": null\n },\n \"legacy\": false,\n \"next_invoice\": \"2023-09-18\",\n \"addon_subscription\": {\n \"next_invoice\": \"2023-01-18\",\n \"additional_candidate_credits\": 0,\n \"additional_assessment_credits\": 42\n },\n \"is_trial\": false,\n \"subscription_id\": \"Azz5akTHt88pcmbU\",\n \"currency_code\": \"EUR\",\n \"change_pending\": false,\n \"next_plan\": null,\n \"next_plan_short_name\": null,\n \"active_chargebee_id\": \"Base-plan-tier-Business-EUR\",\n \"next_chargebee_id\": null,\n \"candidate_credits\": {\n \"initials_credits_included_in_the_plan\": 12500,\n \"credits_from_previous_plan\": 0,\n \"complimentary\": 0,\n \"consumed\": -1017,\n \"total_available\": 11483,\n \"additional_credit_price\": 0.6,\n \"general\": {\n \"cost\": 0.6,\n \"quantity\": 0\n },\n \"billed\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"paid\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"payment_due\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"unbilled_charges\": {\n \"amount\": 0.0,\n \"quantity\": 0\n }\n },\n \"assessment_credits\": {\n \"initials_credits_included_in_the_plan\": 125,\n \"credits_from_previous_plan\": 0,\n \"complimentary\": 0,\n \"consumed\": -603,\n \"total_available\": 0,\n \"additional_credit_price\": 80.0,\n \"general\": {\n \"cost\": 80.0,\n \"quantity\": 478\n },\n \"billed\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"paid\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"payment_due\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"unbilled_charges\": {\n \"amount\": 38240.0,\n \"quantity\": 478\n }\n },\n \"tier\": 6,\n \"renewal_date\": \"2025-09-18\"\n}\n","{\n \"plan\": {\n \"name\": \"Core EUR\",\n \"short_name\": \"Core\",\n \"chargebee_id\": \"gen4-plan-core-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 525,\n \"addon_price\": null,\n \"price_for_analytics\": 525.0,\n \"tier\": 120,\n \"fte_band\": null,\n \"trial_period\": null,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": false\n },\n \"credit_tier\": 450,\n \"credit_tier_price\": 1500.0,\n \"available_credits\": 450,\n \"status\": \"active\",\n \"is_scheduled_for_cancellation\": false,\n \"next_invoice\": \"2026-11-25\",\n \"next_change_date\": \"2026-11-25\",\n \"subscription_id\": \"169lVHV3YKGm9oUe\",\n \"change_pending\": false,\n \"next_plan\": {\n \"name\": \"Core EUR\",\n \"short_name\": \"Core\",\n \"chargebee_id\": \"gen4-plan-core-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 525,\n \"addon_price\": null,\n \"price_for_analytics\": 525.0,\n \"tier\": 120,\n \"fte_band\": null,\n \"trial_period\": null,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": false\n },\n \"renewal_date\": \"2026-11-25\",\n \"trial_end\": null,\n \"gtm_sync_required\": false,\n \"active_assessments_slots\": null,\n \"older_than_two_months\": false\n}\n","{\n \"status\": null,\n \"change_pending\": false,\n \"renewal_date\": null,\n \"trial_end\": null,\n \"gtm_sync_required\": false,\n \"active_assessments_slots\": null\n}\n","{\n \"plan\": {\n \"name\": \"Plus EUR\",\n \"short_name\": \"Plus\",\n \"chargebee_id\": \"gen4-plan-plus-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 4300,\n \"addon_price\": null,\n \"price_for_analytics\": 4300.0,\n \"tier\": 130,\n \"fte_band\": null,\n \"trial_period\": null,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": false\n },\n \"credit_tier\": 2500,\n \"credit_tier_price\": 6000.0,\n \"available_credits\": 2500,\n \"status\": \"active\",\n \"is_scheduled_for_cancellation\": false,\n \"next_invoice\": \"2026-11-25\",\n \"next_change_date\": \"2026-11-25\",\n \"subscription_id\": \"16BTwHV3YL0ocour\",\n \"change_pending\": false,\n \"next_plan\": {\n \"name\": \"Plus EUR\",\n \"short_name\": \"Plus\",\n \"chargebee_id\": \"gen4-plan-plus-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 4300,\n \"addon_price\": null,\n \"price_for_analytics\": 4300.0,\n \"tier\": 130,\n \"fte_band\": null,\n \"trial_period\": null,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": false\n },\n \"renewal_date\": \"2026-11-25\",\n \"trial_end\": null,\n \"gtm_sync_required\": false,\n \"active_assessments_slots\": null,\n \"older_than_two_months\": true\n}\n","{\n \"plan\": {\n \"name\": \"Pro Annually 201 to 300 EUR\",\n \"short_name\": \"Pro\",\n \"chargebee_id\": \"d-plan-pro-yearly-201-300-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 17424,\n \"addon_price\": null,\n \"price_for_analytics\": 17424.0,\n \"tier\": 9,\n \"fte_band\": \"201-300\",\n \"trial_period\": 15,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": true\n },\n \"credit_tier\": null,\n \"credit_tier_price\": null,\n \"available_credits\": 0,\n \"status\": \"active\",\n \"is_scheduled_for_cancellation\": false,\n \"next_invoice\": \"2026-11-25\",\n \"next_change_date\": \"2026-11-25\",\n \"subscription_id\": \"16CRVrV3YMe0jpqT\",\n \"change_pending\": false,\n \"next_plan\": {\n \"name\": \"Pro Annually 201 to 300 EUR\",\n \"short_name\": \"Pro\",\n \"chargebee_id\": \"d-plan-pro-yearly-201-300-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 17424,\n \"addon_price\": null,\n \"price_for_analytics\": 17424.0,\n \"tier\": 9,\n \"fte_band\": \"201-300\",\n \"trial_period\": 15,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": true\n },\n \"renewal_date\": \"2026-11-25\",\n \"trial_end\": null,\n \"gtm_sync_required\": false,\n \"active_assessments_slots\": null,\n \"older_than_two_months\": true\n}\n","{\n \"plan\": {\n \"name\": \"Starter Annually 201 to 300 EUR\",\n \"short_name\": \"Starter\",\n \"chargebee_id\": \"d-plan-starter-yearly-201-300-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 12606,\n \"addon_price\": null,\n \"price_for_analytics\": 12606.0,\n \"tier\": 8,\n \"fte_band\": \"201-300\",\n \"trial_period\": 15,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": true\n },\n \"credit_tier\": null,\n \"credit_tier_price\": null,\n \"available_credits\": 0,\n \"status\": \"active\",\n \"is_scheduled_for_cancellation\": false,\n \"next_invoice\": \"2026-11-25\",\n \"next_change_date\": \"2026-11-25\",\n \"subscription_id\": \"169lVHV3YNUvxqIQ\",\n \"change_pending\": false,\n \"next_plan\": {\n \"name\": \"Starter Annually 201 to 300 EUR\",\n \"short_name\": \"Starter\",\n \"chargebee_id\": \"d-plan-starter-yearly-201-300-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 12606,\n \"addon_price\": null,\n \"price_for_analytics\": 12606.0,\n \"tier\": 8,\n \"fte_band\": \"201-300\",\n \"trial_period\": 15,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": true\n },\n \"renewal_date\": \"2026-11-25\",\n \"trial_end\": null,\n \"gtm_sync_required\": false,\n \"active_assessments_slots\": null,\n \"older_than_two_months\": false\n}\n","import type { Page } from '@playwright/test';\nimport { baseURL as configBaseURL } from '../config';\nimport businessEur from './subscriptions/business-eur.json';\nimport coreEur from './subscriptions/core-eur.json';\nimport free from './subscriptions/free.json';\nimport plusEur from './subscriptions/plus-eur.json';\nimport proEur from './subscriptions/pro-eur.json';\nimport starterEur from './subscriptions/starter-eur.json';\n\nexport type SubscriptionPlan =\n | 'business-eur'\n | 'starter-eur'\n | 'pro-eur'\n | 'core-eur'\n | 'plus-eur'\n | 'free';\n\n// Payloads are inlined into the bundle (no fs/__dirname at runtime), so the\n// stub works identically from an installed npm package and from source.\nconst PLANS: Record<SubscriptionPlan, Record<string, unknown>> = {\n 'business-eur': businessEur,\n 'starter-eur': starterEur,\n 'pro-eur': proEur,\n 'core-eur': coreEur,\n 'plus-eur': plusEur,\n free,\n};\n\nexport class CurrentSubscription {\n readonly page: Page;\n private readonly baseUrl: string;\n\n constructor(page: Page, baseUrl: string = configBaseURL) {\n this.page = page;\n this.baseUrl = baseUrl;\n }\n\n /**\n * Stubs the current subscription endpoint with a specific plan\n * @param planName - The subscription plan payload to serve.\n * Options: 'business-eur' (default), 'starter-eur', 'pro-eur', 'core-eur', 'plus-eur', 'free'\n * @param overridePayload - Optional custom payload to serve instead of the bundled plan JSON.\n */\n async stubCurrentSubscriptionEndpoint(\n planName: SubscriptionPlan = 'business-eur',\n overridePayload?: Record<string, unknown>,\n ) {\n const subscriptionData = overridePayload ?? PLANS[planName];\n\n await this.page.route(`${this.baseUrl}/api/accounting/current-subscription/`, (route) =>\n route.fulfill({\n status: 200,\n body: JSON.stringify(subscriptionData),\n }),\n );\n }\n}\n","import { Page } from '@playwright/test';\nimport { CurrentSubscription, SubscriptionPlan } from './currentSubscription';\n\n/**\n * Standalone helper to stub subscription endpoint\n * Use this when you're NOT using the page fixture but need to stub subscription\n *\n * @example\n * ```typescript\n * const page = await browser.newPage();\n * await stubSubscription(page, 'plus-eur');\n * ```\n */\nexport async function stubSubscription(\n page: Page,\n planName: SubscriptionPlan = 'business-eur',\n): Promise<void> {\n const currentSubscription = new CurrentSubscription(page);\n await currentSubscription.stubCurrentSubscriptionEndpoint(planName);\n}\n"],"mappings":"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","names":["env","accounts","baseURL","ephemeralPrefix","ephemeralId","isEphemeralEnvironment","environment","adminURL"]}
{"version":3,"sources":["../src/stubs/index.ts","../src/config/resolve.ts","../src/config/algolia.ts","../src/config/constants.ts","../src/config/index.ts","../src/stubs/subscriptions/business-eur.json","../src/stubs/subscriptions/core-eur.json","../src/stubs/subscriptions/free.json","../src/stubs/subscriptions/plus-eur.json","../src/stubs/subscriptions/pro-eur.json","../src/stubs/subscriptions/starter-eur.json","../src/stubs/currentSubscription.ts","../src/stubs/stubSubscription.ts"],"sourcesContent":["export { CurrentSubscription } from './currentSubscription';\nexport type { SubscriptionPlan } from './currentSubscription';\nexport { stubSubscription } from './stubSubscription';\n","import type { E2eAccounts, E2eConfig, E2eUrls } from './types';\n\n/**\n * Ephemeral environment detection.\n *\n * CI declares the target via `E2E_ENVIRONMENT` (the e2e-tests orb's\n * `environment` job parameter): `ephemeral` means ephemeral, any other value\n * means not — even if the URL happens to look ephemeral. When the variable is\n * unset (local runs, orb versions that don't export it yet), the baseURL\n * shape is the fallback signal.\n *\n * The URL parse itself stays either way: sibling service hosts are rebuilt\n * from the captured `<prefix>` and `<id>`. It is generic — no per-repo prefix\n * whitelist, so `backend-1234-…`, `talent-api-1756-…`,\n * `talent-assessment-987-…` and any future deployment prefix all match\n * `<prefix>-<id>-<service>.dev.testgorilla.com` without a framework release.\n * Lazy `(.+?)` splits at the FIRST `-<digits>-` segment so service names\n * containing digits (e.g. `cr-v2`) cannot mis-split the prefix.\n */\nconst EPHEMERAL_PREFIX_PATTERN = /https?:\\/\\/(.+?)-(\\d+)-[^.]+\\.dev\\.testgorilla\\.com/;\n\nconst LOCAL_MAILHOG_URL = 'http://localhost:8025';\n\n/**\n * Build a lazily-throwing secret accessor: the property reads as a normal\n * string when the env var is set, and throws with setup guidance the first\n * time it is READ while unset. Importing the config never throws.\n *\n * Non-enumerable so JSON-serializing an E2eConfig (e.g. passing it through\n * `test.use` in playwright.config, which serializes options to workers) can\n * neither leak the credential nor trip the missing-env error.\n */\nfunction defineRequiredSecret(\n target: object,\n property: string,\n value: string | undefined,\n envVar: string,\n): void {\n Object.defineProperty(target, property, {\n enumerable: false,\n configurable: true,\n get(): string {\n if (value === undefined || value === '') {\n throw new Error(\n `[e2e-framework] ${envVar} is not set. The framework ships no credential defaults — ` +\n `export ${envVar} (see your team's 1Password e2e .env entry) before running tests.`,\n );\n }\n return value;\n },\n });\n}\n\nfunction resolveAccounts(env: NodeJS.ProcessEnv): E2eAccounts {\n const nodeIndexedOrganizer = env.CIRCLE_NODE_TOTAL\n ? `dummy.tests+organizer${env.CIRCLE_NODE_INDEX}@testgorilla.com`\n : `dummy.tests+organizer11@testgorilla.com`;\n const accountIndex = env.E2E_ACCOUNT_INDEX;\n\n const accounts = {\n organizerEmail:\n env.userEmail ??\n (accountIndex !== undefined\n ? `dummy.tests+organizer${accountIndex}@testgorilla.com`\n : nodeIndexedOrganizer),\n candidateEmail: env.candidateEmail ?? 'dummy.tests@testgorilla.com',\n hiringManagerEmail: env.hiringManagerEmail ?? 'dummy.tests+hiringmanager01@testgorilla.com',\n recruiterEmail: env.recruiterEmail ?? 'dummy.tests+recruiter1@testgorilla.com',\n adminEmail: env.adminEmail ?? 'dummy.tests+admin1@testgorilla.com',\n newAdminEmail: env.newAdminEmail ?? 'dummy.tests+newadmin@testgorilla.com',\n freeUserEmail: env.freeUserEmail ?? 'dummy.tests+free0@testgorilla.com',\n corePlanUserEmail: env.corePlanUserEmail ?? 'dummy.tests+coreplan@testgorilla.com',\n plusPlanUserEmail: env.plusPlanUserEmail ?? 'dummy.tests+plus@testgorilla.com',\n proPlanUserEmail: env.proPlanUserEmail ?? 'dummy.tests+pro@testgorilla.com',\n businessPlanUserEmail: env.businessPlanUserEmail ?? 'dummy.tests+business@testgorilla.com',\n starterPlanUserEmail: env.starterPlanUserEmail ?? 'dummy.tests+starter@testgorilla.com',\n myProfileUserEmail: env.myProfileUserEmail ?? 'dummy.tests+myprofile@testgorilla.com',\n atsIntegrationsEmail:\n env.atsIntegrationsEmail ?? 'dummy.tests+ats-integrations@testgorilla.com',\n } as E2eAccounts;\n\n defineRequiredSecret(accounts, 'password', env.E2E_PASSWORD ?? env.e2e_password, 'E2E_PASSWORD');\n defineRequiredSecret(\n accounts,\n 'candidatePassword',\n env.E2E_CANDIDATE_PASSWORD,\n 'E2E_CANDIDATE_PASSWORD',\n );\n\n return accounts;\n}\n\nfunction resolveUrls(\n baseURL: string,\n ephemeralPrefix: string | null,\n ephemeralId: string | null,\n): E2eUrls {\n const isEphemeral = !!ephemeralId;\n const ephemeralHost = (service: string) =>\n `https://${ephemeralPrefix}-${ephemeralId}-${service}.dev.testgorilla.com`;\n const isProd = baseURL.includes('app.testgorilla');\n const isDev = baseURL.includes('dev.testgorilla');\n const isLocalhost = baseURL.includes('localhost');\n\n return {\n talentBase: isEphemeral\n ? ephemeralHost('talent')\n : isProd\n ? 'https://talent.testgorilla.com'\n : isDev\n ? 'https://talent-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4100'\n : 'https://talent-staging.testgorilla.com',\n talentAssessment: isEphemeral\n ? ephemeralHost('talent-assessment')\n : isProd\n ? 'https://talent-assessment.testgorilla.com'\n : isDev\n ? 'https://talent-assessment-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4100'\n : 'https://talent-assessment-staging.testgorilla.com',\n talentApi: isEphemeral\n ? ephemeralHost('api-talent')\n : isProd\n ? 'https://api-talent.testgorilla.com'\n : isDev\n ? 'https://api-talent-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4200'\n : 'https://api-talent-staging.testgorilla.com',\n codeRunnerApi: isProd\n ? 'https://cr-v2.testgorilla.com'\n : isDev\n ? 'https://cr-v2-dev.testgorilla.com'\n : 'https://cr-v2-staging.testgorilla.com',\n websiteBase: isProd\n ? 'https://www.testgorilla.com'\n : isDev && !isEphemeral\n ? 'https://website-dev.testgorilla.com'\n : 'https://website-staging.testgorilla.com',\n mailpit: isEphemeral ? ephemeralHost('mailpit') : LOCAL_MAILHOG_URL,\n localstack: isEphemeral ? ephemeralHost('localstack') : null,\n };\n}\n\n/**\n * Resolve the full e2e run configuration from environment variables, using\n * TestGorilla's environment naming conventions (staging default, ephemeral\n * `<prefix>-<id>-<service>` dev deployments, production `app`). CI declares\n * ephemerality explicitly via `E2E_ENVIRONMENT=ephemeral`; unset falls back\n * to baseURL-shape detection (see EPHEMERAL_PREFIX_PATTERN above).\n *\n * Pure with respect to its input: pass a custom env for testing; defaults to\n * `process.env`. Never throws on missing secrets — required credentials\n * (`E2E_PASSWORD`, `E2E_CANDIDATE_PASSWORD`) throw with guidance only when\n * first read. The one eager throw is a declared-ephemeral baseURL that the\n * ephemeral host pattern cannot parse (a CI wiring error).\n */\nexport function resolveTgEnvironment(env: NodeJS.ProcessEnv = process.env): E2eConfig {\n const baseURL = env.baseURL || 'https://staging.testgorilla.com';\n\n const ephemeralMatch = baseURL.match(EPHEMERAL_PREFIX_PATTERN);\n const declaredEnvironment = env.E2E_ENVIRONMENT?.toLowerCase();\n const isEphemeralEnvironment = declaredEnvironment\n ? declaredEnvironment === 'ephemeral'\n : !!ephemeralMatch;\n if (isEphemeralEnvironment && !ephemeralMatch) {\n // Config error, CI-only by construction (the variable is CI-set): every\n // derived sibling URL would be wrong, so fail fast instead of letting\n // tests fail confusingly against staging fallback hosts.\n throw new Error(\n `[e2e-framework] E2E_ENVIRONMENT=ephemeral but baseURL \"${baseURL}\" does not match ` +\n `<prefix>-<id>-<service>.dev.testgorilla.com — sibling service URLs cannot be derived.`,\n );\n }\n const ephemeralPrefix = isEphemeralEnvironment && ephemeralMatch ? ephemeralMatch[1] : null;\n const ephemeralId = isEphemeralEnvironment && ephemeralMatch ? ephemeralMatch[2] : null;\n\n const environment = baseURL.split('.testgorilla.com')[0].split('https://')[1] || 'staging';\n\n const adminURL =\n env.adminURL ||\n (isEphemeralEnvironment\n ? `https://${ephemeralPrefix}-${ephemeralId}-backend.dev.testgorilla.com`\n : environment === 'app'\n ? `https://new-admin.testgorilla.com`\n : `https://${environment}-new-admin.testgorilla.com`);\n\n const isProd = baseURL.includes('app.testgorilla');\n const isDev = baseURL.includes('dev.testgorilla');\n const isLocalhost = baseURL.includes('localhost');\n\n return {\n baseURL,\n environment,\n isEphemeralEnvironment,\n ephemeralPrefix,\n ephemeralId,\n isLocalEnvironment: env.localEnvironment === 'true' || isEphemeralEnvironment,\n adminURL,\n urls: resolveUrls(baseURL, ephemeralPrefix, ephemeralId),\n emails: {\n signupFrom: isProd\n ? 'hello@testgorilla.com'\n : isLocalhost\n ? 'noreply@example'\n : isDev || isEphemeralEnvironment\n ? 'hello@maildev.testgorilla.com'\n : 'hello@mailstaging.testgorilla.com',\n assessmentsFrom: isProd\n ? 'assessments@testgorilla.com'\n : isLocalhost\n ? 'assessments@example.com'\n : isDev || isEphemeralEnvironment\n ? 'assessments@maildev.testgorilla.com'\n : 'assessments@mailstaging.testgorilla.com',\n },\n accounts: resolveAccounts(env),\n };\n}\n","/**\n * Algolia Configuration\n *\n * Test-library search used during assessment creation. The bundled defaults\n * are the same index-restricted, search-only keys the customer frontend ships\n * to browsers (not admin keys); override any of them via the ALGOLIA_* env\n * vars below without a code change (e.g. on key rotation).\n */\n\nimport { baseURL, isEphemeralEnvironment } from './index';\n\nconst ALGOLIA_APP_ID = process.env.ALGOLIA_APP_ID || 'V8Y626J4K8';\n\n// Algolia Index Names\nconst ALGOLIA_PROD_INDEX = process.env.ALGOLIA_PROD_INDEX || 'production_tests_index';\nconst ALGOLIA_STAGING_INDEX = process.env.ALGOLIA_STAGING_INDEX || 'staging_tests_index';\nconst ALGOLIA_EPHEMERAL_INDEX = process.env.ALGOLIA_EPHEMERAL_INDEX || 'ephemeral_tests_index';\n\n// Algolia API Keys (search-only, restricted to the specific indices)\nconst ALGOLIA_PROD_API_KEY =\n process.env.ALGOLIA_PROD_API_KEY ||\n 'NDc2N2JlMmY5ZGE2NzM4NDIwOWM2ODkyMWY0Yjk5YjYyNTA5NTViNDg2YzNlN2VlZDE4MmYyOWE3YmRjNjg1ZXJlc3RyaWN0SW5kaWNlcz1wcm9kdWN0aW9uX3Rlc3RzX2luZGV4';\nconst ALGOLIA_STAGING_API_KEY =\n process.env.ALGOLIA_STAGING_API_KEY ||\n 'ZjZmYWMwYjNkN2IxZjViYzA0OTZkZGE3OWY5MmVjYWMzN2RlYWJlYjcyOWRlMWQ3YjMwM2RjYjk0NDNjZGY0MXJlc3RyaWN0SW5kaWNlcz1zdGFnaW5nX3Rlc3RzX2luZGV4';\nconst ALGOLIA_EPHEMERAL_API_KEY =\n process.env.ALGOLIA_EPHEMERAL_API_KEY || '5beea78e78134e8270214f93b7032e7b';\n\n/**\n * Returns environment-specific Algolia API URL\n */\nexport const getAlgoliaUrl = (): string => {\n const isProduction = baseURL.includes('app.testgorilla');\n\n if (isEphemeralEnvironment) {\n return `https://v8y626j4k8-dsn.algolia.net/1/indexes/${ALGOLIA_EPHEMERAL_INDEX}/query`;\n }\n\n const index = isProduction ? ALGOLIA_PROD_INDEX : ALGOLIA_STAGING_INDEX;\n const domain = isProduction ? 'algolianet.com' : 'algolia.net';\n const subdomain = isProduction ? 'v8y626j4k8-2' : 'v8y626j4k8-dsn';\n\n return `https://${subdomain}.${domain}/1/indexes/${index}/query`;\n};\n\n/**\n * Returns environment-specific Algolia API headers\n */\nexport const getAlgoliaHeaders = (): Record<string, string> => {\n const isProduction = baseURL.includes('app.testgorilla');\n\n let apiKey: string;\n if (isEphemeralEnvironment) {\n apiKey = ALGOLIA_EPHEMERAL_API_KEY;\n } else {\n apiKey = isProduction ? ALGOLIA_PROD_API_KEY : ALGOLIA_STAGING_API_KEY;\n }\n\n return {\n 'content-type': 'application/x-www-form-urlencoded',\n 'x-algolia-api-key': apiKey,\n 'x-algolia-application-id': ALGOLIA_APP_ID,\n };\n};\n","/**\n * Constants & Retries\n *\n * Contains global retry counters and other application constants.\n */\n\nimport { env } from 'process';\n\n// Retry counters - used to determine retry behavior in tests\nexport const DEFAULT_RETRY_COUNTER = 10;\nexport const INCREASED_RETRY_COUNTER_50 = DEFAULT_RETRY_COUNTER * 1.5;\nexport const INCREASED_RETRY_COUNTER_80 = DEFAULT_RETRY_COUNTER * 1.8;\nexport const INCREASED_RETRY_COUNTER_200 = DEFAULT_RETRY_COUNTER * 2;\nexport const INCREASED_RETRY_COUNTER_300 = DEFAULT_RETRY_COUNTER * 3;\n\n// Logger configuration. Default: WARN both in CI and locally — opt in to INFO for milestones\n// or DEBUG for per-request chatter via the LOG_LEVEL env var.\n// API_LOG_LEVEL / API_LOG_FILE are accepted for back-compat with a one-time deprecation note.\nconst rawLogLevel = env.LOG_LEVEL?.toUpperCase() || env.API_LOG_LEVEL?.toUpperCase() || 'WARN';\nif (!env.LOG_LEVEL && env.API_LOG_LEVEL && !env._LOG_DEPRECATION_WARNED) {\n process.stderr.write(\n '[logger] API_LOG_LEVEL is deprecated; use LOG_LEVEL instead (same values).\\n',\n );\n env._LOG_DEPRECATION_WARNED = '1';\n}\nexport const logLevel = rawLogLevel as 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'NONE';\nexport const logFile = env.LOG_FILE || env.API_LOG_FILE || '';\n\n// Back-compat aliases — prefer logLevel / logFile in new code.\nexport const apiLogLevel = logLevel;\nexport const apiLogFile = logFile;\n\n// Assessment configuration — the name→id map published by global setup\n// (process.env.assessments; see @testgorilla/e2e-framework/setup).\nexport const assessmentList = JSON.parse(env.assessments || '{}');\n\n// Other constants\nexport const MAILPIT_SERVER = 'http://localhost:8025';\nexport const simpleAssessmentName = `New Simple Assessment - ${Date.now()}`;\nexport const invitationEmailSubject = 'Your application at TestGorilla';\n\n// Email reception tracking\nexport const emailReception = { slowEmailAPI: false };\n","/**\n * Compatibility surface over {@link resolveTgEnvironment}.\n *\n * Every export here preserves the NAME and SHAPE (const vs function) of the\n * corresponding export in tgo-qa-automation's `helpers/config`, so consumers\n * migrate with a module-specifier-only import rewrite. The values come from a\n * single module-load resolution of `process.env` — the same timing the suite\n * relies on today (env is inherited by every Playwright worker process).\n *\n * Credentials ship with NO defaults: `password` is empty when `E2E_PASSWORD`\n * is unset (the structured `accounts.password` accessor throws with guidance\n * instead).\n */\nimport { resolveTgEnvironment } from './resolve';\nimport { getRunId } from './runId';\n\nexport type { E2eAccounts, E2eConfig, E2eUrls } from './types';\nexport { resolveTgEnvironment } from './resolve';\n\nconst cfg = resolveTgEnvironment();\n\n// --- Environment & URLs (parity with helpers/config/environment.ts) ---\n\nexport const baseURL = cfg.baseURL;\nexport const environment = cfg.environment;\nexport const isEphemeralEnvironment = cfg.isEphemeralEnvironment;\nexport const ephemeralPrefix = cfg.ephemeralPrefix;\nexport const ephemeralId = cfg.ephemeralId;\nexport const isLocalEnvironment = cfg.isLocalEnvironment;\nexport const adminURL = cfg.adminURL;\nexport const localMailHogURL = 'http://localhost:8025';\n\n/** Returns environment-specific mailpit (ephemeral) or local MailHog URL. */\nexport const mailpitURL = (): string => cfg.urls.mailpit;\n\n/**\n * Returns the LocalStack URL for the current ephemeral environment, or `null`\n * when not running against one.\n */\nexport const localstackURL = (): string | null => cfg.urls.localstack;\n\n/** Returns environment-specific talent base URL. */\nexport const talentBaseURL = (): string => cfg.urls.talentBase;\n\n/** Returns environment-specific talent assessment URL. */\nexport const talentAssessmentURL = (): string => cfg.urls.talentAssessment;\n\n/** Returns environment-specific talent API URL. */\nexport const talentApiURL = (): string => cfg.urls.talentApi;\n\n/** Returns environment-specific code runner API URL. */\nexport const codeRunnerApiURL = (): string => cfg.urls.codeRunnerApi;\n\n/** Returns environment-specific website base URL. */\nexport const websiteBaseURL = (): string => cfg.urls.websiteBase;\n\n/** Returns environment-specific signup sender address. */\nexport const signupFromEmail = (): string => cfg.emails.signupFrom;\n\n/** Returns environment-specific assessments sender address. */\nexport const assessmentsFromEmail = (): string => cfg.emails.assessmentsFrom;\n\n/** Check if current environment is NOT staging. */\nexport const ifNotStagingRun = (): boolean => !cfg.baseURL.includes('staging.testgorilla');\n\n/**\n * Check if current environment is NEITHER staging NOR an ephemeral dev env.\n * Use this to skip tests that depend on the website → app signup flow.\n */\nexport const ifNotStagingOrEphemeralRun = (): boolean =>\n ifNotStagingRun() && !cfg.isEphemeralEnvironment;\n\n/** Check if current environment is NOT localhost. */\nexport const ifNotLocalhostRun = (): boolean => !cfg.baseURL.includes('localhost');\n\n/**\n * Rewrites a signup URL produced by the marketing website (which always\n * points at app.testgorilla.com) so it targets the current environment.\n */\nexport const rewriteSignupUrlForEnv = (signupUrl: string): string => {\n const targetHost = new URL(cfg.baseURL).host;\n return signupUrl.replace(/app\\.testgorilla\\.com/i, targetHost);\n};\n\n// --- Environment URL constants (parity with helpers/config/environment.ts) ---\n\nexport const prodTesttakerUrlString = 'https://assessment.testgorilla.com';\nexport const prodTASUrlString = 'https://talent-assessment.testgorilla.com';\nexport const stageTesttakerUrlString = 'https://staging-assessment.testgorilla.com';\nexport const stageTASUrlString = 'https://talent-assessment-staging.testgorilla.com';\nexport const devTASUrlString = 'https://talent-assessment-dev.testgorilla.com';\nexport const localTASUrlString = 'http://localhost:4100';\nexport const stagingTASAPIUrl = 'https://api-talent-staging.testgorilla.com';\n\n// --- Seed assessment names (product constants, non-secret) ---\n\nexport const CandidateInviteAssessment = 'Candidate-Invite-Assessment-4-Do-not-archive';\nexport const candidateExpiredAssessment = 'Candidate-Expired-Assessment-1-Do-not-archive';\nexport const candidateArchivedAssessment = 'Candidate-Archived-Assessment-1-Do-not-archive';\nexport const tasSimpleMcqAssessment = 'TAS-MCQ-Assessment';\nexport const tasCustomTestAssessment = 'TAS-Custom-Test-Assessment';\nexport const tasSimpleBulkAssessment = 'TAS-Bulk-Assessment';\n\n// --- Test accounts (parity with helpers/config/testAccounts.ts, secrets stripped) ---\n\n/** Structured account set; `accounts.password` throws with guidance if `E2E_PASSWORD` is unset. */\nexport const accounts = cfg.accounts;\n\n/** Main organizer account email for this run. */\nexport const email = cfg.accounts.organizerEmail;\n\n/**\n * Organizer password from `E2E_PASSWORD` (legacy `e2e_password`). Empty string\n * when unset — the framework ships no credential defaults. Prefer\n * `accounts.password`, which throws with setup guidance instead of silently\n * yielding ''.\n */\nexport const password = process.env.E2E_PASSWORD ?? process.env.e2e_password ?? '';\n\nexport const candidateEmail = cfg.accounts.candidateEmail;\nexport const hiringManagerEmail = cfg.accounts.hiringManagerEmail;\nexport const recruiterEmail = cfg.accounts.recruiterEmail;\nexport const adminEmail = cfg.accounts.adminEmail;\nexport const newAdminEmail = cfg.accounts.newAdminEmail;\nexport const freeUserEmail = cfg.accounts.freeUserEmail;\nexport const corePlanUserEmail = cfg.accounts.corePlanUserEmail;\nexport const plusPlanUserEmail = cfg.accounts.plusPlanUserEmail;\nexport const proPlanUserEmail = cfg.accounts.proPlanUserEmail;\nexport const businessPlanUserEmail = cfg.accounts.businessPlanUserEmail;\nexport const starterPlanUserEmail = cfg.accounts.starterPlanUserEmail;\nexport const myProfileUserEmail = cfg.accounts.myProfileUserEmail;\nexport const atsIntegrationsEmail = cfg.accounts.atsIntegrationsEmail;\n\nconst EMAIL_DOMAIN = '@testgorilla.com';\nconst DUMMY_TESTS_PREFIX = 'dummy.tests';\n\n// Per-process tie-breaker so two mints in the same millisecond never collide.\nlet mintCounter = 0;\n\n/**\n * Unique, run-attributable suffix for generated identities:\n * `<runId>x<epoch36><counter>`. Embedding the run id makes every row on the\n * shared staging DB traceable to the CI workflow or local user that created\n * it, and lets purge jobs select marked data (.github/instructions/07-test-data.md).\n */\nconst mintSuffix = (): string => `${getRunId()}x${Date.now().toString(36)}${mintCounter++}`;\n\n/**\n * Generate a random candidate email.\n * Format: `dummy.tests+cand<rand><runId>x<timestamp>@testgorilla.com`.\n */\nexport const randCandidateEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+cand${rand}${mintSuffix()}${EMAIL_DOMAIN}`;\n\n/**\n * Generate a random customer email.\n * Format: `dummy.tests+cust<rand><runId>x<timestamp>@testgorilla.com`.\n */\nexport const randCustomerEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+cust${rand}${mintSuffix()}${EMAIL_DOMAIN}`;\n\n// --- Algolia, constants, recaptcha (parity with helpers/config) ---\n// Lazily circular: algolia/recaptcha read baseURL/isEphemeralEnvironment from\n// this barrel inside their functions only, never at module load.\n\nexport { getAlgoliaUrl, getAlgoliaHeaders } from './algolia';\nexport * from './constants';\nexport { getRecaptchaBypassKey, setRecaptchaBypassKeyProvider } from './recaptcha';\nexport type { RecaptchaKeyProvider } from './recaptcha';\n\n/**\n * Generate a random team-member email tagged with the current environment.\n * Format: `dummy.tests+t<rand><env>+<runId>x<timestamp>@testgorilla.com`.\n */\nexport const randTeamMemberEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+t${rand}${cfg.environment}+${mintSuffix()}${EMAIL_DOMAIN}`;\n\n// Random test-data generators (faker replacement) + username/phone utilities\nexport * from './randomData';\nexport { getRunId };\n","{\n \"name\": \"Base plan: Business EUR\",\n \"plan\": {\n \"name\": \"Base plan: Business EUR\",\n \"short_name\": \"Business\",\n \"chargebee_id\": \"Base-plan-tier-Business-EUR\",\n \"number_of_credits\": 12500,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"period\": \"year\",\n \"monthly_price\": 22200.0,\n \"addon_price\": 0.6,\n \"price_for_analytics\": 22200.0,\n \"legacy\": false,\n \"tier\": 6,\n \"fte_band\": null,\n \"trial_period\": null\n },\n \"legacy\": false,\n \"next_invoice\": \"2023-09-18\",\n \"addon_subscription\": {\n \"next_invoice\": \"2023-01-18\",\n \"additional_candidate_credits\": 0,\n \"additional_assessment_credits\": 42\n },\n \"is_trial\": false,\n \"subscription_id\": \"Azz5akTHt88pcmbU\",\n \"currency_code\": \"EUR\",\n \"change_pending\": false,\n \"next_plan\": null,\n \"next_plan_short_name\": null,\n \"active_chargebee_id\": \"Base-plan-tier-Business-EUR\",\n \"next_chargebee_id\": null,\n \"candidate_credits\": {\n \"initials_credits_included_in_the_plan\": 12500,\n \"credits_from_previous_plan\": 0,\n \"complimentary\": 0,\n \"consumed\": -1017,\n \"total_available\": 11483,\n \"additional_credit_price\": 0.6,\n \"general\": {\n \"cost\": 0.6,\n \"quantity\": 0\n },\n \"billed\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"paid\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"payment_due\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"unbilled_charges\": {\n \"amount\": 0.0,\n \"quantity\": 0\n }\n },\n \"assessment_credits\": {\n \"initials_credits_included_in_the_plan\": 125,\n \"credits_from_previous_plan\": 0,\n \"complimentary\": 0,\n \"consumed\": -603,\n \"total_available\": 0,\n \"additional_credit_price\": 80.0,\n \"general\": {\n \"cost\": 80.0,\n \"quantity\": 478\n },\n \"billed\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"paid\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"payment_due\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"unbilled_charges\": {\n \"amount\": 38240.0,\n \"quantity\": 478\n }\n },\n \"tier\": 6,\n \"renewal_date\": \"2025-09-18\"\n}\n","{\n \"plan\": {\n \"name\": \"Core EUR\",\n \"short_name\": \"Core\",\n \"chargebee_id\": \"gen4-plan-core-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 525,\n \"addon_price\": null,\n \"price_for_analytics\": 525.0,\n \"tier\": 120,\n \"fte_band\": null,\n \"trial_period\": null,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": false\n },\n \"credit_tier\": 450,\n \"credit_tier_price\": 1500.0,\n \"available_credits\": 450,\n \"status\": \"active\",\n \"is_scheduled_for_cancellation\": false,\n \"next_invoice\": \"2026-11-25\",\n \"next_change_date\": \"2026-11-25\",\n \"subscription_id\": \"169lVHV3YKGm9oUe\",\n \"change_pending\": false,\n \"next_plan\": {\n \"name\": \"Core EUR\",\n \"short_name\": \"Core\",\n \"chargebee_id\": \"gen4-plan-core-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 525,\n \"addon_price\": null,\n \"price_for_analytics\": 525.0,\n \"tier\": 120,\n \"fte_band\": null,\n \"trial_period\": null,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": false\n },\n \"renewal_date\": \"2026-11-25\",\n \"trial_end\": null,\n \"gtm_sync_required\": false,\n \"active_assessments_slots\": null,\n \"older_than_two_months\": false\n}\n","{\n \"status\": null,\n \"change_pending\": false,\n \"renewal_date\": null,\n \"trial_end\": null,\n \"gtm_sync_required\": false,\n \"active_assessments_slots\": null\n}\n","{\n \"plan\": {\n \"name\": \"Plus EUR\",\n \"short_name\": \"Plus\",\n \"chargebee_id\": \"gen4-plan-plus-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 4300,\n \"addon_price\": null,\n \"price_for_analytics\": 4300.0,\n \"tier\": 130,\n \"fte_band\": null,\n \"trial_period\": null,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": false\n },\n \"credit_tier\": 2500,\n \"credit_tier_price\": 6000.0,\n \"available_credits\": 2500,\n \"status\": \"active\",\n \"is_scheduled_for_cancellation\": false,\n \"next_invoice\": \"2026-11-25\",\n \"next_change_date\": \"2026-11-25\",\n \"subscription_id\": \"16BTwHV3YL0ocour\",\n \"change_pending\": false,\n \"next_plan\": {\n \"name\": \"Plus EUR\",\n \"short_name\": \"Plus\",\n \"chargebee_id\": \"gen4-plan-plus-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 4300,\n \"addon_price\": null,\n \"price_for_analytics\": 4300.0,\n \"tier\": 130,\n \"fte_band\": null,\n \"trial_period\": null,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": false\n },\n \"renewal_date\": \"2026-11-25\",\n \"trial_end\": null,\n \"gtm_sync_required\": false,\n \"active_assessments_slots\": null,\n \"older_than_two_months\": true\n}\n","{\n \"plan\": {\n \"name\": \"Pro Annually 201 to 300 EUR\",\n \"short_name\": \"Pro\",\n \"chargebee_id\": \"d-plan-pro-yearly-201-300-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 17424,\n \"addon_price\": null,\n \"price_for_analytics\": 17424.0,\n \"tier\": 9,\n \"fte_band\": \"201-300\",\n \"trial_period\": 15,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": true\n },\n \"credit_tier\": null,\n \"credit_tier_price\": null,\n \"available_credits\": 0,\n \"status\": \"active\",\n \"is_scheduled_for_cancellation\": false,\n \"next_invoice\": \"2026-11-25\",\n \"next_change_date\": \"2026-11-25\",\n \"subscription_id\": \"16CRVrV3YMe0jpqT\",\n \"change_pending\": false,\n \"next_plan\": {\n \"name\": \"Pro Annually 201 to 300 EUR\",\n \"short_name\": \"Pro\",\n \"chargebee_id\": \"d-plan-pro-yearly-201-300-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 17424,\n \"addon_price\": null,\n \"price_for_analytics\": 17424.0,\n \"tier\": 9,\n \"fte_band\": \"201-300\",\n \"trial_period\": 15,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": true\n },\n \"renewal_date\": \"2026-11-25\",\n \"trial_end\": null,\n \"gtm_sync_required\": false,\n \"active_assessments_slots\": null,\n \"older_than_two_months\": true\n}\n","{\n \"plan\": {\n \"name\": \"Starter Annually 201 to 300 EUR\",\n \"short_name\": \"Starter\",\n \"chargebee_id\": \"d-plan-starter-yearly-201-300-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 12606,\n \"addon_price\": null,\n \"price_for_analytics\": 12606.0,\n \"tier\": 8,\n \"fte_band\": \"201-300\",\n \"trial_period\": 15,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": true\n },\n \"credit_tier\": null,\n \"credit_tier_price\": null,\n \"available_credits\": 0,\n \"status\": \"active\",\n \"is_scheduled_for_cancellation\": false,\n \"next_invoice\": \"2026-11-25\",\n \"next_change_date\": \"2026-11-25\",\n \"subscription_id\": \"169lVHV3YNUvxqIQ\",\n \"change_pending\": false,\n \"next_plan\": {\n \"name\": \"Starter Annually 201 to 300 EUR\",\n \"short_name\": \"Starter\",\n \"chargebee_id\": \"d-plan-starter-yearly-201-300-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 12606,\n \"addon_price\": null,\n \"price_for_analytics\": 12606.0,\n \"tier\": 8,\n \"fte_band\": \"201-300\",\n \"trial_period\": 15,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": true\n },\n \"renewal_date\": \"2026-11-25\",\n \"trial_end\": null,\n \"gtm_sync_required\": false,\n \"active_assessments_slots\": null,\n \"older_than_two_months\": false\n}\n","import type { Page } from '@playwright/test';\nimport { baseURL as configBaseURL } from '../config';\nimport businessEur from './subscriptions/business-eur.json';\nimport coreEur from './subscriptions/core-eur.json';\nimport free from './subscriptions/free.json';\nimport plusEur from './subscriptions/plus-eur.json';\nimport proEur from './subscriptions/pro-eur.json';\nimport starterEur from './subscriptions/starter-eur.json';\n\nexport type SubscriptionPlan =\n | 'business-eur'\n | 'starter-eur'\n | 'pro-eur'\n | 'core-eur'\n | 'plus-eur'\n | 'free';\n\n// Payloads are inlined into the bundle (no fs/__dirname at runtime), so the\n// stub works identically from an installed npm package and from source.\nconst PLANS: Record<SubscriptionPlan, Record<string, unknown>> = {\n 'business-eur': businessEur,\n 'starter-eur': starterEur,\n 'pro-eur': proEur,\n 'core-eur': coreEur,\n 'plus-eur': plusEur,\n free,\n};\n\nexport class CurrentSubscription {\n readonly page: Page;\n private readonly baseUrl: string;\n\n constructor(page: Page, baseUrl: string = configBaseURL) {\n this.page = page;\n this.baseUrl = baseUrl;\n }\n\n /**\n * Stubs the current subscription endpoint with a specific plan\n * @param planName - The subscription plan payload to serve.\n * Options: 'business-eur' (default), 'starter-eur', 'pro-eur', 'core-eur', 'plus-eur', 'free'\n * @param overridePayload - Optional custom payload to serve instead of the bundled plan JSON.\n */\n async stubCurrentSubscriptionEndpoint(\n planName: SubscriptionPlan = 'business-eur',\n overridePayload?: Record<string, unknown>,\n ) {\n const subscriptionData = overridePayload ?? PLANS[planName];\n\n await this.page.route(`${this.baseUrl}/api/accounting/current-subscription/`, (route) =>\n route.fulfill({\n status: 200,\n body: JSON.stringify(subscriptionData),\n }),\n );\n }\n}\n","import { Page } from '@playwright/test';\nimport { CurrentSubscription, SubscriptionPlan } from './currentSubscription';\n\n/**\n * Standalone helper to stub subscription endpoint\n * Use this when you're NOT using the page fixture but need to stub subscription\n *\n * @example\n * ```typescript\n * const page = await browser.newPage();\n * await stubSubscription(page, 'plus-eur');\n * ```\n */\nexport async function stubSubscription(\n page: Page,\n planName: SubscriptionPlan = 'business-eur',\n): Promise<void> {\n const currentSubscription = new CurrentSubscription(page);\n await currentSubscription.stubCurrentSubscriptionEndpoint(planName);\n}\n"],"mappings":"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","names":["env","accounts","baseURL","ephemeralPrefix","ephemeralId","isEphemeralEnvironment","environment","adminURL"]}
import {
CurrentSubscription
} from "./chunk-37W5EZF5.mjs";
import "./chunk-DW4V5VUB.mjs";
} from "./chunk-WEZDVQDT.mjs";
import "./chunk-TJHUXULD.mjs";

@@ -6,0 +6,0 @@ // src/stubs/stubSubscription.ts

@@ -34,3 +34,3 @@ var __defProp = Object.defineProperty;

// src/config/resolve.ts
var EPHEMERAL_PREFIX_PATTERN = /https?:\/\/(backend|talent-api)-(\d+)-[^.]+\.dev\.testgorilla\.com/;
var EPHEMERAL_PREFIX_PATTERN = /https?:\/\/(.+?)-(\d+)-[^.]+\.dev\.testgorilla\.com/;
var LOCAL_MAILHOG_URL = "http://localhost:8025";

@@ -98,5 +98,11 @@ function defineRequiredSecret(target, property, value, envVar) {

const ephemeralMatch = baseURL2.match(EPHEMERAL_PREFIX_PATTERN);
const ephemeralPrefix2 = ephemeralMatch ? ephemeralMatch[1] : null;
const ephemeralId2 = ephemeralMatch ? ephemeralMatch[2] : null;
const isEphemeralEnvironment2 = !!ephemeralId2;
const declaredEnvironment = env3.E2E_ENVIRONMENT?.toLowerCase();
const isEphemeralEnvironment2 = declaredEnvironment ? declaredEnvironment === "ephemeral" : !!ephemeralMatch;
if (isEphemeralEnvironment2 && !ephemeralMatch) {
throw new Error(
`[e2e-framework] E2E_ENVIRONMENT=ephemeral but baseURL "${baseURL2}" does not match <prefix>-<id>-<service>.dev.testgorilla.com \u2014 sibling service URLs cannot be derived.`
);
}
const ephemeralPrefix2 = isEphemeralEnvironment2 && ephemeralMatch ? ephemeralMatch[1] : null;
const ephemeralId2 = isEphemeralEnvironment2 && ephemeralMatch ? ephemeralMatch[2] : null;
const environment2 = baseURL2.split(".testgorilla.com")[0].split("https://")[1] || "staging";

@@ -103,0 +109,0 @@ const adminURL2 = env3.adminURL || (isEphemeralEnvironment2 ? `https://${ephemeralPrefix2}-${ephemeralId2}-backend.dev.testgorilla.com` : environment2 === "app" ? `https://new-admin.testgorilla.com` : `https://${environment2}-new-admin.testgorilla.com`);

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/templates/index.ts","../src/config/resolve.ts","../src/config/algolia.ts","../src/config/constants.ts","../src/config/index.ts","../src/enums/tests.ts","../src/templates/sourcingFixtures.ts"],"sourcesContent":["import { isEphemeralEnvironment } from '../config';\nimport { TestName } from '../enums';\n\nexport const AssessmentTemplates = {\n AcademicEditor: [\n TestName.AttentionToDetail,\n // TestName.VerbalReasoning\n ],\n};\n\nexport const CandidateInviteAssessmentTests = [\n TestName.AttentionToDetail,\n TestName.CodingEntryLevel,\n TestName.EnglishProficiency,\n TestName.RubyOnRails,\n];\n\n// Used in ephemeral environments where the code runner is unavailable\nexport const CandidateInviteAssessmentTestsNoCodeRunner = [\n TestName.AttentionToDetail,\n TestName.EnglishProficiency,\n];\n\n/**\n * Returns the Candidate-Invite assessment test list expected for the current\n * environment. Ephemeral envs have no code runner, so global-setup seeds the\n * assessment without coding tests — assert against the matching list there.\n */\nexport const candidateInviteTestsForEnv = (): TestName[] =>\n isEphemeralEnvironment\n ? CandidateInviteAssessmentTestsNoCodeRunner\n : CandidateInviteAssessmentTests;\n\nexport {\n kitchenAssistantTalentId,\n dogTrainerTalentId,\n kitchenAssistantFixture,\n dogTrainerFixture,\n} from './sourcingFixtures';\nexport type { SourcingTalentFixture } from './sourcingFixtures';\n","import type { E2eAccounts, E2eConfig, E2eUrls } from './types';\n\n/**\n * Ephemeral environment detection.\n * Supported prefixes:\n * - `backend` → backend-led deployments (e.g. https://backend-1234-talent.dev.testgorilla.com)\n * - `talent-api` → Talent-app-led deployments (e.g. https://talent-api-1756-talent.dev.testgorilla.com)\n * Add a new alternative to the regex if/when another deployment prefix is introduced.\n */\nconst EPHEMERAL_PREFIX_PATTERN =\n /https?:\\/\\/(backend|talent-api)-(\\d+)-[^.]+\\.dev\\.testgorilla\\.com/;\n\nconst LOCAL_MAILHOG_URL = 'http://localhost:8025';\n\n/**\n * Build a lazily-throwing secret accessor: the property reads as a normal\n * string when the env var is set, and throws with setup guidance the first\n * time it is READ while unset. Importing the config never throws.\n *\n * Non-enumerable so JSON-serializing an E2eConfig (e.g. passing it through\n * `test.use` in playwright.config, which serializes options to workers) can\n * neither leak the credential nor trip the missing-env error.\n */\nfunction defineRequiredSecret(\n target: object,\n property: string,\n value: string | undefined,\n envVar: string,\n): void {\n Object.defineProperty(target, property, {\n enumerable: false,\n configurable: true,\n get(): string {\n if (value === undefined || value === '') {\n throw new Error(\n `[e2e-framework] ${envVar} is not set. The framework ships no credential defaults — ` +\n `export ${envVar} (see your team's 1Password e2e .env entry) before running tests.`,\n );\n }\n return value;\n },\n });\n}\n\nfunction resolveAccounts(env: NodeJS.ProcessEnv): E2eAccounts {\n const nodeIndexedOrganizer = env.CIRCLE_NODE_TOTAL\n ? `dummy.tests+organizer${env.CIRCLE_NODE_INDEX}@testgorilla.com`\n : `dummy.tests+organizer11@testgorilla.com`;\n const accountIndex = env.E2E_ACCOUNT_INDEX;\n\n const accounts = {\n organizerEmail:\n env.userEmail ??\n (accountIndex !== undefined\n ? `dummy.tests+organizer${accountIndex}@testgorilla.com`\n : nodeIndexedOrganizer),\n candidateEmail: env.candidateEmail ?? 'dummy.tests@testgorilla.com',\n hiringManagerEmail: env.hiringManagerEmail ?? 'dummy.tests+hiringmanager01@testgorilla.com',\n recruiterEmail: env.recruiterEmail ?? 'dummy.tests+recruiter1@testgorilla.com',\n adminEmail: env.adminEmail ?? 'dummy.tests+admin1@testgorilla.com',\n newAdminEmail: env.newAdminEmail ?? 'dummy.tests+newadmin@testgorilla.com',\n freeUserEmail: env.freeUserEmail ?? 'dummy.tests+free0@testgorilla.com',\n corePlanUserEmail: env.corePlanUserEmail ?? 'dummy.tests+coreplan@testgorilla.com',\n plusPlanUserEmail: env.plusPlanUserEmail ?? 'dummy.tests+plus@testgorilla.com',\n proPlanUserEmail: env.proPlanUserEmail ?? 'dummy.tests+pro@testgorilla.com',\n businessPlanUserEmail: env.businessPlanUserEmail ?? 'dummy.tests+business@testgorilla.com',\n starterPlanUserEmail: env.starterPlanUserEmail ?? 'dummy.tests+starter@testgorilla.com',\n myProfileUserEmail: env.myProfileUserEmail ?? 'dummy.tests+myprofile@testgorilla.com',\n atsIntegrationsEmail:\n env.atsIntegrationsEmail ?? 'dummy.tests+ats-integrations@testgorilla.com',\n } as E2eAccounts;\n\n defineRequiredSecret(accounts, 'password', env.E2E_PASSWORD ?? env.e2e_password, 'E2E_PASSWORD');\n defineRequiredSecret(\n accounts,\n 'candidatePassword',\n env.E2E_CANDIDATE_PASSWORD,\n 'E2E_CANDIDATE_PASSWORD',\n );\n\n return accounts;\n}\n\nfunction resolveUrls(\n baseURL: string,\n ephemeralPrefix: string | null,\n ephemeralId: string | null,\n): E2eUrls {\n const isEphemeral = !!ephemeralId;\n const ephemeralHost = (service: string) =>\n `https://${ephemeralPrefix}-${ephemeralId}-${service}.dev.testgorilla.com`;\n const isProd = baseURL.includes('app.testgorilla');\n const isDev = baseURL.includes('dev.testgorilla');\n const isLocalhost = baseURL.includes('localhost');\n\n return {\n talentBase: isEphemeral\n ? ephemeralHost('talent')\n : isProd\n ? 'https://talent.testgorilla.com'\n : isDev\n ? 'https://talent-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4100'\n : 'https://talent-staging.testgorilla.com',\n talentAssessment: isEphemeral\n ? ephemeralHost('talent-assessment')\n : isProd\n ? 'https://talent-assessment.testgorilla.com'\n : isDev\n ? 'https://talent-assessment-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4100'\n : 'https://talent-assessment-staging.testgorilla.com',\n talentApi: isEphemeral\n ? ephemeralHost('api-talent')\n : isProd\n ? 'https://api-talent.testgorilla.com'\n : isDev\n ? 'https://api-talent-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4200'\n : 'https://api-talent-staging.testgorilla.com',\n codeRunnerApi: isProd\n ? 'https://cr-v2.testgorilla.com'\n : isDev\n ? 'https://cr-v2-dev.testgorilla.com'\n : 'https://cr-v2-staging.testgorilla.com',\n websiteBase: isProd\n ? 'https://www.testgorilla.com'\n : isDev && !isEphemeral\n ? 'https://website-dev.testgorilla.com'\n : 'https://website-staging.testgorilla.com',\n mailpit: isEphemeral ? ephemeralHost('mailpit') : LOCAL_MAILHOG_URL,\n localstack: isEphemeral ? ephemeralHost('localstack') : null,\n };\n}\n\n/**\n * Resolve the full e2e run configuration from environment variables, using\n * TestGorilla's environment naming conventions (staging default, ephemeral\n * `backend-<id>` / `talent-api-<id>` dev deployments, production `app`).\n *\n * Pure with respect to its input: pass a custom env for testing; defaults to\n * `process.env`. Never throws on missing secrets — required credentials\n * (`E2E_PASSWORD`, `E2E_CANDIDATE_PASSWORD`) throw with guidance only when\n * first read.\n */\nexport function resolveTgEnvironment(env: NodeJS.ProcessEnv = process.env): E2eConfig {\n const baseURL = env.baseURL || 'https://staging.testgorilla.com';\n\n const ephemeralMatch = baseURL.match(EPHEMERAL_PREFIX_PATTERN);\n const ephemeralPrefix = (ephemeralMatch ? ephemeralMatch[1] : null) as\n | 'backend'\n | 'talent-api'\n | null;\n const ephemeralId = ephemeralMatch ? ephemeralMatch[2] : null;\n const isEphemeralEnvironment = !!ephemeralId;\n\n const environment = baseURL.split('.testgorilla.com')[0].split('https://')[1] || 'staging';\n\n const adminURL =\n env.adminURL ||\n (isEphemeralEnvironment\n ? `https://${ephemeralPrefix}-${ephemeralId}-backend.dev.testgorilla.com`\n : environment === 'app'\n ? `https://new-admin.testgorilla.com`\n : `https://${environment}-new-admin.testgorilla.com`);\n\n const isProd = baseURL.includes('app.testgorilla');\n const isDev = baseURL.includes('dev.testgorilla');\n const isLocalhost = baseURL.includes('localhost');\n\n return {\n baseURL,\n environment,\n isEphemeralEnvironment,\n ephemeralPrefix,\n ephemeralId,\n isLocalEnvironment: env.localEnvironment === 'true' || isEphemeralEnvironment,\n adminURL,\n urls: resolveUrls(baseURL, ephemeralPrefix, ephemeralId),\n emails: {\n signupFrom: isProd\n ? 'hello@testgorilla.com'\n : isLocalhost\n ? 'noreply@example'\n : isDev || isEphemeralEnvironment\n ? 'hello@maildev.testgorilla.com'\n : 'hello@mailstaging.testgorilla.com',\n assessmentsFrom: isProd\n ? 'assessments@testgorilla.com'\n : isLocalhost\n ? 'assessments@example.com'\n : isDev || isEphemeralEnvironment\n ? 'assessments@maildev.testgorilla.com'\n : 'assessments@mailstaging.testgorilla.com',\n },\n accounts: resolveAccounts(env),\n };\n}\n","/**\n * Algolia Configuration\n *\n * Test-library search used during assessment creation. The bundled defaults\n * are the same index-restricted, search-only keys the customer frontend ships\n * to browsers (not admin keys); override any of them via the ALGOLIA_* env\n * vars below without a code change (e.g. on key rotation).\n */\n\nimport { baseURL, isEphemeralEnvironment } from './index';\n\nconst ALGOLIA_APP_ID = process.env.ALGOLIA_APP_ID || 'V8Y626J4K8';\n\n// Algolia Index Names\nconst ALGOLIA_PROD_INDEX = process.env.ALGOLIA_PROD_INDEX || 'production_tests_index';\nconst ALGOLIA_STAGING_INDEX = process.env.ALGOLIA_STAGING_INDEX || 'staging_tests_index';\nconst ALGOLIA_EPHEMERAL_INDEX = process.env.ALGOLIA_EPHEMERAL_INDEX || 'ephemeral_tests_index';\n\n// Algolia API Keys (search-only, restricted to the specific indices)\nconst ALGOLIA_PROD_API_KEY =\n process.env.ALGOLIA_PROD_API_KEY ||\n 'NDc2N2JlMmY5ZGE2NzM4NDIwOWM2ODkyMWY0Yjk5YjYyNTA5NTViNDg2YzNlN2VlZDE4MmYyOWE3YmRjNjg1ZXJlc3RyaWN0SW5kaWNlcz1wcm9kdWN0aW9uX3Rlc3RzX2luZGV4';\nconst ALGOLIA_STAGING_API_KEY =\n process.env.ALGOLIA_STAGING_API_KEY ||\n 'ZjZmYWMwYjNkN2IxZjViYzA0OTZkZGE3OWY5MmVjYWMzN2RlYWJlYjcyOWRlMWQ3YjMwM2RjYjk0NDNjZGY0MXJlc3RyaWN0SW5kaWNlcz1zdGFnaW5nX3Rlc3RzX2luZGV4';\nconst ALGOLIA_EPHEMERAL_API_KEY =\n process.env.ALGOLIA_EPHEMERAL_API_KEY || '5beea78e78134e8270214f93b7032e7b';\n\n/**\n * Returns environment-specific Algolia API URL\n */\nexport const getAlgoliaUrl = (): string => {\n const isProduction = baseURL.includes('app.testgorilla');\n\n if (isEphemeralEnvironment) {\n return `https://v8y626j4k8-dsn.algolia.net/1/indexes/${ALGOLIA_EPHEMERAL_INDEX}/query`;\n }\n\n const index = isProduction ? ALGOLIA_PROD_INDEX : ALGOLIA_STAGING_INDEX;\n const domain = isProduction ? 'algolianet.com' : 'algolia.net';\n const subdomain = isProduction ? 'v8y626j4k8-2' : 'v8y626j4k8-dsn';\n\n return `https://${subdomain}.${domain}/1/indexes/${index}/query`;\n};\n\n/**\n * Returns environment-specific Algolia API headers\n */\nexport const getAlgoliaHeaders = (): Record<string, string> => {\n const isProduction = baseURL.includes('app.testgorilla');\n\n let apiKey: string;\n if (isEphemeralEnvironment) {\n apiKey = ALGOLIA_EPHEMERAL_API_KEY;\n } else {\n apiKey = isProduction ? ALGOLIA_PROD_API_KEY : ALGOLIA_STAGING_API_KEY;\n }\n\n return {\n 'content-type': 'application/x-www-form-urlencoded',\n 'x-algolia-api-key': apiKey,\n 'x-algolia-application-id': ALGOLIA_APP_ID,\n };\n};\n","/**\n * Constants & Retries\n *\n * Contains global retry counters and other application constants.\n */\n\nimport { env } from 'process';\n\n// Retry counters - used to determine retry behavior in tests\nexport const DEFAULT_RETRY_COUNTER = 10;\nexport const INCREASED_RETRY_COUNTER_50 = DEFAULT_RETRY_COUNTER * 1.5;\nexport const INCREASED_RETRY_COUNTER_80 = DEFAULT_RETRY_COUNTER * 1.8;\nexport const INCREASED_RETRY_COUNTER_200 = DEFAULT_RETRY_COUNTER * 2;\nexport const INCREASED_RETRY_COUNTER_300 = DEFAULT_RETRY_COUNTER * 3;\n\n// Logger configuration. Default: WARN both in CI and locally — opt in to INFO for milestones\n// or DEBUG for per-request chatter via the LOG_LEVEL env var.\n// API_LOG_LEVEL / API_LOG_FILE are accepted for back-compat with a one-time deprecation note.\nconst rawLogLevel = env.LOG_LEVEL?.toUpperCase() || env.API_LOG_LEVEL?.toUpperCase() || 'WARN';\nif (!env.LOG_LEVEL && env.API_LOG_LEVEL && !env._LOG_DEPRECATION_WARNED) {\n process.stderr.write(\n '[logger] API_LOG_LEVEL is deprecated; use LOG_LEVEL instead (same values).\\n',\n );\n env._LOG_DEPRECATION_WARNED = '1';\n}\nexport const logLevel = rawLogLevel as 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'NONE';\nexport const logFile = env.LOG_FILE || env.API_LOG_FILE || '';\n\n// Back-compat aliases — prefer logLevel / logFile in new code.\nexport const apiLogLevel = logLevel;\nexport const apiLogFile = logFile;\n\n// Assessment configuration — the name→id map published by global setup\n// (process.env.assessments; see @testgorilla/e2e-framework/setup).\nexport const assessmentList = JSON.parse(env.assessments || '{}');\n\n// Other constants\nexport const MAILPIT_SERVER = 'http://localhost:8025';\nexport const simpleAssessmentName = `New Simple Assessment - ${Date.now()}`;\nexport const invitationEmailSubject = 'Your application at TestGorilla';\n\n// Email reception tracking\nexport const emailReception = { slowEmailAPI: false };\n","/**\n * Compatibility surface over {@link resolveTgEnvironment}.\n *\n * Every export here preserves the NAME and SHAPE (const vs function) of the\n * corresponding export in tgo-qa-automation's `helpers/config`, so consumers\n * migrate with a module-specifier-only import rewrite. The values come from a\n * single module-load resolution of `process.env` — the same timing the suite\n * relies on today (env is inherited by every Playwright worker process).\n *\n * Credentials ship with NO defaults: `password` is empty when `E2E_PASSWORD`\n * is unset (the structured `accounts.password` accessor throws with guidance\n * instead).\n */\nimport { resolveTgEnvironment } from './resolve';\nimport { getRunId } from './runId';\n\nexport type { E2eAccounts, E2eConfig, E2eUrls } from './types';\nexport { resolveTgEnvironment } from './resolve';\n\nconst cfg = resolveTgEnvironment();\n\n// --- Environment & URLs (parity with helpers/config/environment.ts) ---\n\nexport const baseURL = cfg.baseURL;\nexport const environment = cfg.environment;\nexport const isEphemeralEnvironment = cfg.isEphemeralEnvironment;\nexport const ephemeralPrefix = cfg.ephemeralPrefix;\nexport const ephemeralId = cfg.ephemeralId;\nexport const isLocalEnvironment = cfg.isLocalEnvironment;\nexport const adminURL = cfg.adminURL;\nexport const localMailHogURL = 'http://localhost:8025';\n\n/** Returns environment-specific mailpit (ephemeral) or local MailHog URL. */\nexport const mailpitURL = (): string => cfg.urls.mailpit;\n\n/**\n * Returns the LocalStack URL for the current ephemeral environment, or `null`\n * when not running against one.\n */\nexport const localstackURL = (): string | null => cfg.urls.localstack;\n\n/** Returns environment-specific talent base URL. */\nexport const talentBaseURL = (): string => cfg.urls.talentBase;\n\n/** Returns environment-specific talent assessment URL. */\nexport const talentAssessmentURL = (): string => cfg.urls.talentAssessment;\n\n/** Returns environment-specific talent API URL. */\nexport const talentApiURL = (): string => cfg.urls.talentApi;\n\n/** Returns environment-specific code runner API URL. */\nexport const codeRunnerApiURL = (): string => cfg.urls.codeRunnerApi;\n\n/** Returns environment-specific website base URL. */\nexport const websiteBaseURL = (): string => cfg.urls.websiteBase;\n\n/** Returns environment-specific signup sender address. */\nexport const signupFromEmail = (): string => cfg.emails.signupFrom;\n\n/** Returns environment-specific assessments sender address. */\nexport const assessmentsFromEmail = (): string => cfg.emails.assessmentsFrom;\n\n/** Check if current environment is NOT staging. */\nexport const ifNotStagingRun = (): boolean => !cfg.baseURL.includes('staging.testgorilla');\n\n/**\n * Check if current environment is NEITHER staging NOR an ephemeral dev env.\n * Use this to skip tests that depend on the website → app signup flow.\n */\nexport const ifNotStagingOrEphemeralRun = (): boolean =>\n ifNotStagingRun() && !cfg.isEphemeralEnvironment;\n\n/** Check if current environment is NOT localhost. */\nexport const ifNotLocalhostRun = (): boolean => !cfg.baseURL.includes('localhost');\n\n/**\n * Rewrites a signup URL produced by the marketing website (which always\n * points at app.testgorilla.com) so it targets the current environment.\n */\nexport const rewriteSignupUrlForEnv = (signupUrl: string): string => {\n const targetHost = new URL(cfg.baseURL).host;\n return signupUrl.replace(/app\\.testgorilla\\.com/i, targetHost);\n};\n\n// --- Environment URL constants (parity with helpers/config/environment.ts) ---\n\nexport const prodTesttakerUrlString = 'https://assessment.testgorilla.com';\nexport const prodTASUrlString = 'https://talent-assessment.testgorilla.com';\nexport const stageTesttakerUrlString = 'https://staging-assessment.testgorilla.com';\nexport const stageTASUrlString = 'https://talent-assessment-staging.testgorilla.com';\nexport const devTASUrlString = 'https://talent-assessment-dev.testgorilla.com';\nexport const localTASUrlString = 'http://localhost:4100';\nexport const stagingTASAPIUrl = 'https://api-talent-staging.testgorilla.com';\n\n// --- Seed assessment names (product constants, non-secret) ---\n\nexport const CandidateInviteAssessment = 'Candidate-Invite-Assessment-4-Do-not-archive';\nexport const candidateExpiredAssessment = 'Candidate-Expired-Assessment-1-Do-not-archive';\nexport const candidateArchivedAssessment = 'Candidate-Archived-Assessment-1-Do-not-archive';\nexport const tasSimpleMcqAssessment = 'TAS-MCQ-Assessment';\nexport const tasCustomTestAssessment = 'TAS-Custom-Test-Assessment';\nexport const tasSimpleBulkAssessment = 'TAS-Bulk-Assessment';\n\n// --- Test accounts (parity with helpers/config/testAccounts.ts, secrets stripped) ---\n\n/** Structured account set; `accounts.password` throws with guidance if `E2E_PASSWORD` is unset. */\nexport const accounts = cfg.accounts;\n\n/** Main organizer account email for this run. */\nexport const email = cfg.accounts.organizerEmail;\n\n/**\n * Organizer password from `E2E_PASSWORD` (legacy `e2e_password`). Empty string\n * when unset — the framework ships no credential defaults. Prefer\n * `accounts.password`, which throws with setup guidance instead of silently\n * yielding ''.\n */\nexport const password = process.env.E2E_PASSWORD ?? process.env.e2e_password ?? '';\n\nexport const candidateEmail = cfg.accounts.candidateEmail;\nexport const hiringManagerEmail = cfg.accounts.hiringManagerEmail;\nexport const recruiterEmail = cfg.accounts.recruiterEmail;\nexport const adminEmail = cfg.accounts.adminEmail;\nexport const newAdminEmail = cfg.accounts.newAdminEmail;\nexport const freeUserEmail = cfg.accounts.freeUserEmail;\nexport const corePlanUserEmail = cfg.accounts.corePlanUserEmail;\nexport const plusPlanUserEmail = cfg.accounts.plusPlanUserEmail;\nexport const proPlanUserEmail = cfg.accounts.proPlanUserEmail;\nexport const businessPlanUserEmail = cfg.accounts.businessPlanUserEmail;\nexport const starterPlanUserEmail = cfg.accounts.starterPlanUserEmail;\nexport const myProfileUserEmail = cfg.accounts.myProfileUserEmail;\nexport const atsIntegrationsEmail = cfg.accounts.atsIntegrationsEmail;\n\nconst EMAIL_DOMAIN = '@testgorilla.com';\nconst DUMMY_TESTS_PREFIX = 'dummy.tests';\n\n// Per-process tie-breaker so two mints in the same millisecond never collide.\nlet mintCounter = 0;\n\n/**\n * Unique, run-attributable suffix for generated identities:\n * `<runId>x<epoch36><counter>`. Embedding the run id makes every row on the\n * shared staging DB traceable to the CI workflow or local user that created\n * it, and lets purge jobs select marked data (.github/instructions/07-test-data.md).\n */\nconst mintSuffix = (): string => `${getRunId()}x${Date.now().toString(36)}${mintCounter++}`;\n\n/**\n * Generate a random candidate email.\n * Format: `dummy.tests+cand<rand><runId>x<timestamp>@testgorilla.com`.\n */\nexport const randCandidateEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+cand${rand}${mintSuffix()}${EMAIL_DOMAIN}`;\n\n/**\n * Generate a random customer email.\n * Format: `dummy.tests+cust<rand><runId>x<timestamp>@testgorilla.com`.\n */\nexport const randCustomerEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+cust${rand}${mintSuffix()}${EMAIL_DOMAIN}`;\n\n// --- Algolia, constants, recaptcha (parity with helpers/config) ---\n// Lazily circular: algolia/recaptcha read baseURL/isEphemeralEnvironment from\n// this barrel inside their functions only, never at module load.\n\nexport { getAlgoliaUrl, getAlgoliaHeaders } from './algolia';\nexport * from './constants';\nexport { getRecaptchaBypassKey, setRecaptchaBypassKeyProvider } from './recaptcha';\nexport type { RecaptchaKeyProvider } from './recaptcha';\n\n/**\n * Generate a random team-member email tagged with the current environment.\n * Format: `dummy.tests+t<rand><env>+<runId>x<timestamp>@testgorilla.com`.\n */\nexport const randTeamMemberEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+t${rand}${cfg.environment}+${mintSuffix()}${EMAIL_DOMAIN}`;\n\n// Random test-data generators (faker replacement) + username/phone utilities\nexport * from './randomData';\nexport { getRunId };\n","import { baseURL, isLocalEnvironment } from '../config';\n\nexport enum TestName {\n CultureAdd = 'Culture add',\n Communication = 'Communication',\n Motivation = 'Motivation',\n Disc = 'DISC',\n CustomQuestion = 'Custom questions',\n PHPCoding_stage = 'PHP (coding): object-oriented programming',\n PHPCoding_prod = 'PHP (Coding): Object-Oriented Programming',\n PythonCodingDebugging = 'Coding: Debugging',\n PythonCodingDebugging_prod = 'Python (Coding): Debugging',\n PythonCodingEntryLevel = 'Python (coding): entry-level algorithms',\n AttentionToDetail = 'Attention to Detail (Textual)',\n EnglishProficiency = 'English C1 (Advanced)',\n EnglishIntermediate = 'English (intermediate/B1)',\n RubyOnRails = 'Ruby on Rails',\n JavaScriptCodingEntryLevel = 'JavaScript (Coding): Entry-Level Algorithms',\n TypeScriptCodingEntryLevel = 'TypeScript (coding): entry-level algorithms',\n PhpEntryLevel = 'PHP (coding): intermediate-level algorithms',\n SqliteIntermediate = 'SQLite (coding): intermediate-level querying',\n SQLiteEntryLevel = 'SQLite (coding): entry-level database operations',\n JavaEntryLevel = 'Java (coding): entry-level algorithms',\n CCodingEntryLevel = 'C (coding): entry-level algorithms',\n CPPCodingEntryLevel = 'C++ (coding): entry-level algorithms',\n CHashCodingEntryLevel = 'C# (coding): entry-level algorithms',\n RubyEntryLevel = 'Ruby (coding): entry-level algorithms',\n Ennéagramme = 'Ennéagramme',\n AttentionToDetailVisual = 'Attention to detail (visual)',\n WorkingWithData = 'Working with data',\n ReadingComprehension = 'Reading comprehension',\n TypingSpeedLowerCase = 'Typing Speed (Lowercase Only)',\n TypingSpeedCapitalization = 'Typing Speed (Capitalization and Punctuation)',\n TypingSpeedNumbersOnly = 'Typing Speed (Numbers Only)',\n VerbalReasoning = 'Verbal Reasoning',\n ProblemSolving = 'Problem Solving',\n ProblemSolvingStaging = 'Problem solving',\n Big5 = 'Big 5 (OCEAN)',\n TimeManagement = 'Time Management',\n TimeManagementStaging = 'Time management',\n RubyDebugging = 'Ruby (coding): debugging',\n CodingEntryLevel = 'Coding: Entry-level algorithms',\n Tableau = 'Tableau',\n FollowingInstructions = 'Following instructions',\n UnderstandingInstructions = 'Understanding instructions',\n GoogleSpreadsheetSimulation = 'Google Sheets Spreadsheet Simulation',\n CloudSystemAdministration = 'Cloud System Administration',\n AndroidKotlin = 'Android Development Using Kotlin',\n ActiveListening = 'Active Listening',\n MySQL = 'MySQL',\n SpreadsheetSimulation = 'Spreadsheet Simulation: Google Sheets (Intermediate)',\n UniversalSkillsProfiler = 'Universal Skills Profiler',\n Enneagram = 'Enneagram',\n HTML5 = 'HTML5',\n CriticalThinking = 'Critical thinking',\n HubspotCRM = 'Hubspot CRM',\n Shopify = 'Shopify',\n Laravel = 'Laravel',\n Flutter = 'Flutter',\n IntermediateMath = 'Intermediate Math',\n Zendesk = 'Zendesk CS',\n PurchaseManager = 'Purchase Manager',\n SQLQuerying = 'SQLite (Coding): Intermediate-Level Querying',\n ImmersiveTest = 'Customer Service (Immersive Role-Play)',\n AIResume = 'AI Resume Scoring',\n SoftwareArchitect = 'Software architect',\n AWS = 'AWS',\n}\n\nexport enum ProgrammingLanguages {\n Python = 'Python',\n JavaScript = 'JavaScript',\n TypeScript = 'TypeScript',\n Php = 'PHP',\n Sqlite = 'SQLite',\n Java = 'Java',\n C = 'C',\n CPP = 'C++',\n CHash = 'C#',\n Ruby = 'Ruby',\n}\n\nexport const TestDuration = getTestDuration();\n\nfunction getTestDuration() {\n if (baseURL.includes('app')) {\n return {\n CultureAdd: '10',\n AttentionToDetail: '12',\n AttentionToDetailVisual: '10',\n EnglishProficiency: '10',\n CustomTest: '10',\n PythonCoding: '14',\n };\n } else if (isLocalEnvironment) {\n return {\n CultureAdd: '10',\n AttentionToDetail: '12',\n AttentionToDetailVisual: '10',\n EnglishProficiency: '10',\n CustomTest: '10',\n PythonCoding: '8',\n };\n } else {\n return {\n CultureAdd: '10',\n AttentionToDetail: '10',\n AttentionToDetailVisual: '10',\n EnglishProficiency: '10',\n CustomTest: '10',\n PythonCoding: '14',\n };\n }\n}\n\nexport enum CodingTaskOutput {\n TaskSuccess = 'Code executed successfully',\n TaskFailure = 'Task finished with errors.Traceback (most recent call last):',\n TaskMessage = 'Task',\n EmptyScriptTaskMessage = 'Run tests to check your code',\n}\n\nexport enum PersonalityAndCultureTestName {\n CultureAddSurvey = 'Culture add survey',\n MotivationTestSurvey = 'Motivation test survey',\n}\n\nexport enum TestKeyWord {\n Motivation = 'Motivation',\n}\n\nexport enum TestType {\n PersonalityAndCulture = 'Personality & culture',\n ProgrammingSkills = 'Programming skills',\n}\n\nexport enum TestFormat {\n MultipleChoice = 'Multiple-choice',\n Coding = 'Coding',\n Typing = 'Typing',\n Questionnaire = 'Questionnaire',\n Simulation = 'Simulation',\n}\n\nexport enum TestDurations {\n ZeroToTenMinutes = 'Up to 10 mins',\n ElevenToTwentyMinutes = '11 to 20 mins',\n TwentyoneToThirtyMinutes = '21 to 30 mins',\n ThirtyoneTosixtyMinutes = '31 to 60 mins',\n}\n\nexport enum TestsCount {\n ZeroTests = '0 added',\n OneTests = '1 test',\n TwoTests = '2 added',\n ThreeTests = '3 test',\n FourTests = '4 test',\n FiveTests = '5 added',\n}\n\nexport enum TestFilterNames {\n Library = 'Show tests from',\n RoleSpecific = 'Skills for',\n Focus = 'Focus',\n Duration = 'Duration',\n Format = 'Format',\n Highlights = 'Highlights',\n}\n\nexport enum CodingQuestions {\n Python = 'Python',\n}\n\nexport enum CreateCodingTestHeaders {\n FunctionSignature = 'Function signature',\n InitialCode = 'Initial code',\n TestCases = 'Test cases',\n VerificationCode = 'Verification code',\n}\n\nexport enum PracticeQuestions {\n AttentionToDetail = 'info This is the first practice question. You are in charge of sending invitations for a class reunion next month. You compare the address on file for one participant with the address available in the yearbook, which are as shown below',\n CodingQuestion = 'The purpose of this question is to show you how coding tests work. You are not being scored for anything in this question.',\n EnglishProficiency = 'Read the text and choose the synonym of the underlined word.',\n RubyOnRails = 'Which of the available queries returns the authors who have written at least one book?',\n}\n","/**\n * Sourcing-fixture talents\n *\n * Sourcing tests refer to two seeded talents (Kitchen Assistant, Dog Trainer)\n * to drive filter/save/invite assertions. The talents diverge between\n * environments:\n *\n * - Staging: long-lived canonical talents. Many other \"Kitchen Assistant\"\n * profiles exist as a side effect of other tests, so the talent must be\n * pinned by UUID. Verified-skills set is rich (4 tests).\n *\n * - Ephemeral: synthetic talents seeded from sourcing-test-data-50.csv.\n * The dataset is deterministic and contains exactly one Kitchen Assistant\n * and one Dog Trainer, so visible-attribute lookup (job title) is\n * sufficient. The verified-skills set is currently thinner (1 test).\n *\n * Tests should use `sourcingPage.getFixtureTalentCard(fixture)` which picks\n * the right lookup strategy from the env, and reference `verifiedSkills` /\n * `filterTests` directly when their assertions depend on those.\n */\n\nimport { env } from 'process';\nimport { TestName } from '../enums';\nimport { isEphemeralEnvironment } from '../config';\n\n// Seeded sourcing-talent UUIDs (staging fixtures; env-overridable per\n// environment). Not credentials - they appear in DOM data attributes.\nexport const kitchenAssistantTalentId =\n env.kitchenAssistantTalentId || 'd4841f0d-158f-4589-8bcb-d52751a44fee';\nexport const dogTrainerTalentId = env.dogTrainerTalentId || 'dbb6f423-1d02-4c53-bdb0-56cf09cceda5';\n\nexport interface SourcingTalentFixture {\n /** Stable UUID — used for `tgo-talent-card-all[data-talent-id=\"…\"]` lookup on staging. */\n uuid: string;\n /** Rendered job-title line (e.g. \"Kitchen Assistant at Kitchen Company\"). Used for lookup on ephemeral. */\n jobTitle: string;\n /** Verified-skill names the talent card displays. */\n verifiedSkills: string[];\n /** Tests the talent has taken; usable as a sourcing \"Tests\" filter input. */\n filterTests: TestName[];\n /**\n * Ranking criteria that deterministically narrow a role search to this talent.\n * The sourcing search ranks/filters by these criteria; a criterion unique to\n * the seeded talent surfaces it reliably (avoids live-search result variance).\n */\n rankingCriteria: string[];\n}\n\nexport const kitchenAssistantFixture: SourcingTalentFixture = isEphemeralEnvironment\n ? {\n uuid: kitchenAssistantTalentId,\n jobTitle: 'Kitchen Assistant at Kitchen Company',\n verifiedSkills: ['Critical Thinking'],\n filterTests: [TestName.CriticalThinking],\n rankingCriteria: ['Cutting bread'],\n }\n : {\n uuid: kitchenAssistantTalentId,\n jobTitle: 'Kitchen Assistant at Kitchen Company',\n verifiedSkills: ['Software architect', 'AWS'],\n filterTests: [TestName.SoftwareArchitect, TestName.RubyOnRails, TestName.AWS],\n rankingCriteria: ['Cutting bread'],\n };\n\nexport const dogTrainerFixture: SourcingTalentFixture = {\n uuid: dogTrainerTalentId,\n jobTitle: 'Dog trainer at Dog trainer organization',\n verifiedSkills: [],\n filterTests: [],\n rankingCriteria: [],\n};\n"],"mappings":"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","names":["env","accounts","baseURL","ephemeralPrefix","ephemeralId","isEphemeralEnvironment","environment","adminURL","import_process"]}
{"version":3,"sources":["../src/templates/index.ts","../src/config/resolve.ts","../src/config/algolia.ts","../src/config/constants.ts","../src/config/index.ts","../src/enums/tests.ts","../src/templates/sourcingFixtures.ts"],"sourcesContent":["import { isEphemeralEnvironment } from '../config';\nimport { TestName } from '../enums';\n\nexport const AssessmentTemplates = {\n AcademicEditor: [\n TestName.AttentionToDetail,\n // TestName.VerbalReasoning\n ],\n};\n\nexport const CandidateInviteAssessmentTests = [\n TestName.AttentionToDetail,\n TestName.CodingEntryLevel,\n TestName.EnglishProficiency,\n TestName.RubyOnRails,\n];\n\n// Used in ephemeral environments where the code runner is unavailable\nexport const CandidateInviteAssessmentTestsNoCodeRunner = [\n TestName.AttentionToDetail,\n TestName.EnglishProficiency,\n];\n\n/**\n * Returns the Candidate-Invite assessment test list expected for the current\n * environment. Ephemeral envs have no code runner, so global-setup seeds the\n * assessment without coding tests — assert against the matching list there.\n */\nexport const candidateInviteTestsForEnv = (): TestName[] =>\n isEphemeralEnvironment\n ? CandidateInviteAssessmentTestsNoCodeRunner\n : CandidateInviteAssessmentTests;\n\nexport {\n kitchenAssistantTalentId,\n dogTrainerTalentId,\n kitchenAssistantFixture,\n dogTrainerFixture,\n} from './sourcingFixtures';\nexport type { SourcingTalentFixture } from './sourcingFixtures';\n","import type { E2eAccounts, E2eConfig, E2eUrls } from './types';\n\n/**\n * Ephemeral environment detection.\n *\n * CI declares the target via `E2E_ENVIRONMENT` (the e2e-tests orb's\n * `environment` job parameter): `ephemeral` means ephemeral, any other value\n * means not — even if the URL happens to look ephemeral. When the variable is\n * unset (local runs, orb versions that don't export it yet), the baseURL\n * shape is the fallback signal.\n *\n * The URL parse itself stays either way: sibling service hosts are rebuilt\n * from the captured `<prefix>` and `<id>`. It is generic — no per-repo prefix\n * whitelist, so `backend-1234-…`, `talent-api-1756-…`,\n * `talent-assessment-987-…` and any future deployment prefix all match\n * `<prefix>-<id>-<service>.dev.testgorilla.com` without a framework release.\n * Lazy `(.+?)` splits at the FIRST `-<digits>-` segment so service names\n * containing digits (e.g. `cr-v2`) cannot mis-split the prefix.\n */\nconst EPHEMERAL_PREFIX_PATTERN = /https?:\\/\\/(.+?)-(\\d+)-[^.]+\\.dev\\.testgorilla\\.com/;\n\nconst LOCAL_MAILHOG_URL = 'http://localhost:8025';\n\n/**\n * Build a lazily-throwing secret accessor: the property reads as a normal\n * string when the env var is set, and throws with setup guidance the first\n * time it is READ while unset. Importing the config never throws.\n *\n * Non-enumerable so JSON-serializing an E2eConfig (e.g. passing it through\n * `test.use` in playwright.config, which serializes options to workers) can\n * neither leak the credential nor trip the missing-env error.\n */\nfunction defineRequiredSecret(\n target: object,\n property: string,\n value: string | undefined,\n envVar: string,\n): void {\n Object.defineProperty(target, property, {\n enumerable: false,\n configurable: true,\n get(): string {\n if (value === undefined || value === '') {\n throw new Error(\n `[e2e-framework] ${envVar} is not set. The framework ships no credential defaults — ` +\n `export ${envVar} (see your team's 1Password e2e .env entry) before running tests.`,\n );\n }\n return value;\n },\n });\n}\n\nfunction resolveAccounts(env: NodeJS.ProcessEnv): E2eAccounts {\n const nodeIndexedOrganizer = env.CIRCLE_NODE_TOTAL\n ? `dummy.tests+organizer${env.CIRCLE_NODE_INDEX}@testgorilla.com`\n : `dummy.tests+organizer11@testgorilla.com`;\n const accountIndex = env.E2E_ACCOUNT_INDEX;\n\n const accounts = {\n organizerEmail:\n env.userEmail ??\n (accountIndex !== undefined\n ? `dummy.tests+organizer${accountIndex}@testgorilla.com`\n : nodeIndexedOrganizer),\n candidateEmail: env.candidateEmail ?? 'dummy.tests@testgorilla.com',\n hiringManagerEmail: env.hiringManagerEmail ?? 'dummy.tests+hiringmanager01@testgorilla.com',\n recruiterEmail: env.recruiterEmail ?? 'dummy.tests+recruiter1@testgorilla.com',\n adminEmail: env.adminEmail ?? 'dummy.tests+admin1@testgorilla.com',\n newAdminEmail: env.newAdminEmail ?? 'dummy.tests+newadmin@testgorilla.com',\n freeUserEmail: env.freeUserEmail ?? 'dummy.tests+free0@testgorilla.com',\n corePlanUserEmail: env.corePlanUserEmail ?? 'dummy.tests+coreplan@testgorilla.com',\n plusPlanUserEmail: env.plusPlanUserEmail ?? 'dummy.tests+plus@testgorilla.com',\n proPlanUserEmail: env.proPlanUserEmail ?? 'dummy.tests+pro@testgorilla.com',\n businessPlanUserEmail: env.businessPlanUserEmail ?? 'dummy.tests+business@testgorilla.com',\n starterPlanUserEmail: env.starterPlanUserEmail ?? 'dummy.tests+starter@testgorilla.com',\n myProfileUserEmail: env.myProfileUserEmail ?? 'dummy.tests+myprofile@testgorilla.com',\n atsIntegrationsEmail:\n env.atsIntegrationsEmail ?? 'dummy.tests+ats-integrations@testgorilla.com',\n } as E2eAccounts;\n\n defineRequiredSecret(accounts, 'password', env.E2E_PASSWORD ?? env.e2e_password, 'E2E_PASSWORD');\n defineRequiredSecret(\n accounts,\n 'candidatePassword',\n env.E2E_CANDIDATE_PASSWORD,\n 'E2E_CANDIDATE_PASSWORD',\n );\n\n return accounts;\n}\n\nfunction resolveUrls(\n baseURL: string,\n ephemeralPrefix: string | null,\n ephemeralId: string | null,\n): E2eUrls {\n const isEphemeral = !!ephemeralId;\n const ephemeralHost = (service: string) =>\n `https://${ephemeralPrefix}-${ephemeralId}-${service}.dev.testgorilla.com`;\n const isProd = baseURL.includes('app.testgorilla');\n const isDev = baseURL.includes('dev.testgorilla');\n const isLocalhost = baseURL.includes('localhost');\n\n return {\n talentBase: isEphemeral\n ? ephemeralHost('talent')\n : isProd\n ? 'https://talent.testgorilla.com'\n : isDev\n ? 'https://talent-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4100'\n : 'https://talent-staging.testgorilla.com',\n talentAssessment: isEphemeral\n ? ephemeralHost('talent-assessment')\n : isProd\n ? 'https://talent-assessment.testgorilla.com'\n : isDev\n ? 'https://talent-assessment-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4100'\n : 'https://talent-assessment-staging.testgorilla.com',\n talentApi: isEphemeral\n ? ephemeralHost('api-talent')\n : isProd\n ? 'https://api-talent.testgorilla.com'\n : isDev\n ? 'https://api-talent-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4200'\n : 'https://api-talent-staging.testgorilla.com',\n codeRunnerApi: isProd\n ? 'https://cr-v2.testgorilla.com'\n : isDev\n ? 'https://cr-v2-dev.testgorilla.com'\n : 'https://cr-v2-staging.testgorilla.com',\n websiteBase: isProd\n ? 'https://www.testgorilla.com'\n : isDev && !isEphemeral\n ? 'https://website-dev.testgorilla.com'\n : 'https://website-staging.testgorilla.com',\n mailpit: isEphemeral ? ephemeralHost('mailpit') : LOCAL_MAILHOG_URL,\n localstack: isEphemeral ? ephemeralHost('localstack') : null,\n };\n}\n\n/**\n * Resolve the full e2e run configuration from environment variables, using\n * TestGorilla's environment naming conventions (staging default, ephemeral\n * `<prefix>-<id>-<service>` dev deployments, production `app`). CI declares\n * ephemerality explicitly via `E2E_ENVIRONMENT=ephemeral`; unset falls back\n * to baseURL-shape detection (see EPHEMERAL_PREFIX_PATTERN above).\n *\n * Pure with respect to its input: pass a custom env for testing; defaults to\n * `process.env`. Never throws on missing secrets — required credentials\n * (`E2E_PASSWORD`, `E2E_CANDIDATE_PASSWORD`) throw with guidance only when\n * first read. The one eager throw is a declared-ephemeral baseURL that the\n * ephemeral host pattern cannot parse (a CI wiring error).\n */\nexport function resolveTgEnvironment(env: NodeJS.ProcessEnv = process.env): E2eConfig {\n const baseURL = env.baseURL || 'https://staging.testgorilla.com';\n\n const ephemeralMatch = baseURL.match(EPHEMERAL_PREFIX_PATTERN);\n const declaredEnvironment = env.E2E_ENVIRONMENT?.toLowerCase();\n const isEphemeralEnvironment = declaredEnvironment\n ? declaredEnvironment === 'ephemeral'\n : !!ephemeralMatch;\n if (isEphemeralEnvironment && !ephemeralMatch) {\n // Config error, CI-only by construction (the variable is CI-set): every\n // derived sibling URL would be wrong, so fail fast instead of letting\n // tests fail confusingly against staging fallback hosts.\n throw new Error(\n `[e2e-framework] E2E_ENVIRONMENT=ephemeral but baseURL \"${baseURL}\" does not match ` +\n `<prefix>-<id>-<service>.dev.testgorilla.com — sibling service URLs cannot be derived.`,\n );\n }\n const ephemeralPrefix = isEphemeralEnvironment && ephemeralMatch ? ephemeralMatch[1] : null;\n const ephemeralId = isEphemeralEnvironment && ephemeralMatch ? ephemeralMatch[2] : null;\n\n const environment = baseURL.split('.testgorilla.com')[0].split('https://')[1] || 'staging';\n\n const adminURL =\n env.adminURL ||\n (isEphemeralEnvironment\n ? `https://${ephemeralPrefix}-${ephemeralId}-backend.dev.testgorilla.com`\n : environment === 'app'\n ? `https://new-admin.testgorilla.com`\n : `https://${environment}-new-admin.testgorilla.com`);\n\n const isProd = baseURL.includes('app.testgorilla');\n const isDev = baseURL.includes('dev.testgorilla');\n const isLocalhost = baseURL.includes('localhost');\n\n return {\n baseURL,\n environment,\n isEphemeralEnvironment,\n ephemeralPrefix,\n ephemeralId,\n isLocalEnvironment: env.localEnvironment === 'true' || isEphemeralEnvironment,\n adminURL,\n urls: resolveUrls(baseURL, ephemeralPrefix, ephemeralId),\n emails: {\n signupFrom: isProd\n ? 'hello@testgorilla.com'\n : isLocalhost\n ? 'noreply@example'\n : isDev || isEphemeralEnvironment\n ? 'hello@maildev.testgorilla.com'\n : 'hello@mailstaging.testgorilla.com',\n assessmentsFrom: isProd\n ? 'assessments@testgorilla.com'\n : isLocalhost\n ? 'assessments@example.com'\n : isDev || isEphemeralEnvironment\n ? 'assessments@maildev.testgorilla.com'\n : 'assessments@mailstaging.testgorilla.com',\n },\n accounts: resolveAccounts(env),\n };\n}\n","/**\n * Algolia Configuration\n *\n * Test-library search used during assessment creation. The bundled defaults\n * are the same index-restricted, search-only keys the customer frontend ships\n * to browsers (not admin keys); override any of them via the ALGOLIA_* env\n * vars below without a code change (e.g. on key rotation).\n */\n\nimport { baseURL, isEphemeralEnvironment } from './index';\n\nconst ALGOLIA_APP_ID = process.env.ALGOLIA_APP_ID || 'V8Y626J4K8';\n\n// Algolia Index Names\nconst ALGOLIA_PROD_INDEX = process.env.ALGOLIA_PROD_INDEX || 'production_tests_index';\nconst ALGOLIA_STAGING_INDEX = process.env.ALGOLIA_STAGING_INDEX || 'staging_tests_index';\nconst ALGOLIA_EPHEMERAL_INDEX = process.env.ALGOLIA_EPHEMERAL_INDEX || 'ephemeral_tests_index';\n\n// Algolia API Keys (search-only, restricted to the specific indices)\nconst ALGOLIA_PROD_API_KEY =\n process.env.ALGOLIA_PROD_API_KEY ||\n 'NDc2N2JlMmY5ZGE2NzM4NDIwOWM2ODkyMWY0Yjk5YjYyNTA5NTViNDg2YzNlN2VlZDE4MmYyOWE3YmRjNjg1ZXJlc3RyaWN0SW5kaWNlcz1wcm9kdWN0aW9uX3Rlc3RzX2luZGV4';\nconst ALGOLIA_STAGING_API_KEY =\n process.env.ALGOLIA_STAGING_API_KEY ||\n 'ZjZmYWMwYjNkN2IxZjViYzA0OTZkZGE3OWY5MmVjYWMzN2RlYWJlYjcyOWRlMWQ3YjMwM2RjYjk0NDNjZGY0MXJlc3RyaWN0SW5kaWNlcz1zdGFnaW5nX3Rlc3RzX2luZGV4';\nconst ALGOLIA_EPHEMERAL_API_KEY =\n process.env.ALGOLIA_EPHEMERAL_API_KEY || '5beea78e78134e8270214f93b7032e7b';\n\n/**\n * Returns environment-specific Algolia API URL\n */\nexport const getAlgoliaUrl = (): string => {\n const isProduction = baseURL.includes('app.testgorilla');\n\n if (isEphemeralEnvironment) {\n return `https://v8y626j4k8-dsn.algolia.net/1/indexes/${ALGOLIA_EPHEMERAL_INDEX}/query`;\n }\n\n const index = isProduction ? ALGOLIA_PROD_INDEX : ALGOLIA_STAGING_INDEX;\n const domain = isProduction ? 'algolianet.com' : 'algolia.net';\n const subdomain = isProduction ? 'v8y626j4k8-2' : 'v8y626j4k8-dsn';\n\n return `https://${subdomain}.${domain}/1/indexes/${index}/query`;\n};\n\n/**\n * Returns environment-specific Algolia API headers\n */\nexport const getAlgoliaHeaders = (): Record<string, string> => {\n const isProduction = baseURL.includes('app.testgorilla');\n\n let apiKey: string;\n if (isEphemeralEnvironment) {\n apiKey = ALGOLIA_EPHEMERAL_API_KEY;\n } else {\n apiKey = isProduction ? ALGOLIA_PROD_API_KEY : ALGOLIA_STAGING_API_KEY;\n }\n\n return {\n 'content-type': 'application/x-www-form-urlencoded',\n 'x-algolia-api-key': apiKey,\n 'x-algolia-application-id': ALGOLIA_APP_ID,\n };\n};\n","/**\n * Constants & Retries\n *\n * Contains global retry counters and other application constants.\n */\n\nimport { env } from 'process';\n\n// Retry counters - used to determine retry behavior in tests\nexport const DEFAULT_RETRY_COUNTER = 10;\nexport const INCREASED_RETRY_COUNTER_50 = DEFAULT_RETRY_COUNTER * 1.5;\nexport const INCREASED_RETRY_COUNTER_80 = DEFAULT_RETRY_COUNTER * 1.8;\nexport const INCREASED_RETRY_COUNTER_200 = DEFAULT_RETRY_COUNTER * 2;\nexport const INCREASED_RETRY_COUNTER_300 = DEFAULT_RETRY_COUNTER * 3;\n\n// Logger configuration. Default: WARN both in CI and locally — opt in to INFO for milestones\n// or DEBUG for per-request chatter via the LOG_LEVEL env var.\n// API_LOG_LEVEL / API_LOG_FILE are accepted for back-compat with a one-time deprecation note.\nconst rawLogLevel = env.LOG_LEVEL?.toUpperCase() || env.API_LOG_LEVEL?.toUpperCase() || 'WARN';\nif (!env.LOG_LEVEL && env.API_LOG_LEVEL && !env._LOG_DEPRECATION_WARNED) {\n process.stderr.write(\n '[logger] API_LOG_LEVEL is deprecated; use LOG_LEVEL instead (same values).\\n',\n );\n env._LOG_DEPRECATION_WARNED = '1';\n}\nexport const logLevel = rawLogLevel as 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'NONE';\nexport const logFile = env.LOG_FILE || env.API_LOG_FILE || '';\n\n// Back-compat aliases — prefer logLevel / logFile in new code.\nexport const apiLogLevel = logLevel;\nexport const apiLogFile = logFile;\n\n// Assessment configuration — the name→id map published by global setup\n// (process.env.assessments; see @testgorilla/e2e-framework/setup).\nexport const assessmentList = JSON.parse(env.assessments || '{}');\n\n// Other constants\nexport const MAILPIT_SERVER = 'http://localhost:8025';\nexport const simpleAssessmentName = `New Simple Assessment - ${Date.now()}`;\nexport const invitationEmailSubject = 'Your application at TestGorilla';\n\n// Email reception tracking\nexport const emailReception = { slowEmailAPI: false };\n","/**\n * Compatibility surface over {@link resolveTgEnvironment}.\n *\n * Every export here preserves the NAME and SHAPE (const vs function) of the\n * corresponding export in tgo-qa-automation's `helpers/config`, so consumers\n * migrate with a module-specifier-only import rewrite. The values come from a\n * single module-load resolution of `process.env` — the same timing the suite\n * relies on today (env is inherited by every Playwright worker process).\n *\n * Credentials ship with NO defaults: `password` is empty when `E2E_PASSWORD`\n * is unset (the structured `accounts.password` accessor throws with guidance\n * instead).\n */\nimport { resolveTgEnvironment } from './resolve';\nimport { getRunId } from './runId';\n\nexport type { E2eAccounts, E2eConfig, E2eUrls } from './types';\nexport { resolveTgEnvironment } from './resolve';\n\nconst cfg = resolveTgEnvironment();\n\n// --- Environment & URLs (parity with helpers/config/environment.ts) ---\n\nexport const baseURL = cfg.baseURL;\nexport const environment = cfg.environment;\nexport const isEphemeralEnvironment = cfg.isEphemeralEnvironment;\nexport const ephemeralPrefix = cfg.ephemeralPrefix;\nexport const ephemeralId = cfg.ephemeralId;\nexport const isLocalEnvironment = cfg.isLocalEnvironment;\nexport const adminURL = cfg.adminURL;\nexport const localMailHogURL = 'http://localhost:8025';\n\n/** Returns environment-specific mailpit (ephemeral) or local MailHog URL. */\nexport const mailpitURL = (): string => cfg.urls.mailpit;\n\n/**\n * Returns the LocalStack URL for the current ephemeral environment, or `null`\n * when not running against one.\n */\nexport const localstackURL = (): string | null => cfg.urls.localstack;\n\n/** Returns environment-specific talent base URL. */\nexport const talentBaseURL = (): string => cfg.urls.talentBase;\n\n/** Returns environment-specific talent assessment URL. */\nexport const talentAssessmentURL = (): string => cfg.urls.talentAssessment;\n\n/** Returns environment-specific talent API URL. */\nexport const talentApiURL = (): string => cfg.urls.talentApi;\n\n/** Returns environment-specific code runner API URL. */\nexport const codeRunnerApiURL = (): string => cfg.urls.codeRunnerApi;\n\n/** Returns environment-specific website base URL. */\nexport const websiteBaseURL = (): string => cfg.urls.websiteBase;\n\n/** Returns environment-specific signup sender address. */\nexport const signupFromEmail = (): string => cfg.emails.signupFrom;\n\n/** Returns environment-specific assessments sender address. */\nexport const assessmentsFromEmail = (): string => cfg.emails.assessmentsFrom;\n\n/** Check if current environment is NOT staging. */\nexport const ifNotStagingRun = (): boolean => !cfg.baseURL.includes('staging.testgorilla');\n\n/**\n * Check if current environment is NEITHER staging NOR an ephemeral dev env.\n * Use this to skip tests that depend on the website → app signup flow.\n */\nexport const ifNotStagingOrEphemeralRun = (): boolean =>\n ifNotStagingRun() && !cfg.isEphemeralEnvironment;\n\n/** Check if current environment is NOT localhost. */\nexport const ifNotLocalhostRun = (): boolean => !cfg.baseURL.includes('localhost');\n\n/**\n * Rewrites a signup URL produced by the marketing website (which always\n * points at app.testgorilla.com) so it targets the current environment.\n */\nexport const rewriteSignupUrlForEnv = (signupUrl: string): string => {\n const targetHost = new URL(cfg.baseURL).host;\n return signupUrl.replace(/app\\.testgorilla\\.com/i, targetHost);\n};\n\n// --- Environment URL constants (parity with helpers/config/environment.ts) ---\n\nexport const prodTesttakerUrlString = 'https://assessment.testgorilla.com';\nexport const prodTASUrlString = 'https://talent-assessment.testgorilla.com';\nexport const stageTesttakerUrlString = 'https://staging-assessment.testgorilla.com';\nexport const stageTASUrlString = 'https://talent-assessment-staging.testgorilla.com';\nexport const devTASUrlString = 'https://talent-assessment-dev.testgorilla.com';\nexport const localTASUrlString = 'http://localhost:4100';\nexport const stagingTASAPIUrl = 'https://api-talent-staging.testgorilla.com';\n\n// --- Seed assessment names (product constants, non-secret) ---\n\nexport const CandidateInviteAssessment = 'Candidate-Invite-Assessment-4-Do-not-archive';\nexport const candidateExpiredAssessment = 'Candidate-Expired-Assessment-1-Do-not-archive';\nexport const candidateArchivedAssessment = 'Candidate-Archived-Assessment-1-Do-not-archive';\nexport const tasSimpleMcqAssessment = 'TAS-MCQ-Assessment';\nexport const tasCustomTestAssessment = 'TAS-Custom-Test-Assessment';\nexport const tasSimpleBulkAssessment = 'TAS-Bulk-Assessment';\n\n// --- Test accounts (parity with helpers/config/testAccounts.ts, secrets stripped) ---\n\n/** Structured account set; `accounts.password` throws with guidance if `E2E_PASSWORD` is unset. */\nexport const accounts = cfg.accounts;\n\n/** Main organizer account email for this run. */\nexport const email = cfg.accounts.organizerEmail;\n\n/**\n * Organizer password from `E2E_PASSWORD` (legacy `e2e_password`). Empty string\n * when unset — the framework ships no credential defaults. Prefer\n * `accounts.password`, which throws with setup guidance instead of silently\n * yielding ''.\n */\nexport const password = process.env.E2E_PASSWORD ?? process.env.e2e_password ?? '';\n\nexport const candidateEmail = cfg.accounts.candidateEmail;\nexport const hiringManagerEmail = cfg.accounts.hiringManagerEmail;\nexport const recruiterEmail = cfg.accounts.recruiterEmail;\nexport const adminEmail = cfg.accounts.adminEmail;\nexport const newAdminEmail = cfg.accounts.newAdminEmail;\nexport const freeUserEmail = cfg.accounts.freeUserEmail;\nexport const corePlanUserEmail = cfg.accounts.corePlanUserEmail;\nexport const plusPlanUserEmail = cfg.accounts.plusPlanUserEmail;\nexport const proPlanUserEmail = cfg.accounts.proPlanUserEmail;\nexport const businessPlanUserEmail = cfg.accounts.businessPlanUserEmail;\nexport const starterPlanUserEmail = cfg.accounts.starterPlanUserEmail;\nexport const myProfileUserEmail = cfg.accounts.myProfileUserEmail;\nexport const atsIntegrationsEmail = cfg.accounts.atsIntegrationsEmail;\n\nconst EMAIL_DOMAIN = '@testgorilla.com';\nconst DUMMY_TESTS_PREFIX = 'dummy.tests';\n\n// Per-process tie-breaker so two mints in the same millisecond never collide.\nlet mintCounter = 0;\n\n/**\n * Unique, run-attributable suffix for generated identities:\n * `<runId>x<epoch36><counter>`. Embedding the run id makes every row on the\n * shared staging DB traceable to the CI workflow or local user that created\n * it, and lets purge jobs select marked data (.github/instructions/07-test-data.md).\n */\nconst mintSuffix = (): string => `${getRunId()}x${Date.now().toString(36)}${mintCounter++}`;\n\n/**\n * Generate a random candidate email.\n * Format: `dummy.tests+cand<rand><runId>x<timestamp>@testgorilla.com`.\n */\nexport const randCandidateEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+cand${rand}${mintSuffix()}${EMAIL_DOMAIN}`;\n\n/**\n * Generate a random customer email.\n * Format: `dummy.tests+cust<rand><runId>x<timestamp>@testgorilla.com`.\n */\nexport const randCustomerEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+cust${rand}${mintSuffix()}${EMAIL_DOMAIN}`;\n\n// --- Algolia, constants, recaptcha (parity with helpers/config) ---\n// Lazily circular: algolia/recaptcha read baseURL/isEphemeralEnvironment from\n// this barrel inside their functions only, never at module load.\n\nexport { getAlgoliaUrl, getAlgoliaHeaders } from './algolia';\nexport * from './constants';\nexport { getRecaptchaBypassKey, setRecaptchaBypassKeyProvider } from './recaptcha';\nexport type { RecaptchaKeyProvider } from './recaptcha';\n\n/**\n * Generate a random team-member email tagged with the current environment.\n * Format: `dummy.tests+t<rand><env>+<runId>x<timestamp>@testgorilla.com`.\n */\nexport const randTeamMemberEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+t${rand}${cfg.environment}+${mintSuffix()}${EMAIL_DOMAIN}`;\n\n// Random test-data generators (faker replacement) + username/phone utilities\nexport * from './randomData';\nexport { getRunId };\n","import { baseURL, isLocalEnvironment } from '../config';\n\nexport enum TestName {\n CultureAdd = 'Culture add',\n Communication = 'Communication',\n Motivation = 'Motivation',\n Disc = 'DISC',\n CustomQuestion = 'Custom questions',\n PHPCoding_stage = 'PHP (coding): object-oriented programming',\n PHPCoding_prod = 'PHP (Coding): Object-Oriented Programming',\n PythonCodingDebugging = 'Coding: Debugging',\n PythonCodingDebugging_prod = 'Python (Coding): Debugging',\n PythonCodingEntryLevel = 'Python (coding): entry-level algorithms',\n AttentionToDetail = 'Attention to Detail (Textual)',\n EnglishProficiency = 'English C1 (Advanced)',\n EnglishIntermediate = 'English (intermediate/B1)',\n RubyOnRails = 'Ruby on Rails',\n JavaScriptCodingEntryLevel = 'JavaScript (Coding): Entry-Level Algorithms',\n TypeScriptCodingEntryLevel = 'TypeScript (coding): entry-level algorithms',\n PhpEntryLevel = 'PHP (coding): intermediate-level algorithms',\n SqliteIntermediate = 'SQLite (coding): intermediate-level querying',\n SQLiteEntryLevel = 'SQLite (coding): entry-level database operations',\n JavaEntryLevel = 'Java (coding): entry-level algorithms',\n CCodingEntryLevel = 'C (coding): entry-level algorithms',\n CPPCodingEntryLevel = 'C++ (coding): entry-level algorithms',\n CHashCodingEntryLevel = 'C# (coding): entry-level algorithms',\n RubyEntryLevel = 'Ruby (coding): entry-level algorithms',\n Ennéagramme = 'Ennéagramme',\n AttentionToDetailVisual = 'Attention to detail (visual)',\n WorkingWithData = 'Working with data',\n ReadingComprehension = 'Reading comprehension',\n TypingSpeedLowerCase = 'Typing Speed (Lowercase Only)',\n TypingSpeedCapitalization = 'Typing Speed (Capitalization and Punctuation)',\n TypingSpeedNumbersOnly = 'Typing Speed (Numbers Only)',\n VerbalReasoning = 'Verbal Reasoning',\n ProblemSolving = 'Problem Solving',\n ProblemSolvingStaging = 'Problem solving',\n Big5 = 'Big 5 (OCEAN)',\n TimeManagement = 'Time Management',\n TimeManagementStaging = 'Time management',\n RubyDebugging = 'Ruby (coding): debugging',\n CodingEntryLevel = 'Coding: Entry-level algorithms',\n Tableau = 'Tableau',\n FollowingInstructions = 'Following instructions',\n UnderstandingInstructions = 'Understanding instructions',\n GoogleSpreadsheetSimulation = 'Google Sheets Spreadsheet Simulation',\n CloudSystemAdministration = 'Cloud System Administration',\n AndroidKotlin = 'Android Development Using Kotlin',\n ActiveListening = 'Active Listening',\n MySQL = 'MySQL',\n SpreadsheetSimulation = 'Spreadsheet Simulation: Google Sheets (Intermediate)',\n UniversalSkillsProfiler = 'Universal Skills Profiler',\n Enneagram = 'Enneagram',\n HTML5 = 'HTML5',\n CriticalThinking = 'Critical thinking',\n HubspotCRM = 'Hubspot CRM',\n Shopify = 'Shopify',\n Laravel = 'Laravel',\n Flutter = 'Flutter',\n IntermediateMath = 'Intermediate Math',\n Zendesk = 'Zendesk CS',\n PurchaseManager = 'Purchase Manager',\n SQLQuerying = 'SQLite (Coding): Intermediate-Level Querying',\n ImmersiveTest = 'Customer Service (Immersive Role-Play)',\n AIResume = 'AI Resume Scoring',\n SoftwareArchitect = 'Software architect',\n AWS = 'AWS',\n}\n\nexport enum ProgrammingLanguages {\n Python = 'Python',\n JavaScript = 'JavaScript',\n TypeScript = 'TypeScript',\n Php = 'PHP',\n Sqlite = 'SQLite',\n Java = 'Java',\n C = 'C',\n CPP = 'C++',\n CHash = 'C#',\n Ruby = 'Ruby',\n}\n\nexport const TestDuration = getTestDuration();\n\nfunction getTestDuration() {\n if (baseURL.includes('app')) {\n return {\n CultureAdd: '10',\n AttentionToDetail: '12',\n AttentionToDetailVisual: '10',\n EnglishProficiency: '10',\n CustomTest: '10',\n PythonCoding: '14',\n };\n } else if (isLocalEnvironment) {\n return {\n CultureAdd: '10',\n AttentionToDetail: '12',\n AttentionToDetailVisual: '10',\n EnglishProficiency: '10',\n CustomTest: '10',\n PythonCoding: '8',\n };\n } else {\n return {\n CultureAdd: '10',\n AttentionToDetail: '10',\n AttentionToDetailVisual: '10',\n EnglishProficiency: '10',\n CustomTest: '10',\n PythonCoding: '14',\n };\n }\n}\n\nexport enum CodingTaskOutput {\n TaskSuccess = 'Code executed successfully',\n TaskFailure = 'Task finished with errors.Traceback (most recent call last):',\n TaskMessage = 'Task',\n EmptyScriptTaskMessage = 'Run tests to check your code',\n}\n\nexport enum PersonalityAndCultureTestName {\n CultureAddSurvey = 'Culture add survey',\n MotivationTestSurvey = 'Motivation test survey',\n}\n\nexport enum TestKeyWord {\n Motivation = 'Motivation',\n}\n\nexport enum TestType {\n PersonalityAndCulture = 'Personality & culture',\n ProgrammingSkills = 'Programming skills',\n}\n\nexport enum TestFormat {\n MultipleChoice = 'Multiple-choice',\n Coding = 'Coding',\n Typing = 'Typing',\n Questionnaire = 'Questionnaire',\n Simulation = 'Simulation',\n}\n\nexport enum TestDurations {\n ZeroToTenMinutes = 'Up to 10 mins',\n ElevenToTwentyMinutes = '11 to 20 mins',\n TwentyoneToThirtyMinutes = '21 to 30 mins',\n ThirtyoneTosixtyMinutes = '31 to 60 mins',\n}\n\nexport enum TestsCount {\n ZeroTests = '0 added',\n OneTests = '1 test',\n TwoTests = '2 added',\n ThreeTests = '3 test',\n FourTests = '4 test',\n FiveTests = '5 added',\n}\n\nexport enum TestFilterNames {\n Library = 'Show tests from',\n RoleSpecific = 'Skills for',\n Focus = 'Focus',\n Duration = 'Duration',\n Format = 'Format',\n Highlights = 'Highlights',\n}\n\nexport enum CodingQuestions {\n Python = 'Python',\n}\n\nexport enum CreateCodingTestHeaders {\n FunctionSignature = 'Function signature',\n InitialCode = 'Initial code',\n TestCases = 'Test cases',\n VerificationCode = 'Verification code',\n}\n\nexport enum PracticeQuestions {\n AttentionToDetail = 'info This is the first practice question. You are in charge of sending invitations for a class reunion next month. You compare the address on file for one participant with the address available in the yearbook, which are as shown below',\n CodingQuestion = 'The purpose of this question is to show you how coding tests work. You are not being scored for anything in this question.',\n EnglishProficiency = 'Read the text and choose the synonym of the underlined word.',\n RubyOnRails = 'Which of the available queries returns the authors who have written at least one book?',\n}\n","/**\n * Sourcing-fixture talents\n *\n * Sourcing tests refer to two seeded talents (Kitchen Assistant, Dog Trainer)\n * to drive filter/save/invite assertions. The talents diverge between\n * environments:\n *\n * - Staging: long-lived canonical talents. Many other \"Kitchen Assistant\"\n * profiles exist as a side effect of other tests, so the talent must be\n * pinned by UUID. Verified-skills set is rich (4 tests).\n *\n * - Ephemeral: synthetic talents seeded from sourcing-test-data-50.csv.\n * The dataset is deterministic and contains exactly one Kitchen Assistant\n * and one Dog Trainer, so visible-attribute lookup (job title) is\n * sufficient. The verified-skills set is currently thinner (1 test).\n *\n * Tests should use `sourcingPage.getFixtureTalentCard(fixture)` which picks\n * the right lookup strategy from the env, and reference `verifiedSkills` /\n * `filterTests` directly when their assertions depend on those.\n */\n\nimport { env } from 'process';\nimport { TestName } from '../enums';\nimport { isEphemeralEnvironment } from '../config';\n\n// Seeded sourcing-talent UUIDs (staging fixtures; env-overridable per\n// environment). Not credentials - they appear in DOM data attributes.\nexport const kitchenAssistantTalentId =\n env.kitchenAssistantTalentId || 'd4841f0d-158f-4589-8bcb-d52751a44fee';\nexport const dogTrainerTalentId = env.dogTrainerTalentId || 'dbb6f423-1d02-4c53-bdb0-56cf09cceda5';\n\nexport interface SourcingTalentFixture {\n /** Stable UUID — used for `tgo-talent-card-all[data-talent-id=\"…\"]` lookup on staging. */\n uuid: string;\n /** Rendered job-title line (e.g. \"Kitchen Assistant at Kitchen Company\"). Used for lookup on ephemeral. */\n jobTitle: string;\n /** Verified-skill names the talent card displays. */\n verifiedSkills: string[];\n /** Tests the talent has taken; usable as a sourcing \"Tests\" filter input. */\n filterTests: TestName[];\n /**\n * Ranking criteria that deterministically narrow a role search to this talent.\n * The sourcing search ranks/filters by these criteria; a criterion unique to\n * the seeded talent surfaces it reliably (avoids live-search result variance).\n */\n rankingCriteria: string[];\n}\n\nexport const kitchenAssistantFixture: SourcingTalentFixture = isEphemeralEnvironment\n ? {\n uuid: kitchenAssistantTalentId,\n jobTitle: 'Kitchen Assistant at Kitchen Company',\n verifiedSkills: ['Critical Thinking'],\n filterTests: [TestName.CriticalThinking],\n rankingCriteria: ['Cutting bread'],\n }\n : {\n uuid: kitchenAssistantTalentId,\n jobTitle: 'Kitchen Assistant at Kitchen Company',\n verifiedSkills: ['Software architect', 'AWS'],\n filterTests: [TestName.SoftwareArchitect, TestName.RubyOnRails, TestName.AWS],\n rankingCriteria: ['Cutting bread'],\n };\n\nexport const dogTrainerFixture: SourcingTalentFixture = {\n uuid: dogTrainerTalentId,\n jobTitle: 'Dog trainer at Dog trainer organization',\n verifiedSkills: [],\n filterTests: [],\n rankingCriteria: [],\n};\n"],"mappings":"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","names":["env","accounts","baseURL","ephemeralPrefix","ephemeralId","isEphemeralEnvironment","environment","adminURL","import_process"]}

@@ -1,5 +0,5 @@

import "./chunk-U7YT53U2.mjs";
import "./chunk-B64Y5SGV.mjs";
import {
isEphemeralEnvironment
} from "./chunk-DW4V5VUB.mjs";
} from "./chunk-TJHUXULD.mjs";

@@ -6,0 +6,0 @@ // src/templates/sourcingFixtures.ts

{
"name": "@testgorilla/e2e-framework",
"version": "0.1.3",
"version": "0.2.0",
"description": "Shared Playwright e2e framework: base API client, config/environment resolver, timeouts, logging. Consumed by tgo-qa-automation and product repos that collocate their e2e suites.",

@@ -5,0 +5,0 @@ "license": "UNLICENSED",

import {
baseURL
} from "./chunk-DW4V5VUB.mjs";
// src/stubs/subscriptions/business-eur.json
var business_eur_default = {
name: "Base plan: Business EUR",
plan: {
name: "Base plan: Business EUR",
short_name: "Business",
chargebee_id: "Base-plan-tier-Business-EUR",
number_of_credits: 12500,
is_trial: false,
currency_code: "EUR",
period: "year",
monthly_price: 22200,
addon_price: 0.6,
price_for_analytics: 22200,
legacy: false,
tier: 6,
fte_band: null,
trial_period: null
},
legacy: false,
next_invoice: "2023-09-18",
addon_subscription: {
next_invoice: "2023-01-18",
additional_candidate_credits: 0,
additional_assessment_credits: 42
},
is_trial: false,
subscription_id: "Azz5akTHt88pcmbU",
currency_code: "EUR",
change_pending: false,
next_plan: null,
next_plan_short_name: null,
active_chargebee_id: "Base-plan-tier-Business-EUR",
next_chargebee_id: null,
candidate_credits: {
initials_credits_included_in_the_plan: 12500,
credits_from_previous_plan: 0,
complimentary: 0,
consumed: -1017,
total_available: 11483,
additional_credit_price: 0.6,
general: {
cost: 0.6,
quantity: 0
},
billed: {
amount: 0,
quantity: 0
},
paid: {
amount: 0,
quantity: 0
},
payment_due: {
amount: 0,
quantity: 0
},
unbilled_charges: {
amount: 0,
quantity: 0
}
},
assessment_credits: {
initials_credits_included_in_the_plan: 125,
credits_from_previous_plan: 0,
complimentary: 0,
consumed: -603,
total_available: 0,
additional_credit_price: 80,
general: {
cost: 80,
quantity: 478
},
billed: {
amount: 0,
quantity: 0
},
paid: {
amount: 0,
quantity: 0
},
payment_due: {
amount: 0,
quantity: 0
},
unbilled_charges: {
amount: 38240,
quantity: 478
}
},
tier: 6,
renewal_date: "2025-09-18"
};
// src/stubs/subscriptions/core-eur.json
var core_eur_default = {
plan: {
name: "Core EUR",
short_name: "Core",
chargebee_id: "gen4-plan-core-EUR",
number_of_credits: 0,
is_trial: false,
currency_code: "EUR",
payment_price: 525,
addon_price: null,
price_for_analytics: 525,
tier: 120,
fte_band: null,
trial_period: null,
payment_period: "year",
contract_period: "year",
is_legacy: false
},
credit_tier: 450,
credit_tier_price: 1500,
available_credits: 450,
status: "active",
is_scheduled_for_cancellation: false,
next_invoice: "2026-11-25",
next_change_date: "2026-11-25",
subscription_id: "169lVHV3YKGm9oUe",
change_pending: false,
next_plan: {
name: "Core EUR",
short_name: "Core",
chargebee_id: "gen4-plan-core-EUR",
number_of_credits: 0,
is_trial: false,
currency_code: "EUR",
payment_price: 525,
addon_price: null,
price_for_analytics: 525,
tier: 120,
fte_band: null,
trial_period: null,
payment_period: "year",
contract_period: "year",
is_legacy: false
},
renewal_date: "2026-11-25",
trial_end: null,
gtm_sync_required: false,
active_assessments_slots: null,
older_than_two_months: false
};
// src/stubs/subscriptions/free.json
var free_default = {
status: null,
change_pending: false,
renewal_date: null,
trial_end: null,
gtm_sync_required: false,
active_assessments_slots: null
};
// src/stubs/subscriptions/plus-eur.json
var plus_eur_default = {
plan: {
name: "Plus EUR",
short_name: "Plus",
chargebee_id: "gen4-plan-plus-EUR",
number_of_credits: 0,
is_trial: false,
currency_code: "EUR",
payment_price: 4300,
addon_price: null,
price_for_analytics: 4300,
tier: 130,
fte_band: null,
trial_period: null,
payment_period: "year",
contract_period: "year",
is_legacy: false
},
credit_tier: 2500,
credit_tier_price: 6e3,
available_credits: 2500,
status: "active",
is_scheduled_for_cancellation: false,
next_invoice: "2026-11-25",
next_change_date: "2026-11-25",
subscription_id: "16BTwHV3YL0ocour",
change_pending: false,
next_plan: {
name: "Plus EUR",
short_name: "Plus",
chargebee_id: "gen4-plan-plus-EUR",
number_of_credits: 0,
is_trial: false,
currency_code: "EUR",
payment_price: 4300,
addon_price: null,
price_for_analytics: 4300,
tier: 130,
fte_band: null,
trial_period: null,
payment_period: "year",
contract_period: "year",
is_legacy: false
},
renewal_date: "2026-11-25",
trial_end: null,
gtm_sync_required: false,
active_assessments_slots: null,
older_than_two_months: true
};
// src/stubs/subscriptions/pro-eur.json
var pro_eur_default = {
plan: {
name: "Pro Annually 201 to 300 EUR",
short_name: "Pro",
chargebee_id: "d-plan-pro-yearly-201-300-EUR",
number_of_credits: 0,
is_trial: false,
currency_code: "EUR",
payment_price: 17424,
addon_price: null,
price_for_analytics: 17424,
tier: 9,
fte_band: "201-300",
trial_period: 15,
payment_period: "year",
contract_period: "year",
is_legacy: true
},
credit_tier: null,
credit_tier_price: null,
available_credits: 0,
status: "active",
is_scheduled_for_cancellation: false,
next_invoice: "2026-11-25",
next_change_date: "2026-11-25",
subscription_id: "16CRVrV3YMe0jpqT",
change_pending: false,
next_plan: {
name: "Pro Annually 201 to 300 EUR",
short_name: "Pro",
chargebee_id: "d-plan-pro-yearly-201-300-EUR",
number_of_credits: 0,
is_trial: false,
currency_code: "EUR",
payment_price: 17424,
addon_price: null,
price_for_analytics: 17424,
tier: 9,
fte_band: "201-300",
trial_period: 15,
payment_period: "year",
contract_period: "year",
is_legacy: true
},
renewal_date: "2026-11-25",
trial_end: null,
gtm_sync_required: false,
active_assessments_slots: null,
older_than_two_months: true
};
// src/stubs/subscriptions/starter-eur.json
var starter_eur_default = {
plan: {
name: "Starter Annually 201 to 300 EUR",
short_name: "Starter",
chargebee_id: "d-plan-starter-yearly-201-300-EUR",
number_of_credits: 0,
is_trial: false,
currency_code: "EUR",
payment_price: 12606,
addon_price: null,
price_for_analytics: 12606,
tier: 8,
fte_band: "201-300",
trial_period: 15,
payment_period: "year",
contract_period: "year",
is_legacy: true
},
credit_tier: null,
credit_tier_price: null,
available_credits: 0,
status: "active",
is_scheduled_for_cancellation: false,
next_invoice: "2026-11-25",
next_change_date: "2026-11-25",
subscription_id: "169lVHV3YNUvxqIQ",
change_pending: false,
next_plan: {
name: "Starter Annually 201 to 300 EUR",
short_name: "Starter",
chargebee_id: "d-plan-starter-yearly-201-300-EUR",
number_of_credits: 0,
is_trial: false,
currency_code: "EUR",
payment_price: 12606,
addon_price: null,
price_for_analytics: 12606,
tier: 8,
fte_band: "201-300",
trial_period: 15,
payment_period: "year",
contract_period: "year",
is_legacy: true
},
renewal_date: "2026-11-25",
trial_end: null,
gtm_sync_required: false,
active_assessments_slots: null,
older_than_two_months: false
};
// src/stubs/currentSubscription.ts
var PLANS = {
"business-eur": business_eur_default,
"starter-eur": starter_eur_default,
"pro-eur": pro_eur_default,
"core-eur": core_eur_default,
"plus-eur": plus_eur_default,
free: free_default
};
var CurrentSubscription = class {
constructor(page, baseUrl = baseURL) {
this.page = page;
this.baseUrl = baseUrl;
}
/**
* Stubs the current subscription endpoint with a specific plan
* @param planName - The subscription plan payload to serve.
* Options: 'business-eur' (default), 'starter-eur', 'pro-eur', 'core-eur', 'plus-eur', 'free'
* @param overridePayload - Optional custom payload to serve instead of the bundled plan JSON.
*/
async stubCurrentSubscriptionEndpoint(planName = "business-eur", overridePayload) {
const subscriptionData = overridePayload ?? PLANS[planName];
await this.page.route(
`${this.baseUrl}/api/accounting/current-subscription/`,
(route) => route.fulfill({
status: 200,
body: JSON.stringify(subscriptionData)
})
);
}
};
export {
CurrentSubscription
};
//# sourceMappingURL=chunk-37W5EZF5.mjs.map
{"version":3,"sources":["../src/stubs/subscriptions/business-eur.json","../src/stubs/subscriptions/core-eur.json","../src/stubs/subscriptions/free.json","../src/stubs/subscriptions/plus-eur.json","../src/stubs/subscriptions/pro-eur.json","../src/stubs/subscriptions/starter-eur.json","../src/stubs/currentSubscription.ts"],"sourcesContent":["{\n \"name\": \"Base plan: Business EUR\",\n \"plan\": {\n \"name\": \"Base plan: Business EUR\",\n \"short_name\": \"Business\",\n \"chargebee_id\": \"Base-plan-tier-Business-EUR\",\n \"number_of_credits\": 12500,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"period\": \"year\",\n \"monthly_price\": 22200.0,\n \"addon_price\": 0.6,\n \"price_for_analytics\": 22200.0,\n \"legacy\": false,\n \"tier\": 6,\n \"fte_band\": null,\n \"trial_period\": null\n },\n \"legacy\": false,\n \"next_invoice\": \"2023-09-18\",\n \"addon_subscription\": {\n \"next_invoice\": \"2023-01-18\",\n \"additional_candidate_credits\": 0,\n \"additional_assessment_credits\": 42\n },\n \"is_trial\": false,\n \"subscription_id\": \"Azz5akTHt88pcmbU\",\n \"currency_code\": \"EUR\",\n \"change_pending\": false,\n \"next_plan\": null,\n \"next_plan_short_name\": null,\n \"active_chargebee_id\": \"Base-plan-tier-Business-EUR\",\n \"next_chargebee_id\": null,\n \"candidate_credits\": {\n \"initials_credits_included_in_the_plan\": 12500,\n \"credits_from_previous_plan\": 0,\n \"complimentary\": 0,\n \"consumed\": -1017,\n \"total_available\": 11483,\n \"additional_credit_price\": 0.6,\n \"general\": {\n \"cost\": 0.6,\n \"quantity\": 0\n },\n \"billed\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"paid\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"payment_due\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"unbilled_charges\": {\n \"amount\": 0.0,\n \"quantity\": 0\n }\n },\n \"assessment_credits\": {\n \"initials_credits_included_in_the_plan\": 125,\n \"credits_from_previous_plan\": 0,\n \"complimentary\": 0,\n \"consumed\": -603,\n \"total_available\": 0,\n \"additional_credit_price\": 80.0,\n \"general\": {\n \"cost\": 80.0,\n \"quantity\": 478\n },\n \"billed\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"paid\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"payment_due\": {\n \"amount\": 0.0,\n \"quantity\": 0\n },\n \"unbilled_charges\": {\n \"amount\": 38240.0,\n \"quantity\": 478\n }\n },\n \"tier\": 6,\n \"renewal_date\": \"2025-09-18\"\n}\n","{\n \"plan\": {\n \"name\": \"Core EUR\",\n \"short_name\": \"Core\",\n \"chargebee_id\": \"gen4-plan-core-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 525,\n \"addon_price\": null,\n \"price_for_analytics\": 525.0,\n \"tier\": 120,\n \"fte_band\": null,\n \"trial_period\": null,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": false\n },\n \"credit_tier\": 450,\n \"credit_tier_price\": 1500.0,\n \"available_credits\": 450,\n \"status\": \"active\",\n \"is_scheduled_for_cancellation\": false,\n \"next_invoice\": \"2026-11-25\",\n \"next_change_date\": \"2026-11-25\",\n \"subscription_id\": \"169lVHV3YKGm9oUe\",\n \"change_pending\": false,\n \"next_plan\": {\n \"name\": \"Core EUR\",\n \"short_name\": \"Core\",\n \"chargebee_id\": \"gen4-plan-core-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 525,\n \"addon_price\": null,\n \"price_for_analytics\": 525.0,\n \"tier\": 120,\n \"fte_band\": null,\n \"trial_period\": null,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": false\n },\n \"renewal_date\": \"2026-11-25\",\n \"trial_end\": null,\n \"gtm_sync_required\": false,\n \"active_assessments_slots\": null,\n \"older_than_two_months\": false\n}\n","{\n \"status\": null,\n \"change_pending\": false,\n \"renewal_date\": null,\n \"trial_end\": null,\n \"gtm_sync_required\": false,\n \"active_assessments_slots\": null\n}\n","{\n \"plan\": {\n \"name\": \"Plus EUR\",\n \"short_name\": \"Plus\",\n \"chargebee_id\": \"gen4-plan-plus-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 4300,\n \"addon_price\": null,\n \"price_for_analytics\": 4300.0,\n \"tier\": 130,\n \"fte_band\": null,\n \"trial_period\": null,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": false\n },\n \"credit_tier\": 2500,\n \"credit_tier_price\": 6000.0,\n \"available_credits\": 2500,\n \"status\": \"active\",\n \"is_scheduled_for_cancellation\": false,\n \"next_invoice\": \"2026-11-25\",\n \"next_change_date\": \"2026-11-25\",\n \"subscription_id\": \"16BTwHV3YL0ocour\",\n \"change_pending\": false,\n \"next_plan\": {\n \"name\": \"Plus EUR\",\n \"short_name\": \"Plus\",\n \"chargebee_id\": \"gen4-plan-plus-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 4300,\n \"addon_price\": null,\n \"price_for_analytics\": 4300.0,\n \"tier\": 130,\n \"fte_band\": null,\n \"trial_period\": null,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": false\n },\n \"renewal_date\": \"2026-11-25\",\n \"trial_end\": null,\n \"gtm_sync_required\": false,\n \"active_assessments_slots\": null,\n \"older_than_two_months\": true\n}\n","{\n \"plan\": {\n \"name\": \"Pro Annually 201 to 300 EUR\",\n \"short_name\": \"Pro\",\n \"chargebee_id\": \"d-plan-pro-yearly-201-300-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 17424,\n \"addon_price\": null,\n \"price_for_analytics\": 17424.0,\n \"tier\": 9,\n \"fte_band\": \"201-300\",\n \"trial_period\": 15,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": true\n },\n \"credit_tier\": null,\n \"credit_tier_price\": null,\n \"available_credits\": 0,\n \"status\": \"active\",\n \"is_scheduled_for_cancellation\": false,\n \"next_invoice\": \"2026-11-25\",\n \"next_change_date\": \"2026-11-25\",\n \"subscription_id\": \"16CRVrV3YMe0jpqT\",\n \"change_pending\": false,\n \"next_plan\": {\n \"name\": \"Pro Annually 201 to 300 EUR\",\n \"short_name\": \"Pro\",\n \"chargebee_id\": \"d-plan-pro-yearly-201-300-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 17424,\n \"addon_price\": null,\n \"price_for_analytics\": 17424.0,\n \"tier\": 9,\n \"fte_band\": \"201-300\",\n \"trial_period\": 15,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": true\n },\n \"renewal_date\": \"2026-11-25\",\n \"trial_end\": null,\n \"gtm_sync_required\": false,\n \"active_assessments_slots\": null,\n \"older_than_two_months\": true\n}\n","{\n \"plan\": {\n \"name\": \"Starter Annually 201 to 300 EUR\",\n \"short_name\": \"Starter\",\n \"chargebee_id\": \"d-plan-starter-yearly-201-300-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 12606,\n \"addon_price\": null,\n \"price_for_analytics\": 12606.0,\n \"tier\": 8,\n \"fte_band\": \"201-300\",\n \"trial_period\": 15,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": true\n },\n \"credit_tier\": null,\n \"credit_tier_price\": null,\n \"available_credits\": 0,\n \"status\": \"active\",\n \"is_scheduled_for_cancellation\": false,\n \"next_invoice\": \"2026-11-25\",\n \"next_change_date\": \"2026-11-25\",\n \"subscription_id\": \"169lVHV3YNUvxqIQ\",\n \"change_pending\": false,\n \"next_plan\": {\n \"name\": \"Starter Annually 201 to 300 EUR\",\n \"short_name\": \"Starter\",\n \"chargebee_id\": \"d-plan-starter-yearly-201-300-EUR\",\n \"number_of_credits\": 0,\n \"is_trial\": false,\n \"currency_code\": \"EUR\",\n \"payment_price\": 12606,\n \"addon_price\": null,\n \"price_for_analytics\": 12606.0,\n \"tier\": 8,\n \"fte_band\": \"201-300\",\n \"trial_period\": 15,\n \"payment_period\": \"year\",\n \"contract_period\": \"year\",\n \"is_legacy\": true\n },\n \"renewal_date\": \"2026-11-25\",\n \"trial_end\": null,\n \"gtm_sync_required\": false,\n \"active_assessments_slots\": null,\n \"older_than_two_months\": false\n}\n","import type { Page } from '@playwright/test';\nimport { baseURL as configBaseURL } from '../config';\nimport businessEur from './subscriptions/business-eur.json';\nimport coreEur from './subscriptions/core-eur.json';\nimport free from './subscriptions/free.json';\nimport plusEur from './subscriptions/plus-eur.json';\nimport proEur from './subscriptions/pro-eur.json';\nimport starterEur from './subscriptions/starter-eur.json';\n\nexport type SubscriptionPlan =\n | 'business-eur'\n | 'starter-eur'\n | 'pro-eur'\n | 'core-eur'\n | 'plus-eur'\n | 'free';\n\n// Payloads are inlined into the bundle (no fs/__dirname at runtime), so the\n// stub works identically from an installed npm package and from source.\nconst PLANS: Record<SubscriptionPlan, Record<string, unknown>> = {\n 'business-eur': businessEur,\n 'starter-eur': starterEur,\n 'pro-eur': proEur,\n 'core-eur': coreEur,\n 'plus-eur': plusEur,\n free,\n};\n\nexport class CurrentSubscription {\n readonly page: Page;\n private readonly baseUrl: string;\n\n constructor(page: Page, baseUrl: string = configBaseURL) {\n this.page = page;\n this.baseUrl = baseUrl;\n }\n\n /**\n * Stubs the current subscription endpoint with a specific plan\n * @param planName - The subscription plan payload to serve.\n * Options: 'business-eur' (default), 'starter-eur', 'pro-eur', 'core-eur', 'plus-eur', 'free'\n * @param overridePayload - Optional custom payload to serve instead of the bundled plan JSON.\n */\n async stubCurrentSubscriptionEndpoint(\n planName: SubscriptionPlan = 'business-eur',\n overridePayload?: Record<string, unknown>,\n ) {\n const subscriptionData = overridePayload ?? PLANS[planName];\n\n await this.page.route(`${this.baseUrl}/api/accounting/current-subscription/`, (route) =>\n route.fulfill({\n status: 200,\n body: JSON.stringify(subscriptionData),\n }),\n );\n }\n}\n"],"mappings":"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","names":[]}
// src/config/resolve.ts
var EPHEMERAL_PREFIX_PATTERN = /https?:\/\/(backend|talent-api)-(\d+)-[^.]+\.dev\.testgorilla\.com/;
var LOCAL_MAILHOG_URL = "http://localhost:8025";
function defineRequiredSecret(target, property, value, envVar) {
Object.defineProperty(target, property, {
enumerable: false,
configurable: true,
get() {
if (value === void 0 || value === "") {
throw new Error(
`[e2e-framework] ${envVar} is not set. The framework ships no credential defaults \u2014 export ${envVar} (see your team's 1Password e2e .env entry) before running tests.`
);
}
return value;
}
});
}
function resolveAccounts(env3) {
const nodeIndexedOrganizer = env3.CIRCLE_NODE_TOTAL ? `dummy.tests+organizer${env3.CIRCLE_NODE_INDEX}@testgorilla.com` : `dummy.tests+organizer11@testgorilla.com`;
const accountIndex = env3.E2E_ACCOUNT_INDEX;
const accounts2 = {
organizerEmail: env3.userEmail ?? (accountIndex !== void 0 ? `dummy.tests+organizer${accountIndex}@testgorilla.com` : nodeIndexedOrganizer),
candidateEmail: env3.candidateEmail ?? "dummy.tests@testgorilla.com",
hiringManagerEmail: env3.hiringManagerEmail ?? "dummy.tests+hiringmanager01@testgorilla.com",
recruiterEmail: env3.recruiterEmail ?? "dummy.tests+recruiter1@testgorilla.com",
adminEmail: env3.adminEmail ?? "dummy.tests+admin1@testgorilla.com",
newAdminEmail: env3.newAdminEmail ?? "dummy.tests+newadmin@testgorilla.com",
freeUserEmail: env3.freeUserEmail ?? "dummy.tests+free0@testgorilla.com",
corePlanUserEmail: env3.corePlanUserEmail ?? "dummy.tests+coreplan@testgorilla.com",
plusPlanUserEmail: env3.plusPlanUserEmail ?? "dummy.tests+plus@testgorilla.com",
proPlanUserEmail: env3.proPlanUserEmail ?? "dummy.tests+pro@testgorilla.com",
businessPlanUserEmail: env3.businessPlanUserEmail ?? "dummy.tests+business@testgorilla.com",
starterPlanUserEmail: env3.starterPlanUserEmail ?? "dummy.tests+starter@testgorilla.com",
myProfileUserEmail: env3.myProfileUserEmail ?? "dummy.tests+myprofile@testgorilla.com",
atsIntegrationsEmail: env3.atsIntegrationsEmail ?? "dummy.tests+ats-integrations@testgorilla.com"
};
defineRequiredSecret(accounts2, "password", env3.E2E_PASSWORD ?? env3.e2e_password, "E2E_PASSWORD");
defineRequiredSecret(
accounts2,
"candidatePassword",
env3.E2E_CANDIDATE_PASSWORD,
"E2E_CANDIDATE_PASSWORD"
);
return accounts2;
}
function resolveUrls(baseURL2, ephemeralPrefix2, ephemeralId2) {
const isEphemeral = !!ephemeralId2;
const ephemeralHost = (service) => `https://${ephemeralPrefix2}-${ephemeralId2}-${service}.dev.testgorilla.com`;
const isProd = baseURL2.includes("app.testgorilla");
const isDev = baseURL2.includes("dev.testgorilla");
const isLocalhost = baseURL2.includes("localhost");
return {
talentBase: isEphemeral ? ephemeralHost("talent") : isProd ? "https://talent.testgorilla.com" : isDev ? "https://talent-dev.testgorilla.com" : isLocalhost ? "http://localhost:4100" : "https://talent-staging.testgorilla.com",
talentAssessment: isEphemeral ? ephemeralHost("talent-assessment") : isProd ? "https://talent-assessment.testgorilla.com" : isDev ? "https://talent-assessment-dev.testgorilla.com" : isLocalhost ? "http://localhost:4100" : "https://talent-assessment-staging.testgorilla.com",
talentApi: isEphemeral ? ephemeralHost("api-talent") : isProd ? "https://api-talent.testgorilla.com" : isDev ? "https://api-talent-dev.testgorilla.com" : isLocalhost ? "http://localhost:4200" : "https://api-talent-staging.testgorilla.com",
codeRunnerApi: isProd ? "https://cr-v2.testgorilla.com" : isDev ? "https://cr-v2-dev.testgorilla.com" : "https://cr-v2-staging.testgorilla.com",
websiteBase: isProd ? "https://www.testgorilla.com" : isDev && !isEphemeral ? "https://website-dev.testgorilla.com" : "https://website-staging.testgorilla.com",
mailpit: isEphemeral ? ephemeralHost("mailpit") : LOCAL_MAILHOG_URL,
localstack: isEphemeral ? ephemeralHost("localstack") : null
};
}
function resolveTgEnvironment(env3 = process.env) {
const baseURL2 = env3.baseURL || "https://staging.testgorilla.com";
const ephemeralMatch = baseURL2.match(EPHEMERAL_PREFIX_PATTERN);
const ephemeralPrefix2 = ephemeralMatch ? ephemeralMatch[1] : null;
const ephemeralId2 = ephemeralMatch ? ephemeralMatch[2] : null;
const isEphemeralEnvironment2 = !!ephemeralId2;
const environment2 = baseURL2.split(".testgorilla.com")[0].split("https://")[1] || "staging";
const adminURL2 = env3.adminURL || (isEphemeralEnvironment2 ? `https://${ephemeralPrefix2}-${ephemeralId2}-backend.dev.testgorilla.com` : environment2 === "app" ? `https://new-admin.testgorilla.com` : `https://${environment2}-new-admin.testgorilla.com`);
const isProd = baseURL2.includes("app.testgorilla");
const isDev = baseURL2.includes("dev.testgorilla");
const isLocalhost = baseURL2.includes("localhost");
return {
baseURL: baseURL2,
environment: environment2,
isEphemeralEnvironment: isEphemeralEnvironment2,
ephemeralPrefix: ephemeralPrefix2,
ephemeralId: ephemeralId2,
isLocalEnvironment: env3.localEnvironment === "true" || isEphemeralEnvironment2,
adminURL: adminURL2,
urls: resolveUrls(baseURL2, ephemeralPrefix2, ephemeralId2),
emails: {
signupFrom: isProd ? "hello@testgorilla.com" : isLocalhost ? "noreply@example" : isDev || isEphemeralEnvironment2 ? "hello@maildev.testgorilla.com" : "hello@mailstaging.testgorilla.com",
assessmentsFrom: isProd ? "assessments@testgorilla.com" : isLocalhost ? "assessments@example.com" : isDev || isEphemeralEnvironment2 ? "assessments@maildev.testgorilla.com" : "assessments@mailstaging.testgorilla.com"
},
accounts: resolveAccounts(env3)
};
}
// src/config/runId.ts
import * as os from "os";
import { env } from "process";
function getRunId() {
if (!env.E2E_RUN_ID) {
env.E2E_RUN_ID = env.CI ? `ci${shortHash(env.CIRCLE_WORKFLOW_ID ?? "")}` : localRunId();
}
return env.E2E_RUN_ID;
}
function shortHash(input) {
let hash = 0;
for (const char of input) {
hash = hash * 31 + char.charCodeAt(0) >>> 0;
}
return hash.toString(36).padStart(6, "0").slice(-6);
}
function localRunId() {
let user = "";
try {
user = os.userInfo().username.toLowerCase().replace(/[^a-z0-9]/g, "").slice(0, 8);
} catch {
}
const now = /* @__PURE__ */ new Date();
const pad = (n) => String(n).padStart(2, "0");
const stamp = `${pad(now.getMonth() + 1)}${pad(now.getDate())}${pad(now.getHours())}${pad(
now.getMinutes()
)}`;
return `loc${user || "unknown"}${stamp}`;
}
// src/config/algolia.ts
var ALGOLIA_APP_ID = process.env.ALGOLIA_APP_ID || "V8Y626J4K8";
var ALGOLIA_PROD_INDEX = process.env.ALGOLIA_PROD_INDEX || "production_tests_index";
var ALGOLIA_STAGING_INDEX = process.env.ALGOLIA_STAGING_INDEX || "staging_tests_index";
var ALGOLIA_EPHEMERAL_INDEX = process.env.ALGOLIA_EPHEMERAL_INDEX || "ephemeral_tests_index";
var ALGOLIA_PROD_API_KEY = process.env.ALGOLIA_PROD_API_KEY || "NDc2N2JlMmY5ZGE2NzM4NDIwOWM2ODkyMWY0Yjk5YjYyNTA5NTViNDg2YzNlN2VlZDE4MmYyOWE3YmRjNjg1ZXJlc3RyaWN0SW5kaWNlcz1wcm9kdWN0aW9uX3Rlc3RzX2luZGV4";
var ALGOLIA_STAGING_API_KEY = process.env.ALGOLIA_STAGING_API_KEY || "ZjZmYWMwYjNkN2IxZjViYzA0OTZkZGE3OWY5MmVjYWMzN2RlYWJlYjcyOWRlMWQ3YjMwM2RjYjk0NDNjZGY0MXJlc3RyaWN0SW5kaWNlcz1zdGFnaW5nX3Rlc3RzX2luZGV4";
var ALGOLIA_EPHEMERAL_API_KEY = process.env.ALGOLIA_EPHEMERAL_API_KEY || "5beea78e78134e8270214f93b7032e7b";
var getAlgoliaUrl = () => {
const isProduction = baseURL.includes("app.testgorilla");
if (isEphemeralEnvironment) {
return `https://v8y626j4k8-dsn.algolia.net/1/indexes/${ALGOLIA_EPHEMERAL_INDEX}/query`;
}
const index = isProduction ? ALGOLIA_PROD_INDEX : ALGOLIA_STAGING_INDEX;
const domain = isProduction ? "algolianet.com" : "algolia.net";
const subdomain = isProduction ? "v8y626j4k8-2" : "v8y626j4k8-dsn";
return `https://${subdomain}.${domain}/1/indexes/${index}/query`;
};
var getAlgoliaHeaders = () => {
const isProduction = baseURL.includes("app.testgorilla");
let apiKey;
if (isEphemeralEnvironment) {
apiKey = ALGOLIA_EPHEMERAL_API_KEY;
} else {
apiKey = isProduction ? ALGOLIA_PROD_API_KEY : ALGOLIA_STAGING_API_KEY;
}
return {
"content-type": "application/x-www-form-urlencoded",
"x-algolia-api-key": apiKey,
"x-algolia-application-id": ALGOLIA_APP_ID
};
};
// src/config/constants.ts
import { env as env2 } from "process";
var DEFAULT_RETRY_COUNTER = 10;
var INCREASED_RETRY_COUNTER_50 = DEFAULT_RETRY_COUNTER * 1.5;
var INCREASED_RETRY_COUNTER_80 = DEFAULT_RETRY_COUNTER * 1.8;
var INCREASED_RETRY_COUNTER_200 = DEFAULT_RETRY_COUNTER * 2;
var INCREASED_RETRY_COUNTER_300 = DEFAULT_RETRY_COUNTER * 3;
var rawLogLevel = env2.LOG_LEVEL?.toUpperCase() || env2.API_LOG_LEVEL?.toUpperCase() || "WARN";
if (!env2.LOG_LEVEL && env2.API_LOG_LEVEL && !env2._LOG_DEPRECATION_WARNED) {
process.stderr.write(
"[logger] API_LOG_LEVEL is deprecated; use LOG_LEVEL instead (same values).\n"
);
env2._LOG_DEPRECATION_WARNED = "1";
}
var logLevel = rawLogLevel;
var logFile = env2.LOG_FILE || env2.API_LOG_FILE || "";
var apiLogLevel = logLevel;
var apiLogFile = logFile;
var assessmentList = JSON.parse(env2.assessments || "{}");
var MAILPIT_SERVER = "http://localhost:8025";
var simpleAssessmentName = `New Simple Assessment - ${Date.now()}`;
var invitationEmailSubject = "Your application at TestGorilla";
var emailReception = { slowEmailAPI: false };
// src/config/recaptcha.ts
var keyProvider;
function setRecaptchaBypassKeyProvider(provider) {
keyProvider = provider;
}
async function getRecaptchaBypassKey(backendEnvironment) {
const fromEnv = isEphemeralEnvironment ? process.env.RECAPTCHA_BYPASS_KEY_STAGE : process.env.RECAPTCHA_BYPASS_KEY;
if (fromEnv) {
return fromEnv;
}
const fromProvider = keyProvider ? await keyProvider(backendEnvironment) : void 0;
return fromProvider || "Not Set";
}
// src/config/randomData.ts
var FIRST_NAMES = [
"Alice",
"Bruno",
"Carmen",
"Diego",
"Elena",
"Felix",
"Greta",
"Hugo",
"Irene",
"Jonas",
"Katia",
"Liam",
"Marta",
"Nadia",
"Oscar",
"Paula",
"Quentin",
"Rosa",
"Sofia",
"Tomas",
"Ursula",
"Victor",
"Wanda",
"Xavier",
"Yara",
"Zoe",
"Andre",
"Bianca",
"Cesar",
"Dora"
];
var LAST_NAMES = [
"Almeida",
"Bauer",
"Castro",
"Dubois",
"Eriksen",
"Fischer",
"Garcia",
"Hansen",
"Ibrahim",
"Jansen",
"Keller",
"Lopez",
"Meyer",
"Novak",
"Olsen",
"Peeters",
"Quinn",
"Rossi",
"Schmidt",
"Torres",
"Ueda",
"Vargas",
"Weber",
"Xu",
"Yilmaz",
"Zhang"
];
var JOB_TITLE_AREAS = [
"Marketing",
"Product",
"Operations",
"Finance",
"Support",
"Engineering",
"Design",
"Sales",
"Research",
"Quality"
];
var JOB_TITLE_ROLES = [
"Manager",
"Specialist",
"Analyst",
"Coordinator",
"Engineer",
"Consultant",
"Associate",
"Director",
"Assistant",
"Lead"
];
var PHRASE_VERBS = [
"streamline",
"orchestrate",
"benchmark",
"optimize",
"aggregate",
"harness",
"incentivize",
"synthesize",
"iterate",
"scale"
];
var PHRASE_ADJECTIVES = [
"scalable",
"seamless",
"dynamic",
"proactive",
"granular",
"robust",
"frictionless",
"holistic",
"intuitive",
"compelling"
];
var PHRASE_NOUNS = [
"workflows",
"channels",
"metrics",
"platforms",
"roadmaps",
"pipelines",
"paradigms",
"synergies",
"deliverables",
"interfaces"
];
var CITIES = [
"Amsterdam",
"Barcelona",
"Copenhagen",
"Dublin",
"Edinburgh",
"Florence",
"Geneva",
"Hamburg",
"Istanbul",
"Jakarta",
"Krakow",
"Lisbon",
"Madrid",
"Nairobi",
"Oslo",
"Porto",
"Quito",
"Rotterdam",
"Seville",
"Tallinn"
];
var WORDS = [
"amber",
"breeze",
"cedar",
"delta",
"ember",
"fjord",
"garnet",
"harbor",
"indigo",
"juniper",
"karma",
"lagoon",
"meadow",
"nectar",
"onyx",
"prairie",
"quartz",
"ripple",
"summit",
"tundra"
];
var ALPHANUMERIC = "abcdefghijklmnopqrstuvwxyz0123456789";
var pick = (pool) => pool[Math.floor(Math.random() * pool.length)];
var randomFirstName = () => pick(FIRST_NAMES);
var randomLastName = () => pick(LAST_NAMES);
var randomFullName = () => `${randomFirstName()} ${randomLastName()}`;
var randomJobTitle = () => `${pick(JOB_TITLE_AREAS)} ${pick(JOB_TITLE_ROLES)}`;
var randomPhrase = () => `${pick(PHRASE_VERBS)} ${pick(PHRASE_ADJECTIVES)} ${pick(PHRASE_NOUNS)}`;
var randomWords = (count = 2) => Array.from({ length: count }, () => pick(WORDS)).join(" ");
var randomAlphaNumeric = (length = 1) => Array.from({ length }, () => ALPHANUMERIC[Math.floor(Math.random() * ALPHANUMERIC.length)]).join(
""
);
var randomCity = () => pick(CITIES);
var randomNumber = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
function convertPhoneNumberToString(phone) {
return phone.replaceAll(" ", "");
}
function generateRandomSpanishPhone() {
const eightLastDigits = Math.floor(Math.random() * 9e7);
return (6e8 + eightLastDigits).toString();
}
function randomizeName() {
return randomFirstName();
}
function randomizeUsername(email2) {
const [username, domain] = email2.split("@");
const epochTimestamp = Math.floor(Date.now() / 1e3);
const newUsername = `${username}+${epochTimestamp}`;
return `${newUsername}@${domain}`;
}
// src/config/index.ts
var cfg = resolveTgEnvironment();
var baseURL = cfg.baseURL;
var environment = cfg.environment;
var isEphemeralEnvironment = cfg.isEphemeralEnvironment;
var ephemeralPrefix = cfg.ephemeralPrefix;
var ephemeralId = cfg.ephemeralId;
var isLocalEnvironment = cfg.isLocalEnvironment;
var adminURL = cfg.adminURL;
var localMailHogURL = "http://localhost:8025";
var mailpitURL = () => cfg.urls.mailpit;
var localstackURL = () => cfg.urls.localstack;
var talentBaseURL = () => cfg.urls.talentBase;
var talentAssessmentURL = () => cfg.urls.talentAssessment;
var talentApiURL = () => cfg.urls.talentApi;
var codeRunnerApiURL = () => cfg.urls.codeRunnerApi;
var websiteBaseURL = () => cfg.urls.websiteBase;
var signupFromEmail = () => cfg.emails.signupFrom;
var assessmentsFromEmail = () => cfg.emails.assessmentsFrom;
var ifNotStagingRun = () => !cfg.baseURL.includes("staging.testgorilla");
var ifNotStagingOrEphemeralRun = () => ifNotStagingRun() && !cfg.isEphemeralEnvironment;
var ifNotLocalhostRun = () => !cfg.baseURL.includes("localhost");
var rewriteSignupUrlForEnv = (signupUrl) => {
const targetHost = new URL(cfg.baseURL).host;
return signupUrl.replace(/app\.testgorilla\.com/i, targetHost);
};
var prodTesttakerUrlString = "https://assessment.testgorilla.com";
var prodTASUrlString = "https://talent-assessment.testgorilla.com";
var stageTesttakerUrlString = "https://staging-assessment.testgorilla.com";
var stageTASUrlString = "https://talent-assessment-staging.testgorilla.com";
var devTASUrlString = "https://talent-assessment-dev.testgorilla.com";
var localTASUrlString = "http://localhost:4100";
var stagingTASAPIUrl = "https://api-talent-staging.testgorilla.com";
var CandidateInviteAssessment = "Candidate-Invite-Assessment-4-Do-not-archive";
var candidateExpiredAssessment = "Candidate-Expired-Assessment-1-Do-not-archive";
var candidateArchivedAssessment = "Candidate-Archived-Assessment-1-Do-not-archive";
var tasSimpleMcqAssessment = "TAS-MCQ-Assessment";
var tasCustomTestAssessment = "TAS-Custom-Test-Assessment";
var tasSimpleBulkAssessment = "TAS-Bulk-Assessment";
var accounts = cfg.accounts;
var email = cfg.accounts.organizerEmail;
var password = process.env.E2E_PASSWORD ?? process.env.e2e_password ?? "";
var candidateEmail = cfg.accounts.candidateEmail;
var hiringManagerEmail = cfg.accounts.hiringManagerEmail;
var recruiterEmail = cfg.accounts.recruiterEmail;
var adminEmail = cfg.accounts.adminEmail;
var newAdminEmail = cfg.accounts.newAdminEmail;
var freeUserEmail = cfg.accounts.freeUserEmail;
var corePlanUserEmail = cfg.accounts.corePlanUserEmail;
var plusPlanUserEmail = cfg.accounts.plusPlanUserEmail;
var proPlanUserEmail = cfg.accounts.proPlanUserEmail;
var businessPlanUserEmail = cfg.accounts.businessPlanUserEmail;
var starterPlanUserEmail = cfg.accounts.starterPlanUserEmail;
var myProfileUserEmail = cfg.accounts.myProfileUserEmail;
var atsIntegrationsEmail = cfg.accounts.atsIntegrationsEmail;
var EMAIL_DOMAIN = "@testgorilla.com";
var DUMMY_TESTS_PREFIX = "dummy.tests";
var mintCounter = 0;
var mintSuffix = () => `${getRunId()}x${Date.now().toString(36)}${mintCounter++}`;
var randCandidateEmail = (rand = "") => `${DUMMY_TESTS_PREFIX}+cand${rand}${mintSuffix()}${EMAIL_DOMAIN}`;
var randCustomerEmail = (rand = "") => `${DUMMY_TESTS_PREFIX}+cust${rand}${mintSuffix()}${EMAIL_DOMAIN}`;
var randTeamMemberEmail = (rand = "") => `${DUMMY_TESTS_PREFIX}+t${rand}${cfg.environment}+${mintSuffix()}${EMAIL_DOMAIN}`;
export {
resolveTgEnvironment,
getRunId,
getAlgoliaUrl,
getAlgoliaHeaders,
DEFAULT_RETRY_COUNTER,
INCREASED_RETRY_COUNTER_50,
INCREASED_RETRY_COUNTER_80,
INCREASED_RETRY_COUNTER_200,
INCREASED_RETRY_COUNTER_300,
logLevel,
logFile,
apiLogLevel,
apiLogFile,
assessmentList,
MAILPIT_SERVER,
simpleAssessmentName,
invitationEmailSubject,
emailReception,
setRecaptchaBypassKeyProvider,
getRecaptchaBypassKey,
randomFirstName,
randomLastName,
randomFullName,
randomJobTitle,
randomPhrase,
randomWords,
randomAlphaNumeric,
randomCity,
randomNumber,
convertPhoneNumberToString,
generateRandomSpanishPhone,
randomizeName,
randomizeUsername,
baseURL,
environment,
isEphemeralEnvironment,
ephemeralPrefix,
ephemeralId,
isLocalEnvironment,
adminURL,
localMailHogURL,
mailpitURL,
localstackURL,
talentBaseURL,
talentAssessmentURL,
talentApiURL,
codeRunnerApiURL,
websiteBaseURL,
signupFromEmail,
assessmentsFromEmail,
ifNotStagingRun,
ifNotStagingOrEphemeralRun,
ifNotLocalhostRun,
rewriteSignupUrlForEnv,
prodTesttakerUrlString,
prodTASUrlString,
stageTesttakerUrlString,
stageTASUrlString,
devTASUrlString,
localTASUrlString,
stagingTASAPIUrl,
CandidateInviteAssessment,
candidateExpiredAssessment,
candidateArchivedAssessment,
tasSimpleMcqAssessment,
tasCustomTestAssessment,
tasSimpleBulkAssessment,
accounts,
email,
password,
candidateEmail,
hiringManagerEmail,
recruiterEmail,
adminEmail,
newAdminEmail,
freeUserEmail,
corePlanUserEmail,
plusPlanUserEmail,
proPlanUserEmail,
businessPlanUserEmail,
starterPlanUserEmail,
myProfileUserEmail,
atsIntegrationsEmail,
randCandidateEmail,
randCustomerEmail,
randTeamMemberEmail
};
//# sourceMappingURL=chunk-DW4V5VUB.mjs.map
{"version":3,"sources":["../src/config/resolve.ts","../src/config/runId.ts","../src/config/algolia.ts","../src/config/constants.ts","../src/config/recaptcha.ts","../src/config/randomData.ts","../src/config/index.ts"],"sourcesContent":["import type { E2eAccounts, E2eConfig, E2eUrls } from './types';\n\n/**\n * Ephemeral environment detection.\n * Supported prefixes:\n * - `backend` → backend-led deployments (e.g. https://backend-1234-talent.dev.testgorilla.com)\n * - `talent-api` → Talent-app-led deployments (e.g. https://talent-api-1756-talent.dev.testgorilla.com)\n * Add a new alternative to the regex if/when another deployment prefix is introduced.\n */\nconst EPHEMERAL_PREFIX_PATTERN =\n /https?:\\/\\/(backend|talent-api)-(\\d+)-[^.]+\\.dev\\.testgorilla\\.com/;\n\nconst LOCAL_MAILHOG_URL = 'http://localhost:8025';\n\n/**\n * Build a lazily-throwing secret accessor: the property reads as a normal\n * string when the env var is set, and throws with setup guidance the first\n * time it is READ while unset. Importing the config never throws.\n *\n * Non-enumerable so JSON-serializing an E2eConfig (e.g. passing it through\n * `test.use` in playwright.config, which serializes options to workers) can\n * neither leak the credential nor trip the missing-env error.\n */\nfunction defineRequiredSecret(\n target: object,\n property: string,\n value: string | undefined,\n envVar: string,\n): void {\n Object.defineProperty(target, property, {\n enumerable: false,\n configurable: true,\n get(): string {\n if (value === undefined || value === '') {\n throw new Error(\n `[e2e-framework] ${envVar} is not set. The framework ships no credential defaults — ` +\n `export ${envVar} (see your team's 1Password e2e .env entry) before running tests.`,\n );\n }\n return value;\n },\n });\n}\n\nfunction resolveAccounts(env: NodeJS.ProcessEnv): E2eAccounts {\n const nodeIndexedOrganizer = env.CIRCLE_NODE_TOTAL\n ? `dummy.tests+organizer${env.CIRCLE_NODE_INDEX}@testgorilla.com`\n : `dummy.tests+organizer11@testgorilla.com`;\n const accountIndex = env.E2E_ACCOUNT_INDEX;\n\n const accounts = {\n organizerEmail:\n env.userEmail ??\n (accountIndex !== undefined\n ? `dummy.tests+organizer${accountIndex}@testgorilla.com`\n : nodeIndexedOrganizer),\n candidateEmail: env.candidateEmail ?? 'dummy.tests@testgorilla.com',\n hiringManagerEmail: env.hiringManagerEmail ?? 'dummy.tests+hiringmanager01@testgorilla.com',\n recruiterEmail: env.recruiterEmail ?? 'dummy.tests+recruiter1@testgorilla.com',\n adminEmail: env.adminEmail ?? 'dummy.tests+admin1@testgorilla.com',\n newAdminEmail: env.newAdminEmail ?? 'dummy.tests+newadmin@testgorilla.com',\n freeUserEmail: env.freeUserEmail ?? 'dummy.tests+free0@testgorilla.com',\n corePlanUserEmail: env.corePlanUserEmail ?? 'dummy.tests+coreplan@testgorilla.com',\n plusPlanUserEmail: env.plusPlanUserEmail ?? 'dummy.tests+plus@testgorilla.com',\n proPlanUserEmail: env.proPlanUserEmail ?? 'dummy.tests+pro@testgorilla.com',\n businessPlanUserEmail: env.businessPlanUserEmail ?? 'dummy.tests+business@testgorilla.com',\n starterPlanUserEmail: env.starterPlanUserEmail ?? 'dummy.tests+starter@testgorilla.com',\n myProfileUserEmail: env.myProfileUserEmail ?? 'dummy.tests+myprofile@testgorilla.com',\n atsIntegrationsEmail:\n env.atsIntegrationsEmail ?? 'dummy.tests+ats-integrations@testgorilla.com',\n } as E2eAccounts;\n\n defineRequiredSecret(accounts, 'password', env.E2E_PASSWORD ?? env.e2e_password, 'E2E_PASSWORD');\n defineRequiredSecret(\n accounts,\n 'candidatePassword',\n env.E2E_CANDIDATE_PASSWORD,\n 'E2E_CANDIDATE_PASSWORD',\n );\n\n return accounts;\n}\n\nfunction resolveUrls(\n baseURL: string,\n ephemeralPrefix: string | null,\n ephemeralId: string | null,\n): E2eUrls {\n const isEphemeral = !!ephemeralId;\n const ephemeralHost = (service: string) =>\n `https://${ephemeralPrefix}-${ephemeralId}-${service}.dev.testgorilla.com`;\n const isProd = baseURL.includes('app.testgorilla');\n const isDev = baseURL.includes('dev.testgorilla');\n const isLocalhost = baseURL.includes('localhost');\n\n return {\n talentBase: isEphemeral\n ? ephemeralHost('talent')\n : isProd\n ? 'https://talent.testgorilla.com'\n : isDev\n ? 'https://talent-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4100'\n : 'https://talent-staging.testgorilla.com',\n talentAssessment: isEphemeral\n ? ephemeralHost('talent-assessment')\n : isProd\n ? 'https://talent-assessment.testgorilla.com'\n : isDev\n ? 'https://talent-assessment-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4100'\n : 'https://talent-assessment-staging.testgorilla.com',\n talentApi: isEphemeral\n ? ephemeralHost('api-talent')\n : isProd\n ? 'https://api-talent.testgorilla.com'\n : isDev\n ? 'https://api-talent-dev.testgorilla.com'\n : isLocalhost\n ? 'http://localhost:4200'\n : 'https://api-talent-staging.testgorilla.com',\n codeRunnerApi: isProd\n ? 'https://cr-v2.testgorilla.com'\n : isDev\n ? 'https://cr-v2-dev.testgorilla.com'\n : 'https://cr-v2-staging.testgorilla.com',\n websiteBase: isProd\n ? 'https://www.testgorilla.com'\n : isDev && !isEphemeral\n ? 'https://website-dev.testgorilla.com'\n : 'https://website-staging.testgorilla.com',\n mailpit: isEphemeral ? ephemeralHost('mailpit') : LOCAL_MAILHOG_URL,\n localstack: isEphemeral ? ephemeralHost('localstack') : null,\n };\n}\n\n/**\n * Resolve the full e2e run configuration from environment variables, using\n * TestGorilla's environment naming conventions (staging default, ephemeral\n * `backend-<id>` / `talent-api-<id>` dev deployments, production `app`).\n *\n * Pure with respect to its input: pass a custom env for testing; defaults to\n * `process.env`. Never throws on missing secrets — required credentials\n * (`E2E_PASSWORD`, `E2E_CANDIDATE_PASSWORD`) throw with guidance only when\n * first read.\n */\nexport function resolveTgEnvironment(env: NodeJS.ProcessEnv = process.env): E2eConfig {\n const baseURL = env.baseURL || 'https://staging.testgorilla.com';\n\n const ephemeralMatch = baseURL.match(EPHEMERAL_PREFIX_PATTERN);\n const ephemeralPrefix = (ephemeralMatch ? ephemeralMatch[1] : null) as\n | 'backend'\n | 'talent-api'\n | null;\n const ephemeralId = ephemeralMatch ? ephemeralMatch[2] : null;\n const isEphemeralEnvironment = !!ephemeralId;\n\n const environment = baseURL.split('.testgorilla.com')[0].split('https://')[1] || 'staging';\n\n const adminURL =\n env.adminURL ||\n (isEphemeralEnvironment\n ? `https://${ephemeralPrefix}-${ephemeralId}-backend.dev.testgorilla.com`\n : environment === 'app'\n ? `https://new-admin.testgorilla.com`\n : `https://${environment}-new-admin.testgorilla.com`);\n\n const isProd = baseURL.includes('app.testgorilla');\n const isDev = baseURL.includes('dev.testgorilla');\n const isLocalhost = baseURL.includes('localhost');\n\n return {\n baseURL,\n environment,\n isEphemeralEnvironment,\n ephemeralPrefix,\n ephemeralId,\n isLocalEnvironment: env.localEnvironment === 'true' || isEphemeralEnvironment,\n adminURL,\n urls: resolveUrls(baseURL, ephemeralPrefix, ephemeralId),\n emails: {\n signupFrom: isProd\n ? 'hello@testgorilla.com'\n : isLocalhost\n ? 'noreply@example'\n : isDev || isEphemeralEnvironment\n ? 'hello@maildev.testgorilla.com'\n : 'hello@mailstaging.testgorilla.com',\n assessmentsFrom: isProd\n ? 'assessments@testgorilla.com'\n : isLocalhost\n ? 'assessments@example.com'\n : isDev || isEphemeralEnvironment\n ? 'assessments@maildev.testgorilla.com'\n : 'assessments@mailstaging.testgorilla.com',\n },\n accounts: resolveAccounts(env),\n };\n}\n","import * as os from 'os';\nimport { env } from 'process';\n\n/**\n * Run identity for synthetic test data.\n *\n * Every identity the generators mint embeds this id, so any row on the shared\n * (append-only) staging database is attributable to the run that created it —\n * CI or somebody's laptop — and purge jobs can select marked data instead of\n * relying on heuristics (.github/instructions/07-test-data.md).\n *\n * Resolution order:\n * 1. `E2E_RUN_ID` env var (explicit label, e.g. `E2E_RUN_ID=debug-foo`)\n * 2. CI: `ci<hash>` derived from the CircleCI workflow id\n * 3. local: `loc<user><MMDDhhmm>`\n *\n * The computed value is published back to `process.env.E2E_RUN_ID`, so\n * Playwright worker processes (which inherit env from the runner) all agree —\n * the same mechanism the auth-token contract uses. Alphanumeric only, ≤ 16\n * chars, so generated email local-parts stay inside the 64-char limit.\n */\nexport function getRunId(): string {\n if (!env.E2E_RUN_ID) {\n env.E2E_RUN_ID = env.CI ? `ci${shortHash(env.CIRCLE_WORKFLOW_ID ?? '')}` : localRunId();\n }\n return env.E2E_RUN_ID;\n}\n\n/** Deterministic 6-char base-36 hash — enough to tell workflows apart. */\nfunction shortHash(input: string): string {\n let hash = 0;\n for (const char of input) {\n hash = (hash * 31 + char.charCodeAt(0)) >>> 0;\n }\n return hash.toString(36).padStart(6, '0').slice(-6);\n}\n\nfunction localRunId(): string {\n let user = '';\n try {\n user = os\n .userInfo()\n .username.toLowerCase()\n .replace(/[^a-z0-9]/g, '')\n .slice(0, 8);\n } catch {\n // Containers whose uid has no passwd entry throw here; identity\n // generation must never crash a run, so fall back to 'unknown'.\n }\n const now = new Date();\n const pad = (n: number) => String(n).padStart(2, '0');\n const stamp = `${pad(now.getMonth() + 1)}${pad(now.getDate())}${pad(now.getHours())}${pad(\n now.getMinutes(),\n )}`;\n return `loc${user || 'unknown'}${stamp}`;\n}\n","/**\n * Algolia Configuration\n *\n * Test-library search used during assessment creation. The bundled defaults\n * are the same index-restricted, search-only keys the customer frontend ships\n * to browsers (not admin keys); override any of them via the ALGOLIA_* env\n * vars below without a code change (e.g. on key rotation).\n */\n\nimport { baseURL, isEphemeralEnvironment } from './index';\n\nconst ALGOLIA_APP_ID = process.env.ALGOLIA_APP_ID || 'V8Y626J4K8';\n\n// Algolia Index Names\nconst ALGOLIA_PROD_INDEX = process.env.ALGOLIA_PROD_INDEX || 'production_tests_index';\nconst ALGOLIA_STAGING_INDEX = process.env.ALGOLIA_STAGING_INDEX || 'staging_tests_index';\nconst ALGOLIA_EPHEMERAL_INDEX = process.env.ALGOLIA_EPHEMERAL_INDEX || 'ephemeral_tests_index';\n\n// Algolia API Keys (search-only, restricted to the specific indices)\nconst ALGOLIA_PROD_API_KEY =\n process.env.ALGOLIA_PROD_API_KEY ||\n 'NDc2N2JlMmY5ZGE2NzM4NDIwOWM2ODkyMWY0Yjk5YjYyNTA5NTViNDg2YzNlN2VlZDE4MmYyOWE3YmRjNjg1ZXJlc3RyaWN0SW5kaWNlcz1wcm9kdWN0aW9uX3Rlc3RzX2luZGV4';\nconst ALGOLIA_STAGING_API_KEY =\n process.env.ALGOLIA_STAGING_API_KEY ||\n 'ZjZmYWMwYjNkN2IxZjViYzA0OTZkZGE3OWY5MmVjYWMzN2RlYWJlYjcyOWRlMWQ3YjMwM2RjYjk0NDNjZGY0MXJlc3RyaWN0SW5kaWNlcz1zdGFnaW5nX3Rlc3RzX2luZGV4';\nconst ALGOLIA_EPHEMERAL_API_KEY =\n process.env.ALGOLIA_EPHEMERAL_API_KEY || '5beea78e78134e8270214f93b7032e7b';\n\n/**\n * Returns environment-specific Algolia API URL\n */\nexport const getAlgoliaUrl = (): string => {\n const isProduction = baseURL.includes('app.testgorilla');\n\n if (isEphemeralEnvironment) {\n return `https://v8y626j4k8-dsn.algolia.net/1/indexes/${ALGOLIA_EPHEMERAL_INDEX}/query`;\n }\n\n const index = isProduction ? ALGOLIA_PROD_INDEX : ALGOLIA_STAGING_INDEX;\n const domain = isProduction ? 'algolianet.com' : 'algolia.net';\n const subdomain = isProduction ? 'v8y626j4k8-2' : 'v8y626j4k8-dsn';\n\n return `https://${subdomain}.${domain}/1/indexes/${index}/query`;\n};\n\n/**\n * Returns environment-specific Algolia API headers\n */\nexport const getAlgoliaHeaders = (): Record<string, string> => {\n const isProduction = baseURL.includes('app.testgorilla');\n\n let apiKey: string;\n if (isEphemeralEnvironment) {\n apiKey = ALGOLIA_EPHEMERAL_API_KEY;\n } else {\n apiKey = isProduction ? ALGOLIA_PROD_API_KEY : ALGOLIA_STAGING_API_KEY;\n }\n\n return {\n 'content-type': 'application/x-www-form-urlencoded',\n 'x-algolia-api-key': apiKey,\n 'x-algolia-application-id': ALGOLIA_APP_ID,\n };\n};\n","/**\n * Constants & Retries\n *\n * Contains global retry counters and other application constants.\n */\n\nimport { env } from 'process';\n\n// Retry counters - used to determine retry behavior in tests\nexport const DEFAULT_RETRY_COUNTER = 10;\nexport const INCREASED_RETRY_COUNTER_50 = DEFAULT_RETRY_COUNTER * 1.5;\nexport const INCREASED_RETRY_COUNTER_80 = DEFAULT_RETRY_COUNTER * 1.8;\nexport const INCREASED_RETRY_COUNTER_200 = DEFAULT_RETRY_COUNTER * 2;\nexport const INCREASED_RETRY_COUNTER_300 = DEFAULT_RETRY_COUNTER * 3;\n\n// Logger configuration. Default: WARN both in CI and locally — opt in to INFO for milestones\n// or DEBUG for per-request chatter via the LOG_LEVEL env var.\n// API_LOG_LEVEL / API_LOG_FILE are accepted for back-compat with a one-time deprecation note.\nconst rawLogLevel = env.LOG_LEVEL?.toUpperCase() || env.API_LOG_LEVEL?.toUpperCase() || 'WARN';\nif (!env.LOG_LEVEL && env.API_LOG_LEVEL && !env._LOG_DEPRECATION_WARNED) {\n process.stderr.write(\n '[logger] API_LOG_LEVEL is deprecated; use LOG_LEVEL instead (same values).\\n',\n );\n env._LOG_DEPRECATION_WARNED = '1';\n}\nexport const logLevel = rawLogLevel as 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'NONE';\nexport const logFile = env.LOG_FILE || env.API_LOG_FILE || '';\n\n// Back-compat aliases — prefer logLevel / logFile in new code.\nexport const apiLogLevel = logLevel;\nexport const apiLogFile = logFile;\n\n// Assessment configuration — the name→id map published by global setup\n// (process.env.assessments; see @testgorilla/e2e-framework/setup).\nexport const assessmentList = JSON.parse(env.assessments || '{}');\n\n// Other constants\nexport const MAILPIT_SERVER = 'http://localhost:8025';\nexport const simpleAssessmentName = `New Simple Assessment - ${Date.now()}`;\nexport const invitationEmailSubject = 'Your application at TestGorilla';\n\n// Email reception tracking\nexport const emailReception = { slowEmailAPI: false };\n","import { isEphemeralEnvironment } from './index';\n\n/**\n * Supplies the backend's recaptcha bypass key for a given backend environment\n * name (e.g. 'staging', 'dev', 'app'). tgo-qa-automation registers an AWS\n * SSM-backed provider; other consumers typically rely on the env vars alone.\n */\nexport type RecaptchaKeyProvider = (\n backendEnvironment: string,\n) => Promise<string | null | undefined>;\n\nlet keyProvider: RecaptchaKeyProvider | undefined;\n\n/**\n * Registers a fallback source for the recaptcha bypass key, consulted only\n * when the RECAPTCHA_BYPASS_KEY / RECAPTCHA_BYPASS_KEY_STAGE env vars are\n * unset. The framework itself ships no AWS/SSM dependency — the consumer\n * decides where keys come from.\n */\nexport function setRecaptchaBypassKeyProvider(provider: RecaptchaKeyProvider): void {\n keyProvider = provider;\n}\n\n/**\n * Resolves the recaptcha bypass key with the historical precedence:\n * env var (RECAPTCHA_BYPASS_KEY_STAGE on ephemeral envs, RECAPTCHA_BYPASS_KEY\n * otherwise) → registered provider → the literal 'Not Set' (requests then\n * proceed without a working bypass, matching previous behavior).\n */\nexport async function getRecaptchaBypassKey(backendEnvironment: string): Promise<string> {\n const fromEnv = isEphemeralEnvironment\n ? process.env.RECAPTCHA_BYPASS_KEY_STAGE\n : process.env.RECAPTCHA_BYPASS_KEY;\n if (fromEnv) {\n return fromEnv;\n }\n const fromProvider = keyProvider ? await keyProvider(backendEnvironment) : undefined;\n return fromProvider || 'Not Set';\n}\n","/**\n * Random test-data generators (names, phrases, cities, alphanumerics).\n *\n * Replaces the suite's former @faker-js/faker usage (~28 MB installed) with\n * small curated pools — e2e tests only need plausible-looking values, not\n * locale-aware realism. None of these guarantee uniqueness; call sites that\n * need unique values append `Date.now()` (as they always have).\n */\n\nconst FIRST_NAMES = [\n 'Alice',\n 'Bruno',\n 'Carmen',\n 'Diego',\n 'Elena',\n 'Felix',\n 'Greta',\n 'Hugo',\n 'Irene',\n 'Jonas',\n 'Katia',\n 'Liam',\n 'Marta',\n 'Nadia',\n 'Oscar',\n 'Paula',\n 'Quentin',\n 'Rosa',\n 'Sofia',\n 'Tomas',\n 'Ursula',\n 'Victor',\n 'Wanda',\n 'Xavier',\n 'Yara',\n 'Zoe',\n 'Andre',\n 'Bianca',\n 'Cesar',\n 'Dora',\n];\n\nconst LAST_NAMES = [\n 'Almeida',\n 'Bauer',\n 'Castro',\n 'Dubois',\n 'Eriksen',\n 'Fischer',\n 'Garcia',\n 'Hansen',\n 'Ibrahim',\n 'Jansen',\n 'Keller',\n 'Lopez',\n 'Meyer',\n 'Novak',\n 'Olsen',\n 'Peeters',\n 'Quinn',\n 'Rossi',\n 'Schmidt',\n 'Torres',\n 'Ueda',\n 'Vargas',\n 'Weber',\n 'Xu',\n 'Yilmaz',\n 'Zhang',\n];\n\nconst JOB_TITLE_AREAS = [\n 'Marketing',\n 'Product',\n 'Operations',\n 'Finance',\n 'Support',\n 'Engineering',\n 'Design',\n 'Sales',\n 'Research',\n 'Quality',\n];\nconst JOB_TITLE_ROLES = [\n 'Manager',\n 'Specialist',\n 'Analyst',\n 'Coordinator',\n 'Engineer',\n 'Consultant',\n 'Associate',\n 'Director',\n 'Assistant',\n 'Lead',\n];\n\nconst PHRASE_VERBS = [\n 'streamline',\n 'orchestrate',\n 'benchmark',\n 'optimize',\n 'aggregate',\n 'harness',\n 'incentivize',\n 'synthesize',\n 'iterate',\n 'scale',\n];\nconst PHRASE_ADJECTIVES = [\n 'scalable',\n 'seamless',\n 'dynamic',\n 'proactive',\n 'granular',\n 'robust',\n 'frictionless',\n 'holistic',\n 'intuitive',\n 'compelling',\n];\nconst PHRASE_NOUNS = [\n 'workflows',\n 'channels',\n 'metrics',\n 'platforms',\n 'roadmaps',\n 'pipelines',\n 'paradigms',\n 'synergies',\n 'deliverables',\n 'interfaces',\n];\n\nconst CITIES = [\n 'Amsterdam',\n 'Barcelona',\n 'Copenhagen',\n 'Dublin',\n 'Edinburgh',\n 'Florence',\n 'Geneva',\n 'Hamburg',\n 'Istanbul',\n 'Jakarta',\n 'Krakow',\n 'Lisbon',\n 'Madrid',\n 'Nairobi',\n 'Oslo',\n 'Porto',\n 'Quito',\n 'Rotterdam',\n 'Seville',\n 'Tallinn',\n];\n\nconst WORDS = [\n 'amber',\n 'breeze',\n 'cedar',\n 'delta',\n 'ember',\n 'fjord',\n 'garnet',\n 'harbor',\n 'indigo',\n 'juniper',\n 'karma',\n 'lagoon',\n 'meadow',\n 'nectar',\n 'onyx',\n 'prairie',\n 'quartz',\n 'ripple',\n 'summit',\n 'tundra',\n];\n\nconst ALPHANUMERIC = 'abcdefghijklmnopqrstuvwxyz0123456789';\n\nconst pick = <T>(pool: readonly T[]): T => pool[Math.floor(Math.random() * pool.length)];\n\n/** Random plausible first name (ASCII, form-validation safe). */\nexport const randomFirstName = (): string => pick(FIRST_NAMES);\n\n/** Random plausible last name (ASCII, form-validation safe). */\nexport const randomLastName = (): string => pick(LAST_NAMES);\n\n/** Random \"First Last\" full name. */\nexport const randomFullName = (): string => `${randomFirstName()} ${randomLastName()}`;\n\n/** Random plausible job title, e.g. \"Product Analyst\". */\nexport const randomJobTitle = (): string => `${pick(JOB_TITLE_AREAS)} ${pick(JOB_TITLE_ROLES)}`;\n\n/**\n * Random buzzword phrase, e.g. \"streamline scalable workflows\". Used as a\n * readable label for generated tests/assessments; append `Date.now()` when\n * the value must be unique.\n */\nexport const randomPhrase = (): string =>\n `${pick(PHRASE_VERBS)} ${pick(PHRASE_ADJECTIVES)} ${pick(PHRASE_NOUNS)}`;\n\n/** Random space-separated words from a small neutral pool. */\nexport const randomWords = (count = 2): string =>\n Array.from({ length: count }, () => pick(WORDS)).join(' ');\n\n/** Random lowercase alphanumeric string of the given length. */\nexport const randomAlphaNumeric = (length = 1): string =>\n Array.from({ length }, () => ALPHANUMERIC[Math.floor(Math.random() * ALPHANUMERIC.length)]).join(\n '',\n );\n\n/** Random city name. */\nexport const randomCity = (): string => pick(CITIES);\n\n/** Random integer between min and max, both inclusive. */\nexport const randomNumber = (min: number, max: number): number =>\n Math.floor(Math.random() * (max - min + 1)) + min;\n\n// --- username/phone utilities (formerly the suite's helpers/usernameUtils) ---\n\n/** Strips spaces from a phone number string. */\nexport function convertPhoneNumberToString(phone: string) {\n return phone.replaceAll(' ', '');\n}\n\n/** Random Spanish mobile number (9 digits starting with 6). */\nexport function generateRandomSpanishPhone(): string {\n const eightLastDigits: number = Math.floor(Math.random() * 90000000);\n return (600000000 + eightLastDigits).toString();\n}\n\n/** Random plausible first name — kept for compatibility with the historical helper name. */\nexport function randomizeName(): string {\n return randomFirstName();\n}\n\n/**\n * Appends an epoch-timestamp suffix to the local part of an email address,\n * producing a unique username while keeping the original domain.\n */\nexport function randomizeUsername(email: string): string {\n const [username, domain] = email.split('@');\n const epochTimestamp = Math.floor(Date.now() / 1000);\n const newUsername = `${username}+${epochTimestamp}`;\n return `${newUsername}@${domain}`;\n}\n","/**\n * Compatibility surface over {@link resolveTgEnvironment}.\n *\n * Every export here preserves the NAME and SHAPE (const vs function) of the\n * corresponding export in tgo-qa-automation's `helpers/config`, so consumers\n * migrate with a module-specifier-only import rewrite. The values come from a\n * single module-load resolution of `process.env` — the same timing the suite\n * relies on today (env is inherited by every Playwright worker process).\n *\n * Credentials ship with NO defaults: `password` is empty when `E2E_PASSWORD`\n * is unset (the structured `accounts.password` accessor throws with guidance\n * instead).\n */\nimport { resolveTgEnvironment } from './resolve';\nimport { getRunId } from './runId';\n\nexport type { E2eAccounts, E2eConfig, E2eUrls } from './types';\nexport { resolveTgEnvironment } from './resolve';\n\nconst cfg = resolveTgEnvironment();\n\n// --- Environment & URLs (parity with helpers/config/environment.ts) ---\n\nexport const baseURL = cfg.baseURL;\nexport const environment = cfg.environment;\nexport const isEphemeralEnvironment = cfg.isEphemeralEnvironment;\nexport const ephemeralPrefix = cfg.ephemeralPrefix;\nexport const ephemeralId = cfg.ephemeralId;\nexport const isLocalEnvironment = cfg.isLocalEnvironment;\nexport const adminURL = cfg.adminURL;\nexport const localMailHogURL = 'http://localhost:8025';\n\n/** Returns environment-specific mailpit (ephemeral) or local MailHog URL. */\nexport const mailpitURL = (): string => cfg.urls.mailpit;\n\n/**\n * Returns the LocalStack URL for the current ephemeral environment, or `null`\n * when not running against one.\n */\nexport const localstackURL = (): string | null => cfg.urls.localstack;\n\n/** Returns environment-specific talent base URL. */\nexport const talentBaseURL = (): string => cfg.urls.talentBase;\n\n/** Returns environment-specific talent assessment URL. */\nexport const talentAssessmentURL = (): string => cfg.urls.talentAssessment;\n\n/** Returns environment-specific talent API URL. */\nexport const talentApiURL = (): string => cfg.urls.talentApi;\n\n/** Returns environment-specific code runner API URL. */\nexport const codeRunnerApiURL = (): string => cfg.urls.codeRunnerApi;\n\n/** Returns environment-specific website base URL. */\nexport const websiteBaseURL = (): string => cfg.urls.websiteBase;\n\n/** Returns environment-specific signup sender address. */\nexport const signupFromEmail = (): string => cfg.emails.signupFrom;\n\n/** Returns environment-specific assessments sender address. */\nexport const assessmentsFromEmail = (): string => cfg.emails.assessmentsFrom;\n\n/** Check if current environment is NOT staging. */\nexport const ifNotStagingRun = (): boolean => !cfg.baseURL.includes('staging.testgorilla');\n\n/**\n * Check if current environment is NEITHER staging NOR an ephemeral dev env.\n * Use this to skip tests that depend on the website → app signup flow.\n */\nexport const ifNotStagingOrEphemeralRun = (): boolean =>\n ifNotStagingRun() && !cfg.isEphemeralEnvironment;\n\n/** Check if current environment is NOT localhost. */\nexport const ifNotLocalhostRun = (): boolean => !cfg.baseURL.includes('localhost');\n\n/**\n * Rewrites a signup URL produced by the marketing website (which always\n * points at app.testgorilla.com) so it targets the current environment.\n */\nexport const rewriteSignupUrlForEnv = (signupUrl: string): string => {\n const targetHost = new URL(cfg.baseURL).host;\n return signupUrl.replace(/app\\.testgorilla\\.com/i, targetHost);\n};\n\n// --- Environment URL constants (parity with helpers/config/environment.ts) ---\n\nexport const prodTesttakerUrlString = 'https://assessment.testgorilla.com';\nexport const prodTASUrlString = 'https://talent-assessment.testgorilla.com';\nexport const stageTesttakerUrlString = 'https://staging-assessment.testgorilla.com';\nexport const stageTASUrlString = 'https://talent-assessment-staging.testgorilla.com';\nexport const devTASUrlString = 'https://talent-assessment-dev.testgorilla.com';\nexport const localTASUrlString = 'http://localhost:4100';\nexport const stagingTASAPIUrl = 'https://api-talent-staging.testgorilla.com';\n\n// --- Seed assessment names (product constants, non-secret) ---\n\nexport const CandidateInviteAssessment = 'Candidate-Invite-Assessment-4-Do-not-archive';\nexport const candidateExpiredAssessment = 'Candidate-Expired-Assessment-1-Do-not-archive';\nexport const candidateArchivedAssessment = 'Candidate-Archived-Assessment-1-Do-not-archive';\nexport const tasSimpleMcqAssessment = 'TAS-MCQ-Assessment';\nexport const tasCustomTestAssessment = 'TAS-Custom-Test-Assessment';\nexport const tasSimpleBulkAssessment = 'TAS-Bulk-Assessment';\n\n// --- Test accounts (parity with helpers/config/testAccounts.ts, secrets stripped) ---\n\n/** Structured account set; `accounts.password` throws with guidance if `E2E_PASSWORD` is unset. */\nexport const accounts = cfg.accounts;\n\n/** Main organizer account email for this run. */\nexport const email = cfg.accounts.organizerEmail;\n\n/**\n * Organizer password from `E2E_PASSWORD` (legacy `e2e_password`). Empty string\n * when unset — the framework ships no credential defaults. Prefer\n * `accounts.password`, which throws with setup guidance instead of silently\n * yielding ''.\n */\nexport const password = process.env.E2E_PASSWORD ?? process.env.e2e_password ?? '';\n\nexport const candidateEmail = cfg.accounts.candidateEmail;\nexport const hiringManagerEmail = cfg.accounts.hiringManagerEmail;\nexport const recruiterEmail = cfg.accounts.recruiterEmail;\nexport const adminEmail = cfg.accounts.adminEmail;\nexport const newAdminEmail = cfg.accounts.newAdminEmail;\nexport const freeUserEmail = cfg.accounts.freeUserEmail;\nexport const corePlanUserEmail = cfg.accounts.corePlanUserEmail;\nexport const plusPlanUserEmail = cfg.accounts.plusPlanUserEmail;\nexport const proPlanUserEmail = cfg.accounts.proPlanUserEmail;\nexport const businessPlanUserEmail = cfg.accounts.businessPlanUserEmail;\nexport const starterPlanUserEmail = cfg.accounts.starterPlanUserEmail;\nexport const myProfileUserEmail = cfg.accounts.myProfileUserEmail;\nexport const atsIntegrationsEmail = cfg.accounts.atsIntegrationsEmail;\n\nconst EMAIL_DOMAIN = '@testgorilla.com';\nconst DUMMY_TESTS_PREFIX = 'dummy.tests';\n\n// Per-process tie-breaker so two mints in the same millisecond never collide.\nlet mintCounter = 0;\n\n/**\n * Unique, run-attributable suffix for generated identities:\n * `<runId>x<epoch36><counter>`. Embedding the run id makes every row on the\n * shared staging DB traceable to the CI workflow or local user that created\n * it, and lets purge jobs select marked data (.github/instructions/07-test-data.md).\n */\nconst mintSuffix = (): string => `${getRunId()}x${Date.now().toString(36)}${mintCounter++}`;\n\n/**\n * Generate a random candidate email.\n * Format: `dummy.tests+cand<rand><runId>x<timestamp>@testgorilla.com`.\n */\nexport const randCandidateEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+cand${rand}${mintSuffix()}${EMAIL_DOMAIN}`;\n\n/**\n * Generate a random customer email.\n * Format: `dummy.tests+cust<rand><runId>x<timestamp>@testgorilla.com`.\n */\nexport const randCustomerEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+cust${rand}${mintSuffix()}${EMAIL_DOMAIN}`;\n\n// --- Algolia, constants, recaptcha (parity with helpers/config) ---\n// Lazily circular: algolia/recaptcha read baseURL/isEphemeralEnvironment from\n// this barrel inside their functions only, never at module load.\n\nexport { getAlgoliaUrl, getAlgoliaHeaders } from './algolia';\nexport * from './constants';\nexport { getRecaptchaBypassKey, setRecaptchaBypassKeyProvider } from './recaptcha';\nexport type { RecaptchaKeyProvider } from './recaptcha';\n\n/**\n * Generate a random team-member email tagged with the current environment.\n * Format: `dummy.tests+t<rand><env>+<runId>x<timestamp>@testgorilla.com`.\n */\nexport const randTeamMemberEmail = (rand = ''): string =>\n `${DUMMY_TESTS_PREFIX}+t${rand}${cfg.environment}+${mintSuffix()}${EMAIL_DOMAIN}`;\n\n// Random test-data generators (faker replacement) + username/phone utilities\nexport * from './randomData';\nexport { getRunId };\n"],"mappings":"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A,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,oBAAoB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,SAAS;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;A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","names":["env","accounts","baseURL","ephemeralPrefix","ephemeralId","isEphemeralEnvironment","environment","adminURL","env","email"]}
import {
baseURL,
isLocalEnvironment
} from "./chunk-DW4V5VUB.mjs";
// src/enums/tests.ts
var TestName = /* @__PURE__ */ ((TestName2) => {
TestName2["CultureAdd"] = "Culture add";
TestName2["Communication"] = "Communication";
TestName2["Motivation"] = "Motivation";
TestName2["Disc"] = "DISC";
TestName2["CustomQuestion"] = "Custom questions";
TestName2["PHPCoding_stage"] = "PHP (coding): object-oriented programming";
TestName2["PHPCoding_prod"] = "PHP (Coding): Object-Oriented Programming";
TestName2["PythonCodingDebugging"] = "Coding: Debugging";
TestName2["PythonCodingDebugging_prod"] = "Python (Coding): Debugging";
TestName2["PythonCodingEntryLevel"] = "Python (coding): entry-level algorithms";
TestName2["AttentionToDetail"] = "Attention to Detail (Textual)";
TestName2["EnglishProficiency"] = "English C1 (Advanced)";
TestName2["EnglishIntermediate"] = "English (intermediate/B1)";
TestName2["RubyOnRails"] = "Ruby on Rails";
TestName2["JavaScriptCodingEntryLevel"] = "JavaScript (Coding): Entry-Level Algorithms";
TestName2["TypeScriptCodingEntryLevel"] = "TypeScript (coding): entry-level algorithms";
TestName2["PhpEntryLevel"] = "PHP (coding): intermediate-level algorithms";
TestName2["SqliteIntermediate"] = "SQLite (coding): intermediate-level querying";
TestName2["SQLiteEntryLevel"] = "SQLite (coding): entry-level database operations";
TestName2["JavaEntryLevel"] = "Java (coding): entry-level algorithms";
TestName2["CCodingEntryLevel"] = "C (coding): entry-level algorithms";
TestName2["CPPCodingEntryLevel"] = "C++ (coding): entry-level algorithms";
TestName2["CHashCodingEntryLevel"] = "C# (coding): entry-level algorithms";
TestName2["RubyEntryLevel"] = "Ruby (coding): entry-level algorithms";
TestName2["Enn\xE9agramme"] = "Enn\xE9agramme";
TestName2["AttentionToDetailVisual"] = "Attention to detail (visual)";
TestName2["WorkingWithData"] = "Working with data";
TestName2["ReadingComprehension"] = "Reading comprehension";
TestName2["TypingSpeedLowerCase"] = "Typing Speed (Lowercase Only)";
TestName2["TypingSpeedCapitalization"] = "Typing Speed (Capitalization and Punctuation)";
TestName2["TypingSpeedNumbersOnly"] = "Typing Speed (Numbers Only)";
TestName2["VerbalReasoning"] = "Verbal Reasoning";
TestName2["ProblemSolving"] = "Problem Solving";
TestName2["ProblemSolvingStaging"] = "Problem solving";
TestName2["Big5"] = "Big 5 (OCEAN)";
TestName2["TimeManagement"] = "Time Management";
TestName2["TimeManagementStaging"] = "Time management";
TestName2["RubyDebugging"] = "Ruby (coding): debugging";
TestName2["CodingEntryLevel"] = "Coding: Entry-level algorithms";
TestName2["Tableau"] = "Tableau";
TestName2["FollowingInstructions"] = "Following instructions";
TestName2["UnderstandingInstructions"] = "Understanding instructions";
TestName2["GoogleSpreadsheetSimulation"] = "Google Sheets Spreadsheet Simulation";
TestName2["CloudSystemAdministration"] = "Cloud System Administration";
TestName2["AndroidKotlin"] = "Android Development Using Kotlin";
TestName2["ActiveListening"] = "Active Listening";
TestName2["MySQL"] = "MySQL";
TestName2["SpreadsheetSimulation"] = "Spreadsheet Simulation: Google Sheets (Intermediate)";
TestName2["UniversalSkillsProfiler"] = "Universal Skills Profiler";
TestName2["Enneagram"] = "Enneagram";
TestName2["HTML5"] = "HTML5";
TestName2["CriticalThinking"] = "Critical thinking";
TestName2["HubspotCRM"] = "Hubspot CRM";
TestName2["Shopify"] = "Shopify";
TestName2["Laravel"] = "Laravel";
TestName2["Flutter"] = "Flutter";
TestName2["IntermediateMath"] = "Intermediate Math";
TestName2["Zendesk"] = "Zendesk CS";
TestName2["PurchaseManager"] = "Purchase Manager";
TestName2["SQLQuerying"] = "SQLite (Coding): Intermediate-Level Querying";
TestName2["ImmersiveTest"] = "Customer Service (Immersive Role-Play)";
TestName2["AIResume"] = "AI Resume Scoring";
TestName2["SoftwareArchitect"] = "Software architect";
TestName2["AWS"] = "AWS";
return TestName2;
})(TestName || {});
var ProgrammingLanguages = /* @__PURE__ */ ((ProgrammingLanguages2) => {
ProgrammingLanguages2["Python"] = "Python";
ProgrammingLanguages2["JavaScript"] = "JavaScript";
ProgrammingLanguages2["TypeScript"] = "TypeScript";
ProgrammingLanguages2["Php"] = "PHP";
ProgrammingLanguages2["Sqlite"] = "SQLite";
ProgrammingLanguages2["Java"] = "Java";
ProgrammingLanguages2["C"] = "C";
ProgrammingLanguages2["CPP"] = "C++";
ProgrammingLanguages2["CHash"] = "C#";
ProgrammingLanguages2["Ruby"] = "Ruby";
return ProgrammingLanguages2;
})(ProgrammingLanguages || {});
var TestDuration = getTestDuration();
function getTestDuration() {
if (baseURL.includes("app")) {
return {
CultureAdd: "10",
AttentionToDetail: "12",
AttentionToDetailVisual: "10",
EnglishProficiency: "10",
CustomTest: "10",
PythonCoding: "14"
};
} else if (isLocalEnvironment) {
return {
CultureAdd: "10",
AttentionToDetail: "12",
AttentionToDetailVisual: "10",
EnglishProficiency: "10",
CustomTest: "10",
PythonCoding: "8"
};
} else {
return {
CultureAdd: "10",
AttentionToDetail: "10",
AttentionToDetailVisual: "10",
EnglishProficiency: "10",
CustomTest: "10",
PythonCoding: "14"
};
}
}
var CodingTaskOutput = /* @__PURE__ */ ((CodingTaskOutput2) => {
CodingTaskOutput2["TaskSuccess"] = "Code executed successfully";
CodingTaskOutput2["TaskFailure"] = "Task finished with errors.Traceback (most recent call last):";
CodingTaskOutput2["TaskMessage"] = "Task";
CodingTaskOutput2["EmptyScriptTaskMessage"] = "Run tests to check your code";
return CodingTaskOutput2;
})(CodingTaskOutput || {});
var PersonalityAndCultureTestName = /* @__PURE__ */ ((PersonalityAndCultureTestName2) => {
PersonalityAndCultureTestName2["CultureAddSurvey"] = "Culture add survey";
PersonalityAndCultureTestName2["MotivationTestSurvey"] = "Motivation test survey";
return PersonalityAndCultureTestName2;
})(PersonalityAndCultureTestName || {});
var TestKeyWord = /* @__PURE__ */ ((TestKeyWord2) => {
TestKeyWord2["Motivation"] = "Motivation";
return TestKeyWord2;
})(TestKeyWord || {});
var TestType = /* @__PURE__ */ ((TestType2) => {
TestType2["PersonalityAndCulture"] = "Personality & culture";
TestType2["ProgrammingSkills"] = "Programming skills";
return TestType2;
})(TestType || {});
var TestFormat = /* @__PURE__ */ ((TestFormat2) => {
TestFormat2["MultipleChoice"] = "Multiple-choice";
TestFormat2["Coding"] = "Coding";
TestFormat2["Typing"] = "Typing";
TestFormat2["Questionnaire"] = "Questionnaire";
TestFormat2["Simulation"] = "Simulation";
return TestFormat2;
})(TestFormat || {});
var TestDurations = /* @__PURE__ */ ((TestDurations2) => {
TestDurations2["ZeroToTenMinutes"] = "Up to 10 mins";
TestDurations2["ElevenToTwentyMinutes"] = "11 to 20 mins";
TestDurations2["TwentyoneToThirtyMinutes"] = "21 to 30 mins";
TestDurations2["ThirtyoneTosixtyMinutes"] = "31 to 60 mins";
return TestDurations2;
})(TestDurations || {});
var TestsCount = /* @__PURE__ */ ((TestsCount2) => {
TestsCount2["ZeroTests"] = "0 added";
TestsCount2["OneTests"] = "1 test";
TestsCount2["TwoTests"] = "2 added";
TestsCount2["ThreeTests"] = "3 test";
TestsCount2["FourTests"] = "4 test";
TestsCount2["FiveTests"] = "5 added";
return TestsCount2;
})(TestsCount || {});
var TestFilterNames = /* @__PURE__ */ ((TestFilterNames2) => {
TestFilterNames2["Library"] = "Show tests from";
TestFilterNames2["RoleSpecific"] = "Skills for";
TestFilterNames2["Focus"] = "Focus";
TestFilterNames2["Duration"] = "Duration";
TestFilterNames2["Format"] = "Format";
TestFilterNames2["Highlights"] = "Highlights";
return TestFilterNames2;
})(TestFilterNames || {});
var CodingQuestions = /* @__PURE__ */ ((CodingQuestions2) => {
CodingQuestions2["Python"] = "Python";
return CodingQuestions2;
})(CodingQuestions || {});
var CreateCodingTestHeaders = /* @__PURE__ */ ((CreateCodingTestHeaders2) => {
CreateCodingTestHeaders2["FunctionSignature"] = "Function signature";
CreateCodingTestHeaders2["InitialCode"] = "Initial code";
CreateCodingTestHeaders2["TestCases"] = "Test cases";
CreateCodingTestHeaders2["VerificationCode"] = "Verification code";
return CreateCodingTestHeaders2;
})(CreateCodingTestHeaders || {});
var PracticeQuestions = /* @__PURE__ */ ((PracticeQuestions2) => {
PracticeQuestions2["AttentionToDetail"] = "info This is the first practice question. You are in charge of sending invitations for a class reunion next month. You compare the address on file for one participant with the address available in the yearbook, which are as shown below";
PracticeQuestions2["CodingQuestion"] = "The purpose of this question is to show you how coding tests work. You are not being scored for anything in this question.";
PracticeQuestions2["EnglishProficiency"] = "Read the text and choose the synonym of the underlined word.";
PracticeQuestions2["RubyOnRails"] = "Which of the available queries returns the authors who have written at least one book?";
return PracticeQuestions2;
})(PracticeQuestions || {});
// src/enums/ui.ts
var PageSize = /* @__PURE__ */ ((PageSize2) => {
PageSize2[PageSize2["Ten"] = 10] = "Ten";
PageSize2[PageSize2["TwentyFive"] = 25] = "TwentyFive";
PageSize2[PageSize2["Fifty"] = 50] = "Fifty";
return PageSize2;
})(PageSize || {});
var MyAssessmentTableHeader = /* @__PURE__ */ ((MyAssessmentTableHeader2) => {
MyAssessmentTableHeader2["DateCreated"] = "Job Created";
MyAssessmentTableHeader2["LastActivity"] = "Last activity";
return MyAssessmentTableHeader2;
})(MyAssessmentTableHeader || {});
var TalentAssessmentTableHeader = /* @__PURE__ */ ((TalentAssessmentTableHeader2) => {
TalentAssessmentTableHeader2["CompanyName"] = "COMPANY NAME";
TalentAssessmentTableHeader2["InvitedOn"] = "INVITED ON";
TalentAssessmentTableHeader2["LastActivity"] = "LAST ACTIVITY";
return TalentAssessmentTableHeader2;
})(TalentAssessmentTableHeader || {});
var Sort = /* @__PURE__ */ ((Sort2) => {
Sort2["Ascending"] = "ascending";
Sort2["Decending"] = "descending";
return Sort2;
})(Sort || {});
var MenuItem = /* @__PURE__ */ ((MenuItem2) => {
MenuItem2["TeamManagement"] = "Team Management";
MenuItem2["Integrations"] = "Integrations";
MenuItem2["MyCompany"] = "My company";
MenuItem2["Logout"] = "Log out";
MenuItem2["PlanAndBilling"] = "Plan & billing";
MenuItem2["MyProfile"] = "My profile";
MenuItem2["AccountProfile"] = "Profile";
MenuItem2["LogOut"] = "Log out";
MenuItem2["Notifications"] = "Notifications";
MenuItem2["AssessmentSettings"] = "Settings";
return MenuItem2;
})(MenuItem || {});
var SideNavItem = /* @__PURE__ */ ((SideNavItem2) => {
SideNavItem2["Home"] = "Home";
SideNavItem2["Jobs"] = "Jobs";
SideNavItem2["Sourcing"] = "Sourcing";
SideNavItem2["Candidates"] = "Candidates";
SideNavItem2["Analytics"] = "Analytics";
SideNavItem2["TestLibrary"] = "Test library";
SideNavItem2["WhatsNew"] = "What's new";
SideNavItem2["HelpCenter"] = "Help center";
return SideNavItem2;
})(SideNavItem || {});
var Colour = /* @__PURE__ */ ((Colour2) => {
Colour2["Black"] = "#000000";
return Colour2;
})(Colour || {});
var Benchmark = /* @__PURE__ */ ((Benchmark2) => {
Benchmark2["PercentageCorrect"] = "Percentage of correct answers";
Benchmark2["AllCandidates"] = "All candidates";
Benchmark2["Percentile"] = "Percentile";
return Benchmark2;
})(Benchmark || {});
var HiringStage = /* @__PURE__ */ ((HiringStage2) => {
HiringStage2["Interviewed"] = "Interviewed";
HiringStage2["Hired"] = " Hired \u{1F389}";
return HiringStage2;
})(HiringStage || {});
var CheatingMonitorList = /* @__PURE__ */ ((CheatingMonitorList2) => {
CheatingMonitorList2["DeviceUsed"] = "Device used\nDesktop";
CheatingMonitorList2["WebcamEnabled"] = "Webcam enabled?\nYes";
CheatingMonitorList2["FullScreenMode"] = "Full-screen mode always active?\nYes";
CheatingMonitorList2["MousePosition"] = "Mouse always in assessment window?\nYes";
return CheatingMonitorList2;
})(CheatingMonitorList || {});
var DownloadFormat = /* @__PURE__ */ ((DownloadFormat2) => {
DownloadFormat2["Csv"] = "CSV";
DownloadFormat2["Excel"] = "Excel";
DownloadFormat2["Pdf"] = "PDF";
return DownloadFormat2;
})(DownloadFormat || {});
var URLs = /* @__PURE__ */ ((URLs2) => {
URLs2["TestGorillaPublicUrl"] = "https://www.testgorilla.com/";
URLs2["TestGorillaPublicPage"] = "TestGorilla";
URLs2["TestGorillaHelpPage"] = "Help center";
URLs2["TestGorillaFacebook"] = "Facebook";
URLs2["TestGorillaInstagram"] = "Instagram";
URLs2["TestGorillaLinkedin"] = "LinkedIn";
URLs2["Support"] = "support.testgorilla.com";
URLs2["CandidateSupport"] = "candidates.testgorilla.com";
URLs2["CandidateHub"] = "talent-staging.testgorilla.com/create-account";
URLs2["TasOldFlow"] = "https://assessment.testgorilla.com/testtaker/takeinvitation/";
URLs2["TasNewFlow"] = "https://talent-assessment.testgorilla.com/";
URLs2["privacyPolicyLink"] = "https://www.testgorilla.com/terms/privacy-policy";
URLs2["CandidateTerms"] = "https://www.testgorilla.com/candidate-terms";
return URLs2;
})(URLs || {});
var CreatingAssessmentsSteps = /* @__PURE__ */ ((CreatingAssessmentsSteps2) => {
CreatingAssessmentsSteps2["Step1"] = "Job details";
CreatingAssessmentsSteps2["Step2"] = "Assessment";
CreatingAssessmentsSteps2["Step3"] = "Configuration";
CreatingAssessmentsSteps2["Step4"] = "Finalize";
return CreatingAssessmentsSteps2;
})(CreatingAssessmentsSteps || {});
var TestGorillaTheme = /* @__PURE__ */ ((TestGorillaTheme2) => {
TestGorillaTheme2["BgColor"] = "#d410aa";
return TestGorillaTheme2;
})(TestGorillaTheme || {});
// src/enums/candidates.ts
var AssessmentStatus = /* @__PURE__ */ ((AssessmentStatus2) => {
AssessmentStatus2["Completed"] = "Completed";
AssessmentStatus2["Invited"] = "Invited";
AssessmentStatus2["Closed"] = "Closed";
return AssessmentStatus2;
})(AssessmentStatus || {});
var AssessmentResultStatus = /* @__PURE__ */ ((AssessmentResultStatus2) => {
AssessmentResultStatus2["Unavailable"] = "Unavailable";
return AssessmentResultStatus2;
})(AssessmentResultStatus || {});
var Pronoun = /* @__PURE__ */ ((Pronoun2) => {
Pronoun2["HeHim"] = "He/Him";
return Pronoun2;
})(Pronoun || {});
var JobSearchStatus = /* @__PURE__ */ ((JobSearchStatus2) => {
JobSearchStatus2["ActivelySearching"] = "Actively searching";
JobSearchStatus2["OpenToNewChallenges"] = "Open to new challenges";
JobSearchStatus2["NotLookingRightNow"] = "Not looking right now";
return JobSearchStatus2;
})(JobSearchStatus || {});
var Proficiency = /* @__PURE__ */ ((Proficiency2) => {
Proficiency2["None"] = "None";
return Proficiency2;
})(Proficiency || {});
var CandidateStatusFilters = /* @__PURE__ */ ((CandidateStatusFilters2) => {
CandidateStatusFilters2["Started"] = "Started";
CandidateStatusFilters2["Invited"] = "Invitation delivered";
CandidateStatusFilters2["Completed"] = "Completed";
return CandidateStatusFilters2;
})(CandidateStatusFilters || {});
var CandidateMeta = /* @__PURE__ */ ((CandidateMeta2) => {
CandidateMeta2["TestInfoTimerText"] = "Please stay on this screen. The timer for your next test has started and cannot be paused. The timer continues if you close the browser.";
CandidateMeta2["TestInfoTimer30MText"] = "Please stay on this screen. The timer for your next test has started and cannot be paused. The timer continues if you close the browser.";
CandidateMeta2["TestInfoTimerPlainText"] = "Please stay on this screen. The timer for your next test has started and cannot be paused. You must complete this test in the next ";
CandidateMeta2["TestInfoTimerTextTasFlow"] = "Please stay on this screen. The timer for your next test has started and cannot be paused. The timer continues even when you close the browser.";
return CandidateMeta2;
})(CandidateMeta || {});
var BehaviourLogFlags = /* @__PURE__ */ ((BehaviourLogFlags2) => {
BehaviourLogFlags2["DeviceUsed"] = "Device used";
BehaviourLogFlags2["FilledOutOnceFromIP"] = "Filled out only once from IP address?";
BehaviourLogFlags2["WebcamAlwaysEnabled"] = "Webcam always enabled?";
BehaviourLogFlags2["FullScreenExit"] = "Full-screen mode exit";
BehaviourLogFlags2["TabSwitch"] = "Tab switch";
BehaviourLogFlags2["DevToolsOpened"] = "Developer tools opened";
return BehaviourLogFlags2;
})(BehaviourLogFlags || {});
var TalentFilters = /* @__PURE__ */ ((TalentFilters2) => {
TalentFilters2["JobRole"] = "Kitchen Assistant";
TalentFilters2["LocationName"] = "Lusaka, Zambia";
TalentFilters2["YearsOfExperience"] = "10";
TalentFilters2["MinSalary"] = "125000";
TalentFilters2["MaxSalary"] = "395000";
TalentFilters2["MinSalaryDefault"] = "0";
TalentFilters2["MaxSalaryDefault"] = "500000";
TalentFilters2["SalaryType"] = "Annually";
return TalentFilters2;
})(TalentFilters || {});
var KitchenAssistantTalentDetails = /* @__PURE__ */ ((KitchenAssistantTalentDetails2) => {
KitchenAssistantTalentDetails2["JobRole"] = "Kitchen Assistant";
KitchenAssistantTalentDetails2["LocationName"] = "Lusaka, Zambia";
KitchenAssistantTalentDetails2["Salary"] = "$30,000/yr";
KitchenAssistantTalentDetails2["YearsOfExperience"] = "15 years exp.";
KitchenAssistantTalentDetails2["JobTitle"] = "Kitchen Assistant at Kitchen Company";
return KitchenAssistantTalentDetails2;
})(KitchenAssistantTalentDetails || {});
var DogTrainerTalentDetails = /* @__PURE__ */ ((DogTrainerTalentDetails2) => {
DogTrainerTalentDetails2["JobRole"] = "Dog Trainer";
DogTrainerTalentDetails2["LocationName"] = "Sydney, Australia";
DogTrainerTalentDetails2["Salary"] = "$60,000/yr";
DogTrainerTalentDetails2["YearsOfExperience"] = "30 years exp.";
DogTrainerTalentDetails2["JobTitle"] = "Dog trainer at Dog trainer organization";
DogTrainerTalentDetails2["WorkExperienceTitle"] = "Dog trainer";
DogTrainerTalentDetails2["WorkExperienceDescription"] = "Training dogs";
DogTrainerTalentDetails2["VerifiedSkill_1"] = "HTML5";
return DogTrainerTalentDetails2;
})(DogTrainerTalentDetails || {});
var SourcingInvitationMessage = /* @__PURE__ */ ((SourcingInvitationMessage2) => {
SourcingInvitationMessage2["Custom"] = "Hello, \n\n we would like to invite you. Please find the details below. \n Details";
return SourcingInvitationMessage2;
})(SourcingInvitationMessage || {});
// src/enums/integrations.ts
var IntegrationsImageSrc = /* @__PURE__ */ ((IntegrationsImageSrc2) => {
IntegrationsImageSrc2["Breezy"] = "assets/integrations/brz.png";
IntegrationsImageSrc2["GreenHouse"] = "assets/integrations/ghs.png";
IntegrationsImageSrc2["JazzHR"] = "assets/integrations/jhr.png";
IntegrationsImageSrc2["Personio"] = "assets/integrations/psn.png";
IntegrationsImageSrc2["Recruitee"] = "assets/integrations/rct.png";
return IntegrationsImageSrc2;
})(IntegrationsImageSrc || {});
var Integrations = /* @__PURE__ */ ((Integrations2) => {
Integrations2["Breezy"] = "Breezy";
Integrations2["GreenHouse"] = "Greenhouse";
Integrations2["JazzHR"] = "JazzHR";
Integrations2["Recruitee"] = "Recruitee";
return Integrations2;
})(Integrations || {});
// src/enums/customQuestions.ts
var OneWayInterviewQuestionName = /* @__PURE__ */ ((OneWayInterviewQuestionName2) => {
OneWayInterviewQuestionName2["SellingAPen"] = "Selling a pen";
OneWayInterviewQuestionName2["PrioritizingTasks"] = "Prioritizing tasks";
OneWayInterviewQuestionName2["TacklingChallenges"] = "Tackling challenges";
OneWayInterviewQuestionName2["ExceedingExpectations"] = "Exceeding expectations";
return OneWayInterviewQuestionName2;
})(OneWayInterviewQuestionName || {});
var CustomQuestionName = /* @__PURE__ */ ((CustomQuestionName2) => {
CustomQuestionName2["Video"] = "Video";
CustomQuestionName2["Essay"] = "Essay";
CustomQuestionName2["MultipleChoice"] = "Multiple-choice";
CustomQuestionName2["FileUpload"] = "File upload";
CustomQuestionName2["Code"] = "Code";
CustomQuestionName2["AllQuestionCategories"] = "Select all question categories";
CustomQuestionName2["PriorExperience"] = "Prior experience";
CustomQuestionName2["Motivation"] = "Motivation";
CustomQuestionName2["SoftSkills"] = "Soft skills";
CustomQuestionName2["JobSkills"] = "Job skills";
CustomQuestionName2["Finance"] = "Finance";
CustomQuestionName2["CustomerService"] = "Customer service";
CustomQuestionName2["Sales"] = "Sales";
CustomQuestionName2["Marketing"] = "Marketing";
CustomQuestionName2["IT"] = "IT";
CustomQuestionName2["AdministrativeSupport"] = "Administrative support";
CustomQuestionName2["Management"] = "Management";
CustomQuestionName2["SellingAPen"] = "Selling a pen";
CustomQuestionName2["TacklingChallenges"] = "Tackling challenges";
CustomQuestionName2["HandlingUnreasonableRequests"] = "Handling unreasonable requests";
return CustomQuestionName2;
})(CustomQuestionName || {});
var CustomQuestionDescription = /* @__PURE__ */ ((CustomQuestionDescription2) => {
CustomQuestionDescription2["SellingAPen"] = "Sell me the first pen within reach.";
CustomQuestionDescription2["TacklingChallenges"] = "Describe an especially difficult assignment or project you have worked on. What was your role? How did you approach the requirements, and what was the outcome?";
CustomQuestionDescription2["HandlingUnreasonableRequests"] = "Describe a time when you had to handle an unfair or unreasonable complaint or a request from a customer. What did the customer ask, and how did you handle it?";
return CustomQuestionDescription2;
})(CustomQuestionDescription || {});
var Duration = /* @__PURE__ */ ((Duration2) => {
Duration2["ThirtySeconds"] = "30 secs";
Duration2["FiveMinutes"] = "5 mins";
Duration2["TwoMinutes"] = "2 mins";
Duration2["TenMinutes"] = "10 mins";
Duration2["ZeroMinutes"] = "0 mins";
Duration2["SixMinutes"] = "6 mins";
Duration2["FifteenMinutes"] = "15 mins";
Duration2["FiftyFiveMinues"] = "55 mins";
Duration2["FiftyMinues"] = "50 mins";
Duration2["FortyMinutes"] = "40 mins";
Duration2["FortyTwoMinutes"] = "42 mins";
Duration2["FortyFourMinutes"] = "44 mins";
Duration2["FiftyNineMinutes"] = "59 mins";
Duration2["FiftyFourMinutes"] = "54 mins";
Duration2["FiftyEightMinutes"] = "58 mins";
Duration2["SixtyNineMinutes"] = "69 mins";
Duration2["SeventyThreeMinutes"] = "73 mins";
return Duration2;
})(Duration || {});
var CustomQuestionsFilters = /* @__PURE__ */ ((CustomQuestionsFilters2) => {
CustomQuestionsFilters2["Assessment"] = "Assessment name";
CustomQuestionsFilters2["Library"] = "Library";
CustomQuestionsFilters2["Format"] = "Format";
CustomQuestionsFilters2["Topic"] = "Topic";
CustomQuestionsFilters2["RoleSpecific"] = "Role specific";
return CustomQuestionsFilters2;
})(CustomQuestionsFilters || {});
var CustomQuestions = /* @__PURE__ */ ((CustomQuestions2) => {
CustomQuestions2["TestGorillaLibrary"] = "TestGorilla library";
CustomQuestions2["MyLibrary"] = "My library";
CustomQuestions2["AddingValue"] = "Adding value";
CustomQuestions2["AddingValueDescription"] = "How do you plan to add value to this organization?";
CustomQuestions2["HowAreYou"] = "How are you?";
CustomQuestions2["WhereAreYouFrom"] = "Where are you from?";
CustomQuestions2["UploadYourResume"] = "Upload your resume";
CustomQuestions2["ValidateRegex"] = "Validate Regex";
CustomQuestions2["CreateIntroVideo"] = "Create intro video of yourself";
CustomQuestions2["IntroducingYourself"] = "Introducing yourself";
CustomQuestions2["TacklingChallenges"] = "Tackling challenges";
CustomQuestions2["TacklingChallengesDescription"] = "Describe an especially difficult assignment or project you have worked on. What was your role? How did you approach the requirements, and what was the outcome?";
return CustomQuestions2;
})(CustomQuestions || {});
var CustomQuestionsContent = /* @__PURE__ */ ((CustomQuestionsContent2) => {
CustomQuestionsContent2["IntroducingYourself"] = "Introduce yourself in 60 seconds and explain why you're a great";
CustomQuestionsContent2["AddingValue"] = "How do you plan to add value to this organization?";
CustomQuestionsContent2["FailingToDeliver"] = "Tell me about a time when you didn't deliver on your key objectives. What did you learn?";
CustomQuestionsContent2["FindingAGreaterPurpose"] = "How would working in this role help you fulfill a greater personal purpose?";
CustomQuestionsContent2["WorkingCrossFunctionally"] = "How do you transcend your role as a finance professional and interact cross-functionally with people in other departments?";
return CustomQuestionsContent2;
})(CustomQuestionsContent || {});
// src/enums/locations.ts
var City = /* @__PURE__ */ ((City2) => {
City2["Ardamata"] = "Ardamata";
City2["Aiea"] = "Aiea";
City2["Nairobi"] = "Nairobi";
return City2;
})(City || {});
var Cities = /* @__PURE__ */ ((Cities2) => {
Cities2["Amsterdam"] = "Amsterdam";
Cities2["London"] = "London";
Cities2["Nairobi"] = "Nairobi";
Cities2["MexicoCity"] = "Mexico City";
Cities2["Berlin"] = "Berlin";
return Cities2;
})(Cities || {});
var Countries = /* @__PURE__ */ ((Countries2) => {
Countries2["Zambia"] = "Zambia";
Countries2["Australia"] = "Australia";
return Countries2;
})(Countries || {});
var WorkArrangements = /* @__PURE__ */ ((WorkArrangements2) => {
WorkArrangements2["Remote"] = "Remote";
WorkArrangements2["Hybrid"] = "Hybrid";
WorkArrangements2["OnSite"] = "On/Site";
return WorkArrangements2;
})(WorkArrangements || {});
var JobRoles = /* @__PURE__ */ ((JobRoles2) => {
JobRoles2["NetDeveloper"] = ".NET Developer";
JobRoles2["AcademicEditor"] = "Academic Editor";
JobRoles2["FullStackDeveloper"] = "Full Stack Developer";
JobRoles2["AccountManager"] = "Account Manager";
JobRoles2["AcademicSupportOfficer"] = "Academic Support Officer";
JobRoles2["PythonDeveloper"] = "Python Developer";
JobRoles2["Developer"] = "Developer";
JobRoles2["EssentialSkillsTemplate"] = "Essential Skills Template";
JobRoles2["DataAnalyst"] = "Data Analyst";
return JobRoles2;
})(JobRoles || {});
var AcademicEditorTemplate = /* @__PURE__ */ ((AcademicEditorTemplate2) => {
AcademicEditorTemplate2["AcademicEditor"] = "Communication Culture English Working ";
return AcademicEditorTemplate2;
})(AcademicEditorTemplate || {});
// src/enums/company.ts
var CompanyName = /* @__PURE__ */ ((CompanyName2) => {
CompanyName2["Testgorilla"] = "TestGorilla";
return CompanyName2;
})(CompanyName || {});
var Currency = /* @__PURE__ */ ((Currency2) => {
Currency2["USD"] = "USD";
return Currency2;
})(Currency || {});
var Plans = /* @__PURE__ */ ((Plans2) => {
Plans2["PayAsYouGo"] = "Pay as you go";
Plans2["Scale"] = "Scale";
Plans2["Business"] = "Business";
Plans2["Free"] = "Free";
Plans2["Starter"] = "Starter";
Plans2["Pro"] = "Pro";
Plans2["Lite"] = "Lite";
Plans2["Core"] = "Core";
return Plans2;
})(Plans || {});
var TeamRoles = /* @__PURE__ */ ((TeamRoles2) => {
TeamRoles2["HiringManager"] = "Hiring Manager";
TeamRoles2["Admin"] = "Admin";
TeamRoles2["Recruiter"] = "Recruiter";
TeamRoles2["Owner"] = "Owner";
return TeamRoles2;
})(TeamRoles || {});
var PasswordStrengthTexts = /* @__PURE__ */ ((PasswordStrengthTexts2) => {
PasswordStrengthTexts2["LowerCharacter"] = "contains at least one lower character";
PasswordStrengthTexts2["UpperCharacter"] = "contains at least one upper character";
PasswordStrengthTexts2["DigitCharacter"] = "contains at least one digit";
PasswordStrengthTexts2["SpecialCharacter"] = "contains at least one special character";
PasswordStrengthTexts2["CountText"] = "contains at least 12 characters";
PasswordStrengthTexts2["LowerCaseNew"] = "Contains at least one lowercase";
PasswordStrengthTexts2["UpperCaseNew"] = "Contains at least one uppercase";
PasswordStrengthTexts2["DigitNew"] = "Contains at least one number";
PasswordStrengthTexts2["SpecialCharacterNew"] = "Contains at least one special character";
PasswordStrengthTexts2["CountTextNew"] = "Contains at least 12 characters";
return PasswordStrengthTexts2;
})(PasswordStrengthTexts || {});
// src/enums/languages.ts
var Language = /* @__PURE__ */ ((Language2) => {
Language2["English"] = "English";
Language2["French"] = "French";
Language2["Dutch"] = "Dutch";
Language2["German"] = "German";
Language2["Spanish"] = "Spanish";
Language2["Italian"] = "Italian";
Language2["Japanese"] = "Japanese";
Language2["PortugueseBrazil"] = "Portuguese (Brazil)";
Language2["Danish"] = "Danish";
Language2["Norwegian"] = "Norwegian";
Language2["Polish"] = "Polish";
Language2["Swedish"] = "Swedish";
return Language2;
})(Language || {});
var LanguageCode = {
["English" /* English */]: "en",
["French" /* French */]: "fr",
["Dutch" /* Dutch */]: "nl",
["German" /* German */]: "de",
["Spanish" /* Spanish */]: "es",
["Italian" /* Italian */]: "it",
["Japanese" /* Japanese */]: "ja",
["Portuguese (Brazil)" /* PortugueseBrazil */]: "pt-br",
["Danish" /* Danish */]: "da",
["Norwegian" /* Norwegian */]: "nb",
["Polish" /* Polish */]: "pl",
["Swedish" /* Swedish */]: "sv"
};
// src/enums/evaluationTools.ts
var EVALUATION_TOOLS = {
SkillsTests: {
displayName: "Skills tests",
label: "evaluation_tool_skill_test",
step4Name: "Tests"
},
CustomQuestions: {
displayName: "Custom questions",
label: "evaluation_tool_custom_questions",
step4Name: "Custom questions"
},
AIVideoInterview: {
displayName: "AI interview",
label: "evaluation_tool_two_ways_ai_interview",
step4Name: "AI interview"
},
AIResumeScoring: {
displayName: "Resume scoring",
label: "evaluation_tool_ai_resume",
step4Name: "Resume scoring"
},
OneWayInterview: {
displayName: "Video questions",
label: "evaluation_tool_one_way_ai_interview",
step4Name: "Video questions"
},
QualifyingQuestions: {
displayName: "Qualifying questions",
label: "evaluation_tool_knockout_questions",
step4Name: "Qualifying questions"
}
};
export {
TestName,
ProgrammingLanguages,
TestDuration,
CodingTaskOutput,
PersonalityAndCultureTestName,
TestKeyWord,
TestType,
TestFormat,
TestDurations,
TestsCount,
TestFilterNames,
CodingQuestions,
CreateCodingTestHeaders,
PracticeQuestions,
PageSize,
MyAssessmentTableHeader,
TalentAssessmentTableHeader,
Sort,
MenuItem,
SideNavItem,
Colour,
Benchmark,
HiringStage,
CheatingMonitorList,
DownloadFormat,
URLs,
CreatingAssessmentsSteps,
TestGorillaTheme,
AssessmentStatus,
AssessmentResultStatus,
Pronoun,
JobSearchStatus,
Proficiency,
CandidateStatusFilters,
CandidateMeta,
BehaviourLogFlags,
TalentFilters,
KitchenAssistantTalentDetails,
DogTrainerTalentDetails,
SourcingInvitationMessage,
IntegrationsImageSrc,
Integrations,
OneWayInterviewQuestionName,
CustomQuestionName,
CustomQuestionDescription,
Duration,
CustomQuestionsFilters,
CustomQuestions,
CustomQuestionsContent,
City,
Cities,
Countries,
WorkArrangements,
JobRoles,
AcademicEditorTemplate,
CompanyName,
Currency,
Plans,
TeamRoles,
PasswordStrengthTexts,
Language,
LanguageCode,
EVALUATION_TOOLS
};
//# sourceMappingURL=chunk-U7YT53U2.mjs.map
{"version":3,"sources":["../src/enums/tests.ts","../src/enums/ui.ts","../src/enums/candidates.ts","../src/enums/integrations.ts","../src/enums/customQuestions.ts","../src/enums/locations.ts","../src/enums/company.ts","../src/enums/languages.ts","../src/enums/evaluationTools.ts"],"sourcesContent":["import { baseURL, isLocalEnvironment } from '../config';\n\nexport enum TestName {\n CultureAdd = 'Culture add',\n Communication = 'Communication',\n Motivation = 'Motivation',\n Disc = 'DISC',\n CustomQuestion = 'Custom questions',\n PHPCoding_stage = 'PHP (coding): object-oriented programming',\n PHPCoding_prod = 'PHP (Coding): Object-Oriented Programming',\n PythonCodingDebugging = 'Coding: Debugging',\n PythonCodingDebugging_prod = 'Python (Coding): Debugging',\n PythonCodingEntryLevel = 'Python (coding): entry-level algorithms',\n AttentionToDetail = 'Attention to Detail (Textual)',\n EnglishProficiency = 'English C1 (Advanced)',\n EnglishIntermediate = 'English (intermediate/B1)',\n RubyOnRails = 'Ruby on Rails',\n JavaScriptCodingEntryLevel = 'JavaScript (Coding): Entry-Level Algorithms',\n TypeScriptCodingEntryLevel = 'TypeScript (coding): entry-level algorithms',\n PhpEntryLevel = 'PHP (coding): intermediate-level algorithms',\n SqliteIntermediate = 'SQLite (coding): intermediate-level querying',\n SQLiteEntryLevel = 'SQLite (coding): entry-level database operations',\n JavaEntryLevel = 'Java (coding): entry-level algorithms',\n CCodingEntryLevel = 'C (coding): entry-level algorithms',\n CPPCodingEntryLevel = 'C++ (coding): entry-level algorithms',\n CHashCodingEntryLevel = 'C# (coding): entry-level algorithms',\n RubyEntryLevel = 'Ruby (coding): entry-level algorithms',\n Ennéagramme = 'Ennéagramme',\n AttentionToDetailVisual = 'Attention to detail (visual)',\n WorkingWithData = 'Working with data',\n ReadingComprehension = 'Reading comprehension',\n TypingSpeedLowerCase = 'Typing Speed (Lowercase Only)',\n TypingSpeedCapitalization = 'Typing Speed (Capitalization and Punctuation)',\n TypingSpeedNumbersOnly = 'Typing Speed (Numbers Only)',\n VerbalReasoning = 'Verbal Reasoning',\n ProblemSolving = 'Problem Solving',\n ProblemSolvingStaging = 'Problem solving',\n Big5 = 'Big 5 (OCEAN)',\n TimeManagement = 'Time Management',\n TimeManagementStaging = 'Time management',\n RubyDebugging = 'Ruby (coding): debugging',\n CodingEntryLevel = 'Coding: Entry-level algorithms',\n Tableau = 'Tableau',\n FollowingInstructions = 'Following instructions',\n UnderstandingInstructions = 'Understanding instructions',\n GoogleSpreadsheetSimulation = 'Google Sheets Spreadsheet Simulation',\n CloudSystemAdministration = 'Cloud System Administration',\n AndroidKotlin = 'Android Development Using Kotlin',\n ActiveListening = 'Active Listening',\n MySQL = 'MySQL',\n SpreadsheetSimulation = 'Spreadsheet Simulation: Google Sheets (Intermediate)',\n UniversalSkillsProfiler = 'Universal Skills Profiler',\n Enneagram = 'Enneagram',\n HTML5 = 'HTML5',\n CriticalThinking = 'Critical thinking',\n HubspotCRM = 'Hubspot CRM',\n Shopify = 'Shopify',\n Laravel = 'Laravel',\n Flutter = 'Flutter',\n IntermediateMath = 'Intermediate Math',\n Zendesk = 'Zendesk CS',\n PurchaseManager = 'Purchase Manager',\n SQLQuerying = 'SQLite (Coding): Intermediate-Level Querying',\n ImmersiveTest = 'Customer Service (Immersive Role-Play)',\n AIResume = 'AI Resume Scoring',\n SoftwareArchitect = 'Software architect',\n AWS = 'AWS',\n}\n\nexport enum ProgrammingLanguages {\n Python = 'Python',\n JavaScript = 'JavaScript',\n TypeScript = 'TypeScript',\n Php = 'PHP',\n Sqlite = 'SQLite',\n Java = 'Java',\n C = 'C',\n CPP = 'C++',\n CHash = 'C#',\n Ruby = 'Ruby',\n}\n\nexport const TestDuration = getTestDuration();\n\nfunction getTestDuration() {\n if (baseURL.includes('app')) {\n return {\n CultureAdd: '10',\n AttentionToDetail: '12',\n AttentionToDetailVisual: '10',\n EnglishProficiency: '10',\n CustomTest: '10',\n PythonCoding: '14',\n };\n } else if (isLocalEnvironment) {\n return {\n CultureAdd: '10',\n AttentionToDetail: '12',\n AttentionToDetailVisual: '10',\n EnglishProficiency: '10',\n CustomTest: '10',\n PythonCoding: '8',\n };\n } else {\n return {\n CultureAdd: '10',\n AttentionToDetail: '10',\n AttentionToDetailVisual: '10',\n EnglishProficiency: '10',\n CustomTest: '10',\n PythonCoding: '14',\n };\n }\n}\n\nexport enum CodingTaskOutput {\n TaskSuccess = 'Code executed successfully',\n TaskFailure = 'Task finished with errors.Traceback (most recent call last):',\n TaskMessage = 'Task',\n EmptyScriptTaskMessage = 'Run tests to check your code',\n}\n\nexport enum PersonalityAndCultureTestName {\n CultureAddSurvey = 'Culture add survey',\n MotivationTestSurvey = 'Motivation test survey',\n}\n\nexport enum TestKeyWord {\n Motivation = 'Motivation',\n}\n\nexport enum TestType {\n PersonalityAndCulture = 'Personality & culture',\n ProgrammingSkills = 'Programming skills',\n}\n\nexport enum TestFormat {\n MultipleChoice = 'Multiple-choice',\n Coding = 'Coding',\n Typing = 'Typing',\n Questionnaire = 'Questionnaire',\n Simulation = 'Simulation',\n}\n\nexport enum TestDurations {\n ZeroToTenMinutes = 'Up to 10 mins',\n ElevenToTwentyMinutes = '11 to 20 mins',\n TwentyoneToThirtyMinutes = '21 to 30 mins',\n ThirtyoneTosixtyMinutes = '31 to 60 mins',\n}\n\nexport enum TestsCount {\n ZeroTests = '0 added',\n OneTests = '1 test',\n TwoTests = '2 added',\n ThreeTests = '3 test',\n FourTests = '4 test',\n FiveTests = '5 added',\n}\n\nexport enum TestFilterNames {\n Library = 'Show tests from',\n RoleSpecific = 'Skills for',\n Focus = 'Focus',\n Duration = 'Duration',\n Format = 'Format',\n Highlights = 'Highlights',\n}\n\nexport enum CodingQuestions {\n Python = 'Python',\n}\n\nexport enum CreateCodingTestHeaders {\n FunctionSignature = 'Function signature',\n InitialCode = 'Initial code',\n TestCases = 'Test cases',\n VerificationCode = 'Verification code',\n}\n\nexport enum PracticeQuestions {\n AttentionToDetail = 'info This is the first practice question. You are in charge of sending invitations for a class reunion next month. You compare the address on file for one participant with the address available in the yearbook, which are as shown below',\n CodingQuestion = 'The purpose of this question is to show you how coding tests work. You are not being scored for anything in this question.',\n EnglishProficiency = 'Read the text and choose the synonym of the underlined word.',\n RubyOnRails = 'Which of the available queries returns the authors who have written at least one book?',\n}\n","export enum PageSize {\n Ten = 10,\n TwentyFive = 25,\n Fifty = 50,\n}\n\nexport enum MyAssessmentTableHeader {\n DateCreated = 'Job Created',\n LastActivity = 'Last activity',\n}\n\nexport enum TalentAssessmentTableHeader {\n CompanyName = 'COMPANY NAME',\n InvitedOn = 'INVITED ON',\n LastActivity = 'LAST ACTIVITY',\n}\n\nexport enum Sort {\n Ascending = 'ascending',\n Decending = 'descending',\n}\n\nexport enum MenuItem {\n TeamManagement = 'Team Management',\n Integrations = 'Integrations',\n MyCompany = 'My company',\n Logout = 'Log out',\n PlanAndBilling = 'Plan & billing',\n MyProfile = 'My profile',\n // Restricted roles (e.g. Hiring Manager) label the account-menu entry \"Profile\";\n // the substring also matches the full-access \"My profile\" label.\n AccountProfile = 'Profile',\n LogOut = 'Log out',\n Notifications = 'Notifications',\n AssessmentSettings = 'Settings',\n}\n\nexport enum SideNavItem {\n Home = 'Home',\n Jobs = 'Jobs',\n Sourcing = 'Sourcing',\n Candidates = 'Candidates',\n Analytics = 'Analytics',\n TestLibrary = 'Test library',\n WhatsNew = \"What's new\",\n HelpCenter = 'Help center',\n}\n\nexport enum Colour {\n Black = '#000000',\n}\n\nexport enum Benchmark {\n PercentageCorrect = 'Percentage of correct answers',\n AllCandidates = 'All candidates',\n Percentile = 'Percentile',\n}\n\nexport enum HiringStage {\n Interviewed = 'Interviewed',\n Hired = ' Hired 🎉',\n}\n\nexport enum CheatingMonitorList {\n DeviceUsed = 'Device used\\nDesktop',\n WebcamEnabled = 'Webcam enabled?\\nYes',\n FullScreenMode = 'Full-screen mode always active?\\nYes',\n MousePosition = 'Mouse always in assessment window?\\nYes',\n}\n\nexport enum DownloadFormat {\n Csv = 'CSV',\n Excel = 'Excel',\n Pdf = 'PDF',\n}\n\nexport enum URLs {\n TestGorillaPublicUrl = 'https://www.testgorilla.com/',\n TestGorillaPublicPage = 'TestGorilla',\n TestGorillaHelpPage = 'Help center',\n TestGorillaFacebook = 'Facebook',\n TestGorillaInstagram = 'Instagram',\n TestGorillaLinkedin = 'LinkedIn',\n Support = 'support.testgorilla.com',\n CandidateSupport = 'candidates.testgorilla.com',\n CandidateHub = 'talent-staging.testgorilla.com/create-account',\n TasOldFlow = 'https://assessment.testgorilla.com/testtaker/takeinvitation/',\n TasNewFlow = 'https://talent-assessment.testgorilla.com/',\n privacyPolicyLink = 'https://www.testgorilla.com/terms/privacy-policy',\n CandidateTerms = 'https://www.testgorilla.com/candidate-terms',\n}\n\nexport enum CreatingAssessmentsSteps {\n Step1 = 'Job details',\n Step2 = 'Assessment',\n Step3 = 'Configuration',\n Step4 = 'Finalize',\n}\n\nexport enum TestGorillaTheme {\n BgColor = '#d410aa',\n}\n","export enum AssessmentStatus {\n Completed = 'Completed',\n Invited = 'Invited',\n Closed = 'Closed',\n}\n\nexport enum AssessmentResultStatus {\n Unavailable = 'Unavailable',\n}\n\nexport enum Pronoun {\n HeHim = 'He/Him',\n}\n\nexport enum JobSearchStatus {\n ActivelySearching = 'Actively searching',\n OpenToNewChallenges = 'Open to new challenges',\n NotLookingRightNow = 'Not looking right now',\n}\n\nexport enum Proficiency {\n None = 'None',\n}\n\nexport enum CandidateStatusFilters {\n Started = 'Started',\n Invited = 'Invitation delivered',\n Completed = 'Completed',\n}\n\nexport enum CandidateMeta {\n TestInfoTimerText = 'Please stay on this screen. The timer for your next test has started and cannot be paused. The timer continues if you close the browser.',\n TestInfoTimer30MText = 'Please stay on this screen. The timer for your next test has started and cannot be paused. The timer continues if you close the browser.',\n TestInfoTimerPlainText = 'Please stay on this screen. The timer for your next test has started and cannot be paused. You must complete this test in the next ',\n TestInfoTimerTextTasFlow = 'Please stay on this screen. The timer for your next test has started and cannot be paused. The timer continues even when you close the browser.',\n}\n\nexport enum BehaviourLogFlags {\n DeviceUsed = 'Device used',\n FilledOutOnceFromIP = 'Filled out only once from IP address?',\n WebcamAlwaysEnabled = 'Webcam always enabled?',\n FullScreenExit = 'Full-screen mode exit',\n TabSwitch = 'Tab switch',\n DevToolsOpened = 'Developer tools opened',\n}\n\nexport enum TalentFilters {\n JobRole = 'Kitchen Assistant',\n LocationName = 'Lusaka, Zambia',\n YearsOfExperience = '10',\n MinSalary = '125000',\n MaxSalary = '395000',\n MinSalaryDefault = '0',\n MaxSalaryDefault = '500000',\n SalaryType = 'Annually',\n}\n\nexport enum KitchenAssistantTalentDetails {\n JobRole = 'Kitchen Assistant',\n LocationName = 'Lusaka, Zambia',\n Salary = '$30,000/yr',\n YearsOfExperience = '15 years exp.',\n JobTitle = 'Kitchen Assistant at Kitchen Company',\n}\n\nexport enum DogTrainerTalentDetails {\n JobRole = 'Dog Trainer',\n LocationName = 'Sydney, Australia',\n Salary = '$60,000/yr',\n YearsOfExperience = '30 years exp.',\n JobTitle = 'Dog trainer at Dog trainer organization',\n WorkExperienceTitle = 'Dog trainer',\n WorkExperienceDescription = 'Training dogs',\n VerifiedSkill_1 = 'HTML5',\n}\n\nexport enum SourcingInvitationMessage {\n Custom = 'Hello, \\n\\n we would like to invite you. Please find the details below. \\n Details',\n}\n","export enum IntegrationsImageSrc {\n Breezy = 'assets/integrations/brz.png',\n GreenHouse = 'assets/integrations/ghs.png',\n JazzHR = 'assets/integrations/jhr.png',\n Personio = 'assets/integrations/psn.png',\n Recruitee = 'assets/integrations/rct.png',\n}\n\nexport enum Integrations {\n Breezy = 'Breezy',\n GreenHouse = 'Greenhouse',\n JazzHR = 'JazzHR',\n Recruitee = 'Recruitee',\n}\n","export enum OneWayInterviewQuestionName {\n SellingAPen = 'Selling a pen',\n PrioritizingTasks = 'Prioritizing tasks',\n TacklingChallenges = 'Tackling challenges',\n ExceedingExpectations = 'Exceeding expectations',\n}\n\nexport enum CustomQuestionName {\n Video = 'Video',\n Essay = 'Essay',\n MultipleChoice = 'Multiple-choice',\n FileUpload = 'File upload',\n Code = 'Code',\n AllQuestionCategories = 'Select all question categories',\n PriorExperience = 'Prior experience',\n Motivation = 'Motivation',\n SoftSkills = 'Soft skills',\n JobSkills = 'Job skills',\n Finance = 'Finance',\n CustomerService = 'Customer service',\n Sales = 'Sales',\n Marketing = 'Marketing',\n IT = 'IT',\n AdministrativeSupport = 'Administrative support',\n Management = 'Management',\n SellingAPen = 'Selling a pen',\n TacklingChallenges = 'Tackling challenges',\n HandlingUnreasonableRequests = 'Handling unreasonable requests',\n}\n\nexport enum CustomQuestionDescription {\n SellingAPen = 'Sell me the first pen within reach.',\n TacklingChallenges = 'Describe an especially difficult assignment or project you have worked on. What was your role? How did you approach the requirements, and what was the outcome?',\n HandlingUnreasonableRequests = 'Describe a time when you had to handle an unfair or unreasonable complaint or a request from a customer. What did the customer ask, and how did you handle it?',\n}\n\nexport enum Duration {\n ThirtySeconds = '30 secs',\n FiveMinutes = '5 mins',\n TwoMinutes = '2 mins',\n TenMinutes = '10 mins',\n ZeroMinutes = '0 mins',\n SixMinutes = '6 mins',\n FifteenMinutes = '15 mins',\n FiftyFiveMinues = '55 mins',\n FiftyMinues = '50 mins',\n FortyMinutes = '40 mins',\n FortyTwoMinutes = '42 mins',\n FortyFourMinutes = '44 mins',\n FiftyNineMinutes = '59 mins',\n FiftyFourMinutes = '54 mins',\n FiftyEightMinutes = '58 mins',\n SixtyNineMinutes = '69 mins',\n SeventyThreeMinutes = '73 mins',\n}\n\nexport enum CustomQuestionsFilters {\n Assessment = 'Assessment name',\n Library = 'Library',\n Format = 'Format',\n Topic = 'Topic',\n RoleSpecific = 'Role specific',\n}\n\nexport enum CustomQuestions {\n TestGorillaLibrary = 'TestGorilla library',\n MyLibrary = 'My library',\n AddingValue = 'Adding value',\n AddingValueDescription = 'How do you plan to add value to this organization?',\n HowAreYou = 'How are you?',\n WhereAreYouFrom = 'Where are you from?',\n UploadYourResume = 'Upload your resume',\n ValidateRegex = 'Validate Regex',\n CreateIntroVideo = 'Create intro video of yourself',\n IntroducingYourself = 'Introducing yourself',\n TacklingChallenges = 'Tackling challenges',\n TacklingChallengesDescription = 'Describe an especially difficult assignment or project you have worked on. What was your role? How did you approach the requirements, and what was the outcome?',\n}\n\nexport enum CustomQuestionsContent {\n IntroducingYourself = \"Introduce yourself in 60 seconds and explain why you're a great\",\n AddingValue = 'How do you plan to add value to this organization?',\n FailingToDeliver = \"Tell me about a time when you didn't deliver on your key objectives. What did you learn?\",\n FindingAGreaterPurpose = 'How would working in this role help you fulfill a greater personal purpose?',\n WorkingCrossFunctionally = 'How do you transcend your role as a finance professional and interact cross-functionally with people in other departments?',\n}\n","export enum City {\n Ardamata = 'Ardamata',\n Aiea = 'Aiea',\n Nairobi = 'Nairobi',\n}\n\nexport enum Cities {\n Amsterdam = 'Amsterdam',\n London = 'London',\n Nairobi = 'Nairobi',\n MexicoCity = 'Mexico City',\n Berlin = 'Berlin',\n}\n\nexport enum Countries {\n Zambia = 'Zambia',\n Australia = 'Australia',\n}\n\nexport enum WorkArrangements {\n Remote = 'Remote',\n Hybrid = 'Hybrid',\n OnSite = 'On/Site',\n}\n\nexport enum JobRoles {\n NetDeveloper = '.NET Developer',\n AcademicEditor = 'Academic Editor',\n FullStackDeveloper = 'Full Stack Developer',\n AccountManager = 'Account Manager',\n AcademicSupportOfficer = 'Academic Support Officer',\n PythonDeveloper = 'Python Developer',\n Developer = 'Developer',\n EssentialSkillsTemplate = 'Essential Skills Template',\n DataAnalyst = 'Data Analyst',\n}\n\nexport enum AcademicEditorTemplate {\n AcademicEditor = 'Communication Culture English Working ',\n}\n","export enum CompanyName {\n Testgorilla = 'TestGorilla',\n}\n\nexport enum Currency {\n USD = 'USD',\n}\n\nexport enum Plans {\n PayAsYouGo = 'Pay as you go',\n Scale = 'Scale',\n Business = 'Business',\n Free = 'Free',\n Starter = 'Starter',\n Pro = 'Pro',\n Lite = 'Lite',\n Core = 'Core',\n}\n\nexport enum TeamRoles {\n HiringManager = 'Hiring Manager',\n Admin = 'Admin',\n Recruiter = 'Recruiter',\n Owner = 'Owner',\n}\n\nexport enum PasswordStrengthTexts {\n LowerCharacter = 'contains at least one lower character',\n UpperCharacter = 'contains at least one upper character',\n DigitCharacter = 'contains at least one digit',\n SpecialCharacter = 'contains at least one special character',\n CountText = 'contains at least 12 characters',\n LowerCaseNew = 'Contains at least one lowercase',\n UpperCaseNew = 'Contains at least one uppercase',\n DigitNew = 'Contains at least one number',\n SpecialCharacterNew = 'Contains at least one special character',\n CountTextNew = 'Contains at least 12 characters',\n}\n","export enum Language {\n English = 'English',\n French = 'French',\n Dutch = 'Dutch',\n German = 'German',\n Spanish = 'Spanish',\n Italian = 'Italian',\n Japanese = 'Japanese',\n PortugueseBrazil = 'Portuguese (Brazil)',\n Danish = 'Danish',\n Norwegian = 'Norwegian',\n Polish = 'Polish',\n Swedish = 'Swedish',\n}\n\nexport const LanguageCode: Record<Language, string> = {\n [Language.English]: 'en',\n [Language.French]: 'fr',\n [Language.Dutch]: 'nl',\n [Language.German]: 'de',\n [Language.Spanish]: 'es',\n [Language.Italian]: 'it',\n [Language.Japanese]: 'ja',\n [Language.PortugueseBrazil]: 'pt-br',\n [Language.Danish]: 'da',\n [Language.Norwegian]: 'nb',\n [Language.Polish]: 'pl',\n [Language.Swedish]: 'sv',\n};\n","/**\n * Single source of truth for evaluation tools\n * Contains display names, labels, and step-specific names\n */\nexport const EVALUATION_TOOLS = {\n SkillsTests: {\n displayName: 'Skills tests',\n label: 'evaluation_tool_skill_test',\n step4Name: 'Tests',\n },\n CustomQuestions: {\n displayName: 'Custom questions',\n label: 'evaluation_tool_custom_questions',\n step4Name: 'Custom questions',\n },\n AIVideoInterview: {\n displayName: 'AI interview',\n label: 'evaluation_tool_two_ways_ai_interview',\n step4Name: 'AI interview',\n },\n AIResumeScoring: {\n displayName: 'Resume scoring',\n label: 'evaluation_tool_ai_resume',\n step4Name: 'Resume scoring',\n },\n OneWayInterview: {\n displayName: 'Video questions',\n label: 'evaluation_tool_one_way_ai_interview',\n step4Name: 'Video questions',\n },\n QualifyingQuestions: {\n displayName: 'Qualifying questions',\n label: 'evaluation_tool_knockout_questions',\n step4Name: 'Qualifying questions',\n },\n} as const;\n\n// Type-safe accessors for the unified definition\nexport type EvaluationToolKey = keyof typeof EVALUATION_TOOLS;\n\n// Helper type to get display name values\nexport type EvaluationToolDisplayName = (typeof EVALUATION_TOOLS)[EvaluationToolKey]['displayName'];\n\n// Helper type to get label values\nexport type EvaluationToolLabel = (typeof EVALUATION_TOOLS)[EvaluationToolKey]['label'];\n\n// Helper type to get step4 name values\nexport type EvaluationToolStep4Name = (typeof EVALUATION_TOOLS)[EvaluationToolKey]['step4Name'];\n"],"mappings":"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","names":["TestName","ProgrammingLanguages","CodingTaskOutput","PersonalityAndCultureTestName","TestKeyWord","TestType","TestFormat","TestDurations","TestsCount","TestFilterNames","CodingQuestions","CreateCodingTestHeaders","PracticeQuestions","PageSize","MyAssessmentTableHeader","TalentAssessmentTableHeader","Sort","MenuItem","SideNavItem","Colour","Benchmark","HiringStage","CheatingMonitorList","DownloadFormat","URLs","CreatingAssessmentsSteps","TestGorillaTheme","AssessmentStatus","AssessmentResultStatus","Pronoun","JobSearchStatus","Proficiency","CandidateStatusFilters","CandidateMeta","BehaviourLogFlags","TalentFilters","KitchenAssistantTalentDetails","DogTrainerTalentDetails","SourcingInvitationMessage","IntegrationsImageSrc","Integrations","OneWayInterviewQuestionName","CustomQuestionName","CustomQuestionDescription","Duration","CustomQuestionsFilters","CustomQuestions","CustomQuestionsContent","City","Cities","Countries","WorkArrangements","JobRoles","AcademicEditorTemplate","CompanyName","Currency","Plans","TeamRoles","PasswordStrengthTexts","Language"]}

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

/**
* Structured configuration for a TestGorilla e2e run.
*
* Produced by {@link resolveTgEnvironment} from environment variables and
* consumed both as the `e2eConfig` Playwright option fixture and (via the
* compatibility surface in `./index.ts`) as the module-level named exports
* that page objects and API clients import today.
*/
interface E2eAccounts {
/** Main organizer account the run logs in with (today: `email`). */
organizerEmail: string;
/**
* Organizer password. Sourced from `E2E_PASSWORD` (or legacy `e2e_password`).
* The framework ships NO default — reading this without the env var set
* throws with setup guidance.
*/
password: string;
/** Shared candidate inbox account. */
candidateEmail: string;
/**
* IMAP app password for the candidate inbox. Sourced from
* `E2E_CANDIDATE_PASSWORD`. No default ships with the framework.
*/
candidatePassword: string;
hiringManagerEmail: string;
recruiterEmail: string;
adminEmail: string;
newAdminEmail: string;
freeUserEmail: string;
corePlanUserEmail: string;
plusPlanUserEmail: string;
proPlanUserEmail: string;
businessPlanUserEmail: string;
starterPlanUserEmail: string;
myProfileUserEmail: string;
atsIntegrationsEmail: string;
}
/** Per-environment service URLs derived from the run's `baseURL`. */
interface E2eUrls {
talentBase: string;
talentAssessment: string;
talentApi: string;
codeRunnerApi: string;
websiteBase: string;
mailpit: string;
/** Only provisioned on ephemeral dev deployments; `null` elsewhere. */
localstack: string | null;
}
interface E2eConfig {
/** Customer-app base URL (the `baseURL` env var; staging by default). */
baseURL: string;
/** Short environment name derived from the base URL (e.g. `staging`, `app`). */
environment: string;
isEphemeralEnvironment: boolean;
/** `backend` | `talent-api` deployment prefix on ephemeral envs, else null. */
ephemeralPrefix: 'backend' | 'talent-api' | null;
ephemeralId: string | null;
isLocalEnvironment: boolean;
adminURL: string;
urls: E2eUrls;
emails: {
signupFrom: string;
assessmentsFrom: string;
};
accounts: E2eAccounts;
}
export type { E2eConfig as E, E2eAccounts as a, E2eUrls as b };
/**
* Structured configuration for a TestGorilla e2e run.
*
* Produced by {@link resolveTgEnvironment} from environment variables and
* consumed both as the `e2eConfig` Playwright option fixture and (via the
* compatibility surface in `./index.ts`) as the module-level named exports
* that page objects and API clients import today.
*/
interface E2eAccounts {
/** Main organizer account the run logs in with (today: `email`). */
organizerEmail: string;
/**
* Organizer password. Sourced from `E2E_PASSWORD` (or legacy `e2e_password`).
* The framework ships NO default — reading this without the env var set
* throws with setup guidance.
*/
password: string;
/** Shared candidate inbox account. */
candidateEmail: string;
/**
* IMAP app password for the candidate inbox. Sourced from
* `E2E_CANDIDATE_PASSWORD`. No default ships with the framework.
*/
candidatePassword: string;
hiringManagerEmail: string;
recruiterEmail: string;
adminEmail: string;
newAdminEmail: string;
freeUserEmail: string;
corePlanUserEmail: string;
plusPlanUserEmail: string;
proPlanUserEmail: string;
businessPlanUserEmail: string;
starterPlanUserEmail: string;
myProfileUserEmail: string;
atsIntegrationsEmail: string;
}
/** Per-environment service URLs derived from the run's `baseURL`. */
interface E2eUrls {
talentBase: string;
talentAssessment: string;
talentApi: string;
codeRunnerApi: string;
websiteBase: string;
mailpit: string;
/** Only provisioned on ephemeral dev deployments; `null` elsewhere. */
localstack: string | null;
}
interface E2eConfig {
/** Customer-app base URL (the `baseURL` env var; staging by default). */
baseURL: string;
/** Short environment name derived from the base URL (e.g. `staging`, `app`). */
environment: string;
isEphemeralEnvironment: boolean;
/** `backend` | `talent-api` deployment prefix on ephemeral envs, else null. */
ephemeralPrefix: 'backend' | 'talent-api' | null;
ephemeralId: string | null;
isLocalEnvironment: boolean;
adminURL: string;
urls: E2eUrls;
emails: {
signupFrom: string;
assessmentsFrom: string;
};
accounts: E2eAccounts;
}
export type { E2eConfig as E, E2eAccounts as a, E2eUrls as b };

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display