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 <svc.cloudjenkins@instructure.com>
Reviewed-by: Isaac Moore <isaac.moore@instructure.com>
Build-Review: Isaac Moore <isaac.moore@instructure.com>
QA-Review: Aaron Shafovaloff <ashafovaloff@instructure.com>
Product-Review: Aaron Shafovaloff <ashafovaloff@instructure.com>
This commit is contained in:
Aaron Shafovaloff 2024-04-25 10:32:16 -06:00
parent 7d9d45171e
commit 323ee9474f
19 changed files with 703 additions and 710 deletions

285
.dependency-cruiser.js Normal file
View File

@ -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,
},
},
},
}

View File

@ -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

View File

@ -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",

View File

@ -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')

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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>'
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>'
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>'
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>`
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))
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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 += `<Hint>`
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 += `<Hint>`
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 += '<Hint>'
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 += `<Hint>`
message += `\n`
message += `Use a bare specifier:`
message += `\n \n`
message += ` ${suggestion}`
message += `\n`
return t.bracketize(message)
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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()
}
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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

View File

@ -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"
}
]

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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',
},
]

View File

@ -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,

View File

@ -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,

View File

@ -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(<ChangeRow change={getSampleData().history[0].changes[0]} />)
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()
})
})

View File

@ -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', () => {

View File

@ -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'

View File

@ -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')

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
/*
* 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 <http://www.gnu.org/licenses/>.
*/
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,
},
],
}
}

312
yarn.lock
View File

@ -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"