diff --git a/.github/actions/package.json b/.github/actions/package.json index 58a842dcf9..8530bf124b 100644 --- a/.github/actions/package.json +++ b/.github/actions/package.json @@ -5,7 +5,6 @@ "type": "module", "devDependencies": { "@sourceacademy/modules-repotools": "workspace:^", - "@types/lodash": "^4.14.198", "@types/node": "^22.15.30", "typescript": "^5.8.2", "vitest": "^4.0.18" @@ -14,7 +13,7 @@ "@actions/artifact": "^6.0.0", "@actions/core": "^1.11.1", "@actions/exec": "^3.0.0", - "lodash": "^4.17.23", + "es-toolkit": "^1.44.0", "snyk-nodejs-lockfile-parser": "^2.4.2" }, "scripts": { diff --git a/.github/actions/src/__tests__/commons.test.ts b/.github/actions/src/__tests__/commons.test.ts index 82447d6487..3b7598c623 100644 --- a/.github/actions/src/__tests__/commons.test.ts +++ b/.github/actions/src/__tests__/commons.test.ts @@ -2,9 +2,13 @@ import * as exec from '@actions/exec'; import { describe, expect, it, test, vi } from 'vitest'; import * as commons from '../commons.js'; -vi.mock(import('lodash/memoize.js'), () => ({ - default: (x: any) => x -}) as any); +vi.mock(import('es-toolkit'), async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + memoize: (x: any) => x + }; +}); const mockedExecOutput = vi.spyOn(exec, 'getExecOutput'); diff --git a/.github/actions/src/__tests__/sample_why.txt b/.github/actions/src/__tests__/sample_why.txt index 240cec0056..7c697a6046 100644 --- a/.github/actions/src/__tests__/sample_why.txt +++ b/.github/actions/src/__tests__/sample_why.txt @@ -23,18 +23,18 @@ {"value":"@sourceacademy/bundle-sound@workspace:src/bundles/sound","children":{"@sourceacademy/bundle-midi@workspace:src/bundles/midi":{"value":{"locator":"@sourceacademy/bundle-midi@workspace:src/bundles/midi","descriptor":"@sourceacademy/bundle-midi@workspace:^"},"children":{}},"@sourceacademy/modules-buildtools@workspace:lib/buildtools":{"value":{"locator":"@sourceacademy/modules-buildtools@workspace:lib/buildtools","descriptor":"@sourceacademy/modules-buildtools@workspace:^"},"children":{}},"@sourceacademy/modules-lib@workspace:lib/modules-lib":{"value":{"locator":"@sourceacademy/modules-lib@workspace:lib/modules-lib","descriptor":"@sourceacademy/modules-lib@workspace:^"},"children":{}},"js-slang@npm:1.0.85":{"value":{"locator":"js-slang@npm:1.0.85","descriptor":"js-slang@npm:^1.0.81"},"children":{}}}} {"value":"@sourceacademy/bundle-sound_matrix@workspace:src/bundles/sound_matrix","children":{"@sourceacademy/modules-buildtools@workspace:lib/buildtools":{"value":{"locator":"@sourceacademy/modules-buildtools@workspace:lib/buildtools","descriptor":"@sourceacademy/modules-buildtools@workspace:^"},"children":{}},"js-slang@npm:1.0.85":{"value":{"locator":"js-slang@npm:1.0.85","descriptor":"js-slang@npm:^1.0.81"},"children":{}}}} {"value":"@sourceacademy/bundle-stereo_sound@workspace:src/bundles/stereo_sound","children":{"@sourceacademy/bundle-midi@workspace:src/bundles/midi":{"value":{"locator":"@sourceacademy/bundle-midi@workspace:src/bundles/midi","descriptor":"@sourceacademy/bundle-midi@workspace:^"},"children":{}},"@sourceacademy/modules-buildtools@workspace:lib/buildtools":{"value":{"locator":"@sourceacademy/modules-buildtools@workspace:lib/buildtools","descriptor":"@sourceacademy/modules-buildtools@workspace:^"},"children":{}},"js-slang@npm:1.0.85":{"value":{"locator":"js-slang@npm:1.0.85","descriptor":"js-slang@npm:^1.0.81"},"children":{}}}} -{"value":"@sourceacademy/bundle-unittest@workspace:src/bundles/unittest","children":{"@sourceacademy/modules-buildtools@workspace:lib/buildtools":{"value":{"locator":"@sourceacademy/modules-buildtools@workspace:lib/buildtools","descriptor":"@sourceacademy/modules-buildtools@workspace:^"},"children":{}},"js-slang@npm:1.0.85":{"value":{"locator":"js-slang@npm:1.0.85","descriptor":"js-slang@npm:^1.0.81"},"children":{}},"lodash@npm:4.17.21":{"value":{"locator":"lodash@npm:4.17.21","descriptor":"lodash@npm:^4.17.21"},"children":{}}}} +{"value":"@sourceacademy/bundle-unittest@workspace:src/bundles/unittest","children":{"@sourceacademy/modules-buildtools@workspace:lib/buildtools":{"value":{"locator":"@sourceacademy/modules-buildtools@workspace:lib/buildtools","descriptor":"@sourceacademy/modules-buildtools@workspace:^"},"children":{}},"js-slang@npm:1.0.85":{"value":{"locator":"js-slang@npm:1.0.85","descriptor":"js-slang@npm:^1.0.81"},"children":{}},"es-toolkit@npm:1.44.0":{"value":{"locator":"es-toolkit@npm:1.44.0","descriptor":"es-toolkit@npm:^1.44.0"},"children":{}}}} {"value":"@sourceacademy/bundle-unity_academy@workspace:src/bundles/unity_academy","children":{"@sourceacademy/modules-buildtools@workspace:lib/buildtools":{"value":{"locator":"@sourceacademy/modules-buildtools@workspace:lib/buildtools","descriptor":"@sourceacademy/modules-buildtools@workspace:^"},"children":{}}}} {"value":"@sourceacademy/bundle-wasm@workspace:src/bundles/wasm","children":{"@sourceacademy/modules-buildtools@workspace:lib/buildtools":{"value":{"locator":"@sourceacademy/modules-buildtools@workspace:lib/buildtools","descriptor":"@sourceacademy/modules-buildtools@workspace:^"},"children":{}},"source-academy-wabt@npm:1.1.3":{"value":{"locator":"source-academy-wabt@npm:1.1.3","descriptor":"source-academy-wabt@npm:^1.0.4"},"children":{"lodash@npm:4.17.21":{"value":{"locator":"lodash@npm:4.17.21","descriptor":"lodash@npm:^4.17.21"},"children":{}}}}}} {"value":"@sourceacademy/lint-plugin@workspace:lib/lintplugin","children":{"@sourceacademy/modules-buildtools@workspace:lib/buildtools":{"value":{"locator":"@sourceacademy/modules-buildtools@workspace:lib/buildtools","descriptor":"@sourceacademy/modules-buildtools@workspace:^"},"children":{}},"@sourceacademy/modules-repotools@virtual:420fa510eaf06edbb20ddb72fbcd454e937e7e266b8c6b7a55ab314e0562f2688175809f2b44c78563a0467da21b6d34688fe0020ecef5e669997fe518ee56e1#workspace:lib/repotools":{"value":{"locator":"@sourceacademy/modules-repotools@virtual:420fa510eaf06edbb20ddb72fbcd454e937e7e266b8c6b7a55ab314e0562f2688175809f2b44c78563a0467da21b6d34688fe0020ecef5e669997fe518ee56e1#workspace:lib/repotools","descriptor":"@sourceacademy/modules-repotools@virtual:420fa510eaf06edbb20ddb72fbcd454e937e7e266b8c6b7a55ab314e0562f2688175809f2b44c78563a0467da21b6d34688fe0020ecef5e669997fe518ee56e1#workspace:^"},"children":{}}}} -{"value":"@sourceacademy/markdown-plugin-directory-tree@workspace:lib/markdown-tree","children":{"@sourceacademy/modules-buildtools@workspace:lib/buildtools":{"value":{"locator":"@sourceacademy/modules-buildtools@workspace:lib/buildtools","descriptor":"@sourceacademy/modules-buildtools@workspace:^"},"children":{}},"lodash@npm:4.17.21":{"value":{"locator":"lodash@npm:4.17.21","descriptor":"lodash@npm:^4.17.21"},"children":{}},"@sourceacademy/modules-repotools@virtual:420fa510eaf06edbb20ddb72fbcd454e937e7e266b8c6b7a55ab314e0562f2688175809f2b44c78563a0467da21b6d34688fe0020ecef5e669997fe518ee56e1#workspace:lib/repotools":{"value":{"locator":"@sourceacademy/modules-repotools@virtual:420fa510eaf06edbb20ddb72fbcd454e937e7e266b8c6b7a55ab314e0562f2688175809f2b44c78563a0467da21b6d34688fe0020ecef5e669997fe518ee56e1#workspace:lib/repotools","descriptor":"@sourceacademy/modules-repotools@virtual:420fa510eaf06edbb20ddb72fbcd454e937e7e266b8c6b7a55ab314e0562f2688175809f2b44c78563a0467da21b6d34688fe0020ecef5e669997fe518ee56e1#workspace:^"},"children":{}}}} -{"value":"@sourceacademy/modules-buildtools@workspace:lib/buildtools","children":{"lodash@npm:4.17.21":{"value":{"locator":"lodash@npm:4.17.21","descriptor":"lodash@npm:^4.17.21"},"children":{}},"@sourceacademy/modules-repotools@virtual:1448f4d06c0cf02cc986bce0139b31c0f3c95af1573e69673bc11ad2928a2fc505818a40d3f1caf168c35ce00c20238d52dfdba1940c59c81fd5df1b08ba49d6#workspace:lib/repotools":{"value":{"locator":"@sourceacademy/modules-repotools@virtual:1448f4d06c0cf02cc986bce0139b31c0f3c95af1573e69673bc11ad2928a2fc505818a40d3f1caf168c35ce00c20238d52dfdba1940c59c81fd5df1b08ba49d6#workspace:lib/repotools","descriptor":"@sourceacademy/modules-repotools@virtual:1448f4d06c0cf02cc986bce0139b31c0f3c95af1573e69673bc11ad2928a2fc505818a40d3f1caf168c35ce00c20238d52dfdba1940c59c81fd5df1b08ba49d6#workspace:^"},"children":{}}}} +{"value":"@sourceacademy/markdown-plugin-directory-tree@workspace:lib/markdown-tree","children":{"@sourceacademy/modules-buildtools@workspace:lib/buildtools":{"value":{"locator":"@sourceacademy/modules-buildtools@workspace:lib/buildtools","descriptor":"@sourceacademy/modules-buildtools@workspace:^"},"children":{}},"@sourceacademy/modules-repotools@virtual:420fa510eaf06edbb20ddb72fbcd454e937e7e266b8c6b7a55ab314e0562f2688175809f2b44c78563a0467da21b6d34688fe0020ecef5e669997fe518ee56e1#workspace:lib/repotools":{"value":{"locator":"@sourceacademy/modules-repotools@virtual:420fa510eaf06edbb20ddb72fbcd454e937e7e266b8c6b7a55ab314e0562f2688175809f2b44c78563a0467da21b6d34688fe0020ecef5e669997fe518ee56e1#workspace:lib/repotools","descriptor":"@sourceacademy/modules-repotools@virtual:420fa510eaf06edbb20ddb72fbcd454e937e7e266b8c6b7a55ab314e0562f2688175809f2b44c78563a0467da21b6d34688fe0020ecef5e669997fe518ee56e1#workspace:^"},"children":{}},"es-toolkit@npm:1.44.0":{"value":{"locator":"es-toolkit@npm:1.44.0","descriptor":"es-toolkit@npm:^1.44.0"},"children":{}}}} +{"value":"@sourceacademy/modules-buildtools@workspace:lib/buildtools","children":{"@sourceacademy/modules-repotools@virtual:1448f4d06c0cf02cc986bce0139b31c0f3c95af1573e69673bc11ad2928a2fc505818a40d3f1caf168c35ce00c20238d52dfdba1940c59c81fd5df1b08ba49d6#workspace:lib/repotools":{"value":{"locator":"@sourceacademy/modules-repotools@virtual:1448f4d06c0cf02cc986bce0139b31c0f3c95af1573e69673bc11ad2928a2fc505818a40d3f1caf168c35ce00c20238d52dfdba1940c59c81fd5df1b08ba49d6#workspace:lib/repotools","descriptor":"@sourceacademy/modules-repotools@virtual:1448f4d06c0cf02cc986bce0139b31c0f3c95af1573e69673bc11ad2928a2fc505818a40d3f1caf168c35ce00c20238d52dfdba1940c59c81fd5df1b08ba49d6#workspace:^"},"children":{}},"es-toolkit@npm:1.44.0":{"value":{"locator":"es-toolkit@npm:1.44.0","descriptor":"es-toolkit@npm:^1.44.0"},"children":{}}}} {"value":"@sourceacademy/modules-devserver@workspace:devserver","children":{"@sourceacademy/modules-buildtools@workspace:lib/buildtools":{"value":{"locator":"@sourceacademy/modules-buildtools@workspace:lib/buildtools","descriptor":"@sourceacademy/modules-buildtools@workspace:^"},"children":{}},"@sourceacademy/modules-lib@workspace:lib/modules-lib":{"value":{"locator":"@sourceacademy/modules-lib@workspace:lib/modules-lib","descriptor":"@sourceacademy/modules-lib@workspace:^"},"children":{}},"js-slang@npm:1.0.85":{"value":{"locator":"js-slang@npm:1.0.85","descriptor":"js-slang@npm:^1.0.81"},"children":{}}}} {"value":"@sourceacademy/modules-docserver@workspace:docs","children":{"@sourceacademy/modules-lib@workspace:lib/modules-lib":{"value":{"locator":"@sourceacademy/modules-lib@workspace:lib/modules-lib","descriptor":"@sourceacademy/modules-lib@workspace:^"},"children":{}},"@sourceacademy/lint-plugin@virtual:f0562030a653a107496800a80ececfadfd737a6a260bbd2572ca4e42de1d6b97749197bb1c41d0d71c9f18ab009789560666041994678fe1aba63902e9fb15bd#workspace:lib/lintplugin":{"value":{"locator":"@sourceacademy/lint-plugin@virtual:f0562030a653a107496800a80ececfadfd737a6a260bbd2572ca4e42de1d6b97749197bb1c41d0d71c9f18ab009789560666041994678fe1aba63902e9fb15bd#workspace:lib/lintplugin","descriptor":"@sourceacademy/lint-plugin@virtual:f0562030a653a107496800a80ececfadfd737a6a260bbd2572ca4e42de1d6b97749197bb1c41d0d71c9f18ab009789560666041994678fe1aba63902e9fb15bd#workspace:^"},"children":{}},"@sourceacademy/markdown-plugin-directory-tree@virtual:f0562030a653a107496800a80ececfadfd737a6a260bbd2572ca4e42de1d6b97749197bb1c41d0d71c9f18ab009789560666041994678fe1aba63902e9fb15bd#workspace:lib/markdown-tree":{"value":{"locator":"@sourceacademy/markdown-plugin-directory-tree@virtual:f0562030a653a107496800a80ececfadfd737a6a260bbd2572ca4e42de1d6b97749197bb1c41d0d71c9f18ab009789560666041994678fe1aba63902e9fb15bd#workspace:lib/markdown-tree","descriptor":"@sourceacademy/markdown-plugin-directory-tree@virtual:f0562030a653a107496800a80ececfadfd737a6a260bbd2572ca4e42de1d6b97749197bb1c41d0d71c9f18ab009789560666041994678fe1aba63902e9fb15bd#workspace:^"},"children":{}}}} -{"value":"@sourceacademy/modules-github-actions@workspace:.github/actions","children":{"@actions/artifact@npm:2.3.2":{"value":{"locator":"@actions/artifact@npm:2.3.2","descriptor":"@actions/artifact@npm:^2.3.2"},"children":{"archiver@npm:7.0.1":{"value":{"locator":"archiver@npm:7.0.1","descriptor":"archiver@npm:^7.0.1"},"children":{"archiver-utils@npm:5.0.2":{"value":{"locator":"archiver-utils@npm:5.0.2","descriptor":"archiver-utils@npm:^5.0.2"},"children":{"lodash@npm:4.17.21":{"value":{"locator":"lodash@npm:4.17.21","descriptor":"lodash@npm:^4.17.15"},"children":{}}}},"zip-stream@npm:6.0.1":{"value":{"locator":"zip-stream@npm:6.0.1","descriptor":"zip-stream@npm:^6.0.1"},"children":{"archiver-utils@npm:5.0.2":{"value":{"locator":"archiver-utils@npm:5.0.2","descriptor":"archiver-utils@npm:^5.0.0"},"children":{}}}}}}}},"lodash@npm:4.17.21":{"value":{"locator":"lodash@npm:4.17.21","descriptor":"lodash@npm:^4.17.21"},"children":{}},"@sourceacademy/modules-repotools@virtual:420fa510eaf06edbb20ddb72fbcd454e937e7e266b8c6b7a55ab314e0562f2688175809f2b44c78563a0467da21b6d34688fe0020ecef5e669997fe518ee56e1#workspace:lib/repotools":{"value":{"locator":"@sourceacademy/modules-repotools@virtual:420fa510eaf06edbb20ddb72fbcd454e937e7e266b8c6b7a55ab314e0562f2688175809f2b44c78563a0467da21b6d34688fe0020ecef5e669997fe518ee56e1#workspace:lib/repotools","descriptor":"@sourceacademy/modules-repotools@virtual:420fa510eaf06edbb20ddb72fbcd454e937e7e266b8c6b7a55ab314e0562f2688175809f2b44c78563a0467da21b6d34688fe0020ecef5e669997fe518ee56e1#workspace:^"},"children":{}}}} +{"value":"@sourceacademy/modules-github-actions@workspace:.github/actions","children":{"@actions/artifact@npm:2.3.2":{"value":{"locator":"@actions/artifact@npm:2.3.2","descriptor":"@actions/artifact@npm:^2.3.2"},"children":{"archiver@npm:7.0.1":{"value":{"locator":"archiver@npm:7.0.1","descriptor":"archiver@npm:^7.0.1"},"children":{"archiver-utils@npm:5.0.2":{"value":{"locator":"archiver-utils@npm:5.0.2","descriptor":"archiver-utils@npm:^5.0.2"},"children":{"lodash@npm:4.17.21":{"value":{"locator":"lodash@npm:4.17.21","descriptor":"lodash@npm:^4.17.15"},"children":{}}}},"zip-stream@npm:6.0.1":{"value":{"locator":"zip-stream@npm:6.0.1","descriptor":"zip-stream@npm:^6.0.1"},"children":{"archiver-utils@npm:5.0.2":{"value":{"locator":"archiver-utils@npm:5.0.2","descriptor":"archiver-utils@npm:^5.0.0"},"children":{}}}}}}}},"@sourceacademy/modules-repotools@virtual:420fa510eaf06edbb20ddb72fbcd454e937e7e266b8c6b7a55ab314e0562f2688175809f2b44c78563a0467da21b6d34688fe0020ecef5e669997fe518ee56e1#workspace:lib/repotools":{"value":{"locator":"@sourceacademy/modules-repotools@virtual:420fa510eaf06edbb20ddb72fbcd454e937e7e266b8c6b7a55ab314e0562f2688175809f2b44c78563a0467da21b6d34688fe0020ecef5e669997fe518ee56e1#workspace:lib/repotools","descriptor":"@sourceacademy/modules-repotools@virtual:420fa510eaf06edbb20ddb72fbcd454e937e7e266b8c6b7a55ab314e0562f2688175809f2b44c78563a0467da21b6d34688fe0020ecef5e669997fe518ee56e1#workspace:^"},"children":{}},"es-toolkit@npm:1.44.0":{"value":{"locator":"es-toolkit@npm:1.44.0","descriptor":"es-toolkit@npm:^1.44.0"},"children":{}}}} {"value":"@sourceacademy/modules-lib@workspace:lib/modules-lib","children":{"@sourceacademy/modules-buildtools@workspace:lib/buildtools":{"value":{"locator":"@sourceacademy/modules-buildtools@workspace:lib/buildtools","descriptor":"@sourceacademy/modules-buildtools@workspace:^"},"children":{}},"js-slang@npm:1.0.85":{"value":{"locator":"js-slang@npm:1.0.85","descriptor":"js-slang@npm:^1.0.81"},"children":{}}}} -{"value":"@sourceacademy/modules-repotools@workspace:lib/repotools","children":{"lodash@npm:4.17.21":{"value":{"locator":"lodash@npm:4.17.21","descriptor":"lodash@npm:^4.17.21"},"children":{}}}} -{"value":"@sourceacademy/modules@workspace:.","children":{"@sourceacademy/modules-buildtools@workspace:lib/buildtools":{"value":{"locator":"@sourceacademy/modules-buildtools@workspace:lib/buildtools","descriptor":"@sourceacademy/modules-buildtools@workspace:^"},"children":{}},"js-slang@npm:1.0.85":{"value":{"locator":"js-slang@npm:1.0.85","descriptor":"js-slang@npm:^1.0.81"},"children":{}},"lodash@npm:4.17.21":{"value":{"locator":"lodash@npm:4.17.21","descriptor":"lodash@npm:^4.17.21"},"children":{}},"@sourceacademy/lint-plugin@virtual:72a684de9912e8b42da7a581a5478d78ad73e0a505830e61e9b2fbc990fcc10719f71ef5373c26313c28b9295f1381b0d95a4d0ab2ae6e33671c2ba25a5c1dc2#workspace:lib/lintplugin":{"value":{"locator":"@sourceacademy/lint-plugin@virtual:72a684de9912e8b42da7a581a5478d78ad73e0a505830e61e9b2fbc990fcc10719f71ef5373c26313c28b9295f1381b0d95a4d0ab2ae6e33671c2ba25a5c1dc2#workspace:lib/lintplugin","descriptor":"@sourceacademy/lint-plugin@virtual:72a684de9912e8b42da7a581a5478d78ad73e0a505830e61e9b2fbc990fcc10719f71ef5373c26313c28b9295f1381b0d95a4d0ab2ae6e33671c2ba25a5c1dc2#workspace:^"},"children":{}},"@sourceacademy/modules-repotools@virtual:72a684de9912e8b42da7a581a5478d78ad73e0a505830e61e9b2fbc990fcc10719f71ef5373c26313c28b9295f1381b0d95a4d0ab2ae6e33671c2ba25a5c1dc2#workspace:lib/repotools":{"value":{"locator":"@sourceacademy/modules-repotools@virtual:72a684de9912e8b42da7a581a5478d78ad73e0a505830e61e9b2fbc990fcc10719f71ef5373c26313c28b9295f1381b0d95a4d0ab2ae6e33671c2ba25a5c1dc2#workspace:lib/repotools","descriptor":"@sourceacademy/modules-repotools@virtual:72a684de9912e8b42da7a581a5478d78ad73e0a505830e61e9b2fbc990fcc10719f71ef5373c26313c28b9295f1381b0d95a4d0ab2ae6e33671c2ba25a5c1dc2#workspace:^"},"children":{}}}} +{"value":"@sourceacademy/modules-repotools@workspace:lib/repotools","children":{"es-toolkit@npm:1.44.0":{"value":{"locator":"es-toolkit@npm:1.44.0","descriptor":"es-toolkit@npm:^1.44.0"},"children":{}}}} +{"value":"@sourceacademy/modules@workspace:.","children":{"@sourceacademy/modules-buildtools@workspace:lib/buildtools":{"value":{"locator":"@sourceacademy/modules-buildtools@workspace:lib/buildtools","descriptor":"@sourceacademy/modules-buildtools@workspace:^"},"children":{}},"js-slang@npm:1.0.85":{"value":{"locator":"js-slang@npm:1.0.85","descriptor":"js-slang@npm:^1.0.81"},"children":{}},"@sourceacademy/lint-plugin@virtual:72a684de9912e8b42da7a581a5478d78ad73e0a505830e61e9b2fbc990fcc10719f71ef5373c26313c28b9295f1381b0d95a4d0ab2ae6e33671c2ba25a5c1dc2#workspace:lib/lintplugin":{"value":{"locator":"@sourceacademy/lint-plugin@virtual:72a684de9912e8b42da7a581a5478d78ad73e0a505830e61e9b2fbc990fcc10719f71ef5373c26313c28b9295f1381b0d95a4d0ab2ae6e33671c2ba25a5c1dc2#workspace:lib/lintplugin","descriptor":"@sourceacademy/lint-plugin@virtual:72a684de9912e8b42da7a581a5478d78ad73e0a505830e61e9b2fbc990fcc10719f71ef5373c26313c28b9295f1381b0d95a4d0ab2ae6e33671c2ba25a5c1dc2#workspace:^"},"children":{}},"@sourceacademy/modules-repotools@virtual:72a684de9912e8b42da7a581a5478d78ad73e0a505830e61e9b2fbc990fcc10719f71ef5373c26313c28b9295f1381b0d95a4d0ab2ae6e33671c2ba25a5c1dc2#workspace:lib/repotools":{"value":{"locator":"@sourceacademy/modules-repotools@virtual:72a684de9912e8b42da7a581a5478d78ad73e0a505830e61e9b2fbc990fcc10719f71ef5373c26313c28b9295f1381b0d95a4d0ab2ae6e33671c2ba25a5c1dc2#workspace:lib/repotools","descriptor":"@sourceacademy/modules-repotools@virtual:72a684de9912e8b42da7a581a5478d78ad73e0a505830e61e9b2fbc990fcc10719f71ef5373c26313c28b9295f1381b0d95a4d0ab2ae6e33671c2ba25a5c1dc2#workspace:^"},"children":{}},"es-toolkit@npm:1.44.0":{"value":{"locator":"es-toolkit@npm:1.44.0","descriptor":"es-toolkit@npm:^1.44.0"},"children":{}}}} {"value":"@sourceacademy/tab-ArcadeTwod@workspace:src/tabs/ArcadeTwod","children":{"@sourceacademy/modules-buildtools@workspace:lib/buildtools":{"value":{"locator":"@sourceacademy/modules-buildtools@workspace:lib/buildtools","descriptor":"@sourceacademy/modules-buildtools@workspace:^"},"children":{}},"@sourceacademy/modules-lib@workspace:lib/modules-lib":{"value":{"locator":"@sourceacademy/modules-lib@workspace:lib/modules-lib","descriptor":"@sourceacademy/modules-lib@workspace:^"},"children":{}}}} {"value":"@sourceacademy/tab-AugmentedReality@workspace:src/tabs/AugmentedReality","children":{"@sourceacademy/bundle-ar@workspace:src/bundles/ar":{"value":{"locator":"@sourceacademy/bundle-ar@workspace:src/bundles/ar","descriptor":"@sourceacademy/bundle-ar@workspace:^"},"children":{}},"@sourceacademy/modules-buildtools@workspace:lib/buildtools":{"value":{"locator":"@sourceacademy/modules-buildtools@workspace:lib/buildtools","descriptor":"@sourceacademy/modules-buildtools@workspace:^"},"children":{}},"@sourceacademy/modules-lib@workspace:lib/modules-lib":{"value":{"locator":"@sourceacademy/modules-lib@workspace:lib/modules-lib","descriptor":"@sourceacademy/modules-lib@workspace:^"},"children":{}}}} {"value":"@sourceacademy/tab-CopyGc@workspace:src/tabs/CopyGc","children":{"@sourceacademy/bundle-copy_gc@workspace:src/bundles/copy_gc":{"value":{"locator":"@sourceacademy/bundle-copy_gc@workspace:src/bundles/copy_gc","descriptor":"@sourceacademy/bundle-copy_gc@workspace:^"},"children":{}},"@sourceacademy/modules-buildtools@workspace:lib/buildtools":{"value":{"locator":"@sourceacademy/modules-buildtools@workspace:lib/buildtools","descriptor":"@sourceacademy/modules-buildtools@workspace:^"},"children":{}},"@sourceacademy/modules-lib@workspace:lib/modules-lib":{"value":{"locator":"@sourceacademy/modules-lib@workspace:lib/modules-lib","descriptor":"@sourceacademy/modules-lib@workspace:^"},"children":{}}}} diff --git a/.github/actions/src/commons.ts b/.github/actions/src/commons.ts index 4d02975ea7..bd3185a2a4 100644 --- a/.github/actions/src/commons.ts +++ b/.github/actions/src/commons.ts @@ -1,5 +1,5 @@ import { getExecOutput } from '@actions/exec'; -import memoize from 'lodash/memoize.js'; +import { memoize } from 'es-toolkit'; export interface RawPackageRecord { directory: string; diff --git a/.github/actions/src/info/__tests__/index.test.ts b/.github/actions/src/info/__tests__/index.test.ts index 0effab3c01..83126337a7 100644 --- a/.github/actions/src/info/__tests__/index.test.ts +++ b/.github/actions/src/info/__tests__/index.test.ts @@ -55,7 +55,7 @@ const mockDirectory: Record> = { 'package.json': JSON.stringify({ name: '@sourceacademy/tab-Tab0', dependencies: { - lodash: '^4.1.1', + 'lodash': '^4.17.20', '@sourceacademy/bundle-bundle0': 'workspace:^', }, devDependencies: { diff --git a/.github/actions/src/lockfiles.ts b/.github/actions/src/lockfiles.ts index 59656f3c5b..d8c47e7760 100644 --- a/.github/actions/src/lockfiles.ts +++ b/.github/actions/src/lockfiles.ts @@ -2,7 +2,7 @@ import fs from 'fs/promises'; import pathlib from 'path'; import * as core from '@actions/core'; import { getExecOutput } from '@actions/exec'; -import memoize from 'lodash/memoize.js'; +import { memoize } from 'es-toolkit'; import { extractPkgsFromYarnLockV2 } from 'snyk-nodejs-lockfile-parser'; import { gitRoot } from './gitRoot.js'; diff --git a/devserver/src/components/ControlButton.tsx b/devserver/src/components/ControlButton.tsx index c23e24921f..c99036c313 100644 --- a/devserver/src/components/ControlButton.tsx +++ b/devserver/src/components/ControlButton.tsx @@ -1,4 +1,4 @@ -import { AnchorButton, Button, Icon, Intent, type IconName } from '@blueprintjs/core'; +import { AnchorButton, Button, Icon, Intent, type IconProps } from '@blueprintjs/core'; import React from 'react'; type ButtonOptions = { @@ -13,7 +13,7 @@ type ButtonOptions = { type ControlButtonProps = { label?: string; - icon?: IconName; + icon?: IconProps['icon']; onClick?: () => void; options?: Partial; isDisabled?: boolean; diff --git a/devserver/src/components/Playground.tsx b/devserver/src/components/Playground.tsx index 783e7df7eb..763a9daa4f 100644 --- a/devserver/src/components/Playground.tsx +++ b/devserver/src/components/Playground.tsx @@ -1,9 +1,10 @@ import { Button, Classes, Intent, OverlayToaster, Popover, Tooltip, type ToastProps } from '@blueprintjs/core'; -import { IconNames } from '@blueprintjs/icons'; +import { Settings } from '@blueprintjs/icons'; import classNames from 'classnames'; import { SourceDocumentation, getNames, runInContext, type Context } from 'js-slang'; // Importing this straight from js-slang doesn't work for whatever reason import createContext from 'js-slang/dist/createContext'; +import { ModuleInternalError } from 'js-slang/dist/modules/errors'; import { setModulesStaticURL } from 'js-slang/dist/modules/loader'; import { Chapter, Variant } from 'js-slang/dist/types'; import { stringify } from 'js-slang/dist/utils/stringify'; @@ -159,6 +160,12 @@ const Playground: React.FC = () => { value: stringify(result.value) }); } else if (result.status === 'error') { + codeContext.errors.forEach(error => { + if (error instanceof ModuleInternalError) { + console.error(error.error); + } + }); + setReplOutput({ type: 'errors', errors: codeContext.errors, @@ -210,7 +217,7 @@ const Playground: React.FC = () => { diff --git a/src/tabs/Pixnflix/index.tsx b/src/tabs/Pixnflix/index.tsx index 5f229355f9..a2fe645381 100644 --- a/src/tabs/Pixnflix/index.tsx +++ b/src/tabs/Pixnflix/index.tsx @@ -1,5 +1,5 @@ import { Button, ButtonGroup, Divider, NumericInput } from '@blueprintjs/core'; -import { IconNames } from '@blueprintjs/icons'; +import { Camera, HorizontalDistribution, Stopwatch, VerticalDistribution, Video } from '@blueprintjs/icons'; import { DEFAULT_FPS, DEFAULT_HEIGHT, @@ -288,14 +288,14 @@ class PixNFlix extends React.Component {