chore: remove Cypress (#55056)

This commit is contained in:
Sem Bauke
2024-06-14 19:09:40 +02:00
committed by GitHub
parent 1a51bb072a
commit eb84dce6ca
51 changed files with 67 additions and 1042 deletions

View File

@@ -7,29 +7,28 @@ ARG MONGODB_VERSION=6.0.4
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y sudo && \
sudo apt-get install -y ca-certificates curl gnupg && \
sudo mkdir -p /etc/apt/keyrings && \
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list && \
sudo apt-get update && \
sudo apt-get install nodejs -y && \
sudo apt-get install -y libcurl4 openssl liblzma5 && \
mkdir -p /tmp/mongodb && \
cd /tmp/mongodb && \
wget -qOmongodb.tgz https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-${MONGODB_VERSION}.tgz && \
tar -zxvf mongodb.tgz && \
cd mongodb-* && \
sudo cp bin/* /usr/local/bin/ && \
rm -rf /tmp/mongodb && \
sudo mkdir -p /data/db && \
sudo chown vscode:vscode -R /data/db
sudo apt-get install -y ca-certificates curl gnupg && \
sudo mkdir -p /etc/apt/keyrings && \
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list && \
sudo apt-get update && \
sudo apt-get install nodejs -y && \
sudo apt-get install -y libcurl4 openssl liblzma5 && \
mkdir -p /tmp/mongodb && \
cd /tmp/mongodb && \
wget -qOmongodb.tgz https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-${MONGODB_VERSION}.tgz && \
tar -zxvf mongodb.tgz && \
cd mongodb-* && \
sudo cp bin/* /usr/local/bin/ && \
rm -rf /tmp/mongodb && \
sudo mkdir -p /data/db && \
sudo chown vscode:vscode -R /data/db
# Setup ENV
ENV COOKIE_DOMAIN=github.dev
ENV HOME_LOCATION=https://$CODESPACE_NAME-8000.$GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN
ENV API_LOCATION=https://$CODESPACE_NAME-3000.$GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN
ENV CYPRESS_BASE_URL=https://$CODESPACE_NAME-8000.$GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN
ENV REACT_APP_CHALLENGE_EDITOR_API_LOCATION=https://$CODESPACE_NAME-3200.$GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN
ENV CHALLENGE_EDITOR_CLIENT_LOCATION=https://$CODESPACE_NAME-3300.$GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN

View File

@@ -70,7 +70,6 @@
"./api/tsconfig.json",
"./shared/tsconfig.json",
"./tools/client-plugins/browser-scripts/tsconfig.json",
"./cypress/tsconfig.json",
"./e2e/tsconfig.json"
]
},
@@ -94,13 +93,6 @@
],
"rules": { "import/named": 2 }
},
{
"files": ["cypress/**/*.js"],
"globals": {
"cy": true,
"Cypress": true
}
},
{
"files": ["e2e/*.ts"],
"rules": {

1
.github/labeler.yml vendored
View File

@@ -12,7 +12,6 @@
- api/**/*
'scope: tools/scripts':
- cypress/**/*
- tools/**/*
- .github/**/*
- utils/**/*

View File

@@ -1,157 +0,0 @@
name: CI - E2E - Web browser
on:
workflow_dispatch:
workflow_run:
workflows: ['CI - Node.js']
types:
- completed
# TODO: refactor with a workflow_call
pull_request:
paths-ignore:
- 'docs/**'
branches:
- 'main'
- 'next-**'
- 'e2e-**'
jobs:
build-client:
name: Build Client
runs-on: ubuntu-22.04
strategy:
matrix:
node-version: [20.x]
steps:
- name: Checkout Source Files
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Checkout client-config
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
repository: freeCodeCamp/client-config
path: client-config
- name: Setup pnpm
uses: pnpm/action-setup@a3252b78c470c02df07e9d59298aecedc3ccdd6d #v3.0.0
with:
version: 9
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
with:
node-version: ${{ matrix.node-version }}
cache: pnpm
- name: Set freeCodeCamp Environment Variables
run: cp sample.env .env
- name: Install and Build
run: |
pnpm install
pnpm run build
- name: Move serve.json to Public Folder
run: cp client-config/serve.json client/public/serve.json
# We tar them for performance reasons - uploading a lot of files is slow.
- name: Tar Files
run: tar -cf client-artifact.tar client/public
- name: Upload Client Artifact
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
with:
name: client-artifact
path: client-artifact.tar
- name: Upload Webpack Stats
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
with:
name: webpack-stats
path: client/public/stats.json
cypress-run:
name: Test
runs-on: ubuntu-22.04
needs: build-client
strategy:
fail-fast: false
matrix:
browsers: [chrome, firefox]
node-version: [20.x]
services:
mongodb:
image: mongo:4.4
ports:
- 27017:27017
# We need mailhog to catch any emails the api tries to send.
mailhog:
image: mailhog/mailhog
ports:
- 1025:1025
steps:
- name: Set Action Environment Variables
run: |
echo "CYPRESS_RECORD_KEY=${{ secrets.CYPRESS_RECORD_KEY }}" >> $GITHUB_ENV
echo "GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> $GITHUB_ENV
- name: Checkout Source Files
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4
with:
name: client-artifact
- name: Unpack Client Artifact
run: |
tar -xf client-artifact.tar
rm client-artifact.tar
- name: Downgrade Firefox
run: |
curl https://ftp.mozilla.org/pub/firefox/releases/123.0/linux-x86_64/en-US/firefox-123.0.tar.bz2 --output firefox-123.0.tar.bz2
tar -xjf firefox-123.0.tar.bz2
sudo mv firefox /opt/
sudo mv /usr/bin/firefox /usr/bin/firefox_old
sudo ln -s /opt/firefox/firefox /usr/bin/firefox
- name: Setup pnpm
uses: pnpm/action-setup@a3252b78c470c02df07e9d59298aecedc3ccdd6d #v3.0.0
with:
version: 9
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
with:
node-version: ${{ matrix.node-version }}
# cypress-io/github-action caches the store, so we should not cache it
# here.
- name: Set freeCodeCamp Environment Variables
run: cp sample.env .env
- name: Install and Build
run: |
pnpm install
pnpm run create:shared
pnpm run build:curriculum
pnpm run build:server
- name: Seed Database
run: pnpm run seed
# start-ci uses pm2, so it needs to be installed globally
- name: Install pm2
run: npm i -g pm2
- name: Cypress run
uses: cypress-io/github-action@v6
with:
record: ${{ env.CYPRESS_RECORD_KEY != 0 }}
start: pnpm run start-ci
wait-on: http://localhost:8000
wait-on-timeout: 1200
config: baseUrl=http://localhost:8000
browser: ${{ matrix.browsers }}
spec: ${{ matrix.spec }}

4
.gitignore vendored
View File

@@ -111,10 +111,6 @@ coverage
# nyc test coverage
.nyc_output
# Cypress.io
cypress/videos
cypress/screenshots
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt

View File

@@ -26,7 +26,6 @@ tasks:
export COOKIE_DOMAIN=gitpod.io
export HOME_LOCATION=$(gp url 8000)
export API_LOCATION=$(gp url 3000)
export CYPRESS_BASE_URL=$(gp url 8000)
export CHALLENGE_EDITOR_API_LOCATION=$(gp url 3200)
export CHALLENGE_EDITOR_CLIENT_LOCATION=$(gp url 3300)
' >> ~/.bashrc;
@@ -39,7 +38,7 @@ tasks:
(mongod --dbpath /workspace/data &)
- name: server
before: export COOKIE_DOMAIN=gitpod.io && export HOME_LOCATION=$(gp url 8000) && export API_LOCATION=$(gp url 3000) && export CYPRESS_BASE_URL=$(gp url 8000)
before: export COOKIE_DOMAIN=gitpod.io && export HOME_LOCATION=$(gp url 8000) && export API_LOCATION=$(gp url 3000)
# init is not executed for prebuilt workspaces and restarts,
# so we should put all the heavy initialization here
init: >
@@ -55,7 +54,7 @@ tasks:
pnpm run develop:server
- name: client
before: export HOME_LOCATION=$(gp url 8000) && export API_LOCATION=$(gp url 3000) && export CYPRESS_BASE_URL=$(gp url 8000)
before: export HOME_LOCATION=$(gp url 8000) && export API_LOCATION=$(gp url 3000)
init: >
cd ./client &&
gp sync-await pnpm-install &&

View File

@@ -5,7 +5,6 @@ function FreeCodeCampLogo(
): JSX.Element {
return (
<svg
data-cy='freeCodeCamp-logo'
height={24}
version='1.1'
viewBox='0 0 210 24'

View File

@@ -5,7 +5,6 @@ function MicrosoftLogo(
): JSX.Element {
return (
<svg
data-cy='microsoft-logo'
version='1.1'
viewBox='0 0 610 130'
xmlns='http://www.w3.org/2000/svg'

View File

@@ -392,10 +392,7 @@ const ShowCertification = (props: ShowCertificationProps): JSX.Element => {
}}
</strong>
</h1>
<h4
data-cy={'issue-date'}
data-playwright-test-label='issue-date'
>
<h4 data-playwright-test-label='issue-date'>
{{
time: certDate.toLocaleString([localeCode, 'en-US'], {
year: 'numeric',
@@ -414,7 +411,6 @@ const ShowCertification = (props: ShowCertificationProps): JSX.Element => {
<>
<div>
<Image
data-cy='quincy-signature'
data-playwright-test-label='quincy-signature'
alt="Quincy Larson's Signature"
src={
@@ -431,7 +427,6 @@ const ShowCertification = (props: ShowCertificationProps): JSX.Element => {
</div>
<div className='microsoft-signature'>
<Image
data-cy='microsoft-signature'
data-playwright-test-label='microsoft-signature'
alt="Julia Liusons's Signature"
src={
@@ -451,7 +446,6 @@ const ShowCertification = (props: ShowCertificationProps): JSX.Element => {
) : (
<div>
<Image
data-cy='quincy-signature'
data-playwright-test-label='quincy-signature'
alt="Quincy Larson's Signature"
src={

View File

@@ -184,7 +184,7 @@ const ShowProjectLinks = (props: ShowProjectLinksProps): JSX.Element => {
if (!isCertName(certName)) return <div> Unknown Certification</div>;
return (
<div data-cy='solution-widget' data-playwright-test-label='project-links'>
<div data-playwright-test-label='project-links'>
{t(getCertHeading(certName), { user: name })}
<Spacer size='medium' />
<Table striped>

View File

@@ -43,15 +43,11 @@ export const ThankYouMessage = ({
const { t } = useTranslation();
return (
<>
<h1 data-playwright-test-label='main-head' data-cy='donate.thank-you'>
{t('donate.thank-you')}
</h1>
<h1 data-playwright-test-label='main-head'>{t('donate.thank-you')}</h1>
{(askForDonation || thankContributon) && (
<>
<Spacer size='medium' />
<p data-cy='donate.crucial-contribution'>
{t('donate.crucial-contribution')}
</p>
<p>{t('donate.crucial-contribution')}</p>
</>
)}
{askForDonation && <OtherWaysToSupport />}
@@ -63,13 +59,11 @@ export const OtherWaysToSupport = (): JSX.Element => {
const { t } = useTranslation();
return (
<>
<p data-cy='donate.if-support-further'>
<p>
<Trans i18nKey='donate.if-support-further'>
<a href={t('links:donate.one-time-external-url')}>placeholder</a>
<a href={t('links:donate.mail-check-url')}>placeholder</a>
<a data-cy='donate-link' href={t('links:donate.other-ways-url')}>
placeholder
</a>
<a href={t('links:donate.other-ways-url')}>placeholder</a>
</Trans>
</p>
</>

View File

@@ -97,7 +97,6 @@ function SelectionTabs({
<button
className='text-center confirm-donation-btn donate-btn-group'
type='submit'
data-cy='donation-tier-selection-button'
onClick={() => setShowDonateForm(true)}
>
{isAnimationEnabled

View File

@@ -157,7 +157,6 @@ export default function StripeCardForm({
<button
className='confirm-donation-btn'
disabled={!stripe || !elements || isSubmitting}
data-cy='donation-confirmation-button'
type='submit'
>
{t('buttons.donate')}

View File

@@ -30,12 +30,7 @@ const ProjectModal = ({
<SolutionViewer challengeFiles={challengeFiles} solution={solution} />
</Modal.Body>
<Modal.Footer alignment='end'>
<Button
data-cy='solution-viewer-close-btn'
onClick={handleSolutionModalHide}
>
{t('buttons.close')}
</Button>
<Button onClick={handleSolutionModalHide}>{t('buttons.close')}</Button>
</Modal.Footer>
</Modal>
);

View File

@@ -32,11 +32,10 @@ const SearchBarOptimized = ({
return (
<div className='fcc_searchBar' data-testid='fcc_searchBar' ref={innerRef}>
<div className='fcc_search_wrapper'>
<div className='ais-SearchBox' data-cy='ais-SearchBox'>
<div className='ais-SearchBox'>
<form
action=''
className='ais-SearchBox-form'
data-cy='ais-SearchBox-form'
onSubmit={onSubmit}
role='search'
>

View File

@@ -63,11 +63,7 @@ const CustomHits = connectHits(
return (
<div className='ais-Hits'>
<ul
className='ais-Hits-list'
data-cy='ais-Hits-list'
aria-label={t('search.result-list')}
>
<ul className='ais-Hits-list' aria-label={t('search.result-list')}>
{allHits.map((hit: Hit, i: number) => (
<li
className={

View File

@@ -188,7 +188,6 @@ function EmailSettings({
<FullWidthRow>
<form
id='form-update-email'
data-cy='form-update-email'
{...(!isDisabled
? { onSubmit: handleSubmit }
: { onSubmit: e => e.preventDefault() })}
@@ -206,7 +205,6 @@ function EmailSettings({
{t('settings.email.new')}
</ControlLabel>
<FormControl
data-cy='email-input'
onChange={createHandleEmailFormChange('newEmail')}
type='email'
value={newEmail}
@@ -226,7 +224,6 @@ function EmailSettings({
{t('settings.email.confirm')}
</ControlLabel>
<FormControl
data-cy='confirm-email'
onChange={createHandleEmailFormChange('confirmNewEmail')}
type='email'
value={confirmNewEmail}

View File

@@ -385,7 +385,6 @@ class PortfolioSettings extends Component<PortfolioProps, PortfolioState> {
<p>{t('settings.share-projects')}</p>
<Spacer size='small' />
<Button
data-cy='add-portfolio'
block={true}
size='large'
variant='primary'

View File

@@ -147,7 +147,6 @@ function PrivacySettings({ submitProfileUI, user }: PrivacyProps): JSX.Element {
type='submit'
size='large'
variant='primary'
data-cy='save-privacy-settings'
block={true}
disabled={!madeChanges}
{...(!madeChanges && { tabIndex: -1 })}

View File

@@ -198,11 +198,7 @@ class UsernameSettings extends Component<UsernameProps, UsernameState> {
const isDisabled =
!(isValidUsername && valid && !isFormPristine) || submitClicked;
return (
<form
id='usernameSettings'
onSubmit={this.handleSubmit}
data-cy='username-form'
>
<form id='usernameSettings' onSubmit={this.handleSubmit}>
<FullWidthRow>
<FormGroup>
<ControlLabel htmlFor='username-settings'>

View File

@@ -153,7 +153,7 @@ function AcceptPrivacyTerms({
<hr />
</Col>
</Row>
<Row className='email-sign-up' data-cy='email-sign-up'>
<Row className='email-sign-up'>
<Col md={8} mdOffset={2} sm={10} smOffset={1} xs={12}>
<Spacer size='small' />
<p>{t('misc.email-blast')}</p>

View File

@@ -50,7 +50,6 @@ class EditorTabs extends Component<EditorTabsProps> {
visibleEditors[challengeFile.fileKey] ?? 'false'
}
key={challengeFile.fileKey}
data-cy={`editor-tab-${challengeFile.fileKey}`}
onClick={() => toggleVisibleEditor(challengeFile.fileKey)}
>
{`${challengeFile.name}.${challengeFile.ext}`}{' '}

View File

@@ -100,7 +100,6 @@ const LowerButtonsPanel = ({
<Button
data-playwright-test-label='lowerJaw-reset-button'
className='fade-in'
data-cy='reset-code-button'
onClick={resetButtonEvent}
>
<Reset />
@@ -112,7 +111,6 @@ const LowerButtonsPanel = ({
<Button
className='fade-in'
id='get-help-button'
data-cy='get-help-button'
onClick={helpButtonEvent}
>
<Help />
@@ -133,7 +131,6 @@ const LowerJawTips = ({
<>
<div
data-playwright-test-label='lowerJaw-failing-test-feedback'
data-cy='failing-test-feedback'
className='test-status fade-in'
aria-hidden={showFeedback}
>
@@ -302,7 +299,6 @@ const LowerJaw = ({
{showSignInButton && (
<>
<a
data-cy='sign-in-button'
href={`${apiLocation}/signin`}
className='btn-cta btn btn-block'
onClick={() => {

View File

@@ -126,7 +126,6 @@ const MultifileEditor = (props: MultifileEditorProps) => {
} else {
return (
<ReflexElement
data-cy={`editor-container-${key}`}
data-playwright-test-label={`editor-container-${key}`}
{...reflexProps}
{...resizeProps}

View File

@@ -216,7 +216,6 @@ class CompletionModal extends Component<
size='large'
variant='primary'
disabled={isSubmitting}
data-cy='submit-challenge'
onClick={() => submitChallenge()}
>
{buttonText}

View File

@@ -20,7 +20,6 @@ function Output({ defaultOutput, output }: OutputProps): JSX.Element {
return (
<pre
className='output-text'
data-cy='output-text'
data-playwright-test-label='output-text'
dangerouslySetInnerHTML={{ __html: message }}
role='region'

View File

@@ -55,7 +55,6 @@ function ResetModal({ reset, close, isOpen }: ResetModalProps): JSX.Element {
</Modal.Body>
<Modal.Footer>
<Button
data-cy='reset-modal-confirm'
block={true}
size='large'
variant='danger'

View File

@@ -82,12 +82,7 @@ function ToolPanel({
challengeType === challengeTypes.multifilePythonCertProject) && (
<>
<Spacer size='xxSmall' />
<Button
block={true}
variant='primary'
data-cy='save-code-to-database-btn'
onClick={saveChallenge}
>
<Button block={true} variant='primary' onClick={saveChallenge}>
{isMobile ? t('buttons.save') : t('buttons.save-code')}
</Button>
</>

View File

@@ -109,7 +109,6 @@ ${t('learn.exam.time', { t: formatSecondsToTime(examTimeInSeconds) })}
<Button
block={true}
variant='primary'
data-cy='exit-exam'
data-playwright-test-label='exit-exam'
onClick={exitExam}
>

View File

@@ -55,21 +55,11 @@ function ExitExamModal({
<div className='text-center'>{t('learn.exam.exit')}</div>
</Modal.Body>
<Modal.Footer>
<Button
data-cy='exit-exam-modal-deny'
block={true}
variant='primary'
onClick={closeExitExamModal}
>
<Button block={true} variant='primary' onClick={closeExitExamModal}>
{t('learn.exam.exit-no')}
</Button>
<Spacer size='xxSmall' />
<Button
data-cy='exit-exam-modal-confirm'
block={true}
variant='danger'
onClick={exitExam}
>
<Button block={true} variant='danger' onClick={exitExam}>
{t('learn.exam.exit-yes')}
</Button>
</Modal.Footer>

View File

@@ -52,7 +52,6 @@ function FinishExamModal({
</Modal.Body>
<Modal.Footer>
<Button
data-cy='finish-exam-modal-confirm'
block={true}
size='medium'
variant='primary'
@@ -62,7 +61,6 @@ function FinishExamModal({
</Button>
<Spacer size='xxSmall' />
<Button
data-cy='finish-exam-modal-deny'
block={true}
size='medium'
variant='primary'

View File

@@ -33,7 +33,6 @@ function FoundationalCSharpSurveyAlert({
<Button
block={true}
variant='info'
data-cy='start-csharp-survey-btn'
onClick={openSurveyModal}
type='button'
>

View File

@@ -168,7 +168,6 @@ function FoundationalCSharpSurvey({
block={true}
size='medium'
variant='primary'
data-cy='submit-csharp-survey-btn'
disabled={cantSubmitSurvey || isProcessing}
onClick={createSurveyResults}
>

View File

@@ -411,10 +411,7 @@ class ShowExam extends Component<ShowExamProps, ShowExamState> {
{title}
</div>
<span>|</span>
<div
data-cy='exam-time'
data-playwright-test-label='exam-show-question-time'
>
<div data-playwright-test-label='exam-show-question-time'>
{t('learn.exam.time', {
t: formatSecondsToTime(examTimeInSeconds)
})}
@@ -479,7 +476,6 @@ class ShowExam extends Component<ShowExamProps, ShowExamState> {
className='exam-button'
disabled={currentQuestionIndex <= 0}
variant='primary'
data-cy='previous-exam-question-btn'
onClick={this.goToPreviousQuestion}
>
{t('buttons.previous-question')}
@@ -494,7 +490,6 @@ class ShowExam extends Component<ShowExamProps, ShowExamState> {
}
className='exam-button'
variant='primary'
data-cy='finish-exam-btn'
onClick={openFinishExamModal}
>
{t('buttons.finish-exam')}
@@ -507,7 +502,6 @@ class ShowExam extends Component<ShowExamProps, ShowExamState> {
}
className='exam-button'
variant='primary'
data-cy='next-exam-question-btn'
onClick={this.goToNextQuestion}
>
{t('buttons.next-question')}
@@ -522,7 +516,6 @@ class ShowExam extends Component<ShowExamProps, ShowExamState> {
block={true}
className='exam-button'
variant='primary'
data-cy='exit-exam-btn'
onClick={openExitExamModal}
>
{t('buttons.exit-exam')}
@@ -555,7 +548,7 @@ class ShowExam extends Component<ShowExamProps, ShowExamState> {
<Spacer size='medium' />
{qualifiedForExam ? (
<Alert data-cy='qualified-for-exam-alert' variant='info'>
<Alert variant='info'>
<p>{t('learn.exam.qualified')}</p>
</Alert>
) : (
@@ -576,7 +569,6 @@ class ShowExam extends Component<ShowExamProps, ShowExamState> {
<Button
block={true}
variant='primary'
data-cy='start-exam-btn'
disabled={!qualifiedForExam}
// `this.runExam` being an async callback is acceptable
//eslint-disable-next-line @typescript-eslint/no-misused-promises

View File

@@ -251,7 +251,6 @@ class Block extends Component<BlockProps> {
<button
aria-expanded={isExpanded ? 'true' : 'false'}
className='block-header'
data-cy={challengesWithCompleted[0].block}
onClick={() => {
this.handleBlockClick();
}}

View File

@@ -1,15 +0,0 @@
const { spawn } = require('child_process');
const child = spawn('pnpm', ['run', 'cypress:install'], {
stdio: 'inherit'
});
child.on('close', code => {
if (code) {
console.error('Cypress installation failed with code:', code);
}
});
child.on('error', error => {
console.error('Cypress installation error:', error);
});

View File

@@ -1,53 +0,0 @@
InstallCypress() {
sudo apt-get update && sudo apt-get install -y \
libgtk2.0-0 \
libgtk-3-0 \
libgbm-dev \
libnotify-dev \
libgconf-2-4 \
libnss3 \
libxss1 \
libasound2 \
libxtst6 \
xauth \
xvfb
}
InstallPuppeteer() {
sudo apt-get install -y \
ca-certificates \
fonts-liberation \
libappindicator3-1 \
libatk-bridge2.0-0 \
libatk1.0-0 \
libc6 \
libcairo2 \
libcups2 \
libdbus-1-3 \
libexpat1 \
libfontconfig1 \
libgbm1 \
libgcc1 \
libglib2.0-0 \
libnspr4 \
libpango-1.0-0 \
libpangocairo-1.0-0 \
libstdc++6 \
libx11-6 \
libx11-xcb1 \
libxcb1 \
libxcomposite1 \
libxcursor1 \
libxdamage1 \
libxext6 \
libxfixes3 \
libxi6 \
libxrandr2 \
libxrender1 \
lsb-release \
wget \
xdg-utils
}
InstallCypress
InstallPuppeteer

View File

@@ -1,60 +0,0 @@
const { execSync } = require('child_process');
const { existsSync } = require('fs');
const { defineConfig } = require('cypress');
function seed(args = []) {
return execSync('node tools/scripts/seed/seed-demo-user ' + args.join(' '));
}
function seedExams() {
return execSync('node tools/scripts/seed-exams/create-exams.js');
}
function seedSurveys() {
return execSync('node tools/scripts/seed/seed-surveys.js');
}
function deleteSurveys() {
return execSync('node tools/scripts/seed/seed-surveys.js delete-only');
}
module.exports = defineConfig({
e2e: {
baseUrl: 'http://localhost:8000',
projectId: 'ke77ns',
retries: { openMode: 1, runMode: 4 },
chromeWebSecurity: false,
// This is the default spec pattern, that we use on /learn proper
//
// For special ones like the third- party or the mobile app specs,
// you can use the below command:
//
// pnpm run cypress:dev:run -- --spec "cypress/e2e/mobile-learn/**/*"
// pnpm run cypress:dev:run -- --spec "cypress/e2e/third-party/**/*"
//
// and so on.
//
specPattern: ['cypress/e2e/default/**/*.js', 'cypress/e2e/default/**/*.ts'],
// Temporary disable these until we can address the flakiness
excludeSpecPattern: ['cypress/e2e/**/challenge-hot-keys.ts'],
setupNodeEvents(on, config) {
config.env = config.env || {};
on('before:run', () => {
if (!existsSync('./shared/config/curriculum.json')) {
execSync('pnpm run build:curriculum');
}
});
on('task', {
seed,
seedExams,
seedSurveys,
deleteSurveys
});
config.env.API_LOCATION = 'http://localhost:3000';
return config;
}
}
});

View File

@@ -1,100 +0,0 @@
const search = (query: string) => {
cy.get('.ais-SearchBox').within(() => {
cy.get('input').type(query);
});
cy.wait(300);
};
const clear = () => {
cy.get('.ais-SearchBox').within(() => {
cy.get('input').clear();
});
};
describe('Search bar optimized', () => {
beforeEach(() => {
cy.visit('/');
});
it('Should render without hits', () => {
cy.get('[data-cy=ais-SearchBox]').should('be.visible');
search('freeCodeCamp');
cy.get('[data-cy=ais-Hits-list]').should('not.exist');
});
it('Should open a new tab ', () => {
cy.visit('/', {
onBeforeLoad(win) {
cy.stub(win, 'open').as('open');
}
});
search('freeCodeCamp');
cy.get('[data-cy=ais-SearchBox-form]').submit();
const queryUrl =
'https://www.freecodecamp.org/news/search/?query=freeCodeCamp';
cy.get('@open').should('have.been.calledOnceWith', queryUrl);
});
});
describe('Search bar', () => {
beforeEach(() => {
cy.visit('/learn');
});
it('Should render with hits', () => {
cy.get('.ais-SearchBox').should('be.visible');
search('freeCodeCamp');
cy.get('[data-cy=ais-Hits-list]')
.children()
.should('to.have.length.of.at.least', 1);
});
it('Should clear hits when input is cleared', () => {
search('freeCodeCamp');
cy.get('[data-cy=ais-Hits-list]')
.children()
.should('to.have.length.of.at.least', 1);
clear();
cy.get('div.ais-Hits').should('not.exist');
});
it('Should show up to 8 hits when height >= 768px', () => {
cy.viewport(1300, 768);
search('freeCodeCamp');
cy.get('[data-cy=ais-Hits-list]').children().should('to.have.length.of', 8);
});
it('Should show up to 5 hits when height < 768px', () => {
cy.viewport(1300, 767);
search('freeCodeCamp');
cy.get('[data-cy=ais-Hits-list]').children().should('to.have.length.of', 5);
});
it('Should show no hits for queries that do not exist in the Algolia index', () => {
search('testtttt');
cy.get('[data-cy=ais-Hits-list]').children().should('to.have.length.of', 0);
cy.contains('No tutorials found');
});
it('Should not redirect to the News search page if there are no hits', () => {
search('testtttt');
cy.get('.ais-SearchBox-form').submit();
cy.location().should(loc => {
expect(loc.pathname).to.match(/^\/learn/);
});
});
});

View File

@@ -1,5 +0,0 @@
{
"name": "Using fixtures to represent data",
"email": "hello@cypress.io",
"body": "Fixtures are a great way to mock data for responses to routes"
}

View File

@@ -1,32 +0,0 @@
// ***********************************************************
// This example plugins/index.js can be used to load plugins
//
// You can change the location of this file or turn off loading
// the plugins file with the 'pluginsFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/plugins-guide
// ***********************************************************
// This function is called when a project is opened or re-opened (e.g. due to
// the project's config changing)
/* eslint-disable no-unused-vars */
const { execSync } = require('child_process');
const { existsSync } = require('fs');
require('dotenv').config();
module.exports = (on, config) => {
// `on` is used to hook into various events Cypress emits
// `config` is the resolved Cypress config
config.env = config.env || {};
// TODO: once we've containerized the API, we can remove this.
on('before:run', () => {
if (!existsSync('../../shared/config/curriculum.json')) {
execSync('pnpm run build:curriculum');
}
});
config.env.API_LOCATION = process.env.API_LOCATION;
return config;
};

View File

@@ -1,78 +0,0 @@
const login = (user?: string) => {
cy.session(
user ?? 'new-user',
() => {
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
cy.visit(`${Cypress.env('API_LOCATION')}/signin`);
cy.url().should('include', '/learn');
cy.contains('Welcome back');
},
{
validate() {
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
cy.request(`${Cypress.env('API_LOCATION')}/user/get-session-user`)
.its('status')
.should('eq', 200);
}
}
);
};
const setPrivacyTogglesToPublic = () => {
cy.get('#privacy-settings')
.find('[type=radio][value=2]')
.each(element => {
cy.wrap(element).parent().click();
cy.wrap(element).should('be.checked');
});
cy.get('[data-cy=save-privacy-settings]').click();
cy.get('#honesty-policy').find('button').click();
cy.contains('You have agreed to our Academic Honesty Policy');
};
const goToSettings = () => {
cy.visit('/settings');
// Setting aliases here
cy.get('[data-cy=username-input]').as('usernameInput');
cy.get('[data-cy=username-form]').as('usernameForm');
};
const typeUsername = (username: string) => {
cy.get('@usernameInput')
.clear({ force: true })
.type(username, { force: true });
};
const resetUsername = () => {
cy.goToSettings();
cy.typeUsername('developmentuser');
cy.contains('Username is available');
cy.get('@usernameInput').type('{enter}', { force: true, release: false });
cy.contains('Account Settings for developmentuser').should('be.visible');
};
Cypress.Commands.add('login', login);
Cypress.Commands.add('setPrivacyTogglesToPublic', setPrivacyTogglesToPublic);
Cypress.Commands.add('goToSettings', goToSettings);
Cypress.Commands.add('typeUsername', typeUsername);
Cypress.Commands.add('resetUsername', resetUsername);
// eslint-disable-next-line @typescript-eslint/no-namespace
declare namespace Cypress {
interface Chainable {
login: typeof login;
setPrivacyTogglesToPublic: typeof setPrivacyTogglesToPublic;
goToSettings: typeof goToSettings;
typeUsername(username: string): Chainable<JQuery<HTMLElement>>;
resetUsername: typeof resetUsername;
}
}

View File

@@ -1,40 +0,0 @@
// ***********************************************************
// This example support/index.js is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************
import 'cypress-plugin-stripe-elements';
import 'cypress-plugin-tab';
// Import commands.js using ES2015 syntax:
import './commands';
// Alternatively you can use CommonJS syntax:
// require('./commands')
Cypress.on('uncaught:exception', err => {
console.log('Cypress detected uncaught exception', err.name);
// Rapidly cy.visiting pages seems to cause uncaught exceptions. It remains
// unclear why this is happening, but we need to ignore them in testing so
// that we can test other behavior.
if (
err.name === 'NS_ERROR_UNEXPECTED' ||
err.name === 'ChunkLoadError' ||
// paypal sdk error
(err.name === 'TypeError' &&
err.message.includes('removeEventListener is not a function'))
) {
return false;
}
// We are still interested in other errors.
return true;
});

View File

@@ -1,10 +0,0 @@
export const selectors = {
class: {
reactMonacoEditor: '.react-monaco-editor-container'
},
id: {},
dataCy: { outputText: '[data-cy="output-text"]' },
tag: {
inputSolution: 'input[name="solution"]'
}
};

View File

@@ -1,9 +0,0 @@
{
"compilerOptions": {
"target": "es5",
"lib": ["es5", "dom", "ES2017"],
"types": ["cypress", "@testing-library/cypress"]
},
"include": ["e2e/**/*.ts", "support/**/*.ts"],
"extends": "../tsconfig-base.json"
}

View File

@@ -7,16 +7,7 @@
"workspaces": {
".": {
// No custom entry/project files in root workspace to not interfere with workspaces that are not set up yet
"entry": [],
"cypress": {
// Override all Cypress entry patterns as (only) spec paths don't match the default
"entry": [
"cypress.config.js",
"cypress/e2e/**/*.{js,ts}",
"cypress/support/*.ts",
"cypress/plugins/index.js"
]
}
"entry": []
},
"client": {
"webpack": "webpack-workers.js",

View File

@@ -38,21 +38,10 @@
"clean:packages": "find . -name 'node_modules' -type d -prune -exec rm -rf '{}' +",
"clean:server": "rm -rf ./api-server/lib",
"create:shared": "tsc -p shared",
"precypress": "node ./cypress-install.js",
"cypress": "cypress",
"cypress:dev:run": "pnpm run cypress run",
"cypress:dev:watch": "pnpm run cypress open",
"cypress:install": "cypress install && echo 'for use with ./cypress-install.js'",
"cypress:install-build-tools": "sh ./cypress-install.sh",
"predevelop": "npm-run-all -p create:shared -s build:curriculum",
"develop": "npm-run-all -p develop:*",
"develop:client": "cd ./client && pnpm run develop",
"develop:server": "cd ./api-server && pnpm run develop",
"e2e": "pnpm run e2e:dev:run",
"e2e:dev:run": "start-test develop 'http://localhost:3000/status/ping|http://localhost:8000' cypress:dev:run",
"e2e:dev:watch": "start-test develop 'http://localhost:3000/status/ping|http://localhost:8000' cypress:dev:watch",
"e2e:prd:run": "pnpm run build && start-test 'http://localhost:3000/status/ping|http://localhost:8000' cypress:dev:run",
"e2e:prd:watch": "pnpm run build && start-test 'http://localhost:3000/status/ping|http://localhost:8000' cypress:dev:watch",
"format": "run-s format:eslint format:prettier",
"format:eslint": "eslint . --fix",
"format:prettier": "prettier --write .",
@@ -90,7 +79,6 @@
"test-server": "jest api-server",
"test-tools": "jest tools",
"test-utils": "jest utils",
"postinstall": "cypress cache prune",
"prepare": "husky",
"playwright:run": "playwright test",
"playwright:watch": "playwright test --ui"
@@ -104,8 +92,7 @@
"@babel/preset-env": "7.23.7",
"@babel/preset-react": "7.23.3",
"@babel/preset-typescript": "7.23.3",
"@playwright/test": "1.44.0",
"@testing-library/cypress": "10.0.1",
"@playwright/test": "^1.43.1",
"@testing-library/dom": "9.3.4",
"@testing-library/jest-dom": "6.4.2",
"@testing-library/user-event": "14.5.2",
@@ -118,9 +105,6 @@
"babel-jest": "29.7.0",
"babel-plugin-transform-imports": "2.0.0",
"cross-env": "7.0.3",
"cypress": "12.17.4",
"cypress-plugin-stripe-elements": "1.0.2",
"cypress-plugin-tab": "1.0.5",
"eslint": "8.57.0",
"eslint-config-prettier": "9.1.0",
"eslint-import-resolver-typescript": "^3.5.5",

360
pnpm-lock.yaml generated
View File

@@ -28,11 +28,8 @@ importers:
specifier: 7.23.3
version: 7.23.3(@babel/core@7.23.7)
'@playwright/test':
specifier: 1.44.0
specifier: ^1.43.1
version: 1.44.0
'@testing-library/cypress':
specifier: 10.0.1
version: 10.0.1(cypress@12.17.4)
'@testing-library/dom':
specifier: 9.3.4
version: 9.3.4
@@ -69,15 +66,6 @@ importers:
cross-env:
specifier: 7.0.3
version: 7.0.3
cypress:
specifier: 12.17.4
version: 12.17.4
cypress-plugin-stripe-elements:
specifier: 1.0.2
version: 1.0.2
cypress-plugin-tab:
specifier: 1.0.5
version: 1.0.5
eslint:
specifier: 8.57.0
version: 8.57.0
@@ -1356,6 +1344,9 @@ importers:
'@total-typescript/ts-reset':
specifier: ^0.5.0
version: 0.5.1
'@types/chai':
specifier: ^4.3.16
version: 4.3.16
chai:
specifier: 4.4.1
version: 4.4.1
@@ -2814,10 +2805,6 @@ packages:
'@bcoe/v8-coverage@0.2.3':
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
'@colors/colors@1.5.0':
resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
engines: {node: '>=0.1.90'}
'@compodoc/live-server@1.2.3':
resolution: {integrity: sha512-hDmntVCyjjaxuJzPzBx68orNZ7TW4BtHWMnXlIVn5dqhK7vuFF/11hspO1cMmc+2QTYgqde1TBcb3127S7Zrow==}
engines: {node: '>=0.10.0'}
@@ -2827,13 +2814,6 @@ packages:
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
engines: {node: '>=12'}
'@cypress/request@2.88.12':
resolution: {integrity: sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==}
engines: {node: '>= 6'}
'@cypress/xvfb@1.2.4':
resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==}
'@discoveryjs/json-ext@0.5.7':
resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==}
engines: {node: '>=10.0.0'}
@@ -3957,12 +3937,6 @@ packages:
'@tanstack/virtual-core@3.0.0':
resolution: {integrity: sha512-SYXOBTjJb05rXa2vl55TTwO40A6wKu0R5i1qQwhJYNDIqaIGF7D0HsLw+pJAyi2OvntlEIVusx3xtbbgSUi6zg==}
'@testing-library/cypress@10.0.1':
resolution: {integrity: sha512-e8uswjTZIBhaIXjzEcrQQ8nHRWHgZH7XBxKuIWxZ/T7FxfWhCR48nFhUX5nfPizjVOKSThEfOSv67jquc1ASkw==}
engines: {node: '>=12', npm: '>=6'}
peerDependencies:
cypress: ^12.0.0 || ^13.0.0
'@testing-library/dom@8.20.1':
resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==}
engines: {node: '>=12'}
@@ -4083,6 +4057,9 @@ packages:
'@types/chai@4.3.12':
resolution: {integrity: sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==}
'@types/chai@4.3.16':
resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==}
'@types/cheerio@0.22.35':
resolution: {integrity: sha512-yD57BchKRvTV+JD53UZ6PD8KWY5g5rvvMLRnZR3EQBCZXiDT/HR+pKpMzFGlWNhFrXlo7VPZXtKvIEwZkAWOIA==}
@@ -4275,9 +4252,6 @@ packages:
'@types/node@14.18.63':
resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==}
'@types/node@16.18.55':
resolution: {integrity: sha512-Y1zz/LIuJek01+hlPNzzXQhmq/Z2BCP96j18MSXC0S0jSu/IG4FFxmBs7W4/lI2vPJ7foVfEB0hUVtnOjnCiTg==}
'@types/node@20.11.20':
resolution: {integrity: sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==}
@@ -4383,9 +4357,6 @@ packages:
'@types/serve-static@1.15.3':
resolution: {integrity: sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==}
'@types/sinonjs__fake-timers@8.1.1':
resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==}
'@types/sizzle@2.3.4':
resolution: {integrity: sha512-jA2llq2zNkg8HrALI7DtWzhALcVH0l7i89yhY3iBdOz6cBPeACoFq+fkQrjHA39t1hnSFOboZ7A/AY5MMZSlag==}
@@ -4827,9 +4798,6 @@ packages:
algoliasearch@4.22.1:
resolution: {integrity: sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==}
ally.js@1.4.1:
resolution: {integrity: sha512-ZewdfuwP6VewtMN36QY0gmiyvBfMnmEaNwbVu2nTS6zRt069viTgkYgaDiqu6vRJ1VJCriNqV0jGMu44R8zNbA==}
anser@2.1.1:
resolution: {integrity: sha512-nqLm4HxOTpeLOxcmB3QWmV5TcDFhW9y/fyQ+hivtDFcK4OQ+pQ5fzPnXHM1Mfcm0VkLtvVi1TCPr++Qy0Q/3EQ==}
@@ -5068,10 +5036,6 @@ packages:
asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
at-least-node@1.0.0:
resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
engines: {node: '>= 4.0.0'}
atob@2.1.2:
resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==}
engines: {node: '>= 4.5.0'}
@@ -5590,9 +5554,6 @@ packages:
bl@4.1.0:
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
blob-util@2.0.2:
resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==}
bluebird@3.7.2:
resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
@@ -5808,10 +5769,6 @@ packages:
cached-path-relative@1.1.0:
resolution: {integrity: sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==}
cachedir@2.4.0:
resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==}
engines: {node: '>=6'}
call-bind@1.0.7:
resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
engines: {node: '>= 0.4'}
@@ -5984,10 +5941,6 @@ packages:
resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==}
engines: {node: '>=6'}
cli-table3@0.6.3:
resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==}
engines: {node: 10.* || >= 12.*}
cli-truncate@2.1.0:
resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==}
engines: {node: '>=8'}
@@ -6098,10 +6051,6 @@ packages:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
commander@6.2.1:
resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==}
engines: {node: '>= 6'}
commander@7.2.0:
resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
engines: {node: '>= 10'}
@@ -6465,17 +6414,6 @@ packages:
engines: {node: '>= 0.8.0'}
deprecated: Please use another csrf package
cypress-plugin-stripe-elements@1.0.2:
resolution: {integrity: sha512-tNXZ9BHooO8IGGmOpVRhNfGde/vmPY4D56pi4VHw1EWbfSuwCoveeqqjKDeRfPzMTD5gGYGwXdX2qO1S9O9GEg==}
cypress-plugin-tab@1.0.5:
resolution: {integrity: sha512-QtTJcifOVwwbeMP3hsOzQOKf3EqKsLyjtg9ZAGlYDntrCRXrsQhe4ZQGIthRMRLKpnP6/tTk6G0gJ2sZUfRliQ==}
cypress@12.17.4:
resolution: {integrity: sha512-gAN8Pmns9MA5eCDFSDJXWKUpaL3IDd89N9TtIupjYnzLSmlpVr+ZR+vb4U/qaMp+lB6tBvAmt7504c3Z4RU5KQ==}
engines: {node: ^14.0.0 || ^16.0.0 || >=18.0.0}
hasBin: true
d@1.0.1:
resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==}
@@ -6513,9 +6451,6 @@ packages:
dateformat@4.6.3:
resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==}
dayjs@1.11.10:
resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==}
debounce@1.2.1:
resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==}
@@ -7360,9 +7295,6 @@ packages:
eventemitter2@5.0.1:
resolution: {integrity: sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==}
eventemitter2@6.4.7:
resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==}
eventemitter3@3.1.2:
resolution: {integrity: sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==}
@@ -7400,10 +7332,6 @@ packages:
resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==}
engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0}
executable@4.1.1:
resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==}
engines: {node: '>=4'}
exit@0.1.2:
resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
engines: {node: '>= 0.8.0'}
@@ -7749,10 +7677,6 @@ packages:
resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
engines: {node: '>=12'}
fs-extra@9.1.0:
resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
engines: {node: '>=10'}
fs-monkey@1.0.5:
resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==}
@@ -7989,9 +7913,6 @@ packages:
resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==}
engines: {node: '>=0.10.0'}
getos@3.2.1:
resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==}
getpass@0.1.7:
resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==}
@@ -8405,10 +8326,6 @@ packages:
resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==}
engines: {node: '>=0.8', npm: '>=1.3.7'}
http-signature@1.3.6:
resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==}
engines: {node: '>=0.10'}
http-status@1.7.0:
resolution: {integrity: sha512-6HZ8T2ywZKtNKOrRA22x4Z+fK+UiWzimWYSTROVHrZ46RX+hKsg9wCQiodRtfNrKfsvOkwsXA6R9q+TmDY+8nQ==}
engines: {node: '>= 0.4.0'}
@@ -8674,10 +8591,6 @@ packages:
resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==}
hasBin: true
is-ci@3.0.1:
resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==}
hasBin: true
is-core-module@2.13.0:
resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==}
@@ -9339,10 +9252,6 @@ packages:
resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==}
engines: {node: '>=0.6.0'}
jsprim@2.0.2:
resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==}
engines: {'0': node >=0.6.0}
jsx-ast-utils@3.3.5:
resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
engines: {node: '>=4.0'}
@@ -9452,15 +9361,6 @@ packages:
engines: {node: ^14.13.1 || >=16.0.0}
hasBin: true
listr2@3.14.0:
resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==}
engines: {node: '>=10.0.0'}
peerDependencies:
enquirer: '>= 2.3.0 < 3'
peerDependenciesMeta:
enquirer:
optional: true
listr2@5.0.8:
resolution: {integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==}
engines: {node: ^14.13.1 || >=16.0.0}
@@ -10709,9 +10609,6 @@ packages:
resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
engines: {node: '>=0.10.0'}
ospath@1.2.2:
resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==}
p-cancelable@1.1.0:
resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==}
engines: {node: '>=6'}
@@ -10977,10 +10874,6 @@ packages:
engines: {node: '>=0.10'}
hasBin: true
pify@2.3.0:
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
engines: {node: '>=0.10.0'}
pify@4.0.1:
resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
engines: {node: '>=6'}
@@ -11019,9 +10912,6 @@ packages:
resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==}
engines: {node: '>=8'}
platform@1.3.3:
resolution: {integrity: sha512-VJK1SRmXBpjwsB4YOHYSturx48rLKMzHgCqDH2ZDa6ZbMS/N5huoNqyQdK5Fj/xayu3fqbXckn5SeCS1EbMDZg==}
platform@1.3.6:
resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==}
@@ -11375,9 +11265,6 @@ packages:
resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
engines: {node: '>= 0.10'}
proxy-from-env@1.0.0:
resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==}
proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
@@ -11443,10 +11330,6 @@ packages:
resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==}
engines: {node: '>=0.6'}
qs@6.10.4:
resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==}
engines: {node: '>=0.6'}
qs@6.11.0:
resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==}
engines: {node: '>=0.6'}
@@ -11938,9 +11821,6 @@ packages:
resolution: {integrity: sha512-vuNYXC7gG7IeVNBC1xUllqCcZKRbJoSPOBhnTEcAIiKCsbuef6zO3F0Rve3isPMMoNoQRWjQwbAgAjHUHniyEA==}
engines: {node: '>= 0.10'}
request-progress@3.0.0:
resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==}
request@2.88.2:
resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==}
engines: {node: '>= 6'}
@@ -12907,9 +12787,6 @@ packages:
thread-stream@2.4.0:
resolution: {integrity: sha512-xZYtOtmnA63zj04Q+F9bdEay5r47bvpo1CaNqsKi7TpoJHcotUez8Fkfo2RJWpW91lnnaApdpRbVwCWsy+ifcw==}
throttleit@1.0.0:
resolution: {integrity: sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==}
through2@2.0.5:
resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==}
@@ -16954,9 +16831,6 @@ snapshots:
'@bcoe/v8-coverage@0.2.3': {}
'@colors/colors@1.5.0':
optional: true
'@compodoc/live-server@1.2.3':
dependencies:
chokidar: 3.6.0
@@ -16980,34 +16854,6 @@ snapshots:
dependencies:
'@jridgewell/trace-mapping': 0.3.9
'@cypress/request@2.88.12':
dependencies:
aws-sign2: 0.7.0
aws4: 1.12.0
caseless: 0.12.0
combined-stream: 1.0.8
extend: 3.0.2
forever-agent: 0.6.1
form-data: 2.3.3
http-signature: 1.3.6
is-typedarray: 1.0.0
isstream: 0.1.2
json-stringify-safe: 5.0.1
mime-types: 2.1.35
performance-now: 2.1.0
qs: 6.10.4
safe-buffer: 5.2.1
tough-cookie: 4.1.3
tunnel-agent: 0.6.0
uuid: 8.3.2
'@cypress/xvfb@1.2.4(supports-color@8.1.1)':
dependencies:
debug: 3.2.7(supports-color@8.1.1)
lodash.once: 4.1.1
transitivePeerDependencies:
- supports-color
'@discoveryjs/json-ext@0.5.7': {}
'@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2(cosmiconfig@7.0.0)(typescript@5.2.2)':
@@ -18393,12 +18239,6 @@ snapshots:
'@tanstack/virtual-core@3.0.0': {}
'@testing-library/cypress@10.0.1(cypress@12.17.4)':
dependencies:
'@babel/runtime': 7.23.9
'@testing-library/dom': 9.3.4
cypress: 12.17.4
'@testing-library/dom@8.20.1':
dependencies:
'@babel/code-frame': 7.23.5
@@ -18544,6 +18384,8 @@ snapshots:
'@types/chai@4.3.12': {}
'@types/chai@4.3.16': {}
'@types/cheerio@0.22.35':
dependencies:
'@types/node': 20.12.8
@@ -18783,8 +18625,6 @@ snapshots:
'@types/node@14.18.63': {}
'@types/node@16.18.55': {}
'@types/node@20.11.20':
dependencies:
undici-types: 5.26.5
@@ -18909,8 +18749,6 @@ snapshots:
'@types/mime': 3.0.2
'@types/node': 20.12.8
'@types/sinonjs__fake-timers@8.1.1': {}
'@types/sizzle@2.3.4': {}
'@types/stack-utils@2.0.1': {}
@@ -19476,11 +19314,6 @@ snapshots:
'@algolia/requester-node-http': 4.22.1
'@algolia/transporter': 4.22.1
ally.js@1.4.1:
dependencies:
css.escape: 1.5.1
platform: 1.3.3
anser@2.1.1: {}
ansi-align@3.0.1:
@@ -19711,8 +19544,6 @@ snapshots:
asynckit@0.4.0: {}
at-least-node@1.0.0: {}
atob@2.1.2: {}
atomic-sleep@1.0.0: {}
@@ -20668,8 +20499,6 @@ snapshots:
inherits: 2.0.4
readable-stream: 3.6.2
blob-util@2.0.2: {}
bluebird@3.7.2: {}
bn.js@4.12.0: {}
@@ -21034,8 +20863,6 @@ snapshots:
cached-path-relative@1.1.0: {}
cachedir@2.4.0: {}
call-bind@1.0.7:
dependencies:
es-define-property: 1.0.0
@@ -21225,12 +21052,6 @@ snapshots:
cli-spinners@2.9.1: {}
cli-table3@0.6.3:
dependencies:
string-width: 4.2.3
optionalDependencies:
'@colors/colors': 1.5.0
cli-truncate@2.1.0:
dependencies:
slice-ansi: 3.0.0
@@ -21343,8 +21164,6 @@ snapshots:
commander@4.1.1: {}
commander@6.2.1: {}
commander@7.2.0: {}
commander@9.5.0: {}
@@ -21822,58 +21641,6 @@ snapshots:
csrf: 3.1.0
http-errors: 1.7.3
cypress-plugin-stripe-elements@1.0.2: {}
cypress-plugin-tab@1.0.5:
dependencies:
ally.js: 1.4.1
cypress@12.17.4:
dependencies:
'@cypress/request': 2.88.12
'@cypress/xvfb': 1.2.4(supports-color@8.1.1)
'@types/node': 16.18.55
'@types/sinonjs__fake-timers': 8.1.1
'@types/sizzle': 2.3.4
arch: 2.2.0
blob-util: 2.0.2
bluebird: 3.7.2
buffer: 5.7.1
cachedir: 2.4.0
chalk: 4.1.2
check-more-types: 2.24.0
cli-cursor: 3.1.0
cli-table3: 0.6.3
commander: 6.2.1
common-tags: 1.8.2
dayjs: 1.11.10
debug: 4.3.4(supports-color@8.1.1)
enquirer: 2.4.1
eventemitter2: 6.4.7
execa: 4.1.0
executable: 4.1.1
extract-zip: 2.0.1(supports-color@8.1.1)
figures: 3.2.0
fs-extra: 9.1.0
getos: 3.2.1
is-ci: 3.0.1
is-installed-globally: 0.4.0
lazy-ass: 1.6.0
listr2: 3.14.0(enquirer@2.4.1)
lodash: 4.17.21
log-symbols: 4.1.0
minimist: 1.2.8
ospath: 1.2.2
pretty-bytes: 5.6.0
process: 0.11.10
proxy-from-env: 1.0.0
request-progress: 3.0.0
semver: 7.5.4
supports-color: 8.1.1
tmp: 0.2.1
untildify: 4.0.0
yauzl: 2.10.0
d@1.0.1:
dependencies:
es5-ext: 0.10.62
@@ -21911,8 +21678,6 @@ snapshots:
dateformat@4.6.3: {}
dayjs@1.11.10: {}
debounce@1.2.1: {}
debug@2.2.0:
@@ -21933,12 +21698,6 @@ snapshots:
optionalDependencies:
supports-color: 5.5.0
debug@3.2.7(supports-color@8.1.1):
dependencies:
ms: 2.1.3
optionalDependencies:
supports-color: 8.1.1
debug@4.3.1:
dependencies:
ms: 2.1.2
@@ -22136,7 +21895,7 @@ snapshots:
'@types/tmp': 0.0.33
application-config-path: 0.1.1
command-exists: 1.2.9
debug: 3.2.7(supports-color@8.1.1)
debug: 3.2.7(supports-color@5.5.0)
eol: 0.9.1
get-port: 3.2.0
glob: 7.2.3
@@ -22662,7 +22421,7 @@ snapshots:
eslint-import-resolver-node@0.3.9:
dependencies:
debug: 3.2.7(supports-color@8.1.1)
debug: 3.2.7(supports-color@5.5.0)
is-core-module: 2.13.1
resolve: 1.22.8
transitivePeerDependencies:
@@ -22688,7 +22447,7 @@ snapshots:
eslint-module-utils@2.8.0(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@7.1.1(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@7.32.0):
dependencies:
debug: 3.2.7(supports-color@8.1.1)
debug: 3.2.7(supports-color@5.5.0)
optionalDependencies:
'@typescript-eslint/parser': 4.33.0(eslint@7.32.0)(typescript@5.2.2)
eslint: 7.32.0
@@ -22699,7 +22458,7 @@ snapshots:
eslint-module-utils@2.8.0(@typescript-eslint/parser@7.1.1(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@7.1.1(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0):
dependencies:
debug: 3.2.7(supports-color@8.1.1)
debug: 3.2.7(supports-color@5.5.0)
optionalDependencies:
'@typescript-eslint/parser': 7.1.1(eslint@8.57.0)(typescript@5.4.5)
eslint: 8.57.0
@@ -22739,7 +22498,7 @@ snapshots:
array.prototype.findlastindex: 1.2.3
array.prototype.flat: 1.3.2
array.prototype.flatmap: 1.3.2
debug: 3.2.7(supports-color@8.1.1)
debug: 3.2.7(supports-color@5.5.0)
doctrine: 2.1.0
eslint: 7.32.0
eslint-import-resolver-node: 0.3.9
@@ -22766,7 +22525,7 @@ snapshots:
array.prototype.findlastindex: 1.2.3
array.prototype.flat: 1.3.2
array.prototype.flatmap: 1.3.2
debug: 3.2.7(supports-color@8.1.1)
debug: 3.2.7(supports-color@5.5.0)
doctrine: 2.1.0
eslint: 8.57.0
eslint-import-resolver-node: 0.3.9
@@ -23108,8 +22867,6 @@ snapshots:
eventemitter2@5.0.1: {}
eventemitter2@6.4.7: {}
eventemitter3@3.1.2: {}
eventemitter3@4.0.7: {}
@@ -23181,10 +22938,6 @@ snapshots:
signal-exit: 3.0.7
strip-final-newline: 3.0.0
executable@4.1.1:
dependencies:
pify: 2.3.0
exit@0.1.2: {}
expand-brackets@2.1.4:
@@ -23315,7 +23068,7 @@ snapshots:
extract-files@9.0.0: {}
extract-zip@2.0.1(supports-color@8.1.1):
extract-zip@2.0.1:
dependencies:
debug: 4.3.4(supports-color@8.1.1)
get-stream: 5.2.0
@@ -23546,7 +23299,7 @@ snapshots:
follow-redirects@1.15.3(debug@3.2.7):
optionalDependencies:
debug: 3.2.7(supports-color@8.1.1)
debug: 3.2.7(supports-color@5.5.0)
follow-redirects@1.15.3(debug@4.3.4):
optionalDependencies:
@@ -23635,13 +23388,6 @@ snapshots:
jsonfile: 6.1.0
universalify: 2.0.0
fs-extra@9.1.0:
dependencies:
at-least-node: 1.0.0
graceful-fs: 4.2.11
jsonfile: 6.1.0
universalify: 2.0.0
fs-monkey@1.0.5: {}
fs-readdir-recursive@1.1.0: {}
@@ -24073,7 +23819,7 @@ snapshots:
css-minimizer-webpack-plugin: 2.0.0(webpack@5.90.3(webpack-cli@4.10.0))
css.escape: 1.5.1
date-fns: 2.30.0
debug: 3.2.7(supports-color@8.1.1)
debug: 3.2.7(supports-color@5.5.0)
deepmerge: 4.3.1
del: 5.1.0
detect-port: 1.5.1
@@ -24253,10 +23999,6 @@ snapshots:
get-value@2.0.6: {}
getos@3.2.1:
dependencies:
async: 3.2.4
getpass@0.1.7:
dependencies:
assert-plus: 1.0.0
@@ -24823,12 +24565,6 @@ snapshots:
jsprim: 1.4.2
sshpk: 1.17.0
http-signature@1.3.6:
dependencies:
assert-plus: 1.0.0
jsprim: 2.0.2
sshpk: 1.17.0
http-status@1.7.0: {}
http2-wrapper@1.0.3:
@@ -25085,10 +24821,6 @@ snapshots:
dependencies:
ci-info: 2.0.0
is-ci@3.0.1:
dependencies:
ci-info: 3.8.0
is-core-module@2.13.0:
dependencies:
has: 1.0.3
@@ -25976,13 +25708,6 @@ snapshots:
json-schema: 0.4.0
verror: 1.10.0
jsprim@2.0.2:
dependencies:
assert-plus: 1.0.0
extsprintf: 1.3.0
json-schema: 0.4.0
verror: 1.10.0
jsx-ast-utils@3.3.5:
dependencies:
array-includes: 3.1.7
@@ -26102,19 +25827,6 @@ snapshots:
- enquirer
- supports-color
listr2@3.14.0(enquirer@2.4.1):
dependencies:
cli-truncate: 2.1.0
colorette: 2.0.20
log-update: 4.0.0
p-map: 4.0.0
rfdc: 1.3.0
rxjs: 7.8.1
through: 2.3.8
wrap-ansi: 7.0.0
optionalDependencies:
enquirer: 2.4.1
listr2@5.0.8(enquirer@2.4.1):
dependencies:
cli-truncate: 2.1.0
@@ -26262,7 +25974,7 @@ snapshots:
dependencies:
async: 0.9.2
commondir: 1.0.1
debug: 3.2.7(supports-color@8.1.1)
debug: 3.2.7(supports-color@5.5.0)
lodash: 4.17.21
semver: 5.7.2
strong-globalize: 4.1.3
@@ -26272,7 +25984,7 @@ snapshots:
loopback-component-explorer@6.4.0:
dependencies:
debug: 3.2.7(supports-color@8.1.1)
debug: 3.2.7(supports-color@5.5.0)
lodash: 4.17.21
loopback-swagger: 5.9.0
strong-globalize: 4.1.3
@@ -26284,7 +25996,7 @@ snapshots:
dependencies:
async: 2.6.4
bson: 1.1.6
debug: 3.2.7(supports-color@8.1.1)
debug: 3.2.7(supports-color@5.5.0)
loopback-connector: 4.11.1
mongodb: 3.6.9
strong-globalize: 4.1.3
@@ -26319,7 +26031,7 @@ snapshots:
dependencies:
async: 2.6.4
bluebird: 3.7.2
debug: 3.2.7(supports-color@8.1.1)
debug: 3.2.7(supports-color@5.5.0)
depd: 1.1.2
inflection: 1.13.4
lodash: 4.17.21
@@ -26337,14 +26049,14 @@ snapshots:
loopback-filters@1.1.1:
dependencies:
debug: 3.2.7(supports-color@8.1.1)
debug: 3.2.7(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
loopback-phase@3.4.0:
dependencies:
async: 2.6.4
debug: 3.2.7(supports-color@8.1.1)
debug: 3.2.7(supports-color@5.5.0)
strong-globalize: 4.1.3
transitivePeerDependencies:
- supports-color
@@ -26352,7 +26064,7 @@ snapshots:
loopback-swagger@5.9.0:
dependencies:
async: 2.6.4
debug: 3.2.7(supports-color@8.1.1)
debug: 3.2.7(supports-color@5.5.0)
ejs: 2.7.4
lodash: 4.17.21
strong-globalize: 4.1.3
@@ -27839,8 +27551,6 @@ snapshots:
os-tmpdir@1.0.2: {}
ospath@1.2.2: {}
p-cancelable@1.1.0: {}
p-cancelable@2.1.1: {}
@@ -28113,8 +27823,6 @@ snapshots:
pidtree@0.6.0: {}
pify@2.3.0: {}
pify@4.0.1: {}
pify@5.0.0: {}
@@ -28171,8 +27879,6 @@ snapshots:
dependencies:
find-up: 3.0.0
platform@1.3.3: {}
platform@1.3.6: {}
playwright-core@1.44.0: {}
@@ -28519,8 +28225,6 @@ snapshots:
forwarded: 0.2.0
ipaddr.js: 1.9.1
proxy-from-env@1.0.0: {}
proxy-from-env@1.1.0: {}
proxy-middleware@0.15.0: {}
@@ -28565,7 +28269,7 @@ snapshots:
dependencies:
debug: 4.3.1
devtools-protocol: 0.0.901419
extract-zip: 2.0.1(supports-color@8.1.1)
extract-zip: 2.0.1
https-proxy-agent: 5.0.0
node-fetch: 2.6.1
pkg-dir: 4.2.0
@@ -28600,10 +28304,6 @@ snapshots:
dependencies:
side-channel: 1.0.4
qs@6.10.4:
dependencies:
side-channel: 1.0.4
qs@6.11.0:
dependencies:
side-channel: 1.0.4
@@ -29253,10 +28953,6 @@ snapshots:
replace-ext@1.0.0: {}
request-progress@3.0.0:
dependencies:
throttleit: 1.0.0
request@2.88.2:
dependencies:
aws-sign2: 0.7.0
@@ -30450,8 +30146,6 @@ snapshots:
dependencies:
real-require: 0.2.0
throttleit@1.0.0: {}
through2@2.0.5:
dependencies:
readable-stream: 2.3.8
@@ -31334,7 +31028,7 @@ snapshots:
webpack-virtual-modules@0.3.2:
dependencies:
debug: 3.2.7(supports-color@8.1.1)
debug: 3.2.7(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color

View File

@@ -46,6 +46,7 @@ describe('external curriculum data build', () => {
const result = validateAvailableSuperBlocks(availableSuperblocks);
if (result.error) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
throw new AssertionError(
result.error.message,
`file: available-superblocks.json`
@@ -71,6 +72,7 @@ describe('external curriculum data build', () => {
const result = validateSuperBlock(JSON.parse(fileContent));
if (result.error) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
throw new AssertionError(
result.error.message,
`file: ${fileInArray}`

View File

@@ -20,6 +20,7 @@
"main": "none",
"devDependencies": {
"@total-typescript/ts-reset": "^0.5.0",
"@types/chai": "^4.3.16",
"chai": "4.4.1",
"joi": "17.12.2",
"readdirp": "3.6.0"

View File

@@ -14,7 +14,7 @@
"noEmit": true,
"resolveJsonModule": true,
"skipLibCheck": true,
"types": ["node", "jest", "cypress"]
"types": ["node", "jest"]
},
// since ts-node compiles ts on the fly and then uses node, it needs to
// compile the scripts to commonjs (or node will complain about the requires)