Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
bd9aabd
Fix: ReDoS vulnerability in URL-only regex validation
MeenakshiArunsankar Apr 14, 2026
efb11bd
Fixing course auto approval alert and notification to the learner (#923)
MeenakshiArunsankar Apr 14, 2026
197d72a
Longest option always correct - fix for Smart Bloom mode (#921)
MeenakshiArunsankar Apr 14, 2026
0e6d9a6
Feature/crowdsourced question clean (#935)
MeenakshiArunsankar Apr 14, 2026
5f5e3c7
Chore/db query (#939)
MeenakshiArunsankar Apr 14, 2026
0399d24
ci: strengthen PR merge testing pipeline (#942)
MeenakshiArunsankar Apr 14, 2026
b140351
Potential fix for code scanning alert no. 152: Incomplete string esca…
MeenakshiArunsankar Apr 16, 2026
7df33de
Fix/stop api (#946)
MeenakshiArunsankar Apr 16, 2026
4fe691f
Fix/stop api (#947)
MeenakshiArunsankar Apr 16, 2026
6b48457
Fix/watch hours (#948)
MeenakshiArunsankar Apr 17, 2026
62ad853
Fix/quiz submit error (#950)
MeenakshiArunsankar Apr 17, 2026
c85c073
Fix/progress issue (#944)
MeenakshiArunsankar Apr 18, 2026
26c3371
Fix/codebase fixes (#953)
MeenakshiArunsankar Apr 18, 2026
ba79612
Remove unresolved merge artifacts causing backend repository parse fa…
Copilot Apr 18, 2026
98ea3eb
fix: resolve merge conflict in EnrollmentService and codebase fixes (…
MeenakshiArunsankar Apr 18, 2026
8c8aaf1
fix: update dependencies and polyfill Buffer.SlowBuffer for Node.js c…
MeenakshiArunsankar Apr 18, 2026
82b4061
ci: isolate e2e dependency install in nightly workflow (#959)
MeenakshiArunsankar Apr 19, 2026
af82ed9
Fix/playwright e2e nightly (#960)
MeenakshiArunsankar Apr 19, 2026
029bcee
chore(backend): add json5 dependency and lockfile entry (#961)
MeenakshiArunsankar Apr 19, 2026
f33bc81
Chore/backend json5 clean commit (#962)
MeenakshiArunsankar Apr 19, 2026
8f436d9
fix: failed to submit quiz (#963)
MeenakshiArunsankar Apr 19, 2026
1b37efc
fix: correct build command
Nandan25 Apr 20, 2026
c51f32c
feat: implement student mark-for-review system
Boltu-007 Apr 20, 2026
0f36cf7
test(pipeline): add end-to-end completion pipeline coverage and relat…
Apr 21, 2026
75927d6
Merge remote-tracking branch 'origin/combined-updates' into feat/test…
Apr 21, 2026
391b8bb
Merge branch 'main' into feature/mark-for-review-final
Boltu-007 Apr 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 103 additions & 0 deletions .firebase/hosting.ZnJvbnRlbmQvZGlzdA.cache
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
index.html,1776078916313,3d09ce2d4ff99811e5e942149fae12723b6d111e380e94b0aeddf89828e6d9e5
worker/BlurDetectorWorker-Dqokp6HO.js.map,1776078916328,e47150db06a6a02a9ce2237d165fce491ab1888b82ed833884ac095fb9ec8137
workers/gestureWorker.js,1776078861690,7c3dd95625f7fd0ed2d90a865225ccfa68dcd00cfdb03b8bf4fc8e92670d0acd
templates/QB - template_Sheet1.csv,1776078861689,9de7bca83fa09abf00c54dfde27ef1c90121062b7532452710d0b773d8b9b017
worker/BlurDetectorWorker-Dqokp6HO.js,1776078915249,08b90d65bfd5b14994ec4545746dd40c01e7632e714ed0a51c7c69a268c848ae
templates/Bulk registration - Template_Sheet1.csv,1776078861689,8294dffc3b83e92b2f97b4c174069d48ccc92b4585bffe335dad6689019769ee
models/ssd_mobilenetv1_model-weights_manifest.json,1776078861688,c1189faea8b1d5a49e9947404b173bb5423e9a4b94297c6eb80c01fd8b3f252c
models/face_landmark_68_model-weights_manifest.json,1776078861640,3bb235120a950dd48e5b4be6b8c4b30b60b82ea294cd167d74d5b9d7f53d1ce7
models/face_recognition_model-weights_manifest.json,1776078861663,d4ec6cbd7549a2587ea82fcdafb16b56fbd00a7eefdd5b726cc7c9d6d23e0317
img/vled-logo-login.png,1776078861636,5dab5b854b729bacf57ea2a122669e28cc4dc3080325921b17e9113462a563f5
img/vled-logo.png,1776078861637,25c84d22876b51ee0a7a854ae38d9602d0fd6e59cb5c4596493f0db16654ee43
img/dled.svg,1776078861625,a266f49fdbd4d88bc6da6999123bd541e664c56a6af91416f1f03faccb5ebea0
assets/vendor-DS08_OVb.js,1776078916183,73a6f1ac04ec918ccb93105503b05af6f8f7074ebc91c4797bc8e1d8eb3045bb
assets/vled-logo-login-Dh6Js1to.png,1776078915260,5dab5b854b729bacf57ea2a122669e28cc4dc3080325921b17e9113462a563f5
assets/vendor-DS08_OVb.js.map,1776078916225,02abb07475ea5f1bba520e0ede183a01f5c88d69aa1e78accced4be779b77f1d
assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2,1776078915741,f0aea026d1cc223c40a83b3c46679a607f6e97352e2f2fc83fec4110eba92be5
assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff,1776078915925,02245a89154fb0fe1ec06c7c2445f8fdc7d0ee115d49174c787eca56a64798ff
assets/StudentTimeslotModal-_mU3pi8g.js.map,1776078916215,37f5c24449446d70563a0cc0739484060c5d9b3eeb0daf0b3533bb42c4c27637
assets/StudentTimeslotModal-_mU3pi8g.js,1776078916204,ae3cb6de1ea429a1339898b17768853463c545a50666260c1ecb51c9a02bf211
assets/KaTeX_Size4-Regular-DWFBv043.ttf,1776078916142,04a0cc32ecb2a099ddb9807d7093f37a36f00d7830e9c5f997290ecfbc169160
assets/KaTeX_Size4-Regular-BF-4gkZK.woff,1776078915892,e685c240b7eb13e874c6ec8365235c03506e9000749f1850fe7152baf9b7c46c
assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2,1776078915679,2982e3140ecb186cc06ccbc5751fd74c38f66804ee68fe857ea80f20a8be9d3a
assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf,1776078916122,67e42448520203bb36cb817c19103219b59c92ac47dbac56b85dfc803de95e5b
img/ugc_logo.png,1776078861635,5369c209d62edbf1f70892397cb7857f3df4764baffa8198930ac7ed69d47ef3
img/collabration.svg,1776078861623,94021a3399d003b1b28f3454cf4ac4563360ce5f092254aff4062bf40c449f85
assets/collabration-sbCOQlp4.svg,1776078915316,94021a3399d003b1b28f3454cf4ac4563360ce5f092254aff4062bf40c449f85
img/annam.png,1776078861619,4b89c0e7dfbd67450a4f47af55e449985fa49408c1c04db475b8090d1f413599
assets/KaTeX_Size3-Regular-DgpXs0kz.ttf,1776078916152,0d9a56c6cfac7d85669dd796b4b0037162cbc8eb579724e7da86264d1732511d
assets/KaTeX_Size3-Regular-CTq5MqoE.woff,1776078915913,e99ce0237c8eadd00406c3a3c7b032e7a93be811ccb4985f1cf6d267697eb3e6
assets/KaTeX_Size2-Regular-oD1tc_U0.woff,1776078915936,e8e09faecb7d908f2ecafdcff1d3f1afd901023b0518758348fa834c1196a431
assets/KaTeX_Size2-Regular-Dy4dx90m.woff2,1776078915649,08541c6e7bbebad15bc376aa0c858ab33ed07a1883af0adec415b3a51dfcaeca
assets/KaTeX_Size1-Regular-mCD8mA8B.woff2,1776078915703,84431ea62f9f049627897f864cb33c84262d17dd234d7bfedb0984bfb0a4eea2
assets/KaTeX_Size2-Regular-B7gKUWhC.ttf,1776078916132,e26fd0d25de3339bd07aebdb14c280f5f9f35be643b6249934958283ad93afc3
assets/KaTeX_Size1-Regular-Dbsnue_I.ttf,1776078916246,ccd3ba882b22297f7d82341371b82680bd28b54f5a83dc0f1b6f46764eb5ad42
assets/KaTeX_Size1-Regular-C195tn64.woff,1776078915873,19b02d47339b11aa009b8532869aa2a430f8e38ae0d9c40ebcaaa5b42e8fa765
assets/KaTeX_Script-Regular-D3wIWfF6.woff2,1776078915667,8f854e9efe6bf15cee7306bda516b6113cfbbeb85fa984a27506c80cb0e48ac7
assets/KaTeX_Script-Regular-D5yQViql.woff,1776078915861,e725ab21752d07fade4ebf112274a1cc8cf59bc6ea7926f45044b22e02912ab3
assets/KaTeX_Script-Regular-C5JkGWo-.ttf,1776078916102,c788ff00db6d32c368dc67df3a7fffca6c1ed22dddbb32a525b2325e9f913d29
assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2,1776078915642,9255150bee6682051ef1671b666d75a3dc91a9304ead9d1963c3dde268088b7b
assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff,1776078915819,90b18f1e388c00974f9077511528a9257f8576decec3422b2635dbe95fe6f23c
assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf,1776078916013,0062f2e8f26ff4e851f321b4df7e649dcdf2b261b111addeb029a13ef8f11746
assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf,1776078916302,c080821cb59c178ab362c9cbe60c18e74c8812f89be49f56b102edb1975e80ab
assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2,1776078915626,b2508dff36079a11728a4930d8435080b13ad940bf7537f46c4dc9eedfa65999
assets/KaTeX_SansSerif-Italic-DN2j7dab.woff,1776078915903,40c1a8ef80621c5438712611c34386d62b146fb6fcfb0dd8dd6a9b273c74fc76
assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2,1776078915617,a4ccdd68ac11aacbbe3a59be287fdd4d34eb075c112749026b5b336b8fdbcd46
assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff,1776078915843,b8dd8cd8be3868ede1fd8aa9cf24212559f2a84c14487dc1d7984a3dbbf71098
assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf,1776078916074,17cd218ad0f4fd0078301c09e61c476031c3bd3bb4ed8e16af996a5bea4b1afb
img/vibe_logo_img.ico,1776078861635,afe12585a8aebe9d48a900a62c76c92ce046d96d7ea1a0f335dbf26315a7519f
assets/vibe_logo_img-DMSGDHYQ.ico,1776078915224,afe12585a8aebe9d48a900a62c76c92ce046d96d7ea1a0f335dbf26315a7519f
assets/KaTeX_Math-Italic-t53AETM-.woff2,1776078915550,fea5448fc3cfb757677af222c979f653c9558d09cd5e4addc106adea8c120b3a
assets/KaTeX_Math-Italic-DA0__PXp.woff,1776078915778,f00e0a6a174dfc6112d97e9a7f57f0be11fa36720a6738c6a8a2ff0a5c348b1c
assets/KaTeX_Math-Italic-flOr_0UB.ttf,1776078916083,c1e81a5cabf6817c4a5c9e6a6248b0c76626c69f2d927c5e29fc773460c8810d
assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff,1776078915799,f3e0b3b14ebf6fef8605db6b69b5b9b16c643827850f0a12a74535bc85f1fd9d
assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2,1776078915590,a95fa69bb98c18c895a329a7b152be34b9614e0208bf1523423c44c8485633ec
assets/index-CXKohpky.css,1776078916163,44cbdf1aac254bc0b2512d032a9ef058493d2089c20efec63e88ebd0877b6ed8
assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf,1776078916062,e7ffc2352f16657ad9d29294960eef5ef30a5ef1bfc8bf3881c59e7981c169ad
assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff,1776078915719,8a3043571a771745368723a416960600f7cf1bc68dfdea44b483df90c44a48a2
assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2,1776078915450,857b4c5164a77672d0bb88c91a820c1732e44e66ebec109e68fa3ef2b3c04330
assets/KaTeX_Fraktur-Regular-CB_wures.ttf,1776078915957,86a33edc635f89546c6e4d916c988cc6472dd240c0ded68f99e1f467affc4adb
assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2,1776078915729,d9a3ac8e39f453e8c40fd0dfa4dc54f7ecc4d77925af4cce1d090635c3197b94
assets/KaTeX_Main-Regular-ypZvNtVU.ttf,1776078916041,061c4678d0603de3264056ef713fea5af23df638851e3d179de797581f71e8c0
assets/KaTeX_Fraktur-Bold-BsDP51OF.woff,1776078915949,0c4df25ecfc25d29ca101b630f235881deab236232a793cdad1a18cfde05e4bf
assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf,1776078915990,945851ceeea783a441c22514ce9100092fce6f2a7e3776f00adaa916806e0a2e
assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2,1776078915365,7cea8bee15709e9595aade0d39f538a19e6c17108a3474fef4fe8ab29c265e71
assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf,1776078916173,5a3c4fed56e1fae5bdab6dd77d44fa208aa6e076e2c1906c9a8073a039afeb56
assets/KaTeX_Main-Regular-B22Nviop.woff2,1776078915602,80b876b073178966a46ded929cd9df46e59e07af0a884e3cad653182b2b7c8fc
assets/KaTeX_Main-Italic-NWA7e6Wa.woff2,1776078915692,13455b6ba87dadc78af6cf26c4990f77e5a14352161a6d88627929648006b83e
assets/KaTeX_Main-Italic-BMLOBm91.woff,1776078915882,323f40ec9e9d528c6d9f1eeedfe8cb4ba6476d16e48b180f70ba299154634696
assets/KaTeX_Main-Regular-Dr94JaBh.woff,1776078915968,78d1f5a320d0d686096b917aa973a634c4023171ba8a1730ece3992b495fa95f
assets/KaTeX_Main-BoldItalic-SpSLRI95.woff,1776078915764,6d58f6d4799c7324ebda327cca5db4e1218121f154b2feb80564bb1eeffc75d4
assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2,1776078915571,81bd0c15a2f811cf0bb0b3337141155f4864804fd874e65f383423f079adec15
assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff,1776078915809,c7c9808496e577593b34abd4567ba97b0fa15b9812aa265c6dd451ec961e911f
assets/KaTeX_Main-Italic-3WenGoN9.ttf,1776078916112,187640f61285b492005463a2a8ba1816c6eb6f8d892b756c81c63d3709bea15a
assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf,1776078916053,93aa72ac6b566609ad010da64326c827912a68dabf81efb773b1e3e02cbe181c
assets/KaTeX_Main-Bold-Cx986IdX.woff2,1776078915400,f78c0c692eab812c39ea5a1f02fdeddf448589c81bc0701ce44811ae008f8770
assets/KaTeX_Main-Bold-Jm3AIy58.woff,1776078915833,b7f094ee1443e28c93a0d58c46f36c8e760566f295b410995013fb045262e881
assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2,1776078915528,d205004334124b8e4bcc2c8f7eb5e36f2d1cb204e5f28c422e8f3c66a5b335fe
assets/KaTeX_Main-Bold-waoOVXN0.ttf,1776078916032,2e88fc74c62d247e5fc130285be3cc1feefc4473614d10552b608814039300b4
assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff,1776078915751,098eb5de3f7c3f0f363556eb30e8ce0e36605c5830d48e3a3c33abfdcf80a181
assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf,1776078915979,08d57955fb708023e444ebfb6b82dd137070a2ef0d1448f13411e86ce6eb70ad
img/iit-clear.png,1776078861626,da41092c10ad3636e76eabb4e810ab4eee6b3fc99fd3dfa99ee3861e6555c9bd
assets/iit-clear-L0nc4rgW.png,1776078915308,da41092c10ad3636e76eabb4e810ab4eee6b3fc99fd3dfa99ee3861e6555c9bd
assets/KaTeX_AMS-Regular-BQhdFMY1.woff2,1776078915352,0d1272f5aefdcd67f11e35f8c27b1e8770cd38c827acf1f430ab7ef70cc2b870
assets/KaTeX_AMS-Regular-DMm9YOAa.woff,1776078915788,140f6bfe74eb4668550aa91e37e40e9db9fcee5c7d2927117e1642a89c95257c
assets/KaTeX_AMS-Regular-DRggAlZN.ttf,1776078916001,a83880c17a9c1d2b72f6a5f5d427c2dd4de51cdbf2fe0ed1cf7b9eebd668202e
img/logos.png,1776078861634,ae286128357299ebc029f6264db9e161c7927f778712877f9ff77dc4a61326c3
assets/logos-Dj3JJYbc.png,1776078915250,ae286128357299ebc029f6264db9e161c7927f778712877f9ff77dc4a61326c3
img/innovators.svg,1776078861627,c7adea9e2cd5bd01c5e15e7b95362c4f1ca5c0c14bfc39ad7a82f21c0b98e9be
assets/innovators-DW1lcI5p.svg,1776078915271,c7adea9e2cd5bd01c5e15e7b95362c4f1ca5c0c14bfc39ad7a82f21c0b98e9be
models/face_landmark_68_model-shard1,1776078861640,827e273ffebeff31f01efc2bc3b59ef6aec15ebf646e6cb81d897b29c0866576
worker/whisperWorker-DTFHWIV2.js,1776078916408,c8b308f7438084c8a3ce7e4ddaead76bf231c978ff036aa693cb1d122ceef669
assets/logo-Djx-iLC-.webp,1776078915206,845709ab6cfdb1998f9e1497060e209ddb7425117530185af5abee2b2e67d569
img/learning-img.svg,1776078861631,c0fa6da21ac38b9b68ce592c499f2b91f207200f0f161803567f785b3693d6a8
worker/FaceDetectorWorker-DtMAv4Q6.js,1776078916869,b971bdbcb8644766f2b5180592edc8dee92fb2301cec2c11b9cc40ba4f635efd
assets/learning-img-B4zr73UI.svg,1776078916351,c0fa6da21ac38b9b68ce592c499f2b91f207200f0f161803567f785b3693d6a8
img/classroom.svg,1776078861622,8b033f40d3bddf0953792512d8add61cf233d159f84b8bc7a2c9df9ba47e53fe
assets/classroom-BqlmIblF.svg,1776078916462,8b033f40d3bddf0953792512d8add61cf233d159f84b8bc7a2c9df9ba47e53fe
worker/whisperWorker-DTFHWIV2.js.map,1776078916937,8e531b9f4aea45d8e3485df69b1d7c2ace5b6ed6210756b90fd5d78a3f534287
models/ssd_mobilenetv1_model-shard1,1776078861685,47b91653a721f7d2e9071cbada54221b6bce0474ebd3c4b5645488685645a715
models/face_recognition_model-shard1,1776078861657,ac60354cad0601c827a09bc04343d23b9edd7e9c2d95259db4c88f91aa6aa3a0
worker/FaceDetectorWorker-DtMAv4Q6.js.map,1776078917239,ca1fb0ca5fa9c069dfe2382ac2db226d679fd61e1c0aa626cafe2c340b3d2e12
assets/index-S6tTpZ2M.js,1776078917238,f33eabf4682e650ca2d09741c81c1f301156feee0bc81bc293195e924413f0f4
assets/index-S6tTpZ2M.js.map,1776078917260,8e9ff6d86a91adda406f9942bc233c3e6c2b743f8746df9a3dd4ed33cb84b50b
55 changes: 55 additions & 0 deletions .github/workflows/jest-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ on:
pull_request:
types: [opened, synchronize, reopened]

permissions:
contents: read
pull-requests: write

jobs:
test:
runs-on: ubuntu-latest
Expand Down Expand Up @@ -69,6 +73,14 @@ jobs:
env:
DB_URL: ${{ secrets.DB_URL }}

- name: Report Coverage on PR
if: ${{ always() && github.event.pull_request.head.repo.full_name == github.repository }}
uses: davelosert/vitest-coverage-report-action@v2
with:
working-directory: backend
json-summary-path: coverage/coverage-summary.json
json-final-path: coverage/coverage-final.json

- name: Remove IP from MongoDB Atlas Access List
if: always()
run: |
Expand All @@ -80,3 +92,46 @@ jobs:
ATLAS_PUBLIC_KEY: ${{ secrets.ATLAS_PUBLIC_KEY }}
ATLAS_PRIVATE_KEY: ${{ secrets.ATLAS_PRIVATE_KEY }}
ATLAS_PROJECT_ID: ${{ secrets.ATLAS_PROJECT_ID }}

pipeline-test:
name: Run Pipeline E2E Tests
runs-on: ubuntu-latest
needs: test
steps:
- name: Checkout merged PR code
uses: actions/checkout@v4

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '23.11.0'

- name: Install pnpm
uses: pnpm/action-setup@v4

- name: Remove lockfile
run: rm pnpm-lock.yaml

- name: Install dependencies
run: pnpm install

- name: Create env file for emulator
working-directory: backend
run: |
touch .env
echo FIREBASE_AUTH_EMULATOR_HOST="127.0.0.1:9099" >> .env
echo FIREBASE_EMULATOR_HOST="127.0.0.1:4000" >> .env
echo GCLOUD_PROJECT="demo-test" >> .env

- name: Install Firebase CLI
working-directory: backend
run: npm install -g firebase-tools

- name: Start Firebase Emulator (Auth only)
working-directory: backend
run: |
nohup firebase emulators:start --only auth --project demo-test &
sleep 10

- name: Run pipeline tests
run: pnpm test:pipeline
37 changes: 31 additions & 6 deletions .github/workflows/linter.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,19 @@ name: Lint and Format Check on Pull Request
on:
pull_request:
branches:
- main # Or your main branch name
paths:
- 'backend/**' # Only trigger when files in backend folder are changed
- combined-updates
workflow_dispatch:

permissions:
contents: read

jobs:
lint:
lint-backend:
name: Lint Backend
runs-on: ubuntu-latest
if: >
github.event_name == 'workflow_dispatch' ||
contains(toJson(github.event.pull_request.changed_files), 'backend/')

steps:
- name: Checkout code
Expand All @@ -23,12 +24,36 @@ jobs:
- name: Setup pnpm
uses: pnpm/action-setup@v2
with:
version: 8 # or your pnpm version
version: 8

- name: Install dependencies
run: pnpm install
working-directory: backend

- name: Lint Backend Code
run: pnpm run lint
working-directory: backend
working-directory: backend

lint-frontend:
name: Lint Frontend
runs-on: ubuntu-latest
if: >
github.event_name == 'workflow_dispatch' ||
contains(toJson(github.event.pull_request.changed_files), 'frontend/')

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v2
with:
version: 8

- name: Install dependencies
run: pnpm install
working-directory: frontend

- name: Lint Frontend Code
run: pnpm run lint
working-directory: frontend
4 changes: 2 additions & 2 deletions .github/workflows/nightly-staging-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@ jobs:
- name: Setup pnpm
uses: pnpm/action-setup@v2
with:
version: 8
version: 10.12.1

- name: Install Dependencies
run: pnpm install
run: pnpm install --dir e2e

- name: Install Playwright Browsers
run: pnpm --dir e2e exec playwright install --with-deps
Expand Down
59 changes: 59 additions & 0 deletions .github/workflows/pr-checks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
name: PR Type Checks

on:
pull_request:
branches:
- combined-updates
types: [opened, synchronize, reopened]

permissions:
contents: read

jobs:
typecheck-backend:
name: TypeScript Check (Backend)
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '23.11.0'

- name: Setup pnpm
uses: pnpm/action-setup@v4

- name: Install dependencies
run: pnpm install
working-directory: backend

- name: TypeScript type check
run: pnpm exec tsc --noEmit
working-directory: backend

typecheck-frontend:
name: TypeScript Check (Frontend)
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'

- name: Setup pnpm
uses: pnpm/action-setup@v4

- name: Install dependencies
run: pnpm install
working-directory: frontend

- name: TypeScript type check
run: pnpm exec tsc --noEmit
working-directory: frontend
55 changes: 55 additions & 0 deletions .github/workflows/pr-smoke-e2e.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: PR Smoke E2E

on:
pull_request:
branches:
- combined-updates
types: [opened, synchronize, reopened]

permissions:
contents: read

jobs:
smoke:
name: Smoke E2E (Staging)
runs-on: ubuntu-latest
timeout-minutes: 15
# Only run when STAGING_FRONTEND_URL is set as a repository variable
if: ${{ vars.STAGING_FRONTEND_URL != '' }}

steps:
- name: Checkout Repository
uses: actions/checkout@v4

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 22

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10

- name: Install Dependencies
run: pnpm install

- name: Install Playwright Browsers (Chromium only)
run: pnpm --dir e2e exec playwright install chromium --with-deps

- name: Run Smoke Tests Against Staging
run: pnpm --dir e2e exec playwright test smoke.spec.ts
env:
BASE_URL: ${{ secrets.STAGING_FRONTEND_URL }}
INSTRUCTOR_EMAIL: ${{ secrets.INSTRUCTOR_EMAIL }}
INSTRUCTOR_PASSWORD: ${{ secrets.INSTRUCTOR_PASSWORD }}
STUDENT_EMAIL: ${{ secrets.STUDENT_EMAIL }}
STUDENT_PASSWORD: ${{ secrets.STUDENT_PASSWORD }}

- name: Upload Smoke Test Report
if: always()
uses: actions/upload-artifact@v4
with:
name: smoke-report-pr-${{ github.event.pull_request.number }}
path: e2e/playwright-report/
retention-days: 7
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ google_credentials.json
gcp-service-account.json
backend/tsconfig.tsbuildinfo
frontend/tsconfig.tsbuildinfo
.firebase/
frontend/.firebase


Expand Down
1 change: 1 addition & 0 deletions .husky/commit-msg
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pnpm commitlint --edit "$1"
Empty file modified .husky/pre-commit
100644 → 100755
Empty file.
Loading
Loading