From 323ee9474f6f000a048ff6f5841fcc413ebecd24 Mon Sep 17 00:00:00 2001 From: Aaron Shafovaloff Date: Thu, 25 Apr 2024 10:32:16 -0600 Subject: [PATCH] replace esmac with Dependency Cruiser test plan: - build passes - run locally: node_modules/.bin/depcruise ./ --include-only "^(ui|packages)" closes CFA-63 Change-Id: I6c053b57e0f7b9d1c13d88a03603dbc9d34f2667 Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/346184 Tested-by: Service Cloud Jenkins Reviewed-by: Isaac Moore Build-Review: Isaac Moore QA-Review: Aaron Shafovaloff Product-Review: Aaron Shafovaloff --- .dependency-cruiser.js | 285 ++++++++++++++++ .../linters/run-gergich-linters.sh | 1 + package.json | 2 +- .../widgets/assignmentRubricDialogSpec.js | 2 +- .../formatAccessViolationError.js | 83 ----- .../formatSpecifierMismatchError.js | 171 ---------- .../webpack/esmac/ErrorFormatter/index.js | 30 -- ui-build/webpack/esmac/ErrorFormatter/util.js | 85 ----- .../webpack/esmac/errorsPendingRemoval.json | 110 ------ ui-build/webpack/esmac/moduleAccessRules.js | 138 -------- ui-build/webpack/index.js | 2 - ui-build/webpack/webpack.plugins.js | 21 -- .../__tests__/ChangeLogRow.test.jsx | 10 +- .../__tests__/ChildContent.test.jsx | 2 +- .../backbone/views/TopicView.jsx | 2 +- .../DiscussionTopicContainer.jsx | 2 +- ui/shared/blueprint-courses/getSampleData.js | 155 +++++++++ .../jquery/assignmentRubricDialog.js | 0 yarn.lock | 312 ++++++++++++++---- 19 files changed, 703 insertions(+), 710 deletions(-) create mode 100644 .dependency-cruiser.js delete mode 100644 ui-build/webpack/esmac/ErrorFormatter/formatAccessViolationError.js delete mode 100644 ui-build/webpack/esmac/ErrorFormatter/formatSpecifierMismatchError.js delete mode 100644 ui-build/webpack/esmac/ErrorFormatter/index.js delete mode 100644 ui-build/webpack/esmac/ErrorFormatter/util.js delete mode 100644 ui-build/webpack/esmac/errorsPendingRemoval.json delete mode 100644 ui-build/webpack/esmac/moduleAccessRules.js create mode 100644 ui/shared/blueprint-courses/getSampleData.js rename ui/{features/discussion_topic => shared/discussions}/jquery/assignmentRubricDialog.js (100%) diff --git a/.dependency-cruiser.js b/.dependency-cruiser.js new file mode 100644 index 00000000000..7b0a173682d --- /dev/null +++ b/.dependency-cruiser.js @@ -0,0 +1,285 @@ +/** @type {import('dependency-cruiser').IConfiguration} */ + +module.exports = { + forbidden: [ + { + name: 'no-circular', + severity: 'info', + comment: + 'This dependency is part of a circular relationship. You might want to revise ' + + 'your solution (i.e. use dependency inversion, make sure the modules have a single responsibility) ', + from: {}, + to: { + circular: true, + }, + }, + { + name: 'no-orphans', + comment: + "This is an orphan module - it's likely not used (anymore?). Either use it or " + + "remove it. If it's logical this module is an orphan (i.e. it's a config file), " + + 'add an exception for it in your dependency-cruiser configuration. By default ' + + 'this rule does not scrutinize dot-files (e.g. .eslintrc.js), TypeScript declaration ' + + 'files (.d.ts), tsconfig.json and some of the babel and webpack configs.', + severity: 'warn', + from: { + orphan: true, + pathNot: [ + '(^|/)[.][^/]+[.](?:js|cjs|mjs|ts|cts|mts|json)$', // dot files + '[.]d[.]ts$', // TypeScript declaration files + '(^|/)tsconfig[.]json$', // TypeScript config + '(^|/)(?:babel|webpack)[.]config[.](?:js|cjs|mjs|ts|cts|mts|json)$', // other configs + ], + }, + to: {}, + }, + { + name: 'no-deprecated-core', + comment: + 'A module depends on a node core module that has been deprecated. Find an alternative - these are ' + + "bound to exist - node doesn't deprecate lightly.", + severity: 'warn', + from: {}, + to: { + dependencyTypes: ['core'], + path: [ + '^v8/tools/codemap$', + '^v8/tools/consarray$', + '^v8/tools/csvparser$', + '^v8/tools/logreader$', + '^v8/tools/profile_view$', + '^v8/tools/profile$', + '^v8/tools/SourceMap$', + '^v8/tools/splaytree$', + '^v8/tools/tickprocessor-driver$', + '^v8/tools/tickprocessor$', + '^node-inspect/lib/_inspect$', + '^node-inspect/lib/internal/inspect_client$', + '^node-inspect/lib/internal/inspect_repl$', + '^async_hooks$', + '^punycode$', + '^domain$', + '^constants$', + '^sys$', + '^_linklist$', + '^_stream_wrap$', + ], + }, + }, + { + name: 'not-to-deprecated', + comment: + 'This module uses a (version of an) npm module that has been deprecated. Either upgrade to a later ' + + 'version of that module, or find an alternative. Deprecated modules are a security risk.', + severity: 'warn', + from: {}, + to: { + dependencyTypes: ['deprecated'], + }, + }, + { + name: 'no-non-package-json', + severity: 'error', + comment: + "This module depends on an npm package that isn't in the 'dependencies' section of your package.json. " + + "That's problematic as the package either (1) won't be available on live (2 - worse) will be " + + 'available on live with an non-guaranteed version. Fix it by adding the package to the dependencies ' + + 'in your package.json.', + from: {}, + to: { + dependencyTypes: ['npm-no-pkg', 'npm-unknown'], + }, + }, + { + name: 'not-to-unresolvable', + comment: + "This module depends on a module that cannot be found ('resolved to disk'). If it's an npm " + + 'module: add it to your package.json. In all other cases you likely already know what to do.', + severity: 'error', + from: {}, + to: { + couldNotResolve: true, + }, + }, + { + name: 'no-duplicate-dep-types', + comment: + "Likely this module depends on an external ('npm') package that occurs more than once " + + 'in your package.json i.e. bot as a devDependencies and in dependencies. This will cause ' + + 'maintenance problems later on.', + severity: 'warn', + from: {}, + to: { + moreThanOneDependencyType: true, + // as it's pretty common to have a type import be a type only import + // _and_ (e.g.) a devDependency - don't consider type-only dependency + // types for this rule + dependencyTypesNot: ['type-only'], + }, + }, + + { + name: 'not-to-spec', + comment: + 'This module depends on a spec (test) file. The sole responsibility of a spec file is to test code. ' + + "If there's something in a spec that's of use to other modules, it doesn't have that single " + + 'responsibility anymore. Factor it out into (e.g.) a separate utility/ helper or a mock.', + severity: 'error', + from: {}, + to: { + path: '[.](?:spec|test)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx|ls|coffee|litcoffee|coffee[.]md)$', + }, + }, + { + name: 'not-to-dev-dep', + severity: 'error', + comment: + "This module depends on an npm package from the 'devDependencies' section of your " + + 'package.json. It looks like something that ships to production, though. To prevent problems ' + + "with npm packages that aren't there on production declare it (only!) in the 'dependencies'" + + 'section of your package.json. If this module is development only - add it to the ' + + 'from.pathNot re of the not-to-dev-dep rule in the dependency-cruiser configuration', + from: { + path: '^(packages)', + pathNot: + '[.](?:spec|test)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx|ls|coffee|litcoffee|coffee[.]md)$', + }, + to: { + dependencyTypes: ['npm-dev'], + // type only dependencies are not a problem as they don't end up in the + // production code or are ignored by the runtime. + dependencyTypesNot: ['type-only'], + pathNot: ['node_modules/@types/', 'node_modules/sinon/'], + }, + }, + { + name: 'optional-deps-used', + severity: 'info', + comment: + 'This module depends on an npm package that is declared as an optional dependency ' + + "in your package.json. As this makes sense in limited situations only, it's flagged here. " + + "If you're using an optional dependency here by design - add an exception to your" + + 'dependency-cruiser configuration.', + from: {}, + to: { + dependencyTypes: ['npm-optional'], + }, + }, + { + name: 'peer-deps-used', + comment: + 'This module depends on an npm package that is declared as a peer dependency ' + + 'in your package.json. This makes sense if your package is e.g. a plugin, but in ' + + 'other cases - maybe not so much. If the use of a peer dependency is intentional ' + + 'add an exception to your dependency-cruiser configuration.', + severity: 'warn', + from: {}, + to: { + dependencyTypes: ['npm-peer'], + }, + }, + { + name: 'no-ui-shared-to-ui-features', + comment: 'Do not allow imports in ui/shared from ui/features', + severity: 'error', + from: { + path: '^ui/shared', + pathNot: [ + // TODO: remove these + 'ui/shared/proxy-submission/react/ProxyUploadModal.tsx', + 'ui/shared/global/env/EnvCoursePaces.d.ts', + 'ui/shared/global/env/EnvCourse.d.ts', + 'ui/shared/discussions/react/components/AnonymousAvatar/AnonymousAvatar.stories.jsx', + ], + }, + to: { + path: '^ui/features', + }, + }, + { + name: 'no-packages-to-ui', + comment: 'Do not allow imports in packages/ from ui/', + severity: 'error', + from: { + path: '^packages/', + pathNot: ['packages/slickgrid/slick.grid.js'], + }, + to: { + path: '^ui/', + }, + }, + { + name: 'no-feature-interdependence', + comment: 'One feature should not depend on another feature (in a separate folder)', + severity: 'error', + from: {path: '(^ui/features/)([^/]+)/'}, + to: {path: '^$1', pathNot: '$1$2'}, + }, + ], + options: { + doNotFollow: { + path: ['node_modules'], + }, + + includeOnly: ['ui', 'packages'], + + /* false (the default): ignore dependencies that only exist before typescript-to-javascript compilation + true: also detect dependencies that only exist before typescript-to-javascript compilation + "specify": for each dependency identify whether it only exists before compilation or also after + */ + tsPreCompilationDeps: false, + + /* if true combines the package.jsons found from the module up to the base + folder the cruise is initiated from. Useful for how (some) mono-repos + manage dependencies & dependency definitions. + */ + combinedDependencies: false, + + /* TypeScript project file ('tsconfig.json') to use for + (1) compilation and + (2) resolution (e.g. with the paths property) + + The (optional) fileName attribute specifies which file to take (relative to + dependency-cruiser's current working directory). When not provided + defaults to './tsconfig.json'. + */ + tsConfig: { + fileName: 'tsconfig.json', + }, + enhancedResolveOptions: { + /* What to consider as an 'exports' field in package.jsons */ + exportsFields: ['exports'], + /* List of conditions to check for in the exports field. + Only works when the 'exportsFields' array is non-empty. + */ + conditionNames: ['import', 'require', 'node', 'default', 'types'], + /* + The extensions, by default are the same as the ones dependency-cruiser + can access (run `npx depcruise --info` to see which ones that are in + _your_ environment. If that list is larger than you need you can pass + the extensions you actually use (e.g. [".js", ".jsx"]). This can speed + up the most expensive step in dependency cruising (module resolution) + quite a bit. + */ + extensions: [".js", ".jsx", ".ts", ".tsx", ".d.ts"], + + /* What to consider a 'main' field in package.json */ + // if you migrate to ESM (or are in an ESM environment already) you will want to + // have "module" in the list of mainFields, like so: + // mainFields: ["module", "main", "types", "typings"], + mainFields: ['main', 'types', 'typings'], + }, + reporterOptions: { + dot: { + collapsePattern: 'node_modules/(?:@[^/]+/[^/]+|[^/]+)', + }, + archi: { + collapsePattern: + '^(?:packages|src|lib(s?)|app(s?)|bin|test(s?)|spec(s?))/[^/]+|node_modules/(?:@[^/]+/[^/]+|[^/]+)', + }, + text: { + highlightFocused: true, + }, + }, + }, +} diff --git a/build/new-jenkins/linters/run-gergich-linters.sh b/build/new-jenkins/linters/run-gergich-linters.sh index dcc9782d625..dce4243208b 100755 --- a/build/new-jenkins/linters/run-gergich-linters.sh +++ b/build/new-jenkins/linters/run-gergich-linters.sh @@ -54,6 +54,7 @@ ruby script/rlint --no-fail-on-offense [ "${SKIP_ESLINT-}" != "true" ] && ruby script/eslint ruby script/lint_commit_message node script/yarn-validate-workspace-deps.js 2>/dev/null < <(yarn --silent workspaces info --json) +node_modules/.bin/depcruise ./ --include-only "^(ui|packages)" node ui-build/tools/component-info.mjs -i -v -g bin/rails css:styleguide doc:api diff --git a/package.json b/package.json index 1235ff02eaf..c3b15890975 100644 --- a/package.json +++ b/package.json @@ -282,6 +282,7 @@ "core-js": "^3.20.3", "core-js-builder": "^3", "css-loader": "^3", + "dependency-cruiser": "^16.3.1", "ember-template-compiler": "^1.8.0", "enzyme": "^3", "enzyme-adapter-react-16": "^1.15.7", @@ -376,7 +377,6 @@ "webpack": "^5", "webpack-bundle-analyzer": "^4.5.0", "webpack-cli": "^4", - "webpack-esmac-plugin": "^4.0.0", "webpack-manifest-plugin": "^5", "wrap-ansi": "^7.0.0", "wsrun": "^5", diff --git a/spec/coffeescripts/widgets/assignmentRubricDialogSpec.js b/spec/coffeescripts/widgets/assignmentRubricDialogSpec.js index e786461964f..a80c611ac75 100644 --- a/spec/coffeescripts/widgets/assignmentRubricDialogSpec.js +++ b/spec/coffeescripts/widgets/assignmentRubricDialogSpec.js @@ -41,7 +41,7 @@ import $ from 'jquery' import 'jquery-migrate' -import assignmentRubricDialog from 'ui/features/discussion_topic/jquery/assignmentRubricDialog' +import assignmentRubricDialog from '@canvas/discussions/jquery/assignmentRubricDialog' QUnit.module('assignmentRubricDialog') diff --git a/ui-build/webpack/esmac/ErrorFormatter/formatAccessViolationError.js b/ui-build/webpack/esmac/ErrorFormatter/formatAccessViolationError.js deleted file mode 100644 index fc8a349cc78..00000000000 --- a/ui-build/webpack/esmac/ErrorFormatter/formatAccessViolationError.js +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2021 - present Instructure, Inc. - * - * This file is part of Canvas. - * - * Canvas is free software: you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License as published by the Free - * Software Foundation, version 3 of the License. - * - * Canvas is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. - * - * You should have received a copy of the GNU Affero General Public License along - * with this program. If not, see . - */ - -const t = require('./util') - -module.exports = error => { - const {request, source, target} = error - - let message = '' - let hint = '' - - message += `\n` - message += t.wordWrap(`Access to the following module is not allowed from this layer:`, 72) - message += `\n \n` - message += ` ${request}` - message += `\n \n` - message += `Which resolved to:` - message += `\n \n` - message += ` ${target}` - message += `\n \n` - - if (source.startsWith('ui/features/') && target.startsWith('ui/features/')) { - hint += '' - hint += `\n` - hint += t.wordWrap( - ` - Feature modules may not access different feature modules. Instead, you - can extract the common code into a Canvas package under ui/shared/ - or into a generic package under packages/ in case it has no dependency - on Canvas. - `, - 60 - ) - } else if (source.startsWith('ui/shared') && target.startsWith('ui/features/')) { - hint += '' - hint += `\n` - hint += t.wordWrap( - ` - Canvas package modules may not access feature modules. You can extract - the desired code into another Canvas package (or your own) and access it - as you would other Canvas packages. - `, - 60 - ) - } else if (source.startsWith('packages/') && target.startsWith('ui/')) { - hint += '' - hint += `\n` - hint += t.wordWrap( - ` - Package modules may not access anything under ui/, including Canvas - packages. If this dependency is legitimate, you can 1) turn this package - into a Canvas one where it may access other Canvas packages, or 2) extract - the desired code into another generic package (or your own.) - `, - 60 - ) - } else if (target.startsWith('ui/boot/')) { - hint += `` - hint += `\n` - hint += t.wordWrap(`You don't access ui/boot/, ui/boot/ accesses you.`, 60) - } - - if (hint.length) { - message += t.bracketize(hint) - } - - return t.alignWithWebpackStackTrace(t.bracketize(message)) -} diff --git a/ui-build/webpack/esmac/ErrorFormatter/formatSpecifierMismatchError.js b/ui-build/webpack/esmac/ErrorFormatter/formatSpecifierMismatchError.js deleted file mode 100644 index 400d9d11e7f..00000000000 --- a/ui-build/webpack/esmac/ErrorFormatter/formatSpecifierMismatchError.js +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (C) 2021 - present Instructure, Inc. - * - * This file is part of Canvas. - * - * Canvas is free software: you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License as published by the Free - * Software Foundation, version 3 of the License. - * - * Canvas is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. - * - * You should have received a copy of the GNU Affero General Public License along - * with this program. If not, see . - */ - -const micromatch = require('micromatch') -const path = require('path') -const t = require('./util') - -module.exports = error => { - const {rule, ruleIndex, request} = error - - let message = '' - - message += `\nImport violates encapsulation integrity:` - message += `\n \n` - message += ` ${request}` - message += `\n \n` - message += t.wordWrap( - `According to rule #${ruleIndex + 1}: "${rule.rule.trim().replace(/\s+/g, ' ')}"`, - 72 - ) - message += `\n \n` - - if (rule.specifier === 'relative') { - message += expectedRelativeSpecifier(error) - } else if (rule.specifier === 'package') { - message += expectedPackageSpecifier(error) - } - - return t.alignWithWebpackStackTrace(t.bracketize(message)) -} - -const expectedRelativeSpecifier = ({source, target, request}) => { - const suggestion = t.withLeadingDotSlash( - path.relative(path.dirname(source), t.withOrWithoutExtension(request, target)) - ) - - let message = '' - - message += `` - message += `\n` - message += `Use a relative specifier:` - message += `\n \n` - message += ` ${suggestion}` - message += `\n` - - return t.bracketize(message) -} - -const expectedPackageSpecifier = error => { - const {target} = error - - if (target.startsWith('ui/shared')) { - // eslint-disable-next-line react-hooks/rules-of-hooks - return useOrAddCanvasPackage(error) - } else if (target.startsWith('packages/')) { - // eslint-disable-next-line react-hooks/rules-of-hooks - return useOrAddGenericPackage(error) - } -} - -const useOrAddGenericPackage = error => { - const {target} = error - const [packageName] = micromatch.capture('packages/*/**', target) - const [pjsonFile, pjson] = - t.findPackageJSON(target, [packageName, `@instructure/${packageName}`]) || [] - - if (pjsonFile) { - // eslint-disable-next-line react-hooks/rules-of-hooks - return useExistingPackage(error, {pjsonFile, pjson}) - } else { - return addGenericPackage(error, {packageName}) - } -} - -const addGenericPackage = (error, {packageName}) => { - let message = '' - - message += `` - message += `\n` - message += t.wordWrap( - ` - Package is missing a package.json, you should add one at - packages/${packageName}/package.json with contents similar to: - `, - 72 - ) - message += `\n` - message += ` - { - "name": "${packageName}", - "version": "1.0.0" - }` - - message += `\n` - - return message -} - -const useOrAddCanvasPackage = error => { - const {target} = error - const [packageName] = micromatch.capture('ui/shared/*/**', target) || [] - const [pjsonFile, pjson] = t.findPackageJSON(target, [`@canvas/${packageName}`]) || [] - - if (pjsonFile) { - // eslint-disable-next-line react-hooks/rules-of-hooks - return useExistingPackage(error, {pjsonFile, pjson}) - } else { - return addCanvasPackage(error, {packageName}) - } -} - -const addCanvasPackage = (error, {packageName}) => { - let message = '' - - message += '' - message += `\n` - message += t.wordWrap( - ` - Canvas package is missing a package.json, you must add one at - ui/shared/${packageName}/package.json with contents similar to: - `.trim(), - 72 - ) - message += `\n` - message += ` - { - "name": "@canvas/${packageName}", - "version": "1.0.0", - "private": true - }` - message += `\n` - - return t.bracketize(message) -} - -const useExistingPackage = ({request, target}, {pjsonFile, pjson}) => { - const suggestion = [ - pjson.name, // e.g. @canvas/foo - path.relative( - // e.g. lib/index.js - path.dirname(pjsonFile), - t.withOrWithoutExtension(request, target) // or lib/index, w/o extension - ), - ].join('/') - - let message = '' - - message += `` - message += `\n` - message += `Use a bare specifier:` - message += `\n \n` - message += ` ${suggestion}` - message += `\n` - - return t.bracketize(message) -} diff --git a/ui-build/webpack/esmac/ErrorFormatter/index.js b/ui-build/webpack/esmac/ErrorFormatter/index.js deleted file mode 100644 index 5b66c0e1b02..00000000000 --- a/ui-build/webpack/esmac/ErrorFormatter/index.js +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2021 - present Instructure, Inc. - * - * This file is part of Canvas. - * - * Canvas is free software: you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License as published by the Free - * Software Foundation, version 3 of the License. - * - * Canvas is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. - * - * You should have received a copy of the GNU Affero General Public License along - * with this program. If not, see . - */ - -const formatAccessViolationError = require('./formatAccessViolationError') -const formatSpecifierMismatchError = require('./formatSpecifierMismatchError') - -module.exports = function (error) { - if (error.name === 'AccessViolationError') { - return formatAccessViolationError(error) - } else if (error.name === 'SpecifierMismatchError') { - return formatSpecifierMismatchError(error) - } else { - return error.toString() - } -} diff --git a/ui-build/webpack/esmac/ErrorFormatter/util.js b/ui-build/webpack/esmac/ErrorFormatter/util.js deleted file mode 100644 index b23e433898b..00000000000 --- a/ui-build/webpack/esmac/ErrorFormatter/util.js +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2021 - present Instructure, Inc. - * - * This file is part of Canvas. - * - * Canvas is free software: you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License as published by the Free - * Software Foundation, version 3 of the License. - * - * Canvas is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. - * - * You should have received a copy of the GNU Affero General Public License along - * with this program. If not, see . - */ - -const path = require('path') -const wrapAnsi = require('wrap-ansi') -const findUp = require('find-up') - -exports.bracketize = message => { - const lines = message.split('\n') - - return lines - .slice(0, 1) - .concat([':']) - .concat(lines.slice(1).map(line => `| ${line}`)) - .concat([':']) - .join('\n') -} - -// webpack's stack trace is padded by 1 space, it's easier on the eyes to align -// the message to it -exports.alignWithWebpackStackTrace = message => - message - .split('\n') - .map(x => ` ${x}`) - .join('\n') - -exports.wordWrap = (paragraph, columns = 72) => - wrapAnsi(paragraph.trim().replace(/\s{2,}/g, ' '), columns) - -// node's path#relative() function doesn't show a leading ./, which is confusing -// if you're trying to communicate a path should be relative because it -// otherwise looks bare -exports.withLeadingDotSlash = x => (x.startsWith('.') ? x : `./${x}`) - -// if the original file has an extension, keep it in the suggested version, -// otherwise omit it (suggested is assumed to always have an extension!) -exports.withOrWithoutExtension = (original, suggested) => { - const originalExt = path.extname(original) - - if (originalExt.length) { - return suggested - } - - const suggestedExt = path.extname(suggested) - - if (suggestedExt.length) { - return suggested.slice(0, -suggestedExt.length) - } else { - return suggested - } -} - -const findPackageJSON = (file, names) => { - const pjsonFile = findUp.sync('package.json', {cwd: path.dirname(file)}) - - if (!pjsonFile) { - return null - } - - // eslint-disable-next-line import/no-dynamic-require - const pjson = require(pjsonFile) - - if (pjson.name && names.includes(pjson.name)) { - return [pjsonFile, pjson] - } else { - return findPackageJSON(path.dirname(pjsonFile), names) - } -} - -exports.findPackageJSON = findPackageJSON diff --git a/ui-build/webpack/esmac/errorsPendingRemoval.json b/ui-build/webpack/esmac/errorsPendingRemoval.json deleted file mode 100644 index e47db9d839c..00000000000 --- a/ui-build/webpack/esmac/errorsPendingRemoval.json +++ /dev/null @@ -1,110 +0,0 @@ -[ - { - "name": "AccessViolationError", - "source": "packages/jqueryui/tooltip.js", - "target": "ui/shared/i18n/rtlHelper.js", - "request": "@canvas/i18n/rtlHelper" - }, - { - "name": "AccessViolationError", - "source": "packages/slickgrid/slick.grid.js", - "target": "ui/shared/i18n/rtlHelper.js", - "request": "@canvas/i18n/rtlHelper" - }, - { - "name": "AccessViolationError", - "source": "ui/features/assignments_show_student/react/components/AttemptType/MediaAttempt.js", - "target": "ui/features/media_player_iframe_content/react/CanvasMediaPlayer.js", - "request": "../../../../media_player_iframe_content/react/CanvasMediaPlayer" - }, - { - "name": "AccessViolationError", - "source": "ui/features/collaborations/index.js", - "target": "ui/boot/initializers/activateKeyClicks.js", - "request": "../../boot/initializers/activateKeyClicks.js" - }, - { - "name": "SpecifierMismatchError", - "source": "ui/features/discussion_topics_post/graphql/Mutations.js", - "target": "ui/shared/graphql/Error.js", - "request": "../../../shared/graphql/Error" - }, - { - "name": "SpecifierMismatchError", - "source": "ui/features/grade_summary/graphql/Mutations.js", - "target": "ui/shared/graphql/Error.js", - "request": "../../../shared/graphql/Error" - }, - { - "name": "SpecifierMismatchError", - "source": "ui/features/discussion_topic_edit_v2/graphql/Mutations.js", - "target": "ui/shared/graphql/Error.js", - "request": "../../../shared/graphql/Error" - }, - { - "name": "AccessViolationError", - "source": "ui/features/discussion_topics_post/react/containers/DiscussionTopicContainer/DiscussionTopicContainer.jsx", - "target": "ui/features/discussion_topic/jquery/assignmentRubricDialog.js", - "request": "../../../../discussion_topic/jquery/assignmentRubricDialog" - }, - { - "name": "SpecifierMismatchError", - "source": "ui/features/discussion_topics_post/react/containers/DiscussionTopicContainer/DiscussionTopicContainer.jsx", - "target": "ui/shared/rubrics/jquery/edit_rubric.jsx", - "request": "../../../../../shared/rubrics/jquery/edit_rubric" - }, - { - "name": "AccessViolationError", - "source": "ui/features/gradebook/react/default_gradebook/Gradebook.tsx", - "target": "ui/boot/initializers/activateKeyClicks.js", - "request": "../../../../boot/initializers/activateKeyClicks" - }, - { - "name": "AccessViolationError", - "source": "ui/features/assignment_edit/backbone/views/EditView.jsx", - "target": "ui/boot/initializers/activateTooltips.js", - "request": "../../../../boot/initializers/activateTooltips" - }, - { - "name": "AccessViolationError", - "source": "ui/features/gradebook/react/default_gradebook/Gradebook.tsx", - "target": "ui/boot/initializers/activateTooltips.js", - "request": "../../../../boot/initializers/activateTooltips" - }, - { - "name": "SpecifierMismatchError", - "source": "ui/features/inbox/graphql/Mutations.js", - "target": "ui/shared/graphql/Error.js", - "request": "../../../shared/graphql/Error" - }, - { - "name": "SpecifierMismatchError", - "source": "ui/shared/apollo/index.js", - "target": "ui/shared/encrypted-forage/index.js", - "request": "../encrypted-forage" - }, - { - "name": "SpecifierMismatchError", - "source": "ui/shared/outcomes/react/hooks/useGroupCreate.js", - "target": "ui/shared/outcomes/graphql/Management.js", - "request": "@canvas/outcomes/graphql/Management" - }, - { - "name": "SpecifierMismatchError", - "source": "ui/shared/outcomes/react/hooks/useGroupDetail.js", - "target": "ui/shared/outcomes/graphql/Management.js", - "request": "@canvas/outcomes/graphql/Management" - }, - { - "name": "SpecifierMismatchError", - "source": "ui/shared/outcomes/react/hooks/useOutcomesImport.js", - "target": "ui/shared/outcomes/graphql/Management.js", - "request": "@canvas/outcomes/graphql/Management" - }, - { - "name": "SpecifierMismatchError", - "source": "ui/shared/outcomes/react/hooks/useOutcomesImport.js", - "target": "ui/shared/outcomes/react/hooks/useCanvasContext.js", - "request": "@canvas/outcomes/react/hooks/useCanvasContext" - } -] diff --git a/ui-build/webpack/esmac/moduleAccessRules.js b/ui-build/webpack/esmac/moduleAccessRules.js deleted file mode 100644 index 73cd3ad6163..00000000000 --- a/ui-build/webpack/esmac/moduleAccessRules.js +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (C) 2021 - present Instructure, Inc. - * - * This file is part of Canvas. - * - * Canvas is free software: you can redistribute it and/or modify it under - * the terms of the GNU Affero General Public License as published by the Free - * Software Foundation, version 3 of the License. - * - * Canvas is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more - * details. - * - * You should have received a copy of the GNU Affero General Public License along - * with this program. If not, see . - */ - -module.exports = [ - { - rule: 'Let the initializer do what it needs to', - source: 'ui/index.ts', - target: '**', - specifier: 'any', - }, - - { - rule: 'Let boot code do what it needs to', - source: 'ui/boot/**', - target: '**', - specifier: 'any', - }, - - { - rule: 'Allow extensions to dynamically import from gems/plugins', - source: 'ui/shared/bundles/**', - target: '**', - specifier: 'any', - }, - - { - rule: 'Allow engine entrypoints to source everything there', - source: 'ui/engine/{index.ts,capabilities/index.ts}', - target: 'ui/engine/**', - specifier: 'relative', - }, - - { - rule: 'Allow capabilities to depend on each other', - source: 'ui/engine/capabilities/*/**', - target: 'ui/engine/capabilities/*/**', - specifier: 'relative', - }, - - { - source: 'ui/features/*/index.js', - target: 'ui/engine/**', - specifier: 'bare', - }, - - { - rule: 'Let everyone consume legacy public/javascripts/', - source: '**', - target: 'public/javascripts/**', - specifier: 'bare', - }, - - { - rule: 'Let calendar monkey patch moment/timezone', - source: 'ui/features/calendar/ext/**', - target: 'ui/ext/custom_{moment,timezone}_locales/**', - specifier: 'relative', - }, - - { - rule: ` - Modules of the same package (packages/*) should import each other - using relative specifiers. - `, - source: 'packages/*/**', - target: 'packages/*/**', - boundary: 0, - specifier: 'relative', - }, - - { - rule: ` - Package modules (packages/*/**) may only be accessed through - their package. - `, - source: '**', - target: 'packages/**', - specifier: 'package', - }, - - { - rule: ` - Modules of the same Canvas package (ui/shared/*) should import each - other using relative specifiers. - `, - source: 'ui/shared/*/**', - target: 'ui/shared/*/**', - boundary: 0, - specifier: 'relative', - }, - - { - rule: ` - Canvas package modules (ui/shared/*/**) may only be accessed - through their package. - `, - source: '{gems/plugins,public/javascripts,ui}/**', - target: 'ui/shared/**', - specifier: 'package', - }, - - { - rule: ` - Modules of the same feature (ui/features/*) should import each - other using relative specifiers. - `, - source: 'ui/features/*/**', - target: 'ui/features/*/**', - boundary: 0, - specifier: 'relative', - }, - - { - rule: ` - Modules of the same plugin should import each other using relative - specifiers. - `, - source: 'gems/plugins/*/**', - target: 'gems/plugins/*/**', - boundary: 0, - specifier: 'relative', - }, -] diff --git a/ui-build/webpack/index.js b/ui-build/webpack/index.js index c0261421444..04b3b5e59cf 100644 --- a/ui-build/webpack/index.js +++ b/ui-build/webpack/index.js @@ -41,7 +41,6 @@ const { const { buildCacheOptions, - controlAccessBetweenModules, customSourceFileExtensions, environmentVars, excludeMomentLocales, @@ -175,7 +174,6 @@ module.exports = { isProduction && timezoneData, // adds 3-4 seconds to build time, customSourceFileExtensions, webpackHooks, - controlAccessBetweenModules, setMoreEnvVars, provideJQuery, moduleFederation, diff --git a/ui-build/webpack/webpack.plugins.js b/ui-build/webpack/webpack.plugins.js index c3c0715e3ce..1842dccddcb 100644 --- a/ui-build/webpack/webpack.plugins.js +++ b/ui-build/webpack/webpack.plugins.js @@ -25,7 +25,6 @@ const { } = require('@rspack/core') const {resolve} = require('path') const MomentTimezoneDataPlugin = require('moment-timezone-data-webpack-plugin') -const EsmacPlugin = require('webpack-esmac-plugin') const {WebpackManifestPlugin} = require('rspack-manifest-plugin') const {RetryChunkLoadPlugin} = require('webpack-retry-chunk-load-plugin') const { @@ -69,26 +68,6 @@ exports.timezoneData = new MomentTimezoneDataPlugin({ // cf. ui-build/webpack/webpackHooks/macNotifications.sh exports.webpackHooks = new WebpackHooks() -// controls access between modules; enforces where you can import from -// i.e. can't import features into packages, or ui/shared into packages -exports.controlAccessBetweenModules = new EsmacPlugin({ - test: /\.[tj]sx?$/, - include: [ - resolve(canvasDir, 'ui/features'), - resolve(canvasDir, 'ui/shared'), - resolve(canvasDir, 'packages'), - resolve(canvasDir, 'public/javascripts'), - resolve(canvasDir, 'gems/plugins'), - ], - exclude: [/\/node_modules\//], - formatter: require('./esmac/ErrorFormatter'), - rules: require('./esmac/moduleAccessRules'), - permit: - process.env.WEBPACK_ENCAPSULATION_DEBUG === '1' - ? [] - : require('./esmac/errorsPendingRemoval.json'), -}) - exports.setMoreEnvVars = new DefinePlugin({ CANVAS_WEBPACK_PUBLIC_PATH: JSON.stringify(webpackPublicPath), NODE_ENV: null, diff --git a/ui/features/blueprint_course_child/react/components/__tests__/ChangeLogRow.test.jsx b/ui/features/blueprint_course_child/react/components/__tests__/ChangeLogRow.test.jsx index 9e747d39848..318e5c82ad2 100644 --- a/ui/features/blueprint_course_child/react/components/__tests__/ChangeLogRow.test.jsx +++ b/ui/features/blueprint_course_child/react/components/__tests__/ChangeLogRow.test.jsx @@ -19,10 +19,8 @@ import React from 'react' import {render} from '@testing-library/react' import {shallow} from 'enzyme' -import ChangeLogRow, { - ChangeRow, -} from '../ChangeLogRow' -import getSampleData from '../../../../blueprint_course_master/react/components/__tests__/getSampleData' +import ChangeLogRow, {ChangeRow} from '../ChangeLogRow' +import getSampleData from '@canvas/blueprint-courses/getSampleData' describe('ChangeLogRow component', () => { const defaultProps = () => ({ @@ -62,7 +60,9 @@ describe('ChangeLogRow component', () => { test('renders lock icon when its a ChangeRow component', () => { const tree = render() - const node = tree.container.querySelector('.bcs__history-item__content .bcs__history-item__lock-icon') + const node = tree.container.querySelector( + '.bcs__history-item__content .bcs__history-item__lock-icon' + ) expect(node).toBeTruthy() }) }) diff --git a/ui/features/blueprint_course_child/react/components/__tests__/ChildContent.test.jsx b/ui/features/blueprint_course_child/react/components/__tests__/ChildContent.test.jsx index eb8f6a1586e..8d66077897d 100644 --- a/ui/features/blueprint_course_child/react/components/__tests__/ChildContent.test.jsx +++ b/ui/features/blueprint_course_child/react/components/__tests__/ChildContent.test.jsx @@ -20,7 +20,7 @@ import React from 'react' import {render} from '@testing-library/react' import {shallow} from 'enzyme' import ChildContent from '../ChildContent' -import getSampleData from '../../../../blueprint_course_master/react/components/__tests__/getSampleData' +import getSampleData from '@canvas/blueprint-courses/getSampleData' import sinon from 'sinon' describe('ChildContent app', () => { diff --git a/ui/features/discussion_topic/backbone/views/TopicView.jsx b/ui/features/discussion_topic/backbone/views/TopicView.jsx index 2fe19592c3f..47741579e62 100644 --- a/ui/features/discussion_topic/backbone/views/TopicView.jsx +++ b/ui/features/discussion_topic/backbone/views/TopicView.jsx @@ -25,7 +25,7 @@ import EntryView from './EntryView' import PublishButtonView from '@canvas/publish-button-view' import replyTemplate from '../../jst/_reply_form.handlebars' import Reply from '../Reply' -import assignmentRubricDialog from '../../jquery/assignmentRubricDialog' +import assignmentRubricDialog from '@canvas/discussions/jquery/assignmentRubricDialog' import * as RceCommandShim from '@canvas/rce-command-shim' import htmlEscape from '@instructure/html-escape' import AssignmentExternalTools from '@canvas/assignments/react/AssignmentExternalTools' diff --git a/ui/features/discussion_topics_post/react/containers/DiscussionTopicContainer/DiscussionTopicContainer.jsx b/ui/features/discussion_topics_post/react/containers/DiscussionTopicContainer/DiscussionTopicContainer.jsx index 2b7d0c4f18e..dd3cc84facf 100644 --- a/ui/features/discussion_topics_post/react/containers/DiscussionTopicContainer/DiscussionTopicContainer.jsx +++ b/ui/features/discussion_topics_post/react/containers/DiscussionTopicContainer/DiscussionTopicContainer.jsx @@ -50,7 +50,7 @@ import {Text} from '@instructure/ui-text' import {Responsive} from '@instructure/ui-responsive/lib/Responsive' import '@canvas/context-cards/react/StudentContextCardTrigger' -import assignmentRubricDialog from '../../../../discussion_topic/jquery/assignmentRubricDialog' +import assignmentRubricDialog from '@canvas/discussions/jquery/assignmentRubricDialog' import rubricEditing from '../../../../../shared/rubrics/jquery/edit_rubric' const I18n = useI18nScope('discussion_posts') diff --git a/ui/shared/blueprint-courses/getSampleData.js b/ui/shared/blueprint-courses/getSampleData.js new file mode 100644 index 00000000000..df0e3fd9be0 --- /dev/null +++ b/ui/shared/blueprint-courses/getSampleData.js @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2023 - present Instructure, Inc. + * + * This file is part of Canvas. + * + * Canvas is free software: you can redistribute it and/or modify it under + * the terms of the GNU Affero General Public License as published by the Free + * Software Foundation, version 3 of the License. + * + * Canvas is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more + * details. + * + * You should have received a copy of the GNU Affero General Public License along + * with this program. If not, see . + */ + +/* + * Copyright (C) 2017 - present Instructure, Inc. + * + * This file is part of Canvas. + * + * Canvas is free software: you can redistribute it and/or modify it under + * the terms of the GNU Affero General Public License as published by the Free + * Software Foundation, version 3 of the License. + * + * Canvas is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more + * details. + * + * You should have received a copy of the GNU Affero General Public License along + * with this program. If not, see . + */ + +export default function getSampleData() { + return { + terms: [ + {id: '1', name: 'Term One'}, + {id: '2', name: 'Term Two'}, + ], + subAccounts: [ + {id: '1', name: 'Account One'}, + {id: '2', name: 'Account Two'}, + ], + childCourse: { + id: '1', + enrollment_term_id: '1', + name: 'Course 1', + }, + masterCourse: { + id: '2', + enrollment_term_id: '1', + name: 'Course 2', + }, + courses: [ + { + id: '1', + name: 'Course One', + course_code: 'course_1', + term: { + id: '1', + name: 'Term One', + }, + teachers: [ + { + display_name: 'Teacher One', + }, + ], + sis_course_id: '1001', + }, + { + id: '2', + name: 'Course Two', + course_code: 'course_2', + term: { + id: '2', + name: 'Term Two', + }, + teachers: [ + { + display_name: 'Teacher Two', + }, + ], + sis_course_id: '1001', + }, + ], + history: [ + { + id: '2', + workflow_state: 'completed', + created_at: '2013-08-28T23:59:00-06:00', + user: { + display_name: 'Bob Jones', + }, + changes: [ + { + asset_id: '2', + asset_type: 'quiz', + asset_name: 'Chapter 5 Quiz', + change_type: 'updated', + html_url: 'http://localhost:3000/courses/3/quizzes/2', + exceptions: [ + { + course_id: '1', + conflicting_changes: ['points'], + name: 'Course 1', + term: {name: 'Default Term'}, + }, + { + course_id: '5', + conflicting_changes: ['content'], + name: 'Course 5', + term: {name: 'Default Term'}, + }, + { + course_id: '56', + conflicting_changes: ['deleted'], + name: 'Course 56', + term: {name: 'Default Term'}, + }, + ], + }, + ], + }, + ], + unsyncedChanges: [ + { + asset_id: '22', + asset_type: 'assignment', + asset_name: 'Another Discussion', + change_type: 'deleted', + html_url: '/courses/4/assignments/22', + locked: false, + }, + { + asset_id: '22', + asset_type: 'attachment', + asset_name: 'Bulldog.png', + change_type: 'updated', + html_url: '/courses/4/files/96', + locked: true, + }, + { + asset_id: 'page-1', + asset_type: 'wiki_page', + asset_name: 'Page 1', + change_type: 'created', + html_url: '/4/pages/page-1', + locked: false, + }, + ], + } +} diff --git a/ui/features/discussion_topic/jquery/assignmentRubricDialog.js b/ui/shared/discussions/jquery/assignmentRubricDialog.js similarity index 100% rename from ui/features/discussion_topic/jquery/assignmentRubricDialog.js rename to ui/shared/discussions/jquery/assignmentRubricDialog.js diff --git a/yarn.lock b/yarn.lock index 59adb97f0bc..d1428e13494 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7567,6 +7567,16 @@ acorn-import-assertions@^1.7.6: resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== +acorn-jsx-walk@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/acorn-jsx-walk/-/acorn-jsx-walk-2.0.0.tgz#a5ed648264e68282d7c2aead80216bfdf232573a" + integrity sha512-uuo6iJj4D4ygkdzd6jPtcxs8vZgDX9YFIkqczGImoypX2fQ4dVImmu3UzA4ynixCIMTrEOWW+95M2HuBaCEOVA== + +acorn-jsx@5.3.2, acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + acorn-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" @@ -7574,26 +7584,33 @@ acorn-jsx@^3.0.0: dependencies: acorn "^3.0.4" -acorn-jsx@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" - integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== +acorn-loose@8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/acorn-loose/-/acorn-loose-8.4.0.tgz#26d3e219756d1e180d006f5bcc8d261a28530f55" + integrity sha512-M0EUka6rb+QC4l9Z3T0nJEzNOO7JcoJlYMrBlyBCiFSXRyxjLKayd4TbQs2FDRWQU1h9FR7QVNHt+PEaoNL5rQ== + dependencies: + acorn "^8.11.0" + +acorn-walk@8.3.2, acorn-walk@^8.0.0, acorn-walk@^8.0.2, acorn-walk@^8.1.1, acorn-walk@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== acorn-walk@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn-walk@^8.0.0, acorn-walk@^8.0.2, acorn-walk@^8.1.1, acorn-walk@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" - integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== - acorn@5.X, acorn@^5.0.3, acorn@^5.5.0: version "5.7.4" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== +acorn@8.11.3, acorn@^8.0.4, acorn@^8.1.0, acorn@^8.10.0, acorn@^8.11.0, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" @@ -7609,11 +7626,6 @@ acorn@^7.4.0, acorn@^7.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.0.4, acorn@^8.1.0, acorn@^8.10.0, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== - address@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" @@ -7701,6 +7713,16 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" +ajv@8.12.0, ajv@^8.0.0, ajv@^8.0.1, ajv@^8.9.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + ajv@^4.7.0: version "4.11.8" resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" @@ -7719,16 +7741,6 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.0.1, ajv@^8.9.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" @@ -7812,6 +7824,11 @@ ansi-regex@^5.0.0, ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -7836,6 +7853,11 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +ansi-styles@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + ansi-to-html@^0.6.11: version "0.6.15" resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.15.tgz#ac6ad4798a00f6aa045535d7f6a9cb9294eebea7" @@ -9633,6 +9655,11 @@ chain-function@^1.0.0: resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.1.tgz#c63045e5b4b663fb86f1c6e186adaf1de402a1cc" integrity sha512-SxltgMwL9uCko5/ZCLiyG2B7R9fY4pDZUw7hJ4MhirdjBLosoDqkWABi3XMucddHdLiFJMb7PD2MZifZriuMTg== +chalk@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -10222,6 +10249,11 @@ comma-separated-tokens@^1.0.0: resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== +commander@12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.0.0.tgz#b929db6df8546080adfd004ab215ed48cf6f2592" + integrity sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA== + commander@2.11.x: version "2.11.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" @@ -11293,6 +11325,39 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +dependency-cruiser@^16.3.1: + version "16.3.1" + resolved "https://registry.yarnpkg.com/dependency-cruiser/-/dependency-cruiser-16.3.1.tgz#415eab418150dced131c82bd8e3084b0310df316" + integrity sha512-ZwhVjKrCr3Fk7Vb5FfDvkcAcqxttmbb26C9fjuJJVhqDGdgtJQnQ1k1sRY9UbgIBDmMlBTn8/Ccs2b/+TlqOSQ== + dependencies: + acorn "8.11.3" + acorn-jsx "5.3.2" + acorn-jsx-walk "2.0.0" + acorn-loose "8.4.0" + acorn-walk "8.3.2" + ajv "8.12.0" + chalk "5.3.0" + commander "12.0.0" + enhanced-resolve "5.16.0" + figures "6.1.0" + ignore "5.3.1" + indent-string "5.0.0" + interpret "^3.1.1" + is-installed-globally "1.0.0" + json5 "2.2.3" + lodash "4.17.21" + memoize "10.0.0" + picomatch "4.0.2" + prompts "2.4.2" + rechoir "^0.8.0" + safe-regex "2.1.1" + semver "^7.6.0" + semver-try-require "6.2.3" + teamcity-service-messages "0.1.14" + tsconfig-paths-webpack-plugin "4.1.0" + watskeburt "4.0.2" + wrap-ansi "9.0.0" + des.js@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" @@ -11712,6 +11777,11 @@ emoji-mart@^3.0.1: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.1.tgz#c6cd0ec1b0642e2a3c67a1137efc5e796da4f88e" integrity sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4= +emoji-regex@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23" + integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -11789,7 +11859,7 @@ engine.io@~6.2.0: engine.io-parser "~5.0.3" ws "~8.2.3" -enhanced-resolve@5.12.0, enhanced-resolve@^5.10.0: +enhanced-resolve@5.12.0: version "5.12.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== @@ -11797,6 +11867,14 @@ enhanced-resolve@5.12.0, enhanced-resolve@^5.10.0: graceful-fs "^4.2.4" tapable "^2.2.0" +enhanced-resolve@5.16.0, enhanced-resolve@^5.10.0, enhanced-resolve@^5.7.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" + integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + enhanced-resolve@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" @@ -12512,15 +12590,6 @@ eslint@^7: text-table "^0.2.0" v8-compile-cache "^2.0.3" -esmac@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/esmac/-/esmac-3.0.0.tgz#bf0703c19a51d8f3aca710314026b0f40ddf6362" - integrity sha512-7wLt2YVfTVUdO24Oh46D1b27pAOrpm488PMjiGzwwjslGFI5UoPzla8IqjS4H3dl54m25XTejv0xhXjbIsXZvw== - dependencies: - find-up "^5.0.0" - invariant "^2.2.4" - micromatch "^4.0.4" - esotope-hammerhead@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/esotope-hammerhead/-/esotope-hammerhead-0.6.1.tgz#3feca697baede6cc89ce387f1e0bfa246d6e256d" @@ -13152,6 +13221,13 @@ figgy-pudding@^3.5.1: resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== +figures@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-6.1.0.tgz#935479f51865fa7479f6fa94fc6fc7ac14e62c4a" + integrity sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg== + dependencies: + is-unicode-supported "^2.0.0" + figures@^1.3.5, figures@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" @@ -13928,6 +14004,11 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-east-asian-width@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz#5e6ebd9baee6fb8b7b6bd505221065f0cd91f64e" + integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== + get-func-name@^2.0.1, get-func-name@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" @@ -14123,6 +14204,13 @@ glob@^7, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^ once "^1.3.0" path-is-absolute "^1.0.0" +global-directory@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" + integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== + dependencies: + ini "4.1.1" + global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -15171,6 +15259,11 @@ ignore-styles@^5.0.1: resolved "https://registry.yarnpkg.com/ignore-styles/-/ignore-styles-5.0.1.tgz#b49ef2274bdafcd8a4880a966bfe38d1a0bf4671" integrity sha1-tJ7yJ0va/NikiAqWa/440aC/RnE= +ignore@5.3.1, ignore@^5.0.5, ignore@^5.0.6, ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + ignore@^3.2.0: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" @@ -15181,11 +15274,6 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.0.5, ignore@^5.0.6, ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" - integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== - immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" @@ -15258,6 +15346,11 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +indent-string@5.0.0, indent-string@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" + integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== + indent-string@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-1.2.2.tgz#db99bcc583eb6abbb1e48dcbb1999a986041cb6b" @@ -15284,11 +15377,6 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -indent-string@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" - integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== - indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -15322,6 +15410,11 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +ini@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" + integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== + ini@^1.3.4, ini@^1.3.5: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" @@ -15741,6 +15834,14 @@ is-hexadecimal@^1.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== +is-installed-globally@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-1.0.0.tgz#08952c43758c33d815692392f7f8437b9e436d5a" + integrity sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ== + dependencies: + global-directory "^4.0.1" + is-path-inside "^4.0.0" + is-interactive@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" @@ -15867,6 +15968,11 @@ is-path-inside@^3.0.1: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-path-inside@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-4.0.0.tgz#805aeb62c47c1b12fc3fd13bfb3ed1e7430071db" + integrity sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA== + is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -16014,6 +16120,11 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-unicode-supported@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz#fdf32df9ae98ff6ab2cedc155a5a6e895701c451" + integrity sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q== + is-upper-case@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-1.1.2.tgz#8d0b1fa7e7933a1e58483600ec7d9661cbaf756f" @@ -17432,6 +17543,11 @@ json-stringify-safe@^5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= +json5@2.2.3, json5@^2.1.0, json5@^2.1.2, json5@^2.1.3, json5@^2.2.1, json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -17444,11 +17560,6 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.0, json5@^2.1.2, json5@^2.1.3, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== - jsonc-parser@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" @@ -18179,7 +18290,7 @@ lodash.uniq@4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -"lodash@4.6.1 || ^4.16.1", lodash@^4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.10, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0: +lodash@4.17.21, "lodash@4.6.1 || ^4.16.1", lodash@^4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.10, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -18654,6 +18765,13 @@ memoize-one@^5.1.1: resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== +memoize@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/memoize/-/memoize-10.0.0.tgz#43fa66b2022363c7c50cf5dfab732a808a3d7147" + integrity sha512-H6cBLgsi6vMWOcCpvVCdFFnl3kerEXbrYh9q+lY6VXvQSmM6CkmV08VOwT+WE2tzIEqRPFfAq3fm4v/UIW6mSA== + dependencies: + mimic-function "^5.0.0" + memoizee@0.4.X, memoizee@^0.4.14: version "0.4.15" resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72" @@ -18881,6 +18999,11 @@ mimic-fn@^4.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== +mimic-function@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" + integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== + mimic-response@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" @@ -20618,6 +20741,11 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picomatch@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -21171,7 +21299,7 @@ promisify-event@^1.0.0: dependencies: pinkie-promise "^2.0.0" -prompts@^2.0.1, prompts@^2.4.0: +prompts@2.4.2, prompts@^2.0.1, prompts@^2.4.0: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -22277,6 +22405,11 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexp-tree@~0.1.1: + version "0.1.27" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" + integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== + regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" @@ -22899,6 +23032,13 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" +safe-regex@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" + integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== + dependencies: + regexp-tree "~0.1.1" + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -23101,6 +23241,13 @@ semver-truncate@^3.0.0: dependencies: semver "^7.3.5" +semver-try-require@6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/semver-try-require/-/semver-try-require-6.2.3.tgz#aefe418635fa4604a063749cab19b346494409e4" + integrity sha512-6q1N/Vr/4/G0EcQ1k4svN5kwfh3MJs4Gfl+zBAVcKn+AeIjKLwTXQ143Y6YHu6xEeN5gSCbCD1/5+NwCipLY5A== + dependencies: + semver "^7.5.3" + "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -23121,7 +23268,7 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== @@ -24028,6 +24175,15 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.1.0.tgz#d994252935224729ea3719c49f7206dc9c46550a" + integrity sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + "string.prototype.matchall@^4.0.0 || ^3.0.1", string.prototype.matchall@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" @@ -24153,6 +24309,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + strip-bom-buf@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz#1cb45aaf57530f4caf86c7f75179d2c9a51dd572" @@ -24572,6 +24735,11 @@ tar@^6.0.2: mkdirp "^1.0.3" yallist "^4.0.0" +teamcity-service-messages@0.1.14: + version "0.1.14" + resolved "https://registry.yarnpkg.com/teamcity-service-messages/-/teamcity-service-messages-0.1.14.tgz#193d420a5e4aef8e5e50b8c39e7865e08fbb5d8a" + integrity sha512-29aQwaHqm8RMX74u2o/h1KbMLP89FjNiMxD9wbF2BbWOnbM+q+d1sCEC+MqCc4QW3NJykn77OMpTFw/xTHIc0w== + telejson@^6.0.8: version "6.0.8" resolved "https://registry.yarnpkg.com/telejson/-/telejson-6.0.8.tgz#1c432db7e7a9212c1fbd941c3e5174ec385148f7" @@ -25364,6 +25532,15 @@ ts-pnp@^1.1.6: resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== +tsconfig-paths-webpack-plugin@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz#3c6892c5e7319c146eee1e7302ed9e6f2be4f763" + integrity sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.7.0" + tsconfig-paths "^4.1.2" + tsconfig-paths@^3.12.0: version "3.14.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" @@ -25374,6 +25551,15 @@ tsconfig-paths@^3.12.0: minimist "^1.2.6" strip-bom "^3.0.0" +tsconfig-paths@^4.1.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" + integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== + dependencies: + json5 "^2.2.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -26356,6 +26542,11 @@ watchpack@^2.2.0, watchpack@^2.4.0: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" +watskeburt@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/watskeburt/-/watskeburt-4.0.2.tgz#2ca79930a0e42f7ae3195e84685826908d73bcdd" + integrity sha512-w7X8AGrBZExP5/3e3c1X/CUY8Yod/aiAazQCvrg7n8Un6piD+NFFK926G15zRq4+wu0XAEWpSsZ4C+fEfVOCYw== + wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" @@ -26519,14 +26710,6 @@ webpack-dev-server@4.13.1: webpack-dev-middleware "^5.3.1" ws "^8.13.0" -webpack-esmac-plugin@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/webpack-esmac-plugin/-/webpack-esmac-plugin-4.0.0.tgz#05d650adcf3bdccd3fb4679888d047be7900a264" - integrity sha512-DPh5CbZUMuaJfjzyg8sNrirD81TjMUfHTG0cALij3njnvohhMDsBQMzOOaOUoyd+qwfgC6jgSzA0hXDyzsbFLQ== - dependencies: - esmac "^3.0.0" - invariant "^2.2.4" - webpack-filter-warnings-plugin@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/webpack-filter-warnings-plugin/-/webpack-filter-warnings-plugin-1.2.1.tgz#dc61521cf4f9b4a336fbc89108a75ae1da951cdb" @@ -26914,6 +27097,15 @@ worker-rpc@^0.1.0: dependencies: microevent.ts "~0.1.1" +wrap-ansi@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" + integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== + dependencies: + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"