diff --git a/.github/actions/package.json b/.github/actions/package.json index 91d98d431..bd42456b5 100644 --- a/.github/actions/package.json +++ b/.github/actions/package.json @@ -13,11 +13,14 @@ "@actions/artifact": "^2.3.2", "@actions/core": "^1.11.1", "@actions/exec": "^1.1.1", + "@yarnpkg/cli": "^4.12.0", + "@yarnpkg/core": "^4.5.0", + "@yarnpkg/fslib": "^3.1.4", "lodash": "^4.17.21", "snyk-nodejs-lockfile-parser": "^2.4.2" }, "scripts": { - "build": "node ./build.js", + "build": "node ./build.js --dev", "postinstall": "yarn build", "test": "vitest", "tsc": "tsc --project ./tsconfig.json" diff --git a/.github/actions/src/__tests__/commons.test.ts b/.github/actions/src/__tests__/commons.test.ts index 82447d648..06ecd85ab 100644 --- a/.github/actions/src/__tests__/commons.test.ts +++ b/.github/actions/src/__tests__/commons.test.ts @@ -1,5 +1,5 @@ import * as exec from '@actions/exec'; -import { describe, expect, it, test, vi } from 'vitest'; +import { describe, expect, it, vi } from 'vitest'; import * as commons from '../commons.js'; vi.mock(import('lodash/memoize.js'), () => ({ @@ -28,65 +28,3 @@ describe(commons.checkDirForChanges, () => { expect(mockedExecOutput).toHaveBeenCalledOnce(); }); }); - -describe(commons.isPackageRecord, () => { - test('no bundleName or tabName property is ok', () => { - expect(commons.isPackageRecord({ - directory: '', - name: '', - changes: false, - needsPlaywright: false - })).toEqual(true); - }); - - test('string bundleName property is ok', () => { - expect(commons.isPackageRecord({ - directory: '', - name: '', - changes: false, - needsPlaywright: false, - bundleName: '' - })).toEqual(true); - }); - - test('non-string bundleName property is not ok', () => { - expect(commons.isPackageRecord({ - directory: '', - name: '', - changes: false, - needsPlaywright: false, - bundleName: 0 - })).toEqual(false); - }); - - test('string tabName property is ok', () => { - expect(commons.isPackageRecord({ - directory: '', - name: '', - changes: false, - needsPlaywright: false, - tabName: '' - })).toEqual(true); - }); - - test('non-string tabName property is not ok', () => { - expect(commons.isPackageRecord({ - directory: '', - name: '', - changes: false, - needsPlaywright: false, - tabName: 0 - })).toEqual(false); - }); - - test('having both bundleName and tabName property is not ok', () => { - expect(commons.isPackageRecord({ - directory: '', - name: '', - changes: false, - needsPlaywright: false, - tabName: '', - bundleName: '' - })).toEqual(false); - }); -}); diff --git a/.github/actions/src/commons.ts b/.github/actions/src/commons.ts index 4d02975ea..e6eb03e52 100644 --- a/.github/actions/src/commons.ts +++ b/.github/actions/src/commons.ts @@ -1,65 +1,6 @@ import { getExecOutput } from '@actions/exec'; import memoize from 'lodash/memoize.js'; -export interface RawPackageRecord { - directory: string; - hasChanges: boolean; - package: { - name: string; - devDependencies: Record; - dependencies: Record; - }; -} - -interface BasePackageRecord { - /** - * Directory within which the `package.json` file was found - */ - directory: string; - - /** - * Full scoped package name - */ - name: string; - /** - * `true` if git detected changes from within the package's subdirectories, - * `false` otherwise - */ - changes: boolean; - /** - * `true` if playwright is present under devDependencies. This means that the package - * might need playwright for its tests - */ - needsPlaywright: boolean; -} - -export interface BundlePackageRecord extends BasePackageRecord { - bundleName: string; -} - -export interface TabPackageRecord extends BasePackageRecord { - tabName: string; -} - -export type PackageRecord = BundlePackageRecord | TabPackageRecord | BasePackageRecord; - -export function isPackageRecord(obj: unknown): obj is PackageRecord { - if (typeof obj !== 'object' || obj === null) return false; - - if (!('directory' in obj) || typeof obj.directory !== 'string') return false; - if (!('name' in obj) || typeof obj.name !== 'string') return false; - if (!('changes' in obj) || typeof obj.changes !== 'boolean') return false; - if (!('needsPlaywright' in obj) || typeof obj.needsPlaywright !== 'boolean') return false; - - if ('bundleName' in obj) { - if ('tabName' in obj || typeof obj.bundleName !== 'string') return false; - } else if ('tabName' in obj) { - if (typeof obj.tabName !== 'string') return false; - } - - return true; -} - /** * Returns `true` if there are changes present in the given directory relative to * the master branch\ @@ -71,7 +12,8 @@ export const checkDirForChanges = memoize(async (directory: string) => { ['--no-pager', 'diff', '--quiet', 'origin/master', '--', directory], { failOnStdErr: false, - ignoreReturnCode: true + ignoreReturnCode: true, + silent: true } ); return exitCode !== 0; diff --git a/.github/actions/src/info/__tests__/index.test.ts b/.github/actions/src/info/__tests__/index.test.ts deleted file mode 100644 index 0effab3c0..000000000 --- a/.github/actions/src/info/__tests__/index.test.ts +++ /dev/null @@ -1,251 +0,0 @@ -import type { Dirent } from 'fs'; -import fs from 'fs/promises'; -import pathlib from 'path'; -import * as core from '@actions/core'; -import { describe, expect, test, vi } from 'vitest'; -import * as git from '../../commons.js'; -import * as lockfiles from '../../lockfiles.js'; -import { getAllPackages, getRawPackages, main } from '../index.js'; - -const mockedCheckChanges = vi.spyOn(git, 'checkDirForChanges'); - -vi.mock(import('path'), async importOriginal => { - const { posix } = await importOriginal(); - - return { - default: posix, - posix, - }; -}); - -vi.mock(import('../../gitRoot.js'), () => ({ - gitRoot: 'root' -})); - -class NodeError extends Error { - constructor(public readonly code: string) { - super(); - } -} - -const mockDirectory: Record> = { - 'package.json': JSON.stringify({ - name: '@sourceacademy/modules' - }), - lib: { - 'modules-lib': { - 'package.json': JSON.stringify({ - name: '@sourceacademy/modules-lib' - }), - } - }, - src: { - bundles: { - bundle0: { - 'package.json': JSON.stringify({ - name: '@sourceacademy/bundle-bundle0', - devDependencies: { - '@sourceacademy/modules-lib': 'workspace:^', - } - }) - }, - }, - tabs: { - tab0: { - 'package.json': JSON.stringify({ - name: '@sourceacademy/tab-Tab0', - dependencies: { - lodash: '^4.1.1', - '@sourceacademy/bundle-bundle0': 'workspace:^', - }, - devDependencies: { - playwright: '^1.54.0' - } - }) - } - } - } -}; - -function mockReaddir(path: string) { - function recurser(segments: string[], obj: string | Record): Promise { - if (segments.length === 0) { - if (typeof obj === 'string') throw new NodeError('ENOTDIR'); - - const dirents = Object.entries(obj) - .map(([name, each]): Dirent => { - if (typeof each === 'string') { - return { - isFile: () => true, - isDirectory: () => false, - name, - } as Dirent; - } - - return { - isFile: () => false, - isDirectory: () => true, - name - } as Dirent; - }); - - return Promise.resolve(dirents); - } - - if (typeof obj === 'string') throw new NodeError('ENOENT'); - - const [seg0, ...remainingSegments] = segments; - return recurser(remainingSegments, obj[seg0] as string | Record); - } - - const segments = path.split(pathlib.sep); - return recurser(segments, { root: mockDirectory }); -} - -function mockReadFile(path: string) { - function recurser(segments: string[], obj: string | Record): Promise { - if (segments.length === 0) { - if (typeof obj !== 'string') throw new NodeError('EISDIR'); - return Promise.resolve(obj); - } - - if (typeof obj === 'string') throw new NodeError('ENOENT'); - - const [seg0, ...remainingSegments] = segments; - return recurser(remainingSegments, obj[seg0] as string | Record); - } - - const segments = path.split(pathlib.sep); - return recurser(segments, { root: mockDirectory }); -} - -vi.spyOn(fs, 'readdir').mockImplementation(mockReaddir as any); -vi.spyOn(fs, 'readFile').mockImplementation(mockReadFile as any); -vi.spyOn(lockfiles, 'hasLockFileChanged').mockResolvedValue(false); - -describe(getRawPackages, () => { - test('maxDepth = 1', async () => { - mockedCheckChanges.mockResolvedValueOnce(true); - const results = Object.entries(await getRawPackages('root', 1)); - expect(fs.readdir).toHaveBeenCalledTimes(3); - expect(results.length).toEqual(1); - - const [[name, packageData]] = results; - expect(name).toEqual('@sourceacademy/modules'); - expect(packageData.hasChanges).toEqual(true); - expect(git.checkDirForChanges).toHaveBeenCalledOnce(); - }); - - test('maxDepth = 3', async () => { - mockedCheckChanges.mockResolvedValue(true); - const results = await getRawPackages('root', 3); - expect(Object.values(results).length).toEqual(4); - expect(fs.readdir).toHaveBeenCalledTimes(8); - - expect(results).toHaveProperty('@sourceacademy/bundle-bundle0'); - const bundleResult = results['@sourceacademy/bundle-bundle0']; - expect(bundleResult.hasChanges).toEqual(true); - - expect(results).toHaveProperty('@sourceacademy/tab-Tab0'); - const tabResult = results['@sourceacademy/tab-Tab0']; - expect(tabResult.hasChanges).toEqual(true); - - expect(results).toHaveProperty('@sourceacademy/modules-lib'); - const libResult = results['@sourceacademy/modules-lib']; - expect(libResult.hasChanges).toEqual(true); - }); - - test('hasChanges fields accurately reflects value returned from checkChanges', async () => { - mockedCheckChanges.mockImplementation(p => { - switch (p) { - case 'root/src/bundles/bundle0': - return Promise.resolve(false); - case 'root/src/tabs/tab0': - return Promise.resolve(false); - case 'root': - return Promise.resolve(true); - } - - return Promise.resolve(false); - }); - - const results = await getRawPackages('root'); - expect(Object.keys(results).length).toEqual(4); - - expect(results).toHaveProperty('@sourceacademy/modules'); - expect(results['@sourceacademy/modules'].hasChanges).toEqual(true); - - expect(results).toHaveProperty('@sourceacademy/bundle-bundle0'); - expect(results['@sourceacademy/bundle-bundle0'].hasChanges).toEqual(false); - - expect(results).toHaveProperty('@sourceacademy/tab-Tab0'); - expect(results['@sourceacademy/tab-Tab0'].hasChanges).toEqual(false); - - expect(results).toHaveProperty('@sourceacademy/modules-lib'); - expect(results['@sourceacademy/modules-lib'].hasChanges).toEqual(false); - }); -}); - -describe(getAllPackages, () => { - test('Transitive change dependencies', async () => { - mockedCheckChanges.mockImplementation(p => { - switch (p) { - case 'root/lib/modules-lib': - return Promise.resolve(true); - case 'root/src/bundles/bundle0': - return Promise.resolve(false); - case 'root/src/tabs/tab0': - return Promise.resolve(false); - case 'root': - return Promise.resolve(false); - } - - return Promise.resolve(false); - }); - - const { packages: results } = await getAllPackages('root'); - expect(Object.keys(results).length).toEqual(4); - - expect(results).toHaveProperty('@sourceacademy/modules'); - expect(results['@sourceacademy/modules'].changes).toEqual(false); - - expect(results).toHaveProperty('@sourceacademy/bundle-bundle0'); - expect(results['@sourceacademy/bundle-bundle0'].changes).toEqual(true); - - expect(results).toHaveProperty('@sourceacademy/tab-Tab0'); - expect(results['@sourceacademy/tab-Tab0'].changes).toEqual(true); - - expect(results).toHaveProperty('@sourceacademy/modules-lib'); - expect(results['@sourceacademy/modules-lib'].changes).toEqual(true); - }); -}); - -describe(main, () => { - const mockedSetOutput = vi.spyOn(core, 'setOutput'); - - vi.spyOn(core.summary, 'addHeading').mockImplementation(() => core.summary); - vi.spyOn(core.summary, 'addTable').mockImplementation(() => core.summary); - vi.spyOn(core.summary, 'write').mockImplementation(() => Promise.resolve(core.summary)); - - test('Does not write packages with no changes to the output', async () => { - mockedCheckChanges.mockImplementation(path => { - return Promise.resolve(path === 'root/src/tabs/tab0'); - }); - - await main(); - const { mock: { calls } } = mockedSetOutput; - - expect(mockedSetOutput).toHaveBeenCalledTimes(6); - - expect(calls[0]).toEqual(['bundles', []]); - expect(calls[1]).toEqual(['tabs', [expect.objectContaining({ changes: true })]]); - expect(calls[2]).toEqual(['libs', []]); - - // These next two are undefined because the mock implementations - // don't return any info about them - expect(calls[3]).toEqual(['devserver', undefined]); - expect(calls[4]).toEqual(['docserver', undefined]); - - expect(calls[5]).toEqual(['workflows', false]); - }); -}); diff --git a/.github/actions/src/info/__tests__/sorter.test.ts b/.github/actions/src/info/__tests__/sorter.test.ts deleted file mode 100644 index 1c44383fd..000000000 --- a/.github/actions/src/info/__tests__/sorter.test.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { describe, expect, test } from 'vitest'; -import { topoSortPackages } from '../sorter.js'; - -describe(topoSortPackages, () => { - test('Without a cycle', () => { - const result = topoSortPackages({ - '@sourceacademy/0': { - hasChanges: false, - directory: '/', - package: { - name: '@sourceacademy/0', - devDependencies: { - '@sourceacademy/1': 'workspace:^' - }, - dependencies: {} - } - }, - '@sourceacademy/1': { - hasChanges: false, - directory: '/', - package: { - name: '@sourceacademy/1', - devDependencies: { - '@sourceacademy/2': 'workspace:^' - }, - dependencies: {} - } - }, - '@sourceacademy/2': { - hasChanges: false, - directory: '/', - package: { - name: '@sourceacademy/2', - devDependencies: {}, - dependencies: {} - } - } - }); - - expect(result).toEqual([ - '@sourceacademy/2', - '@sourceacademy/1', - '@sourceacademy/0', - ]); - }); - - test('With a cycle', () => { - const func = () => topoSortPackages({ - '@sourceacademy/0': { - hasChanges: false, - directory: '/', - package: { - name: '@sourceacademy/0', - devDependencies: { - '@sourceacademy/1': 'workspace:^' - }, - dependencies: {} - } - }, - '@sourceacademy/1': { - hasChanges: false, - directory: '/', - package: { - name: '@sourceacademy/1', - devDependencies: { - '@sourceacademy/2': 'workspace:^' - }, - dependencies: {} - } - }, - '@sourceacademy/2': { - hasChanges: false, - directory: '/', - package: { - name: '@sourceacademy/2', - devDependencies: {}, - dependencies: { - '@sourceacademy/0': 'workspace:^' - } - } - } - }); - - expect(func).toThrowError('Dependency graph has a cycle!'); - }); -}); diff --git a/.github/actions/src/info/index.ts b/.github/actions/src/info/index.ts index d84751e6b..10ab1ac95 100644 --- a/.github/actions/src/info/index.ts +++ b/.github/actions/src/info/index.ts @@ -1,209 +1,213 @@ -import fs from 'fs/promises'; import pathlib from 'path'; -import utils from 'util'; import * as core from '@actions/core'; import type { SummaryTableRow } from '@actions/core/lib/summary.js'; +import { getPluginConfiguration } from '@yarnpkg/cli'; +import { Configuration, Project, structUtils, type Workspace } from '@yarnpkg/core'; +import { npath, ppath, type PortablePath } from '@yarnpkg/fslib'; import packageJson from '../../../../package.json' with { type: 'json' }; -import { checkDirForChanges, type PackageRecord, type RawPackageRecord } from '../commons.js'; +import { checkDirForChanges } from '../commons.js'; import { gitRoot } from '../gitRoot.js'; -import { getPackagesWithResolutionChanges, hasLockFileChanged } from '../lockfiles.js'; -import { topoSortPackages } from './sorter.js'; - -const packageNameRE = /^@sourceacademy\/(.+?)-(.+)$/u; /** - * Retrieves the information for all packages in the repository, but in - * an unprocessed format + * Represents all the information we need to know about a + * particular workspace in this repository */ -export async function getRawPackages(gitRoot: string, maxDepth?: number) { - let packagesWithResolutionChanges: string[] | null = null; - - // If there are lock file changes we need to set hasChanges to true for - // that package even if that package's directory has no changes - if (await hasLockFileChanged()) { - packagesWithResolutionChanges = await getPackagesWithResolutionChanges(); - } +interface BasePackageInformation { + /** + * Type field for indicating what kind of package this is + * (library, tab, bundle or none of the above) + */ + type: T; - const output: Record = {}; + /** + * The full scoped name of the package + */ + name: string; /** - * Search the given directory for package.json files + * The path to the directory containing the package, relative to + * the git root */ - async function recurser(currentDir: string, currentDepth: number) { - const items = await fs.readdir(currentDir, { withFileTypes: true }); - await Promise.all(items.map(async item => { - if (item.isFile()) { - if (item.name === 'package.json') { - try { - const [hasChanges, packageJson] = await Promise.all([ - checkDirForChanges(currentDir), - fs.readFile(pathlib.join(currentDir, 'package.json'), 'utf-8') - .then(JSON.parse) - ]); - - output[packageJson.name] = { - directory: currentDir, - hasChanges: hasChanges || !!packagesWithResolutionChanges?.includes(packageJson.name), - package: packageJson - }; - } catch (error) { - if (!utils.types.isNativeError(error)) { - core.error(`Unknown error occurred ${error}`); - throw error; - } - - if ('code' in error && error.code !== 'ENOENT') { - core.error(error); - throw error; - } - console.error(error); - } - } - return; - } + directory: PortablePath; - if ( - (maxDepth === undefined || currentDepth < maxDepth) && - item.isDirectory() && - item.name !== 'node_modules' && - !item.name.startsWith('__') - ) { - const fullPath = pathlib.join(currentDir, item.name); - await recurser(fullPath, currentDepth + 1); - } - })); - } + /** + * Boolean value indicating if there were any changes made to the + * package relative to the version present on the master branch + */ + hasChanges: boolean; - await recurser(gitRoot, 0); - return output; + /** + * Boolean value indicating if the package relies on Playwright + * (and thus requires an extra setup step) + */ + needsPlaywright: boolean; } /** - * Combines the two objects by using the keys from the LHS - * to index the RHS object. The result will have the keys of the LHS - * mapped to the values on the RHS object. + * Represents a library package */ -function mergeObjects< - RHS extends Record, - LHS extends Record ->(lhs: LHS, rhs: RHS) { - return Object.keys(lhs).reduce((res, key) => ({ - ...res, - [key]: rhs[key] - }), {} as Record); -} +type LibPackageInformation = BasePackageInformation<'lib'>; /** - * Iterate through the packages in topological order to determine, based on its dependencies, if it - * has changes and thus needs to be rebuilt + * Represents a bundle package */ -export function processRawPackages(topoOrder: string[], packages: Record) { - return topoOrder.reduce>((res, packageName) => { - const packageInfo = packages[packageName]; - - // Check each dependency if it has changes. Because this is done in topological order - // these fields should already be their most accurate values - if (!packageInfo.hasChanges) { - if (packageInfo.package.dependencies) { - for (const name of Object.keys(packageInfo.package.dependencies)) { - if (packages[name]?.hasChanges) { - packageInfo.hasChanges = true; - break; - } - } - } +type BundlePackageInformation = BasePackageInformation<'bundle'> & { + bundleName: string; +}; - // If hasChanges still hasn't been set yet, we can proceed to iterate - // through devDependencies as well - if (!packageInfo.hasChanges && packageInfo.package.devDependencies) { - for (const name of Object.keys(packageInfo.package.devDependencies)) { - if (packages[name]?.hasChanges) { - packageInfo.hasChanges = true; - break; - } - } - } - } +/** + * Represents a tab package + */ +type TabPackageInformation = BasePackageInformation<'tab'> & { + tabName: string; +}; - const needsPlaywright = - packageInfo.package.devDependencies !== undefined && - 'playwright' in packageInfo.package.devDependencies; - - if (packageName !== '@sourceacademy/modules') { - const match = packageNameRE.exec(packageName); - if (!match) throw new Error(`Unknown package ${packageName}`); - - const [, packageType, baseName] = match; - - switch (packageType) { - case 'bundle': - return { - ...res, - [packageName]: { - changes: packageInfo.hasChanges, - directory: packageInfo.directory, - name: packageName, - needsPlaywright, - bundleName: baseName, - } - }; - case 'tab': - return { - ...res, - [packageName]: { - changes: packageInfo.hasChanges, - directory: packageInfo.directory, - name: packageName, - needsPlaywright, - tabName: baseName, - } - }; - } - } +/** + * Represents the 4 types of packages that can be found in this workspace + */ +type PackageInformation = + BasePackageInformation | + BundlePackageInformation | + LibPackageInformation | + TabPackageInformation; - return { - ...res, - [packageName]: { - changes: packageInfo.hasChanges, - directory: packageInfo.directory, - name: packageName, - needsPlaywright - } - }; - }, {}); +const moduleNameRE = /(bundle|tab)-(.+)/u; + +type DeterminePkgResult = ['bundle' | 'tab', string] | ['lib' | null, null]; + +/** + * Function for determining what the type of the package in the given workspace is + */ +function determinePkgType(workspace: Workspace, libDir: PortablePath): DeterminePkgResult { + const { manifest: { name } } = workspace; + const match = moduleNameRE.exec(name!.name); + + if (match) { + const [, assetType, assetName] = match; + return [assetType as 'tab' | 'bundle', assetName]; + } + + // If the workspace was found under the lib folder, we consider it a 'library' + const libPath = ppath.relative(libDir, workspace.cwd); + if (libPath.startsWith('.')) return ['lib', null]; + + return [null, null]; } /** * Retrieve all packages from within the git repository, sorted into the different types */ -export async function getAllPackages(gitRoot: string) { - const [ - bundles, - tabs, - libs, - rootPackages - ] = await Promise.all([ - getRawPackages(pathlib.join(gitRoot, 'src', 'bundles')), - getRawPackages(pathlib.join(gitRoot, 'src', 'tabs')), - getRawPackages(pathlib.join(gitRoot, 'lib')), - getRawPackages(pathlib.join(gitRoot), 1) - ]); +export async function getAllPackages(rawGitRoot: string) { + const gitRoot = npath.toPortablePath(rawGitRoot); - const packages = { - ...rootPackages, - ...bundles, - ...tabs, - ...libs - }; + const pluginConfig = getPluginConfiguration(); + const config = await Configuration.find(gitRoot, pluginConfig); + const { project } = await Project.find(config, gitRoot); + + const libDir = ppath.join(gitRoot, 'lib'); + const playwright = structUtils.makeIdent(null, 'playwright'); - const sort = topoSortPackages(packages); - const processed = processRawPackages(sort, packages); + const bundles: Record = {}; + const tabs: Record = {}; + const libs: Record = {}; + const packages: Record = {}; + + /** + * Retrieves all the information for the given workspace and recursively + * processes workspaces it is dependent upon. + * + * Returns a boolean value indicating if changes were detected for the + * given workspace, or any changes were detected in its dependencies. + */ + async function processWorkspace(workspace: Workspace): Promise { + const currentDir = workspace.cwd; + const name = workspace.manifest.name; + if (!name) { + throw new Error(`Workspace at ${currentDir} has no name!`); + } + + if (name.scope !== 'sourceacademy') { + throw new Error(`Unknown package scope ${name.scope} at ${currentDir}`); + } + + // Ignore the root package + if (name.name === 'modules') return false; + + if (name.name in packages) { + return packages[name.name].hasChanges; + } + + const scopedName = `@${name.scope}/${name.name}`; + const needsPlaywright = workspace.manifest.hasDependency(playwright); + + let pkgInfo: PackageInformation; + const [pkgType, assetName] = determinePkgType(workspace, libDir); + switch (pkgType) { + case 'bundle': { + pkgInfo = { + name: scopedName, + directory: currentDir, + hasChanges: false, + needsPlaywright, + type: pkgType, + bundleName: assetName + }; + bundles[name.name] = pkgInfo; + break; + } + case 'tab': { + pkgInfo = { + name: scopedName, + directory: currentDir, + hasChanges: false, + needsPlaywright, + type: pkgType, + tabName: assetName + }; + tabs[name.name] = pkgInfo; + break; + } + case 'lib': { + pkgInfo = { + name: scopedName, + directory: currentDir, + hasChanges: false, + needsPlaywright, + type: pkgType + }; + libs[name.name] = pkgInfo; + break; + } + case null: { + pkgInfo = { + name: scopedName, + directory: currentDir, + hasChanges: false, + needsPlaywright, + type: null + }; + break; + } + default: + throw new Error(`Unknown pkgType: ${pkgType}`); + } + + packages[name.name] = pkgInfo; + + const dependentChanges = await Promise.all([...workspace.getRecursiveWorkspaceDependencies()].map(processWorkspace)); + const result = dependentChanges.some(x => x) || await checkDirForChanges(currentDir); + + packages[name.name].hasChanges = result; + return result; + } + + await Promise.all(project.workspaces.map(processWorkspace)); return { - bundles: mergeObjects(bundles, processed), - tabs: mergeObjects(tabs, processed), - libs: mergeObjects(libs, processed), - packages: processed + bundles, + tabs, + libs, + packages }; } @@ -212,15 +216,15 @@ export async function getAllPackages(gitRoot: string) { * for type safety */ function setOutputs( - bundles: PackageRecord[], - tabs: PackageRecord[], - libs: PackageRecord[], - devserver: PackageRecord, - docserver: PackageRecord + bundles: BundlePackageInformation[], + tabs: TabPackageInformation[], + libs: LibPackageInformation[], + devserver: PackageInformation, + docserver: PackageInformation, ) { - core.setOutput('bundles', bundles.filter(x => x.changes)); - core.setOutput('tabs', tabs.filter(x => x.changes)); - core.setOutput('libs', libs.filter(x => x.changes)); + core.setOutput('bundles', bundles.filter(x => x.hasChanges)); + core.setOutput('tabs', tabs.filter(x => x.hasChanges)); + core.setOutput('libs', libs.filter(x => x.hasChanges)); core.setOutput('devserver', devserver); core.setOutput('docserver', docserver); } @@ -238,7 +242,7 @@ export async function main() { return [ `${packageInfo.name}`, `${relpath}`, - `${packageInfo.changes ? 'true' : 'false'}`, + `${packageInfo.hasChanges ? 'true' : 'false'}`, `${packageInfo.needsPlaywright ? 'true' : 'false'}` ]; }); @@ -279,10 +283,11 @@ export async function main() { } if (process.env.GITHUB_ACTIONS) { - // Only automatically execute when running in github actions + // Only run automatically when it CI/CD environment try { await main(); } catch (error: any) { core.setFailed(error); + throw error; } } diff --git a/.github/actions/src/info/sorter.ts b/.github/actions/src/info/sorter.ts deleted file mode 100644 index c1b70bd15..000000000 --- a/.github/actions/src/info/sorter.ts +++ /dev/null @@ -1,68 +0,0 @@ -import type { RawPackageRecord } from '../commons.js'; - -/** - * Based on the dependencies and devDependencies fields of packages, create a topological - * sorting that begins with packages with no dependencies first. - */ -export function topoSortPackages(packages: Record) { - const nodeCount = Object.keys(packages).length; - const indegrees: Record = {}; - const neighbours: Record = {}; - - // Build the graph - for (const [packageName, { package: { dependencies, devDependencies } }] of Object.entries(packages)) { - if (!(packageName in neighbours)) { - neighbours[packageName] = []; - } - - if (!(packageName in indegrees)) { - indegrees[packageName] = 0; - } - - const keys: string[] = []; - if (dependencies) { - keys.push(...Object.keys(dependencies)); - } - if (devDependencies) { - keys.push(...Object.keys(devDependencies)); - } - - for (const name of keys) { - if (name.startsWith('@sourceacademy')) { - if (!(name in indegrees)) { - indegrees[name] = 1; - } else { - indegrees[name]++; - } - - neighbours[packageName].push(name); - } - } - } - - // Then use Kahn's algorithm for topo sorting - const queue = Object.keys(indegrees).filter(key => indegrees[key] === 0); - const output: string[] = []; - - while (queue.length > 0) { - const node = queue.pop()!; - output.unshift(node); // Packages without dependencies should appear first in the sort - - if (neighbours[node]) { - for (const neighbour of neighbours[node]) { - if (indegrees[neighbour] === 0) continue; - - indegrees[neighbour]--; - if (indegrees[neighbour] === 0) { - queue.push(neighbour); - } - } - } - } - - if (output.length < nodeCount) { - throw new Error('Dependency graph has a cycle!'); - } - - return output; -} diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 785b7ef13..88d4faa8f 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -105,7 +105,7 @@ jobs: uses: ./.github/actions/src/init with: package-name: ${{ matrix.tabInfo.name }} - playwright: ${{ matrix.tabInfo.needsPlaywright && matrix.tabInfo.changes }} + playwright: ${{ matrix.tabInfo.needsPlaywright && matrix.tabInfo.hasChanges }} - name: Build Tab run: | @@ -149,7 +149,7 @@ jobs: uses: ./.github/actions/src/init with: package-name: ${{ matrix.bundleInfo.name }} - playwright: ${{ matrix.bundleInfo.needsPlaywright }} + playwright: ${{ matrix.bundleInfo.needsPlaywright && matrix.bundleInfo.hasChanges }} - name: Build Bundle run: | @@ -178,7 +178,7 @@ jobs: ${{ always() && !cancelled() && - fromJson(needs.find-packages.outputs.devserver).changes && + fromJson(needs.find-packages.outputs.devserver).hasChanges && needs.find-packages.result == 'success' && (needs.find-packages.outputs.tabs == '[]' || needs.tabs.result == 'success') }} @@ -228,7 +228,7 @@ jobs: ${{ always() && !cancelled() && - fromJson(needs.find-packages.outputs.docserver).changes && + fromJson(needs.find-packages.outputs.docserver).hasChanges && needs.find-packages.result == 'success' && (needs.find-packages.outputs.libs == '[]' || needs.libraries.result == 'success') }} @@ -300,8 +300,8 @@ jobs: (needs.find-packages.outputs.libs == '[]' || needs.libraries.result == 'success') && (needs.find-packages.outputs.tabs == '[]' || needs.tabs.result == 'success') && (needs.find-packages.outputs.bundles == '[]' || needs.bundles.result == 'success') && - !(!fromJson(needs.find-packages.outputs.docserver).changes || needs.docserver.result != 'success') && - !(!fromJson(needs.find-packages.outputs.devserver).changes || needs.devserver.result != 'success') && + !(!fromJson(needs.find-packages.outputs.docserver).hasChanges || needs.docserver.result != 'success') && + !(!fromJson(needs.find-packages.outputs.devserver).hasChanges || needs.devserver.result != 'success') && needs.repo-tasks.result == 'success' }} diff --git a/yarn.lock b/yarn.lock index da500ac1a..1aa782b7a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -116,6 +116,31 @@ __metadata: languageName: node linkType: hard +"@algolia/cache-browser-local-storage@npm:4.25.3": + version: 4.25.3 + resolution: "@algolia/cache-browser-local-storage@npm:4.25.3" + dependencies: + "@algolia/cache-common": "npm:4.25.3" + checksum: 10c0/d511fc9d74aaccea5a5be22ca3a99f476573146a6abf3e053f11700c441088c6586a6a584f4b3dba9ea159eaf2da448e7494e566992f813fdbd1875960de42fd + languageName: node + linkType: hard + +"@algolia/cache-common@npm:4.25.3": + version: 4.25.3 + resolution: "@algolia/cache-common@npm:4.25.3" + checksum: 10c0/134d43e96f90701ced24edd029289da504538f73ed7441118ca835e299aaa0902e83a1338b09afe64004b759cd633ecfa8c4f9ede3d0169cc4831d6efe0291cc + languageName: node + linkType: hard + +"@algolia/cache-in-memory@npm:4.25.3": + version: 4.25.3 + resolution: "@algolia/cache-in-memory@npm:4.25.3" + dependencies: + "@algolia/cache-common": "npm:4.25.3" + checksum: 10c0/bc61281f4f481b045fb43a1bd16f677c23c1b8aea5ba8ca7e5cf4816843a705a5115edeebfee60c8f90544f99f312d919daf40db72de52ca5edef7f1cf3d35c9 + languageName: node + linkType: hard + "@algolia/client-abtesting@npm:5.29.0": version: 5.29.0 resolution: "@algolia/client-abtesting@npm:5.29.0" @@ -128,6 +153,29 @@ __metadata: languageName: node linkType: hard +"@algolia/client-account@npm:4.25.3": + version: 4.25.3 + resolution: "@algolia/client-account@npm:4.25.3" + dependencies: + "@algolia/client-common": "npm:4.25.3" + "@algolia/client-search": "npm:4.25.3" + "@algolia/transporter": "npm:4.25.3" + checksum: 10c0/bb718d06febb72ea6bead8c64562a5d804fa878a9ae3a78fafa461eece6bbd0109fddb0ca517add1ef745cee7b5fe736b31f937cabc4fb29e820e8398b6bae9f + languageName: node + linkType: hard + +"@algolia/client-analytics@npm:4.25.3": + version: 4.25.3 + resolution: "@algolia/client-analytics@npm:4.25.3" + dependencies: + "@algolia/client-common": "npm:4.25.3" + "@algolia/client-search": "npm:4.25.3" + "@algolia/requester-common": "npm:4.25.3" + "@algolia/transporter": "npm:4.25.3" + checksum: 10c0/4922f34ecea4f17e56d66a5f34d9d65b685e1c813444ee70db861aa14e8c25ded61e9d7c1555428ca3900500c18b3d7430d99a6299d1cb7b49c6ed06f9649101 + languageName: node + linkType: hard + "@algolia/client-analytics@npm:5.29.0": version: 5.29.0 resolution: "@algolia/client-analytics@npm:5.29.0" @@ -140,6 +188,16 @@ __metadata: languageName: node linkType: hard +"@algolia/client-common@npm:4.25.3": + version: 4.25.3 + resolution: "@algolia/client-common@npm:4.25.3" + dependencies: + "@algolia/requester-common": "npm:4.25.3" + "@algolia/transporter": "npm:4.25.3" + checksum: 10c0/f0865dd8763b5695fd852b3d4fdb9fc1fcc5546235683a8714d97e994ab168cb4184a03fa79eb156daec9c789d3d93baf9f846c47acc6cdda6028b02984e3294 + languageName: node + linkType: hard + "@algolia/client-common@npm:5.29.0": version: 5.29.0 resolution: "@algolia/client-common@npm:5.29.0" @@ -159,6 +217,17 @@ __metadata: languageName: node linkType: hard +"@algolia/client-personalization@npm:4.25.3": + version: 4.25.3 + resolution: "@algolia/client-personalization@npm:4.25.3" + dependencies: + "@algolia/client-common": "npm:4.25.3" + "@algolia/requester-common": "npm:4.25.3" + "@algolia/transporter": "npm:4.25.3" + checksum: 10c0/bf8d1f13805534059354af7597d5a4f5ac7f5415751d4905e7e0f5b367ae6940c557ff35867201ae64b4d7cf1ce6591a0368b319c865a82b497415f8e0353084 + languageName: node + linkType: hard + "@algolia/client-personalization@npm:5.29.0": version: 5.29.0 resolution: "@algolia/client-personalization@npm:5.29.0" @@ -183,6 +252,17 @@ __metadata: languageName: node linkType: hard +"@algolia/client-search@npm:4.25.3": + version: 4.25.3 + resolution: "@algolia/client-search@npm:4.25.3" + dependencies: + "@algolia/client-common": "npm:4.25.3" + "@algolia/requester-common": "npm:4.25.3" + "@algolia/transporter": "npm:4.25.3" + checksum: 10c0/32ad49da60a14d2cfe78f30e9f3e3c57931ba91ccd21d2c5f319c1521b4a173c6ee6510d53557ef7831f964000401fd9fa02d853a2dbf00dd4d740dffe1b8325 + languageName: node + linkType: hard + "@algolia/client-search@npm:5.29.0": version: 5.29.0 resolution: "@algolia/client-search@npm:5.29.0" @@ -207,6 +287,22 @@ __metadata: languageName: node linkType: hard +"@algolia/logger-common@npm:4.25.3": + version: 4.25.3 + resolution: "@algolia/logger-common@npm:4.25.3" + checksum: 10c0/503434de662b7b667522ebcd2d9fbc29d9e401ba253fe16ff86a7572e6e113fe021b2762498da8a57b06c2533f86dcecd165f528865e313c5421f099fca9a27e + languageName: node + linkType: hard + +"@algolia/logger-console@npm:4.25.3": + version: 4.25.3 + resolution: "@algolia/logger-console@npm:4.25.3" + dependencies: + "@algolia/logger-common": "npm:4.25.3" + checksum: 10c0/996df8eb0b1e9866deec1a0a7f58af1a779c487674a6742bf660a7d31ee2b5a163b99dbbe5050c834922a992066404f9dadf49cf9bbdf0b9adeb7a16fc569337 + languageName: node + linkType: hard + "@algolia/monitoring@npm:1.29.0": version: 1.29.0 resolution: "@algolia/monitoring@npm:1.29.0" @@ -219,6 +315,25 @@ __metadata: languageName: node linkType: hard +"@algolia/recommend@npm:4.25.3": + version: 4.25.3 + resolution: "@algolia/recommend@npm:4.25.3" + dependencies: + "@algolia/cache-browser-local-storage": "npm:4.25.3" + "@algolia/cache-common": "npm:4.25.3" + "@algolia/cache-in-memory": "npm:4.25.3" + "@algolia/client-common": "npm:4.25.3" + "@algolia/client-search": "npm:4.25.3" + "@algolia/logger-common": "npm:4.25.3" + "@algolia/logger-console": "npm:4.25.3" + "@algolia/requester-browser-xhr": "npm:4.25.3" + "@algolia/requester-common": "npm:4.25.3" + "@algolia/requester-node-http": "npm:4.25.3" + "@algolia/transporter": "npm:4.25.3" + checksum: 10c0/c59db46fcf46a784a982df8dce31298c838f65ffb3cf6193c05791c9c7114508819d81f5fe27da856820f6f2dc4a376c4cb98d3dcd9fc2e682da64c25dc5fe23 + languageName: node + linkType: hard + "@algolia/recommend@npm:5.29.0": version: 5.29.0 resolution: "@algolia/recommend@npm:5.29.0" @@ -231,6 +346,15 @@ __metadata: languageName: node linkType: hard +"@algolia/requester-browser-xhr@npm:4.25.3": + version: 4.25.3 + resolution: "@algolia/requester-browser-xhr@npm:4.25.3" + dependencies: + "@algolia/requester-common": "npm:4.25.3" + checksum: 10c0/2b923f192f32d454cef1f889cf788971cdb7b64645aed6d28770bc498036108fb84cd9a3868cf40980e2fe7632016c5eafb3fc82cdd8bd1647c26d36f741de3c + languageName: node + linkType: hard + "@algolia/requester-browser-xhr@npm:5.29.0": version: 5.29.0 resolution: "@algolia/requester-browser-xhr@npm:5.29.0" @@ -240,6 +364,13 @@ __metadata: languageName: node linkType: hard +"@algolia/requester-common@npm:4.25.3": + version: 4.25.3 + resolution: "@algolia/requester-common@npm:4.25.3" + checksum: 10c0/1ba00218e1e36b676dc0809e3fc102d6912f15f71cc6f9d605af4e3510a5d1e4f57d6679a9b1187164099dfd842c4fe97c493fec732efb53cd2238fb3f144fd5 + languageName: node + linkType: hard + "@algolia/requester-fetch@npm:5.29.0": version: 5.29.0 resolution: "@algolia/requester-fetch@npm:5.29.0" @@ -249,6 +380,15 @@ __metadata: languageName: node linkType: hard +"@algolia/requester-node-http@npm:4.25.3": + version: 4.25.3 + resolution: "@algolia/requester-node-http@npm:4.25.3" + dependencies: + "@algolia/requester-common": "npm:4.25.3" + checksum: 10c0/38b2b4d87e9c48f14e7325fed17663f15472f6e0217da177a7ef8516f33e871705993626ac025072511ad587373c1eacd635c68f6922c0514fb2f7758d4c941c + languageName: node + linkType: hard + "@algolia/requester-node-http@npm:5.29.0": version: 5.29.0 resolution: "@algolia/requester-node-http@npm:5.29.0" @@ -258,6 +398,17 @@ __metadata: languageName: node linkType: hard +"@algolia/transporter@npm:4.25.3": + version: 4.25.3 + resolution: "@algolia/transporter@npm:4.25.3" + dependencies: + "@algolia/cache-common": "npm:4.25.3" + "@algolia/logger-common": "npm:4.25.3" + "@algolia/requester-common": "npm:4.25.3" + checksum: 10c0/c7160ad528c77b5a88c6da8f2ca0d28171598cbca0b9cade690e78b4baacd814541d09c7df68036849d02e73ee54ee9b06447264617d644b5f823f73e95bfcf7 + languageName: node + linkType: hard + "@ampproject/remapping@npm:^2.2.0": version: 2.3.0 resolution: "@ampproject/remapping@npm:2.3.0" @@ -4082,6 +4233,64 @@ __metadata: languageName: node linkType: hard +"@sigstore/bundle@npm:^3.1.0": + version: 3.1.0 + resolution: "@sigstore/bundle@npm:3.1.0" + dependencies: + "@sigstore/protobuf-specs": "npm:^0.4.0" + checksum: 10c0/f34afa3efe81b0925cf1568eeea7678876c5889799fcdf9b81d1062067108e74fc3f3480b0d2b7daa7389f944e4a2523b5fc98d65dbbaa34d206d8c2edc4fa5a + languageName: node + linkType: hard + +"@sigstore/core@npm:^2.0.0": + version: 2.0.0 + resolution: "@sigstore/core@npm:2.0.0" + checksum: 10c0/bb7e668aedcda68312d2ff7c986fd0ba29057ca4dfbaef516c997b0799cd8858b2fc8017a7946fd2e43f237920adbcaa7455097a0a02909ed86cad9f98d592d4 + languageName: node + linkType: hard + +"@sigstore/protobuf-specs@npm:^0.4.0, @sigstore/protobuf-specs@npm:^0.4.1": + version: 0.4.3 + resolution: "@sigstore/protobuf-specs@npm:0.4.3" + checksum: 10c0/a7dbc66d1ff9e4455081a4d4c6b7a47a722072c55991698e2a900d91b7f0cb5ee9e8600b09ae5fd15ad3c6498d02418817f9d110c88b82d3e8edf9848fbf1222 + languageName: node + linkType: hard + +"@sigstore/sign@npm:^3.1.0": + version: 3.1.0 + resolution: "@sigstore/sign@npm:3.1.0" + dependencies: + "@sigstore/bundle": "npm:^3.1.0" + "@sigstore/core": "npm:^2.0.0" + "@sigstore/protobuf-specs": "npm:^0.4.0" + make-fetch-happen: "npm:^14.0.2" + proc-log: "npm:^5.0.0" + promise-retry: "npm:^2.0.1" + checksum: 10c0/7647f3a1350a09d66e7d77fdf8edf6eeb047f818acc2cd06325fc8ec9f0cd654dd25909876147b7ed052d459dc6a1d64e8cbaa44486300b241c3b139d778f254 + languageName: node + linkType: hard + +"@sigstore/tuf@npm:^3.1.0": + version: 3.1.1 + resolution: "@sigstore/tuf@npm:3.1.1" + dependencies: + "@sigstore/protobuf-specs": "npm:^0.4.1" + tuf-js: "npm:^3.0.1" + checksum: 10c0/08fdafb45c859cd58ef02e4f28e00a2d74f0c309dca36cf20fda17e55e194a3b7ebcfd9c40197c197d044ae4de0ff5d99b363aaec7cb6cbbf09611afa2661a55 + languageName: node + linkType: hard + +"@sigstore/verify@npm:^2.1.0": + version: 2.1.1 + resolution: "@sigstore/verify@npm:2.1.1" + dependencies: + "@sigstore/bundle": "npm:^3.1.0" + "@sigstore/core": "npm:^2.0.0" + "@sigstore/protobuf-specs": "npm:^0.4.1" + checksum: 10c0/4881d8cd798f7d0c5ffe42b643b950c2a8af1f07c96fc3f3a3409bf5f2221b832d4f018104a12ac8ae0740060ecbb837b99dec058765925d1dcb08ccbd92feb4 + languageName: node + linkType: hard + "@sindresorhus/is@npm:^4.0.0": version: 4.6.0 resolution: "@sindresorhus/is@npm:4.6.0" @@ -4616,6 +4825,9 @@ __metadata: "@actions/exec": "npm:^1.1.1" "@sourceacademy/modules-repotools": "workspace:^" "@types/node": "npm:^22.15.30" + "@yarnpkg/cli": "npm:^4.12.0" + "@yarnpkg/core": "npm:^4.5.0" + "@yarnpkg/fslib": "npm:^3.1.4" lodash: "npm:^4.17.21" snyk-nodejs-lockfile-parser: "npm:^2.4.2" typescript: "npm:^5.8.2" @@ -5084,6 +5296,23 @@ __metadata: languageName: node linkType: hard +"@tufjs/canonical-json@npm:2.0.0": + version: 2.0.0 + resolution: "@tufjs/canonical-json@npm:2.0.0" + checksum: 10c0/52c5ffaef1483ed5c3feedfeba26ca9142fa386eea54464e70ff515bd01c5e04eab05d01eff8c2593291dcaf2397ca7d9c512720e11f52072b04c47a5c279415 + languageName: node + linkType: hard + +"@tufjs/models@npm:3.0.1": + version: 3.0.1 + resolution: "@tufjs/models@npm:3.0.1" + dependencies: + "@tufjs/canonical-json": "npm:2.0.0" + minimatch: "npm:^9.0.5" + checksum: 10c0/0b2022589139102edf28f7fdcd094407fc98ac25bf530ebcf538dd63152baea9b6144b713c8dfc4f6b7580adeff706ab6ecc5f9716c4b816e58a04419abb1926 + languageName: node + linkType: hard + "@tweenjs/tween.js@npm:~23.1.3": version: 23.1.3 resolution: "@tweenjs/tween.js@npm:23.1.3" @@ -5641,6 +5870,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^18.19.124": + version: 18.19.130 + resolution: "@types/node@npm:18.19.130" + dependencies: + undici-types: "npm:~5.26.4" + checksum: 10c0/22ba2bc9f8863101a7e90a56aaeba1eb3ebdc51e847cef4a6d188967ab1acbce9b4f92251372fd0329ecb924bbf610509e122c3dfe346c04dbad04013d4ad7d0 + languageName: node + linkType: hard + "@types/node@npm:^22.0.0, @types/node@npm:^22.15.30": version: 22.19.1 resolution: "@types/node@npm:22.19.1" @@ -5861,6 +6099,13 @@ __metadata: languageName: node linkType: hard +"@types/yoga-layout@npm:1.9.2": + version: 1.9.2 + resolution: "@types/yoga-layout@npm:1.9.2" + checksum: 10c0/9f2a8618afe3e2e18e76eeaa4ec7d09a85f01f071231f8ff21388d851f940dd7ae5867a5f9aef29eafe44c47453a328d3c718fff1451ab62266450b415e43150 + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:8.46.4": version: 8.46.4 resolution: "@typescript-eslint/eslint-plugin@npm:8.46.4" @@ -6470,6 +6715,51 @@ __metadata: languageName: node linkType: hard +"@yarnpkg/cli@npm:^4.12.0": + version: 4.12.0 + resolution: "@yarnpkg/cli@npm:4.12.0" + dependencies: + "@yarnpkg/core": "npm:^4.5.0" + "@yarnpkg/fslib": "npm:^3.1.4" + "@yarnpkg/libzip": "npm:^3.2.2" + "@yarnpkg/parsers": "npm:^3.0.3" + "@yarnpkg/plugin-catalog": "npm:^1.0.2" + "@yarnpkg/plugin-compat": "npm:^4.0.12" + "@yarnpkg/plugin-constraints": "npm:^4.0.5" + "@yarnpkg/plugin-dlx": "npm:^4.0.2" + "@yarnpkg/plugin-essentials": "npm:^4.4.4" + "@yarnpkg/plugin-exec": "npm:^3.0.2" + "@yarnpkg/plugin-file": "npm:^3.0.2" + "@yarnpkg/plugin-git": "npm:^3.1.4" + "@yarnpkg/plugin-github": "npm:^3.0.2" + "@yarnpkg/plugin-http": "npm:^3.0.3" + "@yarnpkg/plugin-init": "npm:^4.1.2" + "@yarnpkg/plugin-interactive-tools": "npm:^4.0.3" + "@yarnpkg/plugin-jsr": "npm:^1.1.1" + "@yarnpkg/plugin-link": "npm:^3.0.2" + "@yarnpkg/plugin-nm": "npm:^4.0.8" + "@yarnpkg/plugin-npm": "npm:^3.4.0" + "@yarnpkg/plugin-npm-cli": "npm:^4.4.0" + "@yarnpkg/plugin-pack": "npm:^4.0.4" + "@yarnpkg/plugin-patch": "npm:^4.0.3" + "@yarnpkg/plugin-pnp": "npm:^4.1.3" + "@yarnpkg/plugin-pnpm": "npm:^2.1.2" + "@yarnpkg/plugin-stage": "npm:^4.0.2" + "@yarnpkg/plugin-typescript": "npm:^4.1.3" + "@yarnpkg/plugin-version": "npm:^4.2.0" + "@yarnpkg/plugin-workspace-tools": "npm:^4.1.6" + "@yarnpkg/shell": "npm:^4.1.3" + ci-info: "npm:^4.0.0" + clipanion: "npm:^4.0.0-rc.2" + semver: "npm:^7.1.2" + tslib: "npm:^2.4.0" + typanion: "npm:^3.14.0" + peerDependencies: + "@yarnpkg/core": ^4.5.0 + checksum: 10c0/eaa7b75f072524b9576a4cf82ef65c49b20dac586382bf00503bfa9d512f178391b3b290a5ba5179068af496b405b9bd6967f9f7cfd4c46add94e724b33ef2df + languageName: node + linkType: hard + "@yarnpkg/core@npm:^4.4.1": version: 4.4.4 resolution: "@yarnpkg/core@npm:4.4.4" @@ -6504,6 +6794,49 @@ __metadata: languageName: node linkType: hard +"@yarnpkg/core@npm:^4.4.2, @yarnpkg/core@npm:^4.5.0": + version: 4.5.0 + resolution: "@yarnpkg/core@npm:4.5.0" + dependencies: + "@arcanis/slice-ansi": "npm:^1.1.1" + "@types/semver": "npm:^7.1.0" + "@types/treeify": "npm:^1.0.0" + "@yarnpkg/fslib": "npm:^3.1.4" + "@yarnpkg/libzip": "npm:^3.2.2" + "@yarnpkg/parsers": "npm:^3.0.3" + "@yarnpkg/shell": "npm:^4.1.3" + camelcase: "npm:^5.3.1" + chalk: "npm:^4.1.2" + ci-info: "npm:^4.0.0" + clipanion: "npm:^4.0.0-rc.2" + cross-spawn: "npm:^7.0.3" + diff: "npm:^5.1.0" + dotenv: "npm:^16.3.1" + es-toolkit: "npm:^1.39.7" + fast-glob: "npm:^3.2.2" + got: "npm:^11.7.0" + hpagent: "npm:^1.2.0" + micromatch: "npm:^4.0.2" + p-limit: "npm:^2.2.0" + semver: "npm:^7.1.2" + strip-ansi: "npm:^6.0.0" + tar: "npm:^6.0.5" + tinylogic: "npm:^2.0.0" + treeify: "npm:^1.1.0" + tslib: "npm:^2.4.0" + checksum: 10c0/3fc4a161d243279c3d554a723dd21192bdaade0c852daffdb991e8411e3874ec1c50547d5bcc1abd14395290b820e3714f4d5a02a7bafcfd65509ad40dbeb2d1 + languageName: node + linkType: hard + +"@yarnpkg/extensions@npm:^2.0.6": + version: 2.0.6 + resolution: "@yarnpkg/extensions@npm:2.0.6" + peerDependencies: + "@yarnpkg/core": ^4.4.2 + checksum: 10c0/3be3689d0c01f240fcc1553f8eaf50bb926dc98e2a81e2f26eb94314c832436c7990d94beb2ca5da0d578d86f3adf91595ddbaa5b6b96c2869fad864650e841b + languageName: node + linkType: hard + "@yarnpkg/fslib@npm:^3.1.2, @yarnpkg/fslib@npm:^3.1.3": version: 3.1.3 resolution: "@yarnpkg/fslib@npm:3.1.3" @@ -6513,7 +6846,28 @@ __metadata: languageName: node linkType: hard -"@yarnpkg/libzip@npm:^3.2.2": +"@yarnpkg/fslib@npm:^3.1.4": + version: 3.1.4 + resolution: "@yarnpkg/fslib@npm:3.1.4" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/d38e108a6349b34b6bd885ad9fc8dcc3b7d50be5e54246e260cba899a80b5c91c8e9b27ad1e9c59b2d46e02cc07f8b7d839a851e388aa568d6efc85f5d6d10dc + languageName: node + linkType: hard + +"@yarnpkg/libui@npm:^3.0.2": + version: 3.0.2 + resolution: "@yarnpkg/libui@npm:3.0.2" + dependencies: + tslib: "npm:^2.4.0" + peerDependencies: + ink: ^3.0.8 + react: ^17.0.2 + checksum: 10c0/ca9523992c2168864e334da4e83f682c65616e7d25a02fd3e8900b4ee22577e861f7beb62b3ca327c1b0b59b858a47ca70b3e48e92900790e134c1b698efa2df + languageName: node + linkType: hard + +"@yarnpkg/libzip@npm:^3.2.1, @yarnpkg/libzip@npm:^3.2.2": version: 3.2.2 resolution: "@yarnpkg/libzip@npm:3.2.2" dependencies: @@ -6533,13 +6887,431 @@ __metadata: languageName: node linkType: hard -"@yarnpkg/parsers@npm:^3.0.3": - version: 3.0.3 - resolution: "@yarnpkg/parsers@npm:3.0.3" +"@yarnpkg/nm@npm:^4.0.7": + version: 4.0.7 + resolution: "@yarnpkg/nm@npm:4.0.7" + dependencies: + "@yarnpkg/core": "npm:^4.4.2" + "@yarnpkg/fslib": "npm:^3.1.2" + "@yarnpkg/pnp": "npm:^4.1.1" + checksum: 10c0/68c29613bd4e22a061a88c50221f8e3eeb970283b53f7202013aaee21dad379dac1acd80107e23bac1ab70f459dce741e5606639592738a2e89af9f1a9529d6c + languageName: node + linkType: hard + +"@yarnpkg/parsers@npm:^3.0.3": + version: 3.0.3 + resolution: "@yarnpkg/parsers@npm:3.0.3" + dependencies: + js-yaml: "npm:^3.10.0" + tslib: "npm:^2.4.0" + checksum: 10c0/70c2fa011bf28a517a8ee4264dd93d7590f6e3d02c6d4feb50533f405ca3b100cb156f11405b9a34f7c51c6893d3d8b051554dddfd5afaae2067f921512447a3 + languageName: node + linkType: hard + +"@yarnpkg/plugin-catalog@npm:^1.0.2": + version: 1.0.2 + resolution: "@yarnpkg/plugin-catalog@npm:1.0.2" + dependencies: + "@yarnpkg/fslib": "npm:^3.1.4" + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/core": ^4.5.0 + "@yarnpkg/plugin-pack": ^4.0.4 + checksum: 10c0/e3a9734f1287ae7ed905ccd9ba5b384f8f22df4d22a24e25c08858a6ce171aaf92a30dc11de3cf689aae19eee80c6dba277b973dde6bb54f72c40f2cf4157d3c + languageName: node + linkType: hard + +"@yarnpkg/plugin-compat@npm:^4.0.12": + version: 4.0.12 + resolution: "@yarnpkg/plugin-compat@npm:4.0.12" + dependencies: + "@yarnpkg/extensions": "npm:^2.0.6" + peerDependencies: + "@yarnpkg/core": ^4.4.2 + "@yarnpkg/plugin-patch": ^4.0.3 + checksum: 10c0/895f4adf42d5abd16b89e06831c7b0c0911ffecbae9820a933e65788d6df8a018a462eb0fe17db23881dfb62da67a25dede050a6291c4dddb5eea7bdf3101c86 + languageName: node + linkType: hard + +"@yarnpkg/plugin-constraints@npm:^4.0.5": + version: 4.0.5 + resolution: "@yarnpkg/plugin-constraints@npm:4.0.5" + dependencies: + "@yarnpkg/fslib": "npm:^3.1.2" + clipanion: "npm:^4.0.0-rc.2" + es-toolkit: "npm:^1.39.7" + tau-prolog: "npm:^0.2.66" + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/cli": ^4.9.3 + "@yarnpkg/core": ^4.4.3 + checksum: 10c0/a3d8e0c9bf7af8009a70f5ab50eb0c5cbbdc5800ad4665fbf5843b01537eddab71062eee1c7f3872377b847f770a79f395073ba3a70dd9e3cee071538bef2b78 + languageName: node + linkType: hard + +"@yarnpkg/plugin-dlx@npm:^4.0.2": + version: 4.0.2 + resolution: "@yarnpkg/plugin-dlx@npm:4.0.2" + dependencies: + "@yarnpkg/fslib": "npm:^3.1.2" + clipanion: "npm:^4.0.0-rc.2" + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/cli": ^4.9.2 + "@yarnpkg/core": ^4.4.2 + checksum: 10c0/c7af7bea6b1c146aba1658731475f826bbe149f7695b18ea8968f7bcfbb8a5aee49cc27c4b7c6642b4c23a24a9652225c72152d5ea03f9c6a77610dbf4a95b36 + languageName: node + linkType: hard + +"@yarnpkg/plugin-essentials@npm:^4.4.4": + version: 4.4.4 + resolution: "@yarnpkg/plugin-essentials@npm:4.4.4" + dependencies: + "@yarnpkg/fslib": "npm:^3.1.3" + "@yarnpkg/parsers": "npm:^3.0.3" + ci-info: "npm:^4.0.0" + clipanion: "npm:^4.0.0-rc.2" + enquirer: "npm:^2.3.6" + es-toolkit: "npm:^1.39.7" + micromatch: "npm:^4.0.2" + semver: "npm:^7.1.2" + tslib: "npm:^2.4.0" + typanion: "npm:^3.14.0" + peerDependencies: + "@yarnpkg/cli": ^4.10.0 + "@yarnpkg/core": ^4.4.4 + "@yarnpkg/plugin-git": ^3.1.3 + checksum: 10c0/ed0545652ab404f028ce9996dc2780d66eb75dd5855b7213392456703ffc0aa33224a1f81df64fca1e17103f44d1644a2d3b0b688525dba96e6069c738e95691 + languageName: node + linkType: hard + +"@yarnpkg/plugin-exec@npm:^3.0.2": + version: 3.0.2 + resolution: "@yarnpkg/plugin-exec@npm:3.0.2" + dependencies: + "@yarnpkg/fslib": "npm:^3.1.2" + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/core": ^4.4.2 + checksum: 10c0/eeefae30902e264c664880ac8bfc78aaed3d2989a11b45c5ad1293b77e58690e525a670d4a159c672d47c96c754098ec5dbdddff1fba097ea29c83ddc4f07993 + languageName: node + linkType: hard + +"@yarnpkg/plugin-file@npm:^3.0.2": + version: 3.0.2 + resolution: "@yarnpkg/plugin-file@npm:3.0.2" + dependencies: + "@yarnpkg/fslib": "npm:^3.1.2" + "@yarnpkg/libzip": "npm:^3.2.1" + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/core": ^4.4.2 + checksum: 10c0/42f4d4a1fe91ee8ee396e2ce35c85b90f92c0547cb3b2540aa55f03050c1d5fa30118318feb5e1676bacfd955607826a2c6259a4912268dff22c3c8d4ced40d2 + languageName: node + linkType: hard + +"@yarnpkg/plugin-git@npm:^3.1.4": + version: 3.1.4 + resolution: "@yarnpkg/plugin-git@npm:3.1.4" + dependencies: + "@types/semver": "npm:^7.1.0" + "@yarnpkg/fslib": "npm:^3.1.4" + clipanion: "npm:^4.0.0-rc.2" + es-toolkit: "npm:^1.39.7" + git-url-parse: "npm:^13.1.0" + semver: "npm:^7.1.2" + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/core": ^4.5.0 + checksum: 10c0/c71d1a9b6f2ad226ba52ba43be46f1477d5323be58920ffbc1d8df7180931c0652a4480a71ababd8da07c28c0902ceb85817f3178e7d25c5266eb3fbbf845494 + languageName: node + linkType: hard + +"@yarnpkg/plugin-github@npm:^3.0.2": + version: 3.0.2 + resolution: "@yarnpkg/plugin-github@npm:3.0.2" + dependencies: + "@yarnpkg/fslib": "npm:^3.1.2" + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/core": ^4.4.2 + "@yarnpkg/plugin-git": ^3.1.2 + checksum: 10c0/64fbda413d2cc0b46c60e413564e09f5e60ffa036f428fd0893652c22a7e7b0b3ebd7be1810c46ec395d27be6c28050459b0a5cc75d584c6fcb4474ff54aa21c + languageName: node + linkType: hard + +"@yarnpkg/plugin-http@npm:^3.0.3": + version: 3.0.3 + resolution: "@yarnpkg/plugin-http@npm:3.0.3" + dependencies: + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/core": ^4.4.2 + checksum: 10c0/958d46ee1b0ae57a51356046063bca50653d7b5c1be3aea43bc7bd17658ed4e802055733562d05189c787478b2d5ebf255a42bdd792d07cb7d4a042663c9dd61 + languageName: node + linkType: hard + +"@yarnpkg/plugin-init@npm:^4.1.2": + version: 4.1.2 + resolution: "@yarnpkg/plugin-init@npm:4.1.2" + dependencies: + "@yarnpkg/fslib": "npm:^3.1.2" + clipanion: "npm:^4.0.0-rc.2" + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/cli": ^4.9.2 + "@yarnpkg/core": ^4.4.2 + checksum: 10c0/7417948d62dcaba95fd74727c8dc02e61a4d0e5c7e4b8cc20738b4db9cc42590f82a546aafc271e0fd1a88bce5b91aae277b93dfd63be4d608585310ceec6264 + languageName: node + linkType: hard + +"@yarnpkg/plugin-interactive-tools@npm:^4.0.3": + version: 4.0.3 + resolution: "@yarnpkg/plugin-interactive-tools@npm:4.0.3" + dependencies: + "@yarnpkg/libui": "npm:^3.0.2" + algoliasearch: "npm:^4.2.0" + clipanion: "npm:^4.0.0-rc.2" + diff: "npm:^5.1.0" + ink: "npm:^3.2.0" + ink-text-input: "npm:^4.0.3" + react: "npm:^17.0.2" + semver: "npm:^7.1.2" + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/cli": ^4.9.2 + "@yarnpkg/core": ^4.4.2 + "@yarnpkg/plugin-essentials": ^4.4.1 + checksum: 10c0/efbb765cef645ee54bf45cf4033da2e4c83648c56f4e987045f5be30b844bd6ee39412f522afbf182f3d88e25d76be52af59998ac98c64ad1c06b1f5de6b5278 + languageName: node + linkType: hard + +"@yarnpkg/plugin-jsr@npm:^1.1.1": + version: 1.1.1 + resolution: "@yarnpkg/plugin-jsr@npm:1.1.1" + dependencies: + "@yarnpkg/fslib": "npm:^3.1.2" + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/core": ^4.4.2 + checksum: 10c0/a407b6ee832171d1e5bd7190673f582ec05bbf3942e939ac1224cf78115c43cc08d17d24878d724cc03aa7931da4d72f69a990e1918b3f888c6c8471d879cdb3 + languageName: node + linkType: hard + +"@yarnpkg/plugin-link@npm:^3.0.2": + version: 3.0.2 + resolution: "@yarnpkg/plugin-link@npm:3.0.2" + dependencies: + "@yarnpkg/fslib": "npm:^3.1.2" + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/core": ^4.4.2 + checksum: 10c0/e9531d1cded1d9915038b5f3f4296e128424dbadea5dade93418347284525700c12cb643063a5e8d073c59d2d5e1068e0e076c5de5e499f662ad0e73bd1cbdfe + languageName: node + linkType: hard + +"@yarnpkg/plugin-nm@npm:^4.0.8": + version: 4.0.8 + resolution: "@yarnpkg/plugin-nm@npm:4.0.8" + dependencies: + "@yarnpkg/fslib": "npm:^3.1.3" + "@yarnpkg/libzip": "npm:^3.2.2" + "@yarnpkg/nm": "npm:^4.0.7" + "@yarnpkg/parsers": "npm:^3.0.3" + "@yarnpkg/plugin-pnp": "npm:^4.1.2" + "@yarnpkg/pnp": "npm:^4.1.2" + "@zkochan/cmd-shim": "npm:^5.1.0" + clipanion: "npm:^4.0.0-rc.2" + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/cli": ^4.10.0 + "@yarnpkg/core": ^4.4.4 + checksum: 10c0/9dc550dc018cde5a7033d13e0e301560751e6b26fffb5d6fa48ac3edd72a6df88fcdb7fc1f75caf1aa2e5b3d161238ee131a767cc3a13d5583408c3a7cbe304c + languageName: node + linkType: hard + +"@yarnpkg/plugin-npm-cli@npm:^4.4.0": + version: 4.4.0 + resolution: "@yarnpkg/plugin-npm-cli@npm:4.4.0" + dependencies: + "@yarnpkg/fslib": "npm:^3.1.4" + clipanion: "npm:^4.0.0-rc.2" + enquirer: "npm:^2.3.6" + micromatch: "npm:^4.0.2" + semver: "npm:^7.1.2" + tslib: "npm:^2.4.0" + typanion: "npm:^3.14.0" + peerDependencies: + "@yarnpkg/cli": ^4.12.0 + "@yarnpkg/core": ^4.5.0 + "@yarnpkg/plugin-npm": ^3.4.0 + "@yarnpkg/plugin-pack": ^4.0.4 + checksum: 10c0/3b578ec8ecd6bc55cc1c300ee0662a40854b2a08a5e4f9abcf3839ee1b54f764036b75a2fc0404ea79d8f22db3fad5b129ff7f166ac2cb672416b46ac29f5a9a + languageName: node + linkType: hard + +"@yarnpkg/plugin-npm@npm:^3.4.0": + version: 3.4.0 + resolution: "@yarnpkg/plugin-npm@npm:3.4.0" + dependencies: + "@yarnpkg/fslib": "npm:^3.1.4" + enquirer: "npm:^2.3.6" + es-toolkit: "npm:^1.39.7" + micromatch: "npm:^4.0.2" + semver: "npm:^7.1.2" + sigstore: "npm:^3.1.0" + ssri: "npm:^12.0.0" + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/core": ^4.5.0 + "@yarnpkg/plugin-pack": ^4.0.4 + checksum: 10c0/957dace25b0ee5eaab33af06ce39584e8c83f2b525c09b5f6f1106b2f81e567d130b16f1811f8ed2da39a6962b66e0a91a217e53d014cea905cadd76e5621c28 + languageName: node + linkType: hard + +"@yarnpkg/plugin-pack@npm:^4.0.2, @yarnpkg/plugin-pack@npm:^4.0.4": + version: 4.0.4 + resolution: "@yarnpkg/plugin-pack@npm:4.0.4" + dependencies: + "@yarnpkg/fslib": "npm:^3.1.3" + clipanion: "npm:^4.0.0-rc.2" + micromatch: "npm:^4.0.2" + tar-stream: "npm:^2.0.1" + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/cli": ^4.10.1 + "@yarnpkg/core": ^4.4.4 + checksum: 10c0/a13eb6d7546b0b2cc4d5c6f5e8f8afa82ea88a015e120fd731164d82f9f3d73854a31502c655759460f803e1549c0c0f3ad6286e7d6d275b5b1d8eda21bf9187 + languageName: node + linkType: hard + +"@yarnpkg/plugin-patch@npm:^4.0.3": + version: 4.0.3 + resolution: "@yarnpkg/plugin-patch@npm:4.0.3" + dependencies: + "@yarnpkg/fslib": "npm:^3.1.2" + "@yarnpkg/libzip": "npm:^3.2.1" + clipanion: "npm:^4.0.0-rc.2" + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/cli": ^4.9.2 + "@yarnpkg/core": ^4.4.2 + checksum: 10c0/9ceccb7cdd36d45eadff5cca951fad2022102c67da8dab803b6ed071866e7fcbed9fc92d2b7372fc3b59b12bca685bdf9097762f754adbb7aa1065c8832ca9c4 + languageName: node + linkType: hard + +"@yarnpkg/plugin-pnp@npm:^4.1.1, @yarnpkg/plugin-pnp@npm:^4.1.2, @yarnpkg/plugin-pnp@npm:^4.1.3": + version: 4.1.3 + resolution: "@yarnpkg/plugin-pnp@npm:4.1.3" + dependencies: + "@yarnpkg/fslib": "npm:^3.1.4" + "@yarnpkg/plugin-stage": "npm:^4.0.2" + "@yarnpkg/pnp": "npm:^4.1.3" + clipanion: "npm:^4.0.0-rc.2" + micromatch: "npm:^4.0.2" + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/cli": ^4.11.0 + "@yarnpkg/core": ^4.5.0 + checksum: 10c0/c712e943fe33397b5e5e25b1dfc094afd7e468a266a5f886a4e8e91176ee723c5399f929b2a62e6817d9aa0fb61a8475a52f0b65fe965533cf51fcd055ff57dc + languageName: node + linkType: hard + +"@yarnpkg/plugin-pnpm@npm:^2.1.2": + version: 2.1.2 + resolution: "@yarnpkg/plugin-pnpm@npm:2.1.2" + dependencies: + "@yarnpkg/fslib": "npm:^3.1.2" + "@yarnpkg/plugin-pnp": "npm:^4.1.1" + "@yarnpkg/plugin-stage": "npm:^4.0.2" + clipanion: "npm:^4.0.0-rc.2" + p-limit: "npm:^2.2.0" + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/cli": ^4.9.3 + "@yarnpkg/core": ^4.4.3 + checksum: 10c0/c6e9f8a83d5ef6a5c12ac88c9e443bbf75de85ef41a37702c412767762e1c4a28fb352ec43f4404c1def4dfcd2b0c74ed38859c4ba3b970f9d62b095e79f9d2a + languageName: node + linkType: hard + +"@yarnpkg/plugin-stage@npm:^4.0.2": + version: 4.0.2 + resolution: "@yarnpkg/plugin-stage@npm:4.0.2" + dependencies: + "@yarnpkg/fslib": "npm:^3.1.2" + clipanion: "npm:^4.0.0-rc.2" + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/cli": ^4.9.2 + "@yarnpkg/core": ^4.4.2 + checksum: 10c0/96d803980c42a8cb69f84bd0a041b020067be892eafd26ebed7cb3d1c5814185025d2b77218f2c74aedf1041e12b02ff580a8cb49c1ccb927c303f5b02c330b2 + languageName: node + linkType: hard + +"@yarnpkg/plugin-typescript@npm:^4.1.3": + version: 4.1.3 + resolution: "@yarnpkg/plugin-typescript@npm:4.1.3" + dependencies: + "@yarnpkg/fslib": "npm:^3.1.2" + "@yarnpkg/plugin-pack": "npm:^4.0.2" + algoliasearch: "npm:^4.2.0" + semver: "npm:^7.1.2" + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/cli": ^4.9.2 + "@yarnpkg/core": ^4.4.2 + "@yarnpkg/plugin-essentials": ^4.4.1 + checksum: 10c0/775b366795960495cf03bf2211616f5e6829e5d03074867332c6bb90beeee852b6444e961384d5b21bd296a473e4e2cae4a0f4cdabbfb4af4217f88440a7e19c + languageName: node + linkType: hard + +"@yarnpkg/plugin-version@npm:^4.2.0": + version: 4.2.0 + resolution: "@yarnpkg/plugin-version@npm:4.2.0" + dependencies: + "@yarnpkg/fslib": "npm:^3.1.2" + "@yarnpkg/libui": "npm:^3.0.2" + "@yarnpkg/parsers": "npm:^3.0.3" + clipanion: "npm:^4.0.0-rc.2" + es-toolkit: "npm:^1.39.7" + ink: "npm:^3.2.0" + react: "npm:^17.0.2" + semver: "npm:^7.1.2" + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/cli": ^4.9.4 + "@yarnpkg/core": ^4.4.3 + "@yarnpkg/plugin-git": ^3.1.3 + checksum: 10c0/173dceb2567c9ab33253ea97e32d58d50185c7212598cf09e6b1f91118029dd3b457872512bfd0350442c59dc292f251d2476411946bafd5d2e3aa08f7e298b3 + languageName: node + linkType: hard + +"@yarnpkg/plugin-workspace-tools@npm:^4.1.6": + version: 4.1.6 + resolution: "@yarnpkg/plugin-workspace-tools@npm:4.1.6" + dependencies: + "@yarnpkg/fslib": "npm:^3.1.2" + clipanion: "npm:^4.0.0-rc.2" + es-toolkit: "npm:^1.39.7" + micromatch: "npm:^4.0.2" + p-limit: "npm:^2.2.0" + tslib: "npm:^2.4.0" + typanion: "npm:^3.14.0" + peerDependencies: + "@yarnpkg/cli": ^4.9.3 + "@yarnpkg/core": ^4.4.3 + "@yarnpkg/plugin-git": ^3.1.3 + checksum: 10c0/b9b9f396a7b15a54f6e37f165d7b00ee481ca6ec9eaf4720ac35440f4b1519f0b6c5cc4fae92b905fab9466d375744ef54742e814bd41106fb1cddaee025a12f + languageName: node + linkType: hard + +"@yarnpkg/pnp@npm:^4.1.1, @yarnpkg/pnp@npm:^4.1.2, @yarnpkg/pnp@npm:^4.1.3": + version: 4.1.3 + resolution: "@yarnpkg/pnp@npm:4.1.3" dependencies: - js-yaml: "npm:^3.10.0" - tslib: "npm:^2.4.0" - checksum: 10c0/70c2fa011bf28a517a8ee4264dd93d7590f6e3d02c6d4feb50533f405ca3b100cb156f11405b9a34f7c51c6893d3d8b051554dddfd5afaae2067f921512447a3 + "@types/node": "npm:^18.19.124" + "@yarnpkg/fslib": "npm:^3.1.4" + checksum: 10c0/a75901d2c1d68f6a8334753388774b1fb5462b60b040cf0bac44b09594e5f24b3ccb839e9faaf9b93620091881ecbf4c30f7c344614c9418b608acd08f00cc99 languageName: node linkType: hard @@ -6570,6 +7342,17 @@ __metadata: languageName: node linkType: hard +"@zkochan/cmd-shim@npm:^5.1.0": + version: 5.4.1 + resolution: "@zkochan/cmd-shim@npm:5.4.1" + dependencies: + cmd-extension: "npm:^1.0.2" + graceful-fs: "npm:^4.2.10" + is-windows: "npm:^1.0.2" + checksum: 10c0/59ef924e62aa6ddb6867e6e9b6b9b428fcb0d47a647b2e43fc0ed1e0af6812c140e224265b0f33149a2e833475b3109ed55b278882a3f59dd4f27a5ed8e1356f + languageName: node + linkType: hard + "abbrev@npm:^2.0.0": version: 2.0.0 resolution: "abbrev@npm:2.0.0" @@ -6685,6 +7468,29 @@ __metadata: languageName: node linkType: hard +"algoliasearch@npm:^4.2.0": + version: 4.25.3 + resolution: "algoliasearch@npm:4.25.3" + dependencies: + "@algolia/cache-browser-local-storage": "npm:4.25.3" + "@algolia/cache-common": "npm:4.25.3" + "@algolia/cache-in-memory": "npm:4.25.3" + "@algolia/client-account": "npm:4.25.3" + "@algolia/client-analytics": "npm:4.25.3" + "@algolia/client-common": "npm:4.25.3" + "@algolia/client-personalization": "npm:4.25.3" + "@algolia/client-search": "npm:4.25.3" + "@algolia/logger-common": "npm:4.25.3" + "@algolia/logger-console": "npm:4.25.3" + "@algolia/recommend": "npm:4.25.3" + "@algolia/requester-browser-xhr": "npm:4.25.3" + "@algolia/requester-common": "npm:4.25.3" + "@algolia/requester-node-http": "npm:4.25.3" + "@algolia/transporter": "npm:4.25.3" + checksum: 10c0/e293b79ad5c49991b1882fd811ef69ab81af1e524632cfbaa8afcc96315a7f1a777d7cc5cef075cd7460a3d54d49e03f8c0bb6338bf9f31890e5b05fa20ec844 + languageName: node + linkType: hard + "algoliasearch@npm:^5.14.2": version: 5.29.0 resolution: "algoliasearch@npm:5.29.0" @@ -6706,6 +7512,22 @@ __metadata: languageName: node linkType: hard +"ansi-colors@npm:^4.1.1": + version: 4.1.3 + resolution: "ansi-colors@npm:4.1.3" + checksum: 10c0/ec87a2f59902f74e61eada7f6e6fe20094a628dab765cfdbd03c3477599368768cffccdb5d3bb19a1b6c99126783a143b1fee31aab729b31ffe5836c7e5e28b9 + languageName: node + linkType: hard + +"ansi-escapes@npm:^4.2.1": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: "npm:^0.21.3" + checksum: 10c0/da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50 + languageName: node + linkType: hard + "ansi-regex@npm:^5.0.1": version: 5.0.1 resolution: "ansi-regex@npm:5.0.1" @@ -7007,6 +7829,13 @@ __metadata: languageName: node linkType: hard +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: 10c0/f63d439cc383db1b9c5c6080d1e240bd14dae745f15d11ec5da863e182bbeca70df6c8191cffef5deba0b566ef98834610a68be79ac6379c95eeb26e1b310e25 + languageName: node + linkType: hard + "astring@npm:^1.4.3, astring@npm:^1.8.6": version: 1.9.0 resolution: "astring@npm:1.9.0" @@ -7046,6 +7875,13 @@ __metadata: languageName: node linkType: hard +"auto-bind@npm:4.0.0": + version: 4.0.0 + resolution: "auto-bind@npm:4.0.0" + checksum: 10c0/12f70745d081ba990dca028ecfa70de25d4baa9a8b74a5bef3ab293da56cba32ff8276c3ff8e5fe6d9f370547bf3fa71486befbfefe272af7e722c21d0c25530 + languageName: node + linkType: hard + "available-typed-arrays@npm:^1.0.7": version: 1.0.7 resolution: "available-typed-arrays@npm:1.0.7" @@ -7227,7 +8063,7 @@ __metadata: languageName: node linkType: hard -"bl@npm:^4.0.2": +"bl@npm:^4.0.2, bl@npm:^4.0.3": version: 4.1.0 resolution: "bl@npm:4.1.0" dependencies: @@ -7671,7 +8507,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.0.0, chalk@npm:^4.1.2": +"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -7851,6 +8687,32 @@ __metadata: languageName: node linkType: hard +"cli-boxes@npm:^2.2.0": + version: 2.2.1 + resolution: "cli-boxes@npm:2.2.1" + checksum: 10c0/6111352edbb2f62dbc7bfd58f2d534de507afed7f189f13fa894ce5a48badd94b2aa502fda28f1d7dd5f1eb456e7d4033d09a76660013ef50c7f66e7a034f050 + languageName: node + linkType: hard + +"cli-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-cursor@npm:3.1.0" + dependencies: + restore-cursor: "npm:^3.1.0" + checksum: 10c0/92a2f98ff9037d09be3dfe1f0d749664797fb674bf388375a2207a1203b69d41847abf16434203e0089212479e47a358b13a0222ab9fccfe8e2644a7ccebd111 + languageName: node + linkType: hard + +"cli-truncate@npm:^2.1.0": + version: 2.1.0 + resolution: "cli-truncate@npm:2.1.0" + dependencies: + slice-ansi: "npm:^3.0.0" + string-width: "npm:^4.2.0" + checksum: 10c0/dfaa3df675bcef7a3254773de768712b590250420345a4c7ac151f041a4bacb4c25864b1377bee54a39b5925a030c00eabf014e312e3a4ac130952ed3b3879e9 + languageName: node + linkType: hard + "clipanion@npm:^4.0.0-rc.2": version: 4.0.0-rc.4 resolution: "clipanion@npm:4.0.0-rc.4" @@ -7871,6 +8733,22 @@ __metadata: languageName: node linkType: hard +"cmd-extension@npm:^1.0.2": + version: 1.0.2 + resolution: "cmd-extension@npm:1.0.2" + checksum: 10c0/acdb425d51f3a97b365de7f62330554f430470b06c3091e7d5c92a13b8be08aba4ce6d8ab4c8049e01fb51fbda79c188c5454e5a3cd4530fc9508f9eb302a94f + languageName: node + linkType: hard + +"code-excerpt@npm:^3.0.0": + version: 3.0.0 + resolution: "code-excerpt@npm:3.0.0" + dependencies: + convert-to-spaces: "npm:^1.0.1" + checksum: 10c0/5d316ec100cc3ee5e0c4bceb4482fd28d9fc67abaaf8e29a23ad464a6e8fb5a807825704420fb5376482a30672684d707bb0453d844178f10a9855e7b88a70a9 + languageName: node + linkType: hard + "collection-visit@npm:^1.0.0": version: 1.0.0 resolution: "collection-visit@npm:1.0.0" @@ -7904,7 +8782,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:7": +"commander@npm:7, commander@npm:7.2.0": version: 7.2.0 resolution: "commander@npm:7.2.0" checksum: 10c0/8d690ff13b0356df7e0ebbe6c59b4712f754f4b724d4f473d3cc5b3fdcf978e3a5dc3078717858a2ceb50b0f84d0660a7f22a96cdc50fb877d0c9bb31593d23a @@ -8052,6 +8930,13 @@ __metadata: languageName: node linkType: hard +"convert-to-spaces@npm:^1.0.1": + version: 1.0.2 + resolution: "convert-to-spaces@npm:1.0.2" + checksum: 10c0/cb88c52e05a076ae55856a44b34ffbfc5944e6c21aefa7b3ef0551914674667a2cc9e713eeecc0b507e83f4a521a3876712ddc278ee8653985f6add6917a150b + languageName: node + linkType: hard + "copy-anything@npm:^3.0.2": version: 3.0.5 resolution: "copy-anything@npm:3.0.5" @@ -9235,6 +10120,16 @@ __metadata: languageName: node linkType: hard +"enquirer@npm:^2.3.6": + version: 2.4.1 + resolution: "enquirer@npm:2.4.1" + dependencies: + ansi-colors: "npm:^4.1.1" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/43850479d7a51d36a9c924b518dcdc6373b5a8ae3401097d336b7b7e258324749d0ad37a1fcaa5706f04799baa05585cd7af19ebdf7667673e7694435fcea918 + languageName: node + linkType: hard + "entities@npm:^4.4.0, entities@npm:^4.5.0": version: 4.5.0 resolution: "entities@npm:4.5.0" @@ -9767,6 +10662,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 10c0/2530479fe8db57eace5e8646c9c2a9c80fa279614986d16dcc6bcaceb63ae77f05a851ba6c43756d816c61d7f4534baf56e3c705e3e0d884818a46808811c507 + languageName: node + linkType: hard + "escape-string-regexp@npm:^5.0.0": version: 5.0.0 resolution: "escape-string-regexp@npm:5.0.0" @@ -10561,6 +11463,13 @@ __metadata: languageName: node linkType: hard +"fs-constants@npm:^1.0.0": + version: 1.0.0 + resolution: "fs-constants@npm:1.0.0" + checksum: 10c0/a0cde99085f0872f4d244e83e03a46aa387b74f5a5af750896c6b05e9077fac00e9932fdf5aef84f2f16634cd473c63037d7a512576da7d5c2b9163d1909f3a8 + languageName: node + linkType: hard + "fs-minipass@npm:^2.0.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -10737,6 +11646,25 @@ __metadata: languageName: node linkType: hard +"git-up@npm:^7.0.0": + version: 7.0.0 + resolution: "git-up@npm:7.0.0" + dependencies: + is-ssh: "npm:^1.4.0" + parse-url: "npm:^8.1.0" + checksum: 10c0/a3fa02e1a63c7c824b5ebbf23f4a9a6b34dd80031114c5dd8adb7ef53493642e39d3d80dfef4025a452128400c35c2c138d20a0f6ae5d7d7ef70d9ba13083d34 + languageName: node + linkType: hard + +"git-url-parse@npm:^13.1.0": + version: 13.1.1 + resolution: "git-url-parse@npm:13.1.1" + dependencies: + git-up: "npm:^7.0.0" + checksum: 10c0/9304e6fbc1a6acf5e351e84ad87574fa6b840ccbe531afbbce9ba38e01fcacf6adf386ef7593daa037da59d9fd43b5d7c5232d5648638f8301cc2f18d00ad386 + languageName: node + linkType: hard + "github-slugger@npm:^2.0.0": version: 2.0.0 resolution: "github-slugger@npm:2.0.0" @@ -10853,6 +11781,20 @@ __metadata: languageName: node linkType: hard +"globalyzer@npm:0.1.0": + version: 0.1.0 + resolution: "globalyzer@npm:0.1.0" + checksum: 10c0/e16e47a5835cbe8a021423d4c7fcd9f5f85815b4190a7f50c1fdb95fc559d72e4fb30be96f106c66a99413f36d72da0f8323d19d27f60a8feec9d936139ec5a8 + languageName: node + linkType: hard + +"globrex@npm:^0.1.2": + version: 0.1.2 + resolution: "globrex@npm:0.1.2" + checksum: 10c0/a54c029520cf58bda1d8884f72bd49b4cd74e977883268d931fd83bcbd1a9eb96d57c7dbd4ad80148fb9247467ebfb9b215630b2ed7563b2a8de02e1ff7f89d1 + languageName: node + linkType: hard + "glsl-noise@npm:^0.0.0": version: 0.0.0 resolution: "glsl-noise@npm:0.0.0" @@ -10886,7 +11828,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": +"graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.10, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 @@ -11402,6 +12344,56 @@ __metadata: languageName: node linkType: hard +"ink-text-input@npm:^4.0.3": + version: 4.0.3 + resolution: "ink-text-input@npm:4.0.3" + dependencies: + chalk: "npm:^4.1.0" + type-fest: "npm:^0.15.1" + peerDependencies: + ink: ^3.0.0-3 + react: ^16.5.2 || ^17.0.0 + checksum: 10c0/211fb2df6839c67a4c9e47d846b39f8476021fe7c92f56c80b615900f888806c80d86f447fa428de540a25316b38ff3e714f333fe8c722d2f361134b136408ac + languageName: node + linkType: hard + +"ink@npm:^3.2.0": + version: 3.2.0 + resolution: "ink@npm:3.2.0" + dependencies: + ansi-escapes: "npm:^4.2.1" + auto-bind: "npm:4.0.0" + chalk: "npm:^4.1.0" + cli-boxes: "npm:^2.2.0" + cli-cursor: "npm:^3.1.0" + cli-truncate: "npm:^2.1.0" + code-excerpt: "npm:^3.0.0" + indent-string: "npm:^4.0.0" + is-ci: "npm:^2.0.0" + lodash: "npm:^4.17.20" + patch-console: "npm:^1.0.0" + react-devtools-core: "npm:^4.19.1" + react-reconciler: "npm:^0.26.2" + scheduler: "npm:^0.20.2" + signal-exit: "npm:^3.0.2" + slice-ansi: "npm:^3.0.0" + stack-utils: "npm:^2.0.2" + string-width: "npm:^4.2.2" + type-fest: "npm:^0.12.0" + widest-line: "npm:^3.1.0" + wrap-ansi: "npm:^6.2.0" + ws: "npm:^7.5.5" + yoga-layout-prebuilt: "npm:^1.9.6" + peerDependencies: + "@types/react": ">=16.8.0" + react: ">=16.8.0" + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/dabfd5b73ed1401b18826d0094d7ed4b8055e9fc2043c7c65f98c49a478bc1ffc62fa83ce1503008d1f8ac691930a5b44a10b13ec049d17df21ef121af993b2c + languageName: node + linkType: hard + "internal-slot@npm:^1.1.0": version: 1.1.0 resolution: "internal-slot@npm:1.1.0" @@ -11831,6 +12823,15 @@ __metadata: languageName: node linkType: hard +"is-ssh@npm:^1.4.0": + version: 1.4.1 + resolution: "is-ssh@npm:1.4.1" + dependencies: + protocols: "npm:^2.0.1" + checksum: 10c0/021a7355cb032625d58db3cc8266ad9aa698cbabf460b71376a0307405577fd7d3aa0826c0bf1951d7809f134c0ee80403306f6d7633db94a5a3600a0106b398 + languageName: node + linkType: hard + "is-stream@npm:^1.1.0": version: 1.1.0 resolution: "is-stream@npm:1.1.0" @@ -12691,7 +13692,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.15, lodash@npm:^4.17.21": +"lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c @@ -12812,7 +13813,7 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^14.0.3": +"make-fetch-happen@npm:^14.0.2, make-fetch-happen@npm:^14.0.3": version: 14.0.3 resolution: "make-fetch-happen@npm:14.0.3" dependencies: @@ -13742,6 +14743,13 @@ __metadata: languageName: node linkType: hard +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 + languageName: node + linkType: hard + "mimic-fn@npm:^3.1.0": version: 3.1.0 resolution: "mimic-fn@npm:3.1.0" @@ -14203,6 +15211,13 @@ __metadata: languageName: node linkType: hard +"node-watch@npm:0.7.3": + version: 0.7.3 + resolution: "node-watch@npm:0.7.3" + checksum: 10c0/dea5c2ab482280b6b2b39c9b8fcf67943f8e3dc033d103d4521c7106a39a1d214756663fa2c9bd1012dc840d69f763d865cd47f1e9374231ee3c0f42e95d14df + languageName: node + linkType: hard + "non-layered-tidy-tree-layout@npm:^2.0.2": version: 2.0.2 resolution: "non-layered-tidy-tree-layout@npm:2.0.2" @@ -14476,6 +15491,15 @@ __metadata: languageName: node linkType: hard +"onetime@npm:^5.1.0": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: "npm:^2.1.0" + checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f + languageName: node + linkType: hard + "oniguruma-to-es@npm:^3.1.0": version: 3.1.1 resolution: "oniguruma-to-es@npm:3.1.1" @@ -14722,6 +15746,15 @@ __metadata: languageName: node linkType: hard +"parse-path@npm:^7.0.0": + version: 7.1.0 + resolution: "parse-path@npm:7.1.0" + dependencies: + protocols: "npm:^2.0.0" + checksum: 10c0/8c8c8b3019323d686e7b1cd6fd9653bc233404403ad68827836fbfe59dfe26aaef64ed4e0396d0e20c4a7e1469312ec969a679618960e79d5e7c652dc0da5a0f + languageName: node + linkType: hard + "parse-statements@npm:1.0.11": version: 1.0.11 resolution: "parse-statements@npm:1.0.11" @@ -14729,6 +15762,15 @@ __metadata: languageName: node linkType: hard +"parse-url@npm:^8.1.0": + version: 8.1.0 + resolution: "parse-url@npm:8.1.0" + dependencies: + parse-path: "npm:^7.0.0" + checksum: 10c0/68b95afdf4bbf72e57c7ab66f8757c935fff888f7e2b0f1e06098b4faa19e06b6b743bddaed5bc8df4f0c2de6fc475355d787373b2fdd40092be9e4e4b996648 + languageName: node + linkType: hard + "parse5@npm:^7.2.1": version: 7.3.0 resolution: "parse5@npm:7.3.0" @@ -14755,6 +15797,13 @@ __metadata: languageName: node linkType: hard +"patch-console@npm:^1.0.0": + version: 1.0.0 + resolution: "patch-console@npm:1.0.0" + checksum: 10c0/32b6d1354d52c3b7add2114a94412b0bd0dd1d0f62300a1f682a75f4b16d0330443bfd98c2c9f06da3a6348273654a230a8b28ff5746497243eca37701d97a50 + languageName: node + linkType: hard + "path-browserify@npm:^1.0.1": version: 1.0.1 resolution: "path-browserify@npm:1.0.1" @@ -15129,6 +16178,13 @@ __metadata: languageName: node linkType: hard +"protocols@npm:^2.0.0, protocols@npm:^2.0.1": + version: 2.0.2 + resolution: "protocols@npm:2.0.2" + checksum: 10c0/b87d78c1fcf038d33691da28447ce94011d5c7f0c7fd25bcb5fb4d975991c99117873200c84f4b6a9d7f8b9092713a064356236960d1473a7d6fcd4228897b60 + languageName: node + linkType: hard + "public-encrypt@npm:^4.0.3": version: 4.0.3 resolution: "public-encrypt@npm:4.0.3" @@ -15218,6 +16274,19 @@ __metadata: languageName: node linkType: hard +"qunit@npm:^2.8.0": + version: 2.24.3 + resolution: "qunit@npm:2.24.3" + dependencies: + commander: "npm:7.2.0" + node-watch: "npm:0.7.3" + tiny-glob: "npm:0.2.9" + bin: + qunit: bin/qunit.js + checksum: 10c0/c6a924ecc008a4eca9e2a5d8c95f72ff617423c0f1528714dc2ceefe7ae982e2884cd09273b524450ca865a404b330eba4be7d7f1a8de65f578611d14c43c303 + languageName: node + linkType: hard + "randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5, randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" @@ -15274,6 +16343,16 @@ __metadata: languageName: node linkType: hard +"react-devtools-core@npm:^4.19.1": + version: 4.28.5 + resolution: "react-devtools-core@npm:4.28.5" + dependencies: + shell-quote: "npm:^1.6.1" + ws: "npm:^7" + checksum: 10c0/1d71f9b69b8f557a752ba778a20eee9d33bf4393546dd32c96fa034a4b7cc4053f1ac4fccf1ed686a18e1149aa94c26f6d6c3a2c131c958a504199e8503d9ee1 + languageName: node + linkType: hard + "react-dom@npm:^18.3.1": version: 18.3.1 resolution: "react-dom@npm:18.3.1" @@ -15314,6 +16393,19 @@ __metadata: languageName: node linkType: hard +"react-reconciler@npm:^0.26.2": + version: 0.26.2 + resolution: "react-reconciler@npm:0.26.2" + dependencies: + loose-envify: "npm:^1.1.0" + object-assign: "npm:^4.1.1" + scheduler: "npm:^0.20.2" + peerDependencies: + react: ^17.0.2 + checksum: 10c0/3ae2e09804d7c1295643b5b3f15bee26cef04e38e0ed1d47c3b3d3d712ca2c37fbc3461ea0d22041b1f3bbf3656c96b8ec3c1df46280f714dcf8e4fe66146bc6 + languageName: node + linkType: hard + "react-reconciler@npm:^0.27.0": version: 0.27.0 resolution: "react-reconciler@npm:0.27.0" @@ -15376,6 +16468,16 @@ __metadata: languageName: node linkType: hard +"react@npm:^17.0.2": + version: 17.0.2 + resolution: "react@npm:17.0.2" + dependencies: + loose-envify: "npm:^1.1.0" + object-assign: "npm:^4.1.1" + checksum: 10c0/07ae8959acf1596f0550685102fd6097d461a54a4fd46a50f88a0cd7daaa97fdd6415de1dcb4bfe0da6aa43221a6746ce380410fa848acc60f8ac41f6649c148 + languageName: node + linkType: hard + "react@npm:^18.3.1": version: 18.3.1 resolution: "react@npm:18.3.1" @@ -15450,6 +16552,13 @@ __metadata: languageName: node linkType: hard +"readline-sync@npm:1.4.9": + version: 1.4.9 + resolution: "readline-sync@npm:1.4.9" + checksum: 10c0/0b013fe85c45fa25c341ab510ac05450f3339fcca031cafaaf19f5d1ef28467663d5d3fa1873dc5e100c42534150d9bcba0e4055a08a949f4d56010efe184aa1 + languageName: node + linkType: hard + "reflect-metadata@npm:^0.1.13": version: 0.1.14 resolution: "reflect-metadata@npm:0.1.14" @@ -15693,6 +16802,16 @@ __metadata: languageName: node linkType: hard +"restore-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "restore-cursor@npm:3.1.0" + dependencies: + onetime: "npm:^5.1.0" + signal-exit: "npm:^3.0.2" + checksum: 10c0/8051a371d6aa67ff21625fa94e2357bd81ffdc96267f3fb0fc4aaf4534028343836548ef34c240ffa8c25b280ca35eb36be00b3cb2133fa4f51896d7e73c6b4f + languageName: node + linkType: hard + "ret@npm:~0.1.10": version: 0.1.15 resolution: "ret@npm:0.1.15" @@ -16027,6 +17146,16 @@ __metadata: languageName: node linkType: hard +"scheduler@npm:^0.20.2": + version: 0.20.2 + resolution: "scheduler@npm:0.20.2" + dependencies: + loose-envify: "npm:^1.1.0" + object-assign: "npm:^4.1.1" + checksum: 10c0/b0982e4b0f34f4ffa4f2f486161c0fd9ce9b88680b045dccbf250eb1aa4fd27413570645455187a83535e2370f5c667a251045547765408492bd883cbe95fcdb + languageName: node + linkType: hard + "scheduler@npm:^0.21.0": version: 0.21.0 resolution: "scheduler@npm:0.21.0" @@ -16210,6 +17339,13 @@ __metadata: languageName: node linkType: hard +"shell-quote@npm:^1.6.1": + version: 1.8.3 + resolution: "shell-quote@npm:1.8.3" + checksum: 10c0/bee87c34e1e986cfb4c30846b8e6327d18874f10b535699866f368ade11ea4ee45433d97bf5eada22c4320c27df79c3a6a7eb1bf3ecfc47f2c997d9e5e2672fd + languageName: node + linkType: hard + "shiki@npm:^2.1.0": version: 2.5.0 resolution: "shiki@npm:2.5.0" @@ -16295,6 +17431,20 @@ __metadata: languageName: node linkType: hard +"sigstore@npm:^3.1.0": + version: 3.1.0 + resolution: "sigstore@npm:3.1.0" + dependencies: + "@sigstore/bundle": "npm:^3.1.0" + "@sigstore/core": "npm:^2.0.0" + "@sigstore/protobuf-specs": "npm:^0.4.0" + "@sigstore/sign": "npm:^3.1.0" + "@sigstore/tuf": "npm:^3.1.0" + "@sigstore/verify": "npm:^2.1.0" + checksum: 10c0/c037f5526e698ec6de8654f6be6b6fa52bf52f2ffcd78109cdefc6d824bbb8390324522dcb0f84d57a674948ac53aef34dd77f9de66c91bcd91d0af56bb91c7e + languageName: node + linkType: hard + "simple-mime@npm:^0.1.0": version: 0.1.0 resolution: "simple-mime@npm:0.1.0" @@ -16320,6 +17470,17 @@ __metadata: languageName: node linkType: hard +"slice-ansi@npm:^3.0.0": + version: 3.0.0 + resolution: "slice-ansi@npm:3.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + astral-regex: "npm:^2.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + checksum: 10c0/88083c9d0ca67d09f8b4c78f68833d69cabbb7236b74df5d741ad572bbf022deaf243fa54009cd434350622a1174ab267710fcc80a214ecc7689797fe00cb27c + languageName: node + linkType: hard + "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -16615,6 +17776,15 @@ __metadata: languageName: node linkType: hard +"stack-utils@npm:^2.0.2": + version: 2.0.6 + resolution: "stack-utils@npm:2.0.6" + dependencies: + escape-string-regexp: "npm:^2.0.0" + checksum: 10c0/651c9f87667e077584bbe848acaecc6049bc71979f1e9a46c7b920cad4431c388df0f51b8ad7cfd6eed3db97a2878d0fc8b3122979439ea8bac29c61c95eec8a + languageName: node + linkType: hard + "stackback@npm:0.0.2": version: 0.0.2 resolution: "stackback@npm:0.0.2" @@ -16722,7 +17892,7 @@ __metadata: languageName: node linkType: hard -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0": +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.0.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.2": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -16976,6 +18146,19 @@ __metadata: languageName: node linkType: hard +"tar-stream@npm:^2.0.1": + version: 2.2.0 + resolution: "tar-stream@npm:2.2.0" + dependencies: + bl: "npm:^4.0.3" + end-of-stream: "npm:^1.4.1" + fs-constants: "npm:^1.0.0" + inherits: "npm:^2.0.3" + readable-stream: "npm:^3.1.1" + checksum: 10c0/2f4c910b3ee7196502e1ff015a7ba321ec6ea837667220d7bcb8d0852d51cb04b87f7ae471008a6fb8f5b1a1b5078f62f3a82d30c706f20ada1238ac797e7692 + languageName: node + linkType: hard + "tar-stream@npm:^3.0.0": version: 3.1.7 resolution: "tar-stream@npm:3.1.7" @@ -17015,6 +18198,16 @@ __metadata: languageName: node linkType: hard +"tau-prolog@npm:^0.2.66": + version: 0.2.81 + resolution: "tau-prolog@npm:0.2.81" + dependencies: + qunit: "npm:^2.8.0" + readline-sync: "npm:1.4.9" + checksum: 10c0/7e21ded5ba174ba8cbf4b38a77391184e1df720a9df6928e5b166a3fb71c3f779817146607be65fc7e74f3dfac2edabaf39388b0fb24677e88029bbf36c2ffca + languageName: node + linkType: hard + "test-exclude@npm:^6.0.0": version: 6.0.0 resolution: "test-exclude@npm:6.0.0" @@ -17090,6 +18283,16 @@ __metadata: languageName: node linkType: hard +"tiny-glob@npm:0.2.9": + version: 0.2.9 + resolution: "tiny-glob@npm:0.2.9" + dependencies: + globalyzer: "npm:0.1.0" + globrex: "npm:^0.1.2" + checksum: 10c0/cbe072f0d213a1395d30aa94845a051d4af18fe8ffb79c8e99ac1787cd25df69083f17791a53997cb65f469f48950cb61426ccc0683cc9df170ac2430e883702 + languageName: node + linkType: hard + "tinybench@npm:^2.9.0": version: 2.9.0 resolution: "tinybench@npm:2.9.0" @@ -17385,6 +18588,17 @@ __metadata: languageName: node linkType: hard +"tuf-js@npm:^3.0.1": + version: 3.1.0 + resolution: "tuf-js@npm:3.1.0" + dependencies: + "@tufjs/models": "npm:3.0.1" + debug: "npm:^4.4.1" + make-fetch-happen: "npm:^14.0.3" + checksum: 10c0/90d5dbdd0ecf2e42826c6253296aae27db5070d67da6374ac5f69eb0d0244f4043b67e3a84fb12a9a256d5b23d7143127e52fb096264eaacc3027c1d08b172ec + languageName: node + linkType: hard + "tunnel-rat@npm:^0.1.2": version: 0.1.2 resolution: "tunnel-rat@npm:0.1.2" @@ -17401,7 +18615,7 @@ __metadata: languageName: node linkType: hard -"typanion@npm:^3.8.0": +"typanion@npm:^3.14.0, typanion@npm:^3.8.0": version: 3.14.0 resolution: "typanion@npm:3.14.0" checksum: 10c0/8b03b19844e6955bfd906c31dc781bae6d7f1fb3ce4fe24b7501557013d4889ae5cefe671dafe98d87ead0adceb8afcb8bc16df7dc0bd2b7331bac96f3a7cae2 @@ -17417,6 +18631,27 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^0.12.0": + version: 0.12.0 + resolution: "type-fest@npm:0.12.0" + checksum: 10c0/7f88f99fe4aaf2c2e2b0a601c63164e3b218b9378c9bc5d8b514c5170eabd4732abd3f74bb97323c387ae340021d1d814369ef52ab8057481cb785e5306f23ac + languageName: node + linkType: hard + +"type-fest@npm:^0.15.1": + version: 0.15.1 + resolution: "type-fest@npm:0.15.1" + checksum: 10c0/2eff115f870aa2802b1624f6a74069b2237124356ad3302896775c875c92d2365ddefcba72e8bd1c1cade26010a5c41b20797686df621cab32c8739dcf26eb8d + languageName: node + linkType: hard + +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: 10c0/902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8 + languageName: node + linkType: hard + "type-fest@npm:^3.8.0": version: 3.13.1 resolution: "type-fest@npm:3.13.1" @@ -17662,6 +18897,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: 10c0/bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501 + languageName: node + linkType: hard + "undici-types@npm:~6.21.0": version: 6.21.0 resolution: "undici-types@npm:6.21.0" @@ -18651,6 +19893,15 @@ __metadata: languageName: node linkType: hard +"widest-line@npm:^3.1.0": + version: 3.1.0 + resolution: "widest-line@npm:3.1.0" + dependencies: + string-width: "npm:^4.0.0" + checksum: 10c0/b1e623adcfb9df35350dd7fc61295d6d4a1eaa65a406ba39c4b8360045b614af95ad10e05abf704936ed022569be438c4bfa02d6d031863c4166a238c301119f + languageName: node + linkType: hard + "word-wrap@npm:^1.2.5": version: 1.2.5 resolution: "word-wrap@npm:1.2.5" @@ -18669,6 +19920,17 @@ __metadata: languageName: node linkType: hard +"wrap-ansi@npm:^6.2.0": + version: 6.2.0 + resolution: "wrap-ansi@npm:6.2.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/baad244e6e33335ea24e86e51868fe6823626e3a3c88d9a6674642afff1d34d9a154c917e74af8d845fd25d170c4ea9cf69a47133c3f3656e1252b3d462d9f6c + languageName: node + linkType: hard + "wrap-ansi@npm:^8.1.0": version: 8.1.0 resolution: "wrap-ansi@npm:8.1.0" @@ -18708,7 +19970,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^7.5.5": +"ws@npm:^7, ws@npm:^7.5.5": version: 7.5.10 resolution: "ws@npm:7.5.10" peerDependencies: @@ -18828,6 +20090,15 @@ __metadata: languageName: node linkType: hard +"yoga-layout-prebuilt@npm:^1.9.6": + version: 1.10.0 + resolution: "yoga-layout-prebuilt@npm:1.10.0" + dependencies: + "@types/yoga-layout": "npm:1.9.2" + checksum: 10c0/e83b6b7078faf4d0472461b53e92bf9cae655de3d896aee5f79b5ba5a960e507bbf8e671b261db13137bf18711686969f19fd1d9c4669beb1d70754b83c5879d + languageName: node + linkType: hard + "zip-stream@npm:^6.0.1": version: 6.0.1 resolution: "zip-stream@npm:6.0.1"