Go to the Bootcamp ✨
diff --git a/app/javascript/components/settings/BootcampAffiliateCouponForm.tsx b/app/javascript/components/settings/BootcampAffiliateCouponForm.tsx
index 41b9b54da6..257fff5538 100644
--- a/app/javascript/components/settings/BootcampAffiliateCouponForm.tsx
+++ b/app/javascript/components/settings/BootcampAffiliateCouponForm.tsx
@@ -90,7 +90,7 @@ export function InfoMessage({
To thank you for being an Insider and to help increase the amount of
people signing up to Exercism's{' '}
-
+
Learn to Code Bootcamp
, we are giving all Insiders an{' '}
@@ -123,7 +123,7 @@ export function InfoMessage({
return (
Exercism Insiders can access 20% off Exercism's{' '}
-
+
Learn to Code Bootcamp
, and receive 20% of all sales when someone uses their voucher code.
diff --git a/app/javascript/components/settings/BootcampFreeCouponForm.tsx b/app/javascript/components/settings/BootcampFreeCouponForm.tsx
index 353252650f..696f15d471 100644
--- a/app/javascript/components/settings/BootcampFreeCouponForm.tsx
+++ b/app/javascript/components/settings/BootcampFreeCouponForm.tsx
@@ -42,7 +42,7 @@ export default function BootcampFreeCouponForm({
Free Seat on the Bootcamp
As a lifetime insider you're eligible for a free seat on Exercism's{' '}
-
+
Learn to Code Bootcamp
.
diff --git a/app/javascript/esbuild.js b/app/javascript/esbuild.js
index 02a784a53a..5338009a4b 100755
--- a/app/javascript/esbuild.js
+++ b/app/javascript/esbuild.js
@@ -13,6 +13,7 @@ function build() {
'./app/javascript/packs/internal.tsx',
'./app/javascript/packs/landing.tsx',
'./app/javascript/packs/bootcamp.tsx',
+ './app/javascript/packs/bootcamp-ui.tsx',
...(process.env.RAILS_ENV === 'test'
? ['./app/javascript/packs/test.tsx']
: []),
diff --git a/app/javascript/interpreter/checks.ts b/app/javascript/interpreter/checks.ts
new file mode 100644
index 0000000000..47d36a3340
--- /dev/null
+++ b/app/javascript/interpreter/checks.ts
@@ -0,0 +1,19 @@
+export function isNumber(obj: any): obj is number {
+ return typeof obj === 'number' || obj instanceof Number
+}
+
+export function isBoolean(obj: any): obj is number {
+ return typeof obj === 'boolean' || obj instanceof Boolean
+}
+
+export function isString(obj: any): obj is string {
+ return typeof obj === 'string' || obj instanceof String
+}
+
+export function isArray(obj: any): obj is Array {
+ return obj instanceof Array
+}
+
+export function isObject(obj: any): obj is Object {
+ return obj instanceof Object
+}
diff --git a/app/javascript/interpreter/environment.ts b/app/javascript/interpreter/environment.ts
new file mode 100644
index 0000000000..76a42c27d5
--- /dev/null
+++ b/app/javascript/interpreter/environment.ts
@@ -0,0 +1,120 @@
+import { type Callable, isCallable } from './functions'
+import { RuntimeError } from './error'
+import type { Token } from './token'
+import didYouMean from 'didyoumean'
+import { translate } from './translator'
+import { isString } from './checks'
+
+export class Environment {
+ private readonly values: Map = new Map()
+
+ constructor(private readonly enclosing: Environment | null = null) {}
+
+ public inScope(name: Token | string): boolean {
+ const nameString = isString(name) ? name : name.lexeme
+
+ if (this.values.has(nameString)) {
+ return true
+ }
+ if (this.enclosing !== null) {
+ return this.enclosing.inScope(nameString)
+ }
+ return false
+ }
+
+ public define(name: string, value: any): void {
+ this.values.set(name, value)
+ }
+
+ public get(name: Token): any {
+ if (this.values.has(name.lexeme)) return this.values.get(name.lexeme)
+ if (this.enclosing !== null) return this.enclosing.get(name)
+
+ const variableNames = Object.keys(this.variables())
+ const functionNames = Object.keys(this.functions())
+
+ throw new RuntimeError(
+ translate('error.runtime.CouldNotFindValueWithName', {
+ name: name.lexeme,
+ }),
+ name.location,
+ 'CouldNotFindValueWithName',
+ {
+ didYouMean: {
+ variable: didYouMean(name.lexeme, variableNames),
+ function: didYouMean(name.lexeme, functionNames),
+ },
+ }
+ )
+ }
+
+ public getAt(distance: number, name: string): any {
+ return this.ancestor(distance).values.get(name)
+ }
+
+ private ancestor(distance: number) {
+ let environment: Environment = this
+ for (let i = 0; i < distance; i++) environment = environment.enclosing!
+ return environment
+ }
+
+ public assign(name: Token, value: any): void {
+ if (this.values.has(name.lexeme)) {
+ this.values.set(name.lexeme, value)
+ return
+ }
+
+ this.enclosing?.assign(name, value)
+
+ throw new RuntimeError(
+ translate('error.runtime.couldNotFindValueWithName', {
+ name: name.lexeme,
+ }),
+ name.location,
+ 'CouldNotFindValueWithName'
+ )
+ }
+
+ public assignAt(distance: number, name: Token, value: any): void {
+ this.ancestor(distance).values.set(name.lexeme, value)
+ }
+
+ public variables(): Record {
+ let current: Environment | null = this
+ let vars: any = {}
+
+ while (current != null) {
+ for (const [key, value] of this.values) {
+ if (key in vars) continue
+ if (isCallable(value)) continue
+
+ // The stringify/parse combination makes the value unique,
+ // which means that subsequent updates won't influence the
+ // value of previous frames
+ vars[key] = JSON.parse(JSON.stringify(value))
+ }
+
+ current = current.enclosing
+ }
+
+ return vars
+ }
+
+ public functions(): Record {
+ let current: Environment | null = this
+ let functions: any = {}
+
+ while (current != null) {
+ for (const [key, value] of this.values) {
+ if (key in functions) continue
+ if (!isCallable(value)) continue
+
+ functions[key] = value
+ }
+
+ current = current.enclosing
+ }
+
+ return functions
+ }
+}
diff --git a/app/javascript/interpreter/error.ts b/app/javascript/interpreter/error.ts
new file mode 100644
index 0000000000..d6542c03e8
--- /dev/null
+++ b/app/javascript/interpreter/error.ts
@@ -0,0 +1,100 @@
+import { Location } from './location'
+
+export type DisabledLanguageFeatureErrorType =
+ | 'ExcludeListViolation'
+ | 'IncludeListViolation'
+
+export type SemanticErrorType =
+ | 'TopLevelReturn'
+ | 'VariableUsedInOwnInitializer'
+ | 'DuplicateVariableName'
+ | 'CannotAssignToConstant'
+ | 'InvalidPostfixOperand'
+
+export type RuntimeErrorType =
+ | 'CouldNotFindValueWithName'
+ | 'CouldNotEvaluateFunction'
+ | 'CouldNotFindFunctionWithName'
+ | 'CouldNotFindFunctionWithNameSuggestion'
+ | 'MissingParenthesesForFunctionCall'
+ | 'InvalidExpression'
+ | 'RepeatCountMustBeNumber'
+ | 'RepeatCountMustBeGreaterThanZero'
+ | 'NonCallableTarget'
+ | 'InfiniteLoop'
+ | 'InvalidNumberOfArguments'
+ | 'InvalidNumberOfArgumentsWithOptionalArguments'
+ | 'InvalidUnaryOperator'
+ | 'InvalidBinaryExpression'
+ | 'LogicError'
+ | 'OperandMustBeBoolean'
+ | 'OperandsMustBeBooleans'
+ | 'OperandMustBeNumber'
+ | 'OperandsMustBeNumbers'
+ | 'OperandsMustBeTwoNumbersOrTwoStrings'
+ | 'InvalidIndexGetterTarget'
+ | 'InvalidIndexSetterTarget'
+
+export type StaticErrorType =
+ | DisabledLanguageFeatureErrorType
+ | SemanticErrorType
+ | SyntaxErrorType
+
+export type ErrorType = StaticErrorType | RuntimeErrorType
+
+export type ErrorCategory =
+ | 'SyntaxError'
+ | 'SemanticError'
+ | 'DisabledLanguageFeatureError'
+ | 'RuntimeError'
+
+export abstract class FrontendError extends Error {
+ constructor(
+ public message: string,
+ public location: Location | null,
+ public type: T,
+ public context?: any
+ ) {
+ super(message)
+ }
+
+ public get category() {
+ return this.constructor.name
+ }
+}
+
+export type StaticError = SyntaxError | SemanticError | RuntimeError
+
+export class SyntaxError extends FrontendError {}
+
+export class SemanticError extends FrontendError {}
+
+export class DisabledLanguageFeatureError extends FrontendError {}
+
+export class RuntimeError extends FrontendError {}
+
+export function isStaticError(obj: any): obj is StaticError {
+ return (
+ isSyntaxError(obj) ||
+ isSemanticError(obj) ||
+ isDisabledLanguageFeatureError(obj)
+ )
+}
+
+export function isSyntaxError(obj: any): obj is SyntaxError {
+ return obj instanceof SyntaxError
+}
+
+export function isSemanticError(obj: any): obj is SemanticError {
+ return obj instanceof SemanticError
+}
+
+export function isDisabledLanguageFeatureError(
+ obj: any
+): obj is DisabledLanguageFeatureError {
+ return obj instanceof DisabledLanguageFeatureError
+}
+
+export function isRuntimeError(obj: any): obj is RuntimeError {
+ return obj instanceof RuntimeError
+}
diff --git a/app/javascript/interpreter/evaluation-result.ts b/app/javascript/interpreter/evaluation-result.ts
new file mode 100644
index 0000000000..ac2046b508
--- /dev/null
+++ b/app/javascript/interpreter/evaluation-result.ts
@@ -0,0 +1,196 @@
+import type { TokenType } from './token'
+
+export type EvaluationResultVariableStatement = {
+ type: 'VariableStatement'
+ value: any
+ name: string
+ data?: Record
+}
+
+export type EvaluationResultTernaryExpression = {
+ type: 'TernaryExpression'
+ value: any
+ condition: EvaluationResult
+ data?: Record
+}
+
+export type EvaluationResultUpdateExpression = {
+ type: 'UpdateExpression'
+ operand: any
+ operator: any
+ value: any
+ newValue: any
+ data?: Record
+}
+
+export type EvaluationResultIfStatement = {
+ type: 'IfStatement'
+ value: any
+ condition: EvaluationResult
+ data?: Record
+}
+
+export type EvaluationResultReturnStatement = {
+ type: 'ReturnStatement'
+ value: any
+ data?: Record
+}
+
+export type EvaluationResultForeachStatement = {
+ type: 'ForeachStatement'
+ value?: any
+ elementName: string
+ iterable: EvaluationResult
+ data?: Record
+}
+
+export type EvaluationResultExpressionStatement = {
+ type: 'ExpressionStatement'
+ value: any
+ expression: EvaluationResult
+ data?: Record
+}
+
+export type EvaluationResultLogicalExpression = {
+ type: 'LogicalExpression'
+ value: any
+ left: EvaluationResult
+ right?: EvaluationResult
+ operator: TokenType
+ shortCircuited: boolean
+ data?: Record
+}
+
+export type EvaluationResultBinaryExpression = {
+ type: 'BinaryExpression'
+ value: any
+ left: EvaluationResult
+ right: EvaluationResult
+ operator: TokenType
+ data?: Record
+}
+
+export type EvaluationResultUnaryExpression = {
+ type: 'UnaryExpression'
+ value: any
+ right: EvaluationResult
+ operator: TokenType
+ data?: Record
+}
+
+export type EvaluationResultGroupingExpression = {
+ type: 'GroupingExpression'
+ value: any
+ inner: EvaluationResult
+ data?: Record
+}
+
+export type EvaluationResultLiteralExpression = {
+ type: 'LiteralExpression'
+ value: any
+ data?: Record
+}
+
+export type EvaluationResultVariableExpression = {
+ type: 'VariableExpression'
+ value: any
+ name: string
+ data?: Record
+}
+
+export type EvaluationResultConstantStatement = {
+ type: 'ConstantStatement'
+ value: any
+ name: string
+ data?: Record
+}
+
+export type EvaluationResultAssignExpression = {
+ type: 'AssignExpression'
+ name: string
+ operator: TokenType
+ value: any
+ newValue: any
+ data?: Record
+}
+
+export type EvaluationResultGetExpression = {
+ type: 'GetExpression'
+ value: any
+ obj: any
+ field: any
+ expression: string
+ data?: Record
+}
+
+export type EvaluationResultSetExpression = {
+ type: 'SetExpression'
+ value: any
+ obj: any
+ field: any
+ expression: string
+ data?: Record
+}
+
+export type EvaluationResultArrayExpression = {
+ type: 'ArrayExpression'
+ value: any
+ data?: Record
+}
+
+export type EvaluationResultDictionaryExpression = {
+ type: 'DictionaryExpression'
+ value: any
+ data?: Record
+}
+
+export type EvaluationResultTemplateTextExpression = {
+ type: 'TemplateTextExpression'
+ value: any
+ data?: Record
+}
+
+export type EvaluationResultTemplatePlaceholderExpression = {
+ type: 'TemplatePlaceholderExpression'
+ value: any
+ data?: Record
+}
+
+export type EvaluationResultTemplateLiteralExpression = {
+ type: 'TemplateLiteralExpression'
+ value: any
+ data?: Record
+}
+
+export type EvaluationResultCallExpression = {
+ type: 'CallExpression'
+ value: any
+ callee: EvaluationResult
+ args: EvaluationResult[]
+ data?: Record
+}
+
+export type EvaluationResult =
+ | EvaluationResultVariableStatement
+ | EvaluationResultUpdateExpression
+ | EvaluationResultConstantStatement
+ | EvaluationResultTernaryExpression
+ | EvaluationResultIfStatement
+ | EvaluationResultExpressionStatement
+ | EvaluationResultForeachStatement
+ | EvaluationResultReturnStatement
+ | EvaluationResultLiteralExpression
+ | EvaluationResultArrayExpression
+ | EvaluationResultDictionaryExpression
+ | EvaluationResultVariableExpression
+ | EvaluationResultCallExpression
+ | EvaluationResultLogicalExpression
+ | EvaluationResultBinaryExpression
+ | EvaluationResultUnaryExpression
+ | EvaluationResultGroupingExpression
+ | EvaluationResultAssignExpression
+ | EvaluationResultGetExpression
+ | EvaluationResultSetExpression
+ | EvaluationResultTemplateTextExpression
+ | EvaluationResultTemplatePlaceholderExpression
+ | EvaluationResultTemplateLiteralExpression
diff --git a/app/javascript/interpreter/executor.ts b/app/javascript/interpreter/executor.ts
new file mode 100644
index 0000000000..832e321f04
--- /dev/null
+++ b/app/javascript/interpreter/executor.ts
@@ -0,0 +1,964 @@
+import {
+ type Callable,
+ ReturnValue,
+ UserDefinedFunction,
+ isCallable,
+} from './functions'
+import { isArray, isBoolean, isNumber, isObject, isString } from './checks'
+import { Environment } from './environment'
+import { RuntimeError, type RuntimeErrorType, isRuntimeError } from './error'
+import {
+ ArrayExpression,
+ AssignExpression,
+ BinaryExpression,
+ CallExpression,
+ DictionaryExpression,
+ Expression,
+ type ExpressionVisitor,
+ GetExpression,
+ GroupingExpression,
+ LiteralExpression,
+ LogicalExpression,
+ SetExpression,
+ TemplateLiteralExpression,
+ TemplatePlaceholderExpression,
+ TemplateTextExpression,
+ TernaryExpression,
+ UnaryExpression,
+ UpdateExpression,
+ VariableExpression,
+} from './expression'
+import { Location, Span } from './location'
+import {
+ BlockStatement,
+ ConstantStatement as ConstantStatement,
+ DoWhileStatement,
+ ExpressionStatement,
+ ForeachStatement,
+ FunctionStatement,
+ IfStatement,
+ RepeatStatement,
+ RepeatUntilGameOverStatement,
+ ReturnStatement,
+ Statement,
+ type StatementVisitor,
+ VariableStatement,
+ WhileStatement,
+} from './statement'
+import type { Token } from './token'
+import type { EvaluationResult } from './evaluation-result'
+import { translate } from './translator'
+import cloneDeep from 'lodash.clonedeep'
+import type { LanguageFeatures } from './interpreter'
+import type { InterpretResult } from './interpreter'
+
+import type { Frame, FrameExecutionStatus } from './frames'
+import { describeFrame } from './frames'
+
+export type ExecutionContext = {
+ state: Record
+ getCurrentTime: Function
+ fastForward: Function
+ evaluate: Function
+ updateState: Function
+ logicError: Function
+}
+
+export type ExternalFunction = {
+ name: string
+ func: Function
+ description: string
+}
+
+class LogicError extends Error {}
+
+export class Executor
+ implements ExpressionVisitor, StatementVisitor
+{
+ private frames: Frame[] = []
+ private frameTime: number = 0
+ private location: Location | null = null
+ private time: number = 0
+
+ private readonly globals = new Environment()
+ private environment = this.globals
+
+ constructor(
+ private readonly sourceCode: string,
+ private languageFeatures: LanguageFeatures = {},
+ private externalFunctions: ExternalFunction[],
+ private locals: Map,
+ private externalState: Record = {}
+ ) {
+ for (let externalFunction of externalFunctions) {
+ externalFunction = cloneDeep(externalFunction)
+ const func = externalFunction.func
+
+ // The first value passed to the function is the interpreter
+ // so we discount that when working out the user's arity.
+ // TODO: We need to consider default params here
+ const arity = () => [func.length - 1, func.length - 1]
+ const call = (context: ExecutionContext, args: any[]) =>
+ func(context, ...args)
+
+ const callable = {
+ arity: arity,
+ call: call,
+ }
+
+ this.globals.define(externalFunction.name, callable)
+ this.environment.define(externalFunction.name, callable)
+ }
+ }
+
+ public updateState(name: string, value: any) {
+ this.externalState[name] = value
+ }
+
+ public logicError(message: string) {
+ throw new LogicError(message)
+ }
+
+ public execute(statements: Statement[]): InterpretResult {
+ for (const statement of statements) {
+ try {
+ this.executeStatement(statement)
+ } catch (error) {
+ if (isRuntimeError(error)) {
+ this.addFrame(
+ this.location || error.location,
+ 'ERROR',
+ undefined,
+ error
+ )
+ break
+ }
+
+ throw error
+ }
+ }
+
+ return { frames: this.frames, error: null }
+ }
+
+ public evaluateSingleExpression(statement: Statement) {
+ try {
+ if (!(statement instanceof ExpressionStatement)) {
+ this.error('InvalidExpression', Location.unknown, {
+ statement: statement,
+ })
+ }
+
+ const result = this.evaluate(statement.expression)
+ return { value: result.value, frames: this.frames, error: null }
+ } catch (error) {
+ if (isRuntimeError(error)) {
+ this.addFrame(
+ this.location || error.location,
+ 'ERROR',
+ undefined,
+ error
+ )
+ return { value: undefined, frames: this.frames, error: null }
+ }
+
+ throw error
+ }
+ }
+
+ public executeBlock(statements: Statement[], environment: Environment): void {
+ const previous: Environment = this.environment
+ try {
+ this.environment = environment
+
+ for (const statement of statements) {
+ this.executeStatement(statement)
+ }
+ } finally {
+ this.environment = previous
+ }
+ }
+
+ private executeFrame(
+ context: Statement | Expression,
+ code: () => EvaluationResult
+ ): T {
+ this.location = context.location
+ const result = code()
+ this.addFrame(context.location, 'SUCCESS', result)
+ this.location = null
+ return result.value
+ }
+
+ public visitExpressionStatement(statement: ExpressionStatement): void {
+ this.executeFrame(statement, () => {
+ const result = this.evaluate(statement.expression)
+
+ if (statement.expression instanceof VariableExpression)
+ this.error('MissingParenthesesForFunctionCall', statement.location, {
+ expression: statement.expression,
+ })
+
+ return result
+ })
+ }
+
+ public visitVariableStatement(statement: VariableStatement): void {
+ this.executeFrame(statement, () => {
+ if (this.environment.inScope(statement.name.lexeme)) {
+ this.error('VariableAlreadyDeclared', statement.location, {
+ name: statement.name.lexeme,
+ })
+ }
+ const result = this.evaluate(statement.initializer)
+ const updating = this.environment.inScope(statement.name.lexeme)
+ this.environment.define(statement.name.lexeme, result.value)
+ return {
+ type: 'VariableStatement',
+ name: statement.name.lexeme,
+ value: result.value,
+ data: {
+ updating: updating,
+ },
+ }
+ })
+ }
+
+ public visitConstantStatement(statement: ConstantStatement): void {
+ this.executeFrame(statement, () => {
+ const result = this.evaluate(statement.initializer)
+ this.environment.define(statement.name.lexeme, result.value)
+ return {
+ type: 'ConstantStatement',
+ name: statement.name.lexeme,
+ value: result.value,
+ }
+ })
+ }
+
+ public visitIfStatement(statement: IfStatement): void {
+ const conditionResult = this.executeFrame(statement, () => {
+ const result = this.evaluate(statement.condition)
+ return {
+ type: 'IfStatement',
+ value: result.value,
+ condition: result,
+ }
+ })
+
+ if (conditionResult) {
+ this.executeStatement(statement.thenBranch)
+ return
+ }
+
+ if (statement.elseBranch === null) return
+ this.executeStatement(statement.elseBranch!)
+ }
+
+ public visitRepeatStatement(statement: RepeatStatement): void {
+ let count = this.executeFrame(statement, () =>
+ this.evaluate(statement.count)
+ )
+
+ if (!isNumber(count))
+ this.error('RepeatCountMustBeNumber', statement.count.location, {
+ count,
+ })
+
+ if (count < 1)
+ this.error('RepeatCountMustBeGreaterThanZero', statement.count.location, {
+ count,
+ })
+
+ while (count > 0) {
+ this.executeBlock(statement.body, this.environment)
+ count--
+
+ // Delay repeat for things like animations
+ if (this.languageFeatures.repeatDelay) {
+ this.time += this.languageFeatures.repeatDelay
+ }
+ }
+ }
+
+ public visitRepeatUntilGameOverStatement(
+ statement: RepeatUntilGameOverStatement
+ ): void {
+ var count = 0 // Count is a guard against infinite looping
+
+ while (!this.externalState.gameOver) {
+ if (count >= 100) {
+ const errorLoc = new Location(
+ statement.location.line,
+ statement.location.relative,
+ new Span(
+ statement.location.absolute.begin,
+ statement.location.absolute.begin + 22
+ )
+ )
+ this.error('InfiniteLoop', errorLoc)
+ }
+
+ this.executeBlock(statement.body, this.environment)
+ count++
+ }
+ }
+
+ public visitWhileStatement(statement: WhileStatement): void {
+ while (
+ this.executeFrame(statement, () => this.evaluate(statement.condition))
+ )
+ this.executeBlock(statement.body, this.environment)
+ }
+
+ public visitDoWhileStatement(statement: DoWhileStatement): void {
+ do {
+ this.executeBlock(statement.body, this.environment)
+ } while (
+ this.executeFrame(statement, () =>
+ this.evaluate(statement.condition)
+ )
+ )
+ }
+
+ public visitBlockStatement(statement: BlockStatement): void {
+ this.executeBlock(statement.statements, new Environment(this.environment))
+ }
+
+ public visitFunctionStatement(statement: FunctionStatement): void {
+ const func = new UserDefinedFunction(statement, this.environment)
+ this.environment.define(statement.name.lexeme, func)
+ }
+
+ public visitReturnStatement(statement: ReturnStatement): void {
+ const evaluationResult = this.executeFrame(
+ statement,
+ () => {
+ return {
+ type: 'ReturnStatement',
+ value:
+ statement.value === null
+ ? undefined
+ : this.evaluate(statement.value),
+ }
+ }
+ )
+ throw new ReturnValue(evaluationResult.value)
+ }
+
+ visitForeachStatement(statement: ForeachStatement): void {
+ const iterable = this.evaluate(statement.iterable)
+ if (!isArray(iterable.value) || iterable.value?.length === 0) {
+ this.executeFrame(statement, () => {
+ return {
+ type: 'ForeachStatement',
+ value: undefined,
+ iterable,
+ elementName: statement.elementName.lexeme,
+ }
+ })
+ }
+
+ for (const value of iterable.value) {
+ this.executeFrame(statement, () => {
+ return {
+ type: 'ForeachStatement',
+ value,
+ iterable,
+ elementName: statement.elementName.lexeme,
+ }
+ })
+
+ const loopEnvironment = new Environment(this.environment)
+ loopEnvironment.define(statement.elementName.lexeme, value)
+ this.executeBlock(statement.body, loopEnvironment)
+ }
+ }
+
+ visitTernaryExpression(expression: TernaryExpression): EvaluationResult {
+ const condition = this.evaluate(expression.condition)
+ this.verifyBooleanOperand(condition.value, expression.condition.location)
+
+ const result = condition.value
+ ? this.evaluate(expression.thenBranch)
+ : this.evaluate(expression.elseBranch)
+
+ return {
+ type: 'TernaryExpression',
+ value: result.value,
+ condition: condition,
+ }
+ }
+
+ visitTemplateLiteralExpression(
+ expression: TemplateLiteralExpression
+ ): EvaluationResult {
+ return {
+ type: 'TemplateLiteralExpression',
+ value: expression.parts
+ .map((part) => this.evaluate(part).value.toString())
+ .join(''),
+ }
+ }
+
+ visitTemplatePlaceholderExpression(
+ expression: TemplatePlaceholderExpression
+ ): EvaluationResult {
+ return {
+ type: 'TemplatePlaceholderExpression',
+ value: this.evaluate(expression.inner).value,
+ }
+ }
+
+ visitTemplateTextExpression(
+ expression: TemplateTextExpression
+ ): EvaluationResult {
+ return {
+ type: 'TemplateTextExpression',
+ value: expression.text.literal,
+ }
+ }
+
+ visitArrayExpression(expression: ArrayExpression): EvaluationResult {
+ return {
+ type: 'ArrayExpression',
+ value: expression.elements.map((element) => this.evaluate(element).value),
+ }
+ }
+
+ visitDictionaryExpression(
+ expression: DictionaryExpression
+ ): EvaluationResult {
+ let dict: Record = {}
+
+ for (const [key, value] of expression.elements)
+ dict[key] = this.evaluate(value).value
+
+ return { type: 'DictionaryExpression', value: dict }
+ }
+
+ public visitCallExpression(expression: CallExpression): EvaluationResult {
+ let callee: any
+
+ try {
+ callee = this.evaluate(expression.callee)
+ } catch (e) {
+ if (isRuntimeError(e) && e.type == 'CouldNotFindValueWithName') {
+ if (
+ expression.callee instanceof VariableExpression &&
+ e.context?.didYouMean?.function?.length > 0
+ ) {
+ const alternative = e.context.didYouMean.function
+ this.error('CouldNotFindFunctionWithNameSuggestion', e.location, {
+ ...e.context,
+ suggestion: alternative,
+ name: expression.callee.name.lexeme,
+ })
+ }
+
+ this.error('CouldNotFindFunctionWithName', e.location, e.context)
+ }
+
+ throw e
+ }
+
+ if (!isCallable(callee.value))
+ this.error('NonCallableTarget', expression.location, { callee })
+
+ const args: EvaluationResult[] = []
+ for (const arg of expression.args) args.push(this.evaluate(arg))
+
+ const arity = callee.value.arity()
+ const [minArity, maxArity] = isNumber(arity) ? [arity, arity] : arity
+
+ if (args.length < minArity || args.length > maxArity) {
+ if (minArity === maxArity) {
+ this.error('InvalidNumberOfArguments', expression.paren.location, {
+ arity: maxArity,
+ args,
+ })
+ } else
+ this.error(
+ 'InvalidNumberOfArgumentsWithOptionalArguments',
+ expression.paren.location,
+ {
+ minArity,
+ maxArity,
+ numberOfArgs: args.length,
+ }
+ )
+ }
+
+ let value
+
+ try {
+ value = callee.value.call(
+ {
+ state: this.externalState,
+ fastForward: (n: number) => {
+ this.time += n
+ },
+ getCurrentTime: () => this.time,
+ executeBlock: this.executeBlock.bind(this),
+ evaluate: this.evaluate.bind(this),
+ updateState: this.updateState.bind(this),
+ logicError: this.logicError.bind(this),
+ },
+ args.map((arg) => arg.value)
+ )
+ } catch (e) {
+ if (e instanceof LogicError) {
+ this.error('LogicError', expression.location, { message: e.message })
+ } else {
+ throw e
+ }
+ }
+
+ return {
+ type: 'CallExpression',
+ callee,
+ args,
+ value,
+ }
+ }
+
+ public visitLiteralExpression(
+ expression: LiteralExpression
+ ): EvaluationResult {
+ return {
+ type: 'LiteralExpression',
+ value: expression.value,
+ }
+ }
+
+ public visitVariableExpression(
+ expression: VariableExpression
+ ): EvaluationResult {
+ const value = this.lookupVariable(expression.name, expression)
+ return {
+ type: 'VariableExpression',
+ name: expression.name.lexeme,
+ value,
+ }
+ }
+
+ public visitUnaryExpression(expression: UnaryExpression): EvaluationResult {
+ const operand = this.evaluate(expression.operand)
+
+ switch (expression.operator.type) {
+ case 'NOT':
+ this.verifyBooleanOperand(expression.operator, operand.value)
+ return {
+ type: 'UnaryExpression',
+ operator: expression.operator.type,
+ value: !operand.value,
+ right: operand,
+ }
+ case 'MINUS':
+ this.verifyNumberOperand(expression.operator, operand.value)
+ return {
+ type: 'UnaryExpression',
+ operator: expression.operator.type,
+ value: -operand.value,
+ right: operand,
+ }
+ }
+
+ // Unreachable.
+ this.error('InvalidUnaryOperator', expression.operator.location, {
+ expression,
+ })
+ }
+
+ public visitBinaryExpression(expression: BinaryExpression): EvaluationResult {
+ const left = this.evaluate(expression.left)
+ const right = this.evaluate(expression.right)
+
+ const result: EvaluationResult = {
+ type: 'BinaryExpression',
+ value: undefined,
+ operator: expression.operator.type,
+ left,
+ right,
+ }
+
+ switch (expression.operator.type) {
+ case 'STRICT_INEQUALITY':
+ // TODO: throw error when types are not the same?
+ return { ...result, value: left.value !== right.value }
+ case 'INEQUALITY':
+ // TODO: throw error when types are not the same?
+ return { ...result, value: left.value != right.value }
+ case 'STRICT_EQUALITY':
+ // TODO: throw error when types are not the same?
+ return {
+ ...result,
+ value: left.value === right.value,
+ }
+ case 'EQUALITY':
+ // TODO: throw error when types are not the same?
+ return {
+ ...result,
+ value: left.value == right.value,
+ }
+ case 'GREATER':
+ this.verifyNumberOperands(expression.operator, left.value, right.value)
+ return {
+ ...result,
+ value: left.value > right.value,
+ }
+ case 'GREATER_EQUAL':
+ this.verifyNumberOperands(expression.operator, left.value, right.value)
+ return {
+ ...result,
+ value: left.value >= right.value,
+ }
+ case 'LESS':
+ this.verifyNumberOperands(expression.operator, left.value, right.value)
+ return {
+ ...result,
+ value: left.value < right.value,
+ }
+ case 'LESS_EQUAL':
+ this.verifyNumberOperands(expression.operator, left.value, right.value)
+ return {
+ ...result,
+ value: left.value <= right.value,
+ }
+ case 'MINUS':
+ this.verifyNumberOperands(expression.operator, left.value, right.value)
+ return {
+ ...result,
+ value: left.value - right.value,
+ }
+ //> binary-plus
+ case 'PLUS':
+ if (isNumber(left.value) && isNumber(right.value))
+ return {
+ ...result,
+ value: left.value + right.value,
+ }
+ if (isString(left.value) && isString(right.value))
+ return {
+ ...result,
+ value: left.value + right.value,
+ }
+
+ this.error(
+ 'OperandsMustBeTwoNumbersOrTwoStrings',
+ expression.operator.location,
+ {
+ left,
+ right,
+ }
+ )
+
+ case 'SLASH':
+ this.verifyNumberOperands(expression.operator, left.value, right.value)
+ return {
+ ...result,
+ value: left.value / right.value,
+ }
+ case 'STAR':
+ this.verifyNumberOperands(expression.operator, left.value, right.value)
+ return {
+ ...result,
+ value: left.value * right.value,
+ }
+ case 'PERCENT':
+ this.verifyNumberOperands(expression.operator, left.value, right.value)
+ return {
+ ...result,
+ value: left.value % right.value,
+ }
+ }
+
+ this.error('InvalidBinaryExpression', expression.location, { expression })
+ }
+
+ public visitLogicalExpression(
+ expression: LogicalExpression
+ ): EvaluationResult {
+ if (expression.operator.type === 'OR') {
+ const leftOr = this.evaluate(expression.left)
+ this.verifyBooleanOperand(expression.operator, leftOr.value)
+
+ let rightOr: EvaluationResult | undefined = undefined
+
+ if (!leftOr.value) {
+ rightOr = this.evaluate(expression.right)
+ this.verifyBooleanOperand(expression.operator, rightOr.value)
+ }
+
+ return {
+ value: leftOr.value || rightOr?.value,
+ type: 'LogicalExpression',
+ left: leftOr,
+ right: rightOr,
+ operator: expression.operator.type,
+ shortCircuited: rightOr === undefined,
+ }
+ }
+
+ const leftAnd = this.evaluate(expression.left)
+ this.verifyBooleanOperand(expression.operator, leftAnd.value)
+
+ let rightAnd: EvaluationResult | undefined = undefined
+
+ if (leftAnd.value) {
+ rightAnd = this.evaluate(expression.right)
+ this.verifyBooleanOperand(expression.operator, rightAnd.value)
+ }
+
+ return {
+ value: leftAnd.value && rightAnd?.value,
+ type: 'LogicalExpression',
+ left: leftAnd,
+ right: rightAnd,
+ operator: expression.operator.type,
+ shortCircuited: rightAnd === undefined,
+ }
+ }
+
+ public visitGroupingExpression(
+ expression: GroupingExpression
+ ): EvaluationResult {
+ const inner = this.evaluate(expression.inner)
+
+ return {
+ type: 'GroupingExpression',
+ value: inner.value,
+ inner,
+ }
+ }
+
+ public visitAssignExpression(expression: AssignExpression): EvaluationResult {
+ // Ensure the variable resolves if we're updating
+ // and doesn't resolve if we're declaring
+ if (expression.updating) {
+ if (!this.environment.inScope(expression.name.lexeme)) {
+ this.error('VariableNotDeclared', expression.location, {
+ name: expression.name.lexeme,
+ })
+ }
+ }
+
+ const value = this.evaluate(expression.value)
+ const newValue =
+ expression.operator.type === 'EQUAL' || expression.operator.type === 'TO'
+ ? value.value
+ : expression.operator.type === 'PLUS_EQUAL'
+ ? this.lookupVariable(expression.name, expression) + value.value
+ : expression.operator.type === 'MINUS_EQUAL'
+ ? this.lookupVariable(expression.name, expression) - value.value
+ : expression.operator.type === 'STAR_EQUAL'
+ ? this.lookupVariable(expression.name, expression) * value.value
+ : expression.operator.type === 'SLASH_EQUAL'
+ ? this.lookupVariable(expression.name, expression) / value.value
+ : null
+
+ this.updateVariable(expression, expression.name, newValue)
+
+ return {
+ type: 'AssignExpression',
+ name: expression.name.lexeme,
+ operator: expression.operator.type,
+ value,
+ newValue,
+ }
+ }
+
+ public visitUpdateExpression(expression: UpdateExpression): EvaluationResult {
+ let value
+ let newValue
+
+ if (expression.operand instanceof VariableExpression) {
+ value = this.lookupVariable(expression.operand.name, expression.operand)
+ this.verifyNumberOperand(expression.operator, value)
+
+ newValue =
+ expression.operator.type === 'PLUS_PLUS' ? value + 1 : value - 1
+
+ this.updateVariable(expression.operand, expression.operand.name, newValue)
+
+ return {
+ type: 'UpdateExpression',
+ operand: expression.operand,
+ operator: expression.operator.type,
+ value,
+ newValue,
+ }
+ } else if (expression.operand instanceof GetExpression) {
+ const obj = this.evaluate(expression.operand.obj)
+
+ if (isObject(obj.value) && expression.operand.field.type === 'STRING') {
+ value = obj.value[expression.operand.field.literal]
+ } else if (
+ isArray(obj.value) &&
+ expression.operand.field.type === 'NUMBER'
+ ) {
+ value = obj.value[expression.operand.field.literal]
+ }
+
+ this.verifyNumberOperand(expression.operator, value)
+ newValue =
+ expression.operator.type === 'PLUS_PLUS' ? value + 1 : value - 1
+ obj.value[expression.operand.field.literal] = newValue
+
+ return {
+ type: 'UpdateExpression',
+ operand: expression.operand,
+ operator: expression.operator.type,
+ value,
+ newValue,
+ }
+ }
+
+ throw new Error('InvalidUpdateExpression')
+ }
+
+ private updateVariable(
+ expression: Expression,
+ name: Token,
+ newValue: undefined
+ ) {
+ const distance = this.locals.get(expression)
+ if (distance === undefined) this.globals.assign(name, newValue)
+ else this.environment.assignAt(distance, name, newValue)
+ }
+
+ public visitGetExpression(expression: GetExpression): EvaluationResult {
+ const obj = this.evaluate(expression.obj)
+
+ if (isObject(obj.value) && expression.field.type === 'STRING') {
+ // TODO: consider if we want to throw an error when the field does not exist or return null
+ return {
+ type: 'GetExpression',
+ obj: obj,
+ expression: `${expression.obj.location.toCode(this.sourceCode)}[${
+ expression.field.lexeme
+ }]`,
+ field: expression.field.literal,
+ value: obj.value[expression.field.literal],
+ }
+ }
+
+ if (isArray(obj.value) && expression.field.type === 'NUMBER') {
+ // TODO: consider if we want to throw an error when the index does not exist or return null
+ return {
+ type: 'GetExpression',
+ obj: obj,
+ expression: `${expression.obj.location.toCode(this.sourceCode)}[${
+ expression.field.lexeme
+ }]`,
+ field: expression.field.literal,
+ value: obj.value[expression.field.literal],
+ }
+ }
+
+ this.error('InvalidIndexGetterTarget', expression.location, {
+ expression,
+ obj,
+ })
+ }
+
+ public visitSetExpression(expression: SetExpression): EvaluationResult {
+ const obj = this.evaluate(expression.obj)
+
+ if (
+ (isObject(obj.value) && expression.field.type === 'STRING') ||
+ (isArray(obj.value) && expression.field.type === 'NUMBER')
+ ) {
+ const value = this.evaluate(expression.value)
+ obj.value[expression.field.literal] = value.value
+
+ return {
+ type: 'SetExpression',
+ obj,
+ value,
+ field: expression.field.literal,
+ expression: `${expression.obj.location.toCode(this.sourceCode)}[${
+ expression.field.lexeme
+ }]`,
+ }
+ }
+
+ this.error('InvalidIndexSetterTarget', expression.location, {
+ expression,
+ obj,
+ })
+ }
+
+ private verifyNumberOperand(operator: Token, operand: any): void {
+ if (isNumber(operand)) return
+
+ this.error('OperandMustBeNumber', operator.location, { operand })
+ }
+
+ private verifyNumberOperands(operator: Token, left: any, right: any): void {
+ if (isNumber(left) && isNumber(right)) return
+
+ this.error('OperandsMustBeNumbers', operator.location, { left, right })
+ }
+
+ private verifyBooleanOperand(operand: any, location: Location): void {
+ if (isBoolean(operand)) return
+
+ if (this.languageFeatures?.truthiness === 'OFF')
+ this.error('OperandMustBeBoolean', location, { operand })
+ }
+
+ public executeStatement(statement: Statement): void {
+ statement.accept(this)
+ }
+
+ public evaluate(expression: Expression): EvaluationResult {
+ return expression.accept(this)
+ }
+
+ private lookupVariable(name: Token, expression: VariableExpression): any {
+ const distance = this.locals.get(expression)
+ if (distance === undefined) return this.globals.get(name)
+ return this.environment.getAt(distance, name.lexeme)
+ }
+
+ private addFrame(
+ location: Location | null,
+ status: FrameExecutionStatus,
+ result?: EvaluationResult,
+ error?: RuntimeError
+ ): void {
+ if (location == null) location = Location.unknown
+
+ const frame: Frame = {
+ code: location.toCode(this.sourceCode),
+ line: location.line,
+ status,
+ result,
+ error,
+ variables: this.environment.variables(),
+ functions: this.environment.functions(),
+ time: this.frameTime,
+ description: '',
+ }
+ frame.description = describeFrame(frame, this.externalFunctions)
+
+ this.frames.push(frame)
+
+ this.time++
+ this.frameTime = this.time
+ }
+
+ private error(
+ type: RuntimeErrorType,
+ location: Location | null,
+ context: any = {}
+ ): never {
+ throw new RuntimeError(
+ translate(`error.runtime.${type}`, context),
+ location,
+ type,
+ context
+ )
+ }
+}
diff --git a/app/javascript/interpreter/expression.ts b/app/javascript/interpreter/expression.ts
new file mode 100644
index 0000000000..514a2bb1bc
--- /dev/null
+++ b/app/javascript/interpreter/expression.ts
@@ -0,0 +1,245 @@
+import type { Token } from './token'
+import { Location } from './location'
+
+export interface ExpressionVisitor {
+ visitCallExpression(expression: CallExpression): T
+ visitLiteralExpression(expression: LiteralExpression): T
+ visitVariableExpression(expression: VariableExpression): T
+ visitUnaryExpression(expression: UnaryExpression): T
+ visitBinaryExpression(expression: BinaryExpression): T
+ visitLogicalExpression(expression: LogicalExpression): T
+ visitGroupingExpression(expression: GroupingExpression): T
+ visitTemplateLiteralExpression(expression: TemplateLiteralExpression): T
+ visitTemplatePlaceholderExpression(
+ expression: TemplatePlaceholderExpression
+ ): T
+ visitTemplateTextExpression(expression: TemplateTextExpression): T
+ visitAssignExpression(expression: AssignExpression): T
+ visitUpdateExpression(expression: UpdateExpression): T
+ visitArrayExpression(expression: ArrayExpression): T
+ visitDictionaryExpression(expression: DictionaryExpression): T
+ visitGetExpression(expression: GetExpression): T
+ visitSetExpression(expression: SetExpression): T
+ visitTernaryExpression(expression: TernaryExpression): T
+}
+
+export abstract class Expression {
+ abstract accept(visitor: ExpressionVisitor): T
+ abstract location: Location
+}
+
+export class CallExpression extends Expression {
+ constructor(
+ public callee: Expression,
+ public paren: Token,
+ public args: Expression[],
+ public location: Location
+ ) {
+ super()
+ }
+
+ accept(visitor: ExpressionVisitor): T {
+ return visitor.visitCallExpression(this)
+ }
+}
+
+export class TernaryExpression extends Expression {
+ constructor(
+ public condition: Expression,
+ public thenBranch: Expression,
+ public elseBranch: Expression,
+ public location: Location
+ ) {
+ super()
+ }
+
+ accept(visitor: ExpressionVisitor): T {
+ return visitor.visitTernaryExpression(this)
+ }
+}
+
+export class LiteralExpression extends Expression {
+ constructor(public value: any, public location: Location) {
+ super()
+ }
+
+ accept(visitor: ExpressionVisitor): T {
+ return visitor.visitLiteralExpression(this)
+ }
+}
+
+export class ArrayExpression extends Expression {
+ constructor(public elements: Expression[], public location: Location) {
+ super()
+ }
+
+ accept(visitor: ExpressionVisitor): T {
+ return visitor.visitArrayExpression(this)
+ }
+}
+
+export class DictionaryExpression extends Expression {
+ constructor(
+ public elements: Map,
+ public location: Location
+ ) {
+ super()
+ }
+
+ accept(visitor: ExpressionVisitor): T {
+ return visitor.visitDictionaryExpression(this)
+ }
+}
+
+export class VariableExpression extends Expression {
+ constructor(public name: Token, public location: Location) {
+ super()
+ }
+
+ accept(visitor: ExpressionVisitor): T {
+ return visitor.visitVariableExpression(this)
+ }
+}
+
+export class BinaryExpression extends Expression {
+ constructor(
+ public left: Expression,
+ public operator: Token,
+ public right: Expression,
+ public location: Location
+ ) {
+ super()
+ }
+
+ accept(visitor: ExpressionVisitor): T {
+ return visitor.visitBinaryExpression(this)
+ }
+}
+
+export class LogicalExpression extends Expression {
+ constructor(
+ public left: Expression,
+ public operator: Token,
+ public right: Expression,
+ public location: Location
+ ) {
+ super()
+ }
+
+ accept(visitor: ExpressionVisitor): T {
+ return visitor.visitLogicalExpression(this)
+ }
+}
+
+export class UnaryExpression extends Expression {
+ constructor(
+ public operator: Token,
+ public operand: Expression,
+ public location: Location
+ ) {
+ super()
+ }
+
+ accept(visitor: ExpressionVisitor): T {
+ return visitor.visitUnaryExpression(this)
+ }
+}
+
+export class GroupingExpression extends Expression {
+ constructor(public inner: Expression, public location: Location) {
+ super()
+ }
+
+ accept(visitor: ExpressionVisitor): T {
+ return visitor.visitGroupingExpression(this)
+ }
+}
+
+export class TemplatePlaceholderExpression extends Expression {
+ constructor(public inner: Expression, public location: Location) {
+ super()
+ }
+
+ accept(visitor: ExpressionVisitor): T {
+ return visitor.visitTemplatePlaceholderExpression(this)
+ }
+}
+
+export class TemplateTextExpression extends Expression {
+ constructor(public text: Token, public location: Location) {
+ super()
+ }
+
+ accept(visitor: ExpressionVisitor): T {
+ return visitor.visitTemplateTextExpression(this)
+ }
+}
+
+export class TemplateLiteralExpression extends Expression {
+ constructor(public parts: Expression[], public location: Location) {
+ super()
+ }
+
+ accept(visitor: ExpressionVisitor): T {
+ return visitor.visitTemplateLiteralExpression(this)
+ }
+}
+
+export class AssignExpression extends Expression {
+ constructor(
+ public name: Token,
+ public operator: Token,
+ public value: Expression,
+ public updating: boolean,
+ public location: Location
+ ) {
+ super()
+ }
+
+ accept(visitor: ExpressionVisitor): T {
+ return visitor.visitAssignExpression(this)
+ }
+}
+
+export class UpdateExpression extends Expression {
+ constructor(
+ public operand: Expression,
+ public operator: Token,
+ public location: Location
+ ) {
+ super()
+ }
+
+ accept(visitor: ExpressionVisitor): T {
+ return visitor.visitUpdateExpression(this)
+ }
+}
+
+export class GetExpression extends Expression {
+ constructor(
+ public obj: Expression,
+ public field: Token,
+ public location: Location
+ ) {
+ super()
+ }
+
+ accept(visitor: ExpressionVisitor): T {
+ return visitor.visitGetExpression(this)
+ }
+}
+
+export class SetExpression extends Expression {
+ constructor(
+ public obj: Expression,
+ public field: Token,
+ public value: Expression,
+ public location: Location
+ ) {
+ super()
+ }
+
+ accept(visitor: ExpressionVisitor): T {
+ return visitor.visitSetExpression(this)
+ }
+}
diff --git a/app/javascript/interpreter/frames.ts b/app/javascript/interpreter/frames.ts
new file mode 100644
index 0000000000..258f954132
--- /dev/null
+++ b/app/javascript/interpreter/frames.ts
@@ -0,0 +1,136 @@
+import { type Callable } from './functions'
+import { RuntimeError } from './error'
+
+export type FrameExecutionStatus = 'SUCCESS' | 'ERROR'
+import type { EvaluationResult } from './evaluation-result'
+import type { ExternalFunction } from './executor'
+import { BinaryExpression, Expression } from './expression'
+
+export type FrameType = 'ERROR' | 'REPEAT' | 'EXPRESSION'
+
+export type Frame = {
+ line: number
+ code: string
+ status: FrameExecutionStatus
+ error?: RuntimeError
+ variables: Record
+ functions: Record
+ time: number
+ result?: EvaluationResult
+ data?: Record
+ description: string
+}
+export type FrameWithResult = Frame & { result: EvaluationResult }
+
+function isFrameWithResult(frame: Frame): frame is FrameWithResult {
+ return !!frame.result
+}
+
+export function describeFrame(
+ frame: Frame,
+ externalFunctions: ExternalFunction[]
+): string {
+ // These need to come from the exercise.
+ const functionDescriptions: Record = externalFunctions.reduce(
+ (acc: Record, fn: ExternalFunction) => {
+ acc[fn.name] = fn.description
+ return acc
+ },
+ {}
+ )
+
+ if (!isFrameWithResult(frame)) {
+ return 'There is no information available for this line.
'
+ }
+ switch (frame.result.type) {
+ case 'VariableStatement':
+ return describeVariableStatement(frame)
+ case 'ForeachStatement':
+ return describeForeachStatement(frame)
+ case 'AssignExpression':
+ return describeAssignExpression(frame)
+ case 'IfStatement':
+ return describeIfStatement(frame)
+ case 'ReturnStatement':
+ return describeReturnStatement(frame)
+ case 'CallExpression':
+ return describeCallExpression(frame, functionDescriptions)
+ default:
+ return `There is no information available for this line.
`
+ }
+}
+
+function addExtraAssignInfo(frame: Frame, output: string) {
+ if (frame.result?.value == null) {
+ output +=
+ 'null
is a special keyword that signifies the lack of a real value. It is often used as a placeholder before we know what we should set a value to.
'
+ }
+
+ return output
+}
+
+function describeVariableStatement(frame: FrameWithResult) {
+ let output
+ if (frame.result.data?.updating) {
+ output = `This updated the ${frame.result.name}
variable to ${frame.result.value}
.
`
+ } else {
+ output = `This created a new variable called ${frame.result.name}
and sets it to be equal to ${frame.result.value}
.
`
+ }
+ output = addExtraAssignInfo(frame, output)
+
+ return output
+}
+
+function describeAssignExpression(frame: FrameWithResult) {
+ let output = `This updated the variable called ${frame.result.name}
to ${frame.result.value.value}
.
`
+ output = addExtraAssignInfo(frame, output)
+
+ return output
+}
+
+function describeForeachStatement(frame: FrameWithResult) {
+ let output = `This looped through ${frame.result.iterable.name}
array. Each time this line of code is run, it selects the next item from the array and assigns to the ${frame.result.elementName}
variable.
`
+
+ if (frame.result.value) {
+ output += `This iteration set ${frame.result.elementName}
to:
`
+ output += `${JSON.stringify(
+ frame.result.value,
+ null,
+ 2
+ )}
`
+ }
+
+ return output
+}
+
+function describeIfStatement(frame: FrameWithResult) {
+ // TODO!!
+ return ''
+ // let output = `This checks to see whether ${frame.result.condition.left.obj.expression}
is greater than ${frame.result.condition.right.name}
.
`
+ // output += `In this case, ${frame.result.condition.left.obj.expression}
is set to ${frame.result.condition.left.obj.value}
and ${frame.result.condition.right.name}
is set to ${frame.result.condition.right.value}
so the result is ${frame.result.value}
.
`
+ // return output
+}
+function describeReturnStatement(frame: FrameWithResult) {
+ let output = `This returned the value of ${frame.result.value.name}
, which in this case is ${frame.result.value.value}
.
`
+ return output
+}
+function describeCallExpression(
+ frame: FrameWithResult,
+ functionDescriptions: any
+) {
+ let output = `This called the ${frame.result.callee.name}
function`
+ if (frame.result.args.length > 0) {
+ const argsValues = frame.result.args.map((arg) => arg.value).join(', ')
+ output += ` with the values (${argsValues})`
+ }
+ output += `.
`
+ const descriptionTemplate =
+ functionDescriptions[frame.result.callee.name] || ''
+ const argsValues = frame.result.args.map((arg) => arg.value)
+ const interpolatedDescription = descriptionTemplate.replace(
+ /\${arg(\d+)}/g,
+ (_, index) => argsValues[index - 1] || ''
+ )
+ output += interpolatedDescription
+ return output
+}
diff --git a/app/javascript/interpreter/functions.ts b/app/javascript/interpreter/functions.ts
new file mode 100644
index 0000000000..f5bdece44f
--- /dev/null
+++ b/app/javascript/interpreter/functions.ts
@@ -0,0 +1,60 @@
+import { Environment } from './environment'
+import { Interpreter } from './interpreter'
+import { FunctionStatement } from './statement'
+import type { ExecutionContext } from './executor'
+
+export type Arity = number | [min: number, max: number]
+
+export interface Callable {
+ arity(): Arity
+ call(context: ExecutionContext, args: any[]): any
+}
+
+export class ReturnValue extends Error {
+ constructor(public value: any) {
+ super()
+ }
+}
+
+export function isCallable(obj: any): obj is Callable {
+ return obj instanceof Object && 'arity' in obj && 'call' in obj
+}
+
+export class UserDefinedFunction implements Callable {
+ constructor(
+ private declaration: FunctionStatement,
+ private closure: Environment
+ ) {}
+
+ arity(): Arity {
+ return [
+ this.declaration.parameters.filter((p) => p.defaultValue === null).length,
+ this.declaration.parameters.length,
+ ]
+ }
+
+ call(interpreter: Interpreter, args: any[]): any {
+ const environment = new Environment(this.closure)
+
+ for (let i = 0; i < this.declaration.parameters.length; i++) {
+ const arg =
+ i < args.length
+ ? args[i]
+ : interpreter.evaluate(this.declaration.parameters[i].defaultValue!)
+ .value
+ environment.define(this.declaration.parameters[i].name.lexeme, arg)
+ }
+
+ try {
+ interpreter.executeBlock(this.declaration.body, environment)
+ } catch (error: unknown) {
+ if (error instanceof ReturnValue) {
+ return error.value
+ }
+
+ throw error
+ }
+
+ return null
+ }
+}
diff --git a/app/javascript/interpreter/interpreter.ts b/app/javascript/interpreter/interpreter.ts
new file mode 100644
index 0000000000..70997b4b31
--- /dev/null
+++ b/app/javascript/interpreter/interpreter.ts
@@ -0,0 +1,258 @@
+import {
+ RuntimeError,
+ type RuntimeErrorType,
+ type StaticError,
+ isStaticError,
+} from './error'
+import { Expression } from './expression'
+import { Location } from './location'
+import { Parser as JavaScriptParser } from './languages/javascript/parser'
+import { Parser as JikiScriptParser } from './languages/jikiscript/parser'
+import { Executor } from './executor'
+import { Statement } from './statement'
+import type { TokenType } from './token'
+import { Resolver } from './resolver'
+import { translate } from './translator'
+import type { ExternalFunction } from './executor'
+import type { Frame } from './frames'
+
+export type Language = 'JikiScript' | 'JavaScript'
+const LanguageSettings = {
+ JikiScript: {
+ allowVariableReassigmment: true,
+ },
+ JavaScript: {
+ allowVariableReassigmment: false,
+ },
+}
+
+interface ParserConstructor {
+ new (
+ functionNames: string[],
+ languageFeatures: any,
+ wrapTopLevelStatements: boolean
+ ): Parser
+}
+
+export interface Parser {
+ parse(sourceCode: string): Statement[]
+}
+
+export type FrameContext = {
+ result: any
+ expression?: Expression
+ statement?: Statement
+}
+
+export type Toggle = 'ON' | 'OFF'
+
+export type LanguageFeatures = {
+ IncludeList?: TokenType[]
+ ExcludeList?: TokenType[]
+ shadowing?: Toggle
+ truthiness?: Toggle
+ repeatDelay?: number
+}
+
+export type Context = {
+ externalFunctions?: ExternalFunction[]
+ language?: Language
+ languageFeatures?: LanguageFeatures
+ state?: Record
+ wrapTopLevelStatements?: boolean
+}
+
+export type EvaluateFunctionResult = {
+ value: any
+ frames: Frame[]
+ error: StaticError | null
+}
+
+export type InterpretResult = {
+ frames: Frame[]
+ error: StaticError | null
+}
+
+export function interpretJavaScript(sourceCode: string, context: Context = {}) {
+ return interpret(sourceCode, { ...context, language: 'JavaScript' })
+}
+export function interpretJikiScript(sourceCode: string, context: Context = {}) {
+ return interpret(sourceCode, { ...context, language: 'JikiScript' })
+}
+export function compile(sourceCode: string, context: Context = {}) {
+ const interpreter = new Interpreter(sourceCode, context)
+ try {
+ interpreter.compile()
+ } catch (data: any) {
+ return data
+ }
+ return {}
+}
+export function interpret(
+ sourceCode: string,
+ context: Context = {}
+): InterpretResult {
+ const interpreter = new Interpreter(sourceCode, context)
+ try {
+ interpreter.compile()
+ } catch (data: any) {
+ return data
+ }
+ return interpreter.execute()
+}
+
+export function evaluateJavaScriptFunction(
+ sourceCode: string,
+ context: Context = {},
+ functionCall: string,
+ ...args: any[]
+): EvaluateFunctionResult {
+ return evaluateFunction(
+ sourceCode,
+ { ...context, language: 'JavaScript' },
+ functionCall,
+ ...args
+ )
+}
+export function evaluateJikiScriptFunction(
+ sourceCode: string,
+ context: Context = {},
+ functionCall: string,
+ ...args: any[]
+): EvaluateFunctionResult {
+ return evaluateFunction(
+ sourceCode,
+ { ...context, language: 'JikiScript' },
+ functionCall,
+ ...args
+ )
+}
+export function evaluateFunction(
+ sourceCode: string,
+ context: Context = {},
+ functionCall: string,
+ ...args: any[]
+): EvaluateFunctionResult {
+ const interpreter = new Interpreter(sourceCode, context)
+ interpreter.compile()
+ const res = interpreter.evaluateFunction(functionCall, ...args)
+ // console.log(res)
+ return res
+}
+
+export class Interpreter {
+ private readonly parser: Parser
+ private readonly resolver: Resolver
+
+ private state: Record = {}
+ private language: Language
+ private parserType: ParserConstructor
+ private languageFeatures: LanguageFeatures = {}
+ private externalFunctions: ExternalFunction[] = []
+ private wrapTopLevelStatements = false
+
+ private statements: Statement[] = []
+
+ constructor(private readonly sourceCode: string, context: Context) {
+ // Set the instance variables based on the context that's been passed in.
+ this.language = context.language ? context.language : 'JavaScript'
+ this.parserType =
+ this.language == 'JavaScript' ? JavaScriptParser : JikiScriptParser
+
+ if (context.state !== undefined) {
+ this.state = context.state
+ }
+ this.externalFunctions = context.externalFunctions
+ ? context.externalFunctions
+ : []
+ if (context.languageFeatures !== undefined) {
+ this.languageFeatures = context.languageFeatures
+ }
+
+ this.parser = new this.parserType(
+ this.externalFunctions.map((f) => f.name),
+ this.languageFeatures,
+ this.wrapTopLevelStatements
+ )
+ this.resolver = new Resolver(
+ LanguageSettings[this.language].allowVariableReassigmment,
+ this.externalFunctions.map((f) => f.name)
+ )
+ }
+
+ public compile() {
+ try {
+ this.statements = this.parser.parse(this.sourceCode)
+ this.resolver.resolve(this.statements)
+ } catch (error: unknown) {
+ throw { frames: [], error: error }
+ }
+ }
+
+ public execute(): InterpretResult {
+ const executor = new Executor(
+ this.sourceCode,
+ this.languageFeatures,
+ this.externalFunctions,
+ this.resolver.locals,
+ this.state
+ )
+ return executor.execute(this.statements)
+ }
+
+ public evaluateFunction(
+ name: string,
+ ...args: any[]
+ ): EvaluateFunctionResult {
+ const callingCode = `${name}(${args
+ .map((arg) => JSON.stringify(arg))
+ .join(', ')})`
+
+ // Create a new parser with wrapTopLevelStatements set to false
+ // and use it to generate the calling statements.
+ const callingStatements = new this.parserType(
+ this.externalFunctions.map((f) => f.name),
+ this.languageFeatures,
+ false
+ ).parse(callingCode)
+
+ if (callingStatements.length !== 1)
+ this.error('CouldNotEvaluateFunction', Location.unknown, {
+ callingStatements,
+ })
+
+ try {
+ this.resolver.resolve(callingStatements)
+ } catch (error: unknown) {
+ if (isStaticError(error)) {
+ return { value: undefined, frames: [], error: error }
+ }
+ }
+
+ const executor = new Executor(
+ this.sourceCode,
+ this.languageFeatures,
+ this.externalFunctions,
+ this.resolver.locals
+ )
+ executor.execute(this.statements)
+ return executor.evaluateSingleExpression(callingStatements[0])
+ }
+
+ // public resolve(expression: Expression, depth: number): void {
+ // this.resolver.locals.set(expression, depth);
+ // }
+
+ private error(
+ type: RuntimeErrorType,
+ location: Location | null,
+ context: any = {}
+ ): never {
+ throw new RuntimeError(
+ translate(`error.runtime.${type}`, context),
+ location,
+ type,
+ context
+ )
+ }
+}
diff --git a/app/javascript/interpreter/languages/javascript/error.ts b/app/javascript/interpreter/languages/javascript/error.ts
new file mode 100644
index 0000000000..9e6bee0b10
--- /dev/null
+++ b/app/javascript/interpreter/languages/javascript/error.ts
@@ -0,0 +1,56 @@
+export type SyntaxErrorType =
+ | 'UnknownCharacter'
+ | 'MissingDoubleQuoteToStartString'
+ | 'MissingDoubleQuoteToTerminateString'
+ | 'MissingFieldNameOrIndexAfterLeftBracket'
+ | 'MissingRightParenthesisAfterExpression'
+ | 'MissingRightBraceToTerminatePlaceholder'
+ | 'MissingBacktickToTerminateTemplateLiteral'
+ | 'MissingExpression'
+ | 'InvalidAssignmentTarget'
+ | 'ExceededMaximumNumberOfParameters'
+ | 'MissingEndOfLine'
+ | 'MissingFunctionName'
+ | 'MissingLeftParenthesisAfterFunctionName'
+ | 'MissingLeftParenthesisAfterFunctionCall'
+ | 'MissingParameterName'
+ | 'MissingRightParenthesisAfterParameters'
+ | 'MissingLeftBraceToStartFunctionBody'
+ | 'MissingLeftBraceToStartWhileBody'
+ | 'MissingLeftParenthesisAfterWhile'
+ | 'MissingRightParenthesisAfterWhileCondition'
+ | 'MissingLeftBraceToStartDoWhileBody'
+ | 'MissingWhileBeforeDoWhileCondition'
+ | 'MissingLeftParenthesisAfterDoWhile'
+ | 'MissingRightParenthesisAfterDoWhileCondition'
+ | 'MissingLeftBraceToStartRepeatBody'
+ | 'MissingVariableName'
+ | 'MissingConstantName'
+ | 'MissingEqualsSignAfterVariableNameToInitializeValue'
+ | 'MissingEqualsSignAfterConstantNameToInitializeValue'
+ | 'MissingLeftParenthesisBeforeIfCondition'
+ | 'MissingRightParenthesisAfterIfCondition'
+ | 'MissingLeftBraceToStartFunctionBody'
+ | 'MissingLeftBraceToStartFunctionBody'
+ | 'MissingLeftBraceToStartIfBody'
+ | 'MissingLeftBraceToStartElseBody'
+ | 'MissingDoAfterRepeatStatementCondition'
+ | 'MissingDoAfterWhileStatementCondition'
+ | 'MissingLeftParenthesisAfterForeach'
+ | 'MissingLetInForeachCondition'
+ | 'MissingElementNameAfterForeach'
+ | 'MissingOfAfterElementNameInForeach'
+ | 'MissingRightParenthesisAfterForeachElement'
+ | 'MissingLeftBraceToStartForeachBody'
+ | 'MissingRightBraceAfterBlock'
+ | 'MissingRightBracketAfterFieldNameOrIndex'
+ | 'MissingRightParenthesisAfterFunctionCall'
+ | 'MissingRightParenthesisAfterExpression'
+ | 'MissingRightBracketAfterListElements'
+ | 'MissingRightBraceAfterMapElements'
+ | 'MissingStringAsKey'
+ | 'MissingColonAfterKey'
+ | 'MissingFieldNameOrIndexAfterOpeningBracket'
+ | 'InvalidTemplateLiteral'
+ | 'MissingColonAfterThenBranchOfTernaryOperator'
+ | 'NumberWithMultipleDecimalPoints'
diff --git a/app/javascript/interpreter/languages/javascript/parser.ts b/app/javascript/interpreter/languages/javascript/parser.ts
new file mode 100644
index 0000000000..5f0483b0eb
--- /dev/null
+++ b/app/javascript/interpreter/languages/javascript/parser.ts
@@ -0,0 +1,864 @@
+import { SyntaxError } from '../../error'
+import { type SyntaxErrorType } from './error'
+import {
+ ArrayExpression,
+ AssignExpression,
+ BinaryExpression,
+ CallExpression,
+ Expression,
+ GroupingExpression,
+ LiteralExpression,
+ LogicalExpression,
+ DictionaryExpression,
+ UnaryExpression,
+ VariableExpression,
+ GetExpression,
+ SetExpression,
+ TemplateLiteralExpression,
+ TemplatePlaceholderExpression,
+ TemplateTextExpression,
+ UpdateExpression,
+ TernaryExpression,
+} from '../../expression'
+import type { LanguageFeatures } from '../../interpreter'
+import { Location } from '../../location'
+import { Scanner } from './scanner'
+import {
+ BlockStatement,
+ ConstantStatement,
+ DoWhileStatement,
+ ExpressionStatement,
+ ForeachStatement,
+ FunctionParameter,
+ FunctionStatement,
+ IfStatement,
+ RepeatStatement,
+ RepeatUntilGameOverStatement,
+ ReturnStatement,
+ Statement,
+ VariableStatement,
+ WhileStatement,
+} from '../../statement'
+import type { Token, TokenType } from './token'
+import { translate } from '../../translator'
+
+export class Parser {
+ private readonly scanner: Scanner
+ private current: number = 0
+ private tokens: Token[] = []
+
+ constructor(
+ private functionNames: string[] = [],
+ languageFeatures: LanguageFeatures,
+ private shouldWrapTopLevelStatements: boolean
+ ) {
+ this.scanner = new Scanner(languageFeatures)
+ }
+
+ public parse(sourceCode: string): Statement[] {
+ this.tokens = this.scanner.scanTokens(sourceCode)
+
+ const statements = []
+
+ while (!this.isAtEnd()) statements.push(this.declarationStatement())
+
+ if (this.shouldWrapTopLevelStatements)
+ return this.wrapTopLevelStatements(statements)
+
+ return statements
+ }
+
+ wrapTopLevelStatements(statements: Statement[]): Statement[] {
+ const functionStmt = new FunctionStatement(
+ {
+ type: 'IDENTIFIER',
+ lexeme: 'main',
+ literal: null,
+ location: Location.unknown,
+ },
+ [],
+ [],
+ Location.unknown
+ )
+
+ for (let i = statements.length - 1; i >= 0; i--) {
+ // Don't wrap top-level function statements
+ if (statements[i] instanceof FunctionStatement) continue
+
+ functionStmt.body.unshift(statements[i])
+ statements.splice(i, 1)
+ }
+
+ statements.push(functionStmt)
+ return statements
+ }
+
+ private declarationStatement(): Statement {
+ if (this.match('FUNCTION')) return this.functionStatement()
+
+ return this.statement()
+ }
+
+ private functionStatement(): Statement {
+ const name = this.consume('IDENTIFIER', 'MissingFunctionName')
+ this.consume('LEFT_PAREN', 'MissingLeftParenthesisAfterFunctionName', {
+ name,
+ })
+ const parameters: FunctionParameter[] = []
+ if (!this.check('RIGHT_PAREN')) {
+ do {
+ if (parameters.length > 255) {
+ this.error(
+ 'ExceededMaximumNumberOfParameters',
+ this.peek().location,
+ {
+ maximum: 255,
+ actual: parameters.length,
+ name,
+ }
+ )
+ }
+
+ const parameterName = this.consume(
+ 'IDENTIFIER',
+ 'MissingParameterName',
+ {
+ name: name,
+ }
+ )
+
+ let defaultValue: Expression | null = null
+
+ if (this.match('EQUAL')) {
+ defaultValue = this.expression()
+ }
+
+ parameters.push(new FunctionParameter(parameterName, defaultValue))
+ } while (this.match('COMMA'))
+ }
+ this.consume('RIGHT_PAREN', 'MissingRightParenthesisAfterParameters', {
+ name,
+ parameters,
+ })
+ this.consume('LEFT_BRACE', 'MissingLeftBraceToStartFunctionBody', { name })
+ this.consumeEndOfLine()
+
+ const body = this.block()
+ this.functionNames.push(name.lexeme)
+ return new FunctionStatement(
+ name,
+ parameters,
+ body,
+ Location.between(name, this.previous())
+ )
+ }
+
+ private statement(): Statement {
+ if (this.match('LET')) return this.letStatement()
+ if (this.match('CONST')) return this.constStatement()
+ if (this.match('IF')) return this.ifStatement()
+ if (this.match('RETURN')) return this.returnStatement()
+ if (this.match('REPEAT_UNTIL_GAME_OVER'))
+ return this.repeatUntilGameOverStatement()
+ if (this.match('WHILE')) return this.whileStatement()
+ if (this.match('DO')) return this.doWhileStatement()
+ if (this.match('FOR')) return this.foreachStatement()
+ if (this.match('LEFT_BRACE')) return this.blockStatement()
+
+ return this.expressionStatement()
+ }
+
+ private letStatement(): Statement {
+ const letToken = this.previous()
+ const name = this.consume('IDENTIFIER', 'MissingVariableName')
+ this.consume(
+ 'EQUAL',
+ 'MissingEqualsSignAfterVariableNameToInitializeValue',
+ {
+ name,
+ }
+ )
+
+ const initializer = this.expression()
+ this.consumeEndOfLine()
+
+ return new VariableStatement(
+ name,
+ initializer,
+ Location.between(letToken, initializer)
+ )
+ }
+
+ private constStatement(): Statement {
+ const constToken = this.previous()
+ const name = this.consume('IDENTIFIER', 'MissingConstantName')
+ this.consume(
+ 'EQUAL',
+ 'MissingEqualsSignAfterConstantNameToInitializeValue',
+ {
+ name,
+ }
+ )
+
+ const initializer = this.expression()
+ this.consumeEndOfLine()
+
+ return new ConstantStatement(
+ name,
+ initializer,
+ Location.between(constToken, initializer)
+ )
+ }
+
+ private ifStatement(): Statement {
+ const ifToken = this.previous()
+ this.consume('LEFT_PAREN', 'MissingLeftParenthesisBeforeIfCondition')
+ const condition = this.expression()
+ this.consume('RIGHT_PAREN', 'MissingRightParenthesisAfterIfCondition', {
+ condition,
+ })
+ this.consume('LEFT_BRACE', 'MissingLeftBraceToStartIfBody')
+ const thenBranch = this.blockStatement()
+ let elseBranch = null
+
+ if (this.match('ELSE')) {
+ if (this.match('IF')) {
+ elseBranch = this.ifStatement()
+ } else {
+ this.consume('LEFT_BRACE', 'MissingLeftBraceToStartElseBody')
+ elseBranch = this.blockStatement()
+ }
+ }
+
+ return new IfStatement(
+ condition,
+ thenBranch,
+ elseBranch,
+ Location.between(ifToken, this.previous())
+ )
+ }
+
+ private returnStatement(): Statement {
+ const keyword = this.previous()
+ const value: Expression | null = this.isAtEndOfStatement()
+ ? null
+ : this.expression()
+
+ this.consumeEndOfLine()
+
+ return new ReturnStatement(
+ keyword,
+ value,
+ Location.between(keyword, value || keyword)
+ )
+ }
+
+ private repeatUntilGameOverStatement(): Statement {
+ const begin = this.previous()
+
+ this.consume('LEFT_BRACE', 'MissingLeftBraceToStartRepeatBody')
+ this.consumeEndOfLine()
+
+ const statements = this.block()
+
+ return new RepeatUntilGameOverStatement(
+ statements,
+ Location.between(begin, this.previous())
+ )
+ }
+
+ private whileStatement(): Statement {
+ const begin = this.previous()
+ this.consume('LEFT_PAREN', 'MissingLeftParenthesisAfterWhile')
+ const condition = this.expression()
+ this.consume('RIGHT_PAREN', 'MissingRightParenthesisAfterWhileCondition', {
+ condition,
+ })
+
+ this.consume('LEFT_BRACE', 'MissingLeftBraceToStartWhileBody')
+ this.consumeEndOfLine()
+
+ const statements = this.block()
+
+ return new WhileStatement(
+ condition,
+ statements,
+ Location.between(begin, this.previous())
+ )
+ }
+
+ private doWhileStatement(): Statement {
+ const begin = this.previous()
+
+ this.consume('LEFT_BRACE', 'MissingLeftBraceToStartDoWhileBody')
+ this.consumeEndOfLine()
+
+ const statements = this.block()
+
+ this.consume('WHILE', 'MissingWhileBeforeDoWhileCondition')
+
+ this.consume('LEFT_PAREN', 'MissingLeftParenthesisAfterDoWhile')
+ const condition = this.expression()
+ this.consume(
+ 'RIGHT_PAREN',
+ 'MissingRightParenthesisAfterDoWhileCondition',
+ {
+ condition,
+ }
+ )
+
+ this.consumeEndOfLine()
+
+ return new DoWhileStatement(
+ condition,
+ statements,
+ Location.between(begin, this.previous())
+ )
+ }
+
+ private foreachStatement(): Statement {
+ const foreachToken = this.previous()
+ this.consume('LEFT_PAREN', 'MissingLeftParenthesisAfterForeach')
+ this.consume('LET', 'MissingLetInForeachCondition')
+ const elementName = this.consume(
+ 'IDENTIFIER',
+ 'MissingElementNameAfterForeach'
+ )
+ this.consume('OF', 'MissingOfAfterElementNameInForeach', {
+ elementName,
+ })
+ const iterable = this.expression()
+
+ this.consume('RIGHT_PAREN', 'MissingRightParenthesisAfterForeachElement', {
+ iterable,
+ })
+ this.consume('LEFT_BRACE', 'MissingLeftBraceToStartForeachBody')
+ this.consumeEndOfLine()
+
+ const statements = this.block()
+
+ return new ForeachStatement(
+ elementName,
+ iterable,
+ statements,
+ Location.between(foreachToken, this.previous())
+ )
+ }
+
+ private blockStatement(): BlockStatement {
+ const leftBraceToken = this.previous()
+ this.consumeEndOfLine()
+ const statements = this.block()
+
+ return new BlockStatement(
+ statements,
+ Location.between(leftBraceToken, this.previous())
+ )
+ }
+
+ private block(): Statement[] {
+ const statements: Statement[] = []
+
+ while (!this.check('RIGHT_BRACE') && !this.isAtEnd()) {
+ statements.push(this.statement())
+ }
+
+ this.consume('RIGHT_BRACE', 'MissingRightBraceAfterBlock')
+ this.consumeEndOfLine()
+ return statements
+ }
+
+ private expressionStatement(): Statement {
+ const expression = this.expression()
+ this.consumeEndOfLine()
+
+ return new ExpressionStatement(expression, expression.location)
+ }
+
+ private expression(): Expression {
+ return this.assignment()
+ }
+
+ private assignment(): Expression {
+ const expr = this.ternary()
+
+ if (
+ this.match(
+ 'EQUAL',
+ 'SLASH_EQUAL',
+ 'STAR_EQUAL',
+ 'PLUS_EQUAL',
+ 'MINUS_EQUAL'
+ )
+ ) {
+ const operator = this.previous()
+ const value = this.assignment()
+
+ if (expr instanceof VariableExpression) {
+ return new AssignExpression(
+ expr.name,
+ operator,
+ value,
+ Location.between(expr, value)
+ )
+ }
+
+ if (expr instanceof GetExpression) {
+ return new SetExpression(
+ expr.obj,
+ expr.field,
+ value,
+ Location.between(expr, value)
+ )
+ }
+
+ this.error('InvalidAssignmentTarget', expr.location, {
+ assignmentTarget: expr,
+ })
+ }
+
+ return expr
+ }
+
+ private ternary(): Expression {
+ const expr = this.or()
+
+ if (this.match('QUESTION_MARK')) {
+ const then = this.ternary()
+ this.consume('COLON', 'MissingColonAfterThenBranchOfTernaryOperator', {
+ then,
+ })
+ const else_ = this.ternary()
+ return new TernaryExpression(
+ expr,
+ then,
+ else_,
+ Location.between(expr, else_)
+ )
+ }
+
+ return expr
+ }
+
+ private or(): Expression {
+ const expr = this.and()
+
+ while (this.match('OR', 'PIPE_PIPE')) {
+ let operator = this.previous()
+ operator.type = 'OR'
+ const right = this.and()
+ return new LogicalExpression(
+ expr,
+ operator,
+ right,
+ Location.between(expr, right)
+ )
+ }
+
+ return expr
+ }
+
+ private and(): Expression {
+ const expr = this.equality()
+
+ while (this.match('AND', 'AMPERSAND_AMPERSAND')) {
+ let operator = this.previous()
+ operator.type = 'AND'
+ const right = this.equality()
+ return new LogicalExpression(
+ expr,
+ operator,
+ right,
+ Location.between(expr, right)
+ )
+ }
+
+ return expr
+ }
+
+ private equality(): Expression {
+ let expr = this.comparison()
+
+ while (
+ this.match(
+ 'EQUALITY',
+ 'STRICT_INEQUALITY',
+ 'INEQUALITY',
+ 'STRICT_EQUALITY'
+ )
+ ) {
+ const operator = this.previous()
+ const right = this.comparison()
+ expr = new BinaryExpression(
+ expr,
+ operator,
+ right,
+ Location.between(expr, right)
+ )
+ }
+
+ return expr
+ }
+
+ private comparison(): Expression {
+ let expr = this.term()
+
+ while (this.match('GREATER', 'GREATER_EQUAL', 'LESS', 'LESS_EQUAL')) {
+ const operator = this.previous()
+ const right = this.term()
+ expr = new BinaryExpression(
+ expr,
+ operator,
+ right,
+ Location.between(expr, right)
+ )
+ }
+
+ return expr
+ }
+
+ private term(): Expression {
+ let expr = this.factor()
+
+ while (this.match('MINUS', 'PLUS')) {
+ const operator = this.previous()
+ const right = this.factor()
+ expr = new BinaryExpression(
+ expr,
+ operator,
+ right,
+ Location.between(expr, right)
+ )
+ }
+
+ return expr
+ }
+
+ private factor(): Expression {
+ let expr = this.unary()
+
+ while (this.match('SLASH', 'STAR')) {
+ const operator = this.previous()
+ const right = this.unary()
+ expr = new BinaryExpression(
+ expr,
+ operator,
+ right,
+ Location.between(expr, right)
+ )
+ }
+
+ return expr
+ }
+
+ private unary(): Expression {
+ if (this.match('NOT', 'MINUS')) {
+ const operator = this.previous()
+ const right = this.unary()
+ return new UnaryExpression(
+ operator,
+ right,
+ Location.between(operator, right)
+ )
+ }
+
+ return this.postfix()
+ }
+
+ private postfix(): Expression {
+ const expression = this.call()
+
+ if (this.match('PLUS_PLUS', 'MINUS_MINUS')) {
+ const operator = this.previous()
+
+ return new UpdateExpression(
+ expression,
+ operator,
+ Location.between(operator, expression)
+ )
+ }
+
+ return expression
+ }
+
+ private call(): Expression {
+ let expression = this.primary()
+
+ while (true) {
+ if (this.match('LEFT_PAREN')) {
+ expression = this.finishCall(expression)
+ } else if (this.match('LEFT_BRACKET')) {
+ const leftBracket = this.previous()
+ if (!this.match('STRING', 'NUMBER'))
+ this.error(
+ 'MissingFieldNameOrIndexAfterLeftBracket',
+ leftBracket.location,
+ {
+ expression,
+ }
+ )
+
+ const name = this.previous()
+ const rightBracket = this.consume(
+ 'RIGHT_BRACKET',
+ 'MissingRightBracketAfterFieldNameOrIndex',
+ { expression, name }
+ )
+ expression = new GetExpression(
+ expression,
+ name,
+ Location.between(expression, rightBracket)
+ )
+ } else {
+ if (
+ expression instanceof VariableExpression &&
+ this.functionNames.includes(expression.name.lexeme) &&
+ this.match('RIGHT_PAREN')
+ )
+ this.error(
+ 'MissingLeftParenthesisAfterFunctionCall',
+ this.previous().location,
+ { expression, function: expression.name.lexeme }
+ )
+ break
+ }
+ }
+
+ return expression
+ }
+
+ private finishCall(callee: Expression): Expression {
+ const args: Expression[] = []
+
+ if (!this.check('RIGHT_PAREN')) {
+ do {
+ args.push(this.expression())
+ } while (this.match('COMMA'))
+ }
+
+ const paren = this.consume(
+ 'RIGHT_PAREN',
+ 'MissingRightParenthesisAfterFunctionCall',
+ {
+ args,
+ function:
+ callee instanceof VariableExpression ? callee.name.lexeme : null,
+ }
+ )
+ return new CallExpression(
+ callee,
+ paren,
+ args,
+ Location.between(callee, paren)
+ )
+ }
+
+ private primary(): Expression {
+ if (this.match('LEFT_BRACKET')) return this.array()
+
+ if (this.match('LEFT_BRACE')) return this.dictionary()
+
+ if (this.match('FALSE'))
+ return new LiteralExpression(false, this.previous().location)
+
+ if (this.match('TRUE'))
+ return new LiteralExpression(true, this.previous().location)
+
+ if (this.match('NULL'))
+ return new LiteralExpression(null, this.previous().location)
+
+ if (this.match('NUMBER', 'STRING'))
+ return new LiteralExpression(
+ this.previous().literal,
+ this.previous().location
+ )
+
+ if (this.match('IDENTIFIER'))
+ return new VariableExpression(this.previous(), this.previous().location)
+
+ if (this.match('BACKTICK')) return this.templateLiteral()
+
+ if (this.match('LEFT_PAREN')) {
+ const lparen = this.previous()
+ const expression = this.expression()
+ const rparen = this.consume(
+ 'RIGHT_PAREN',
+ 'MissingRightParenthesisAfterExpression',
+ {
+ expression,
+ }
+ )
+ return new GroupingExpression(
+ expression,
+ Location.between(lparen, rparen)
+ )
+ }
+
+ this.error('MissingExpression', this.peek().location)
+ }
+
+ private templateLiteral(): Expression {
+ const openBacktick = this.previous()
+ const parts: Expression[] = []
+
+ while (this.peek().type != 'BACKTICK') {
+ if (this.match('DOLLAR_LEFT_BRACE')) {
+ const dollarLeftBrace = this.previous()
+ const expr = this.expression()
+ const rightBrace = this.consume(
+ 'RIGHT_BRACE',
+ 'MissingRightBraceToTerminatePlaceholder',
+ { expr }
+ )
+ parts.push(
+ new TemplatePlaceholderExpression(
+ expr,
+ Location.between(dollarLeftBrace, rightBrace)
+ )
+ )
+ } else {
+ const textToken = this.consume(
+ 'TEMPLATE_LITERAL_TEXT',
+ 'InvalidTemplateLiteral'
+ )
+ parts.push(new TemplateTextExpression(textToken, textToken.location))
+ }
+ }
+
+ const closeBacktick = this.consume(
+ 'BACKTICK',
+ 'MissingBacktickToTerminateTemplateLiteral',
+ { elements: parts }
+ )
+ return new TemplateLiteralExpression(
+ parts,
+ Location.between(openBacktick, closeBacktick)
+ )
+ }
+
+ private array(): Expression {
+ const leftBracket = this.previous()
+ const elements: Expression[] = []
+
+ if (!this.check('RIGHT_BRACKET')) {
+ do {
+ elements.push(this.or())
+ } while (this.match('COMMA'))
+ }
+
+ const rightBracket = this.consume(
+ 'RIGHT_BRACKET',
+ 'MissingRightBracketAfterListElements',
+ { elements }
+ )
+ return new ArrayExpression(
+ elements,
+ Location.between(leftBracket, rightBracket)
+ )
+ }
+
+ private dictionary(): Expression {
+ const leftBrace = this.previous()
+ const elements = new Map()
+
+ if (!this.check('RIGHT_BRACE')) {
+ do {
+ const key = this.consume('STRING', 'MissingStringAsKey')
+ this.consume('COLON', 'MissingColonAfterKey')
+ elements.set(key.literal, this.primary())
+ } while (this.match('COMMA'))
+ }
+
+ const rightBracket = this.consume(
+ 'RIGHT_BRACE',
+ 'MissingRightBraceAfterMapElements',
+ { elements }
+ )
+ return new DictionaryExpression(
+ elements,
+ Location.between(leftBrace, rightBracket)
+ )
+ }
+
+ private match(...tokenTypes: TokenType[]): boolean {
+ for (const tokenType of tokenTypes) {
+ if (this.check(tokenType)) {
+ this.advance()
+ return true
+ }
+ }
+ return false
+ }
+
+ private check(tokenType: TokenType): boolean {
+ if (this.isAtEnd()) return false
+ return this.peek().type == tokenType
+ }
+
+ private advance(): Token {
+ if (!this.isAtEnd()) this.current++
+ return this.previous()
+ }
+
+ private consume(
+ tokenType: TokenType,
+ type: SyntaxErrorType,
+ context?: any
+ ): Token {
+ if (this.check(tokenType)) return this.advance()
+
+ this.error(type, this.peek().location, context)
+ }
+
+ private consumeEndOfLine(): void {
+ this.consume('EOL', 'MissingEndOfLine')
+ }
+
+ private error(
+ type: SyntaxErrorType,
+ location: Location,
+ context?: any
+ ): never {
+ throw new SyntaxError(
+ translate(`error.syntax.${type}`, context),
+ location,
+ type,
+ context
+ )
+ }
+
+ private isAtEnd(): boolean {
+ return this.peek().type == 'EOF'
+ }
+
+ private isAtEndOfStatement(): boolean {
+ return this.peek().type == 'EOL' || this.isAtEnd()
+ }
+
+ private peek(): Token {
+ return this.tokens[this.current]
+ }
+
+ private previous(): Token {
+ return this.tokens[this.current - 1]
+ }
+}
+
+export function parse(
+ sourceCode: string,
+ {
+ functionNames = [],
+ languageFeatures = {},
+ shouldWrapTopLevelStatements = false,
+ }: {
+ functionNames?: string[]
+ languageFeatures?: LanguageFeatures
+ shouldWrapTopLevelStatements?: boolean
+ } = {}
+): Statement[] {
+ return new Parser(
+ functionNames,
+ languageFeatures,
+ shouldWrapTopLevelStatements
+ ).parse(sourceCode)
+}
diff --git a/app/javascript/interpreter/languages/javascript/scanner.ts b/app/javascript/interpreter/languages/javascript/scanner.ts
new file mode 100644
index 0000000000..02d777ab6f
--- /dev/null
+++ b/app/javascript/interpreter/languages/javascript/scanner.ts
@@ -0,0 +1,490 @@
+/*
+ * The scanner is the first part of the interpreter.
+ * It takes the source code as input and produces a list of tokens, that
+ * represent the different conceptual elements of the source code. For example,
+ * it takes a whole string and reduces it into a STRING token, and it takes an
+ * equals sign and turns it into an EQUAL token.
+ *
+ * These tokens will then be used by the parser to build a tree of expressions,
+ * which will be used by the interpreter to execute the program.
+ *
+ * The main workflow here is looking at the next character in the source code,
+ * and then deciding what to do with it. Sometimes we just immediate "consume" it
+ * (turn it into a token), but other times we need to peak ahead and see what comes
+ * next to know what token to produce or how to handle it.
+ *
+ * This process will also produce errors if the source code is invalid, for example
+ * if we see an unterminated string, or a number with multiple decimal points.
+ */
+import {
+ DisabledLanguageFeatureError,
+ type DisabledLanguageFeatureErrorType,
+ SyntaxError,
+} from '../../error'
+import { type SyntaxErrorType } from './error'
+import type { Token, TokenType } from './token'
+import { Location } from '../../location'
+import type { LanguageFeatures } from '../../interpreter'
+import { translate } from '../../translator'
+
+export class Scanner {
+ private tokens: Token[] = []
+ private start: number = 0
+ private current: number = 0
+ private line: number = 1
+ private lineOffset: number = 0
+ private sourceCode: string = ''
+
+ private static readonly keywords: Record = {
+ and: 'AND',
+ const: 'CONST',
+ do: 'DO',
+ else: 'ELSE',
+ false: 'FALSE',
+ for: 'FOR',
+ function: 'FUNCTION',
+ if: 'IF',
+ in: 'IN',
+ let: 'LET',
+ null: 'NULL',
+ of: 'OF',
+ or: 'OR',
+ repeatUntilGameOver: 'REPEAT_UNTIL_GAME_OVER',
+ return: 'RETURN',
+ true: 'TRUE',
+ while: 'WHILE',
+ }
+
+ private readonly tokenizers: Record = {
+ '(': this.tokenizeLeftParanthesis,
+ ')': this.tokenizeRightParanthesis,
+ '{': this.tokenizeLeftBrace,
+ '}': this.tokenizeRightBrace,
+ '[': this.tokenizeLeftBracket,
+ ']': this.tokenizeRightBracket,
+ ':': this.tokenizeColon,
+ ',': this.tokenizeComma,
+ '+': this.tokenizePlus,
+ '-': this.tokenizeMinus,
+ '*': this.tokenizeStar,
+ '/': this.tokenizeSlash,
+ '=': this.tokenizeEquals,
+ '!': this.tokenizeBang,
+ '>': this.tokenizeGreater,
+ '<': this.tokenizeLess,
+ '?': this.tokenizeQuestionMark,
+ ' ': this.tokenizeWhitespace,
+ '\t': this.tokenizeWhitespace,
+ '\r': this.tokenizeWhitespace,
+ '\n': this.tokenizeNewline,
+ '"': this.tokenizeString,
+ '`': this.tokenizeTemplateLiteral,
+ }
+
+ constructor(private languageFeatures: LanguageFeatures = {}) {}
+
+ scanTokens(sourceCode: string): Token[] {
+ this.sourceCode = sourceCode
+ this.reset()
+
+ while (!this.isAtEnd()) {
+ this.start = this.current
+ this.scanToken()
+ }
+
+ // Add synthetic EOL token to simplify parsing
+ if (this.shouldAddEOLToken()) this.addSyntheticToken('EOL', '\n')
+
+ // Add synthetic EOF token to simplify parsing
+ this.addSyntheticToken('EOF', '\0')
+
+ return this.tokens
+ }
+
+ private scanToken(): void {
+ const c = this.advance()
+
+ const tokenizer = this.tokenizers[c]
+ if (tokenizer) {
+ tokenizer.bind(this)()
+ } else {
+ if (c == '&' && this.match('&')) {
+ this.addToken('AMPERSAND_AMPERSAND')
+ } else if (c == '|' && this.match('|')) {
+ this.addToken('PIPE_PIPE')
+ } else if (this.isDigit(c)) {
+ this.tokenizeNumber()
+ } else if (this.isAlpha(c)) {
+ this.tokenizeIdentifier()
+ } else {
+ this.error('UnknownCharacter', {
+ character: c,
+ })
+ }
+ }
+ }
+
+ /**
+ * These are tokenizers. The purpose of a tokenizer is to consume characters from the source code
+ * and produce a token. The token is then added to the list of tokens.
+ *
+ * For example, if we see a left paranthesis, we add a token of type "LEFT_PAREN" to the list of tokens.
+ *
+ * Some tokens are more complex. For example if we see an equals sign, we need to check if the next character
+ * is also an equals sign. If it is, we add a token of type "EQUAL_EQUAL" to the list of tokens. If it is not,
+ * we add a token of type "EQUAL" to the list of tokens.
+ *
+ * Some are even more complex. For example, if we see a double quote, we need to consume characters until we see
+ * another double quote. We then add a token of type "STRING" to the list of tokens
+ * with all the characters between the double quotes consumed.
+ */
+
+ /* This first set of tokenizers are simple. They consume a single character and add a token to the list of tokens,
+ * or do simple checks for the next characters (e.g. "++")
+ */
+ private tokenizeLeftParanthesis() {
+ this.addToken('LEFT_PAREN')
+ }
+ private tokenizeRightParanthesis() {
+ this.addToken('RIGHT_PAREN')
+ }
+ private tokenizeLeftBrace() {
+ this.addToken('LEFT_BRACE')
+ }
+ private tokenizeRightBrace() {
+ this.addToken('RIGHT_BRACE')
+ }
+ private tokenizeLeftBracket() {
+ this.addToken('LEFT_BRACKET')
+ }
+ private tokenizeRightBracket() {
+ this.addToken('RIGHT_BRACKET')
+ }
+ private tokenizeColon() {
+ this.addToken('COLON')
+ }
+ private tokenizeComma() {
+ this.addToken('COMMA')
+ }
+ private tokenizePlus() {
+ this.addToken(
+ this.match('=') ? 'PLUS_EQUAL' : this.match('+') ? 'PLUS_PLUS' : 'PLUS'
+ )
+ }
+ private tokenizeMinus() {
+ this.addToken(
+ this.match('=')
+ ? 'MINUS_EQUAL'
+ : this.match('-')
+ ? 'MINUS_MINUS'
+ : 'MINUS'
+ )
+ }
+ private tokenizeStar() {
+ this.addToken(this.match('=') ? 'STAR_EQUAL' : 'STAR')
+ }
+ private tokenizeSlash() {
+ if (this.match('=')) {
+ this.addToken('SLASH_EQUAL')
+ } else {
+ this.addToken('SLASH')
+ }
+ }
+ private tokenizeEquals() {
+ this.addToken(
+ this.match('=')
+ ? this.match('=')
+ ? 'STRICT_EQUALITY'
+ : 'EQUALITY'
+ : 'EQUAL'
+ )
+ }
+ private tokenizeBang() {
+ this.addToken(
+ this.match('=')
+ ? this.match('=')
+ ? 'STRICT_INEQUALITY'
+ : 'INEQUALITY'
+ : 'NOT'
+ )
+ }
+ private tokenizeGreater() {
+ this.addToken(this.match('=') ? 'GREATER_EQUAL' : 'GREATER')
+ }
+ private tokenizeLess() {
+ this.addToken(this.match('=') ? 'LESS_EQUAL' : 'LESS')
+ }
+ private tokenizeQuestionMark() {
+ this.addToken('QUESTION_MARK')
+ }
+
+ /*
+ * We don't tokenize whitespace, but we do need to match on it
+ */
+ private tokenizeWhitespace() {
+ return
+ }
+
+ /*
+ * The new line tokenizer not only adds a token, but also increments the line number
+ * and resets the line offset to the next character.
+ */
+ private tokenizeNewline() {
+ if (this.shouldAddEOLToken()) this.addToken('EOL')
+
+ this.line++
+ this.lineOffset = this.current
+ }
+
+ private tokenizeString(): void {
+ // Keep consuming characters until we see another double quote
+ // and then stop before we consume it.
+ while (this.peek() != '"' && this.isAnotherCharacter()) this.advance()
+
+ // If we reach the end of the line, we have an unterminated string
+ if (this.peek() != '"')
+ if (this.previouslyAddedToken() == 'IDENTIFIER')
+ this.error('MissingDoubleQuoteToStartString', {
+ string: this.tokens[this.tokens.length - 1].lexeme,
+ })
+ else
+ this.error('MissingDoubleQuoteToTerminateString', {
+ string: this.sourceCode.substring(this.start + 1, this.current),
+ })
+
+ // Consume the closing quotation mark
+ this.advance()
+
+ // Finally add the token, with its value set to the characters between the quotes
+ this.addToken(
+ 'STRING',
+ this.sourceCode.substring(this.start + 1, this.current - 1)
+ )
+ }
+
+ // TODO: Check whether this errors correctly if split over lines
+ private tokenizeTemplateLiteral(): void {
+ this.addToken('BACKTICK')
+
+ while (this.peek() != '`' && this.isAnotherCharacter()) {
+ this.start = this.current
+
+ if (this.peek() != '$' && this.peekNext() != '{' && !this.isAtEnd()) {
+ while (
+ this.peek() != '$' &&
+ this.peek() != '`' &&
+ this.peekNext() != '{' &&
+ !this.isAtEnd()
+ )
+ this.advance()
+
+ this.addToken(
+ 'TEMPLATE_LITERAL_TEXT',
+ this.sourceCode.substring(this.start, this.current)
+ )
+ } else {
+ this.advance() // Consume the $
+ this.advance() // Consume the {
+ this.addToken('DOLLAR_LEFT_BRACE')
+ this.start = this.current
+
+ while (this.peek() != '}' && !this.isAtEnd()) {
+ this.start = this.current
+ this.scanToken()
+ }
+
+ if (this.isAtEnd())
+ this.error('MissingRightBraceToTerminatePlaceholder')
+
+ this.start = this.current
+ this.advance()
+ this.addToken('RIGHT_BRACE') // Consume the }
+ }
+ }
+
+ if (this.isAtEnd()) this.error('MissingBacktickToTerminateTemplateLiteral')
+
+ this.start = this.current
+ this.advance()
+ this.addToken('BACKTICK') // Consume the closing `
+ }
+
+ /*
+ * For numbers, we consume any digits and a single decimal point, if present.
+ * We then add a token with the value of the number.
+ */
+ private tokenizeNumber(): void {
+ while (this.isDigit(this.peek()) || this.peek() == '.') this.advance()
+
+ const number = this.sourceCode.substring(this.start, this.current)
+
+ // Guard against numbers with multiple decimal points (e.g. "1.2.4")
+ if (number.split('.').length > 2) {
+ const parts = number.split('.')
+ const suggestion = parts[0] + '.' + parts.slice(1).join('')
+ this.error('NumberWithMultipleDecimalPoints', {
+ suggestion: suggestion,
+ })
+ }
+
+ this.addToken('NUMBER', Number.parseFloat(number))
+ }
+
+ private tokenizeIdentifier(): void {
+ while (this.isAlphaNumeric(this.peek())) this.advance()
+
+ const keywordType = Scanner.keywords[this.lexeme()]
+ if (keywordType) return this.addToken(keywordType)
+
+ this.addToken('IDENTIFIER')
+ }
+
+ private addSyntheticToken(type: TokenType, lexeme: string): void {
+ this.tokens.push({
+ type,
+ lexeme: lexeme,
+ literal: null,
+ location: this.location(),
+ })
+ }
+
+ private addToken(type: TokenType, literal: any = null): void {
+ this.verifyEnabled(type)
+
+ this.tokens.push({
+ type,
+ lexeme: this.lexeme(),
+ literal,
+ location: this.location(),
+ })
+ }
+
+ private isAlpha(c: string): boolean {
+ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_'
+ }
+
+ private isDigit(c: string): boolean {
+ return c >= '0' && c <= '9'
+ }
+
+ private isAlphaNumeric(c: string): boolean {
+ return this.isAlpha(c) || this.isDigit(c)
+ }
+
+ private isAtEnd(): boolean {
+ return this.current >= this.sourceCode.length
+ }
+
+ // TODO: What is the purpose of these checks?
+ private isAnotherCharacter(): boolean {
+ const next = this.peek()
+ if (next == '\n') return false
+ if (next == '\0') return false
+ return true
+ }
+
+ private shouldAddEOLToken(): boolean {
+ return (
+ this.previouslyAddedToken() != null &&
+ this.previouslyAddedToken() != 'EOL'
+ )
+ }
+
+ private advance(): string {
+ return this.sourceCode[this.current++]
+ }
+
+ private peek(): string {
+ if (this.isAtEnd()) return '\0'
+ return this.sourceCode[this.current]
+ }
+
+ private peekNext(): string {
+ if (this.current + 1 >= this.sourceCode.length) return '\0'
+ return this.sourceCode[this.current + 1]
+ }
+
+ private previouslyAddedToken(): TokenType | null {
+ if (this.tokens.length === 0) return null
+ return this.tokens[this.tokens.length - 1].type
+ }
+
+ private match(expected: string): boolean {
+ if (this.isAtEnd()) return false
+ if (this.sourceCode[this.current] != expected) return false
+
+ this.current++
+ return true
+ }
+
+ private lexeme(): string {
+ return this.sourceCode.substring(this.start, this.current)
+ }
+
+ private location(): Location {
+ return Location.fromLineOffset(
+ this.start + 1,
+ this.current + 1,
+ this.line,
+ this.lineOffset
+ )
+ }
+
+ private reset() {
+ this.tokens = []
+ this.start = 0
+ this.current = 0
+ this.line = 1
+ this.lineOffset = 0
+ }
+
+ private verifyEnabled(tokenType: TokenType): void {
+ if (!this.languageFeatures) return
+
+ if (
+ this.languageFeatures.ExcludeList &&
+ this.languageFeatures.ExcludeList.includes(tokenType)
+ )
+ this.disabledLanguageFeatureError('ExcludeListViolation', {
+ ExcludeList: this.languageFeatures.ExcludeList,
+ tokenType,
+ })
+
+ if (
+ this.languageFeatures.IncludeList &&
+ !this.languageFeatures.IncludeList.includes(tokenType)
+ )
+ this.disabledLanguageFeatureError('IncludeListViolation', {
+ IncludeList: this.languageFeatures.IncludeList,
+ tokenType,
+ })
+ }
+
+ private error(type: SyntaxErrorType, context: any = {}): never {
+ throw new SyntaxError(
+ translate(`error.syntax.${type}`, context),
+ this.location(),
+ type,
+ context
+ )
+ }
+
+ private disabledLanguageFeatureError(
+ type: DisabledLanguageFeatureErrorType,
+ context: any
+ ): never {
+ throw new DisabledLanguageFeatureError(
+ translate(`error.disabledLanguageFeature.${type}`, context),
+ this.location(),
+ type,
+ context
+ )
+ }
+}
+
+export function scan(
+ sourceCode: string,
+ ...args: [LanguageFeatures?]
+): Token[] {
+ return new Scanner(...args).scanTokens(sourceCode)
+}
diff --git a/app/javascript/interpreter/languages/javascript/token.ts b/app/javascript/interpreter/languages/javascript/token.ts
new file mode 100644
index 0000000000..15e25a0f11
--- /dev/null
+++ b/app/javascript/interpreter/languages/javascript/token.ts
@@ -0,0 +1,77 @@
+import { Location } from '../../location'
+
+export type TokenType =
+ // Single-character tokens
+ | 'BACKTICK'
+ | 'COLON'
+ | 'COMMA'
+ | 'LEFT_BRACE'
+ | 'LEFT_BRACKET'
+ | 'LEFT_PAREN'
+ | 'MINUS'
+ | 'PLUS'
+ | 'QUESTION_MARK'
+ | 'RIGHT_BRACE'
+ | 'RIGHT_BRACKET'
+ | 'RIGHT_PAREN'
+ | 'SLASH'
+ | 'STAR'
+
+ // One, two or three character tokens.
+ | 'AMPERSAND_AMPERSAND'
+ | 'NOT'
+ | 'DOLLAR_LEFT_BRACE'
+ | 'EQUAL'
+ | 'GREATER_EQUAL'
+ | 'GREATER'
+ | 'LESS_EQUAL'
+ | 'LESS'
+ | 'MINUS_EQUAL'
+ | 'MINUS_MINUS'
+ | 'PIPE_PIPE'
+ | 'PLUS_PLUS'
+ | 'PLUS_EQUAL'
+ | 'SLASH_EQUAL'
+ | 'STAR_EQUAL'
+
+ // Literals
+ | 'IDENTIFIER'
+ | 'NUMBER'
+ | 'STRING'
+ | 'TEMPLATE_LITERAL_TEXT'
+
+ // Keywords
+ | 'AND'
+ | 'CONST'
+ | 'DO'
+ | 'ELSE'
+ | 'FALSE'
+ | 'FOR'
+ | 'FUNCTION'
+ | 'IF'
+ | 'IN'
+ | 'LET'
+ | 'NULL'
+ | 'OF'
+ | 'OR'
+ | 'RETURN'
+ | 'REPEAT_UNTIL_GAME_OVER'
+ | 'TRUE'
+ | 'WHILE'
+
+ // Grouping tokens
+ | 'EQUALITY'
+ | 'STRICT_EQUALITY'
+ | 'INEQUALITY'
+ | 'STRICT_INEQUALITY'
+
+ // Invisible tokens
+ | 'EOL' // End of statement
+ | 'EOF' // End of file
+
+export type Token = {
+ type: TokenType
+ lexeme: string
+ literal: any
+ location: Location
+}
diff --git a/app/javascript/interpreter/languages/jikiscript/error.ts b/app/javascript/interpreter/languages/jikiscript/error.ts
new file mode 100644
index 0000000000..6b4fa4b32f
--- /dev/null
+++ b/app/javascript/interpreter/languages/jikiscript/error.ts
@@ -0,0 +1,66 @@
+export type SyntaxErrorType =
+ | 'UnknownCharacter'
+ | 'UnknownCharacterEquals'
+ | 'MissingCommaAfterParameters'
+ | 'MissingDoToStartBlock'
+ | 'MissingEndAfterBlock'
+ | 'MissingConditionAfterIf'
+ | 'MissingDoubleQuoteToStartString'
+ | 'MissingDoubleQuoteToTerminateString'
+ | 'MissingFieldNameOrIndexAfterLeftBracket'
+ | 'MissingRightParenthesisAfterExpression'
+ | 'MissingRightBraceToTerminatePlaceholder'
+ | 'MissingBacktickToTerminateTemplateLiteral'
+ | 'MissingExpression'
+ | 'InvalidAssignmentTarget'
+ | 'ExceededMaximumNumberOfParameters'
+ | 'MissingEndOfLine'
+ | 'MissingFunctionName'
+ | 'MissingLeftParenthesisAfterFunctionName'
+ | 'MissingLeftParenthesisAfterFunctionCall'
+ | 'MissingParameterName'
+ | 'MissingRightParenthesisAfterParameters'
+ | 'MissingLeftParenthesisAfterWhile'
+ | 'MissingRightParenthesisAfterWhileCondition'
+ | 'MissingWhileBeforeDoWhileCondition'
+ | 'MissingLeftParenthesisAfterDoWhile'
+ | 'MissingRightParenthesisAfterDoWhileCondition'
+ | 'MissingVariableName'
+ | 'InvalidNumericVariableName'
+ | 'MissingConstantName'
+ | 'MissingToAfterVariableNameToInitializeValue'
+ | 'MissingToAfterVariableNameToChangeValue'
+ | 'MissingLeftParenthesisBeforeIfCondition'
+ | 'MissingRightParenthesisAfterIfCondition'
+ | 'MissingDoToStartFunctionBody'
+ | 'MissingDoToStartFunctionBody'
+ | 'MissingDoToStartIfBody'
+ | 'MissingDoToStartElseBody'
+ | 'MissingDoAfterRepeatStatementCondition'
+ | 'MissingDoAfterWhileStatementCondition'
+ | 'MissingLeftParenthesisAfterForeach'
+ | 'MissingLetInForeachCondition'
+ | 'MissingElementNameAfterForeach'
+ | 'MissingOfAfterElementNameInForeach'
+ | 'MissingRightParenthesisAfterForeachElement'
+ | 'MissingRightBracketAfterFieldNameOrIndex'
+ | 'MissingRightParenthesisAfterFunctionCall'
+ | 'MissingRightParenthesisAfterExpression'
+ | 'MissingRightParenthesisAfterExpressionWithPotentialTypo'
+ | 'MissingRightBracketAfterListElements'
+ | 'MissingRightBraceAfterMapElements'
+ | 'MissingWithBeforeParameters'
+ | 'MissingStringAsKey'
+ | 'MissingColonAfterKey'
+ | 'MissingFieldNameOrIndexAfterOpeningBracket'
+ | 'InvalidTemplateLiteral'
+ | 'MissingColonAfterThenBranchOfTernaryOperator'
+ | 'NumberEndsWithDecimalPoint'
+ | 'NumberWithMultipleDecimalPoints'
+ | 'NumberContainsAlpha'
+ | 'NumberStartsWithZero'
+ | 'UnexpectedElseWithoutIf'
+ | 'UnexpectedLiteralExpressionAfterIf'
+ | 'UnexpectedVariableExpressionAfterIf'
+ | 'UnexpectedVariableExpressionAfterIfWithPotentialTypo'
+ | 'DuplicateParameterName'
diff --git a/app/javascript/interpreter/languages/jikiscript/helpers/complexErrors.ts b/app/javascript/interpreter/languages/jikiscript/helpers/complexErrors.ts
new file mode 100644
index 0000000000..f0903d0ac4
--- /dev/null
+++ b/app/javascript/interpreter/languages/jikiscript/helpers/complexErrors.ts
@@ -0,0 +1,39 @@
+import type { FunctionParameter } from '@/interpreter/statement'
+import type { Token } from '../token'
+import type { ErrorType } from '@/interpreter/error'
+
+export function errorForMissingDoAfterParameters(
+ token: Token,
+ parameters: FunctionParameter[]
+): { errorType: ErrorType; context: {} } {
+ if (token.type == 'EOL') {
+ return {
+ errorType: 'MissingDoToStartBlock',
+ context: {
+ type: 'function',
+ },
+ }
+ }
+
+ if (token.type == 'IDENTIFIER') {
+ if (parameters.length == 0) {
+ return {
+ errorType: 'MissingWithBeforeParameters',
+ context: {},
+ }
+ } else {
+ return {
+ errorType: 'MissingCommaBetweenParameters',
+ context: {
+ parameter: parameters[parameters.length - 1].name.lexeme,
+ },
+ }
+ }
+ }
+
+ return {
+ errorType: 'UnexpectedTokenAfterParameters',
+ context: {},
+ }
+}
+// this.error("MissingCommaAfterParameter", , { parameter: parameters[-1].name })
diff --git a/app/javascript/interpreter/languages/jikiscript/helpers/isTypo.ts b/app/javascript/interpreter/languages/jikiscript/helpers/isTypo.ts
new file mode 100644
index 0000000000..034dfb30df
--- /dev/null
+++ b/app/javascript/interpreter/languages/jikiscript/helpers/isTypo.ts
@@ -0,0 +1,30 @@
+import { stringSimilarity } from 'string-similarity-js'
+import type { Token } from '../token'
+import type { Location } from '../../../location'
+
+export type TypoInfo = {
+ actual: string
+ potential: string
+ location: Location
+}
+
+export function isTypo(token: Token): TypoInfo | undefined {
+ let intendedType: string | undefined
+
+ if (isTypoOfEquals(token.lexeme)) {
+ intendedType = 'equals'
+ }
+
+ if (intendedType === undefined) {
+ return undefined
+ }
+ return {
+ potential: intendedType,
+ actual: token.lexeme,
+ location: token.location,
+ }
+}
+
+export function isTypoOfEquals(word: string): boolean {
+ return stringSimilarity(word, 'equals') > 0.8
+}
diff --git a/app/javascript/interpreter/languages/jikiscript/parser.ts b/app/javascript/interpreter/languages/jikiscript/parser.ts
new file mode 100644
index 0000000000..7692c57bd9
--- /dev/null
+++ b/app/javascript/interpreter/languages/jikiscript/parser.ts
@@ -0,0 +1,927 @@
+import { SyntaxError } from '../../error'
+import { type SyntaxErrorType } from './error'
+import {
+ ArrayExpression,
+ AssignExpression,
+ BinaryExpression,
+ CallExpression,
+ Expression,
+ GroupingExpression,
+ LiteralExpression,
+ LogicalExpression,
+ DictionaryExpression,
+ UnaryExpression,
+ VariableExpression,
+ GetExpression,
+ SetExpression,
+ TemplateLiteralExpression,
+ TemplatePlaceholderExpression,
+ TemplateTextExpression,
+} from '../../expression'
+import type { LanguageFeatures } from '../../interpreter'
+import { Location } from '../../location'
+import { Scanner } from './scanner'
+import {
+ BlockStatement,
+ ExpressionStatement,
+ ForeachStatement,
+ FunctionParameter,
+ FunctionStatement,
+ IfStatement,
+ RepeatStatement,
+ RepeatUntilGameOverStatement,
+ ReturnStatement,
+ Statement,
+ VariableStatement,
+ WhileStatement,
+} from '../../statement'
+import type { Token, TokenType } from './token'
+import { translate } from '../../translator'
+import { type Parser as GenericParser } from '../../interpreter'
+import didYouMean from 'didyoumean'
+import { isTypo } from './helpers/isTypo'
+import { errorForMissingDoAfterParameters } from './helpers/complexErrors'
+
+export class Parser implements GenericParser {
+ private readonly scanner: Scanner
+ private current: number = 0
+ private tokens: Token[] = []
+
+ constructor(
+ private functionNames: string[] = [],
+ languageFeatures: LanguageFeatures,
+ private shouldWrapTopLevelStatements: boolean
+ ) {
+ this.scanner = new Scanner(languageFeatures)
+ }
+
+ public parse(sourceCode: string): Statement[] {
+ this.tokens = this.scanner.scanTokens(sourceCode)
+
+ const statements = []
+
+ while (!this.isAtEnd()) {
+ const statement = this.declarationStatement()
+ if (statement) {
+ statements.push(statement)
+ }
+ }
+
+ if (this.shouldWrapTopLevelStatements)
+ return this.wrapTopLevelStatements(statements)
+
+ return statements
+ }
+
+ wrapTopLevelStatements(statements: Statement[]): Statement[] {
+ const functionStmt = new FunctionStatement(
+ {
+ type: 'IDENTIFIER',
+ lexeme: 'main',
+ literal: null,
+ location: Location.unknown,
+ },
+ [],
+ [],
+ Location.unknown
+ )
+
+ for (let i = statements.length - 1; i >= 0; i--) {
+ // Don't wrap top-level function statements
+ if (statements[i] instanceof FunctionStatement) continue
+
+ functionStmt.body.unshift(statements[i])
+ statements.splice(i, 1)
+ }
+
+ statements.push(functionStmt)
+ return statements
+ }
+
+ private declarationStatement(): Statement {
+ if (this.match('FUNCTION')) return this.functionStatement()
+
+ return this.statement()
+ }
+
+ private functionStatement(): Statement {
+ const name = this.consume('IDENTIFIER', 'MissingFunctionName')
+ const parameters: FunctionParameter[] = []
+ if (this.match('WITH')) {
+ do {
+ if (parameters.length > 255) {
+ this.error(
+ 'ExceededMaximumNumberOfParameters',
+ this.peek().location,
+ {
+ maximum: 255,
+ actual: parameters.length,
+ name,
+ }
+ )
+ }
+
+ const parameterName = this.consume(
+ 'IDENTIFIER',
+ 'MissingParameterName',
+ {
+ name: name,
+ }
+ )
+
+ if (parameters.find((p) => p.name.lexeme == parameterName.lexeme)) {
+ this.error('DuplicateParameterName', this.previous().location, {
+ parameter: parameterName.lexeme,
+ })
+ }
+
+ parameters.push(new FunctionParameter(parameterName, null))
+ } while (this.match('COMMA'))
+ }
+ if (this.peek().type != 'DO') {
+ const { errorType, context } = errorForMissingDoAfterParameters(
+ this.peek(),
+ parameters
+ )
+ this.error(errorType, this.peek().location, context)
+ }
+ this.consume('DO', 'MissingDoToStartBlock', { type: 'function', name })
+ this.consumeEndOfLine()
+
+ const body = this.block('function')
+ this.functionNames.push(name.lexeme)
+ return new FunctionStatement(
+ name,
+ parameters,
+ body,
+ Location.between(name, this.previous())
+ )
+ }
+
+ private statement(): Statement {
+ if (this.match('SET')) return this.setStatement()
+ if (this.match('CHANGE')) return this.changeStatement()
+ if (this.match('IF')) return this.ifStatement()
+ if (this.match('RETURN')) return this.returnStatement()
+ if (this.match('REPEAT')) return this.repeatStatement()
+ if (this.match('REPEAT_UNTIL_GAME_OVER'))
+ return this.repeatUntilGameOverStatement()
+ if (this.match('WHILE')) return this.whileStatement()
+ if (this.match('FOREACH')) return this.foreachStatement()
+ if (this.match('DO')) return this.blockStatement('do')
+
+ // Error cases
+ if (this.match('ELSE')) {
+ this.error('UnexpectedElseWithoutIf', this.previous().location)
+ }
+
+ return this.expressionStatement()
+ }
+
+ private setStatement(): Statement {
+ const setToken = this.previous()
+ if (this.peek(2).type == 'LEFT_BRACKET') {
+ const assignment = this.assignment()
+ this.consumeEndOfLine()
+
+ return new ExpressionStatement(
+ assignment,
+ Location.between(setToken, assignment)
+ )
+ } else {
+ let name
+ try {
+ name = this.consume('IDENTIFIER', 'MissingVariableName')
+ } catch (e) {
+ const nameLexeme = this.peek().lexeme
+ if (nameLexeme.match(/[0-9]/)) {
+ this.error('InvalidNumericVariableName', this.peek().location, {
+ name: nameLexeme,
+ })
+ } else {
+ throw e
+ }
+ }
+
+ this.consume('TO', 'MissingToAfterVariableNameToInitializeValue', {
+ name,
+ })
+
+ const initializer = this.expression()
+ this.consumeEndOfLine()
+
+ return new VariableStatement(
+ name,
+ initializer,
+ Location.between(setToken, initializer)
+ )
+ }
+ }
+ private changeStatement(): Statement {
+ const setToken = this.previous()
+ // if (this.peek(2).type == 'LEFT_BRACKET') {
+ // const assignment = this.assignment()
+ // this.consumeEndOfLine()
+
+ // return new ExpressionStatement(
+ // assignment,
+ // Location.between(setToken, assignment)
+ // )
+ // } else {
+ const name = this.consume('IDENTIFIER', 'MissingVariableName')
+
+ const token = this.consume(
+ 'TO',
+ 'MissingToAfterVariableNameToInitializeValue',
+ {
+ name,
+ }
+ )
+
+ const initializer = this.expression()
+ this.consumeEndOfLine()
+
+ // return new VariableStatement(
+ // name,
+ // initializer,
+ // Location.between(setToken, initializer)
+ // )
+ return new ExpressionStatement(
+ new AssignExpression(
+ name,
+ token,
+ initializer,
+ true,
+ Location.between(setToken, initializer)
+ ),
+ Location.between(setToken, initializer)
+ )
+ // }
+ }
+
+ private ifStatement(): Statement {
+ const ifToken = this.previous()
+ let condition
+ try {
+ condition = this.expression()
+ if (condition instanceof LiteralExpression) {
+ this.error('UnexpectedLiteralExpressionAfterIf', ifToken.location)
+ }
+ if (condition instanceof VariableExpression) {
+ const typoData = isTypo(this.peek())
+ if (typoData) {
+ this.error(
+ 'UnexpectedVariableExpressionAfterIfWithPotentialTypo',
+ ifToken.location,
+ { actual: typoData.actual, potential: typoData.potential }
+ )
+ }
+
+ this.error('UnexpectedVariableExpressionAfterIf', ifToken.location)
+ }
+ // console.log("condition", condition);
+ } catch (e) {
+ if (e instanceof SyntaxError && e.type == 'MissingExpression') {
+ this.error('MissingConditionAfterIf', ifToken.location)
+ } else {
+ throw e
+ }
+ }
+
+ this.consume('DO', 'MissingDoToStartBlock', { type: 'if' })
+ const thenBranch = this.blockStatement('if', { allowElse: true })
+ let elseBranch: Statement | null = null
+
+ if (this.match('ELSE')) {
+ if (this.match('IF')) {
+ elseBranch = this.ifStatement()
+ } else {
+ this.consume('DO', 'MissingDoToStartBlock', { type: 'else' })
+ elseBranch = this.blockStatement('else')
+ }
+ } else {
+ // this.consume("END", "MissingEndAfterIfBody");
+ // this.consumeEndOfLine();
+ }
+
+ return new IfStatement(
+ condition,
+ thenBranch,
+ elseBranch,
+ Location.between(ifToken, this.previous())
+ )
+ }
+
+ private returnStatement(): Statement {
+ const keyword = this.previous()
+ const value: Expression | null = this.isAtEndOfStatement()
+ ? null
+ : this.expression()
+
+ this.consumeEndOfLine()
+
+ return new ReturnStatement(
+ keyword,
+ value,
+ Location.between(keyword, value || keyword)
+ )
+ }
+
+ private repeatStatement(): Statement {
+ const begin = this.previous()
+ const condition = this.expression()
+
+ this.consume('DO', 'MissingDoToStartBlock', { type: 'repeat' })
+ this.consumeEndOfLine()
+
+ const statements = this.block('repeat')
+
+ return new RepeatStatement(
+ condition,
+ statements,
+ Location.between(begin, this.previous())
+ )
+ }
+
+ private repeatUntilGameOverStatement(): Statement {
+ const begin = this.previous()
+
+ this.consume('DO', 'MissingDoToStartBlock', {
+ type: 'repeat_until_game_over',
+ })
+ this.consumeEndOfLine()
+
+ const statements = this.block('repeat_until_game_over')
+
+ return new RepeatUntilGameOverStatement(
+ statements,
+ Location.between(begin, this.previous())
+ )
+ }
+
+ private whileStatement(): Statement {
+ const begin = this.previous()
+ const condition = this.expression()
+
+ this.consume('DO', 'MissingDoToStartBlock', { type: 'while' })
+ this.consumeEndOfLine()
+
+ const statements = this.block('while')
+
+ return new WhileStatement(
+ condition,
+ statements,
+ Location.between(begin, this.previous())
+ )
+ }
+
+ private foreachStatement(): Statement {
+ const foreachToken = this.previous()
+ const elementName = this.consume(
+ 'IDENTIFIER',
+ 'MissingElementNameAfterForeach'
+ )
+ this.consume('IN', 'MissingOfAfterElementNameInForeach', {
+ elementName,
+ })
+ const iterable = this.expression()
+
+ this.consume('DO', 'MissingDoToStartBlock', { type: 'foreach' })
+ this.consumeEndOfLine()
+
+ const statements = this.block('foreach')
+
+ return new ForeachStatement(
+ elementName,
+ iterable,
+ statements,
+ Location.between(foreachToken, this.previous())
+ )
+ }
+
+ private blockStatement(
+ type: string,
+ { allowElse } = { allowElse: false }
+ ): BlockStatement {
+ const doToken = this.previous()
+ this.consumeEndOfLine()
+ const statements = this.block(type, { allowElse: allowElse })
+
+ return new BlockStatement(
+ statements,
+ Location.between(doToken, this.previous())
+ )
+ }
+
+ private block(
+ type: string,
+ { allowElse } = { allowElse: false }
+ ): Statement[] {
+ const statements: Statement[] = []
+
+ while (
+ !this.check('END') &&
+ (!allowElse || !this.check('ELSE')) &&
+ !this.isAtEnd()
+ ) {
+ statements.push(this.statement())
+ }
+
+ if (!allowElse || this.peek().type != 'ELSE') {
+ this.consume('END', 'MissingEndAfterBlock', { type })
+ this.consumeEndOfLine()
+ }
+ return statements
+ }
+
+ private expressionStatement(): Statement {
+ const expression = this.expression()
+ this.consumeEndOfLine()
+
+ return new ExpressionStatement(expression, expression.location)
+ }
+
+ private expression(): Expression {
+ return this.assignment()
+ }
+
+ private assignment(): Expression {
+ const expr = this.or()
+
+ if (this.match('TO')) {
+ const operator = this.previous()
+ const value = this.assignment()
+
+ if (expr instanceof VariableExpression) {
+ return new AssignExpression(
+ expr.name,
+ operator,
+ value,
+ true,
+ Location.between(expr, value)
+ )
+ }
+
+ if (expr instanceof GetExpression) {
+ return new SetExpression(
+ expr.obj,
+ expr.field,
+ value,
+ Location.between(expr, value)
+ )
+ }
+
+ this.error('InvalidAssignmentTarget', expr.location, {
+ assignmentTarget: expr,
+ })
+ }
+
+ return expr
+ }
+
+ private or(): Expression {
+ const expr = this.and()
+
+ while (this.match('OR')) {
+ let operator = this.previous()
+ operator.type = 'OR'
+ const right = this.and()
+ return new LogicalExpression(
+ expr,
+ operator,
+ right,
+ Location.between(expr, right)
+ )
+ }
+
+ return expr
+ }
+
+ private and(): Expression {
+ const expr = this.equality()
+
+ while (this.match('AND')) {
+ let operator = this.previous()
+ operator.type = 'AND'
+ const right = this.equality()
+ return new LogicalExpression(
+ expr,
+ operator,
+ right,
+ Location.between(expr, right)
+ )
+ }
+
+ return expr
+ }
+
+ private equality(): Expression {
+ let expr = this.comparison()
+
+ while (this.match('STRICT_EQUALITY')) {
+ let operator = this.previous()
+ const right = this.comparison()
+ expr = new BinaryExpression(
+ expr,
+ operator,
+ right,
+ Location.between(expr, right)
+ )
+ }
+
+ return expr
+ }
+
+ private comparison(): Expression {
+ let expr = this.term()
+
+ while (this.match('GREATER', 'GREATER_EQUAL', 'LESS', 'LESS_EQUAL')) {
+ const operator = this.previous()
+ const right = this.term()
+ expr = new BinaryExpression(
+ expr,
+ operator,
+ right,
+ Location.between(expr, right)
+ )
+ }
+
+ return expr
+ }
+
+ private term(): Expression {
+ let expr = this.factor()
+
+ while (this.match('MINUS', 'PLUS')) {
+ const operator = this.previous()
+ const right = this.factor()
+ expr = new BinaryExpression(
+ expr,
+ operator,
+ right,
+ Location.between(expr, right)
+ )
+ }
+
+ return expr
+ }
+
+ private factor(): Expression {
+ let expr = this.unary()
+
+ while (this.match('SLASH', 'STAR', 'PERCENT')) {
+ const operator = this.previous()
+ const right = this.unary()
+ expr = new BinaryExpression(
+ expr,
+ operator,
+ right,
+ Location.between(expr, right)
+ )
+ }
+
+ return expr
+ }
+
+ private unary(): Expression {
+ if (this.match('NOT', 'MINUS')) {
+ const operator = this.previous()
+ const right = this.unary()
+ return new UnaryExpression(
+ operator,
+ right,
+ Location.between(operator, right)
+ )
+ }
+
+ return this.call()
+ }
+
+ private call(): Expression {
+ let expression = this.primary()
+
+ while (true) {
+ if (this.match('LEFT_PAREN')) {
+ expression = this.finishCall(expression)
+ } else if (this.match('LEFT_BRACKET')) {
+ const leftBracket = this.previous()
+ if (!this.match('STRING', 'NUMBER'))
+ this.error(
+ 'MissingFieldNameOrIndexAfterLeftBracket',
+ leftBracket.location,
+ {
+ expression,
+ }
+ )
+
+ const name = this.previous()
+ const rightBracket = this.consume(
+ 'RIGHT_BRACKET',
+ 'MissingRightBracketAfterFieldNameOrIndex',
+ { expression, name }
+ )
+ expression = new GetExpression(
+ expression,
+ name,
+ Location.between(expression, rightBracket)
+ )
+ } else {
+ if (
+ expression instanceof VariableExpression &&
+ this.functionNames.includes(expression.name.lexeme) &&
+ this.match('RIGHT_PAREN')
+ )
+ this.error(
+ 'MissingLeftParenthesisAfterFunctionCall',
+ this.previous().location,
+ { expression, function: expression.name.lexeme }
+ )
+ break
+ }
+ }
+
+ return expression
+ }
+
+ private finishCall(callee: Expression): Expression {
+ const args: Expression[] = []
+
+ if (this.match('EOL')) {
+ this.error('MissingRightParenthesisAfterFunctionCall', callee.location, {
+ function:
+ callee instanceof VariableExpression ? callee.name.lexeme : null,
+ })
+ }
+ if (!this.check('RIGHT_PAREN')) {
+ do {
+ args.push(this.expression())
+ } while (this.match('COMMA'))
+ }
+
+ const paren = this.consume(
+ 'RIGHT_PAREN',
+ 'MissingRightParenthesisAfterFunctionCall',
+ {
+ args,
+ function:
+ callee instanceof VariableExpression ? callee.name.lexeme : null,
+ }
+ )
+ return new CallExpression(
+ callee,
+ paren,
+ args,
+ Location.between(callee, paren)
+ )
+ }
+
+ private primary(): Expression {
+ if (this.match('LEFT_BRACKET')) return this.array()
+
+ if (this.match('LEFT_BRACE')) return this.dictionary()
+
+ if (this.match('FALSE'))
+ return new LiteralExpression(false, this.previous().location)
+
+ if (this.match('TRUE'))
+ return new LiteralExpression(true, this.previous().location)
+
+ if (this.match('NULL'))
+ return new LiteralExpression(null, this.previous().location)
+
+ if (this.match('NUMBER', 'STRING'))
+ return new LiteralExpression(
+ this.previous().literal,
+ this.previous().location
+ )
+
+ if (this.match('IDENTIFIER'))
+ return new VariableExpression(this.previous(), this.previous().location)
+
+ if (this.match('BACKTICK')) return this.templateLiteral()
+
+ if (this.match('LEFT_PAREN')) {
+ const lparen = this.previous()
+ const expression = this.expression()
+
+ // TODO: If there's not a right paren here,
+
+ let rparen
+ try {
+ rparen = this.consume(
+ 'RIGHT_PAREN',
+ 'MissingRightParenthesisAfterExpression',
+ {
+ expression,
+ }
+ )
+ } catch (e) {
+ // TODO: If there's not a right paren here, we could consider what's
+ // happened instead. Maybe the person made a typo on the next character
+ // For example, did they put "equal" instead of "equals"?
+ const typoData = isTypo(this.peek())
+ if (typoData) {
+ this.error(
+ 'MissingRightParenthesisAfterExpressionWithPotentialTypo',
+ typoData.location,
+ { actual: typoData.actual, potential: typoData.potential }
+ )
+ }
+
+ throw e
+ }
+
+ return new GroupingExpression(
+ expression,
+ Location.between(lparen, rparen)
+ )
+ }
+
+ this.error('MissingExpression', this.peek().location)
+ }
+
+ private templateLiteral(): Expression {
+ const openBacktick = this.previous()
+ const parts: Expression[] = []
+
+ while (this.peek().type != 'BACKTICK') {
+ if (this.match('DOLLAR_LEFT_BRACE')) {
+ const dollarLeftBrace = this.previous()
+ const expr = this.expression()
+ const rightBrace = this.consume(
+ 'RIGHT_BRACE',
+ 'MissingRightBraceToTerminatePlaceholder',
+ { expr }
+ )
+ parts.push(
+ new TemplatePlaceholderExpression(
+ expr,
+ Location.between(dollarLeftBrace, rightBrace)
+ )
+ )
+ } else {
+ const textToken = this.consume(
+ 'TEMPLATE_LITERAL_TEXT',
+ 'InvalidTemplateLiteral'
+ )
+ parts.push(new TemplateTextExpression(textToken, textToken.location))
+ }
+ }
+
+ const closeBacktick = this.consume(
+ 'BACKTICK',
+ 'MissingBacktickToTerminateTemplateLiteral',
+ { elements: parts }
+ )
+ return new TemplateLiteralExpression(
+ parts,
+ Location.between(openBacktick, closeBacktick)
+ )
+ }
+
+ private array(): Expression {
+ const leftBracket = this.previous()
+ const elements: Expression[] = []
+
+ if (!this.check('RIGHT_BRACKET')) {
+ do {
+ elements.push(this.or())
+ } while (this.match('COMMA'))
+ }
+
+ const rightBracket = this.consume(
+ 'RIGHT_BRACKET',
+ 'MissingRightBracketAfterListElements',
+ { elements }
+ )
+ return new ArrayExpression(
+ elements,
+ Location.between(leftBracket, rightBracket)
+ )
+ }
+
+ private dictionary(): Expression {
+ const leftBrace = this.previous()
+ const elements = new Map()
+
+ if (!this.check('RIGHT_BRACE')) {
+ do {
+ const key = this.consume('STRING', 'MissingStringAsKey')
+ this.consume('COLON', 'MissingColonAfterKey')
+ elements.set(key.literal, this.primary())
+ } while (this.match('COMMA'))
+ }
+
+ const rightBracket = this.consume(
+ 'RIGHT_BRACE',
+ 'MissingRightBraceAfterMapElements',
+ { elements }
+ )
+ return new DictionaryExpression(
+ elements,
+ Location.between(leftBrace, rightBracket)
+ )
+ }
+
+ private match(...tokenTypes: TokenType[]): boolean {
+ for (const tokenType of tokenTypes) {
+ if (this.check(tokenType)) {
+ this.advance()
+ return true
+ }
+ }
+ return false
+ }
+
+ private check(tokenType: TokenType): boolean {
+ if (this.isAtEnd()) return false
+ return this.peek().type == tokenType
+ }
+
+ private advance(): Token {
+ if (!this.isAtEnd()) this.current++
+ return this.previous()
+ }
+
+ private consume(
+ tokenType: TokenType,
+ type: SyntaxErrorType,
+ context?: any
+ ): Token {
+ if (this.check(tokenType)) return this.advance()
+
+ this.error(type, this.peek().location, context)
+ }
+
+ private consumeEndOfLine(): void {
+ if (this.match('EOL')) {
+ return
+ }
+
+ // We're now at an error point where the next character
+ // should be an EOL but isn't. We provide contextual guidance
+
+ const type = this.peek().type
+ const previous = this.previous().lexeme
+ const current = this.peek().lexeme
+ let suggestion
+
+ if (type == 'FUNCTION') {
+ suggestion = 'Did you mean to start a function on a new line?'
+ } else {
+ suggestion = 'Did you make a typo?'
+ }
+ this.error('MissingEndOfLine', this.peek().location, {
+ previous,
+ current,
+ suggestion,
+ })
+ }
+
+ private error(
+ type: SyntaxErrorType,
+ location: Location,
+ context?: any
+ ): never {
+ throw new SyntaxError(
+ translate(`error.syntax.${type}`, context),
+ location,
+ type,
+ context
+ )
+ }
+
+ private isAtEnd(): boolean {
+ return this.peek().type == 'EOF'
+ }
+
+ private isAtEndOfStatement(): boolean {
+ return this.peek().type == 'EOL' || this.isAtEnd()
+ }
+
+ private peek(n = 1): Token {
+ return this.tokens[this.current + (n - 1)]
+ }
+
+ private previous(): Token {
+ return this.tokens[this.current - 1]
+ }
+}
+export function parse(
+ sourceCode: string,
+ {
+ functionNames = [],
+ languageFeatures = {},
+ shouldWrapTopLevelStatements = false,
+ }: {
+ functionNames?: string[]
+ languageFeatures?: LanguageFeatures
+ shouldWrapTopLevelStatements?: boolean
+ } = {}
+): Statement[] {
+ return new Parser(
+ functionNames,
+ languageFeatures,
+ shouldWrapTopLevelStatements
+ ).parse(sourceCode)
+}
diff --git a/app/javascript/interpreter/languages/jikiscript/scanner.ts b/app/javascript/interpreter/languages/jikiscript/scanner.ts
new file mode 100644
index 0000000000..6a92ec4855
--- /dev/null
+++ b/app/javascript/interpreter/languages/jikiscript/scanner.ts
@@ -0,0 +1,508 @@
+/*
+ * The scanner is the first part of the interpreter.
+ * It takes the source code as input and produces a list of tokens, that
+ * represent the different conceptual elements of the source code. For example,
+ * it takes a whole string and reduces it into a STRING token, and it takes an
+ * equals sign and turns it into an EQUAL token.
+ *
+ * These tokens will then be used by the parser to build a tree of expressions,
+ * which will be used by the interpreter to execute the program.
+ *
+ * The main workflow here is looking at the next character in the source code,
+ * and then deciding what to do with it. Sometimes we just immediate "consume" it
+ * (turn it into a token), but other times we need to peak ahead and see what comes
+ * next to know what token to produce or how to handle it.
+ *
+ * This process will also produce errors if the source code is invalid, for example
+ * if we see an unterminated string, or a number with multiple decimal points.
+ */
+import {
+ DisabledLanguageFeatureError,
+ type DisabledLanguageFeatureErrorType,
+ SyntaxError,
+} from '../../error'
+import { type SyntaxErrorType } from './error'
+import type { Token, TokenType } from './token'
+import { Location } from '../../location'
+import type { LanguageFeatures } from '../../interpreter'
+import { translate } from '../../translator'
+
+export class Scanner {
+ private tokens: Token[] = []
+ private start: number = 0
+ private current: number = 0
+ private line: number = 1
+ private lineOffset: number = 0
+ private sourceCode: string = ''
+
+ private static readonly keywords: Record = {
+ and: 'AND',
+ change: 'CHANGE',
+ do: 'DO',
+ else: 'ELSE',
+ end: 'END',
+ false: 'FALSE',
+ for: 'FOR',
+ foreach: 'FOREACH',
+ function: 'FUNCTION',
+ if: 'IF',
+ in: 'IN',
+ is: 'STRICT_EQUALITY',
+ not: 'NOT',
+ null: 'NULL',
+ or: 'OR',
+ repeat: 'REPEAT',
+ repeat_until_game_over: 'REPEAT_UNTIL_GAME_OVER',
+ return: 'RETURN',
+ set: 'SET',
+ to: 'TO',
+ true: 'TRUE',
+ while: 'WHILE',
+ with: 'WITH',
+ }
+
+ private readonly tokenizers: Record = {
+ '(': this.tokenizeLeftParanthesis,
+ ')': this.tokenizeRightParanthesis,
+ '{': this.tokenizeLeftBrace,
+ '}': this.tokenizeRightBrace,
+ '[': this.tokenizeLeftBracket,
+ ']': this.tokenizeRightBracket,
+ ':': this.tokenizeColon,
+ ',': this.tokenizeComma,
+ '+': this.tokenizePlus,
+ '-': this.tokenizeMinus,
+ '*': this.tokenizeStar,
+ '/': this.tokenizeSlash,
+ '%': this.tokenizePercent,
+ '>': this.tokenizeGreater,
+ '<': this.tokenizeLess,
+ ' ': this.tokenizeWhitespace,
+ '\t': this.tokenizeWhitespace,
+ '\r': this.tokenizeWhitespace,
+ '\n': this.tokenizeNewline,
+ '"': this.tokenizeString,
+ '`': this.tokenizeTemplateLiteral,
+ }
+
+ constructor(private languageFeatures: LanguageFeatures = {}) {}
+
+ scanTokens(sourceCode: string): Token[] {
+ this.sourceCode = sourceCode
+ this.reset()
+
+ while (!this.isAtEnd()) {
+ this.start = this.current
+ this.scanToken()
+ }
+
+ // Add synthetic EOL token to simplify parsing
+ if (this.shouldAddEOLToken()) this.addSyntheticToken('EOL', '\n')
+
+ // Add synthetic EOF token to simplify parsing
+ this.addSyntheticToken('EOF', '\0')
+
+ return this.tokens
+ }
+
+ private scanToken(): void {
+ const c = this.advance()
+
+ const tokenizer = this.tokenizers[c]
+ if (tokenizer) {
+ tokenizer.bind(this)()
+ } else {
+ if (this.isDigit(c)) {
+ this.tokenizeNumber()
+ } else if (this.isAlpha(c)) {
+ this.tokenizeIdentifier()
+ } else {
+ if (c == '=') {
+ this.error('UnknownCharacterEquals')
+ }
+
+ this.error('UnknownCharacter', {
+ character: c,
+ })
+ }
+ }
+ }
+
+ /**
+ * These are tokenizers. The purpose of a tokenizer is to consume characters from the source code
+ * and produce a token. The token is then added to the list of tokens.
+ *
+ * For example, if we see a left paranthesis, we add a token of type "LEFT_PAREN" to the list of tokens.
+ *
+ * Some tokens are more complex. For example if we see an equals sign, we need to check if the next character
+ * is also an equals sign. If it is, we add a token of type "EQUAL_EQUAL" to the list of tokens. If it is not,
+ * we add a token of type "EQUAL" to the list of tokens.
+ *
+ * Some are even more complex. For example, if we see a double quote, we need to consume characters until we see
+ * another double quote. We then add a token of type "STRING" to the list of tokens
+ * with all the characters between the double quotes consumed.
+ */
+
+ /* This first set of tokenizers are simple. They consume a single character and add a token to the list of tokens,
+ * or do simple checks for the next characters (e.g. "++")
+ */
+ private tokenizeLeftParanthesis() {
+ this.addToken('LEFT_PAREN')
+ }
+ private tokenizeRightParanthesis() {
+ this.addToken('RIGHT_PAREN')
+ }
+ private tokenizeLeftBrace() {
+ this.addToken('LEFT_BRACE')
+ }
+ private tokenizeRightBrace() {
+ this.addToken('RIGHT_BRACE')
+ }
+ private tokenizeLeftBracket() {
+ this.addToken('LEFT_BRACKET')
+ }
+ private tokenizeRightBracket() {
+ this.addToken('RIGHT_BRACKET')
+ }
+ private tokenizeColon() {
+ this.addToken('COLON')
+ }
+ private tokenizeComma() {
+ this.addToken('COMMA')
+ }
+ private tokenizePlus() {
+ this.addToken('PLUS')
+ }
+ private tokenizeMinus() {
+ this.addToken('MINUS')
+ }
+ private tokenizeStar() {
+ this.addToken('STAR')
+ }
+ private tokenizeSlash() {
+ if (this.peek() == '/') {
+ this.tokenizeComment()
+ } else {
+ this.addToken('SLASH')
+ }
+ }
+ private tokenizePercent() {
+ this.addToken('PERCENT')
+ }
+ private tokenizeGreater() {
+ this.addToken(this.match('=') ? 'GREATER_EQUAL' : 'GREATER')
+ }
+ private tokenizeLess() {
+ this.addToken(this.match('=') ? 'LESS_EQUAL' : 'LESS')
+ }
+
+ /*
+ * We don't tokenize whitespace, but we do need to match on it
+ */
+ private tokenizeWhitespace() {
+ return
+ }
+
+ /*
+ * The new line tokenizer not only adds a token, but also increments the line number
+ * and resets the line offset to the next character.
+ */
+ private tokenizeNewline() {
+ if (this.shouldAddEOLToken()) this.addToken('EOL')
+
+ this.line++
+ this.lineOffset = this.current
+ }
+
+ private tokenizeComment(): void {
+ // Consume until the end of the line
+ while (this.isAnotherCharacter()) {
+ this.advance()
+ }
+ }
+
+ private tokenizeString(): void {
+ // Keep consuming characters until we see another double quote
+ // and then stop before we consume it.
+ while (this.peek() != '"' && this.isAnotherCharacter()) this.advance()
+
+ // If we reach the end of the line, we have an unterminated string
+ if (this.peek() != '"')
+ if (this.previouslyAddedToken() == 'IDENTIFIER')
+ this.error('MissingDoubleQuoteToStartString', {
+ string: this.tokens[this.tokens.length - 1].lexeme,
+ })
+ else
+ this.error('MissingDoubleQuoteToTerminateString', {
+ string: this.sourceCode.substring(this.start + 1, this.current),
+ })
+
+ // Consume the closing quotation mark
+ this.advance()
+
+ // Finally add the token, with its value set to the characters between the quotes
+ this.addToken(
+ 'STRING',
+ this.sourceCode.substring(this.start + 1, this.current - 1)
+ )
+ }
+
+ // TODO: Check whether this errors correctly if split over lines
+ private tokenizeTemplateLiteral(): void {
+ this.addToken('BACKTICK')
+
+ while (this.peek() != '`' && this.isAnotherCharacter()) {
+ this.start = this.current
+
+ if (this.peek() != '$' && this.peekNext() != '{' && !this.isAtEnd()) {
+ while (
+ this.peek() != '$' &&
+ this.peek() != '`' &&
+ this.peekNext() != '{' &&
+ !this.isAtEnd()
+ )
+ this.advance()
+
+ this.addToken(
+ 'TEMPLATE_LITERAL_TEXT',
+ this.sourceCode.substring(this.start, this.current)
+ )
+ } else {
+ this.advance() // Consume the $
+ this.advance() // Consume the {
+ this.addToken('DOLLAR_LEFT_BRACE')
+ this.start = this.current
+
+ while (this.peek() != '}' && !this.isAtEnd()) {
+ this.start = this.current
+ this.scanToken()
+ }
+
+ if (this.isAtEnd())
+ this.error('MissingRightBraceToTerminatePlaceholder')
+
+ this.start = this.current
+ this.advance()
+ this.addToken('RIGHT_BRACE') // Consume the }
+ }
+ }
+
+ if (this.isAtEnd()) this.error('MissingBacktickToTerminateTemplateLiteral')
+
+ this.start = this.current
+ this.advance()
+ this.addToken('BACKTICK') // Consume the closing `
+ }
+
+ /*
+ * For numbers, we consume any digits and a single decimal point, if present.
+ * We then add a token with the value of the number.
+ */
+ private tokenizeNumber(): void {
+ while (this.isDigit(this.peek()) || this.peek() == '.') this.advance()
+ const number = this.sourceCode.substring(this.start, this.current)
+
+ // Guard against numbers starting with 0
+ if (
+ number.startsWith('0') &&
+ number.length > 1 &&
+ !number.startsWith('0.')
+ ) {
+ this.error('NumberStartsWithZero', {
+ suggestion: parseFloat(number),
+ })
+ }
+
+ // Guard against numbers with invalid characters (e.g. "123abc")
+ if (this.peek().match('[a-zA-Z]')) {
+ this.error('NumberContainsAlpha', {
+ suggestion: parseFloat(number),
+ })
+ }
+ // Guard against trailing decimal points (e.g. "1.")
+ if (number.endsWith('.')) {
+ this.error('NumberEndsWithDecimalPoint', {
+ suggestion: parseInt(number),
+ })
+ }
+
+ // Guard against numbers with multiple decimal points (e.g. "1.2.4")
+ if (number.split('.').length > 2) {
+ const parts = number.split('.')
+ const suggestion = parts[0] + '.' + parts.slice(1).join('')
+ this.error('NumberWithMultipleDecimalPoints', {
+ suggestion: suggestion,
+ })
+ }
+
+ this.addToken('NUMBER', Number.parseFloat(number))
+ }
+
+ private tokenForLexeme(lexeme: string): string {
+ if (lexeme == 'is') {
+ return 'STRICT_EQUALITY'
+ }
+ if (lexeme == 'equals') {
+ return 'STRICT_EQUALITY'
+ }
+
+ return Scanner.keywords[this.lexeme()]
+ }
+
+ private tokenizeIdentifier(): void {
+ while (this.isAlphaNumeric(this.peek())) this.advance()
+
+ const keywordType = this.tokenForLexeme(this.lexeme())
+ if (keywordType) return this.addToken(keywordType)
+
+ this.addToken('IDENTIFIER')
+ }
+
+ private addSyntheticToken(type: TokenType, lexeme: string): void {
+ this.tokens.push({
+ type,
+ lexeme: lexeme,
+ literal: null,
+ location: this.location(),
+ })
+ }
+
+ private addToken(type: TokenType, literal: any = null): void {
+ this.verifyEnabled(type)
+
+ this.tokens.push({
+ type,
+ lexeme: this.lexeme(),
+ literal,
+ location: this.location(),
+ })
+ }
+
+ private isAlpha(c: string): boolean {
+ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_'
+ }
+
+ private isDigit(c: string): boolean {
+ return c >= '0' && c <= '9'
+ }
+
+ private isAlphaNumeric(c: string): boolean {
+ return this.isAlpha(c) || this.isDigit(c)
+ }
+
+ private isAtEnd(): boolean {
+ return this.current >= this.sourceCode.length
+ }
+
+ private isAnotherCharacter(): boolean {
+ const next = this.peek()
+ if (next == '\n') return false
+ if (next == '\0') return false
+ return true
+ }
+
+ private shouldAddEOLToken(): boolean {
+ return (
+ this.previouslyAddedToken() != null &&
+ this.previouslyAddedToken() != 'EOL'
+ )
+ }
+
+ private advance(): string {
+ return this.sourceCode[this.current++]
+ }
+
+ private peek(): string {
+ if (this.isAtEnd()) return '\0'
+ return this.sourceCode[this.current]
+ }
+
+ private peekNext(): string {
+ if (this.current + 1 >= this.sourceCode.length) return '\0'
+ return this.sourceCode[this.current + 1]
+ }
+
+ private previouslyAddedToken(): TokenType | null {
+ if (this.tokens.length === 0) return null
+ return this.tokens[this.tokens.length - 1].type
+ }
+
+ private match(expected: string): boolean {
+ if (this.isAtEnd()) return false
+ if (this.sourceCode[this.current] != expected) return false
+
+ this.current++
+ return true
+ }
+
+ private lexeme(): string {
+ return this.sourceCode.substring(this.start, this.current)
+ }
+
+ private location(): Location {
+ return Location.fromLineOffset(
+ this.start + 1,
+ this.current + 1,
+ this.line,
+ this.lineOffset
+ )
+ }
+
+ private reset() {
+ this.tokens = []
+ this.start = 0
+ this.current = 0
+ this.line = 1
+ this.lineOffset = 0
+ }
+
+ private verifyEnabled(tokenType: TokenType): void {
+ if (!this.languageFeatures) return
+
+ if (
+ this.languageFeatures.ExcludeList &&
+ this.languageFeatures.ExcludeList.includes(tokenType)
+ )
+ this.disabledLanguageFeatureError('ExcludeListViolation', {
+ ExcludeList: this.languageFeatures.ExcludeList,
+ tokenType,
+ })
+
+ if (
+ this.languageFeatures.IncludeList &&
+ !this.languageFeatures.IncludeList.includes(tokenType)
+ )
+ this.disabledLanguageFeatureError('IncludeListViolation', {
+ IncludeList: this.languageFeatures.IncludeList,
+ tokenType,
+ })
+ }
+
+ private error(type: SyntaxErrorType, context: any = {}): never {
+ throw new SyntaxError(
+ translate(`error.syntax.${type}`, context),
+ this.location(),
+ type,
+ context
+ )
+ }
+
+ private disabledLanguageFeatureError(
+ type: DisabledLanguageFeatureErrorType,
+ context: any
+ ): never {
+ throw new DisabledLanguageFeatureError(
+ translate(`error.disabledLanguageFeature.${type}`, context),
+ this.location(),
+ type,
+ context
+ )
+ }
+}
+
+export function scan(
+ sourceCode: string,
+ ...args: [LanguageFeatures?]
+): Token[] {
+ return new Scanner(...args).scanTokens(sourceCode)
+}
diff --git a/app/javascript/interpreter/languages/jikiscript/token.ts b/app/javascript/interpreter/languages/jikiscript/token.ts
new file mode 100644
index 0000000000..66d50ae1c0
--- /dev/null
+++ b/app/javascript/interpreter/languages/jikiscript/token.ts
@@ -0,0 +1,72 @@
+import { Location } from '../../location'
+
+export type TokenType =
+ // Single-character tokens
+ | 'BACKTICK'
+ | 'COLON'
+ | 'COMMA'
+ | 'LEFT_BRACE'
+ | 'LEFT_BRACKET'
+ | 'LEFT_PAREN'
+ | 'MINUS'
+ | 'PERCENT'
+ | 'PLUS'
+ | 'QUESTION_MARK'
+ | 'RIGHT_BRACE'
+ | 'RIGHT_BRACKET'
+ | 'RIGHT_PAREN'
+ | 'SLASH'
+ | 'STAR'
+
+ // One, two or three character tokens.
+ | 'NOT'
+ | 'DOLLAR_LEFT_BRACE'
+ | 'GREATER_EQUAL'
+ | 'GREATER'
+ | 'LESS_EQUAL'
+ | 'LESS'
+
+ // Literals
+ | 'IDENTIFIER'
+ | 'NUMBER'
+ | 'STRING'
+ | 'TEMPLATE_LITERAL_TEXT'
+
+ // Keywords
+ | 'AND'
+ | 'CHANGE'
+ | 'DO'
+ | 'ELSE'
+ | 'END'
+ | 'FALSE'
+ | 'FOR'
+ | 'FOREACH'
+ | 'FUNCTION'
+ | 'IF'
+ | 'IN'
+ | 'NULL'
+ | 'IN'
+ | 'OR'
+ | 'REPEAT'
+ | 'REPEAT_UNTIL_GAME_OVER'
+ | 'RETURN'
+ | 'SET'
+ | 'TO'
+ | 'TRUE'
+ | 'WHILE'
+ | 'WITH'
+
+ // Grouping tokens
+ | 'STRICT_EQUALITY'
+ | 'STRICT_INEQUALITY'
+
+ // Invisible tokens
+ | 'EOL' // End of statement
+ | 'EOF' // End of file
+
+export type Token = {
+ type: TokenType
+ lexeme: string
+ literal: any
+ location: Location
+}
diff --git a/app/javascript/interpreter/locales/en/translation.json b/app/javascript/interpreter/locales/en/translation.json
new file mode 100644
index 0000000000..1895432fe2
--- /dev/null
+++ b/app/javascript/interpreter/locales/en/translation.json
@@ -0,0 +1,95 @@
+{
+ "error": {
+ "syntax": {
+ "ExceededMaximumNumberOfParameters": "Sorry you can't have more than 255 parameters.",
+ "InvalidAssignmentTarget": "Invalid assignment target.",
+ "InvalidNumericVariableName": "Invalid variable name \"{{name}}\". Variable names cannot start with a number.",
+ "InvalidTemplateLiteral": "Invalid template literal.",
+ "MissingBacktickToTerminateTemplateLiteral": "Missing backtick ('`') to terminate template literal.",
+ "MissingConditionAfterIf": "Did you forget to add a condition to your if statement?",
+ "MissingCommaBetweenParameters": "Did you forget to add a command after the `{{parameter}}` parameter?",
+ "MissingColonAfterThenBranchOfTernaryOperator": "Expect ':' after then branch of ternary operator.",
+ "MissingConstantName": "Expect constant name.",
+ "MissingDoToStartBlock": "Are you missing a `do` to start the {{type}} body?",
+ "MissingDoubleQuoteToStartString": "Did you forget the start quote for the \"{{string}}\" string?",
+ "MissingDoubleQuoteToTerminateString": "Did you forget the end quote for the \"{{string}}\" string?",
+ "MissingEndAfterBlock": "Are you missing an `end` to finish the {{type}} body?",
+ "MissingEndOfLine": "We didn't expect `{{current}}` to appear on this line after the `{{previous}}`. {{suggestion}}",
+ "MissingExpression": "Expect expression.",
+ "MissingFieldNameOrIndexAfterLeftBracket": "Expect field name or index after '['.",
+ "MissingFunctionName": "Did you forget to give your function a name?",
+ "MissingLeftBraceToStartBody": "Expected '{' to start {{type}} body.",
+ "MissingLeftBraceToStartForeachBody": "Expected '{' to start 'foreach' body",
+ "MissingLeftParenthesisAfterForeach": "Expected '(' after 'foreach'",
+ "MissingLeftParenthesisAfterFunctionCall": "Did you forget the start parenthesis when trying to call the {{function}} function?",
+ "MissingLeftParenthesisAfterFunctionName": "Expect '(' after function name.",
+ "MissingLeftParenthesisBeforeIfCondition": "Expect '(' before if condition.",
+ "MissingLeftParenthesisAfterWhile": "Expected '(' after 'while'",
+ "MissingLetInForeachCondition": "Expected 'let' in foreach condition",
+ "MissingOfAfterElementNameInForeach": "Expected 'of' after element name in 'foreach'.",
+ "MissingParameterName": "Did you forget to add a parameter after `with`?",
+ "MissingRightBraceAfterBlock": "Expect '}' after block.",
+ "MissingRightBraceAfterMapElements": "Expect '}' after map elements.",
+ "MissingRightBraceToTerminatePlaceholder": "Missing right brace ('}') to terminate placeholder.",
+ "MissingRightBracketAfterFieldNameOrIndex": "Expect ']' after field name or index",
+ "MissingRightBracketAfterListElements": "Expect ']' after list elements.",
+ "MissingRightParenthesisAfterFunctionCall": "Did you forget the end parenthesis when trying to call the {{function}} function?",
+ "MissingRightParenthesisAfterDoWhileCondition": "Expected ')' after 'do/while' condition",
+ "MissingRightParenthesisAfterExpression": "Expect ')' after expression.",
+ "MissingRightParenthesisAfterExpressionWithPotentialTypo": "Do you have a typo here? Did you mean `{{potential}}` instead of `{{actual}}`?",
+ "MissingRightParenthesisAfterForeachElement": "Expected ')' after 'foreach' element",
+ "MissingRightParenthesisAfterIfCondition": "Expect ')' after if condition.",
+ "MissingRightParenthesisAfterParameters": "Expect ')' after parameters.",
+ "MissingRightParenthesisAfterWhileCondition": "Expected ')' after 'while' condition",
+ "MissingWithBeforeParameters": "Did you forget the `with` keyword before your parameters?",
+ "MissingStringAsKey": "Expect string as key.",
+ "MissingVariableName": "Expect variable name.",
+ "DuplicateParameterName": "Did you accidently use the name `{{parameter}}` twice in your function parameters.",
+ "MissingWhileBeforeDoWhileCondition": "Expected 'while' to start 'while' condition",
+ "NumberContainsAlpha": "A number cannot contain letters. Did you mean `{{suggestion}}`?",
+ "NumberEndsWithDecimalPoint": "A number cannot end with a decimal point. Did you mean `{{suggestion}}`?",
+ "NumberStartsWithZero": "A number cannot start with a zero. Did you mean `{{suggestion}}`?",
+ "NumberWithMultipleDecimalPoints": "A number can only have one decimal point. Did you mean `{{suggestion}}`?",
+ "UnknownCharacter": "Unknown character: '{{character}}'.",
+ "UnknownCharacterEquals": "We don't use the equals sign ('=') in JikiScript. Use `to` in set statements or `equals` in comparisons",
+ "UnexpectedElseWithoutIf": "We can't work out which if statement this `else` belongs to. Did you forget to add an `if` statement before this `else`?",
+ "UnexpectedLiteralExpressionAfterIf": "Did you forget to compare to things? In JikiScript the comparison (`is`, `equals`, `>`, etc are always required).",
+ "UnexpectedVariableExpressionAfterIf": "Did you forget to compare to things? In JikiScript the comparison (`is`, `equals`, `>`, etc are always required).",
+ "UnexpectedVariableExpressionAfterIfWithPotentialTypo": "We were expecting some sort of comparison here. Did you mean to type `{{potential}}` instead of `{{actual}}`?"
+ },
+ "semantic": {
+ "CannotAssignToConstant": "Cannot re-assign value of constant.",
+ "DuplicateVariableName": "Already a variable with this name in this scope.",
+ "InvalidPostfixOperand": "Invalid left-hand side for update expression.",
+ "TopLevelReturn": "Can't return from top-level code.",
+ "VariableUsedInOwnInitializer": "Can't read local variable in its own initializer"
+ },
+ "runtime": {
+ "CouldNotEvaluateFunction": "Could not evaluate function",
+ "CouldNotFindFunctionWithName": "Could not find function with name.",
+ "CouldNotFindFunctionWithNameSuggestion": "We don't know what `{{name}}` means. Maybe you meant to use the `{{suggestion}}` function instead?",
+ "CouldNotFindValueWithName": "Could not find value with name '{{name}}'.",
+ "InfiniteLoop": "Your code ran for too long and we stopped it to prevent an infinite loop.",
+ "InvalidBinaryExpression": "Invalid binary expression",
+ "InvalidExpression": "Invalid expression",
+ "InvalidIndexGetterTarget": "Can't index object, only dictionaries and arrays can be indexed'.",
+ "InvalidIndexSetterTarget": "Can only set dictionaries and arrays via indexer.",
+ "InvalidNumberOfArguments": "Expected {{maxArity}} arguments but got {{numberOfArgs}}.",
+ "InvalidNumberOfArgumentsWithOptionalArguments": "Expected between {{minArity} and {{maxArity}} arguments but got {{numberOfArgs}}.",
+ "InvalidUnaryOperator": "Invalid unary operator",
+ "LogicError": "{{message}}",
+ "MissingParenthesesForFunctionCall": "Did you forget the parenthesis when trying to call the function?",
+ "NonCallableTarget": "Can only call functions.",
+ "OperandMustBeBoolean": "Operand must be a boolean.",
+ "OperandMustBeNumber": "Operand must be a number.",
+ "OperandsMustBeNumber": "Operands must be numbers.",
+ "OperandsMustBeTwoNumbersOrTwoStrings": "Operands must be two numbers or two strings.",
+ "RepeatCountMustBeGreaterThanZero": "The repeat argument must be greater than zero.",
+ "RepeatCountMustBeNumber": "repeat can only take a number as its argument."
+ },
+ "disabledLanguageFeature": {
+ "ExcludeListViolation": "Usage of '{{tokenType}}' is not allowed`.",
+ "IncludeListViolation": "Usage of '{{tokenType}}' is not allowed`."
+ }
+ }
+}
diff --git a/app/javascript/interpreter/locales/nl/translation.json b/app/javascript/interpreter/locales/nl/translation.json
new file mode 100644
index 0000000000..3cb7e1ac26
--- /dev/null
+++ b/app/javascript/interpreter/locales/nl/translation.json
@@ -0,0 +1,84 @@
+{
+ "error": {
+ "syntax": {
+ "UnknownCharacter": "Onbekend karakter: '{{character}}'.",
+ "MissingDoubleQuoteToStartString": "Ben je het beginnende dubbele aanhalingsteken vergeten voor de string \"{{string}}\"?",
+ "MissingDoubleQuoteToTerminateString": "Ben je het afsluitende dubbele aanhalingsteken vergeten voor de string \"{{string}}\"?",
+ "MissingRightBraceToTerminatePlaceholder": "Ontbrekend sluitende accolade ('}') om de placeholder af te sluiten.",
+ "MissingBacktickToTerminateTemplateLiteral": "Ontbrekend achterste aanhalingsteken ('`') om de template literal af te sluiten.",
+ "MissingRightParenthesisAfterFunctionCall": "Ben je het afsluitende haakje vergeten om de {{function}} functie aan te roepen?",
+ "MissingLeftParenthesisAfterFunctionCall": "Ben je het beginnende haakje vergeten om de {{function}} functie aan te roepen?",
+ "ExceededMaximumNumberOfParameters": "Een function kan niet meer dan 255 parameters hebben.",
+ "InvalidAssignmentTarget": "Ongeldige toewijzingsdoel.",
+ "MissingColonAfterThenBranchOfTernaryOperator": "Ontbrekende ':' na de then branch van de ternaire operator.",
+ "MissingFieldNameOrIndexAfterLeftBracket": "Ontbrekende veld naam of index na '['.",
+ "MissingRightBracketAfterFieldNameOrIndex": "Ontbrekende ']' na veld naam of index",
+ "MissingRightParenthesisAfterExpression": "Ontbrekende ')' na expressie.",
+ "MissingExpression": "Ontbrekende expressie.",
+ "InvalidTemplateLiteral": "Ongeldige template literal.",
+ "MissingRightBracketAfterListElements": "Ontbrekende ']' na lijstelementen.",
+ "MissingStringAsKey": "Ontbrekende string als sleutel.",
+ "MissingRightBraceAfterMapElements": "Ontbrekende '}' na de elementen van een map.",
+ "MissingEndOfLine": "Einde van regel verwacht.",
+ "MissingFunctionName": "Ontbrekende functie naam.",
+ "MissingLeftParenthesisAfterFunctionName": "Ontbrekende '(' na functie naam.",
+ "MissingParameterName": "Ontbrekende parameter naam.",
+ "MissingRightParenthesisAfterParameters": "Ontbrekende ')' na parameters.",
+ "MissingLeftBraceToStartFunctionBody": "Ontbrekende '{' om functie body te starten.",
+ "MissingVariableName": "Ontbrekende variabele naam.",
+ "MissingEqualsSignAfterVariableNameToInitializeValue": "Ontbrekend gelijkteken (=) na variabele naam om waarde te initialiseren.",
+ "MissingConstantName": "Ontbrekende constante naam.",
+ "MissingEqualsSignAfterConstantNameToInitializeValue": "Ontbrekend gelijkteken (=) na constante naam om waarde te initialiseren.",
+ "MissingLeftParenthesisBeforeIfCondition": "Ontbrekende '(' vóór if-voorwaarde.",
+ "MissingRightParenthesisAfterIfCondition": "Ontbrekende ')' na if-voorwaarde.",
+ "MissingLeftBraceToStartIfBody": "Ontbrekende '{' om if-body te starten.",
+ "MissingLeftBraceToStartElseBody": "Ontbrekende '{' om else-body te starten.",
+ "MissingLeftBraceToStartRepeatBody": "Ontbrekende '{' om herhaal-body te starten.",
+ "MissingLeftParenthesisAfterWhile": "Ontbrekende '(' na 'while'",
+ "MissingRightParenthesisAfterWhileCondition": "Ontbrekende ')' na 'while'-voorwaarde",
+ "MissingLeftBraceToStartWhileBody": "Ontbrekende '{' om 'while'-body te starten",
+ "MissingLeftBraceToStartDoWhileBody": "Ontbrekende '{' om 'do while'-body te starten",
+ "MissingWhileBeforeDoWhileCondition": "Ontbrekende 'while' om 'while'-voorwaarde te starten",
+ "MissingRightParenthesisAfterDoWhileCondition": "Ontbrekende ')' na 'do/while'-voorwaarde",
+ "MissingLeftParenthesisAfterForeach": "Ontbrekende '(' na 'foreach'",
+ "MissingLetInForeachCondition": "Ontbrekende 'let' in foreach-voorwaarde",
+ "MissingElementNameAfterForeach": "Ontbrekende element naam na 'foreach'.",
+ "MissingOfAfterElementNameInForeach": "Ontbrekende 'of' na element naam in 'foreach'.",
+ "MissingRightParenthesisAfterForeachElement": "Ontbrekende ')' na 'foreach'-element",
+ "MissingLeftBraceToStartForeachBody": "Ontbrekende '{' om 'foreach'-body te starten",
+ "MissingRightBraceAfterBlock": "Ontbrekende '}' na blok."
+ },
+ "semantic": {
+ "CannotAssignToConstant": "Een constante waarde kan geen nieuwe waarde toegekend krijgen.",
+ "InvalidPostfixOperand": "Ongeldig doel voor een update expressie.",
+ "DuplicateVariableName": "Er bestaat al een variabele met deze naam in deze scope.",
+ "TopLevelReturn": "Het return statement kan niet gebruikt worden in top-level statements.",
+ "VariableUsedInOwnInitializer": "Een variabele kan niet naar zichzelf verwijzen bij initialisatie."
+ },
+ "runtime": {
+ "CouldNotEvaluateFunction": "Kon de functie niet evalueren",
+ "InvalidExpression": "Ongeldige expressie",
+ "MissingParenthesesForFunctionCall": "Ben je de haakjes vergeten toen je de functie probeerde aan te roepen?",
+ "RepeatCountMustBeNumber": "repeat accepteert alleen een getal als argument.",
+ "RepeatCountMustBeGreaterThanZero": "Het repeat argument moet groter zijn dan nul.",
+ "CouldNotFindFunctionWithName": "Kon functie met naam niet vinden.",
+ "CouldNotFindFunctionWithNameSuggestion": "We weten niet wat `{{name}}` betekent. Misschien bedoelde je de `{{suggestion}}` functie?",
+ "NonCallableTarget": "Alleen functies kunnen worden uitgevoerd.",
+ "InvalidNumberOfArguments": "Ontbrekende {{maxArity}} argumenten maar kreeg {{numberOfArgs}}.",
+ "InvalidNumberOfArgumentsWithOptionalArguments": "Ontbrekende tussen {{minArity}} en {{maxArity}} argumenten maar kreeg {{numberOfArgs}}.",
+ "InvalidUnaryOperator": "Ongeldige unaire operator",
+ "OperandsMustBeTwoNumbersOrTwoStrings": "Operanden moeten twee getallen of twee strings zijn.",
+ "InvalidBinaryExpression": "Ongeldige binaire expressie",
+ "InvalidIndexGetterTarget": "Kan object niet indexeren, alleen dictionaries en arrays kunnen geïndexeerd worden'.",
+ "InvalidIndexSetterTarget": "Kan alleen dictionaries en arrays instellen via indexer.",
+ "OperandMustBeNumber": "Operand moet een getal zijn.",
+ "OperandsMustBeNumber": "Operanden moeten getallen zijn.",
+ "OperandMustBeBoolean": "Operand moet een boolean zijn.",
+ "CouldNotFindValueWithName": "Kon waarde met naam '{{name}}' niet vinden."
+ },
+ "disabledLanguageFeature": {
+ "ExcludeListViolation": "Gebruik van '{{tokenType}}' is niet toegestaan`.",
+ "IncludeListViolation": "Gebruik van '{{tokenType}}' is niet toegestaan`."
+ }
+ }
+}
diff --git a/app/javascript/interpreter/locales/system/translation.json b/app/javascript/interpreter/locales/system/translation.json
new file mode 100644
index 0000000000..88d31cdd8e
--- /dev/null
+++ b/app/javascript/interpreter/locales/system/translation.json
@@ -0,0 +1,93 @@
+{
+ "error": {
+ "syntax": {
+ "ExceededMaximumNumberOfParameters": "ExceededMaximumNumberOfParameters",
+ "InvalidAssignmentTarget": "InvalidAssignmentTarget",
+ "InvalidNumericVariableName": "InvalidNumericVariableName: name: {{name}}",
+ "InvalidTemplateLiteral": "InvalidTemplateLiteral",
+ "MissingBacktickToTerminateTemplateLiteral": "MissingBacktickToTerminateTemplateLiteral",
+ "MissingConditionAfterIf": "MissingConditionAfterIf",
+ "MissingColonAfterThenBranchOfTernaryOperator": "MissingColonAfterThenBranchOfTernaryOperator",
+ "MissingCommaBetweenParameters": "MissingCommaBetweenParameters: parameter: {{parameter}}",
+ "MissingConstantName": "MissingConstantName",
+ "MissingDoToStartBlock": "MissingDoToStartBlock: type: {{type}}",
+ "MissingDoubleQuoteToStartString": "MissingDoubleQuoteToStartString: string: {{string}}",
+ "MissingDoubleQuoteToTerminateString": "MissingDoubleQuoteToTerminateString: string: {{string}}",
+ "MissingEndAfterBlock": "MissingEndAfterBlock: type: {{type}}",
+ "MissingEndOfLine": "MissingEndOfLine: previous: {{previous}}",
+ "MissingExpression": "MissingExpression",
+ "MissingFieldNameOrIndexAfterLeftBracket": "MissingFieldNameOrIndexAfterLeftBracket",
+ "MissingFunctionName": "MissingFunctionName",
+ "MissingLeftBraceToStartBody": "MissingLeftBraceToStartBody: type: {{type}}",
+ "MissingLeftBraceToStartForeachBody": "MissingLeftBraceToStartForeachBody",
+ "MissingLeftParenthesisAfterForeach": "MissingLeftParenthesisAfterForeach",
+ "MissingLeftParenthesisAfterFunctionCall": "MissingLeftParenthesisAfterFunctionCall: function: {{function}}",
+ "MissingLeftParenthesisAfterFunctionName": "MissingLeftParenthesisAfterFunctionName",
+ "MissingLeftParenthesisBeforeIfCondition": "MissingLeftParenthesisBeforeIfCondition",
+ "MissingLeftParenthesisAfterWhile": "MissingLeftParenthesisAfterWhile",
+ "MissingLetInForeachCondition": "MissingLetInForeachCondition",
+ "MissingOfAfterElementNameInForeach": "MissingOfAfterElementNameInForeach",
+ "MissingParameterName": "MissingParameterName",
+ "MissingRightBraceAfterBlock": "MissingRightBraceAfterBlock",
+ "MissingRightBraceAfterMapElements": "MissingRightBraceAfterMapElements",
+ "MissingRightBraceToTerminatePlaceholder": "MissingRightBraceToTerminatePlaceholder",
+ "MissingRightBracketAfterFieldNameOrIndex": "MissingRightBracketAfterFieldNameOrIndex",
+ "MissingRightBracketAfterListElements": "MissingRightBracketAfterListElements",
+ "MissingRightParenthesisAfterFunctionCall": "MissingRightParenthesisAfterFunctionCall: function: {{function}}",
+ "MissingRightParenthesisAfterDoWhileCondition": "MissingRightParenthesisAfterDoWhileCondition",
+ "MissingRightParenthesisAfterExpression": "MissingRightParenthesisAfterExpression",
+ "MissingRightParenthesisAfterExpressionWithPotentialTypo": "MissingRightParenthesisAfterExpressionWithPotentialTypo: actual: {{actual}}, potential: {{potential}}",
+ "MissingRightParenthesisAfterForeachElement": "MissingRightParenthesisAfterForeachElement",
+ "MissingRightParenthesisAfterIfCondition": "MissingRightParenthesisAfterIfCondition",
+ "MissingRightParenthesisAfterParameters": "MissingRightParenthesisAfterParameters",
+ "MissingRightParenthesisAfterWhileCondition": "MissingRightParenthesisAfterWhileCondition",
+ "MissingWithBeforeParameters": "MissingWithBeforeParameters",
+ "MissingStringAsKey": "MissingStringAsKey",
+ "MissingVariableName": "MissingVariableName",
+ "MissingWhileBeforeDoWhileCondition": "MissingWhileBeforeDoWhileCondition",
+ "DuplicateParameterName": "DuplicateParameterName: parameter: {{parameter}}",
+ "NumberContainsAlpha": "NumberContainsAlpha: suggestion: {{suggestion}}",
+ "NumberEndsWithDecimalPoint": "NumberEndsWithDecimalPoint: suggestion: {{suggestion}}",
+ "NumberStartsWithZero": "NumberStartsWithZero: suggestion: {{suggestion}}",
+ "NumberWithMultipleDecimalPoints": "NumberWithMultipleDecimalPoints: suggestion: {{suggestion}}",
+ "UnexpectedElseWithoutIf": "UnexpectedElseWithoutIf",
+ "UnexpectedLiteralExpressionAfterIf": "UnexpectedLiteralExpressionAfterIf",
+ "UnexpectedVariableExpressionAfterIfWithPotentialTypo": "UnexpectedVariableExpressionAfterIfWithPotentialTypo: actual: {{actual}}, potential: {{potential}}",
+ "UnknownCharacter": "UnknownCharacter: character: {{character}}",
+ "UnknownCharacterEquals": "UnknownCharacterEquals"
+ },
+ "semantic": {
+ "CannotAssignToConstant": "CannotAssignToConstant",
+ "DuplicateVariableName": "DuplicateVariableName",
+ "InvalidPostfixOperand": "InvalidPostfixOperand",
+ "TopLevelReturn": "TopLevelReturn",
+ "VariableUsedInOwnInitializer": "VariableUsedInOwnInitializer"
+ },
+ "runtime": {
+ "CouldNotEvaluateFunction": "CouldNotEvaluateFunction",
+ "CouldNotFindFunctionWithName": "CouldNotFindFunctionWithName",
+ "CouldNotFindFunctionWithNameSuggestion": "CouldNotFindFunctionWithNameSuggestion: name: {{name}}, suggestion: {{suggestion}}",
+ "CouldNotFindValueWithName": "CouldNotFindValueWithName: name: {{name}}",
+ "InfiniteLoop": "InfiniteLoop",
+ "InvalidBinaryExpression": "InvalidBinaryExpression",
+ "InvalidExpression": "InvalidExpression",
+ "InvalidIndexGetterTarget": "InvalidIndexGetterTarget",
+ "InvalidIndexSetterTarget": "InvalidIndexSetterTarget",
+ "InvalidNumberOfArguments": "InvalidNumberOfArguments: maxArity: {{maxArity}}, numberOfArgs: {{numberOfArgs}}",
+ "InvalidNumberOfArgumentsWithOptionalArguments": "InvalidNumberOfArgumentsWithOptionalArguments: minArity: {{minArity}}, maxArity: {{maxArity}}, numberOfArgs: {{numberOfArgs}}",
+ "InvalidUnaryOperator": "InvalidUnaryOperator",
+ "MissingParenthesesForFunctionCall": "MissingParenthesesForFunctionCall",
+ "NonCallableTarget": "NonCallableTarget",
+ "OperandMustBeBoolean": "OperandMustBeBoolean",
+ "OperandMustBeNumber": "OperandMustBeNumber",
+ "OperandsMustBeNumber": "OperandsMustBeNumber",
+ "OperandsMustBeTwoNumbersOrTwoStrings": "OperandsMustBeTwoNumbersOrTwoStrings",
+ "RepeatCountMustBeGreaterThanZero": "RepeatCountMustBeGreaterThanZero",
+ "RepeatCountMustBeNumber": "RepeatCountMustBeNumber"
+ },
+ "disabledLanguageFeature": {
+ "ExcludeListViolation": "ExcludeListViolation: tokenType: {{tokenType}}",
+ "IncludeListViolation": "IncludeListViolation: tokenType: {{tokenType}}"
+ }
+ }
+}
diff --git a/app/javascript/interpreter/location.ts b/app/javascript/interpreter/location.ts
new file mode 100644
index 0000000000..28f0a0290b
--- /dev/null
+++ b/app/javascript/interpreter/location.ts
@@ -0,0 +1,54 @@
+import { Expression } from './expression'
+import { Statement } from './statement'
+import { type Token } from './/token'
+
+export class Span {
+ constructor(public begin: number, public end: number) {}
+
+ public static between(from: Span, to: Span): Span {
+ return new Span(from.begin, to.end)
+ }
+}
+
+export class Location {
+ constructor(
+ public line: number,
+ public relative: Span,
+ public absolute: Span
+ ) {}
+
+ public toCode(code: string): string {
+ return code.substring(this.absolute.begin - 1, this.absolute.end - 1)
+ }
+
+ public static fromLineOffset(
+ begin: number,
+ end: number,
+ line: number,
+ lineOffset: number
+ ): Location {
+ return new Location(
+ line,
+ new Span(begin - lineOffset, end - lineOffset),
+ new Span(begin, end)
+ )
+ }
+
+ public static between(
+ begin: Token | Expression | Statement,
+ end: Token | Expression | Statement
+ ): Location {
+ // TODO: fix spanning multiple lines
+ return new Location(
+ begin.location.line,
+ Span.between(begin.location.relative, end.location.relative),
+ Span.between(begin.location.absolute, end.location.absolute)
+ )
+ }
+
+ public static readonly unknown = new Location(
+ 1,
+ { begin: 1, end: 1 },
+ { begin: 1, end: 1 }
+ )
+}
diff --git a/app/javascript/interpreter/resolver.ts b/app/javascript/interpreter/resolver.ts
new file mode 100644
index 0000000000..bc8f380129
--- /dev/null
+++ b/app/javascript/interpreter/resolver.ts
@@ -0,0 +1,335 @@
+import { isString } from './checks'
+import { SemanticError, type SemanticErrorType } from './error'
+import {
+ ArrayExpression,
+ AssignExpression,
+ BinaryExpression,
+ CallExpression,
+ DictionaryExpression,
+ Expression,
+ type ExpressionVisitor,
+ GetExpression,
+ GroupingExpression,
+ LiteralExpression,
+ LogicalExpression,
+ SetExpression,
+ TemplateLiteralExpression,
+ TemplatePlaceholderExpression,
+ TemplateTextExpression,
+ TernaryExpression,
+ UnaryExpression,
+ UpdateExpression,
+ VariableExpression,
+} from './expression'
+import { Location } from './location'
+import {
+ BlockStatement,
+ ConstantStatement,
+ DoWhileStatement,
+ ExpressionStatement,
+ ForeachStatement,
+ FunctionStatement,
+ IfStatement,
+ RepeatStatement,
+ RepeatUntilGameOverStatement,
+ ReturnStatement,
+ Statement,
+ type StatementVisitor,
+ VariableStatement,
+ WhileStatement,
+} from './statement'
+import type { Token } from './token'
+import { translate } from './translator'
+
+type FunctionType = 'NONE' | 'FUNCTION'
+
+export class Resolver
+ implements ExpressionVisitor, StatementVisitor
+{
+ private readonly scopes: Map[] = []
+ private readonly constants = new Set()
+ private currentFunction: FunctionType = 'NONE'
+ public readonly locals = new Map()
+
+ constructor(
+ private allowVariableReassignment: boolean,
+ private globals: string[]
+ ) {
+ this.beginScope()
+
+ for (const key of globals) {
+ this.declare(key)
+ this.define(key)
+ }
+ }
+
+ public visitExpressionStatement(statement: ExpressionStatement): void {
+ this.resolve(statement.expression)
+ }
+
+ public visitVariableStatement(statement: VariableStatement): void {
+ this.declare(statement.name)
+ this.resolve(statement.initializer)
+ this.define(statement.name)
+ }
+
+ public visitConstantStatement(statement: ConstantStatement): void {
+ this.declareConstant(statement.name)
+ this.resolve(statement.initializer)
+ this.define(statement.name)
+ }
+
+ public visitIfStatement(statement: IfStatement): void {
+ this.resolve(statement.condition)
+ this.resolve(statement.thenBranch)
+ if (statement.elseBranch !== null) this.resolve(statement.elseBranch)
+ }
+
+ public visitRepeatStatement(statement: RepeatStatement): void {
+ this.resolve(statement.count)
+ this.resolve(statement.body)
+ }
+
+ public visitRepeatUntilGameOverStatement(
+ statement: RepeatUntilGameOverStatement
+ ): void {
+ this.resolve(statement.body)
+ }
+
+ public visitWhileStatement(statement: WhileStatement): void {
+ this.resolve(statement.condition)
+ this.resolve(statement.body)
+ }
+
+ public visitDoWhileStatement(statement: DoWhileStatement): void {
+ this.resolve(statement.condition)
+ this.resolve(statement.body)
+ }
+
+ public visitBlockStatement(statement: BlockStatement): void {
+ this.beginScope()
+ this.resolve(statement.statements)
+ this.endScope()
+ }
+
+ public visitFunctionStatement(statement: FunctionStatement): void {
+ this.declare(statement.name)
+ this.define(statement.name)
+ this.resolveFunction(statement, 'FUNCTION')
+ }
+
+ public visitReturnStatement(statement: ReturnStatement): void {
+ if (this.currentFunction === 'NONE')
+ this.error('TopLevelReturn', statement.location)
+
+ if (statement.value !== null) this.resolve(statement.value)
+ }
+
+ visitForeachStatement(statement: ForeachStatement): void {
+ this.resolve(statement.iterable)
+ this.beginScope()
+ this.declare(statement.elementName)
+ this.define(statement.elementName)
+ this.resolve(statement.body)
+ this.endScope()
+ }
+
+ visitTemplateLiteralExpression(expression: TemplateLiteralExpression): void {
+ for (const part of expression.parts) this.resolve(part)
+ }
+
+ visitTemplatePlaceholderExpression(
+ expression: TemplatePlaceholderExpression
+ ): void {
+ this.resolve(expression.inner)
+ }
+
+ visitTemplateTextExpression(_expression: TemplateTextExpression): void {}
+
+ visitArrayExpression(expression: ArrayExpression): void {
+ for (const element of expression.elements) this.resolve(element)
+ }
+
+ visitDictionaryExpression(expression: DictionaryExpression): void {
+ for (const [_, value] of expression.elements) this.resolve(value)
+ }
+
+ public visitCallExpression(expression: CallExpression): void {
+ this.resolve(expression.callee)
+
+ for (const arg of expression.args) this.resolve(arg)
+ }
+
+ public visitLiteralExpression(_expression: LiteralExpression): void {}
+
+ public visitVariableExpression(expression: VariableExpression): void {
+ if (this.globals && this.globals[expression.name.lexeme]) return
+
+ if (
+ this.scopes.length > 0 &&
+ this.scopes[this.scopes.length - 1].has(expression.name.lexeme) &&
+ !this.scopes[this.scopes.length - 1].get(expression.name.lexeme)
+ )
+ this.error('VariableUsedInOwnInitializer', expression.location, {
+ expression,
+ name: expression.name.lexeme,
+ })
+
+ this.resolveLocal(expression, expression.name)
+ }
+
+ public visitUnaryExpression(expression: UnaryExpression): void {
+ this.resolve(expression.operand)
+ }
+
+ public visitBinaryExpression(expression: BinaryExpression): void {
+ this.resolve(expression.left)
+ this.resolve(expression.right)
+ }
+
+ public visitLogicalExpression(expression: LogicalExpression): void {
+ this.resolve(expression.left)
+ this.resolve(expression.right)
+ }
+
+ public visitTernaryExpression(expression: TernaryExpression): void {
+ this.resolve(expression.condition)
+ this.resolve(expression.thenBranch)
+ this.resolve(expression.elseBranch)
+ }
+
+ public visitGroupingExpression(expression: GroupingExpression): void {
+ this.resolve(expression.inner)
+ }
+
+ public visitAssignExpression(expression: AssignExpression): void {
+ this.resolve(expression.value)
+
+ if (this.constants.has(expression.name.lexeme))
+ this.error('CannotAssignToConstant', expression.location)
+
+ this.resolveLocal(expression, expression.name)
+ }
+
+ public visitUpdateExpression(expression: UpdateExpression): void {
+ this.resolve(expression.operand)
+
+ if (expression.operand instanceof VariableExpression) {
+ this.resolveLocal(expression.operand, expression.operand.name)
+ } else if (expression.operand instanceof GetExpression) {
+ this.resolve(expression.operand.obj)
+ } else if (expression.operand instanceof LiteralExpression) {
+ // Do nothing
+ } else this.error('InvalidPostfixOperand', expression.location)
+ }
+
+ public visitGetExpression(expression: GetExpression): void {
+ this.resolve(expression.obj)
+ }
+
+ public visitSetExpression(expression: SetExpression): void {
+ this.resolve(expression.obj)
+ this.resolve(expression.value)
+ }
+
+ public resolve(element: Statement | Expression | Statement[]) {
+ if (element instanceof Statement || element instanceof Expression) {
+ element.accept(this)
+ return
+ }
+
+ for (const statement of element) this.resolve(statement)
+ }
+
+ private resolveLocal(expression: VariableExpression, name: Token) {
+ for (let i = this.scopes.length - 1; i >= 0; i--) {
+ if (this.scopes[i].has(name.lexeme)) {
+ if (this.constants.has(name.lexeme))
+ this.error('CannotAssignToConstant', expression.location)
+
+ this.setLocal(expression, this.scopes.length - 1 - i)
+ return
+ }
+ }
+ }
+
+ private resolveFunction(
+ statement: FunctionStatement,
+ functionType: FunctionType
+ ) {
+ const enclosingFunction = this.currentFunction
+ this.currentFunction = functionType
+
+ this.beginScope()
+ for (const param of statement.parameters) {
+ this.declare(param.name)
+ this.define(param.name)
+ }
+ this.resolve(statement.body)
+ this.endScope()
+ this.currentFunction = enclosingFunction
+ }
+
+ private declareConstant(name: Token | string) {
+ this.constants.add(isString(name) ? name : name.lexeme)
+ this.declare(name)
+ }
+
+ private declare(name: Token | string) {
+ if (this.scopes.length === 0) return
+
+ const nameString = isString(name) ? name : name.lexeme
+
+ if (this.allowVariableReassignment) {
+ if (this.scopes.find((scope) => scope.has(nameString))) {
+ return
+ }
+ } else {
+ const scope = this.scopes[this.scopes.length - 1]
+ if (scope.has(nameString)) {
+ this.error(
+ 'DuplicateVariableName',
+ isString(name) ? null : name.location,
+ {
+ name,
+ }
+ )
+ }
+ }
+
+ this.scopes[this.scopes.length - 1].set(nameString, false)
+ }
+
+ private define(name: Token | string) {
+ if (this.scopes.length === 0) return
+ this.scopes[this.scopes.length - 1].set(
+ isString(name) ? name : name.lexeme,
+ true
+ )
+ }
+
+ private beginScope() {
+ this.scopes.push(new Map())
+ }
+
+ private endScope() {
+ this.scopes.pop()
+ }
+
+ private setLocal(expression: Expression, depth: number): void {
+ this.locals.set(expression, depth)
+ }
+
+ private error(
+ type: SemanticErrorType,
+ location: Location | null,
+ context: any = {}
+ ): never {
+ throw new SemanticError(
+ translate(`error.semantic.${type}`, context),
+ location,
+ type,
+ context
+ )
+ }
+}
diff --git a/app/javascript/interpreter/statement.ts b/app/javascript/interpreter/statement.ts
new file mode 100644
index 0000000000..f9226b1c33
--- /dev/null
+++ b/app/javascript/interpreter/statement.ts
@@ -0,0 +1,186 @@
+import { Expression } from './expression'
+import { Location } from './location'
+import type { Token } from './token'
+
+export interface StatementVisitor {
+ visitExpressionStatement(statement: ExpressionStatement): T
+ visitVariableStatement(statement: VariableStatement): T
+ visitConstantStatement(statement: ConstantStatement): T
+ visitIfStatement(statement: IfStatement): T
+ visitRepeatStatement(statement: RepeatStatement): T
+ visitRepeatUntilGameOverStatement(statement: RepeatUntilGameOverStatement): T
+ visitBlockStatement(statement: BlockStatement): T
+ visitFunctionStatement(statement: FunctionStatement): T
+ visitReturnStatement(statement: ReturnStatement): T
+ visitForeachStatement(statement: ForeachStatement): T
+ visitWhileStatement(statement: WhileStatement): T
+ visitDoWhileStatement(statement: DoWhileStatement): T
+}
+
+export abstract class Statement {
+ abstract accept(visitor: StatementVisitor): T
+ abstract location: Location
+}
+
+export class ExpressionStatement extends Statement {
+ constructor(public expression: Expression, public location: Location) {
+ super()
+ }
+
+ public accept(visitor: StatementVisitor): T {
+ return visitor.visitExpressionStatement(this)
+ }
+}
+
+export class VariableStatement extends Statement {
+ constructor(
+ public name: Token,
+ public initializer: Expression,
+ public location: Location
+ ) {
+ super()
+ }
+
+ public accept(visitor: StatementVisitor): T {
+ return visitor.visitVariableStatement(this)
+ }
+}
+
+export class ConstantStatement extends Statement {
+ constructor(
+ public name: Token,
+ public initializer: Expression,
+ public location: Location
+ ) {
+ super()
+ }
+
+ public accept(visitor: StatementVisitor): T {
+ return visitor.visitConstantStatement(this)
+ }
+}
+
+export class IfStatement extends Statement {
+ constructor(
+ public condition: Expression,
+ public thenBranch: Statement,
+ public elseBranch: Statement | null,
+ public location: Location
+ ) {
+ super()
+ }
+
+ public accept(visitor: StatementVisitor): T {
+ return visitor.visitIfStatement(this)
+ }
+}
+
+export class RepeatStatement extends Statement {
+ constructor(
+ public count: Expression,
+ public body: Statement[],
+ public location: Location
+ ) {
+ super()
+ }
+
+ public accept(visitor: StatementVisitor): T {
+ return visitor.visitRepeatStatement(this)
+ }
+}
+
+export class RepeatUntilGameOverStatement extends Statement {
+ constructor(public body: Statement[], public location: Location) {
+ super()
+ }
+
+ public accept(visitor: StatementVisitor): T {
+ return visitor.visitRepeatUntilGameOverStatement(this)
+ }
+}
+
+export class WhileStatement extends Statement {
+ constructor(
+ public condition: Expression,
+ public body: Statement[],
+ public location: Location
+ ) {
+ super()
+ }
+
+ public accept(visitor: StatementVisitor): T {
+ return visitor.visitWhileStatement(this)
+ }
+}
+
+export class DoWhileStatement extends Statement {
+ constructor(
+ public condition: Expression,
+ public body: Statement[],
+ public location: Location
+ ) {
+ super()
+ }
+
+ public accept(visitor: StatementVisitor): T {
+ return visitor.visitDoWhileStatement(this)
+ }
+}
+
+export class BlockStatement extends Statement {
+ constructor(public statements: Statement[], public location: Location) {
+ super()
+ }
+
+ public accept(visitor: StatementVisitor): T {
+ return visitor.visitBlockStatement(this)
+ }
+}
+
+export class FunctionParameter {
+ constructor(public name: Token, public defaultValue: Expression | null) {}
+}
+
+export class FunctionStatement extends Statement {
+ constructor(
+ public name: Token,
+ public parameters: FunctionParameter[],
+ public body: Statement[],
+ public location: Location
+ ) {
+ super()
+ }
+
+ public accept(visitor: StatementVisitor): T {
+ return visitor.visitFunctionStatement(this)
+ }
+}
+
+export class ReturnStatement extends Statement {
+ constructor(
+ public keyword: Token,
+ public value: Expression | null,
+ public location: Location
+ ) {
+ super()
+ }
+
+ public accept(visitor: StatementVisitor): T {
+ return visitor.visitReturnStatement(this)
+ }
+}
+
+export class ForeachStatement extends Statement {
+ constructor(
+ public elementName: Token,
+ public iterable: Expression,
+ public body: Statement[],
+ public location: Location
+ ) {
+ super()
+ }
+
+ public accept(visitor: StatementVisitor): T {
+ return visitor.visitForeachStatement(this)
+ }
+}
diff --git a/app/javascript/interpreter/token.ts b/app/javascript/interpreter/token.ts
new file mode 100644
index 0000000000..deff3b5cbf
--- /dev/null
+++ b/app/javascript/interpreter/token.ts
@@ -0,0 +1,11 @@
+import type {
+ Token as JikiscriptToken,
+ TokenType as JikiscriptTokenType,
+} from './languages/jikiscript/token'
+import type {
+ Token as JavascriptToken,
+ TokenType as JavascriptTokenType,
+} from './languages/javascript/token'
+
+export type Token = JikiscriptToken | JavascriptToken
+export type TokenType = JikiscriptTokenType | JavascriptTokenType
diff --git a/app/javascript/interpreter/translator.ts b/app/javascript/interpreter/translator.ts
new file mode 100644
index 0000000000..2191d73b89
--- /dev/null
+++ b/app/javascript/interpreter/translator.ts
@@ -0,0 +1,33 @@
+import i18next from 'i18next'
+import i18n from 'i18next'
+// import resourcesToBackend from "i18next-resources-to-backend";
+
+const DEFAULT_LANGUAGE = 'en'
+const DEBUG = false
+
+import enLangPack from './locales/en/translation.json'
+import nlLangPack from './locales/nl/translation.json'
+import systemLangPack from './locales/system/translation.json'
+
+i18n.init({
+ debug: DEBUG,
+ lng: DEFAULT_LANGUAGE,
+ initImmediate: false,
+})
+i18next.addResourceBundle('system', 'translation', systemLangPack)
+i18next.addResourceBundle('en', 'translation', enLangPack)
+i18next.addResourceBundle('nl', 'translation', nlLangPack)
+
+export function getLanguage(): string {
+ return i18next.language
+}
+
+export async function changeLanguage(language: string): Promise {
+ if (i18next.language === language) return
+
+ await i18next.changeLanguage(language)
+}
+
+export function translate(key: string, options = {}): string {
+ return i18next.t(key, options).toString()
+}
diff --git a/app/javascript/packs/bootcamp-ui.tsx b/app/javascript/packs/bootcamp-ui.tsx
new file mode 100644
index 0000000000..d429c11c0e
--- /dev/null
+++ b/app/javascript/packs/bootcamp-ui.tsx
@@ -0,0 +1,33 @@
+import React from 'react'
+import { lazy, Suspense } from 'react'
+import { initReact } from '../utils/react-bootloader'
+import '@hotwired/turbo-rails'
+import { camelizeKeysAs } from '@/utils/camelize-keys-as'
+
+const SolveExercisePage = lazy(
+ () => import('../components/bootcamp/SolveExercisePage/SolveExercisePage')
+)
+
+declare global {
+ interface Window {
+ turboLoaded: boolean
+ }
+}
+// As we're sensitive to the order of things across different packs
+// we set a window-level constant to record when turbo has loaded
+// so that other packs that haven't yet rendered events can respond to them
+document.addEventListener('turbo:load', () => (window.turboLoaded = true))
+
+const mappings = {
+ 'bootcamp-solve-exercise-page': (
+ data: SolveExercisePageProps
+ ): JSX.Element => (
+
+ (data)} />
+
+ ),
+}
+
+// Add all react components here.
+// Each should map 1-1 to a component in app/helpers/components
+initReact(mappings)
diff --git a/app/models/bootcamp.rb b/app/models/bootcamp.rb
new file mode 100644
index 0000000000..08679340d6
--- /dev/null
+++ b/app/models/bootcamp.rb
@@ -0,0 +1,5 @@
+module Bootcamp
+ def self.table_name_prefix
+ "bootcamp_"
+ end
+end
diff --git a/app/models/bootcamp/concept.rb b/app/models/bootcamp/concept.rb
new file mode 100644
index 0000000000..19710f5222
--- /dev/null
+++ b/app/models/bootcamp/concept.rb
@@ -0,0 +1,22 @@
+class Bootcamp::Concept < ApplicationRecord
+ self.table_name = "bootcamp_concepts"
+
+ has_markdown_field :content
+
+ belongs_to :parent, optional: true, class_name: "Bootcamp::Concept"
+ has_many :descendants, class_name: "Bootcamp::Concept", foreign_key: :parent_id, dependent: :nullify, inverse_of: :parent
+
+ belongs_to :level, foreign_key: :level_idx, primary_key: :idx, inverse_of: :exercises, class_name: "Bootcamp::Level"
+
+ has_many :exercise_concepts, dependent: :destroy, class_name: "Bootcamp::ExerciseConcept"
+ has_many :exercises, through: :exercise_concepts, class_name: "Bootcamp::Exercise"
+
+ scope :apex, -> { where(apex: true) }
+ scope :non_apex, -> { where(apex: false) }
+
+ def to_param = slug
+
+ def parents
+ parent ? parent.parents + [parent] : []
+ end
+end
diff --git a/app/models/bootcamp/drawing.rb b/app/models/bootcamp/drawing.rb
new file mode 100644
index 0000000000..d401b27e3f
--- /dev/null
+++ b/app/models/bootcamp/drawing.rb
@@ -0,0 +1,10 @@
+class Bootcamp::Drawing < ApplicationRecord
+ belongs_to :user
+
+ before_create do
+ self.uuid = SecureRandom.uuid unless uuid.present?
+ self.code = "" unless code.present?
+ end
+
+ def to_param = uuid
+end
diff --git a/app/models/bootcamp/exercise.rb b/app/models/bootcamp/exercise.rb
new file mode 100644
index 0000000000..038837d990
--- /dev/null
+++ b/app/models/bootcamp/exercise.rb
@@ -0,0 +1,55 @@
+class Bootcamp::Exercise < ApplicationRecord
+ extend Mandate::Memoize
+
+ self.table_name = "bootcamp_exercises"
+
+ belongs_to :project, class_name: "Bootcamp::Project"
+ belongs_to :level, foreign_key: :level_idx, primary_key: :idx, inverse_of: :exercises, class_name: "Bootcamp::Level"
+ has_many :solutions, dependent: :destroy, class_name: "Bootcamp::Solution"
+ has_many :submissions, through: :solutions
+ has_many :exercise_concepts, dependent: :destroy, class_name: "Bootcamp::ExerciseConcept"
+ has_many :concepts, through: :exercise_concepts
+
+ default_scope -> { order(:idx) }
+ scope :unlocked, -> { where('level_idx < ?', Bootcamp::Settings.level_idx) }
+
+ def to_param = slug
+ def locked? = level_idx > Bootcamp::Settings.level_idx
+ def unlocked? = !locked?
+ def concepts = super.to_a.sort
+
+ def icon_url = "#{Exercism.config.website_icons_host}/bootcamp/exercises/#{project.slug}/#{slug}.svg"
+
+ memoize
+ def tasks
+ config[:tasks].map.with_index do |task, idx|
+ task[:instructions_html] = Markdown::Parse.(file_contents("task-#{idx + 1}.md"))
+ task
+ end
+ end
+
+ def num_tasks = tasks.size
+
+ memoize
+ def config
+ JSON.parse(file_contents('config.json'), symbolize_names: true)
+ end
+
+ memoize
+ def introduction_html
+ Markdown::Parse.(file_contents("introduction.md"))
+ end
+
+ def stub
+ file_contents("stub.jiki")
+ end
+
+ def readonly_ranges
+ config[:readonly_ranges]
+ end
+
+ private
+ def file_contents(filename)
+ File.read(Rails.root / "bootcamp_content/projects/#{project.slug}/exercises/#{slug}/#{filename}")
+ end
+end
diff --git a/app/models/bootcamp/exercise_concept.rb b/app/models/bootcamp/exercise_concept.rb
new file mode 100644
index 0000000000..3d9481a863
--- /dev/null
+++ b/app/models/bootcamp/exercise_concept.rb
@@ -0,0 +1,6 @@
+class Bootcamp::ExerciseConcept < ApplicationRecord
+ self.table_name = "bootcamp_exercise_concepts"
+
+ belongs_to :exercise, class_name: "Bootcamp::Exercise"
+ belongs_to :concept, class_name: "Bootcamp::Concept"
+end
diff --git a/app/models/bootcamp/level.rb b/app/models/bootcamp/level.rb
new file mode 100644
index 0000000000..080c99afb9
--- /dev/null
+++ b/app/models/bootcamp/level.rb
@@ -0,0 +1,14 @@
+class Bootcamp::Level < ApplicationRecord
+ self.table_name = "bootcamp_levels"
+
+ has_markdown_field :content
+
+ has_many :concepts, dependent: :destroy, foreign_key: :level_idx, primary_key: :idx, inverse_of: :level,
+ class_name: "Bootcamp::Concept"
+ has_many :exercises, dependent: :destroy, foreign_key: :level_idx, primary_key: :idx, inverse_of: :level,
+ class_name: "Bootcamp::Exercise"
+
+ def unlocked?
+ Settings.instance.level_idx >= idx
+ end
+end
diff --git a/app/models/bootcamp/project.rb b/app/models/bootcamp/project.rb
new file mode 100644
index 0000000000..d767e4a559
--- /dev/null
+++ b/app/models/bootcamp/project.rb
@@ -0,0 +1,12 @@
+class Bootcamp::Project < ApplicationRecord
+ self.table_name = "bootcamp_projects"
+
+ has_markdown_field :introduction
+
+ # TODO: Fix the rubocop error
+ has_many :exercises, class_name: "Bootcamp::Exercise" # rubocop:disable Rails/HasManyOrHasOneDependent
+
+ def to_param = slug
+
+ def icon_url = "#{Exercism.config.website_icons_host}/bootcamp/projects/#{slug}.svg"
+end
diff --git a/app/models/bootcamp/settings.rb b/app/models/bootcamp/settings.rb
new file mode 100644
index 0000000000..4b9839fbb8
--- /dev/null
+++ b/app/models/bootcamp/settings.rb
@@ -0,0 +1,10 @@
+class Bootcamp::Settings < ApplicationRecord
+ self.table_name = "bootcamp_settings"
+
+ def self.instance
+ @instance = first || create!
+ end
+
+ # DO NOT memoize these.
+ def self.level_idx = instance.level_idx
+end
diff --git a/app/models/bootcamp/solution.rb b/app/models/bootcamp/solution.rb
new file mode 100644
index 0000000000..ce2bae81e7
--- /dev/null
+++ b/app/models/bootcamp/solution.rb
@@ -0,0 +1,21 @@
+class Bootcamp::Solution < ApplicationRecord
+ self.table_name = "bootcamp_solutions"
+
+ belongs_to :user
+ belongs_to :exercise, class_name: "Bootcamp::Exercise"
+ has_one :project, through: :exercise
+ has_many :submissions, dependent: :destroy, class_name: "Bootcamp::Submission"
+
+ scope :completed, -> { where.not(completed_at: nil) }
+ scope :in_progress, -> { where(completed_at: nil) }
+
+ before_create do
+ self.uuid = SecureRandom.uuid
+ end
+
+ def to_param = uuid
+
+ def completed? = !!completed_at
+ def in_progress? = !completed?
+ def status = completed? ? :completed : :in_progress
+end
diff --git a/app/models/bootcamp/submission.rb b/app/models/bootcamp/submission.rb
new file mode 100644
index 0000000000..47b8216449
--- /dev/null
+++ b/app/models/bootcamp/submission.rb
@@ -0,0 +1,28 @@
+class Bootcamp::Submission < ApplicationRecord
+ self.table_name = "bootcamp_submissions"
+
+ serialize :test_results, JSONWithIndifferentAccess
+ serialize :readonly_ranges, JSONWithIndifferentAccess
+ enum :status, { pass: 0, fail: 1 }
+
+ scope :passed, -> { where(status: :pass) }
+ scope :failed, -> { where(status: :fail) }
+
+ belongs_to :solution, class_name: "Bootcamp::Solution"
+
+ before_create do
+ self.uuid = SecureRandom.uuid
+ self.status = test_results[:status]
+ end
+
+ def status = super.to_sym
+ def passed? = status == :pass
+ def test_suite = test_results[:suite].to_sym
+
+ def passed_test?(slug)
+ test = test_results[:tests].find { |tr| tr[:slug] == slug.to_s }
+ return false unless test
+
+ test[:status].to_s == "pass"
+ end
+end
diff --git a/app/models/bootcamp/user_project.rb b/app/models/bootcamp/user_project.rb
new file mode 100644
index 0000000000..d8abd0de3a
--- /dev/null
+++ b/app/models/bootcamp/user_project.rb
@@ -0,0 +1,61 @@
+class Bootcamp::UserProject < ApplicationRecord
+ extend Mandate::Memoize
+
+ self.table_name = "bootcamp_user_projects"
+
+ belongs_to :user
+ belongs_to :project, class_name: "Bootcamp::Project"
+
+ enum :status, { locked: 0, available: 1, completed: 2 }
+
+ def status = super.to_sym
+ def locked? = status == :locked
+ def available? = status == :available
+ def completed? = status == :completed
+
+ def self.for!(user, project)
+ find_by!(user:, project:)
+ end
+
+ # memoize
+ def solutions
+ Bootcamp::Solution.where(user:, exercise: project.exercises).
+ includes(:exercise).
+ to_a
+ end
+
+ def unlocked_exercises
+ project.exercises.reject(&:locked?)
+ end
+
+ def next_exercise
+ completed_exercise_ids = solutions.select(&:completed?).map(&:exercise_id)
+ project.exercises.reject(&:locked?).reject { |e| completed_exercise_ids.include?(e.id) }.first
+ end
+
+ def exercise_available?(exercise)
+ # If the project's locked, all the exercises are locked
+ return false if locked?
+
+ # If the exercise is gloabally locked, it's locked
+ return false if exercise.locked?
+
+ # The first exercise is always available
+ return true if exercise.idx == 1
+
+ # Otherwise the previous solution must be completed
+ solutions.find { |s| s.exercise.idx == exercise.idx - 1 }&.completed?
+ end
+
+ def exercise_status(exercise, solution)
+ solution ||= solutions.find { |s| s.exercise_id == exercise.id }
+
+ if solution
+ solution.status
+ elsif exercise_available?(exercise)
+ :available
+ else
+ :locked
+ end
+ end
+end
diff --git a/app/models/user.rb b/app/models/user.rb
index cd86d58eba..d8a849aab8 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -129,6 +129,11 @@ class User < ApplicationRecord
has_many :challenges, dependent: :destroy
has_many :watched_videos, class_name: "User::WatchedVideo", dependent: :destroy
+ has_many :bootcamp_solutions, dependent: :destroy, class_name: "Bootcamp::Solution"
+ has_many :bootcamp_user_projects, dependent: :destroy, class_name: "Bootcamp::UserProject"
+ has_many :bootcamp_projects, through: :bootcamp_user_projects, source: :project
+ has_many :bootcamp_drawings, dependent: :destroy, class_name: "Bootcamp::Drawing"
+
scope :random, -> { order('RAND()') }
scope :with_data, -> { joins(:data) }
diff --git a/app/serializers/serialize_bootcamp_exercise.rb b/app/serializers/serialize_bootcamp_exercise.rb
new file mode 100644
index 0000000000..e68b11f7e4
--- /dev/null
+++ b/app/serializers/serialize_bootcamp_exercise.rb
@@ -0,0 +1,20 @@
+class SerializeBootcampExercise
+ include Mandate
+
+ initialize_with :exercise
+
+ def call
+ return unless exercise
+
+ {
+ slug: exercise.slug,
+ title: exercise.title,
+ description: exercise.description,
+ project: {
+ slug: exercise.project.slug,
+ title: exercise.project.title,
+ description: exercise.project.description
+ }
+ }
+ end
+end
diff --git a/app/views/bootcamp/concepts/index.html.haml b/app/views/bootcamp/concepts/index.html.haml
new file mode 100644
index 0000000000..4ce55cebdc
--- /dev/null
+++ b/app/views/bootcamp/concepts/index.html.haml
@@ -0,0 +1,5 @@
+#page-bootcamp-concepts
+ - @concepts.each do |concept|
+ = link_to concept do
+ %h2.font-semibold= concept.title
+ %p= concept.description
diff --git a/app/views/bootcamp/concepts/show.html.haml b/app/views/bootcamp/concepts/show.html.haml
new file mode 100644
index 0000000000..e8e50323e2
--- /dev/null
+++ b/app/views/bootcamp/concepts/show.html.haml
@@ -0,0 +1,39 @@
+#page-bootcamp-concept
+ %header
+ .c-breadcrumbs
+ .lg-container.container
+ = link_to concepts_path do
+ = graphical_icon 'concepts'
+ .span All Concepts
+ .seperator /
+
+ - @concept.parents.each do |parent|
+ = link_to parent.title, concept_path(parent)
+ .seperator /
+
+ .title= @concept.title
+
+ .lg-container.details
+ %h1.font-semibold= @concept.title
+
+ .lg-container
+ .flex
+ .lhs.pr-40
+ .c-prose
+ = raw @concept.content_html
+
+ - if @concept.descendants.any?
+ %h3 Subconcepts
+ %ul.descendants
+ - @concept.descendants.each do |concept|
+ %li
+ = link_to concept do
+ .font-semibold.text-primary-blue.text-18= concept.title
+ .text-16.leading-150= concept.description
+ .rhs
+ .c-rhs-list
+ %h2.mb-12 Exercises
+ %p These exercises have been designed to help you practice this concept.
+ %ul
+ - @concept.exercises.each do |exercise|
+ %li= render ViewComponents::Bootcamp::ExerciseWidget.new(exercise)
diff --git a/app/views/bootcamp/confirmed.html.haml b/app/views/bootcamp/confirmed.html.haml
index 5ee2b0e714..2abd4b072d 100644
--- a/app/views/bootcamp/confirmed.html.haml
+++ b/app/views/bootcamp/confirmed.html.haml
@@ -15,7 +15,27 @@
%p.info
We're so excited to have you on board! 💙
- %p.info
- You should shortly receive an email welcoming you to the Bootcamp, and asking you to say hello. Please do take a few minutes to tell us your story - it's both incredibly motivating for us to hear about who's taking the Bootcamp, and also means we can better tailor what we're making!
- %p.info
- Thanks for trusting us with your learning 🙂
+ - if current_user
+ %p.info
+ Your Exercism account has been granted Bootcamp access.
+ Please use the following button to get started.
+ %p.info
+ You should shortly receive an email welcoming you to the Bootcamp, and asking you to say hello. Please do take a few minutes to tell us your story - it's both incredibly motivating for us to hear about who's taking the Bootcamp, and also means we can better tailor what we're making!
+ %p.info.mb-10
+ If you have any questions, please email us at
+ %strong.font-medium bootcamp@exercism.org
+ and we'll be happy to help.
+ = link_to "Go to the Bootcamp", bootcamp_dashboard_path, class: 'button'
+ - else
+ %p.info
+ %strong As you're not logged into your Exercism account, we need to manually connect things for you.
+ Firstly, please make sure you have an Exercism account. If you don't, #{link_to 'create one here', 'https://exercism.org/users/sign_up', class: 'text-primary-blue font-semibold'}.
+ %p.info
+ If the email address on that account is #{@bootcamp_data.email}, you should now have access.
+ If it's not, please email us at
+ %strong.font-medium bootcamp@exercism.org
+ with your Exercism username/handle and the email address you've enrolled with (#{@bootcamp_data.email}) and we'll give you access manually.
+ %p.info
+ You should also shortly receive an email welcoming you to the Bootcamp, and asking you to say hello. Please do take a few minutes to tell us your story - it's both incredibly motivating for us to hear about who's taking the Bootcamp, and also means we can better tailor what we're making!
+ %p.info
+ Thanks for trusting us with your learning 🙂
diff --git a/app/views/bootcamp/dashboard/_exercise.html.haml b/app/views/bootcamp/dashboard/_exercise.html.haml
new file mode 100644
index 0000000000..8c3fc35c2e
--- /dev/null
+++ b/app/views/bootcamp/dashboard/_exercise.html.haml
@@ -0,0 +1,13 @@
+- solution ||= nil
+- project = exercise.project
+- status = solution ? solution.status : "available"
+= link_to bootcamp_project_exercise_path(project, exercise), class: "exercise #{status}" do
+ .flex.items-center
+ .text
+ %h3
+ = project.title
+ %h4
+ Part #{exercise.idx + 1}.
+ = exercise.title
+ .tag= status.to_s.titleize
+ %p= exercise.description
diff --git a/app/views/bootcamp/dashboard/index.html.haml b/app/views/bootcamp/dashboard/index.html.haml
new file mode 100644
index 0000000000..88632d000a
--- /dev/null
+++ b/app/views/bootcamp/dashboard/index.html.haml
@@ -0,0 +1,60 @@
+#page-bootcamp-dashboard
+ - if Bootcamp::Settings.level_idx.zero?
+ .lg-container
+ %div{ class: 'max-w-[720px] mx-auto' }
+ %h1 Welcome to the Exercism Bootcamp!
+ %p.large Thanks so much for joining the Bootcamp. We're really excited to share our passion for programming with you!
+ %h2 Introductory Session
+ %p
+ Our kick-off session is at 18:00 UTC on Saturday Jan 11th.
+ We'll introduce you to the Bootcamp, explain how it works, and answer any questions you have.
+ Then we'll dig into the first steps on your coding journey.
+ %p
+ %strong.font-semibold Check back here
+ to get a link shortly before the session starts.
+
+ %h2 Forum & Discord
+ %p
+ We will be using Exercism's Forum and Discord server throughout this course to get unstuck and hang out.
+ Both have dedicated bootcamp areas which
+ %strong.font-medium you can access now.
+ %ul
+ %li
+ %strong.font-semibold The forum (#{link_to 'exercism.org/r/forum', 'https://exercism.org/r/forum', class: 'text-linkColor'})
+ is the space to get help or ask questions. There is a dedicated Bootcamp category. Log in with your Exercism account and read
+ = link_to 'this post', 'https://forum.exercism.org/t/welcome-to-the-bootcamp-forum-space/14389', class: 'text-linkColor font-semibold'
+ to get started.
+ %li
+ %strong.font-semibold Our Discord Server (#{link_to 'exercism.org/r/discord', 'https://exercism.org/r/discord', class: 'text-linkColor'})
+ is the place to go to chat and hang out with other participants. There is a dedicated #bootcamp channel reserved for you.
+ %strong.font-semibold Please use threads
+ on Discord to keep things ordered (don't be offended if you forget and we move your messages!).
+ To get access to the Bootcamp Channels, make sure your Exercism and Discord accounts #{link_to 'are connected here', 'https://exercism.org/settings/integrations', class: 'text-linkColor font-semibold'}.
+
+
+ %h2 Weekly Rhythm
+ %p We've designed each week to follow a similar pattern.
+ %ul
+ %li Monday at 18:00 UTC: Introduction to the week's content (Live Session).
+ %li Tuesday to Friday: Work on the week's exercises.
+ %li Saturday at 18:00 UTC: Deep dive into the week's exercises (Live Session).
+ %p The live sessions will be streamed on our YouTube channel and will be available to watch later if you can't make it.
+
+ %h2 Am I signed up correctly?
+ %p.pb-20 Yes. If you're seeing this page, then you're signed up and will be able to access the content after the 11th.
+
+ - else
+ .lg-container
+ .grid.grid-cols-2
+ .lhs
+ - if @exercise
+ - if @solution
+ %h2 Continue Where You Left Off
+ %p You have an exercise in progress.
+ = render 'exercise', exercise: @exercise, solution: @solution
+ - else
+ %h2 Start new exercise
+ %p You have a new exercise available to work on.
+ = render 'exercise', exercise: @exercise
+ - else
+ You have no exercises available.
diff --git a/app/views/bootcamp/drawings/edit.html.haml b/app/views/bootcamp/drawings/edit.html.haml
new file mode 100644
index 0000000000..d116d9a72e
--- /dev/null
+++ b/app/views/bootcamp/drawings/edit.html.haml
@@ -0,0 +1,3 @@
+- content_for :head do
+ %meta{ name: "turbo-visit-control", content: "reload" }
+= render ReactComponents::Bootcamp::DrawingPage.new(@drawing)
diff --git a/app/views/bootcamp/exercises/edit.html.haml b/app/views/bootcamp/exercises/edit.html.haml
new file mode 100644
index 0000000000..ed4b2d2589
--- /dev/null
+++ b/app/views/bootcamp/exercises/edit.html.haml
@@ -0,0 +1,3 @@
+- content_for :head do
+ %meta{ name: "turbo-visit-control", content: "reload" }
+= render ReactComponents::Bootcamp::SolveExercisePage.new(@solution)
diff --git a/app/views/bootcamp/exercises/index.html.haml b/app/views/bootcamp/exercises/index.html.haml
new file mode 100644
index 0000000000..b720e4dad6
--- /dev/null
+++ b/app/views/bootcamp/exercises/index.html.haml
@@ -0,0 +1,4 @@
+- @exercises.each do |exercise|
+ = link_to exercise do
+ %h2.font-semibold= exercise.title
+ %p= exercise.description
diff --git a/app/views/bootcamp/exercises/show.html.haml b/app/views/bootcamp/exercises/show.html.haml
new file mode 100644
index 0000000000..7b8181c336
--- /dev/null
+++ b/app/views/bootcamp/exercises/show.html.haml
@@ -0,0 +1,3 @@
+%h1.font-semibold= @exercise.title
+
+= raw @exercise.instructions_html
diff --git a/app/views/bootcamp/index.html.haml b/app/views/bootcamp/index.html.haml
index 0d7d3d7347..d802ffaeb5 100644
--- a/app/views/bootcamp/index.html.haml
+++ b/app/views/bootcamp/index.html.haml
@@ -282,7 +282,7 @@
%strong Build a portfolio of projects.
Create projects to showcase to potential employers while practicing your skills.
.rhs
- .dates.h3-sideheading.z-10
+ .dates.h3-sideheading.z-overlay
= image_tag "bootcamp/calendar.svg"
April - June 2025
= image_tag "bootcamp/part-2.png", class: 'w-[350px] -mr-32 -mt-[60px]'
diff --git a/app/views/bootcamp/levels/index.html.haml b/app/views/bootcamp/levels/index.html.haml
new file mode 100644
index 0000000000..304dc0052a
--- /dev/null
+++ b/app/views/bootcamp/levels/index.html.haml
@@ -0,0 +1,13 @@
+#page-bootcamp-levels
+ .lg-container
+ %h1.font-semibold.text-20.mb-8 Levels
+ .grid.grid-cols-3.gap-8
+ - (1..27).each do |idx|
+ - level = @levels[idx]
+ - if level&.unlocked?
+ = link_to level, class: "block border-1 p-8 rounded-8" do
+ %h2.font-semibold.mb-4= level.title
+ -# %p= level.status
+ %p= level.description
+ - else
+ .block.border-1.p-8.rounded-8.bg-gray-300{ class: "h-[100px]" }
diff --git a/app/views/bootcamp/levels/show.html.haml b/app/views/bootcamp/levels/show.html.haml
new file mode 100644
index 0000000000..9601f61043
--- /dev/null
+++ b/app/views/bootcamp/levels/show.html.haml
@@ -0,0 +1,43 @@
+#page-bootcamp-level
+ %header
+ .c-breadcrumbs
+ .lg-container.container
+ = link_to levels_path do
+ = graphical_icon 'levels'
+ .span Levels
+ .seperator /
+ .title
+ Level 1:
+ = @level.title
+
+ .lg-container
+ %section.c-completed-bar
+ = image_tag 'completed-check-circle.svg', class: "check-mark-icon"
+ .text You've completed Level #{@level.idx}
+ .stat
+ All #{@level.exercises.count} exercises completed
+
+ .details
+ %h1
+ Level 1:
+ = @level.title
+
+ .lg-container
+ .flex
+ .lhs.pr-40
+ .content.c-prose
+ = raw @level.content_html
+ .rhs
+ .c-rhs-list
+ %h2 Concepts
+ %p Make sure you understand these concepts before moving on from this level.
+ %ul
+ - @level.concepts.non_apex.each do |concept|
+ %li= render ViewComponents::Bootcamp::ConceptWidget.new(concept)
+
+ .c-rhs-list
+ %h2 Exercises
+ %p Complete these exercises to complete this level.
+ %ul
+ - @level.exercises.each do |exercise|
+ %li= render ViewComponents::Bootcamp::ExerciseWidget.new(exercise)
diff --git a/app/views/bootcamp/projects/index.html.haml b/app/views/bootcamp/projects/index.html.haml
new file mode 100644
index 0000000000..d922598285
--- /dev/null
+++ b/app/views/bootcamp/projects/index.html.haml
@@ -0,0 +1,15 @@
+#page-bootcamp-projects
+ %header
+ .c-breadcrumbs
+ .lg-container.container
+ .title Projects
+
+ .lg-container
+ .title-bar
+ %h1.font-semibold.text-20.mb-8 Projects
+ %p More projects will unlock as you progress through the Bootcamp.
+
+ .lg-container
+ .grid.grid-cols-3.gap-8
+ - @user_projects.each do |user_project|
+ = render ViewComponents::Bootcamp::ProjectWidget.new(user_project.project, user_project:)
diff --git a/app/views/bootcamp/projects/show.html.haml b/app/views/bootcamp/projects/show.html.haml
new file mode 100644
index 0000000000..cd625c0392
--- /dev/null
+++ b/app/views/bootcamp/projects/show.html.haml
@@ -0,0 +1,53 @@
+#page-bootcamp-project
+ %header
+ .c-breadcrumbs
+ .lg-container.container
+ = link_to bootcamp_projects_path do
+ = graphical_icon 'concepts'
+ .span Projects
+ .seperator /
+
+ .title= @project.title
+
+ .lg-container
+ .project-bar
+ = image_tag @project.icon_url, width: 64, height: 64
+ .flex.flex-col.gap-4
+ %h1= @project.title
+ .tags
+ .tag.completed Completed
+
+ -#
+ - if @project.concepts.any?
+ .flex
+ - @project.concepts.each do |concept|
+ = link_to concept.title, concept, class: 'bubble'
+
+ .lg-container
+ .flex.gap-48
+ .lhs
+ .introduction.c-prose
+ = raw @project.introduction_html
+
+ - if @project.slug == "drawing"
+ %h2 Your Drawings
+ %p Create your own drawings using code!
+ .grid.grid-cols-3
+ - current_user.bootcamp_drawings.each do |drawing|
+ = link_to edit_bootcamp_drawing_path(drawing), class: 'drawing' do
+ = drawing.uuid
+ -# = image_tag drawing.image_url, width: 200, height: 200
+ = button_to bootcamp_drawings_path, method: :post, class: "drawing new" do
+ New Drawing
+
+
+ .rhs
+ - num_completed = @project.exercises.to_a.count { |exercise| @solutions[exercise.id]&.completed? }
+ - num_unlocked = @project.exercises.to_a.count(&:unlocked?)
+ %h2.font-semibold.text-22.mb-4 Exercises (#{num_completed} / #{num_unlocked})
+ %p.text-16.leading-150.mb-12
+ You have completed #{num_completed} of #{num_unlocked} unlockable exercises in this project.
+ New exercises will unlock as the Bootcamp progresses.
+ .exercises.flex.flex-col.gap-16
+ - @project.exercises.each do |exercise|
+ = render ViewComponents::Bootcamp::ExerciseWidget.new(exercise, solution: @solutions[exercise.id], user_project: @user_project)
diff --git a/app/views/components/bootcamp/concept_widget.html.haml b/app/views/components/bootcamp/concept_widget.html.haml
new file mode 100644
index 0000000000..bb7f0a0943
--- /dev/null
+++ b/app/views/components/bootcamp/concept_widget.html.haml
@@ -0,0 +1,3 @@
+= link_to concept, class: "c-concept-widget" do
+ .title= concept.title
+ .description= concept.description
diff --git a/app/views/components/bootcamp/exercise_widget.html.haml b/app/views/components/bootcamp/exercise_widget.html.haml
new file mode 100644
index 0000000000..42fa89de10
--- /dev/null
+++ b/app/views/components/bootcamp/exercise_widget.html.haml
@@ -0,0 +1,13 @@
+- tag_type = status == :locked ? :div : :a
+= content_tag tag_type, href: bootcamp_project_exercise_url(project, exercise), class: "c-exercise-widget #{status}" do
+ .flex.items-start
+ = image_tag exercise.icon_url
+ .flex-grow.flex.flex-col
+ .flex.items-start
+ .title
+ .project-title= project.title
+ .tag{ class: status.to_s }
+ .exercise-title
+ #{exercise.idx}.
+ = exercise.title
+ .description= exercise.description
diff --git a/app/views/components/bootcamp/project_widget.html.haml b/app/views/components/bootcamp/project_widget.html.haml
new file mode 100644
index 0000000000..4ab1bbfe77
--- /dev/null
+++ b/app/views/components/bootcamp/project_widget.html.haml
@@ -0,0 +1,8 @@
+= link_to project, class: "c-project-widget #{status}" do
+ .flex.items-start
+ = image_tag project.icon_url
+ .flex.flex-col.flex-grow
+ .flex.items-start
+ .title= project.title
+ .tag{ class: status.to_s }
+ .description= project.description
diff --git a/app/views/layouts/bootcamp-ui.haml b/app/views/layouts/bootcamp-ui.haml
new file mode 100644
index 0000000000..9244069621
--- /dev/null
+++ b/app/views/layouts/bootcamp-ui.haml
@@ -0,0 +1,72 @@
+!!!
+%html
+ %head
+ -# Fallback fonts first
+ %link{ rel: "preload", href: asset_path('poppins-v20-latin-regular.woff2'), as: "font", type: "font/woff2", crossorigin: :anonymous }
+ %link{ rel: "preload", href: asset_path('poppins-v20-latin-600.woff2'), as: "font", type: "font/woff2", crossorigin: :anonymous }
+
+ -# Then the main stylesheet
+ = stylesheet_link_tag "bootcamp-ui", "data-turbo-track": "reload"
+
+
+ -# Then other critical fonts
+ %link{ rel: "preload", href: asset_path('poppins-v20-latin-500.woff2'), as: "font", type: "font/woff2", crossorigin: :anonymous }
+ %link{ rel: "preload", href: asset_path('poppins-v20-latin-700.woff2'), as: "font", type: "font/woff2", crossorigin: :anonymous }
+ %link{ rel: "preload", href: asset_path('source-code-pro-v22-latin_latin-ext-regular.woff2'), as: "font", type: "font/woff2", crossorigin: :anonymous }
+
+ -# Next, setup the fallback font
+ :css
+ @font-face {
+ font-display: fallback;
+ font-family: PoppinsInitial;
+ font-weight: 400;
+ src: url(#{asset_path('poppins-v20-latin-regular.woff2')}) format('woff2');
+ }
+
+ -# Use the 600 font-weight for 500/600/700
+ - [500, 600, 700].each do |weight|
+ :css
+ @font-face {
+ font-display: fallback;
+ font-family: PoppinsInitial;
+ font-weight: #{weight};
+ src: url(#{asset_path('poppins-v20-latin-600.woff2')}) format('woff2');
+ }
+
+ :css
+ body {
+ --body-font: Poppins, PoppinsInitial, sans-serif;
+ font-family: var(--body-font);
+ -webkit-font-smoothing: antialiased;
+ }
+
+ %meta{ content: "text/html; charset=UTF-8", "http-equiv" => "Content-Type" }
+ %title= content_for(:title) || "Bootcamp"
+ %meta{ content: "width=device-width,initial-scale=1", name: "viewport" }
+ %meta{ content: "yes", name: "apple-mobile-web-app-capable" }
+ = csrf_meta_tags
+ = csp_meta_tag
+ = yield :head
+
+ %meta{ name: "turbo-cache-control", content: "no-cache" }
+ %meta{ name: "turbo-prefetch", content: "false" }
+ %meta{ name: "user-id", content: current_user&.id }
+
+ %link{ href: "/manifest.json", rel: "manifest" }
+ %link{ href: "/icon.png", rel: "icon", type: "image/png" }
+ %link{ href: "/icon.svg", rel: "icon", type: "image/svg+xml" }
+ %link{ href: "/icon.png", rel: "apple-touch-icon" }
+ -# = javascript_include_tag "application", "data-turbo-track": "reload", type: "module", crossorigin: :anonymous
+ = javascript_include_tag "bootcamp-ui", "data-turbo-track": "reload", type: "module", crossorigin: :anonymous
+
+ %body{ class: body_class }
+ %header.c-site-header
+ .sm-container
+ .container
+ %img{ src: "https://assets.exercism.org/assets/bootcamp/exercism-face-light-2fc4ffad44f295d2e900ab2d2198d2280128dfcd.svg" }
+ .content
+ %strong.font-semibold Exercism
+ Bootcamp
+
+ = link_to "Back to Exercism →", "https://exercism.org", class: 'ml-auto text-linkColor font-semibold text-16'
+ = yield
diff --git a/app/views/layouts/bootcamp.haml b/app/views/layouts/bootcamp.haml
index efa4fe8e0e..c202594fe4 100644
--- a/app/views/layouts/bootcamp.haml
+++ b/app/views/layouts/bootcamp.haml
@@ -46,14 +46,6 @@
= javascript_include_tag('bootcamp', type: :module, crossorigin: :anonymous, 'data-turbo-track': 'reload', 'data-turbo-eval': false, defer: true)
%script{ defer: true, "data-domain": "bootcamp.exercism.org", src: "https://plausible.io/js/script.outbound-links.revenue.tagged-events.js" }
- %script{ async: true, "data-turbo-track": "reload", src: "https://www.googletagmanager.com/gtag/js?id=AW-303924066" }
- :javascript
- window.dataLayer = window.dataLayer || []
- function gtag() {
- dataLayer.push(arguments)
- }
- gtag('js', new Date())
- gtag('config', 'AW-303924066')
%title= content_for(:title) || "Bootcamp"
%meta{ content: "width=device-width,initial-scale=1", name: "viewport" }/
@@ -68,8 +60,6 @@
- url = "https://bootcamp.exercism.org"
- og_image_url = image_url('bootcamp/og.jpg')
- %link{ rel: "canonical", href: "https://bootcamp.exercism.org" }
-
%title= title
%meta{ name: "description", content: description }
%meta{ name: "viewport", content: "width=device-width, initial-scale=1, viewport-fit=cover" }
diff --git a/babel.config.js b/babel.config.js
index 953e4cae05..7e35c3133a 100644
--- a/babel.config.js
+++ b/babel.config.js
@@ -50,7 +50,6 @@ module.exports = function (api) {
plugins: [
'babel-plugin-macros',
'@babel/plugin-syntax-dynamic-import',
- isTestEnv && 'babel-plugin-dynamic-import-node',
'@babel/plugin-transform-destructuring',
[
'@babel/plugin-proposal-class-properties',
@@ -65,7 +64,7 @@ module.exports = function (api) {
},
],
[
- '@babel/plugin-proposal-object-rest-spread',
+ '@babel/plugin-transform-object-rest-spread',
{
useBuiltIns: true,
},
diff --git a/bootcamp_content/concepts/arrays.md b/bootcamp_content/concepts/arrays.md
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/bootcamp_content/concepts/conditionals.md b/bootcamp_content/concepts/conditionals.md
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/bootcamp_content/concepts/config.json b/bootcamp_content/concepts/config.json
new file mode 100644
index 0000000000..b4467ce259
--- /dev/null
+++ b/bootcamp_content/concepts/config.json
@@ -0,0 +1,63 @@
+[
+ {
+ "slug": "data-types",
+ "title": "Data Types",
+ "description": "Data types are a fundamental concept in programming. They are used to represent different types of data.",
+ "level": 1,
+ "apex": true
+ },
+ {
+ "slug": "strings",
+ "parent": "data-types",
+ "title": "Strings",
+ "description": "Strings are a fundamental concept in programming. They are used to represent text, words, and characters.",
+ "level": 1,
+ "apex": true
+ },
+ {
+ "slug": "strings-using",
+ "parent": "strings",
+ "title": "Using Strings",
+ "description": "Learn how to use strings in your code.",
+ "level": 1
+ },
+ {
+ "slug": "strings-concatenation",
+ "parent": "strings",
+ "title": "Concatenating Strings",
+ "description": "",
+ "level": 2
+ },
+ {
+ "slug": "functions",
+ "title": "Functions",
+ "description": "",
+ "level": 2,
+ "apex": true
+ },
+ {
+ "slug": "functions-using",
+ "parent": "functions",
+ "title": "Using Functions",
+ "description": "Learn how to use basic functions.",
+ "level": 1
+ },
+ {
+ "slug": "conditionals",
+ "title": "Conditionals",
+ "description": "",
+ "level": 2
+ },
+ {
+ "slug": "loops-repeat",
+ "title": "Repeat Loop",
+ "description": "",
+ "level": 3
+ },
+ {
+ "slug": "arrays",
+ "title": "Arrays",
+ "description": "",
+ "level": 4
+ }
+]
diff --git a/bootcamp_content/concepts/data-types.md b/bootcamp_content/concepts/data-types.md
new file mode 100644
index 0000000000..a15f20e1ee
--- /dev/null
+++ b/bootcamp_content/concepts/data-types.md
@@ -0,0 +1,8 @@
+# Data Types
+
+"Data" means the different values that we use in coding.
+There are different types of data ("data types").
+The most basic are things like numbers, booleans (true/false) or strings.
+And then we have data types that contain multiple different values like lists and dictionaries.
+
+Use the links below to build a comprehensive understanding of lots of different data types.
diff --git a/bootcamp_content/concepts/functions-using.md b/bootcamp_content/concepts/functions-using.md
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/bootcamp_content/concepts/functions.md b/bootcamp_content/concepts/functions.md
new file mode 100644
index 0000000000..ac78031d1b
--- /dev/null
+++ b/bootcamp_content/concepts/functions.md
@@ -0,0 +1,5 @@
+# Functions
+
+Functions are very important.
+
+Use the links below to build a comprehensive understanding of how they work.
diff --git a/bootcamp_content/concepts/loops-repeat.md b/bootcamp_content/concepts/loops-repeat.md
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/bootcamp_content/concepts/strings-concatenation.md b/bootcamp_content/concepts/strings-concatenation.md
new file mode 100644
index 0000000000..83ca8fa1ab
--- /dev/null
+++ b/bootcamp_content/concepts/strings-concatenation.md
@@ -0,0 +1,113 @@
+# Let’s Look at How We Can Join Strings Using Functions, Methods, and Operators
+
+Now that you know what strings are, let’s take it up a notch and explore how you can **combine strings**—a process often called **string concatenation**. It’s like putting puzzle pieces together to create a bigger picture, and there are plenty of ways to do it in programming.
+
+Ready? Let’s dive into the tools and techniques!
+
+---
+
+## 1. **Joining Strings with Operators**
+
+The simplest and most common way to join strings is by using an **operator**—specifically, the **`+` operator**. Think of it as gluing two or more strings together.
+
+### Example:
+
+```python
+greeting = "Hello, "
+name = "Alex"
+message = greeting + name
+print(message) # Output: Hello, Alex
+```
+
+Here, the + operator combines "Hello, " with "Alex" to form a single string: "Hello, Alex".
+
+Why Use It?
+
+• It’s straightforward and intuitive.
+• Great for small-scale operations.
+
+But keep in mind: most programming languages don’t automatically add spaces between strings. So if you need a space, include it yourself, like in "Hello, ".
+
+## 2. Using String Methods
+
+Strings come with built-in methods (kind of like tools), and one of the most useful for joining strings is .join().
+
+### Example:
+
+```python
+words = ["Learning", "to", "join", "strings", "is", "fun!"]
+sentence = " ".join(words)
+print(sentence) # Output: Learning to join strings is fun!
+```
+
+Here’s how .join() works:
+
+• Start with the separator (in this case, a single space: " ").
+• Use .join() to combine all the strings in the list (words) with the separator between them.
+
+Why Use .join()?
+
+• Perfect for combining multiple strings in a list or array.
+• Allows you to control how strings are joined (e.g., with commas, spaces, or even dashes).
+
+## 3. String Formatting and f-Strings
+
+Sometimes, you don’t just want to join strings—you want to insert variables or values into them. This is where string formatting shines. There are a few ways to do this, depending on the programming language, but let’s focus on f-strings (Python’s modern and super-convenient approach).
+
+### Example:
+
+```python
+name = "Alex"
+age = 25
+message = f"My name is {name} and I am {age} years old."
+print(message) # Output: My name is Alex and I am 25 years old.
+```
+
+Here, the f before the string lets you embed variables directly inside {}. It’s quick, readable, and avoids a lot of extra concatenation work.
+
+Why Use It?
+
+• Ideal for creating strings with dynamic content.
+• Clean and easy to read.
+
+## 4. Using Functions
+
+If you find yourself joining strings repeatedly in the same way, why not write a function to handle it? Functions let you encapsulate logic and reuse it whenever you need.
+
+### Example:
+
+```python
+def create_greeting(first_name, last_name):
+ return f"Hello, {first_name} {last_name}!"
+
+greeting = create_greeting("Alex", "Smith")
+print(greeting) # Output: Hello, Alex Smith!
+```
+
+By using a function, you can organize your code and make it reusable. Plus, it keeps things neat when working on larger projects.
+
+## 5. Combining Techniques
+
+You’re not limited to just one method—you can mix and match techniques depending on the situation.
+
+### Example:
+
+```python
+names = ["Alice", "Bob", "Charlie"]
+greeting = "Welcome, " + ", ".join(names) + "!"
+print(greeting) # Output: Welcome, Alice, Bob, Charlie!
+```
+
+Here, we combined the + operator and .join() to create a dynamic and friendly message.
+
+Key Tips for Joining Strings
+
+• Pay attention to spaces: Strings don’t magically add spaces, so you’ll need to include them manually or use methods like .join() thoughtfully.
+• Use the right tool for the job: For simple tasks, + works great. For more complex scenarios, consider .join(), formatting, or functions.
+• Readability matters: Clear, easy-to-read code is always better, especially when working with others.
+
+## Wrapping Up
+
+Joining strings might seem simple, but it’s a fundamental skill that unlocks countless possibilities in programming. Whether you’re displaying a message, building a URL, or generating dynamic content, knowing how to combine strings effectively is key.
+
+Now it’s your turn! Try experimenting with the methods we’ve covered and see how creative you can get. Who knew strings could be so fun?
diff --git a/bootcamp_content/concepts/strings-using.md b/bootcamp_content/concepts/strings-using.md
new file mode 100644
index 0000000000..64c4a116be
--- /dev/null
+++ b/bootcamp_content/concepts/strings-using.md
@@ -0,0 +1,46 @@
+# Introduction to Strings
+
+Let’s talk about one of the most fundamental concepts in programming: **strings**. And no, we’re not talking about the strings on a guitar or a piece of thread! In the world of coding, strings are all about text—words, sentences, symbols, even a single character.
+
+## What is a String?
+
+Imagine you’re writing a sentence, like _"Hello, world!"_. That entire piece of text is a string in programming. Essentially, a string is a sequence of characters grouped together. Characters could be letters, numbers, punctuation marks, or even spaces.
+
+Here’s the best part: strings are everywhere. They’re the text in a website button that says “Click me.” They’re the labels on a shopping app that show product names. They’re even the messages you send to your friends. If it’s text, it’s probably a string in disguise.
+
+## Strings in Everyday Life
+
+Think of strings as the digital equivalent of sticky notes. You can write anything on them: a name, a password, or even a silly joke. Once you’ve got a string, you can save it, modify it, and use it in all sorts of creative ways.
+
+For example:
+
+- A string might store your name: `"Alex"`
+- It could hold a question: `"How are you?"`
+- Or even act as a secret code: `"xyz123"`
+
+Strings help computers work with text just like you do, but they need clear instructions. That’s where you—the programmer—come in.
+
+## Fun Facts About Strings
+
+1. **Strings are “quoted.”** In most programming languages, strings are wrapped in quotes so the computer knows where the text begins and ends. For example:
+
+ - `"I love coding!"` (double quotes)
+ - `'Single quotes work too!'`
+
+2. **Strings can be long or short.** A string could be one letter, like `"A"`, or an entire book’s worth of text!
+
+3. **You can manipulate strings.** Want to shout your message? You can convert `"hello"` to `"HELLO"`. Need to count how many letters are in a word? Strings can help with that too.
+
+4. **They’re versatile.** Strings can include emojis, special characters, and even numbers, like `"🎉 Party starts at 7pm!"`.
+
+## Why Strings Matter
+
+Strings make programs feel alive. Imagine a calculator without any labels, or a game without dialogue—it’d be impossible to use! Strings make apps and websites readable and user-friendly.
+
+As a beginner in programming, working with strings is one of the first ways you’ll interact with your code. You’ll practice printing text, combining strings, and even creating fun outputs like `"Hello, [Your Name]!"`.
+
+## Let’s Wrap This Up
+
+Strings might sound simple, but they’re incredibly powerful. They’re how you give your program a voice—whether it’s to say “Welcome!” or “Error: Something went wrong.” As you dive deeper into coding, you’ll see just how versatile and essential strings really are.
+
+Now, go ahead and say it: _"I’m ready to learn strings!"_
diff --git a/bootcamp_content/concepts/strings.md b/bootcamp_content/concepts/strings.md
new file mode 100644
index 0000000000..6403103cb6
--- /dev/null
+++ b/bootcamp_content/concepts/strings.md
@@ -0,0 +1,5 @@
+# Strings
+
+Strings are one of the most common and fundamental data types.
+
+Use the links below to build a comprehensive understanding of how they work.
diff --git a/bootcamp_content/exploration/maze/index.html b/bootcamp_content/exploration/maze/index.html
new file mode 100644
index 0000000000..dd536e4823
--- /dev/null
+++ b/bootcamp_content/exploration/maze/index.html
@@ -0,0 +1,15 @@
+
+
+
+
+
+ Maze Game
+
+
+
+
+
+
+
+
+
diff --git a/bootcamp_content/exploration/maze/script.js b/bootcamp_content/exploration/maze/script.js
new file mode 100644
index 0000000000..c803d34c33
--- /dev/null
+++ b/bootcamp_content/exploration/maze/script.js
@@ -0,0 +1,164 @@
+const maze = document.getElementById('maze')
+
+// Maze configuration: 0 = open, 1 = blocked
+let mazeLayout
+let characterPosition
+let direction
+
+function createMaze() {
+ maze.innerHTML = ''
+ maze.style.setProperty('--size', mazeLayout.length)
+
+ for (let y = 0; y < mazeLayout.length; y++) {
+ for (let x = 0; x < mazeLayout[y].length; x++) {
+ const cell = document.createElement('div')
+ cell.classList.add('cell')
+ if (mazeLayout[y][x] === 1) {
+ cell.classList.add('blocked')
+ }
+ if (x === characterPosition.x && y === characterPosition.y) {
+ const character = document.createElement('div')
+ character.classList.add('character')
+ character.classList.add('direction-' + direction)
+ cell.appendChild(character)
+ }
+ maze.appendChild(cell)
+ }
+ }
+}
+
+function moveCharacter(dx, dy) {
+ const newX = characterPosition.x + dx
+ const newY = characterPosition.y + dy
+ if (
+ newX >= 0 &&
+ newX < mazeLayout[0].length &&
+ newY >= 0 &&
+ newY < mazeLayout.length &&
+ mazeLayout[newY][newX] === 0
+ ) {
+ characterPosition.x = newX
+ characterPosition.y = newY
+ createMaze()
+ }
+}
+
+document.addEventListener('keydown', (e) => {
+ switch (e.key) {
+ case 'ArrowUp':
+ moveCharacter(0, -1)
+ break
+ case 'ArrowDown':
+ moveCharacter(0, 1)
+ break
+ case 'ArrowLeft':
+ moveCharacter(-1, 0)
+ break
+ case 'ArrowRight':
+ moveCharacter(1, 0)
+ break
+ }
+})
+function move() {
+ if (direction == 'up') {
+ moveCharacter(0, -1)
+ } else if (direction == 'down') {
+ moveCharacter(0, 1)
+ } else if (direction == 'right') {
+ moveCharacter(1, 0)
+ } else if (direction == 'left') {
+ moveCharacter(-1, 0)
+ }
+}
+
+function turn_left() {
+ if (direction == 'up') {
+ direction = 'left'
+ } else if (direction == 'down') {
+ direction = 'right'
+ } else if (direction == 'right') {
+ direction = 'up'
+ } else if (direction == 'left') {
+ direction = 'down'
+ }
+ createMaze()
+}
+
+function turn_right() {
+ if (direction == 'up') {
+ direction = 'right'
+ } else if (direction == 'down') {
+ direction = 'left'
+ } else if (direction == 'right') {
+ direction = 'down'
+ } else if (direction == 'left') {
+ direction = 'up'
+ }
+ createMaze()
+}
+
+instructions = [
+ move,
+ move,
+ turn_left,
+ move,
+ move,
+ turn_left,
+ move,
+ move,
+ turn_right,
+ move,
+]
+/*for (let i = 0; i < instructions.length; i++) {
+ setTimeout(instructions[i], i * 100)
+} */
+
+function gameLoop() {
+ const instruction = instructions.shift()
+ if (!instruction) {
+ return
+ }
+ instruction()
+ setTimeout(gameLoop, 100)
+}
+
+function setupDefault() {
+ mazeLayout = [
+ [0, 1, 0, 0, 0, 1, 0, 0, 0, 0],
+ [0, 1, 0, 1, 0, 1, 1, 1, 0, 1],
+ [0, 0, 0, 1, 0, 0, 0, 0, 0, 1],
+ [0, 1, 1, 1, 0, 1, 1, 1, 0, 1],
+ [0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
+ [1, 1, 1, 1, 0, 1, 1, 1, 1, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 1, 1, 1, 1, 1, 1, 1, 0, 1],
+ [0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
+ [1, 1, 1, 1, 1, 1, 0, 1, 0, 0],
+ ]
+
+ characterPosition = { x: 0, y: 0 }
+ direction = 'down'
+}
+
+function setupGrid(layout) {
+ mazeLayout = layout
+}
+function setupDirection(dir) {
+ direction = dir
+}
+function setupPosition(x, y) {
+ characterPosition = { x: x, y: y }
+}
+
+// This is what we want to call for an exercise where we're testing
+// the code runs as expected.
+setupDefault()
+createMaze()
+gameLoop()
+
+// setupGrid([[0,0,0],[0,0,0],[0,0,0]]);
+// setupDirection("up")
+// setupPosition(1,1)
+
+// move()
+console.log(characterPosition)
diff --git a/bootcamp_content/exploration/maze/style.css b/bootcamp_content/exploration/maze/style.css
new file mode 100644
index 0000000000..f0ab60ce46
--- /dev/null
+++ b/bootcamp_content/exploration/maze/style.css
@@ -0,0 +1,70 @@
+body {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 100vh;
+ background-color: #f4f4f4;
+ margin: 0;
+
+ --cellWidth: 20px;
+}
+
+#maze {
+ display: grid;
+ grid-template-columns: repeat(var(--size), var(--cellWidth));
+ grid-template-rows: repeat(var(--size), var(--cellWidth));
+ gap: 0px;
+}
+
+.cell {
+ width: var(--cellWidth);
+ height: var(--cellWidth);
+ background-color: white;
+ border: 0.5px solid #000;
+}
+
+.cell.blocked {
+ background-color: red;
+}
+
+.character {
+ width: calc(var(--cellWidth) / 2);
+ height: calc(var(--cellWidth) / 2);
+ background-color: lightblue;
+ border: 1px solid green;
+ border-radius: 50%;
+ position: relative;
+ left: calc(var(--cellWidth) / 5);
+ top: calc(var(--cellWidth) / 5);
+}
+.direction-up {
+ transform: rotate(0deg);
+}
+.direction-right {
+ transform: rotate(-90deg);
+}
+.direction-down {
+ transform: rotate(180deg);
+}
+.direction-right {
+ transform: rotate(90deg);
+}
+
+.character::before,
+.character::after {
+ content: "";
+ position: absolute;
+ width: calc(var(--cellWidth) / 4);
+ height: calc(var(--cellWidth) / 4);
+ background-color: green;
+ border-radius: 50%;
+ bottom: 8px;
+}
+
+.character::before {
+ left: 6px;
+}
+
+.character::after {
+ right: 6px;
+}
diff --git a/bootcamp_content/levels/1.md b/bootcamp_content/levels/1.md
new file mode 100644
index 0000000000..6969ca68ef
--- /dev/null
+++ b/bootcamp_content/levels/1.md
@@ -0,0 +1,34 @@
+# Level 1
+
+## About Levels
+
+Welcome to Level One!
+
+Levels are the core of your learning experience on this Bootcamp.
+
+Each week we'll unlock a new level, with new concepts to learn and exercises to solve. Our teaching sessions appear here for you to watch live, and then stay for you to watch back on demand.
+
+I strongly recommend finishing all of the exercises on a level before moving onto the next one.
+However, if you get really stuck on one exercise, you might still like to continue on in the next level while waiting for help.
+If you feel like a level is too easy, then it shouldn't take you any time at all to solve the exercises within it, so use that for practice anyway.
+
+### How to Complete a Level
+
+To complete a level, you need to solve all the exercises on the right hand side.
+
+## Your first steps
+
+This week largely revolves around drawing using code.
+The objective is for you to be able to draw fun things without feeling like you've having to think too hard about getting the right syntax (ie what to write where).
+Your drawing ability should be what limits you - not your coding ability!
+
+We have students on this Bootcamp with a wide range of experience-levels, from total beginners to people in full-time dev jobs.
+
+For those just starting out, this first week will contain lots of new information and thinking for you to absorb.
+The most important thing is to take your time and build confidence.
+
+For those who are experienced, these first few weeks will feel familiar and probably quite easy.
+But I strongly advise you to still watch the videos and explore the mental models I'm building, as they will be different from the way you've approached things before.
+
+Most of all, have fun!
+And we'll dig into some more interesting things at Level 2!
diff --git a/bootcamp_content/levels/2.md b/bootcamp_content/levels/2.md
new file mode 100644
index 0000000000..6a13d568e1
--- /dev/null
+++ b/bootcamp_content/levels/2.md
@@ -0,0 +1,7 @@
+# Level 2
+
+Welcome to Level 2!
+
+Last week we touched on the absolute basics of coding - using functions. Hopefully you had lots of fun testing your drawing abilities, and getting creative.
+
+In Level 2, we're going to build on what we learned last week, and look at when code moves beyond a linear list of commands, exploring loops, conditionals, variables, and writing our own functions. This is the most full content-rich week of the whole Bootcamp, and we'll cover quite a lot of ground, so take it slowly and make sure you understand each part thoroughly.
diff --git a/bootcamp_content/levels/3.md b/bootcamp_content/levels/3.md
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/bootcamp_content/levels/4.md b/bootcamp_content/levels/4.md
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/bootcamp_content/levels/config.json b/bootcamp_content/levels/config.json
new file mode 100644
index 0000000000..32912b63a9
--- /dev/null
+++ b/bootcamp_content/levels/config.json
@@ -0,0 +1,18 @@
+[
+ {
+ "title": "Writing your first code",
+ "description": "Learn how to write your first lines of code"
+ },
+ {
+ "title": "Conditionals and Returns",
+ "description": ""
+ },
+ {
+ "title": "Loops",
+ "description": ""
+ },
+ {
+ "title": "Arrays",
+ "description": ""
+ }
+]
diff --git a/bootcamp_content/projects/drawing/config.json b/bootcamp_content/projects/drawing/config.json
new file mode 100644
index 0000000000..1edd49ec65
--- /dev/null
+++ b/bootcamp_content/projects/drawing/config.json
@@ -0,0 +1,6 @@
+{
+ "slug": "drawing",
+ "title": "Drawing",
+ "description": "The world of drawing",
+ "exercises": ["jumbled-house", "loops"]
+}
diff --git a/bootcamp_content/projects/drawing/exercises/jumbled-house/config.json b/bootcamp_content/projects/drawing/exercises/jumbled-house/config.json
new file mode 100644
index 0000000000..1495979985
--- /dev/null
+++ b/bootcamp_content/projects/drawing/exercises/jumbled-house/config.json
@@ -0,0 +1,96 @@
+{
+ "title": "Jumbled House",
+ "description": "Unjumble the shapes into a house",
+ "project_type": "draw",
+ "level": 1,
+ "concepts": [],
+ "tests_type": "state",
+ "readonly_ranges": [
+ { "from": 1, "to": 10 },
+ { "from": 12, "to": 14 },
+ { "from": 16, "to": 18 },
+ { "from": 20, "to": 22 },
+ { "from": 24, "to": 26 },
+ { "from": 28, "to": 30 }
+ ],
+ "tasks": [
+ {
+ "name": "Position the frame of house",
+ "tests": [
+ {
+ "slug": "position-frame",
+ "name": "Position the frame of the house.",
+ "function": "main",
+ "checks": [
+ {
+ "name": "getRectangleAt(20,50,60,40)",
+ "matcher": "toExist",
+ "error_html": "The frame of the house is not at (20,50,60,40)."
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Position the roof of house",
+ "tests": [
+ {
+ "slug": "position-roof",
+ "name": "Position the roof of the house.",
+ "function": "main",
+ "checks": [
+ {
+ "name": "getTriangleAt(16,50, 50,30, 84,50)",
+ "matcher": "toExist",
+ "error_html": "The roof of the house is not at the correct position."
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Position the windows",
+ "tests": [
+ {
+ "slug": "position-windows",
+ "name": "Position the windows of the house.",
+ "function": "main",
+ "checks": [
+ {
+ "name": "getRectangleAt(30,55,12,13)",
+ "matcher": "toExist",
+ "error_html": "The left window frame isn't positioned correctly"
+ },
+ {
+ "name": "getRectangleAt(58,55,12,13)",
+ "matcher": "toExist",
+ "error_html": "The right window frame isn't positioned correctly"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Position the door",
+ "tests": [
+ {
+ "slug": "position-door",
+ "name": "Position the door",
+ "function": "main",
+ "checks": [
+ {
+ "name": "getRectangleAt(43,72,14,18)",
+ "matcher": "toExist",
+ "error_html": "The door frame isn't positioned correctly"
+ },
+ {
+ "name": "getCircleAt(55,81,1)",
+ "matcher": "toExist",
+ "error_html": "The door knob isn't positiioned correctly"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/bootcamp_content/projects/drawing/exercises/jumbled-house/example.jiki b/bootcamp_content/projects/drawing/exercises/jumbled-house/example.jiki
new file mode 100644
index 0000000000..2c74a35e75
--- /dev/null
+++ b/bootcamp_content/projects/drawing/exercises/jumbled-house/example.jiki
@@ -0,0 +1,31 @@
+// The sky
+change_fill_color("#add8e6")
+rectangle(0,0,100,100)
+
+// The grass
+change_fill_color("#3cb372")
+rectangle(0,80,100,100)
+
+// The frame of the house
+change_fill_color("#f0985b")
+rectangle(20,50,60,40)
+
+// The roof
+change_fill_color("#8b4513")
+triangle(16,50, 50,30, 84,50)
+
+// The left window
+change_fill_color("#FFFFFF")
+rectangle(30,55,12,13)
+
+// The second window
+change_fill_color("#FFFFFF")
+rectangle(58,55,12,13)
+
+// The door
+change_fill_color("#A0512D")
+rectangle(43,72,14,18)
+
+// The door knob
+change_fill_color("#FFDF00")
+circle(55,81,1)
\ No newline at end of file
diff --git a/bootcamp_content/projects/drawing/exercises/jumbled-house/introduction.md b/bootcamp_content/projects/drawing/exercises/jumbled-house/introduction.md
new file mode 100644
index 0000000000..4ccc1960e7
--- /dev/null
+++ b/bootcamp_content/projects/drawing/exercises/jumbled-house/introduction.md
@@ -0,0 +1,6 @@
+# Jumbled House
+
+- The frame of the house (the big square) should be 60 wide, 40 height, and have it's top-left corner at 20,50.
+- The roof should overlap the house by 4 on each side, and have a height of 20.
+- The windows have a width of 12 and a height of 13. They sit 10 from the edges, and 5 from the top.
+- The door is 14 wide and 18 tall, and sits at the bottom of the house in the center. The little door knob has a radius of 1, is inset 1 from the right, and is vertically centered in the door.
diff --git a/bootcamp_content/projects/drawing/exercises/jumbled-house/stub.jiki b/bootcamp_content/projects/drawing/exercises/jumbled-house/stub.jiki
new file mode 100644
index 0000000000..ab5ade5bec
--- /dev/null
+++ b/bootcamp_content/projects/drawing/exercises/jumbled-house/stub.jiki
@@ -0,0 +1,31 @@
+// The sky
+change_fill_color("#add8e6")
+rectangle(0,0,100,100)
+
+// The grass
+change_fill_color("#3cb372")
+rectangle(0,80,100,100)
+
+// The frame of the house
+change_fill_color("#F08080")
+rectangle(10,20,60,40)
+
+// The roof
+change_fill_color("#8b4513")
+triangle(26,90, 60,70, 94,90)
+
+// The left window
+change_fill_color("#FFFFFF")
+rectangle(10,15,12,13)
+
+// The second window
+change_fill_color("#FFFFFF")
+rectangle(18,85,12,13)
+
+// The door
+change_fill_color("#A0512D")
+rectangle(83,12,14,18)
+
+// The door knob
+change_fill_color("#FFDF00")
+circle(95,21,1)
\ No newline at end of file
diff --git a/bootcamp_content/projects/drawing/exercises/jumbled-house/task-1.md b/bootcamp_content/projects/drawing/exercises/jumbled-house/task-1.md
new file mode 100644
index 0000000000..9037ae965a
--- /dev/null
+++ b/bootcamp_content/projects/drawing/exercises/jumbled-house/task-1.md
@@ -0,0 +1 @@
+Move the frame of the house, so that it's bottom left coordinate is at (20,40). It's size is already set correctly at a width of 60 and a height of 50.
diff --git a/bootcamp_content/projects/drawing/exercises/jumbled-house/task-2.md b/bootcamp_content/projects/drawing/exercises/jumbled-house/task-2.md
new file mode 100644
index 0000000000..fa820e237d
--- /dev/null
+++ b/bootcamp_content/projects/drawing/exercises/jumbled-house/task-2.md
@@ -0,0 +1 @@
+Now position the roof. It should overlap the house by 4 on each side, and have a height of 20.
diff --git a/bootcamp_content/projects/drawing/exercises/jumbled-house/task-3.md b/bootcamp_content/projects/drawing/exercises/jumbled-house/task-3.md
new file mode 100644
index 0000000000..4e69e73a74
--- /dev/null
+++ b/bootcamp_content/projects/drawing/exercises/jumbled-house/task-3.md
@@ -0,0 +1,3 @@
+Now position the windows.
+
+Both are the same size (width of 12, height of 13). They sit 10 from the left and right edges of the house, and 5 from where the roof meets the house.
diff --git a/bootcamp_content/projects/drawing/exercises/jumbled-house/task-4.md b/bootcamp_content/projects/drawing/exercises/jumbled-house/task-4.md
new file mode 100644
index 0000000000..0d527e8528
--- /dev/null
+++ b/bootcamp_content/projects/drawing/exercises/jumbled-house/task-4.md
@@ -0,0 +1 @@
+Finally position the door.
diff --git a/bootcamp_content/projects/drawing/exercises/loops/config.json b/bootcamp_content/projects/drawing/exercises/loops/config.json
new file mode 100644
index 0000000000..990a2984f1
--- /dev/null
+++ b/bootcamp_content/projects/drawing/exercises/loops/config.json
@@ -0,0 +1,53 @@
+{
+ "title": "Loops",
+ "description": "Create 5 rectangles",
+ "project_type": "draw",
+ "level": 3,
+ "concepts": ["loops-repeat"],
+ "tests_type": "state",
+ "interpreter_options": {
+ "repeat_delay": 100
+ },
+ "tasks": [
+ {
+ "name": "Draw 4 rectangles",
+ "tests": [
+ {
+ "slug": "4-rectangles-20-20",
+ "name": "Draw 4 rectangles",
+ "function": "main",
+ "checks": [
+ {
+ "name": "numElements()",
+ "value": 4,
+ "error_html": "Expected 4 rectangles to be drawn, but only got %actual%."
+ },
+ {
+ "name": "getRectAt(20,20,20,20)",
+ "matcher": "toExist",
+ "error_html": "No rectangle at (20,20,20,20)"
+ }
+ ]
+ },
+ {
+ "slug": "4-rectangles-40-40",
+ "name": "Draw 4 rectangles x2",
+ "description": "Draw 4 rectangles at (40,40,20,20)",
+ "function": "main",
+ "checks": [
+ {
+ "name": "numElements()",
+ "value": 4,
+ "error_html": "Expected 4 rectangles to be drawn, but only got %actual%."
+ },
+ {
+ "name": "getRectAt(40,40,20,20)",
+ "matcher": "toExist",
+ "error_html": "We couldn't find a rectangle at (40,40,20,20). Check that you've got the co-ordinates, width and height all correct and try again!"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/bootcamp_content/projects/drawing/exercises/loops/example.jiki b/bootcamp_content/projects/drawing/exercises/loops/example.jiki
new file mode 100644
index 0000000000..802eb8f278
--- /dev/null
+++ b/bootcamp_content/projects/drawing/exercises/loops/example.jiki
@@ -0,0 +1,7 @@
+function two_fer with name do
+ if name is "" do
+ return "One for you, one for me."
+ else do
+ return "One for " + name + ", one for me."
+ end
+end
diff --git a/bootcamp_content/projects/drawing/exercises/loops/introduction.md b/bootcamp_content/projects/drawing/exercises/loops/introduction.md
new file mode 100644
index 0000000000..a8c9ace4f3
--- /dev/null
+++ b/bootcamp_content/projects/drawing/exercises/loops/introduction.md
@@ -0,0 +1,15 @@
+# TwoFer Part 1
+
+Two Fer is a classic Exercism exercise.
+Through it, we'll explore a few ideas around using _Strings_ and _Conditionals_.
+
+In some English accents, when you say "two for" quickly, it sounds like "two fer". Two-for-one is a way of saying that if you buy one, you also get one for free. So the phrase "two-fer" often implies a two-for-one offer.
+
+Imagine a bakery that has a holiday offer where you can buy two cookies for the price of one ("two-fer one!"). You take the offer and (very generously) decide to give the extra cookie to someone else in the queue.
+
+As you give them the cookie, you one of two things.
+
+- If you know their name, you say: "One for <name>, one for me."
+- If you don't know their name, you say: "One for you, one for me."
+
+For example, you might say "One for Jeremy, one for me" if you know Jeremy's name.
diff --git a/bootcamp_content/projects/drawing/exercises/loops/stub.jiki b/bootcamp_content/projects/drawing/exercises/loops/stub.jiki
new file mode 100644
index 0000000000..20a0e40b8a
--- /dev/null
+++ b/bootcamp_content/projects/drawing/exercises/loops/stub.jiki
@@ -0,0 +1,4 @@
+rect(rand(0,10),10,10,10)
+rect(rand(0,80),10,10,10)
+rect(rand(0,80),10,10,10)
+rect(rand(0,80),10,10,10)
\ No newline at end of file
diff --git a/bootcamp_content/projects/drawing/exercises/loops/task-1.md b/bootcamp_content/projects/drawing/exercises/loops/task-1.md
new file mode 100644
index 0000000000..1b03934503
--- /dev/null
+++ b/bootcamp_content/projects/drawing/exercises/loops/task-1.md
@@ -0,0 +1,5 @@
+We've given you a function skeleton that takes one input - `name`.
+
+It will either be an empty string (`""`) or it will be someone's name (`"Jeremy"`).
+
+Let's start off by just considering that empty version and always returning our default version `"One for me, one for you."`.
diff --git a/bootcamp_content/projects/drawing/exercises/loops/task-2.md b/bootcamp_content/projects/drawing/exercises/loops/task-2.md
new file mode 100644
index 0000000000..2a597efd6a
--- /dev/null
+++ b/bootcamp_content/projects/drawing/exercises/loops/task-2.md
@@ -0,0 +1,7 @@
+Nice work!
+
+Now we need to handle the situation where we **do** know the person's name.
+
+Sometime's the name will be empty (`""`) in which case we want to continue returning `"One for you, one for me."`, but other times `name` will contain a name, in which case we want to include it in the return value (e.g. `"One for Jeremy, one for me."`).
+
+Remember, you can join multiple strings together using the `join_strings(...)` function.
diff --git a/bootcamp_content/projects/drawing/introduction.md b/bootcamp_content/projects/drawing/introduction.md
new file mode 100644
index 0000000000..e320953428
--- /dev/null
+++ b/bootcamp_content/projects/drawing/introduction.md
@@ -0,0 +1,5 @@
+# Two Fer
+
+## Overview
+
+With a little bit of code, you can create almost any drawing.
diff --git a/bootcamp_content/projects/drawing/tree.jiki b/bootcamp_content/projects/drawing/tree.jiki
new file mode 100644
index 0000000000..342ca5fe90
--- /dev/null
+++ b/bootcamp_content/projects/drawing/tree.jiki
@@ -0,0 +1,14 @@
+
+change_fill_color("#aa95aa")
+rect(13,28,13,50)
+change_fill_color("#33ff33")
+change_pen_color("#33ff33")
+circle(4,5,8)
+circle(17,5,8)
+circle(10,10,10)
+circle(19,19,8)
+circle(4,16,8)
+
+change_pen_color("#885588")
+change_fill_color("#885588")
+circle(15.5,40,3.8)
\ No newline at end of file
diff --git a/bootcamp_content/projects/maze/config.json b/bootcamp_content/projects/maze/config.json
new file mode 100644
index 0000000000..28339524da
--- /dev/null
+++ b/bootcamp_content/projects/maze/config.json
@@ -0,0 +1,6 @@
+{
+ "slug": "maze",
+ "title": "Maze",
+ "description": "Use then implement a basic maze",
+ "exercises": ["manual-solve", "automated-solve"]
+}
diff --git a/bootcamp_content/projects/maze/exercises/automated-solve/config.json b/bootcamp_content/projects/maze/exercises/automated-solve/config.json
new file mode 100644
index 0000000000..07435d2f26
--- /dev/null
+++ b/bootcamp_content/projects/maze/exercises/automated-solve/config.json
@@ -0,0 +1,222 @@
+{
+ "title": "Programatically solve a maze",
+ "description": "Programatically solve a maze",
+ "level": 2,
+ "concepts": ["Conditionals", "loops-repeat"],
+ "project_type": "maze",
+ "tests_type": "state",
+ "available_functions": ["move", "turnLeft", "turnRight", "canMove"],
+ "tasks": [
+ {
+ "name": "A straight path",
+ "tests": [
+ {
+ "slug": "maze-1",
+ "name": "Guide person to the end of the maze",
+ "setup_functions": [
+ [
+ "setupGrid",
+ [
+ [
+ [1, 1, 1, 1, 2, 1, 1],
+ [1, 1, 1, 1, 0, 1, 1],
+ [1, 1, 1, 1, 0, 1, 1],
+ [1, 1, 1, 1, 0, 1, 1],
+ [1, 1, 1, 1, 0, 1, 1],
+ [1, 1, 1, 1, 0, 1, 1],
+ [1, 1, 1, 1, 3, 1, 1]
+ ]
+ ]
+ ],
+ ["setupDirection", ["down"]],
+ ["setupPosition", [4, 0]]
+ ],
+ "checks": [
+ {
+ "name": "position",
+ "value": [4, 6],
+ "error_html": "Your position should be 4, 6, but it's %actual% ."
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Turn left if you can't move straight",
+ "tests": [
+ {
+ "slug": "left-turn",
+ "name": "A single left turn",
+ "setup_functions": [
+ [
+ "setupGrid",
+ [
+ [
+ [2, 1, 1, 1, 1, 1, 1, 1, 1],
+ [0, 1, 1, 1, 1, 1, 1, 1, 1],
+ [0, 1, 1, 1, 1, 1, 1, 1, 1],
+ [0, 1, 1, 1, 1, 1, 1, 1, 1],
+ [0, 1, 1, 1, 1, 1, 1, 1, 1],
+ [0, 0, 0, 0, 0, 0, 0, 0, 3],
+ [1, 1, 1, 1, 1, 1, 1, 1, 1],
+ [1, 1, 1, 1, 1, 1, 1, 1, 1],
+ [1, 1, 1, 1, 1, 1, 1, 1, 1]
+ ]
+ ]
+ ],
+ ["setupDirection", ["down"]],
+ ["setupPosition", [0, 1]]
+ ],
+ "checks": [
+ {
+ "name": "position",
+ "value": [8, 5],
+ "error_html": "Your position should be 8, 5, but it's %actual% ."
+ },
+ {
+ "name": "direction",
+ "value": "right"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Turn right if you can't move straight or left",
+ "tests": [
+ {
+ "slug": "right-turn",
+ "name": "A single right turn",
+ "setup_functions": [
+ [
+ "setupGrid",
+ [
+ [
+ [1, 1, 1, 1, 1, 1, 1, 1, 2],
+ [1, 1, 1, 1, 1, 1, 1, 1, 0],
+ [1, 1, 1, 1, 1, 1, 1, 1, 0],
+ [1, 1, 1, 1, 1, 1, 1, 1, 0],
+ [1, 1, 1, 1, 1, 1, 1, 1, 0],
+ [3, 0, 0, 0, 0, 0, 0, 0, 0],
+ [1, 1, 1, 1, 1, 1, 1, 1, 1],
+ [1, 1, 1, 1, 1, 1, 1, 1, 1],
+ [1, 1, 1, 1, 1, 1, 1, 1, 1]
+ ]
+ ]
+ ],
+ ["setupDirection", ["down"]],
+ ["setupPosition", [8, 0]]
+ ],
+ "checks": [
+ {
+ "name": "position",
+ "value": [0, 5],
+ "error_html": "Your position should be 0, 5, but it's %actual%."
+ }
+ ]
+ },
+ {
+ "slug": "forks",
+ "name": "Choose left if you can, otherwise choose right",
+ "setup_functions": [
+ [
+ "setupGrid",
+ [
+ [
+ [2, 1, 1, 1, 1, 1, 1, 1, 1],
+ [0, 1, 1, 1, 1, 1, 1, 1, 1],
+ [0, 1, 1, 1, 0, 0, 0, 0, 3],
+ [0, 1, 1, 1, 0, 1, 1, 1, 1],
+ [0, 1, 1, 1, 0, 1, 1, 1, 1],
+ [0, 0, 0, 0, 0, 1, 1, 1, 1],
+ [1, 1, 1, 1, 4, 1, 1, 1, 1],
+ [1, 1, 1, 1, 0, 1, 1, 1, 1],
+ [1, 1, 1, 1, 0, 1, 1, 1, 1]
+ ]
+ ]
+ ],
+ ["setupDirection", ["down"]],
+ ["setupPosition", [0, 0]]
+ ],
+ "function": "solve_maze",
+ "checks": [
+ {
+ "name": "position",
+ "value": [8, 2],
+ "error_html": "Your position should be 8, 2, but it's %actual%."
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Turn around if needed",
+ "tests": [
+ {
+ "slug": "turn-around",
+ "name": "Turn around if you can't move straight, left, or right",
+ "setup_functions": [
+ [
+ "setupGrid",
+ [
+ [
+ [1, 1, 1, 2, 1, 1, 1, 1, 1],
+ [1, 1, 1, 0, 1, 1, 1, 1, 1],
+ [1, 1, 1, 0, 1, 1, 1, 1, 1],
+ [1, 1, 1, 0, 1, 1, 0, 1, 1],
+ [1, 1, 1, 0, 1, 1, 0, 1, 1],
+ [1, 1, 4, 0, 0, 0, 0, 0, 1],
+ [1, 1, 1, 0, 1, 1, 1, 1, 1],
+ [3, 0, 0, 0, 1, 1, 1, 1, 1],
+ [1, 1, 1, 0, 1, 1, 1, 1, 1]
+ ]
+ ]
+ ],
+ ["setupDirection", ["down"]],
+ ["setupPosition", [3, 0]]
+ ],
+ "function": "solve_maze",
+ "checks": [
+ {
+ "name": "position",
+ "value": [0, 7],
+ "error_html": "Your position should be 0, 7, but it's %actual%."
+ }
+ ]
+ },
+ {
+ "slug": "forks-2",
+ "name": "Choose right if you can, otherwise choose left",
+ "setup_functions": [
+ [
+ "setupGrid",
+ [
+ [
+ [2, 1, 1, 1, 1, 1, 1, 1, 1],
+ [0, 1, 1, 1, 1, 1, 1, 1, 1],
+ [0, 1, 1, 1, 0, 0, 0, 0, 1],
+ [0, 1, 1, 1, 0, 1, 1, 1, 1],
+ [0, 1, 1, 1, 4, 1, 1, 1, 1],
+ [0, 0, 0, 0, 0, 1, 1, 1, 1],
+ [1, 1, 1, 1, 0, 1, 1, 1, 1],
+ [1, 1, 1, 1, 0, 1, 1, 1, 1],
+ [1, 1, 1, 1, 3, 1, 1, 1, 1]
+ ]
+ ]
+ ],
+ ["setupDirection", ["down"]],
+ ["setupPosition", [0, 0]]
+ ],
+ "function": "solve_maze",
+ "checks": [
+ {
+ "name": "position",
+ "value": [4, 8],
+ "error_html": "Your position should be 4, 8, but it's %actual%."
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/bootcamp_content/projects/maze/exercises/automated-solve/example.jiki b/bootcamp_content/projects/maze/exercises/automated-solve/example.jiki
new file mode 100644
index 0000000000..c22af95a40
--- /dev/null
+++ b/bootcamp_content/projects/maze/exercises/automated-solve/example.jiki
@@ -0,0 +1,14 @@
+repeat_until_game_over do
+ if can_turn_left() is true do
+ turn_left()
+ move()
+ else if can_move() is true do
+ move()
+ else if can_turn_right() is true do
+ turn_right()
+ move()
+ else do
+ turn_left()
+ turn_left()
+ end
+end
\ No newline at end of file
diff --git a/bootcamp_content/projects/maze/exercises/automated-solve/introduction.md b/bootcamp_content/projects/maze/exercises/automated-solve/introduction.md
new file mode 100644
index 0000000000..bf45496945
--- /dev/null
+++ b/bootcamp_content/projects/maze/exercises/automated-solve/introduction.md
@@ -0,0 +1,11 @@
+# Solve the Maze
+
+Your task is to solve the following maze.
+
+You have three functions you can use:
+
+- `move()` which moves the character one step forward
+- `turn_left()` turns the character left (relative to the direction they're currently facing)
+- `turn_right()` turns the character right (relative to the direction they're currently facing)
+
+Remember to use one function per line.
diff --git a/bootcamp_content/projects/maze/exercises/automated-solve/stub.jiki b/bootcamp_content/projects/maze/exercises/automated-solve/stub.jiki
new file mode 100644
index 0000000000..27cc684a7b
--- /dev/null
+++ b/bootcamp_content/projects/maze/exercises/automated-solve/stub.jiki
@@ -0,0 +1,6 @@
+// You can use move(), turn_left() and turn_right()
+// Use the functions in the order you want your character
+// to use them to solve them maze. We'll start you off by
+// moving the character one step forward.
+
+move()
\ No newline at end of file
diff --git a/bootcamp_content/projects/maze/exercises/automated-solve/task-1.md b/bootcamp_content/projects/maze/exercises/automated-solve/task-1.md
new file mode 100644
index 0000000000..b470c01201
--- /dev/null
+++ b/bootcamp_content/projects/maze/exercises/automated-solve/task-1.md
@@ -0,0 +1,8 @@
+# Task 1
+
+We've started by adding a single `move()` for you, which will move the character one step forward.
+
+Use the "Run code" button to see how close you're getting.
+
+It's good practice to get into the habit of running your code reguarly.
+In this exercise, we'd recommend running it after adding each new instruction, although you might like to try and challenge yourself to solve it all in one go instead!
diff --git a/bootcamp_content/projects/maze/exercises/automated-solve/task-2.md b/bootcamp_content/projects/maze/exercises/automated-solve/task-2.md
new file mode 100644
index 0000000000..b470c01201
--- /dev/null
+++ b/bootcamp_content/projects/maze/exercises/automated-solve/task-2.md
@@ -0,0 +1,8 @@
+# Task 1
+
+We've started by adding a single `move()` for you, which will move the character one step forward.
+
+Use the "Run code" button to see how close you're getting.
+
+It's good practice to get into the habit of running your code reguarly.
+In this exercise, we'd recommend running it after adding each new instruction, although you might like to try and challenge yourself to solve it all in one go instead!
diff --git a/bootcamp_content/projects/maze/exercises/automated-solve/task-3.md b/bootcamp_content/projects/maze/exercises/automated-solve/task-3.md
new file mode 100644
index 0000000000..b470c01201
--- /dev/null
+++ b/bootcamp_content/projects/maze/exercises/automated-solve/task-3.md
@@ -0,0 +1,8 @@
+# Task 1
+
+We've started by adding a single `move()` for you, which will move the character one step forward.
+
+Use the "Run code" button to see how close you're getting.
+
+It's good practice to get into the habit of running your code reguarly.
+In this exercise, we'd recommend running it after adding each new instruction, although you might like to try and challenge yourself to solve it all in one go instead!
diff --git a/bootcamp_content/projects/maze/exercises/automated-solve/task-4.md b/bootcamp_content/projects/maze/exercises/automated-solve/task-4.md
new file mode 100644
index 0000000000..b470c01201
--- /dev/null
+++ b/bootcamp_content/projects/maze/exercises/automated-solve/task-4.md
@@ -0,0 +1,8 @@
+# Task 1
+
+We've started by adding a single `move()` for you, which will move the character one step forward.
+
+Use the "Run code" button to see how close you're getting.
+
+It's good practice to get into the habit of running your code reguarly.
+In this exercise, we'd recommend running it after adding each new instruction, although you might like to try and challenge yourself to solve it all in one go instead!
diff --git a/bootcamp_content/projects/maze/exercises/implement-move/config.json b/bootcamp_content/projects/maze/exercises/implement-move/config.json
new file mode 100644
index 0000000000..739f81dd0a
--- /dev/null
+++ b/bootcamp_content/projects/maze/exercises/implement-move/config.json
@@ -0,0 +1,123 @@
+{
+ "title": "Implement move",
+ "description": "Implement the move function",
+ "project_type": "maze",
+ "level": 5,
+ "tests_type": "state",
+ "tasks": [
+ {
+ "name": "Move up",
+ "tests": [
+ {
+ "slug": "move-up",
+ "name": "Moves up",
+ "setup_functions": [
+ [
+ "setupGrid",
+ [
+ [0, 0, 0],
+ [0, 0, 0],
+ [0, 0, 0]
+ ]
+ ],
+ ["setupDirection", ["up"]],
+ ["setupPosition", [1, 1]]
+ ],
+ "function": "move",
+ "available_functions": ["moveCharacter"],
+ "checks": [
+ {
+ "name": "position",
+ "value": [0, -1]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Move down",
+ "tests": [
+ {
+ "slug": "move-down",
+ "name": "Moves down",
+ "setup_functions": [
+ [
+ "setupGrid",
+ [
+ [0, 0, 0],
+ [0, 0, 0],
+ [0, 0, 0]
+ ]
+ ],
+ ["setupDirection", ["down"]],
+ ["setupPosition", [1, 1]]
+ ],
+ "function": "move",
+ "checks": [
+ {
+ "name": "position",
+ "value": [0, 1]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Move left",
+ "tests": [
+ {
+ "slug": "move-left",
+ "name": "Moves left",
+
+ "setup_functions": [
+ [
+ "setupGrid",
+ [
+ [0, 0, 0],
+ [0, 0, 0],
+ [0, 0, 0]
+ ]
+ ],
+ ["setupDirection", ["left"]],
+ ["setupPosition", [1, 1]]
+ ],
+ "function": "move",
+ "checks": [
+ {
+ "name": "position",
+ "value": [-1, 0]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Move right",
+ "tests": [
+ {
+ "slug": "move-right",
+ "name": "Moves right",
+ "setup_functions": [
+ [
+ "setupGrid",
+ [
+ [0, 0, 0],
+ [0, 0, 0],
+ [0, 0, 0]
+ ]
+ ],
+ ["setupDirection", ["left"]],
+ ["setupPosition", [1, 1]]
+ ],
+ "function": "move",
+ "checks": [
+ {
+ "name": "position",
+ "value": [1, 0]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/bootcamp_content/projects/maze/exercises/implement-move/example.jiki b/bootcamp_content/projects/maze/exercises/implement-move/example.jiki
new file mode 100644
index 0000000000..a43e2c22f8
--- /dev/null
+++ b/bootcamp_content/projects/maze/exercises/implement-move/example.jiki
@@ -0,0 +1,21 @@
+// You have two tools at your disposal
+// - A variable called direction. It's been defined like this.
+// `set direction to "down"`
+// - A function called moveCharacter, that expects an x and y coordinate as its input, and moves the character accordingly.
+
+// Your job is to check the direction then call moveCharacter with the relative direction, so for example if you move up, you call moveCharacter(0,-1) - no change to the x, but a negative change to the y coordinate.
+
+function move do
+ if direction is "up" do
+ moveCharacter(0, -1)
+ end
+ else if direction is "down" do
+ moveCharacter(0, 1)
+ end
+ else if direction is "right" do
+ moveCharacter(1, 0)
+ end
+ else if direction is "left" do
+ moveCharacter(-1, 0)
+ end
+end
\ No newline at end of file
diff --git a/bootcamp_content/projects/maze/exercises/implement-move/introduction.md b/bootcamp_content/projects/maze/exercises/implement-move/introduction.md
new file mode 100644
index 0000000000..da2e8f32a2
--- /dev/null
+++ b/bootcamp_content/projects/maze/exercises/implement-move/introduction.md
@@ -0,0 +1,19 @@
+# Even or odd
+
+Let's build a function that takes a _number_ as an input and returns a _string_ specifying whether it's `"Even"` (0, 2, 4, 6, 8, etc), or `"Odd"` (1, 3, 5, 7, etc) or `"Zero"`.
+
+To approach this problem, think about what it is that acutally makes a number odd or even.
+
+
+ Totally Stuck?
+ A good way of working out if a number is even or odd is to check whether it has a remainder when it's divided by 2.
+
+You probably remember from school that a remainder is what’s left over when you divide a number but can’t divide it evenly. In other words, it’s the part of the number that doesn’t fit into equal groups.
+
+For example, if you divide 7 by 3, you can fit two groups of 3 into 7 (since 3 + 3 = 6), but there’s 1 left over. That leftover 1 is the remainder. And that remainder makes it an odd number.
+
+So to solve this exercise, you might like to use the **[remainder operator]()**.
+
+```
+
+```
diff --git a/bootcamp_content/projects/maze/exercises/implement-move/stub.jk b/bootcamp_content/projects/maze/exercises/implement-move/stub.jk
new file mode 100644
index 0000000000..d358c9aab8
--- /dev/null
+++ b/bootcamp_content/projects/maze/exercises/implement-move/stub.jk
@@ -0,0 +1,5 @@
+// Receives a number as its input
+// and should return "Positive", "Negative" or "Zero"
+function even_or_odd with num do
+
+end
\ No newline at end of file
diff --git a/bootcamp_content/projects/maze/exercises/implement-move/task-1.md b/bootcamp_content/projects/maze/exercises/implement-move/task-1.md
new file mode 100644
index 0000000000..ebd3b8b008
--- /dev/null
+++ b/bootcamp_content/projects/maze/exercises/implement-move/task-1.md
@@ -0,0 +1,3 @@
+# Task 1
+
+Start with trying to get the `"Even"` check in place.
diff --git a/bootcamp_content/projects/maze/exercises/implement-move/task-2.md b/bootcamp_content/projects/maze/exercises/implement-move/task-2.md
new file mode 100644
index 0000000000..a5378b687d
--- /dev/null
+++ b/bootcamp_content/projects/maze/exercises/implement-move/task-2.md
@@ -0,0 +1,3 @@
+# Task 2
+
+Great! Now get the `"Odd"` check in place.
diff --git a/bootcamp_content/projects/maze/exercises/implement-move/task-3.md b/bootcamp_content/projects/maze/exercises/implement-move/task-3.md
new file mode 100644
index 0000000000..da38a007cc
--- /dev/null
+++ b/bootcamp_content/projects/maze/exercises/implement-move/task-3.md
@@ -0,0 +1,3 @@
+# Task 3
+
+Great! Finally, let's check that `0` is returned as `Even`.
diff --git a/bootcamp_content/projects/maze/exercises/manual-solve/config.json b/bootcamp_content/projects/maze/exercises/manual-solve/config.json
new file mode 100644
index 0000000000..90031f1807
--- /dev/null
+++ b/bootcamp_content/projects/maze/exercises/manual-solve/config.json
@@ -0,0 +1,57 @@
+{
+ "title": "Manually solve a maze",
+ "description": "Solve a maze using some basic functions",
+ "project_type": "maze",
+ "level": 1,
+ "available_functions": ["move", "turnLeft", "turnRight"],
+ "tests_type": "state",
+ "concepts": ["functions-using"],
+ "tasks": [
+ {
+ "name": "Guide person to the end of the maze",
+ "tests": [
+ {
+ "slug": "maze-1",
+ "name": "Guide person to the end of the maze",
+ "description_html": "Your job is to reach the goal.",
+ "setup_functions": [
+ [
+ "setupGrid",
+ [
+ [
+ [2, 1, 0, 0, 0, 1, 0],
+ [0, 1, 0, 1, 0, 1, 1],
+ [0, 0, 0, 1, 0, 0, 0],
+ [0, 1, 1, 1, 0, 1, 1],
+ [0, 0, 1, 0, 0, 1, 0],
+ [1, 1, 1, 1, 0, 1, 1],
+ [0, 0, 0, 0, 0, 0, 3]
+ ]
+ ]
+ ],
+ ["setupDirection", ["down"]],
+ ["setupPosition", [0, 0]]
+ ],
+ "function": "runGame",
+ "checks": [
+ {
+ "name": "position",
+ "value": [6, 6],
+ "error_html": "Your position should be 6, 6, but it's %actual%."
+ },
+ {
+ "name": "direction",
+ "value": "right",
+ "error_html": "You should be facing right, but you're facing %actual%."
+ },
+ {
+ "name": "getGameResult()",
+ "value": "win",
+ "error_html": "You didn't reach the end of the maze"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/bootcamp_content/projects/maze/exercises/manual-solve/example.jiki b/bootcamp_content/projects/maze/exercises/manual-solve/example.jiki
new file mode 100644
index 0000000000..e993c67878
--- /dev/null
+++ b/bootcamp_content/projects/maze/exercises/manual-solve/example.jiki
@@ -0,0 +1,21 @@
+move()
+move()
+turn_left()
+move()
+move()
+turn_left()
+move()
+move()
+turn_right()
+move()
+move()
+turn_right()
+move()
+move()
+move()
+move()
+move()
+move()
+turn_left()
+move()
+move()
\ No newline at end of file
diff --git a/bootcamp_content/projects/maze/exercises/manual-solve/introduction.md b/bootcamp_content/projects/maze/exercises/manual-solve/introduction.md
new file mode 100644
index 0000000000..bf45496945
--- /dev/null
+++ b/bootcamp_content/projects/maze/exercises/manual-solve/introduction.md
@@ -0,0 +1,11 @@
+# Solve the Maze
+
+Your task is to solve the following maze.
+
+You have three functions you can use:
+
+- `move()` which moves the character one step forward
+- `turn_left()` turns the character left (relative to the direction they're currently facing)
+- `turn_right()` turns the character right (relative to the direction they're currently facing)
+
+Remember to use one function per line.
diff --git a/bootcamp_content/projects/maze/exercises/manual-solve/stub.jiki b/bootcamp_content/projects/maze/exercises/manual-solve/stub.jiki
new file mode 100644
index 0000000000..27cc684a7b
--- /dev/null
+++ b/bootcamp_content/projects/maze/exercises/manual-solve/stub.jiki
@@ -0,0 +1,6 @@
+// You can use move(), turn_left() and turn_right()
+// Use the functions in the order you want your character
+// to use them to solve them maze. We'll start you off by
+// moving the character one step forward.
+
+move()
\ No newline at end of file
diff --git a/bootcamp_content/projects/maze/exercises/manual-solve/task-1.md b/bootcamp_content/projects/maze/exercises/manual-solve/task-1.md
new file mode 100644
index 0000000000..b470c01201
--- /dev/null
+++ b/bootcamp_content/projects/maze/exercises/manual-solve/task-1.md
@@ -0,0 +1,8 @@
+# Task 1
+
+We've started by adding a single `move()` for you, which will move the character one step forward.
+
+Use the "Run code" button to see how close you're getting.
+
+It's good practice to get into the habit of running your code reguarly.
+In this exercise, we'd recommend running it after adding each new instruction, although you might like to try and challenge yourself to solve it all in one go instead!
diff --git a/bootcamp_content/projects/maze/introduction.md b/bootcamp_content/projects/maze/introduction.md
new file mode 100644
index 0000000000..2d376d908f
--- /dev/null
+++ b/bootcamp_content/projects/maze/introduction.md
@@ -0,0 +1,7 @@
+# Maze
+
+## Overview
+
+This project contains the first exercise you ever do, but continues all the way through into Part 2.
+
+Your job is to solve, and then later create a maze that your character can explore through.
diff --git a/bootcamp_content/projects/number-puzzles/config.json b/bootcamp_content/projects/number-puzzles/config.json
new file mode 100644
index 0000000000..f320f28958
--- /dev/null
+++ b/bootcamp_content/projects/number-puzzles/config.json
@@ -0,0 +1,6 @@
+{
+ "slug": "number-puzzles",
+ "title": "Number Puzzles",
+ "description": "Implement the classic game",
+ "exercises": ["positive-negative-or-zero", "even-or-odd"]
+}
diff --git a/bootcamp_content/projects/number-puzzles/exercises/even-or-odd/config.json b/bootcamp_content/projects/number-puzzles/exercises/even-or-odd/config.json
new file mode 100644
index 0000000000..a2c55f25ae
--- /dev/null
+++ b/bootcamp_content/projects/number-puzzles/exercises/even-or-odd/config.json
@@ -0,0 +1,63 @@
+{
+ "title": "Even or Odd",
+ "description": "Determine if a number is even or odd",
+ "concepts": ["strings-using", "conditionals"],
+ "level": 2,
+ "tasks": [
+ {
+ "name": "Correctly identify even numbers",
+ "tests": [
+ {
+ "slug": "number-2",
+ "type": "io",
+ "name": "Number 2",
+ "function": "even_or_odd",
+ "params": [2],
+ "expected": "Even"
+ },
+ {
+ "slug": "number-28",
+ "type": "io",
+ "name": "Number 28",
+ "function": "even_or_odd",
+ "params": [28],
+ "expected": "Even"
+ }
+ ]
+ },
+ {
+ "name": "Correctly identify odd numbers",
+ "tests": [
+ {
+ "slug": "number-1",
+ "type": "io",
+ "name": "Number 1",
+ "function": "even_or_odd",
+ "params": [1],
+ "expected": "Odd"
+ },
+ {
+ "slug": "number-21",
+ "type": "io",
+ "name": "Number 21",
+ "function": "even_or_odd",
+ "params": [21],
+ "expected": "Odd"
+ }
+ ]
+ },
+ {
+ "name": "Correctly identify zero",
+ "tests": [
+ {
+ "slug": "number-0",
+ "type": "io",
+ "name": "Number 0",
+ "function": "even_or_odd",
+ "params": [0],
+ "expected": "Even"
+ }
+ ]
+ }
+ ]
+}
diff --git a/bootcamp_content/projects/number-puzzles/exercises/even-or-odd/example.jiki b/bootcamp_content/projects/number-puzzles/exercises/even-or-odd/example.jiki
new file mode 100644
index 0000000000..f29ecc41b4
--- /dev/null
+++ b/bootcamp_content/projects/number-puzzles/exercises/even-or-odd/example.jiki
@@ -0,0 +1,7 @@
+function even_or_odd with num do
+ if num % 2 equals 0 do
+ return "Even"
+ else do
+ return "Odd"
+ end
+end
\ No newline at end of file
diff --git a/bootcamp_content/projects/number-puzzles/exercises/even-or-odd/introduction.md b/bootcamp_content/projects/number-puzzles/exercises/even-or-odd/introduction.md
new file mode 100644
index 0000000000..da2e8f32a2
--- /dev/null
+++ b/bootcamp_content/projects/number-puzzles/exercises/even-or-odd/introduction.md
@@ -0,0 +1,19 @@
+# Even or odd
+
+Let's build a function that takes a _number_ as an input and returns a _string_ specifying whether it's `"Even"` (0, 2, 4, 6, 8, etc), or `"Odd"` (1, 3, 5, 7, etc) or `"Zero"`.
+
+To approach this problem, think about what it is that acutally makes a number odd or even.
+
+
+ Totally Stuck?
+ A good way of working out if a number is even or odd is to check whether it has a remainder when it's divided by 2.
+
+You probably remember from school that a remainder is what’s left over when you divide a number but can’t divide it evenly. In other words, it’s the part of the number that doesn’t fit into equal groups.
+
+For example, if you divide 7 by 3, you can fit two groups of 3 into 7 (since 3 + 3 = 6), but there’s 1 left over. That leftover 1 is the remainder. And that remainder makes it an odd number.
+
+So to solve this exercise, you might like to use the **[remainder operator]()**.
+
+```
+
+```
diff --git a/bootcamp_content/projects/number-puzzles/exercises/even-or-odd/stub.jk b/bootcamp_content/projects/number-puzzles/exercises/even-or-odd/stub.jk
new file mode 100644
index 0000000000..d358c9aab8
--- /dev/null
+++ b/bootcamp_content/projects/number-puzzles/exercises/even-or-odd/stub.jk
@@ -0,0 +1,5 @@
+// Receives a number as its input
+// and should return "Positive", "Negative" or "Zero"
+function even_or_odd with num do
+
+end
\ No newline at end of file
diff --git a/bootcamp_content/projects/number-puzzles/exercises/even-or-odd/task-1.md b/bootcamp_content/projects/number-puzzles/exercises/even-or-odd/task-1.md
new file mode 100644
index 0000000000..ebd3b8b008
--- /dev/null
+++ b/bootcamp_content/projects/number-puzzles/exercises/even-or-odd/task-1.md
@@ -0,0 +1,3 @@
+# Task 1
+
+Start with trying to get the `"Even"` check in place.
diff --git a/bootcamp_content/projects/number-puzzles/exercises/even-or-odd/task-2.md b/bootcamp_content/projects/number-puzzles/exercises/even-or-odd/task-2.md
new file mode 100644
index 0000000000..a5378b687d
--- /dev/null
+++ b/bootcamp_content/projects/number-puzzles/exercises/even-or-odd/task-2.md
@@ -0,0 +1,3 @@
+# Task 2
+
+Great! Now get the `"Odd"` check in place.
diff --git a/bootcamp_content/projects/number-puzzles/exercises/even-or-odd/task-3.md b/bootcamp_content/projects/number-puzzles/exercises/even-or-odd/task-3.md
new file mode 100644
index 0000000000..da38a007cc
--- /dev/null
+++ b/bootcamp_content/projects/number-puzzles/exercises/even-or-odd/task-3.md
@@ -0,0 +1,3 @@
+# Task 3
+
+Great! Finally, let's check that `0` is returned as `Even`.
diff --git a/bootcamp_content/projects/number-puzzles/exercises/positive-negative-or-zero/config.json b/bootcamp_content/projects/number-puzzles/exercises/positive-negative-or-zero/config.json
new file mode 100644
index 0000000000..aad53410b9
--- /dev/null
+++ b/bootcamp_content/projects/number-puzzles/exercises/positive-negative-or-zero/config.json
@@ -0,0 +1,63 @@
+{
+ "title": "Positive, Negative or Zero",
+ "description": "Determine if a number is positive, negative or zero",
+ "concepts": ["strings-using", "conditionals"],
+ "level": 2,
+ "tasks": [
+ {
+ "name": "Correctly identify positive numbers",
+ "tests": [
+ {
+ "slug": "number-1",
+ "type": "io",
+ "name": "Number 1",
+ "function": "positive_negative_or_zero",
+ "params": [1],
+ "expected": "Positive"
+ },
+ {
+ "slug": "number-20",
+ "type": "io",
+ "name": "Number 20",
+ "function": "positive_negative_or_zero",
+ "params": [20],
+ "expected": "Positive"
+ }
+ ]
+ },
+ {
+ "name": "Correctly identify negative numbers",
+ "tests": [
+ {
+ "slug": "negative-1",
+ "type": "io",
+ "name": "Number -1",
+ "function": "positive_negative_or_zero",
+ "params": [-1],
+ "expected": "Negative"
+ },
+ {
+ "slug": "negative-20",
+ "type": "io",
+ "name": "Number -20",
+ "function": "positive_negative_or_zero",
+ "params": [-20],
+ "expected": "Negative"
+ }
+ ]
+ },
+ {
+ "name": "Correctly identify zero",
+ "tests": [
+ {
+ "slug": "number-0",
+ "type": "io",
+ "name": "Number 0",
+ "function": "positive_negative_or_zero",
+ "params": [0],
+ "expected": "Zero"
+ }
+ ]
+ }
+ ]
+}
diff --git a/bootcamp_content/projects/number-puzzles/exercises/positive-negative-or-zero/example.jiki b/bootcamp_content/projects/number-puzzles/exercises/positive-negative-or-zero/example.jiki
new file mode 100644
index 0000000000..3772cfa091
--- /dev/null
+++ b/bootcamp_content/projects/number-puzzles/exercises/positive-negative-or-zero/example.jiki
@@ -0,0 +1,9 @@
+function positive_negative_or_zero with num do
+ if num > 0 do
+ return "Positive"
+ else if num < 0 do
+ return "Negative"
+ else do
+ return "Zero"
+ end
+end
\ No newline at end of file
diff --git a/bootcamp_content/projects/number-puzzles/exercises/positive-negative-or-zero/introduction.md b/bootcamp_content/projects/number-puzzles/exercises/positive-negative-or-zero/introduction.md
new file mode 100644
index 0000000000..ef7a9cfb53
--- /dev/null
+++ b/bootcamp_content/projects/number-puzzles/exercises/positive-negative-or-zero/introduction.md
@@ -0,0 +1,3 @@
+# Positive, Negative or Zero
+
+Let's build a function that takes a _number_ as an input and returns a _string_ specifying whether it's `"Positive"` (greater than zero), `"Negative"` (less than zero) or `"Zero"`.
diff --git a/bootcamp_content/projects/number-puzzles/exercises/positive-negative-or-zero/stub.jk b/bootcamp_content/projects/number-puzzles/exercises/positive-negative-or-zero/stub.jk
new file mode 100644
index 0000000000..95b3f0e31c
--- /dev/null
+++ b/bootcamp_content/projects/number-puzzles/exercises/positive-negative-or-zero/stub.jk
@@ -0,0 +1,5 @@
+// Receives a number as its input
+// and should return "Positive", "Negative" or "Zero"
+function positive_negative_or_zero with num do
+
+end
\ No newline at end of file
diff --git a/bootcamp_content/projects/number-puzzles/exercises/positive-negative-or-zero/task-1.md b/bootcamp_content/projects/number-puzzles/exercises/positive-negative-or-zero/task-1.md
new file mode 100644
index 0000000000..5e43d9039d
--- /dev/null
+++ b/bootcamp_content/projects/number-puzzles/exercises/positive-negative-or-zero/task-1.md
@@ -0,0 +1,3 @@
+# Task 1
+
+Start with trying to get the `"Positive"` check in place.
diff --git a/bootcamp_content/projects/number-puzzles/exercises/positive-negative-or-zero/task-2.md b/bootcamp_content/projects/number-puzzles/exercises/positive-negative-or-zero/task-2.md
new file mode 100644
index 0000000000..3746e6a983
--- /dev/null
+++ b/bootcamp_content/projects/number-puzzles/exercises/positive-negative-or-zero/task-2.md
@@ -0,0 +1,3 @@
+# Task 2
+
+Great! Now get the `"Negative"` check in place.
diff --git a/bootcamp_content/projects/number-puzzles/exercises/positive-negative-or-zero/task-3.md b/bootcamp_content/projects/number-puzzles/exercises/positive-negative-or-zero/task-3.md
new file mode 100644
index 0000000000..b93c282445
--- /dev/null
+++ b/bootcamp_content/projects/number-puzzles/exercises/positive-negative-or-zero/task-3.md
@@ -0,0 +1,5 @@
+# Task 3
+
+Nice work!
+
+Finally let's get the `"Zero"` check in place.
diff --git a/bootcamp_content/projects/number-puzzles/introduction.md b/bootcamp_content/projects/number-puzzles/introduction.md
new file mode 100644
index 0000000000..025fa4b8a9
--- /dev/null
+++ b/bootcamp_content/projects/number-puzzles/introduction.md
@@ -0,0 +1,5 @@
+# Number Puzzles
+
+## Overview
+
+This project contains a series of miscellaneous puzzles related to manipulated numbers or determining things from them.
diff --git a/bootcamp_content/projects/rock-paper-scissors/config.json b/bootcamp_content/projects/rock-paper-scissors/config.json
new file mode 100644
index 0000000000..3915c85080
--- /dev/null
+++ b/bootcamp_content/projects/rock-paper-scissors/config.json
@@ -0,0 +1,6 @@
+{
+ "slug": "rock-paper-scissors",
+ "title": "Rock, Paper, Scissors",
+ "description": "Implement the classic game",
+ "exercises": ["basic"]
+}
diff --git a/bootcamp_content/projects/rock-paper-scissors/exercises/basic/config.json b/bootcamp_content/projects/rock-paper-scissors/exercises/basic/config.json
new file mode 100644
index 0000000000..5b3127e1fa
--- /dev/null
+++ b/bootcamp_content/projects/rock-paper-scissors/exercises/basic/config.json
@@ -0,0 +1,96 @@
+{
+ "title": "Rock Paper Scissors",
+ "description": "Calculate the correct result",
+ "concepts": ["conditionals"],
+ "level": 2,
+ "tests_type": "io",
+ "tasks": [
+ {
+ "name": "Player 1 chooses paper",
+ "tests": [
+ {
+ "slug": "paper-vs-paper",
+ "name": "Paper vs Paper",
+ "function": "who_wins",
+ "params": ["paper", "paper"],
+ "expected": "tie",
+ "image_slug": "rock-paper-scissors/paper-paper.png"
+ },
+ {
+ "slug": "paper-vs-rock",
+ "name": "Paper vs Rock",
+ "function": "who_wins",
+ "params": ["paper", "rock"],
+ "expected": "player_1",
+ "image_slug": "rock-paper-scissors/paper-rock.png"
+ },
+ {
+ "slug": "paper-vs-scissors",
+ "name": "Paper vs Scissors",
+ "function": "who_wins",
+ "params": ["paper", "scissors"],
+ "expected": "player_2",
+ "image_slug": "rock-paper-scissors/paper-scissors.png"
+ }
+ ]
+ },
+ {
+ "name": "Player 1 chooses rock",
+ "tests": [
+ {
+ "slug": "rock-vs-paper",
+ "name": "Rock vs Paper",
+ "function": "who_wins",
+ "params": ["rock", "paper"],
+ "expected": "player_2",
+ "image_slug": "rock-paper-scissors/rock-paper.png"
+ },
+ {
+ "slug": "rock-vs-rock",
+ "name": "Rock vs Rock",
+ "function": "who_wins",
+ "params": ["rock", "rock"],
+ "expected": "tie",
+ "image_slug": "rock-paper-scissors/rock-rock.png"
+ },
+ {
+ "slug": "rock-vs-scissors",
+ "name": "Rock vs Scissors",
+ "function": "who_wins",
+ "params": ["rock", "scissors"],
+ "expected": "player_1",
+ "image_slug": "rock-paper-scissors/rock-scissors.png"
+ }
+ ]
+ },
+ {
+ "name": "Player 1 chooses scissors",
+ "tests": [
+ {
+ "slug": "scissors-vs-paper",
+ "name": "Scissors vs Paper",
+ "function": "who_wins",
+ "params": ["scissors", "paper"],
+ "expected": "player_1",
+ "image_slug": "rock-paper-scissors/scissors-paper.png"
+ },
+ {
+ "slug": "scissors-vs-rock",
+ "name": "Scissors vs Rock",
+ "function": "who_wins",
+ "params": ["scissors", "rock"],
+ "expected": "player_2",
+ "image_slug": "rock-paper-scissors/scissors-rock.png"
+ },
+ {
+ "slug": "scissors-vs-scissors",
+ "name": "Scissors vs Scissors",
+ "function": "who_wins",
+ "params": ["scissors", "scissors"],
+ "expected": "tie",
+ "image_slug": "rock-paper-scissors/scissors-scissors.png"
+ }
+ ]
+ }
+ ]
+}
diff --git a/bootcamp_content/projects/rock-paper-scissors/exercises/basic/example.jiki b/bootcamp_content/projects/rock-paper-scissors/exercises/basic/example.jiki
new file mode 100644
index 0000000000..2c0ef84106
--- /dev/null
+++ b/bootcamp_content/projects/rock-paper-scissors/exercises/basic/example.jiki
@@ -0,0 +1,27 @@
+function who_wins with player_1_choice, player_2_choice do
+ if player_1_choice is "rock" do
+ if player_2_choice is "rock" do
+ return "tie"
+ else if player_2_choice is "paper" do
+ return "player_2"
+ else do
+ return "player_1"
+ end
+ else if player_1_choice is "paper" do
+ if player_2_choice is "rock" do
+ return "player_1"
+ else if player_2_choice is "paper" do
+ return "tie"
+ else do
+ return "player_2"
+ end
+ else do
+ if player_2_choice is "rock" do
+ return "player_2"
+ else if player_2_choice is "paper" do
+ return "player_1"
+ else do
+ return "tie"
+ end
+ end
+end
\ No newline at end of file
diff --git a/bootcamp_content/projects/rock-paper-scissors/exercises/basic/introduction.md b/bootcamp_content/projects/rock-paper-scissors/exercises/basic/introduction.md
new file mode 100644
index 0000000000..a531c32416
--- /dev/null
+++ b/bootcamp_content/projects/rock-paper-scissors/exercises/basic/introduction.md
@@ -0,0 +1,11 @@
+# Part 1
+
+We're going to start off by determining who wins a game of rock-paper-scissors by creating the function `who_wins`.
+
+The function takes two inputs - `player_1_choice` and `player_2_choice`, which can be `"rock"`, `"paper"` or `"scissors"`.
+
+Your job is to return the winner (`"player_1"`, `"player_2"`, or `"tie`") based on the following rules:
+
+- Paper beats Rock
+- Rock beats Scissors
+- Scissors beat Paper
diff --git a/bootcamp_content/projects/rock-paper-scissors/exercises/basic/stub.jiki b/bootcamp_content/projects/rock-paper-scissors/exercises/basic/stub.jiki
new file mode 100644
index 0000000000..cdfb9a2dac
--- /dev/null
+++ b/bootcamp_content/projects/rock-paper-scissors/exercises/basic/stub.jiki
@@ -0,0 +1,5 @@
+// The choices can be one of "rock", "paper" or "scissors"
+// Should return "player_1", "player_2" or "tie"
+function who_wins with player_1_choice, player_2_choice do
+
+end
\ No newline at end of file
diff --git a/bootcamp_content/projects/rock-paper-scissors/exercises/basic/task-1.md b/bootcamp_content/projects/rock-paper-scissors/exercises/basic/task-1.md
new file mode 100644
index 0000000000..830e498063
--- /dev/null
+++ b/bootcamp_content/projects/rock-paper-scissors/exercises/basic/task-1.md
@@ -0,0 +1,9 @@
+# Task 1
+
+There are a few different ways to approach this exercise, but let's solve it by breaking it down based on player 1's choice.
+
+To start with, return the correct value based on when player 1 choices "paper":
+
+- If player 2 also chooses paper, we should return `"tie"`
+- If player 2 chooses "rock", then the paper smoothers the rock so player 1 wins (return `"player_1"`)
+- If player 2 chooses "scissors", then the rock blunts the scissors so player 2 wins (return `"player_2"`)
diff --git a/bootcamp_content/projects/rock-paper-scissors/exercises/basic/task-2.md b/bootcamp_content/projects/rock-paper-scissors/exercises/basic/task-2.md
new file mode 100644
index 0000000000..cfa6f86026
--- /dev/null
+++ b/bootcamp_content/projects/rock-paper-scissors/exercises/basic/task-2.md
@@ -0,0 +1,7 @@
+# Task 2
+
+Great, now let's consider what happens if player 1 chooses "rock':
+
+- If player 2 also chooses rock, we should return `"tie"`
+- If player 2 chooses "paper", then the paper smoothers the rock so player 2 wins (return `"player_2"`)
+- If player 2 chooses "scissors", then the rock blunts the scissors so player 1 wins (return `"player_1"`)
diff --git a/bootcamp_content/projects/rock-paper-scissors/exercises/basic/task-3.md b/bootcamp_content/projects/rock-paper-scissors/exercises/basic/task-3.md
new file mode 100644
index 0000000000..0ffe0edf7e
--- /dev/null
+++ b/bootcamp_content/projects/rock-paper-scissors/exercises/basic/task-3.md
@@ -0,0 +1,5 @@
+# Task 3
+
+Nice work. So we're two-thirds of the way there. The final situation is if player 1 chooses scissors.
+
+This time, we'll leave the logic for you to work out!
diff --git a/bootcamp_content/projects/rock-paper-scissors/introduction.md b/bootcamp_content/projects/rock-paper-scissors/introduction.md
new file mode 100644
index 0000000000..7abf4796cc
--- /dev/null
+++ b/bootcamp_content/projects/rock-paper-scissors/introduction.md
@@ -0,0 +1,21 @@
+# Rock Paper Scissors
+
+## Overview
+
+Rock Paper Scissors is a class game played around the world by people of all ages.
+
+We're going to build out this whole game, starting by implementing the logic of who wins using _Conditionals_, adding a way of keeping score using _Variables_, and eventually building out all the visuals in Part 2 of the course.
+
+## Introduction
+
+Rock, Paper, Scissors is one of those games everyone seems to know. It’s quick, simple, and surprisingly fun for how basic it is. Whether you’re trying to decide who gets the last slice of pizza or just passing time with a friend, this game has a way of making even small decisions feel epic. The best part? You don’t need any equipment—just your hands and a little competitive spirit.
+
+The rules are simple.
+
+Both players choose one of three options: Rock, Paper, or Scissors. Choices are revealed simultaneously and the winner is determined based on these rules:
+• Rock beats Scissors (Rock crushes Scissors).
+• Scissors beats Paper (Scissors cut Paper).
+• Paper beats Rock (Paper covers Rock).
+If both players choose the same option, it’s a tie, and the round is replayed (optional based on how you’re playing).
+
+You and your opponent pick one of three options—Rock, Paper, or Scissors—and reveal your choices at the same time. Rock beats Scissors (because it crushes it), Scissors beats Paper (because it cuts it), and Paper beats Rock (because it covers it). If you both pick the same thing, it’s a tie, and you go again. You can play a single round to settle something quickly or go best out of three for a proper showdown. It’s easy to learn, impossible to master, and always a good time.
diff --git a/bootcamp_content/projects/two-fer/config.json b/bootcamp_content/projects/two-fer/config.json
new file mode 100644
index 0000000000..0e383e2435
--- /dev/null
+++ b/bootcamp_content/projects/two-fer/config.json
@@ -0,0 +1,6 @@
+{
+ "slug": "two-fer",
+ "title": "TwoFer",
+ "description": "Cookies, strings, conditionals",
+ "exercises": ["basic"]
+}
diff --git a/bootcamp_content/projects/two-fer/exercises/basic/config.json b/bootcamp_content/projects/two-fer/exercises/basic/config.json
new file mode 100644
index 0000000000..3e4bf793e9
--- /dev/null
+++ b/bootcamp_content/projects/two-fer/exercises/basic/config.json
@@ -0,0 +1,46 @@
+{
+ "title": "Empty Strings",
+ "description": "Return what you say when you hand the cookie other, using the person's name if you know it.",
+ "concepts": ["strings-concatenation", "conditionals"],
+ "level": 2,
+ "tests_type": "io",
+ "readonly_ranges": [
+ { "from": 1, "to": 1 },
+ { "from": 3, "to": 3 }
+ ],
+ "tasks": [
+ {
+ "name": "Get things working with a single string",
+ "tests": [
+ {
+ "slug": "no_name",
+ "name": "no name given",
+ "function": "two_fer",
+ "params": [""],
+ "expected": "One for you, one for me."
+ }
+ ]
+ },
+ {
+ "name": "Get things working with a name",
+ "tests": [
+ {
+ "type": "io",
+ "slug": "alice",
+ "name": "A name is given",
+ "function": "two_fer",
+ "params": ["Alice"],
+ "expected": "One for Alice, one for me."
+ },
+ {
+ "type": "io",
+ "slug": "bob",
+ "name": "Another name is given",
+ "function": "two_fer",
+ "params": ["Bob"],
+ "expected": "One for Bob, one for me."
+ }
+ ]
+ }
+ ]
+}
diff --git a/bootcamp_content/projects/two-fer/exercises/basic/example.jiki b/bootcamp_content/projects/two-fer/exercises/basic/example.jiki
new file mode 100644
index 0000000000..802eb8f278
--- /dev/null
+++ b/bootcamp_content/projects/two-fer/exercises/basic/example.jiki
@@ -0,0 +1,7 @@
+function two_fer with name do
+ if name is "" do
+ return "One for you, one for me."
+ else do
+ return "One for " + name + ", one for me."
+ end
+end
diff --git a/bootcamp_content/projects/two-fer/exercises/basic/introduction.md b/bootcamp_content/projects/two-fer/exercises/basic/introduction.md
new file mode 100644
index 0000000000..c8048e8dea
--- /dev/null
+++ b/bootcamp_content/projects/two-fer/exercises/basic/introduction.md
@@ -0,0 +1,15 @@
+# TwoFer Part 1
+
+Two Fer is a classic Exercism exercise.
+Through it, we'll explore a few ideas around using _Strings_ and _Conditionals_.
+
+In some English accents, when you say "two for" quickly, it sounds like "two fer". Two-for-one is a way of saying that if you buy one, you also get one for free. So the phrase "two-fer" often implies a two-for-one offer.
+
+Imagine a bakery that has a holiday offer where you can buy two cookies for the price of one ("two-fer one!"). You take the offer and (very generously) decide to give the extra cookie to someone else in the queue.
+
+As you give them the cookie, you one of two things.
+
+- If you know their name, you say: "One for , one for me."
+- If you don't know their name, you say: "One for you, one for me."
+
+For example, you might say "One for Jeremy, one for me" if you know Jeremy's name.
diff --git a/bootcamp_content/projects/two-fer/exercises/basic/stub.jiki b/bootcamp_content/projects/two-fer/exercises/basic/stub.jiki
new file mode 100644
index 0000000000..e871b02348
--- /dev/null
+++ b/bootcamp_content/projects/two-fer/exercises/basic/stub.jiki
@@ -0,0 +1,3 @@
+function two_fer with name do
+
+end
diff --git a/bootcamp_content/projects/two-fer/exercises/basic/task-1.md b/bootcamp_content/projects/two-fer/exercises/basic/task-1.md
new file mode 100644
index 0000000000..1b03934503
--- /dev/null
+++ b/bootcamp_content/projects/two-fer/exercises/basic/task-1.md
@@ -0,0 +1,5 @@
+We've given you a function skeleton that takes one input - `name`.
+
+It will either be an empty string (`""`) or it will be someone's name (`"Jeremy"`).
+
+Let's start off by just considering that empty version and always returning our default version `"One for me, one for you."`.
diff --git a/bootcamp_content/projects/two-fer/exercises/basic/task-2.md b/bootcamp_content/projects/two-fer/exercises/basic/task-2.md
new file mode 100644
index 0000000000..2a597efd6a
--- /dev/null
+++ b/bootcamp_content/projects/two-fer/exercises/basic/task-2.md
@@ -0,0 +1,7 @@
+Nice work!
+
+Now we need to handle the situation where we **do** know the person's name.
+
+Sometime's the name will be empty (`""`) in which case we want to continue returning `"One for you, one for me."`, but other times `name` will contain a name, in which case we want to include it in the return value (e.g. `"One for Jeremy, one for me."`).
+
+Remember, you can join multiple strings together using the `join_strings(...)` function.
diff --git a/bootcamp_content/projects/two-fer/introduction.md b/bootcamp_content/projects/two-fer/introduction.md
new file mode 100644
index 0000000000..f3cf6682e4
--- /dev/null
+++ b/bootcamp_content/projects/two-fer/introduction.md
@@ -0,0 +1,25 @@
+# Two Fer
+
+## Overview
+
+Two Fer is a classic Exercism exercise.
+Through it, we'll explore a few ideas around using _Strings_ and _Conditionals_.
+
+## Introduction
+
+In some English accents, when you say "two for" quickly, it sounds like "two fer". Two-for-one is a way of saying that if you buy one, you also get one for free. So the phrase "two-fer" often implies a two-for-one offer.
+
+Imagine a bakery that has a holiday offer where you can buy two cookies for the price of one ("two-fer one!"). You take the offer and (very generously) decide to give the extra cookie to someone else in the queue.
+
+As you give them the cookie, if you know their name (e.g. they're called "Jeremy"), you say:
+
+```text
+"One for Jeremy, one for me."
+```
+
+If you don't know their name (even more generous of you!), you say:
+"One for you, one for me."
+
+```
+
+```
diff --git a/bootcamp_content/projects/wordle/config.json b/bootcamp_content/projects/wordle/config.json
new file mode 100644
index 0000000000..1bbcca61f0
--- /dev/null
+++ b/bootcamp_content/projects/wordle/config.json
@@ -0,0 +1,6 @@
+{
+ "slug": "wordle",
+ "title": "Wordle",
+ "description": "Create the modern Wordle game",
+ "exercises": ["process-guess"]
+}
diff --git a/bootcamp_content/projects/wordle/exercises/process-guess/config.json b/bootcamp_content/projects/wordle/exercises/process-guess/config.json
new file mode 100644
index 0000000000..850421801f
--- /dev/null
+++ b/bootcamp_content/projects/wordle/exercises/process-guess/config.json
@@ -0,0 +1,28 @@
+{
+ "title": "Process a guess",
+ "description": "Turn a guess into a valid response",
+ "project_type": "wordle",
+ "available_functions": [],
+ "concepts": ["conditionals", "arrays"],
+ "level": 3,
+ "tests_type": "state",
+ "tasks": [
+ {
+ "name": "Deal with a correct guess",
+ "tests": [
+ {
+ "slug": "all-correct",
+ "name": "Deal with a fully correct guess",
+ "function": "process_guess",
+ "checks": [
+ {
+ "name": "getGuessState1()",
+ "value": ["present", "absent", "absent", "absent", "correct"],
+ "error_html": "We expected the first letter to be present and the last one to be correct"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/bootcamp_content/projects/wordle/exercises/process-guess/example.jiki b/bootcamp_content/projects/wordle/exercises/process-guess/example.jiki
new file mode 100644
index 0000000000..7e4fc86905
--- /dev/null
+++ b/bootcamp_content/projects/wordle/exercises/process-guess/example.jiki
@@ -0,0 +1,6 @@
+move()
+move()
+turn_left()
+move()
+move()
+turn_right()
\ No newline at end of file
diff --git a/bootcamp_content/projects/wordle/exercises/process-guess/introduction.md b/bootcamp_content/projects/wordle/exercises/process-guess/introduction.md
new file mode 100644
index 0000000000..bf45496945
--- /dev/null
+++ b/bootcamp_content/projects/wordle/exercises/process-guess/introduction.md
@@ -0,0 +1,11 @@
+# Solve the Maze
+
+Your task is to solve the following maze.
+
+You have three functions you can use:
+
+- `move()` which moves the character one step forward
+- `turn_left()` turns the character left (relative to the direction they're currently facing)
+- `turn_right()` turns the character right (relative to the direction they're currently facing)
+
+Remember to use one function per line.
diff --git a/bootcamp_content/projects/wordle/exercises/process-guess/stub.jk b/bootcamp_content/projects/wordle/exercises/process-guess/stub.jk
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/bootcamp_content/projects/wordle/exercises/process-guess/task-1.md b/bootcamp_content/projects/wordle/exercises/process-guess/task-1.md
new file mode 100644
index 0000000000..b470c01201
--- /dev/null
+++ b/bootcamp_content/projects/wordle/exercises/process-guess/task-1.md
@@ -0,0 +1,8 @@
+# Task 1
+
+We've started by adding a single `move()` for you, which will move the character one step forward.
+
+Use the "Run code" button to see how close you're getting.
+
+It's good practice to get into the habit of running your code reguarly.
+In this exercise, we'd recommend running it after adding each new instruction, although you might like to try and challenge yourself to solve it all in one go instead!
diff --git a/bootcamp_content/projects/wordle/introduction.md b/bootcamp_content/projects/wordle/introduction.md
new file mode 100644
index 0000000000..2d376d908f
--- /dev/null
+++ b/bootcamp_content/projects/wordle/introduction.md
@@ -0,0 +1,7 @@
+# Maze
+
+## Overview
+
+This project contains the first exercise you ever do, but continues all the way through into Part 2.
+
+Your job is to solve, and then later create a maze that your character can explore through.
diff --git a/config/initializers/json.rb b/config/initializers/json.rb
index 660599d6d9..a26d0d3676 100644
--- a/config/initializers/json.rb
+++ b/config/initializers/json.rb
@@ -3,3 +3,17 @@
require 'oj'
Oj.optimize_rails
+
+# rubocop:disable Security/JSONLoad
+class JSONWithIndifferentAccess
+ def self.load(str)
+ JSON.load(str, nil, symbolize_names: true, create_additions: false)
+ # obj.freeze
+ # obj
+ end
+
+ def self.dump(obj)
+ JSON.dump(obj)
+ end
+end
+# rubocop:enable Security/JSONLoad
diff --git a/config/routes.rb b/config/routes.rb
index 4bde8de519..3006e16447 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -486,4 +486,6 @@
post "/bootcamp/stripe/create-checkout-session" => "bootcamp#stripe_create_checkout_session", as: :bootcamp_
get "/bootcamp/stripe/session-status" => "bootcamp#stripe_session_status", as: :bootcamp_stripe_session_status
get "/bootcamp/confirmed" => "bootcamp#confirmed", as: :bootcamp_confirmed
+
+ draw(:bootcamp)
end
diff --git a/config/routes/api.rb b/config/routes/api.rb
index d2b8f3e0b3..e8b133ae61 100644
--- a/config/routes/api.rb
+++ b/config/routes/api.rb
@@ -276,6 +276,16 @@
end
end
+ namespace :bootcamp do
+ resources :solutions, param: :uuid, only: [] do
+ member do
+ patch :complete
+ end
+ resources :submissions, param: :uuid, only: [:create]
+ end
+ resources :drawings, param: :uuid, only: [:update]
+ end
+
post "markdown/parse" => "markdown#parse", as: "parse_markdown"
end
end
diff --git a/config/routes/bootcamp.rb b/config/routes/bootcamp.rb
new file mode 100644
index 0000000000..66def6e529
--- /dev/null
+++ b/config/routes/bootcamp.rb
@@ -0,0 +1,25 @@
+namespace :bootcamp do
+ get "dashboard", to: "dashboard#index", as: :dashboard
+ resources "levels", param: :idx, only: %i[index show]
+ resources "concepts", param: :slug, only: %i[index show]
+ resources "projects", param: :slug, only: %i[index show] do
+ resources "exercises", param: :slug, only: %i[index show edit]
+ end
+ resources "drawings", param: :uuid, only: %i[create edit]
+
+ namespace :admin do
+ resource :settings, only: [:show] do
+ post :increment_level, on: :collection
+ end
+ resources :exercises
+ end
+end
+
+# namespace :api do
+# resources :solutions, param: :uuid, only: [] do
+# member do
+# patch :complete
+# end
+# resources :submissions, param: :uuid, only: [:create]
+# end
+# end
diff --git a/db/bootcamp_seeds.rb b/db/bootcamp_seeds.rb
new file mode 100644
index 0000000000..5c803e420e
--- /dev/null
+++ b/db/bootcamp_seeds.rb
@@ -0,0 +1,82 @@
+return unless Rails.env.development?
+
+# rubocop:disable Layout/LineLength
+Bootcamp::Submission.destroy_all
+Bootcamp::Solution.destroy_all
+Bootcamp::Exercise.destroy_all
+Bootcamp::Project.destroy_all
+Bootcamp::Concept.destroy_all
+Bootcamp::Level.destroy_all
+
+def concept_intro_for(slug) = File.read(Rails.root / "bootcamp_content/concepts/#{slug}.md")
+
+def project_config_for(slug) = JSON.parse(File.read(Rails.root / "bootcamp_content/projects/#{slug}/config.json"),
+ symbolize_names: true)
+
+def project_intro_for(slug) = File.read(Rails.root / "bootcamp_content/projects/#{slug}/introduction.md")
+
+def exercise_code_for(project_slug,
+ exercise_slug) = File.read(Rails.root / "bootcamp_content/projects/#{project_slug}/exercises/#{exercise_slug}/code")
+
+def exercise_config_for(project_slug,
+ exercise_slug) = JSON.parse(
+ File.read(Rails.root / "bootcamp_content/projects/#{project_slug}/exercises/#{exercise_slug}/config.json"), symbolize_names: true
+ )
+
+JSON.parse(File.read(Rails.root / "bootcamp_content/levels/config.json"), symbolize_names: true).each.with_index do |details, idx|
+ idx += 1
+ Bootcamp::Level.create!(
+ idx:,
+ title: details[:title],
+ description: details[:description],
+ content_markdown: File.read(Rails.root / "bootcamp_content/levels/#{idx}.md")
+ )
+end
+
+JSON.parse(File.read(Rails.root / "bootcamp_content/concepts/config.json"), symbolize_names: true).each do |details|
+ Bootcamp::Concept.create!(
+ slug: details[:slug],
+ parent: details[:parent] ? Bootcamp::Concept.find_by!(slug: details[:parent]) : nil,
+ title: details[:title],
+ description: details[:description],
+ content_markdown: concept_intro_for(details[:slug]),
+ level_idx: details[:level],
+ apex: details[:apex] || false
+ )
+end
+
+projects = %w[
+ two-fer
+ rock-paper-scissors
+ number-puzzles
+ drawing
+ maze
+ wordle
+]
+
+projects.each do |project_slug|
+ project_config = project_config_for(project_slug)
+ project = Bootcamp::Project.create!(
+ slug: project_slug,
+ title: project_config[:title],
+ description: project_config[:description],
+ introduction_markdown: project_intro_for(project_slug)
+ )
+ project_config[:exercises].each.with_index do |exercise_slug, idx|
+ exercise_config = exercise_config_for(project_slug, exercise_slug)
+ project.exercises.create!(
+ slug: exercise_slug,
+ idx: idx + 1,
+ title: exercise_config[:title],
+ description: exercise_config[:description],
+ level_idx: exercise_config[:level],
+ concepts: exercise_config[:concepts].map do |slug|
+ Bootcamp::Concept.find_by!(slug:)
+ end
+ )
+ end
+end
+
+Bootcamp::UserProject::CreateAll.(User.find_by!(handle: 'iHiD'))
+
+# rubocop:enable Layout/LineLength
diff --git a/db/migrate/20241118050422_add_bootcamp_data_columns.rb b/db/migrate/20241118050422_add_bootcamp_data_columns.rb
new file mode 100644
index 0000000000..5f925385d8
--- /dev/null
+++ b/db/migrate/20241118050422_add_bootcamp_data_columns.rb
@@ -0,0 +1,7 @@
+class AddBootcampDataColumns < ActiveRecord::Migration[7.0]
+ def change
+ return if Rails.env.production?
+
+ add_column :user_bootcamp_data, :level_idx, :integer, null: false, default: 0
+ end
+end
\ No newline at end of file
diff --git a/db/migrate/20241118051006_create_bootcamp_projects.rb b/db/migrate/20241118051006_create_bootcamp_projects.rb
new file mode 100644
index 0000000000..a9c5fc4977
--- /dev/null
+++ b/db/migrate/20241118051006_create_bootcamp_projects.rb
@@ -0,0 +1,15 @@
+class CreateBootcampProjects < ActiveRecord::Migration[7.0]
+ def change
+ return if Rails.env.production?
+
+ create_table :bootcamp_projects do |t|
+ t.string :slug, null: false
+ t.string :title, null: false
+ t.text :description, null: false
+ t.text :introduction_markdown, null: false
+ t.text :introduction_html, null: false
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20241118051007_create_bootcamp_exercises.rb b/db/migrate/20241118051007_create_bootcamp_exercises.rb
new file mode 100644
index 0000000000..d798ffa15f
--- /dev/null
+++ b/db/migrate/20241118051007_create_bootcamp_exercises.rb
@@ -0,0 +1,20 @@
+class CreateBootcampExercises < ActiveRecord::Migration[7.0]
+ def change
+ return if Rails.env.production?
+
+ create_table :bootcamp_exercises do |t|
+ t.belongs_to :project
+ t.string :slug, null: false
+
+ t.integer :idx, null: false
+ t.string :title, null: false
+ t.text :description, null: false
+ t.integer :level_idx, null: false
+
+ t.timestamps
+
+ t.index [:project_id, :slug], unique: true
+ t.index :level_idx
+ end
+ end
+end
diff --git a/db/migrate/20241118051047_create_bootcamp_solutions.rb b/db/migrate/20241118051047_create_bootcamp_solutions.rb
new file mode 100644
index 0000000000..78beeac4db
--- /dev/null
+++ b/db/migrate/20241118051047_create_bootcamp_solutions.rb
@@ -0,0 +1,19 @@
+class CreateBootcampSolutions < ActiveRecord::Migration[7.0]
+ def change
+ return if Rails.env.production?
+
+ create_table :bootcamp_solutions do |t|
+ t.belongs_to :user
+ t.belongs_to :exercise
+
+ t.string :uuid, null: false
+
+ t.text :code, null: false
+
+ t.datetime :completed_at, null: true
+ t.timestamps
+
+ t.index [:user_id, :exercise_id], unique: true
+ end
+ end
+end
diff --git a/db/migrate/20241118053650_create_bootcamp_concepts.rb b/db/migrate/20241118053650_create_bootcamp_concepts.rb
new file mode 100644
index 0000000000..42c88bcc09
--- /dev/null
+++ b/db/migrate/20241118053650_create_bootcamp_concepts.rb
@@ -0,0 +1,22 @@
+class CreateBootcampConcepts < ActiveRecord::Migration[7.0]
+ def change
+ return if Rails.env.production?
+
+ create_table :bootcamp_concepts do |t|
+ t.string :slug, null: false
+
+ t.bigint :parent_id, null: true
+ t.integer :level_idx, null: false
+ t.boolean :apex, null: false, default: false
+
+ t.string :title, null: false
+ t.text :description, null: false
+ t.text :content_markdown, null: false
+ t.text :content_html, null: false
+
+ t.timestamps
+
+ t.foreign_key :bootcamp_concepts, column: :parent_id
+ end
+ end
+end
diff --git a/db/migrate/20241118055549_create_bootcamp_submissions.rb b/db/migrate/20241118055549_create_bootcamp_submissions.rb
new file mode 100644
index 0000000000..0c9836839a
--- /dev/null
+++ b/db/migrate/20241118055549_create_bootcamp_submissions.rb
@@ -0,0 +1,16 @@
+class CreateBootcampSubmissions < ActiveRecord::Migration[7.0]
+ def change
+ return if Rails.env.production?
+
+ create_table :bootcamp_submissions do |t|
+ t.string :uuid, null: false
+ t.belongs_to :solution, foreign_key: { to_table: "bootcamp_solutions" }, null: true
+ t.column :status, :smallint, null: false
+ t.text :code, null: false
+ t.text :readonly_ranges, null: false
+ t.text :test_results, null: false
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20241119025227_create_bootcamp_user_projects.rb b/db/migrate/20241119025227_create_bootcamp_user_projects.rb
new file mode 100644
index 0000000000..b1f7d66732
--- /dev/null
+++ b/db/migrate/20241119025227_create_bootcamp_user_projects.rb
@@ -0,0 +1,18 @@
+class CreateBootcampUserProjects < ActiveRecord::Migration[7.0]
+ def change
+ return if Rails.env.production?
+
+ create_table :bootcamp_user_projects do |t|
+ t.belongs_to :user
+ t.belongs_to :project
+ t.integer :status, default: 0, null: false
+
+ t.timestamps
+
+ t.index [:user_id, :project_id], unique: true
+
+ t.foreign_key :users
+ t.foreign_key :bootcamp_projects, column: :project_id
+ end
+ end
+end
diff --git a/db/migrate/20241217061301_create_bootcamp_settings.rb b/db/migrate/20241217061301_create_bootcamp_settings.rb
new file mode 100644
index 0000000000..30213bb267
--- /dev/null
+++ b/db/migrate/20241217061301_create_bootcamp_settings.rb
@@ -0,0 +1,10 @@
+class CreateBootcampSettings < ActiveRecord::Migration[7.0]
+ def change
+ return if Rails.env.production?
+
+ create_table :bootcamp_settings do |t|
+ t.timestamps
+ t.integer :level_idx, null: false, default: 1
+ end
+ end
+end
diff --git a/db/migrate/20241217061836_create_bootcamp_levels.rb b/db/migrate/20241217061836_create_bootcamp_levels.rb
new file mode 100644
index 0000000000..cb5a1c0751
--- /dev/null
+++ b/db/migrate/20241217061836_create_bootcamp_levels.rb
@@ -0,0 +1,16 @@
+class CreateBootcampLevels < ActiveRecord::Migration[7.0]
+ def change
+ return if Rails.env.production?
+
+ create_table :bootcamp_levels do |t|
+ t.integer :idx, null: false
+
+ t.string :title, null: false
+ t.text :description, null: false
+ t.text :content_markdown, null: false
+ t.text :content_html, null: false
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20241218061847_create_bootcamp_exercise_concepts.rb b/db/migrate/20241218061847_create_bootcamp_exercise_concepts.rb
new file mode 100644
index 0000000000..ca434bf213
--- /dev/null
+++ b/db/migrate/20241218061847_create_bootcamp_exercise_concepts.rb
@@ -0,0 +1,14 @@
+class CreateBootcampExerciseConcepts < ActiveRecord::Migration[7.0]
+ def change
+ return if Rails.env.production?
+
+ create_table :bootcamp_exercise_concepts do |t|
+ t.references :exercise, null: false, foreign_key: {to_table: :bootcamp_exercises}
+ t.references :concept, null: false, foreign_key: {to_table: :bootcamp_concepts}
+
+ t.timestamps
+
+ t.index [:exercise_id, :concept_id], unique: true
+ end
+ end
+end
diff --git a/db/migrate/20250107162139_create_bootcamp_drawings.rb b/db/migrate/20250107162139_create_bootcamp_drawings.rb
new file mode 100644
index 0000000000..3df1d34537
--- /dev/null
+++ b/db/migrate/20250107162139_create_bootcamp_drawings.rb
@@ -0,0 +1,14 @@
+class CreateBootcampDrawings < ActiveRecord::Migration[7.0]
+ def change
+ return if Rails.env.production?
+
+ create_table :bootcamp_drawings do |t|
+ t.references :user, null: false, foreign_key: true
+
+ t.string :uuid, null: false
+ t.text :code, null: false
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20250108193404_add_code_to_bootcamp_data.rb b/db/migrate/20250108193404_add_code_to_bootcamp_data.rb
new file mode 100644
index 0000000000..2cfb1cf279
--- /dev/null
+++ b/db/migrate/20250108193404_add_code_to_bootcamp_data.rb
@@ -0,0 +1,7 @@
+class AddCodeToBootcampData < ActiveRecord::Migration[7.0]
+ def change
+ return if Rails.env.production?
+
+ add_column :user_bootcamp_data, :access_code, :string
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 4a45bb2023..bf95f788df 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema[7.0].define(version: 2025_01_08_145756) do
+ActiveRecord::Schema[7.0].define(version: 2025_01_08_193404) do
create_table "active_storage_attachments", charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t|
t.string "name", null: false
t.string "record_type", null: false
@@ -70,6 +70,115 @@
t.index ["slug"], name: "index_blog_posts_on_slug", unique: true
end
+ create_table "bootcamp_concepts", charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t|
+ t.string "slug", null: false
+ t.bigint "parent_id"
+ t.integer "level_idx", null: false
+ t.boolean "apex", default: false, null: false
+ t.string "title", null: false
+ t.text "description", null: false
+ t.text "content_markdown", null: false
+ t.text "content_html", null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.index ["parent_id"], name: "fk_rails_a7c513f5e1"
+ end
+
+ create_table "bootcamp_drawings", charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t|
+ t.bigint "user_id", null: false
+ t.string "uuid", null: false
+ t.text "code", null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.index ["user_id"], name: "index_bootcamp_drawings_on_user_id"
+ end
+
+ create_table "bootcamp_exercise_concepts", charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t|
+ t.bigint "exercise_id", null: false
+ t.bigint "concept_id", null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.index ["concept_id"], name: "index_bootcamp_exercise_concepts_on_concept_id"
+ t.index ["exercise_id", "concept_id"], name: "index_bootcamp_exercise_concepts_on_exercise_id_and_concept_id", unique: true
+ t.index ["exercise_id"], name: "index_bootcamp_exercise_concepts_on_exercise_id"
+ end
+
+ create_table "bootcamp_exercises", charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t|
+ t.bigint "project_id"
+ t.string "slug", null: false
+ t.integer "idx", null: false
+ t.string "title", null: false
+ t.text "description", null: false
+ t.integer "level_idx", null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.index ["level_idx"], name: "index_bootcamp_exercises_on_level_idx"
+ t.index ["project_id", "slug"], name: "index_bootcamp_exercises_on_project_id_and_slug", unique: true
+ t.index ["project_id"], name: "index_bootcamp_exercises_on_project_id"
+ end
+
+ create_table "bootcamp_levels", charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t|
+ t.integer "idx", null: false
+ t.string "title", null: false
+ t.text "description", null: false
+ t.text "content_markdown", null: false
+ t.text "content_html", null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ end
+
+ create_table "bootcamp_projects", charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t|
+ t.string "slug", null: false
+ t.string "title", null: false
+ t.text "description", null: false
+ t.text "introduction_markdown", null: false
+ t.text "introduction_html", null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ end
+
+ create_table "bootcamp_settings", charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t|
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.integer "level_idx", default: 1, null: false
+ end
+
+ create_table "bootcamp_solutions", charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t|
+ t.bigint "user_id"
+ t.bigint "exercise_id"
+ t.string "uuid", null: false
+ t.text "code", null: false
+ t.datetime "completed_at"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.index ["exercise_id"], name: "index_bootcamp_solutions_on_exercise_id"
+ t.index ["user_id", "exercise_id"], name: "index_bootcamp_solutions_on_user_id_and_exercise_id", unique: true
+ t.index ["user_id"], name: "index_bootcamp_solutions_on_user_id"
+ end
+
+ create_table "bootcamp_submissions", charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t|
+ t.string "uuid", null: false
+ t.bigint "solution_id"
+ t.integer "status", limit: 2, null: false
+ t.text "code", null: false
+ t.text "readonly_ranges", null: false
+ t.text "test_results", null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.index ["solution_id"], name: "index_bootcamp_submissions_on_solution_id"
+ end
+
+ create_table "bootcamp_user_projects", charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t|
+ t.bigint "user_id"
+ t.bigint "project_id"
+ t.integer "status", default: 0, null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.index ["project_id"], name: "index_bootcamp_user_projects_on_project_id"
+ t.index ["user_id", "project_id"], name: "index_bootcamp_user_projects_on_user_id_and_project_id", unique: true
+ t.index ["user_id"], name: "index_bootcamp_user_projects_on_user_id"
+ end
+
create_table "cohort_memberships", charset: "utf8mb4", collation: "utf8mb4_unicode_ci", force: :cascade do |t|
t.bigint "user_id", null: false
t.text "introduction", null: false
@@ -1316,6 +1425,8 @@
t.string "ppp_country"
t.string "checkout_session_id"
t.text "utm"
+ t.integer "level_idx", null: false, default: 0
+ t.string "access_code"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["user_id"], name: "index_user_bootcamp_data_on_user_id", unique: true
@@ -1657,6 +1768,11 @@
add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id"
add_foreign_key "blog_posts", "users", column: "author_id"
+ add_foreign_key "bootcamp_concepts", "bootcamp_concepts", column: "parent_id"
+ add_foreign_key "bootcamp_drawings", "users"
+ add_foreign_key "bootcamp_exercise_concepts", "bootcamp_concepts", column: "concept_id"
+ add_foreign_key "bootcamp_exercise_concepts", "bootcamp_exercises", column: "exercise_id"
+ add_foreign_key "bootcamp_submissions", "bootcamp_solutions", column: "solution_id"
add_foreign_key "cohort_memberships", "cohorts"
add_foreign_key "cohort_memberships", "users"
add_foreign_key "cohorts", "tracks"
diff --git a/docker/nginx.conf b/docker/nginx.conf
index 5282ee7747..d511ae839a 100644
--- a/docker/nginx.conf
+++ b/docker/nginx.conf
@@ -146,4 +146,9 @@ http {
server_name www.exercism.org .exercism.io .exercism.net .exercism.com .exercism.lol;
return 301 https://exercism.org$request_uri;
}
+
+ server {
+ server_name bootcamp.exercism.org
+ return 301 https://exercism.org$request_uri;
+ }
}
diff --git a/jest.config.js b/jest.config.js
index 4ec56723b7..7b1b42a085 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -6,7 +6,7 @@ const config = {
'^.+\\.[t|j]sx?$': 'babel-jest',
},
transformIgnorePatterns: [
- 'node_modules/(?!(highlightjs-(bqn|zig|chapel|jq|roc)|@ballerina/highlightjs-ballerina|@exercism/highlightjs-(arturo|uiua))/)',
+ 'node_modules/(?!(highlightjs-(bqn|zig|chapel|jq|roc|cobol)|@ballerina/highlightjs-ballerina|@exercism/highlightjs-(arturo|uiua))/)',
],
moduleNameMapper: {
'^[./a-zA-Z0-9$_-]+\\.svg$':
diff --git a/package.json b/package.json
index aa0a0c945f..358a4f2d06 100644
--- a/package.json
+++ b/package.json
@@ -2,18 +2,22 @@
"name": "exercism",
"private": true,
"dependencies": {
+ "@babel/plugin-transform-regenerator": "^7.25.9",
"@ballerina/highlightjs-ballerina": "^1.0.1",
"@bugsnag/js": "^7.10.0",
"@bugsnag/plugin-react": "^7.19.0",
+ "@codemirror/commands": "^6.7.1",
"@codemirror/lang-cpp": "^6.0.2",
"@codemirror/lang-java": "^6.0.1",
- "@codemirror/lang-javascript": "^6.2.2",
+ "@codemirror/lang-javascript": "^6.2.1",
"@codemirror/lang-php": "^6.0.1",
"@codemirror/lang-python": "^6.1.5",
"@codemirror/lang-rust": "^6.0.1",
"@codemirror/lang-yaml": "^6.1.1",
"@codemirror/legacy-modes": "^6.4.0",
+ "@codemirror/state": "^6.5.0",
"@codemirror/theme-one-dark": "^6.1.2",
+ "@codemirror/view": "^6.24.0",
"@exercism/active-background": "^0.6.2",
"@exercism/codemirror-lang-arturo": "^0.1.6",
"@exercism/codemirror-lang-gleam": "^2.0.1",
@@ -22,9 +26,13 @@
"@exercism/highlightjs-arturo": "^0.0.2",
"@exercism/highlightjs-gdscript": "^0.0.1",
"@exercism/highlightjs-uiua": "^0.0.4",
+ "codemirror-lang-jikiscript": "dem4ron/codemirror-lang-jikiscript#jikify",
"@exercism/twine2-story-format": "https://github.com/exercism/twine2-story-format.git",
+ "@floating-ui/dom": "^1.6.12",
"@gleam-lang/highlight.js-gleam": "^1.0.0",
+ "@hotwired/stimulus": "^3.2.2",
"@hotwired/turbo-rails": "^7.3.0",
+ "@plutojl/lang-julia": "^0.12.1",
"@popperjs/core": "^2.11.8",
"@rails/actioncable": "^6.0.0",
"@sector-labs/postcss-inline-class": "^0.0.6",
@@ -32,23 +40,28 @@
"@stripe/stripe-js": "^1.54.1",
"@tanstack/react-query": "^4.33.0",
"@tippyjs/react": "^4.2.5",
+ "@types/canvas-confetti": "^1.6.4",
+ "@uidotdev/usehooks": "^2.4.1",
"@xstate/react": "^3.2.2",
"abortcontroller-polyfill": "^1.7.3",
"ace-builds": "^1.4.12",
"actioncable": "^5.2.4-3",
- "autoprefixer": "^10.4.0",
+ "animejs": "^3.2.2",
+ "autoprefixer": "latest",
"browserslist-to-esbuild": "^1.1.1",
"canvas-confetti": "^1.9.3",
"chart.js": "^3.1.0",
"codemirror": "^6.0.1",
"codemirror-lang-elixir": "https://github.com/sachinraja/codemirror-lang-elixir",
"codemirror-lang-jq": "^1.0.0",
- "codemirror6-abap": "^0.1.3",
+ "codemirror-readonly-ranges": "^0.1.0-alpha.2",
"copy-to-clipboard": "^3.3.1",
"core-js": "^3.6.5",
"cssnano": "^5.0.17",
"currency.js": "^2.0.4",
"dayjs": "^1.8.35",
+ "didyoumean": "^1.2.2",
+ "diff": "^7.0.0",
"diff2html": "^3.4.5",
"easymde": "^2.15.0",
"esbuild": "^0.14.5",
@@ -56,7 +69,7 @@
"focus-visible": "^5.2.0",
"fontfaceobserver": "^2.1.0",
"global": "^4.4.0",
- "highlight.js": "11.9.0",
+ "highlight.js": "^11.10.0",
"highlightjs-bqn": "^0.0.1",
"highlightjs-chapel": "^0.1.0",
"highlightjs-cobol": "^0.3.1",
@@ -66,14 +79,18 @@
"highlightjs-sap-abap": "^0.2.0",
"highlightjs-zig": "^1.0.2",
"humps": "^2.0.1",
- "lang-julia": "^0.1.0",
+ "i18next": "^23.16.6",
+ "i18next-resources-to-backend": "^1.2.1",
+ "immer": "^10.1.1",
"localforage": "^1.9.0",
"lodash": "^4.17.20",
+ "lodash.clonedeep": "^4.5.0",
+ "lodash.isequal": "^4.5.0",
"lottie-web": "^5.12.2",
"mousetrap": "^1.6.5",
"nim-codemirror-mode": "^0.3.0",
"pluralize": "^8.0.0",
- "postcss": "^8.4.5",
+ "postcss": "latest",
"postcss-cli": "^9.1.0",
"postcss-flexbugs-fixes": "^5.0.2",
"postcss-hexrgba": "^2.1.0",
@@ -82,9 +99,9 @@
"postcss-reuse": "^2.2.0",
"prop-types": "^15.7.2",
"qs": "^6.9.6",
- "react": "^18.2.0",
+ "react": "^18.3.1",
"react-app-polyfill": "^2.0.0",
- "react-dom": "^18.2.0",
+ "react-dom": "^18.3.1",
"react-error-boundary": "^3.1.0",
"react-fast-compare": "^3.2.0",
"react-google-recaptcha": "^2.1.0",
@@ -97,20 +114,30 @@
"reconnecting-websocket": "3.2.2",
"regenerator-runtime": "^0.13.7",
"rough-notation": "^0.5.1",
- "tailwindcss": "^3.4.14",
+ "string-similarity-js": "^2.1.4",
+ "tailwindcss": "latest",
+ "tslib": "^2.8.1",
+ "typewriter-effect": "^2.21.0",
"ua-parser-js": "^1.0.37",
"use-is-mounted": "^1.0.0",
"use-memory-value": "^1.2.0",
"uuid": "^8.3.1",
- "xstate": "^4.38.2"
+ "xstate": "^4.38.2",
+ "zustand": "^5.0.1"
},
"version": "0.1.0",
"devDependencies": {
+ "@babel/cli": "^7.26.4",
"@babel/core": "^7.14.3",
- "@babel/plugin-transform-runtime": "^7.14.3",
+ "@babel/plugin-proposal-class-properties": "^7.18.6",
+ "@babel/plugin-proposal-private-methods": "^7.18.6",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-transform-object-rest-spread": "^7.25.9",
+ "@babel/plugin-transform-runtime": "^7.25.9",
"@babel/preset-env": "^7.14.2",
"@babel/preset-react": "^7.13.13",
"@babel/preset-typescript": "^7.13.0",
+ "@happy-dom/global-registrator": "^15.11.6",
"@jackfranklin/test-data-bot": "^1.3.0",
"@prettier/plugin-ruby": "^0.18.2",
"@testing-library/dom": "^9.3.1",
@@ -118,10 +145,16 @@
"@testing-library/react": "^14.0.0",
"@testing-library/user-event": "^12.6.0",
"@types/actioncable": "^5.2.3",
+ "@types/animejs": "^3.1.12",
+ "@types/bun": "^1.1.13",
+ "@types/didyoumean": "^1.2.3",
+ "@types/diff": "^6.0.0",
"@types/fontfaceobserver": "^0.0.6",
"@types/humps": "^2.0.0",
"@types/jquery": "^3.5.5",
"@types/lodash": "^4.14.165",
+ "@types/lodash.clonedeep": "^4.5.9",
+ "@types/lodash.isequal": "^4.5.8",
"@types/mousetrap": "^1.6.8",
"@types/normalize-url": "^4.2.0",
"@types/pluralize": "^0.0.29",
@@ -135,7 +168,6 @@
"@typescript-eslint/eslint-plugin": "^4.4.0",
"@typescript-eslint/parser": "^4.4.0",
"babel-jest": "^26.5.0",
- "babel-plugin-dynamic-import-node-babel-7": "^2.0.7",
"babel-plugin-macros": "^3.1.0",
"babel-plugin-transform-react-remove-prop-types": "^0.4.24",
"esbuild-jest": "^0.5.0",
@@ -150,6 +182,7 @@
"identity-obj-proxy": "^3.0.0",
"isomorphic-fetch": "^3.0.0",
"jest": "27",
+ "jest-extended": "^4.0.2",
"msw": "^0.21.2",
"prettier": "^2.0.5",
"pretty-quick": "^2.0.1",
@@ -162,5 +195,8 @@
"build:css": "postcss ./app/css/packs/**/*.css --dir .built-assets",
"build": "./app/javascript/esbuild.js",
"prepare": "husky install"
+ },
+ "resolutions": {
+ "@codemirror/state": "6.5.0"
}
}
diff --git a/tailwind.config.js b/tailwind.config.js
index 8a47825f07..3ff47a9ce9 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -86,6 +86,49 @@ module.exports = {
navDropdown: '0px 6px 28px 4px rgba(var(--shadowColorMain), 0.5)',
},
colors: {
+ 'bootcamp-success-light': '#edfff6',
+ 'bootcamp-success-dark': '#00bf63',
+ 'bootcamp-success-text': '#006032',
+ 'bootcamp-fail-light': '#fff7f7',
+ 'bootcamp-fail-dark': '#ff5757',
+ 'bootcamp-fail-text': '#ff5757',
+ 'bootcamp-purple': '#7029f5',
+ 'bootcamp-light-purple': '#EFEDFF',
+ 'bootcamp-very-light-purple': '#f6f5ff',
+
+ /* REPLACE */
+ 'gray-200': 'rgb(229 231 235)',
+ 'gray-300': 'rgb(209 213 219)',
+ 'gray-400': 'rgb(156 163 175)',
+ 'gray-600': 'rgb(209 213 219)',
+ 'gray-500': 'rgb(107 114 128)',
+ 'gray-800': 'rgb(31 41 55)',
+ 'gray-900': 'rgb(17 24 39)',
+ 'slate-200': 'rgb(209 213 219)',
+ 'slate-400': 'rgb(148 163 184)',
+ 'indigo-300': 'rgb(191 204 255)',
+ 'blue-100': 'rgb(227 236 255)',
+ 'blue-300': 'rgb(191 204 255)',
+ 'blue-400': 'rgb(59 130 246)',
+ 'blue-500': 'rgb(59 130 246)',
+ 'blue-700': 'rgb(59 130 246)',
+ 'red-100': 'rgb(255 236 236)',
+ 'red-300': 'rgb(255 236 236)',
+ 'red-500': 'rgb(239 68 68)',
+ 'red-700': 'rgb(239 68 68)',
+ 'red-900': 'rgb(107 10 10)',
+ 'green-100': 'rgb(236 253 245)',
+ 'green-300': 'rgb(236 253 245)',
+ 'green-400': 'rgb(0 230 118)',
+ 'green-500': 'rgb(0 230 118)',
+ 'green-700': 'rgb(0 128 0)',
+
+ 'thick-border-blue': '#F4F6FF',
+ 'primary-blue': 'rgb(46 87 232)',
+ 'background-purple': '#FCF9FF',
+ 'thin-border-blue': '#E2E9FF',
+ 'jiki-purple': '#7128F5',
+
transparent: 'transparent',
current: 'currentColor',
@@ -322,6 +365,8 @@ module.exports = {
auto: 'auto',
arbitary: '1px',
fill: '100%',
+ full: '100%',
+ screen: '100vh',
32: '32px',
48: '48px',
100: '100%',
@@ -382,6 +427,7 @@ module.exports = {
auto: 'auto',
arbitary: '1px',
fill: '100%',
+ full: '100%',
'5-7': '71.4%',
'1-3': '33.3%',
'1-2': '50%',
@@ -404,6 +450,7 @@ module.exports = {
menu: '40',
dropdown: '50',
tooltip: '80',
+ 'tooltip-content': '81',
modal: '100',
redirect: '150',
},
diff --git a/test/commands/bootcamp/select_next_exercise_test.rb b/test/commands/bootcamp/select_next_exercise_test.rb
new file mode 100644
index 0000000000..477c13ce73
--- /dev/null
+++ b/test/commands/bootcamp/select_next_exercise_test.rb
@@ -0,0 +1,93 @@
+require 'test_helper'
+
+class Bootcamp::SelectNextExerciseTest < ActiveSupport::TestCase
+ def setup
+ super
+
+ Bootcamp::Settings.instance.update(level_idx: 10)
+ end
+
+ test "returns exercise" do
+ user = create :user, :with_bootcamp_data
+ exercise = create :bootcamp_exercise
+
+ actual = Bootcamp::SelectNextExercise.(user)
+ assert_equal exercise, actual
+ end
+
+ test "returns exercise with lowest idx" do
+ user = create :user, :with_bootcamp_data
+ create :bootcamp_exercise, idx: 2
+ exercise = create :bootcamp_exercise, idx: 1
+ create :bootcamp_exercise, idx: 3
+
+ actual = Bootcamp::SelectNextExercise.(user)
+ assert_equal exercise, actual
+ end
+
+ test "doesn't return completed exercise" do
+ user = create :user, :with_bootcamp_data
+ project = create :bootcamp_project
+ solved_exercise = create(:bootcamp_exercise, idx: 1, project:)
+ exercise = create(:bootcamp_exercise, idx: 2, project:)
+
+ create :bootcamp_solution, user:, exercise: solved_exercise, completed_at: Time.current
+
+ actual = Bootcamp::SelectNextExercise.(user)
+ assert_equal exercise, actual
+ end
+
+ test "doesn't return completed exercise for user_project" do
+ user = create :user, :with_bootcamp_data
+ project = create :bootcamp_project
+ solved_exercise = create(:bootcamp_exercise, idx: 1, project:)
+ exercise = create(:bootcamp_exercise, idx: 2, project:)
+ create :bootcamp_user_project, user:, project:, status: :available
+
+ create :bootcamp_solution, :completed, user:, exercise: solved_exercise
+
+ actual = Bootcamp::SelectNextExercise.(user)
+ assert_equal exercise, actual
+ end
+
+ test "prefers exercise from existing user project" do
+ user = create :user, :with_bootcamp_data
+ create :bootcamp_exercise, idx: 1
+ exercise = create :bootcamp_exercise, idx: 2
+ create :bootcamp_user_project, user:, project: exercise.project, status: :available
+
+ actual = Bootcamp::SelectNextExercise.(user)
+ assert_equal exercise, actual
+ end
+
+ test "doesn't take exercise from locked user project" do
+ user = create :user, :with_bootcamp_data
+ locked = create :bootcamp_exercise, idx: 1
+ exercise = create :bootcamp_exercise, idx: 2
+ create :bootcamp_user_project, user:, project: locked.project, status: :locked
+
+ actual = Bootcamp::SelectNextExercise.(user)
+ assert_equal exercise, actual
+ end
+
+ test "honours passed in project" do
+ user = create :user, :with_bootcamp_data
+ other = create :bootcamp_exercise, idx: 1
+ exercise = create :bootcamp_exercise, idx: 2
+ create :bootcamp_user_project, user:, project: other.project, status: :available
+ create :bootcamp_user_project, user:, project: exercise.project, status: :available
+
+ actual = Bootcamp::SelectNextExercise.(user, project: exercise.project)
+ assert_equal exercise, actual
+ end
+
+ test "copes with locked project passed in project" do
+ user = create :user, :with_bootcamp_data
+ locked = create :bootcamp_exercise, idx: 1
+ exercise = create :bootcamp_exercise, idx: 2
+ create :bootcamp_user_project, user:, project: locked.project, status: :locked
+
+ actual = Bootcamp::SelectNextExercise.(user, project: locked.project)
+ assert_equal exercise, actual
+ end
+end
diff --git a/test/commands/bootcamp/solution/complete_test.rb b/test/commands/bootcamp/solution/complete_test.rb
new file mode 100644
index 0000000000..d4f0a3a23a
--- /dev/null
+++ b/test/commands/bootcamp/solution/complete_test.rb
@@ -0,0 +1,31 @@
+require 'test_helper'
+
+class Bootcamp::Solution::CompleteTest < ActiveSupport::TestCase
+ test "completes the solution" do
+ freeze_time do
+ user = create :user, :with_bootcamp_data
+ project = create :bootcamp_project
+ create(:bootcamp_user_project, user:, project:)
+ exercise = create(:bootcamp_exercise, project:)
+ solution = create :bootcamp_solution, exercise:, user:, completed_at: Time.current
+
+ Bootcamp::Solution::Complete.(solution)
+
+ assert_equal Time.current, solution.completed_at
+ assert solution.completed?
+ end
+ end
+
+ test "updates the status of the project" do
+ freeze_time do
+ user = create :user
+ project = create :bootcamp_project
+ user_project = create(:bootcamp_user_project, user:, project:)
+ exercise = create(:bootcamp_exercise, project:)
+ solution = create :bootcamp_solution, exercise:, user:, completed_at: Time.current
+
+ Bootcamp::UserProject::UpdateStatus.expects(:call).with(user_project)
+ Bootcamp::Solution::Complete.(solution)
+ end
+ end
+end
diff --git a/test/commands/bootcamp/solution/create_test.rb b/test/commands/bootcamp/solution/create_test.rb
new file mode 100644
index 0000000000..d30c5a774b
--- /dev/null
+++ b/test/commands/bootcamp/solution/create_test.rb
@@ -0,0 +1,67 @@
+require 'test_helper'
+
+class Bootcamp::Solution::CreateTest < ActiveSupport::TestCase
+ test "works normally" do
+ user = create :user, :with_bootcamp_data
+ project = create :bootcamp_project
+ create :bootcamp_user_project, user:, project:, status: :available
+ exercise = create(:bootcamp_exercise, project:)
+ exercise.stubs(:stub).returns("Something")
+
+ solution = Bootcamp::Solution::Create.(user, exercise)
+ assert solution.persisted?
+ assert_equal user, solution.user
+ assert_equal exercise, solution.exercise
+ end
+
+ test "sets basic code" do
+ code = "def foo\nend"
+
+ user = create :user, :with_bootcamp_data
+ project = create :bootcamp_project
+ create :bootcamp_user_project, user:, project:, status: :available
+ exercise = create(:bootcamp_exercise, project:)
+ exercise.stubs(:stub).returns(code)
+
+ solution = Bootcamp::Solution::Create.(user, exercise)
+ assert_equal code, solution.code
+ end
+
+ test "uses solutions from previous exercises" do
+ exercise_1_slug = "part-1"
+ exercise_2_slug = "ex-2"
+
+ solution_1_code = "first\nbit"
+ solution_2_code = "second\ppart"
+ template = "Hello {{EXERCISE_#{exercise_1_slug}}} World {{EXERCISE_#{exercise_2_slug}}} Yay!"
+ expected = "Hello #{solution_1_code} World #{solution_2_code} Yay!"
+
+ user = create :user, :with_bootcamp_data
+ project = create :bootcamp_project
+ create :bootcamp_user_project, user:, project:, status: :available
+ exercise_1 = create :bootcamp_exercise, project:, slug: exercise_1_slug
+ exercise_2 = create :bootcamp_exercise, project:, slug: exercise_2_slug
+ exercise_3 = create(:bootcamp_exercise, project:)
+ exercise_3.stubs(:stub).returns(template)
+
+ create :bootcamp_solution, user:, exercise: exercise_1, code: solution_1_code, completed_at: Time.current
+ create :bootcamp_solution, user:, exercise: exercise_2, code: solution_2_code, completed_at: Time.current
+
+ solution = Bootcamp::Solution::Create.(user, exercise_3)
+
+ assert_equal expected, solution.code
+ end
+
+ test "guards against not available exercises" do
+ user = create :user, :with_bootcamp_data
+ project = create :bootcamp_project
+ create(:bootcamp_user_project, user:, project:)
+ exercise = create(:bootcamp_exercise, project:)
+
+ Bootcamp::UserProject.any_instance.expects(:exercise_available?).with(exercise).returns(false)
+
+ assert_raises ExerciseLockedError do
+ Bootcamp::Solution::Create.(user, exercise)
+ end
+ end
+end
diff --git a/test/commands/bootcamp/submission/create_test.rb b/test/commands/bootcamp/submission/create_test.rb
new file mode 100644
index 0000000000..9ff2d9124a
--- /dev/null
+++ b/test/commands/bootcamp/submission/create_test.rb
@@ -0,0 +1,47 @@
+require 'test_helper'
+
+class Bootcamp::Submission::CreateTest < ActiveSupport::TestCase
+ test "creates a submission" do
+ solution = create :bootcamp_solution
+ code = "puts 'hello'"
+ test_results = {
+ status: "fail",
+ tests: [
+ test_1: 'pass',
+ test_2: 'fail'
+ ]
+ }
+ readonly_ranges = [{ from: '0', to: '4' }, { from: '6', to: '11' }]
+
+ submission = Bootcamp::Submission::Create.(solution, code, test_results, readonly_ranges)
+
+ assert_equal solution, submission.solution
+ assert_equal code, submission.code
+ assert_equal test_results, submission.test_results
+ assert_equal readonly_ranges, submission.readonly_ranges
+ end
+
+ test "fail fails" do
+ submission = Bootcamp::Submission::Create.(
+ create(:bootcamp_solution), "",
+ {
+ status: "fail", tests: []
+ },
+ []
+ )
+
+ assert_equal :fail, submission.status
+ end
+
+ test "pass passes" do
+ submission = Bootcamp::Submission::Create.(
+ create(:bootcamp_solution), "",
+ {
+ status: "pass", tests: []
+ },
+ []
+ )
+
+ assert_equal :pass, submission.status
+ end
+end
diff --git a/test/commands/bootcamp/update_level_test.rb b/test/commands/bootcamp/update_level_test.rb
new file mode 100644
index 0000000000..a552c2afdc
--- /dev/null
+++ b/test/commands/bootcamp/update_level_test.rb
@@ -0,0 +1,73 @@
+require 'test_helper'
+
+class Bootcamp::UpdateUserLevelTest < ActiveSupport::TestCase
+ test "sets to 0 with no exercises" do
+ user = create :user, :with_bootcamp_data
+
+ Bootcamp::UpdateUserLevel.(user)
+
+ assert_equal 0, user.bootcamp_data.level_idx
+ end
+
+ test "sets to 0 with no completed exercises" do
+ user = create :user, :with_bootcamp_data
+ create :bootcamp_exercise
+
+ Bootcamp::UpdateUserLevel.(user)
+
+ assert_equal 0, user.bootcamp_data.level_idx
+ end
+
+ test "sets to level when completed" do
+ user = create :user, :with_bootcamp_data
+ create :bootcamp_level, idx: 1
+ exercise = create :bootcamp_exercise, level_idx: 1
+ create(:bootcamp_solution, :completed, user:, exercise:)
+
+ Bootcamp::UpdateUserLevel.(user)
+
+ assert_equal 1, user.bootcamp_data.level_idx
+ end
+
+ test "does not set when not all completed" do
+ user = create :user, :with_bootcamp_data
+ create :bootcamp_level, idx: 1
+ create :bootcamp_solution, user:, exercise: create(:bootcamp_exercise, level_idx: 1)
+ create :bootcamp_solution, :completed, user:, exercise: create(:bootcamp_exercise, level_idx: 1)
+
+ Bootcamp::UpdateUserLevel.(user)
+
+ assert_equal 0, user.bootcamp_data.level_idx
+ end
+
+ test "sets to highest level when multiple completed" do
+ user = create :user, :with_bootcamp_data
+ create :bootcamp_level, idx: 1
+ create :bootcamp_level, idx: 2
+ exercise_1 = create :bootcamp_exercise, level_idx: 1
+ exercise_2 = create :bootcamp_exercise, level_idx: 2
+ create :bootcamp_solution, :completed, user:, exercise: exercise_1
+ create :bootcamp_solution, :completed, user:, exercise: exercise_2
+
+ Bootcamp::UpdateUserLevel.(user)
+
+ assert_equal 2, user.bootcamp_data.level_idx
+ end
+
+ test "requires consecutive levels" do
+ user = create :user, :with_bootcamp_data
+ create :bootcamp_level, idx: 1
+ create :bootcamp_level, idx: 2
+ create :bootcamp_level, idx: 3
+ exercise_1 = create :bootcamp_exercise, level_idx: 1
+ exercise_2 = create :bootcamp_exercise, level_idx: 2
+ exercise_3 = create :bootcamp_exercise, level_idx: 3
+ create :bootcamp_solution, :completed, user:, exercise: exercise_1
+ create :bootcamp_solution, user:, exercise: exercise_2
+ create :bootcamp_solution, :completed, user:, exercise: exercise_3
+
+ Bootcamp::UpdateUserLevel.(user)
+
+ assert_equal 1, user.bootcamp_data.level_idx
+ end
+end
diff --git a/test/commands/bootcamp/user_project/update_status_test.rb b/test/commands/bootcamp/user_project/update_status_test.rb
new file mode 100644
index 0000000000..48c41c1f6c
--- /dev/null
+++ b/test/commands/bootcamp/user_project/update_status_test.rb
@@ -0,0 +1,44 @@
+require 'test_helper'
+
+class Bootcamp::UserProject::UpdateStatusTest < ActiveSupport::TestCase
+ test "locked with no exercises" do
+ # This is mainly a sanity test for the rest
+ project = create :bootcamp_project
+ user_project = create(:bootcamp_user_project, project:)
+
+ Bootcamp::UserProject::UpdateStatus.(user_project)
+ assert_equal :locked, user_project.status
+ end
+
+ test "available with an exercise with no solution" do
+ # This is mainly a sanity test for the rest
+ project = create :bootcamp_project
+ create(:bootcamp_exercise, project:)
+ user_project = create(:bootcamp_user_project, project:)
+
+ Bootcamp::UserProject::UpdateStatus.(user_project)
+ assert_equal :available, user_project.status
+ end
+
+ test "available if there's an in progress solution" do
+ user = create :user, :with_bootcamp_data
+ project = create :bootcamp_project
+ exercise = create(:bootcamp_exercise, project:)
+ create(:bootcamp_solution, exercise:, user:)
+
+ user_project = create(:bootcamp_user_project, user:, project:)
+ Bootcamp::UserProject::UpdateStatus.(user_project)
+ assert_equal :available, user_project.status
+ end
+
+ test "completed if all exercises have completed solutions" do
+ user = create :user, :with_bootcamp_data
+ project = create :bootcamp_project
+ exercise = create(:bootcamp_exercise, project:)
+ create :bootcamp_solution, exercise:, user:, completed_at: Time.current
+
+ user_project = create(:bootcamp_user_project, user:, project:)
+ Bootcamp::UserProject::UpdateStatus.(user_project)
+ assert_equal :completed, user_project.status
+ end
+end
diff --git a/test/commands/user/bootstrap_test.rb b/test/commands/user/bootstrap_test.rb
index 4cc4bfe84d..67cf0f48c7 100644
--- a/test/commands/user/bootstrap_test.rb
+++ b/test/commands/user/bootstrap_test.rb
@@ -38,7 +38,7 @@ class User::BootstrapTest < ActiveSupport::TestCase
User::Bootstrap.(user)
end
- test "becomes attendee and subscribes to onboarding emails if paid" do
+ test "becomes attendee and subscribes to onboarding emails if paid email" do
email = "#{SecureRandom.uuid}@test.com"
ubd = create :user_bootcamp_data, email:, paid_at: Time.current
user = create(:user, email:)
@@ -51,7 +51,7 @@ class User::BootstrapTest < ActiveSupport::TestCase
assert_equal user.id, ubd.reload.user_id
end
- test "does not becomes attendee if not paid" do
+ test "does not becomes attendee if not paid email" do
email = "#{SecureRandom.uuid}@test.com"
ubd = create(:user_bootcamp_data, email:)
user = create(:user, email:)
@@ -62,4 +62,27 @@ class User::BootstrapTest < ActiveSupport::TestCase
refute user.reload.bootcamp_attendee?
assert_equal user.id, ubd.reload.user_id
end
+
+ test "becomes attendee and subscribes to onboarding emails if paid access code" do
+ ubd = create :user_bootcamp_data, paid_at: Time.current, access_code: SecureRandom.hex(8)
+ user = create :user
+
+ # Always does this once by default anyway
+ User::Bootcamp::SubscribeToOnboardingEmails.expects(:defer).with(ubd).twice
+
+ User::Bootstrap.(user, bootcamp_access_code: ubd.access_code)
+ assert user.reload.bootcamp_attendee?
+ assert_equal user.id, ubd.reload.user_id
+ end
+
+ test "does not becomes attendee if not paid access code" do
+ ubd = create :user_bootcamp_data, access_code: SecureRandom.hex(8)
+ user = create :user
+
+ User::Bootcamp::SubscribeToOnboardingEmails.expects(:defer).with(ubd).twice
+
+ User::Bootstrap.(user, bootcamp_access_code: ubd.access_code)
+ refute user.reload.bootcamp_attendee?
+ assert_equal user.id, ubd.reload.user_id
+ end
end
diff --git a/test/controllers/api/base_test_case.rb b/test/controllers/api/base_test_case.rb
index 2a5d6b3c09..ffb27a7af9 100644
--- a/test/controllers/api/base_test_case.rb
+++ b/test/controllers/api/base_test_case.rb
@@ -24,5 +24,13 @@ def setup_user(user = nil)
auth_token = create :user_auth_token, user: @current_user
@headers = { 'Authorization' => "Token token=#{auth_token.token}" }
end
+
+ def assert_json_response(expected)
+ # expected[:meta] ||= {}
+ # expected[:meta][:valid_at] ||= Time.current.to_f.to_s.delete('.')
+
+ actual = response.parsed_body
+ assert_equal expected.to_json, actual.to_json
+ end
end
end
diff --git a/test/controllers/api/bootcamp/solutions_controller_test.rb b/test/controllers/api/bootcamp/solutions_controller_test.rb
new file mode 100644
index 0000000000..2b389ed17b
--- /dev/null
+++ b/test/controllers/api/bootcamp/solutions_controller_test.rb
@@ -0,0 +1,37 @@
+require_relative '../base_test_case'
+
+class API::Bootcamp::SolutionsControllerTest < API::BaseTestCase
+ test "complete: proxies and returns 200" do
+ freeze_time do
+ user = create :user
+ solution = create(:bootcamp_solution, user:)
+ create :bootcamp_user_project, user:, project: solution.project
+
+ Bootcamp::Solution::Complete.expects(:call).with(solution)
+
+ setup_user(user)
+ patch complete_api_bootcamp_solution_url(solution), headers: @headers
+
+ assert_response :ok
+ assert_json_response({ next_exercise: nil })
+ end
+ end
+
+ test "complete: returns next exercise" do
+ freeze_time do
+ user = create :user
+ solution = create(:bootcamp_solution, user:)
+ project = solution.project
+ create(:bootcamp_user_project, user:, project:)
+ next_exercise = create(:bootcamp_exercise, project:)
+
+ setup_user(user)
+ patch complete_api_bootcamp_solution_url(solution), headers: @headers
+
+ assert_response :ok
+ assert_json_response({
+ next_exercise: SerializeBootcampExercise.(next_exercise)
+ })
+ end
+ end
+end
diff --git a/test/controllers/api/bootcamp/submissions_controller_test.rb b/test/controllers/api/bootcamp/submissions_controller_test.rb
new file mode 100644
index 0000000000..ccec8eed25
--- /dev/null
+++ b/test/controllers/api/bootcamp/submissions_controller_test.rb
@@ -0,0 +1,45 @@
+require_relative '../base_test_case'
+
+class API::Bootcamp::SubmissionsControllerTest < API::BaseTestCase
+ test "create: returns 204" do
+ status = "fail"
+ tests = [
+ { slug: "test_1", status: "pass" },
+ { slug: "test_2", status: "fail" }
+ ]
+
+ readonly_ranges = [
+ { 'from': '0', 'to': '4' },
+ { 'from': '6', 'to': '11' }
+ ]
+ test_results = {
+ status:,
+ tests:
+ }
+ code = "puts 'hello'"
+
+ freeze_time do
+ user = create :user
+ solution = create(:bootcamp_solution, user:)
+ params = {
+ submission: {
+ code:,
+ test_results:,
+ readonly_ranges:
+ }
+ }
+
+ setup_user(user)
+ post api_bootcamp_solution_submissions_url(solution, params), headers: @headers
+
+ submission = Bootcamp::Submission.last
+
+ assert_response :created
+ assert_json_response({ submission: { uuid: submission.uuid } })
+
+ assert_equal status.to_sym, submission.status
+ assert_equal test_results, submission.test_results
+ assert_equal readonly_ranges, submission.readonly_ranges
+ end
+ end
+end
diff --git a/test/factories/bootcamp/concepts.rb b/test/factories/bootcamp/concepts.rb
new file mode 100644
index 0000000000..84074dacbc
--- /dev/null
+++ b/test/factories/bootcamp/concepts.rb
@@ -0,0 +1,9 @@
+FactoryBot.define do
+ factory :bootcamp_concept, class: "Bootcamp::Concept" do
+ level { Bootcamp::Level.first || create(:bootcamp_level) }
+ slug { "Some Concept" }
+ title { "Some Concept" }
+ description { "Some Concept" }
+ content_markdown { "Some Concept" }
+ end
+end
diff --git a/test/factories/bootcamp/drawings.rb b/test/factories/bootcamp/drawings.rb
new file mode 100644
index 0000000000..9b30bbbb4c
--- /dev/null
+++ b/test/factories/bootcamp/drawings.rb
@@ -0,0 +1,5 @@
+FactoryBot.define do
+ factory :bootcamp_drawing, class: 'Bootcamp::Drawing' do
+ user
+ end
+end
diff --git a/test/factories/bootcamp/exercise_concepts.rb b/test/factories/bootcamp/exercise_concepts.rb
new file mode 100644
index 0000000000..afcf3463ff
--- /dev/null
+++ b/test/factories/bootcamp/exercise_concepts.rb
@@ -0,0 +1,6 @@
+FactoryBot.define do
+ factory :bootcamp_exercise_concept, class: "Bootcamp::ExerciseConcept" do
+ exercise { create(:bootcamp_exercise) }
+ concept { create(:bootcamp_concept) }
+ end
+end
diff --git a/test/factories/bootcamp/exercises.rb b/test/factories/bootcamp/exercises.rb
new file mode 100644
index 0000000000..5dfb3da732
--- /dev/null
+++ b/test/factories/bootcamp/exercises.rb
@@ -0,0 +1,10 @@
+FactoryBot.define do
+ factory :bootcamp_exercise, class: "Bootcamp::Exercise" do
+ project { create(:bootcamp_project) }
+ slug { SecureRandom.hex }
+ idx { project.exercises.count + 1 }
+ title { "Exercise Title" }
+ description { "Exercise Description" }
+ level_idx { (Bootcamp::Level.first || create(:bootcamp_level)).idx }
+ end
+end
diff --git a/test/factories/bootcamp/levels.rb b/test/factories/bootcamp/levels.rb
new file mode 100644
index 0000000000..3f8aa4dbe3
--- /dev/null
+++ b/test/factories/bootcamp/levels.rb
@@ -0,0 +1,8 @@
+FactoryBot.define do
+ factory :bootcamp_level, class: "Bootcamp::Level" do
+ idx { Bootcamp::Level.count + 1 }
+ title { "Level Title" }
+ description { "Level Description" }
+ content_markdown { "Level Content Markdown" }
+ end
+end
diff --git a/test/factories/bootcamp/projects.rb b/test/factories/bootcamp/projects.rb
new file mode 100644
index 0000000000..1171a9d2c6
--- /dev/null
+++ b/test/factories/bootcamp/projects.rb
@@ -0,0 +1,8 @@
+FactoryBot.define do
+ factory :bootcamp_project, class: "Bootcamp::Project" do
+ slug { "slug-#{SecureRandom.hex}" }
+ title { "Project Title" }
+ description { "Project Description" }
+ introduction_markdown { "Project Introduction" }
+ end
+end
diff --git a/test/factories/bootcamp/settings.rb b/test/factories/bootcamp/settings.rb
new file mode 100644
index 0000000000..52adb0712c
--- /dev/null
+++ b/test/factories/bootcamp/settings.rb
@@ -0,0 +1,4 @@
+FactoryBot.define do
+ factory :bootcamp_settings, class: "Bootcamp::Settings" do
+ end
+end
diff --git a/test/factories/bootcamp/solutions.rb b/test/factories/bootcamp/solutions.rb
new file mode 100644
index 0000000000..794196b696
--- /dev/null
+++ b/test/factories/bootcamp/solutions.rb
@@ -0,0 +1,11 @@
+FactoryBot.define do
+ factory :bootcamp_solution, class: "Bootcamp::Solution" do
+ user
+ exercise { create(:bootcamp_exercise) }
+ code { "Some random code" }
+
+ trait :completed do
+ completed_at { Time.current }
+ end
+ end
+end
diff --git a/test/factories/bootcamp/submissions.rb b/test/factories/bootcamp/submissions.rb
new file mode 100644
index 0000000000..39ca29de42
--- /dev/null
+++ b/test/factories/bootcamp/submissions.rb
@@ -0,0 +1,15 @@
+FactoryBot.define do
+ factory :bootcamp_submission, class: "Bootcamp::Submission" do
+ solution { create(:bootcamp_solution) }
+ code { "Some code" }
+ test_results do
+ {
+ status: :pass,
+ tests: []
+ }
+ end
+ readonly_ranges do
+ []
+ end
+ end
+end
diff --git a/test/factories/bootcamp/user_projects.rb b/test/factories/bootcamp/user_projects.rb
new file mode 100644
index 0000000000..a610fbe87f
--- /dev/null
+++ b/test/factories/bootcamp/user_projects.rb
@@ -0,0 +1,6 @@
+FactoryBot.define do
+ factory :bootcamp_user_project, class: "Bootcamp::UserProject" do
+ user { create(:user, :with_bootcamp_data) }
+ project { create(:bootcamp_project) }
+ end
+end
diff --git a/test/factories/users.rb b/test/factories/users.rb
index ec8c15d361..68946d2ddf 100644
--- a/test/factories/users.rb
+++ b/test/factories/users.rb
@@ -124,5 +124,11 @@
)
end
end
+
+ trait :with_bootcamp_data do
+ after(:create) do |user, _evaluator|
+ user.create_bootcamp_data!(paid_at: Time.current)
+ end
+ end
end
end
diff --git a/test/javascript/interpreter/execution-context.test.ts b/test/javascript/interpreter/execution-context.test.ts
new file mode 100644
index 0000000000..02145c195f
--- /dev/null
+++ b/test/javascript/interpreter/execution-context.test.ts
@@ -0,0 +1,25 @@
+import { interpret } from '@/interpreter/interpreter'
+import type { ExecutionContext } from '@/interpreter/executor'
+
+describe('execution context', () => {
+ describe('externalFunctions', () => {
+ test('function', () => {
+ const echos: string[] = []
+ const context = {
+ externalFunctions: [
+ {
+ name: 'echo',
+ func: (_: ExecutionContext, value: any) => {
+ echos.push(value.toString())
+ },
+ description: 'Sample function',
+ },
+ ],
+ }
+
+ interpret('echo(1)', context)
+ expect(echos).toBeArrayOfSize(1)
+ expect(echos[0]).toBe('1')
+ })
+ })
+})
diff --git a/test/javascript/interpreter/ihid.test.ts b/test/javascript/interpreter/ihid.test.ts
new file mode 100644
index 0000000000..011bbcf47b
--- /dev/null
+++ b/test/javascript/interpreter/ihid.test.ts
@@ -0,0 +1,25 @@
+import { scan } from '@/interpreter/languages/javascript/scanner'
+import type { TokenType } from '@/interpreter/languages/javascript/token'
+
+describe('single-character', () => {
+ test.each([
+ ['{', 'LEFT_BRACE'],
+ ['[', 'LEFT_BRACKET'],
+ ['(', 'LEFT_PAREN'],
+ ['}', 'RIGHT_BRACE'],
+ [']', 'RIGHT_BRACKET'],
+ [')', 'RIGHT_PAREN'],
+ [':', 'COLON'],
+ [',', 'COMMA'],
+ ['-', 'MINUS'],
+ ['+', 'PLUS'],
+ ['*', 'STAR'],
+ ['/', 'SLASH'],
+ // ["?", "QUESTION_MARK"],
+ ])("'%s' token", (source: string, expectedType: string) => {
+ const tokens = scan(source)
+ expect(tokens[0].type).toBe(expectedType as TokenType)
+ expect(tokens[0].lexeme).toBe(source)
+ expect(tokens[0].literal).toBeNull
+ })
+})
diff --git a/test/javascript/interpreter/languages/javascript/interpreter.test.ts b/test/javascript/interpreter/languages/javascript/interpreter.test.ts
new file mode 100644
index 0000000000..9dd9ad278b
--- /dev/null
+++ b/test/javascript/interpreter/languages/javascript/interpreter.test.ts
@@ -0,0 +1,1545 @@
+import {
+ Interpreter,
+ interpretJavaScript as interpret,
+ evaluateJavaScriptFunction as evaluateFunction,
+} from '@/interpreter/interpreter'
+import type { ExecutionContext } from '@/interpreter/executor'
+
+describe('statements', () => {
+ describe('expression', () => {
+ test('number', () => {
+ const { frames, error } = interpret('let x = 1')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 1 })
+ })
+
+ test('string', () => {
+ const { frames } = interpret('let x = "hello there"')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 'hello there' })
+ })
+
+ describe('unary', () => {
+ test('negation', () => {
+ const { frames } = interpret('let x = !true')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: false })
+ })
+
+ test('minus', () => {
+ const { frames } = interpret('let x = -3')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: -3 })
+ })
+
+ describe('increment', () => {
+ test('variable', () => {
+ const { frames } = interpret(`
+ let x = 3
+ x++
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 3 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 4 })
+ })
+
+ test('array', () => {
+ const { frames } = interpret(`
+ let x = [1,2]
+ x[1]++
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: [1, 2] })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: [1, 3] })
+ })
+
+ test('dictionary', () => {
+ const { frames } = interpret(`
+ let x = {"count":1}
+ x["count"]++
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: { count: 1 } })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: { count: 2 } })
+ })
+ })
+
+ describe('decrement', () => {
+ test('variable', () => {
+ const { frames } = interpret(`
+ let x = 3
+ x--
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 3 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 2 })
+ })
+
+ test('array', () => {
+ const { frames } = interpret(`
+ let x = [1,2]
+ x[1]--
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: [1, 2] })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: [1, 1] })
+ })
+
+ test('dictionary', () => {
+ const { frames } = interpret(`
+ let x = {"count":1}
+ x["count"]--
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: { count: 1 } })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: { count: 0 } })
+ })
+ })
+ })
+
+ describe('binary', () => {
+ describe('arithmetic', () => {
+ test('plus', () => {
+ const { frames } = interpret('let x = 2 + 3')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 5 })
+ })
+
+ test('minus', () => {
+ const { frames } = interpret('let x = 7 - 6')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 1 })
+ })
+
+ test('division', () => {
+ const { frames } = interpret('let x = 20 / 5')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 4 })
+ })
+
+ test('multiplication', () => {
+ const { frames } = interpret('let x = 4 * 2')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 8 })
+ })
+ })
+
+ describe('comparison', () => {
+ test('equality', () => {
+ const { frames } = interpret('let x = 2 == "2"')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: true })
+ })
+
+ test('strict equality', () => {
+ const { frames, error } = interpret('let x = 2 === "2"')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: false })
+ })
+
+ test('inequality', () => {
+ const { frames } = interpret('let x = 2 != "2"')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: false })
+ })
+
+ test('strict inequality', () => {
+ const { frames } = interpret('let x = 2 !== "2"')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: true })
+ })
+ })
+
+ describe('logical', () => {
+ test('and', () => {
+ const { frames } = interpret('let x = true and false')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: false })
+ })
+
+ test('&&', () => {
+ const { frames } = interpret('let x = true && false')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: false })
+ })
+
+ test('or', () => {
+ const { frames } = interpret('let x = true or false')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: true })
+ })
+
+ test('&&', () => {
+ const { frames } = interpret('let x = true || false')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: true })
+ })
+
+ describe('truthiness', () => {
+ describe('enabled', () => {
+ test('and', () => {
+ const { frames } = interpret('let x = [] and true', {
+ languageFeatures: { truthiness: 'ON' },
+ })
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: true })
+ })
+
+ test('or', () => {
+ const { frames } = interpret('let x = 0 or false', {
+ languageFeatures: { truthiness: 'ON' },
+ })
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: false })
+ })
+ })
+
+ describe('disabled', () => {
+ test('and', () => {
+ const { frames } = interpret('let x = true and []', {
+ languageFeatures: { truthiness: 'OFF' },
+ })
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('ERROR')
+ })
+
+ test('or', () => {
+ const { frames } = interpret('let x = false or 0', {
+ languageFeatures: { truthiness: 'OFF' },
+ })
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('ERROR')
+ })
+ })
+ })
+ })
+
+ describe('strings', () => {
+ test('plus', () => {
+ const { frames } = interpret('let x = "sw" + "eet" ')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 'sweet' })
+ })
+ })
+
+ describe('template literals', () => {
+ test('text only', () => {
+ const { frames } = interpret('let x = `hello`')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 'hello' })
+ })
+
+ test('placeholder only', () => {
+ const { frames } = interpret('let x = `${3*4}`')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: '12' })
+ })
+
+ test('string', () => {
+ const { frames } = interpret('let x = `hello ${"there"}`')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 'hello there' })
+ })
+
+ test('variable', () => {
+ const { frames } = interpret(`
+ let x = 1
+ let y = \`x is \${x}\`
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 1 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 1, y: 'x is 1' })
+ })
+
+ test('expression', () => {
+ const { frames } = interpret('let x = `2 + 3 = ${2 + 3}`')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: '2 + 3 = 5' })
+ })
+
+ test('complex', () => {
+ const { frames } = interpret(
+ 'let x = `${2} + ${"three"} = ${2 + 9 / 3}`'
+ )
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: '2 + three = 5' })
+ })
+ })
+ })
+
+ describe('ternary', () => {
+ test('then branch', () => {
+ const { frames } = interpret('let x = true ? 1 : 2')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 1 })
+ })
+
+ test('else branch', () => {
+ const { frames } = interpret('let x = false ? 1 : 2')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 2 })
+ })
+
+ test('nested', () => {
+ const { frames } = interpret(
+ 'let x = false ? 1 : false ? 2 : true ? 3 : 4'
+ )
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 3 })
+ })
+ })
+
+ describe('get', () => {
+ describe('dictionary', () => {
+ test('single field', () => {
+ const { frames } = interpret(`
+ let movie = {"title": "The Matrix"}
+ let title = movie["title"]
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({
+ movie: { title: 'The Matrix' },
+ })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({
+ movie: { title: 'The Matrix' },
+ title: 'The Matrix',
+ })
+ })
+
+ test('chained', () => {
+ const { frames } = interpret(`
+ let movie = {"director": {"name": "Peter Jackson"}}
+ let name = movie["director"]["name"]
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({
+ movie: { director: { name: 'Peter Jackson' } },
+ })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({
+ movie: { director: { name: 'Peter Jackson' } },
+ name: 'Peter Jackson',
+ })
+ })
+
+ describe('array', () => {
+ test('single index', () => {
+ const { frames } = interpret(`
+ let scores = [7, 3, 10]
+ let latest = scores[2]
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({
+ scores: [7, 3, 10],
+ })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({
+ scores: [7, 3, 10],
+ latest: 10,
+ })
+ })
+
+ test('chained', () => {
+ const { frames } = interpret(`
+ let scoreMinMax = [[3, 7], [1, 6]]
+ let secondMin = scoreMinMax[1][0]
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({
+ scoreMinMax: [
+ [3, 7],
+ [1, 6],
+ ],
+ })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({
+ scoreMinMax: [
+ [3, 7],
+ [1, 6],
+ ],
+ secondMin: 1,
+ })
+ })
+ })
+ })
+ })
+
+ describe('set', () => {
+ describe('dictionary', () => {
+ test('single field', () => {
+ const { frames } = interpret(`
+ let movie = {"title": "The Matrix"}
+ movie["title"] = "Gladiator"
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({
+ movie: { title: 'The Matrix' },
+ })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({
+ movie: { title: 'Gladiator' },
+ })
+ })
+
+ test('chained', () => {
+ const { frames } = interpret(`
+ let movie = {"director": {"name": "Peter Jackson"}}
+ movie["director"]["name"] = "James Cameron"
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({
+ movie: { director: { name: 'Peter Jackson' } },
+ })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({
+ movie: { director: { name: 'James Cameron' } },
+ })
+ })
+ })
+
+ describe('array', () => {
+ test('single index', () => {
+ const { frames } = interpret(`
+ let scores = [7, 3, 10]
+ scores[2] = 5
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({
+ scores: [7, 3, 10],
+ })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({
+ scores: [7, 3, 5],
+ })
+ })
+
+ test('chained', () => {
+ const { frames } = interpret(`
+ let scoreMinMax = [[3, 7], [1, 6]]
+ scoreMinMax[1][0] = 4
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({
+ scoreMinMax: [
+ [3, 7],
+ [1, 6],
+ ],
+ })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({
+ scoreMinMax: [
+ [3, 7],
+ [4, 6],
+ ],
+ })
+ })
+ })
+ })
+
+ describe('assignment', () => {
+ test('regular', () => {
+ const { frames } = interpret(`
+ let x = 2
+ x = 3
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 2 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 3 })
+ })
+
+ describe('compound', () => {
+ test('plus', () => {
+ const { frames } = interpret(`
+ let x = 2
+ x += 3
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 2 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 5 })
+ })
+
+ test('minus', () => {
+ const { frames } = interpret(`
+ let x = 2
+ x -= 3
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 2 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: -1 })
+ })
+
+ test('multiply', () => {
+ const { frames } = interpret(`
+ let x = 2
+ x *= 3
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 2 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 6 })
+ })
+
+ test('divide', () => {
+ const { frames } = interpret(`
+ let x = 6
+ x /= 3
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 6 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 2 })
+ })
+ })
+ })
+ })
+
+ describe('variable', () => {
+ test('declare and use', () => {
+ const { frames } = interpret('let x = 2')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 2 })
+ })
+
+ test('declare and use', () => {
+ const { frames } = interpret(`
+ let x = 2
+ let y = x + 1
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 2 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 2, y: 3 })
+ })
+ })
+
+ describe('function', () => {
+ describe('without parameters', () => {
+ test('define', () => {
+ const { frames } = interpret(`
+ function move() {
+ return 1
+ }
+ `)
+ expect(frames).toBeEmpty()
+ })
+
+ describe('call', () => {
+ test('single statement function', () => {
+ const { frames } = interpret(`
+ function move() {
+ return 1
+ }
+ let x = move()
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toBeEmpty()
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 1 })
+ })
+ })
+ })
+
+ describe('with parameters', () => {
+ test('define', () => {
+ const { frames } = interpret(`
+ function move(x) {
+ return 1 + x
+ }
+ `)
+ expect(frames).toBeEmpty()
+ })
+
+ describe('call', () => {
+ test('single statement function', () => {
+ const { frames } = interpret(`
+ function move(x) {
+ return 1 + x
+ }
+ let x = move(2)
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 2 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 3 })
+ })
+
+ describe('default parameter', () => {
+ test("don't pass in value", () => {
+ const { frames } = interpret(`
+ function move(x = 10) {
+ return 1 + x
+ }
+ let x = move()
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 10 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 11 })
+ })
+
+ test('pass in value', () => {
+ const { frames } = interpret(`
+ function move(x = 10) {
+ return 1 + x
+ }
+ let x = move(2)
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 2 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 3 })
+ })
+ })
+ })
+ })
+ })
+
+ describe('if', () => {
+ test('without else', () => {
+ const { frames } = interpret(`
+ if (true) {
+ let x = 2
+ }
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toBeEmpty()
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 2 })
+ })
+
+ test('with else', () => {
+ const { frames } = interpret(`
+ if (false) {
+ let x = 2
+ }
+ else {
+ let x = 3
+ }
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toBeEmpty()
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 3 })
+ })
+
+ test('nested', () => {
+ const { frames } = interpret(`
+ if (false) {
+ let x = 2
+ }
+ else if (true) {
+ let x = 3
+ }
+ else {
+ let x = 4
+ }
+ `)
+ expect(frames).toBeArrayOfSize(3)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toBeEmpty()
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toBeEmpty()
+ expect(frames[2].status).toBe('SUCCESS')
+ expect(frames[2].variables).toMatchObject({ x: 3 })
+ })
+ })
+
+ describe('while', () => {
+ test('once', () => {
+ const { frames } = interpret(`
+ let x = 1
+ while (x > 0) {
+ x = x - 1
+ }
+ `)
+ expect(frames).toBeArrayOfSize(4)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 1 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 1 })
+ expect(frames[2].status).toBe('SUCCESS')
+ expect(frames[2].variables).toMatchObject({ x: 0 })
+ expect(frames[3].status).toBe('SUCCESS')
+ expect(frames[3].variables).toMatchObject({ x: 0 })
+ })
+
+ test('multiple times', () => {
+ const { frames } = interpret(`
+ let x = 3
+ while (x > 0) {
+ x = x - 1
+ }
+ `)
+ expect(frames).toBeArrayOfSize(8)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 3 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 3 })
+ expect(frames[2].status).toBe('SUCCESS')
+ expect(frames[2].variables).toMatchObject({ x: 2 })
+ expect(frames[3].status).toBe('SUCCESS')
+ expect(frames[3].variables).toMatchObject({ x: 2 })
+ expect(frames[4].status).toBe('SUCCESS')
+ expect(frames[4].variables).toMatchObject({ x: 1 })
+ expect(frames[5].status).toBe('SUCCESS')
+ expect(frames[5].variables).toMatchObject({ x: 1 })
+ expect(frames[6].status).toBe('SUCCESS')
+ expect(frames[6].variables).toMatchObject({ x: 0 })
+ expect(frames[7].status).toBe('SUCCESS')
+ expect(frames[7].variables).toMatchObject({ x: 0 })
+ })
+ })
+
+ describe('do/while', () => {
+ test('once', () => {
+ const { frames } = interpret(`
+ let x = 2
+ do {
+ x = x - 1
+ }
+ while (x > 1)
+ `)
+ expect(frames).toBeArrayOfSize(3)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 2 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 1 })
+ expect(frames[2].status).toBe('SUCCESS')
+ expect(frames[2].variables).toMatchObject({ x: 1 })
+ })
+
+ test('multiple times', () => {
+ const { frames } = interpret(`
+ let x = 3
+ do {
+ x = x - 1
+ }
+ while (x > 0)
+ `)
+ expect(frames).toBeArrayOfSize(7)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 3 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 2 })
+ expect(frames[2].status).toBe('SUCCESS')
+ expect(frames[2].variables).toMatchObject({ x: 2 })
+ expect(frames[3].status).toBe('SUCCESS')
+ expect(frames[3].variables).toMatchObject({ x: 1 })
+ expect(frames[4].status).toBe('SUCCESS')
+ expect(frames[4].variables).toMatchObject({ x: 1 })
+ expect(frames[5].status).toBe('SUCCESS')
+ expect(frames[5].variables).toMatchObject({ x: 0 })
+ expect(frames[6].status).toBe('SUCCESS')
+ expect(frames[6].variables).toMatchObject({ x: 0 })
+ })
+ })
+
+ describe('foreach', () => {
+ test('empty iterable', () => {
+ const echos: string[] = []
+ const context = {
+ externalFunctions: [
+ {
+ name: 'echo',
+ func: (_: any, n: any) => {
+ echos.push(n.toString())
+ },
+ description: '',
+ },
+ ],
+ }
+
+ const { frames } = interpret(
+ `
+ for (let num of []) {
+ echo(num)
+ }
+ `,
+ context
+ )
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toBeEmpty()
+ expect(echos).toBeEmpty()
+ })
+
+ test('multiple times', () => {
+ const echos: string[] = []
+ const context = {
+ externalFunctions: [
+ {
+ name: 'echo',
+ func: (_: any, n: any) => {
+ echos.push(n.toString())
+ },
+ description: '',
+ },
+ ],
+ }
+
+ const { frames } = interpret(
+ `
+ for (let num of [1, 2, 3]) {
+ echo(num)
+ }
+ `,
+ context
+ )
+ expect(frames).toBeArrayOfSize(6)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toBeEmpty()
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ num: 1 })
+ expect(frames[2].status).toBe('SUCCESS')
+ expect(frames[3].status).toBe('SUCCESS')
+ expect(frames[3].variables).toMatchObject({ num: 2 })
+ expect(frames[4].status).toBe('SUCCESS')
+ expect(frames[5].status).toBe('SUCCESS')
+ expect(frames[5].variables).toMatchObject({ num: 3 })
+ expect(echos).toEqual(['1', '2', '3'])
+ })
+ })
+
+ describe('block', () => {
+ test('non-nested', () => {
+ const { frames } = interpret(`
+ {
+ let x = 1
+ let y = 2
+ }
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 1 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 1, y: 2 })
+ })
+
+ test('nested', () => {
+ const { frames } = interpret(`
+ {
+ let x = 1
+ {
+ let y = 2
+ }
+ }
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 1 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ y: 2 })
+ })
+ })
+})
+
+describe('frames', () => {
+ describe('single statement', () => {
+ test('literal', () => {
+ const { frames } = interpret('125')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].code).toBe('125')
+ expect(frames[0].error).toBeNil()
+ expect(frames[0].variables).toBeEmpty()
+ })
+
+ test('call', () => {
+ const echoFunction = (_interpreter: any, _n: any) => {}
+ const context = {
+ externalFunctions: [
+ { name: 'echo', func: echoFunction, description: '' },
+ ],
+ }
+ const { frames } = interpret('echo(1)', context)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].code).toBe('echo(1)')
+ expect(frames[0].error).toBeNil()
+ expect(frames[0].variables).toBeEmpty()
+ })
+
+ test('variable', () => {
+ const { frames } = interpret('let x = 1')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].code).toBe('let x = 1')
+ expect(frames[0].error).toBeNil()
+ expect(frames[0].variables).toMatchObject({ x: 1 })
+ })
+
+ test('constant', () => {
+ const { frames } = interpret('const x = 1')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].code).toBe('const x = 1')
+ expect(frames[0].error).toBeNil()
+ expect(frames[0].variables).toMatchObject({ x: 1 })
+ })
+ })
+
+ describe('multiple statements', () => {
+ test('multiple calls', () => {
+ const context = {
+ externalFunctions: [
+ {
+ name: 'echo',
+ func: (_: any, n: any) => {},
+ description: '',
+ },
+ ],
+ }
+ const { frames } = interpret(
+ `
+ echo(1)
+ echo(2)
+ `,
+ context
+ )
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].line).toBe(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].code).toBe('echo(1)')
+ expect(frames[0].error).toBeNil()
+ expect(frames[1].line).toBe(3)
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].code).toBe('echo(2)')
+ expect(frames[1].error).toBeNil()
+ })
+ })
+
+ test('no error', () => {
+ const { frames, error } = interpret('125')
+ expect(frames).not.toBeEmpty()
+ expect(error).toBeNull()
+ })
+})
+
+describe('timing', () => {
+ describe('single statement', () => {
+ test('success', () => {
+ const context = {
+ externalFunctions: [{ name: 'echo', func: () => {}, description: '' }],
+ }
+ const { frames } = interpret('echo(1)', context)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].time).toBe(0)
+ })
+
+ test('error', () => {
+ const context = {
+ externalFunctions: [{ name: 'echo', func: () => {}, description: '' }],
+ }
+ const { frames } = interpret('127()', context)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].time).toBe(0)
+ })
+ })
+
+ describe('multiple statements', () => {
+ test('all successes', () => {
+ const context = {
+ externalFunctions: [
+ { name: 'echo', func: (_i: any, _n: any) => {}, description: '' },
+ ],
+ }
+ const { frames } = interpret(
+ `
+ echo(1)
+ echo(2)
+ `,
+ context
+ )
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].time).toBe(0)
+ expect(frames[1].time).toBe(1)
+ })
+ })
+
+ describe('execution context', () => {
+ test('from non-user code', () => {
+ const advanceTimeFunction = (
+ { fastForward }: ExecutionContext,
+ n: number
+ ) => fastForward(n)
+ const context = {
+ externalFunctions: [
+ {
+ name: 'advanceTime',
+ func: advanceTimeFunction,
+ description: '',
+ },
+ ],
+ }
+ const { frames } = interpret(
+ `
+ 1
+ advanceTime(20)
+ 2
+ `,
+ context
+ )
+ expect(frames).toBeArrayOfSize(3)
+ expect(frames[0].time).toBe(0)
+ expect(frames[1].time).toBe(1)
+ expect(frames[2].time).toBe(22)
+ })
+
+ test('from user code is not possible', () => {
+ const { frames } = interpret('fastForward(100)')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('ERROR')
+ expect(frames[0].time).toBe(0)
+ })
+
+ test('manipulate state', () => {
+ const state = { count: 10 }
+ const incrementFunction = ({ state }: ExecutionContext) => {
+ state.count++
+ }
+ const context = {
+ externalFunctions: [
+ { name: 'increment', func: incrementFunction, description: '' },
+ ],
+ state: state,
+ }
+ const { frames } = interpret('increment()', context)
+ expect(state.count).toBe(11)
+
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].time).toBe(0)
+ })
+ })
+})
+
+describe('evaluateFunction', () => {
+ test('without arguments', () => {
+ const { value, frames } = evaluateFunction(
+ `
+ function move() {
+ return 1
+ }
+ `,
+ {},
+ 'move'
+ )
+ expect(value).toBe(1)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].result?.value.value).toBe(1)
+ })
+
+ test('with arguments', () => {
+ const { value, frames } = evaluateFunction(
+ `
+ function move(x, y) {
+ return x + y
+ }
+ `,
+ {},
+ 'move',
+ 1,
+ 2
+ )
+ expect(value).toBe(3)
+ expect(frames).toBeArrayOfSize(1)
+ })
+
+ test('with complex arguments', () => {
+ const { value, frames } = evaluateFunction(
+ `
+ function move(car, speeds) {
+ return car["x"] + speeds[1]
+ }
+ `,
+ {},
+ 'move',
+ { x: 2 },
+ [4, 5, 6]
+ )
+ expect(value).toBe(7)
+ expect(frames).toBeArrayOfSize(1)
+ })
+
+ test('idempotent', () => {
+ const code = `
+ let x = 1
+ function move() {
+ x = x + 1
+ return x
+ }`
+ const interpreter = new Interpreter(code, {})
+ interpreter.compile()
+ const { value: value1 } = interpreter.evaluateFunction('move')
+ const { value: value2 } = interpreter.evaluateFunction('move')
+ expect(value1).toBe(2)
+ expect(value2).toBe(2)
+ })
+
+ test('full program', () => {
+ const code = `
+ function chooseEnemy(enemies) {
+ let maxRight = 0
+ let rightmostEnemyId = null
+
+ for (let enemy of enemies) {
+ if (enemy["coords"][0] > maxRight) {
+ maxRight = enemy["coords"][0]
+ rightmostEnemyId = enemy["id"]
+ }
+ }
+
+ return rightmostEnemyId
+ }
+ `
+
+ const poses = [
+ { id: 1, coords: [2, 4] },
+ { id: 2, coords: [3, 1] },
+ ]
+ const { value, frames } = evaluateFunction(code, {}, 'chooseEnemy', poses)
+ expect(value).toBe(2)
+ expect(frames).toBeArrayOfSize(11)
+ })
+
+ test('twoFer', () => {
+ const code = `
+ function twoFer(name) {
+ if(name == "") {
+ return "One for you, one for me."
+ }
+ else {
+ return "One for " + name + ", one for me."
+ }
+ }
+ `
+
+ const { value } = evaluateFunction(code, {}, 'twoFer', 'Alice')
+ expect(value).toEqual('One for Alice, one for me.')
+ })
+})
+
+describe('errors', () => {
+ test('scanner', () => {
+ const { frames, error } = interpret('let 123#')
+ expect(frames).toBeEmpty()
+ expect(error).not.toBeNull()
+ expect(error!.category).toBe('SyntaxError')
+ expect(error!.type).toBe('UnknownCharacter')
+ expect(error!.context?.character).toBe('#')
+ })
+
+ test('parser', () => {
+ const { frames, error } = interpret('"abc')
+ expect(frames).toBeEmpty()
+ expect(error).not.toBeNull()
+ expect(error!.category).toBe('SyntaxError')
+ expect(error!.type).toBe('MissingDoubleQuoteToTerminateString')
+ expect(error!.context).toBeNull
+ })
+
+ test('resolver', () => {
+ const { frames, error } = interpret('return 1')
+ expect(frames).toBeEmpty()
+ expect(error).not.toBeNull()
+ expect(error!.category).toBe('SemanticError')
+ expect(error!.type).toBe('TopLevelReturn')
+ expect(error!.context).toBeNull
+ })
+
+ describe('runtime', () => {
+ describe('evaluateFunction', () => {
+ test('first frame', () => {
+ const { value, frames, error } = evaluateFunction(
+ `
+ function move() {
+ foo()
+ }
+ `,
+ {},
+ 'move'
+ )
+ expect(value).toBeUndefined()
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(3)
+ expect(frames[0].status).toBe('ERROR')
+ expect(frames[0].code).toBe('foo()')
+ expect(frames[0].error).not.toBeNull()
+ expect(frames[0].error!.category).toBe('RuntimeError')
+ expect(frames[0].error!.type).toBe('CouldNotFindFunctionWithName')
+ expect(error).toBeNull()
+ })
+
+ test('later frame', () => {
+ const code = `
+ function move() {
+ let x = 1
+ let y = 2
+ foo()
+ }
+ `
+ const { value, frames, error } = evaluateFunction(code, {}, 'move')
+
+ expect(value).toBeUndefined()
+ expect(frames).toBeArrayOfSize(3)
+ expect(frames[2].line).toBe(5)
+ expect(frames[2].status).toBe('ERROR')
+ expect(frames[2].code).toBe('foo()')
+ expect(frames[2].error).not.toBeNull()
+ expect(frames[2].error!.category).toBe('RuntimeError')
+ expect(frames[2].error!.type).toBe('CouldNotFindFunctionWithName')
+ expect(error).toBeNull()
+ })
+ })
+ })
+
+ describe('interpret', () => {
+ describe('call', () => {
+ test('non-callable', () => {
+ const { frames, error } = interpret('1()')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(1)
+ expect(frames[0].status).toBe('ERROR')
+ expect(frames[0].code).toBe('1()')
+ expect(frames[0].error).not.toBeNull()
+ expect(frames[0].error!.category).toBe('RuntimeError')
+ expect(frames[0].error!.type).toBe('NonCallableTarget')
+ expect(error).toBeNull()
+ })
+
+ describe('arity', () => {
+ describe('no optional parameters', () => {
+ test('too many arguments', () => {
+ const context = {
+ externalFunctions: [
+ {
+ name: 'echo',
+ func: (_: any) => {},
+ description: '',
+ },
+ ],
+ }
+ const { frames, error } = interpret('echo(1, 2)', context)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(1)
+ expect(frames[0].status).toBe('ERROR')
+ expect(frames[0].code).toBe('echo(1, 2)')
+ expect(frames[0].error).not.toBeNull()
+ expect(frames[0].error!.category).toBe('RuntimeError')
+ expect(frames[0].error!.type).toBe('InvalidNumberOfArguments')
+ expect(error).toBeNull()
+ })
+
+ test('too few arguments', () => {
+ const context = {
+ externalFunctions: [
+ {
+ name: 'echo',
+ func: (_int: any, _: any) => {},
+ description: '',
+ },
+ ],
+ }
+ const { frames, error } = interpret('echo()', context)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(1)
+ expect(frames[0].status).toBe('ERROR')
+ expect(frames[0].code).toBe('echo()')
+ expect(frames[0].error).not.toBeNull()
+ expect(frames[0].error!.category).toBe('RuntimeError')
+ expect(frames[0].error!.type).toBe('InvalidNumberOfArguments')
+ expect(error).toBeNull()
+ })
+
+ // These tests don't make sense.
+ describe.skip('with optional parameters', () => {
+ test('too many arguments', () => {
+ const context = {
+ externalFunctions: [
+ {
+ name: 'echo',
+ func: () => {},
+ description: '',
+ },
+ ],
+ }
+ const { frames, error } = interpret(
+ `
+ function echo(a, b, c, d = 5) {
+ }
+ echo(1, 2, 3, 4)
+ `,
+ context
+ )
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(1)
+ expect(frames[0].status).toBe('ERROR')
+ expect(frames[0].code).toBe('echo(1, 2, 3, 4)')
+ expect(frames[0].error).not.toBeNull()
+ expect(frames[0].error!.category).toBe('RuntimeError')
+ expect(frames[0].error!.type).toBe(
+ 'InvalidNumberOfArgumentsWithOptionalArguments'
+ )
+ expect(error).toBeNull()
+ })
+
+ test.skip('too few arguments', () => {
+ const context = {
+ externalFunctions: {
+ echo: () => {},
+ },
+ }
+ const { frames, error } = interpret('echo(1)', context)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(1)
+ expect(frames[0].status).toBe('ERROR')
+ expect(frames[0].code).toBe('echo(1)')
+ expect(frames[0].error).not.toBeNull()
+ expect(frames[0].error!.category).toBe('RuntimeError')
+ expect(frames[0].error!.type).toBe(
+ 'InvalidNumberOfArgumentsWithOptionalArguments'
+ )
+ expect(error).toBeNull()
+ })
+ })
+ })
+ })
+
+ describe('unknown function', () => {
+ test('not misspelled', () => {
+ const { frames, error } = interpret('foo()')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(1)
+ expect(frames[0].status).toBe('ERROR')
+ expect(frames[0].code).toBe('foo()')
+ expect(frames[0].error).not.toBeNull()
+ expect(frames[0].error!.category).toBe('RuntimeError')
+ expect(frames[0].error!.type).toBe('CouldNotFindFunctionWithName')
+ expect(error).toBeNull()
+ })
+
+ test('misspelled', () => {
+ const { frames, error } = interpret(`
+ function foobar() {
+ return 1
+ }
+
+ foobor()
+ `)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(6)
+ expect(frames[0].status).toBe('ERROR')
+ expect(frames[0].code).toBe('foobor()')
+ expect(frames[0].error).not.toBeNull()
+ expect(frames[0].error!.message).toBe(
+ "We don't know what `foobor` means. Maybe you meant to use the `foobar` function instead?"
+ )
+ expect(frames[0].error!.category).toBe('RuntimeError')
+ expect(frames[0].error!.type).toBe(
+ 'CouldNotFindFunctionWithNameSuggestion'
+ )
+ expect(error).toBeNull()
+ })
+ })
+
+ test('missing parentheses', () => {
+ const { frames, error } = interpret(`
+ function foo() {
+ return 1
+ }
+
+ foo
+ `)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(6)
+ expect(frames[0].status).toBe('ERROR')
+ expect(frames[0].code).toBe('foo')
+ expect(frames[0].error).not.toBeNull()
+ expect(frames[0].error!.message).toBe(
+ 'Did you forget the parenthesis when trying to call the function?'
+ )
+ expect(frames[0].error!.category).toBe('RuntimeError')
+ expect(frames[0].error!.type).toBe('MissingParenthesesForFunctionCall')
+ expect(error).toBeNull()
+ })
+
+ test('after success', () => {
+ const { frames, error } = interpret(`
+ 123
+ foo()
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].line).toBe(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].code).toBe('123')
+ expect(frames[0].error).toBeNil()
+ expect(frames[1].line).toBe(3)
+ expect(frames[1].status).toBe('ERROR')
+ expect(frames[1].code).toBe('foo()')
+ expect(frames[1].error).not.toBeNull()
+ expect(frames[1].error!.category).toBe('RuntimeError')
+ expect(frames[1].error!.type).toBe('CouldNotFindFunctionWithName')
+ expect(error).toBeNull()
+ })
+
+ test('stop execution after error', () => {
+ const { frames, error } = interpret(`
+ foo()
+ 123
+ `)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(2)
+ expect(frames[0].status).toBe('ERROR')
+ expect(frames[0].code).toBe('foo()')
+ expect(frames[0].error).not.toBeNull()
+ expect(frames[0].error!.category).toBe('RuntimeError')
+ expect(frames[0].error!.type).toBe('CouldNotFindFunctionWithName')
+ expect(error).toBeNull()
+ })
+ })
+ })
+
+ describe('suggestions', () => {
+ test('function name differs by one letter', () => {
+ const code = `
+ function move() {
+ m0ve()
+ }
+ `
+ const { frames, error } = evaluateFunction(code, {}, 'move')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].error).not.toBeNull()
+ expect(frames[0].error!.context).toMatchObject({
+ didYouMean: {
+ function: 'move',
+ variable: null,
+ },
+ })
+ })
+
+ test('variable name differs by one letter', () => {
+ const code = 'let size = 23'
+ const { frames } = evaluateFunction(code, {}, 'saize + 2')
+
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[1].error).not.toBeNull()
+ expect(frames[1].error!.context).toMatchObject({
+ didYouMean: {
+ function: null,
+ variable: 'size',
+ },
+ })
+ })
+ })
+})
+
+describe('context', () => {
+ describe('wrap top-level statements', () => {
+ // This test doesn't make a huge amount of sense to me.
+ // as main doesn't actually return
+ test.skip('wrap non-function statements', () => {
+ const code = `
+ function move(x, y) {
+ return x + y
+ }
+
+ let x = 1
+ let y = 2
+ move(x, y)
+ `
+ const { value, frames } = evaluateFunction(
+ code,
+ { wrapTopLevelStatements: true },
+ 'main'
+ )
+ expect(value).toBe(3)
+ expect(frames).toBeArrayOfSize(4)
+ expect(frames[3].result?.value.value).toBe(3)
+ })
+
+ test("don't wrap function declarations", () => {
+ const { value, frames } = evaluateFunction(
+ `
+ function move() {
+ return 1
+ }
+ `,
+ {},
+ 'move'
+ )
+ expect(value).toBe(1)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].result?.value.value).toBe(1)
+ })
+ })
+})
diff --git a/test/javascript/interpreter/languages/javascript/parser.test.ts b/test/javascript/interpreter/languages/javascript/parser.test.ts
new file mode 100644
index 0000000000..ea193658a2
--- /dev/null
+++ b/test/javascript/interpreter/languages/javascript/parser.test.ts
@@ -0,0 +1,1258 @@
+import {
+ ArrayExpression,
+ BinaryExpression,
+ CallExpression,
+ GroupingExpression,
+ LiteralExpression,
+ DictionaryExpression,
+ VariableExpression,
+ GetExpression,
+ SetExpression,
+ UnaryExpression,
+ TemplateLiteralExpression,
+ TemplatePlaceholderExpression,
+ TemplateTextExpression,
+ LogicalExpression,
+ AssignExpression,
+ UpdateExpression,
+ TernaryExpression,
+} from '@/interpreter/expression'
+import {
+ BlockStatement,
+ ConstantStatement,
+ DoWhileStatement,
+ ExpressionStatement,
+ FunctionStatement,
+ IfStatement,
+ ReturnStatement,
+ VariableStatement,
+ WhileStatement,
+} from '@/interpreter/statement'
+import { parse } from '@/interpreter/languages/javascript/parser'
+
+describe('literals', () => {
+ describe('numbers', () => {
+ test('integer', () => {
+ const stmts = parse('1')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(LiteralExpression)
+ const literalExpr = exprStmt.expression as LiteralExpression
+ expect(literalExpr.value).toBe(1)
+ })
+ test('floating points', () => {
+ const stmts = parse('1.5')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(LiteralExpression)
+ const literalExpr = exprStmt.expression as LiteralExpression
+ expect(literalExpr.value).toBe(1.5)
+ })
+ })
+
+ test('string', () => {
+ const stmts = parse('"nice"')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(LiteralExpression)
+ const literalExpr = exprStmt.expression as LiteralExpression
+ expect(literalExpr.value).toBe('nice')
+ })
+
+ test('true', () => {
+ const stmts = parse('true')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(LiteralExpression)
+ const literalExpr = exprStmt.expression as LiteralExpression
+ expect(literalExpr.value).toBe(true)
+ })
+
+ test('false', () => {
+ const stmts = parse('false')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(LiteralExpression)
+ const literalExpr = exprStmt.expression as LiteralExpression
+ expect(literalExpr.value).toBe(false)
+ })
+
+ test('null', () => {
+ const stmts = parse('null')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(LiteralExpression)
+ const literalExpr = exprStmt.expression as LiteralExpression
+ expect(literalExpr.value).toBeNull()
+ })
+})
+
+describe('array', () => {
+ test('empty', () => {
+ const stmts = parse('[]')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(ArrayExpression)
+ const arrayExpr = exprStmt.expression as ArrayExpression
+ expect(arrayExpr.elements).toBeEmpty()
+ })
+
+ test('single element', () => {
+ const stmts = parse('[1]')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(ArrayExpression)
+ const arrayExpr = exprStmt.expression as ArrayExpression
+ expect(arrayExpr.elements).toBeArrayOfSize(1)
+ expect(arrayExpr.elements[0]).toBeInstanceOf(LiteralExpression)
+ const firstElemExpr = arrayExpr.elements[0] as LiteralExpression
+ expect(firstElemExpr.value).toBe(1)
+ })
+
+ test('multiple elements', () => {
+ const stmts = parse('[1,2,3]')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(ArrayExpression)
+ const arrayExpr = exprStmt.expression as ArrayExpression
+ expect(arrayExpr.elements).toBeArrayOfSize(3)
+ expect(arrayExpr.elements[0]).toBeInstanceOf(LiteralExpression)
+ expect(arrayExpr.elements[1]).toBeInstanceOf(LiteralExpression)
+ expect(arrayExpr.elements[2]).toBeInstanceOf(LiteralExpression)
+ expect((arrayExpr.elements[0] as LiteralExpression).value).toBe(1)
+ expect((arrayExpr.elements[1] as LiteralExpression).value).toBe(2)
+ expect((arrayExpr.elements[2] as LiteralExpression).value).toBe(3)
+ })
+
+ test('nested', () => {
+ const stmts = parse('[1,[2,[3]]]')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(ArrayExpression)
+ const arrayExpr = exprStmt.expression as ArrayExpression
+ expect(arrayExpr.elements).toBeArrayOfSize(2)
+ expect(arrayExpr.elements[0]).toBeInstanceOf(LiteralExpression)
+ expect((arrayExpr.elements[0] as LiteralExpression).value).toBe(1)
+ expect(arrayExpr.elements[1]).toBeInstanceOf(ArrayExpression)
+ const nestedExpr = arrayExpr.elements[1] as ArrayExpression
+ expect(nestedExpr.elements).toBeArrayOfSize(2)
+ expect(nestedExpr.elements[0]).toBeInstanceOf(LiteralExpression)
+ expect((nestedExpr.elements[0] as LiteralExpression).value).toBe(2)
+ expect(nestedExpr.elements[0]).toBeInstanceOf(LiteralExpression)
+ const nestedNestedExpr = nestedExpr.elements[1] as ArrayExpression
+ expect(nestedNestedExpr.elements).toBeArrayOfSize(1)
+ expect(nestedNestedExpr.elements[0]).toBeInstanceOf(LiteralExpression)
+ expect((nestedNestedExpr.elements[0] as LiteralExpression).value).toBe(3)
+ })
+
+ test('expressions', () => {
+ const stmts = parse('[-1,2*2,3+3]')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(ArrayExpression)
+ const arrayExpr = exprStmt.expression as ArrayExpression
+ expect(arrayExpr.elements).toBeArrayOfSize(3)
+ expect(arrayExpr.elements[0]).toBeInstanceOf(UnaryExpression)
+ expect(arrayExpr.elements[1]).toBeInstanceOf(BinaryExpression)
+ expect(arrayExpr.elements[2]).toBeInstanceOf(BinaryExpression)
+ })
+})
+
+describe('dictionary', () => {
+ test('empty', () => {
+ const stmts = parse('let empty = {}')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ const varStmt = stmts[0] as VariableStatement
+ expect(varStmt.initializer).toBeInstanceOf(DictionaryExpression)
+ const mapExpr = varStmt.initializer as DictionaryExpression
+ expect(mapExpr.elements).toBeEmpty()
+ })
+
+ test('single element', () => {
+ const stmts = parse('let movie = {"title": "Jurassic Park"}')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ const varStmt = stmts[0] as VariableStatement
+ expect(varStmt.initializer).toBeInstanceOf(DictionaryExpression)
+ const mapExpr = varStmt.initializer as DictionaryExpression
+ expect(mapExpr.elements.size).toBe(1)
+ expect(mapExpr.elements.get('title')).toBeInstanceOf(LiteralExpression)
+ expect((mapExpr.elements.get('title') as LiteralExpression).value).toBe(
+ 'Jurassic Park'
+ )
+ })
+
+ test('multiple elements', () => {
+ const stmts = parse('let movie = {"title": "Jurassic Park", "year": 1993}')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ const varStmt = stmts[0] as VariableStatement
+ expect(varStmt.initializer).toBeInstanceOf(DictionaryExpression)
+ const mapExpr = varStmt.initializer as DictionaryExpression
+ expect(mapExpr.elements.size).toBe(2)
+ expect(mapExpr.elements.get('title')).toBeInstanceOf(LiteralExpression)
+ expect((mapExpr.elements.get('title') as LiteralExpression).value).toBe(
+ 'Jurassic Park'
+ )
+ expect(mapExpr.elements.get('year')).toBeInstanceOf(LiteralExpression)
+ expect((mapExpr.elements.get('year') as LiteralExpression).value).toBe(1993)
+ })
+
+ test('nested', () => {
+ const stmts = parse(
+ 'let movie = {"title": "Jurassic Park", "director": { "name": "Steven Spielberg" } }'
+ )
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ const varStmt = stmts[0] as VariableStatement
+ expect(varStmt.initializer).toBeInstanceOf(DictionaryExpression)
+ const mapExpr = varStmt.initializer as DictionaryExpression
+ expect(mapExpr.elements.size).toBe(2)
+ expect(mapExpr.elements.get('title')).toBeInstanceOf(LiteralExpression)
+ expect((mapExpr.elements.get('title') as LiteralExpression).value).toBe(
+ 'Jurassic Park'
+ )
+ expect(mapExpr.elements.get('director')).toBeInstanceOf(
+ DictionaryExpression
+ )
+ const nestedMapExpr = mapExpr.elements.get(
+ 'director'
+ ) as DictionaryExpression
+ expect(nestedMapExpr.elements.size).toBe(1)
+ expect(nestedMapExpr.elements.get('name')).toBeInstanceOf(LiteralExpression)
+ expect(
+ (nestedMapExpr.elements.get('name') as LiteralExpression).value
+ ).toBe('Steven Spielberg')
+ })
+})
+
+describe('variable', () => {
+ test('single-character name', () => {
+ const statements = parse('let x = 1')
+ expect(statements).toBeArrayOfSize(1)
+ expect(statements[0]).toBeInstanceOf(VariableStatement)
+ const varStatement = statements[0] as VariableStatement
+ expect(varStatement.name.lexeme).toBe('x')
+ const literalExpr = varStatement.initializer as LiteralExpression
+ expect(literalExpr.value).toBe(1)
+ })
+
+ test('multi-character name', () => {
+ const statements = parse('let fooBar = "abc"')
+ expect(statements).toBeArrayOfSize(1)
+ expect(statements[0]).toBeInstanceOf(VariableStatement)
+ const varStatement = statements[0] as VariableStatement
+ expect(varStatement.name.lexeme).toBe('fooBar')
+ const literalExpr = varStatement.initializer as LiteralExpression
+ expect(literalExpr.value).toBe('abc')
+ })
+})
+
+describe('assignment', () => {
+ test('regular', () => {
+ const statements = parse(`
+ let x = 1
+ x = 2
+ `)
+ expect(statements).toBeArrayOfSize(2)
+ expect(statements[1]).toBeInstanceOf(ExpressionStatement)
+ const exprStatement = statements[1] as ExpressionStatement
+ expect(exprStatement.expression).toBeInstanceOf(AssignExpression)
+ const assignExpr = exprStatement.expression as AssignExpression
+ expect(assignExpr.name.lexeme).toBe('x')
+ expect(assignExpr.operator.type).toBe('EQUAL')
+ expect(assignExpr.value).toBeInstanceOf(LiteralExpression)
+ const literalExpr = assignExpr.value as LiteralExpression
+ expect(literalExpr.value).toBe(2)
+ })
+
+ describe('compound', () => {
+ test('plus', () => {
+ const statements = parse(`
+ let x = 1
+ x += 2
+ `)
+ expect(statements).toBeArrayOfSize(2)
+ expect(statements[1]).toBeInstanceOf(ExpressionStatement)
+ const exprStatement = statements[1] as ExpressionStatement
+ expect(exprStatement.expression).toBeInstanceOf(AssignExpression)
+ const assignExpr = exprStatement.expression as AssignExpression
+ expect(assignExpr.name.lexeme).toBe('x')
+ expect(assignExpr.operator.type).toBe('PLUS_EQUAL')
+ expect(assignExpr.value).toBeInstanceOf(LiteralExpression)
+ const literalExpr = assignExpr.value as LiteralExpression
+ expect(literalExpr.value).toBe(2)
+ })
+
+ test('minus', () => {
+ const statements = parse(`
+ let x = 1
+ x -= 2
+ `)
+ expect(statements).toBeArrayOfSize(2)
+ expect(statements[1]).toBeInstanceOf(ExpressionStatement)
+ const exprStatement = statements[1] as ExpressionStatement
+ expect(exprStatement.expression).toBeInstanceOf(AssignExpression)
+ const assignExpr = exprStatement.expression as AssignExpression
+ expect(assignExpr.name.lexeme).toBe('x')
+ expect(assignExpr.operator.type).toBe('MINUS_EQUAL')
+ expect(assignExpr.value).toBeInstanceOf(LiteralExpression)
+ const literalExpr = assignExpr.value as LiteralExpression
+ expect(literalExpr.value).toBe(2)
+ })
+
+ test('multiply', () => {
+ const statements = parse(`
+ let x = 1
+ x *= 2
+ `)
+ expect(statements).toBeArrayOfSize(2)
+ expect(statements[1]).toBeInstanceOf(ExpressionStatement)
+ const exprStatement = statements[1] as ExpressionStatement
+ expect(exprStatement.expression).toBeInstanceOf(AssignExpression)
+ const assignExpr = exprStatement.expression as AssignExpression
+ expect(assignExpr.name.lexeme).toBe('x')
+ expect(assignExpr.operator.type).toBe('STAR_EQUAL')
+ expect(assignExpr.value).toBeInstanceOf(LiteralExpression)
+ const literalExpr = assignExpr.value as LiteralExpression
+ expect(literalExpr.value).toBe(2)
+ })
+
+ test('divide', () => {
+ const statements = parse(`
+ let x = 1
+ x /= 2
+ `)
+ expect(statements).toBeArrayOfSize(2)
+ expect(statements[1]).toBeInstanceOf(ExpressionStatement)
+ const exprStatement = statements[1] as ExpressionStatement
+ expect(exprStatement.expression).toBeInstanceOf(AssignExpression)
+ const assignExpr = exprStatement.expression as AssignExpression
+ expect(assignExpr.name.lexeme).toBe('x')
+ expect(assignExpr.operator.type).toBe('SLASH_EQUAL')
+ expect(assignExpr.value).toBeInstanceOf(LiteralExpression)
+ const literalExpr = assignExpr.value as LiteralExpression
+ expect(literalExpr.value).toBe(2)
+ })
+ })
+})
+
+describe('increment', () => {
+ test('variable', () => {
+ const statements = parse(`
+ let x = 1
+ x++
+ `)
+ expect(statements).toBeArrayOfSize(2)
+ expect(statements[1]).toBeInstanceOf(ExpressionStatement)
+ const exprStatement = statements[1] as ExpressionStatement
+ expect(exprStatement.expression).toBeInstanceOf(UpdateExpression)
+ const incrementExpr = exprStatement.expression as UpdateExpression
+ expect(incrementExpr.operator.type).toBe('PLUS_PLUS')
+ expect(incrementExpr.operand).toBeInstanceOf(VariableExpression)
+ const variableExpr = incrementExpr.operand as VariableExpression
+ expect(variableExpr.name.lexeme).toBe('x')
+ })
+
+ test('array', () => {
+ const statements = parse(`
+ let x = [1,2]
+ x[0]++
+ `)
+ expect(statements).toBeArrayOfSize(2)
+ expect(statements[1]).toBeInstanceOf(ExpressionStatement)
+ const exprStatement = statements[1] as ExpressionStatement
+ expect(exprStatement.expression).toBeInstanceOf(UpdateExpression)
+ const incrementExpr = exprStatement.expression as UpdateExpression
+ expect(incrementExpr.operator.type).toBe('PLUS_PLUS')
+ expect(incrementExpr.operand).toBeInstanceOf(GetExpression)
+ const getExpr = incrementExpr.operand as GetExpression
+ expect(getExpr.field.lexeme).toBe('0')
+ expect(getExpr.obj).toBeInstanceOf(VariableExpression)
+ const variableExpr = getExpr.obj as VariableExpression
+ expect(variableExpr.name.lexeme).toBe('x')
+ })
+
+ test('dictionary', () => {
+ const statements = parse(`
+ let x = {"count": 1}
+ x["count"]++
+ `)
+ expect(statements).toBeArrayOfSize(2)
+ expect(statements[1]).toBeInstanceOf(ExpressionStatement)
+ const exprStatement = statements[1] as ExpressionStatement
+ expect(exprStatement.expression).toBeInstanceOf(UpdateExpression)
+ const incrementExpr = exprStatement.expression as UpdateExpression
+ expect(incrementExpr.operator.type).toBe('PLUS_PLUS')
+ expect(incrementExpr.operand).toBeInstanceOf(GetExpression)
+ const getExpr = incrementExpr.operand as GetExpression
+ expect(getExpr.field.lexeme).toBe('"count"')
+ expect(getExpr.obj).toBeInstanceOf(VariableExpression)
+ const variableExpr = getExpr.obj as VariableExpression
+ expect(variableExpr.name.lexeme).toBe('x')
+ })
+})
+
+describe('call', () => {
+ test('without arguments', () => {
+ const stmts = parse('move()')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const expStmt = stmts[0] as ExpressionStatement
+ expect(expStmt.expression).toBeInstanceOf(CallExpression)
+ const callExpr = expStmt.expression as CallExpression
+ expect(callExpr.args).toBeEmpty()
+ })
+
+ test('single argument', () => {
+ const stmts = parse('turn("left")')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(CallExpression)
+ const callExpr = exprStmt.expression as CallExpression
+ expect(callExpr.args).toBeArrayOfSize(1)
+ expect(callExpr.args[0]).toBeInstanceOf(LiteralExpression)
+ })
+
+ test('chained', () => {
+ const stmts = parse('turn("left")("right")')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(CallExpression)
+ const callExpr = exprStmt.expression as CallExpression
+ expect(callExpr.args).toBeArrayOfSize(1)
+ expect(callExpr.args[0]).toBeInstanceOf(LiteralExpression)
+ expect(callExpr.callee).toBeInstanceOf(CallExpression)
+ const nestedCallExpr = callExpr.callee as CallExpression
+ expect(nestedCallExpr.args).toBeArrayOfSize(1)
+ expect(nestedCallExpr.args[0]).toBeInstanceOf(LiteralExpression)
+ })
+})
+
+describe('get', () => {
+ describe('dictionary', () => {
+ test('single field', () => {
+ const stmts = parse(`
+ let movie = {"title": "The Matrix"}
+ let title = movie["title"]
+ `)
+ expect(stmts).toBeArrayOfSize(2)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ expect(stmts[1]).toBeInstanceOf(VariableStatement)
+ const varStmtWithGet = stmts[1] as VariableStatement
+ expect(varStmtWithGet.initializer).toBeInstanceOf(GetExpression)
+ const getExpr = varStmtWithGet.initializer as GetExpression
+ expect(getExpr.field.literal).toBe('title')
+ expect(getExpr.obj).toBeInstanceOf(VariableExpression)
+ expect((getExpr.obj as VariableExpression).name.lexeme).toBe('movie')
+ })
+
+ test('chained', () => {
+ const stmts = parse(`
+ let movie = {"director": {"name": "Peter Jackson"}}
+ let director = movie["director"]["name"]
+ `)
+ expect(stmts).toBeArrayOfSize(2)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ expect(stmts[1]).toBeInstanceOf(VariableStatement)
+ const varStmtWithGet = stmts[1] as VariableStatement
+ expect(varStmtWithGet.initializer).toBeInstanceOf(GetExpression)
+ const getExpr = varStmtWithGet.initializer as GetExpression
+ expect(getExpr.field.literal).toBe('name')
+ expect(getExpr.obj).toBeInstanceOf(GetExpression)
+ const nestedGetExpr = getExpr.obj as GetExpression
+ expect(nestedGetExpr.field.literal).toBe('director')
+ expect(nestedGetExpr.obj).toBeInstanceOf(VariableExpression)
+ expect((nestedGetExpr.obj as VariableExpression).name.lexeme).toBe(
+ 'movie'
+ )
+ })
+ })
+
+ describe('array', () => {
+ test('single field', () => {
+ const stmts = parse(`
+ let scores = [7, 3, 10]
+ let latest = scores[2]
+ `)
+ expect(stmts).toBeArrayOfSize(2)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ expect(stmts[1]).toBeInstanceOf(VariableStatement)
+ const varStmtWithGet = stmts[1] as VariableStatement
+ expect(varStmtWithGet.initializer).toBeInstanceOf(GetExpression)
+ const getExpr = varStmtWithGet.initializer as GetExpression
+ expect(getExpr.field.literal).toBe(2)
+ expect(getExpr.obj).toBeInstanceOf(VariableExpression)
+ expect((getExpr.obj as VariableExpression).name.lexeme).toBe('scores')
+ })
+
+ test('chained', () => {
+ const stmts = parse(`
+ let scoreMinMax = [[3, 7], [1, 6]]
+ let secondMin = scoreMinMax[1][0]
+ `)
+ expect(stmts).toBeArrayOfSize(2)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ expect(stmts[1]).toBeInstanceOf(VariableStatement)
+ const varStmtWithGet = stmts[1] as VariableStatement
+ expect(varStmtWithGet.initializer).toBeInstanceOf(GetExpression)
+ const getExpr = varStmtWithGet.initializer as GetExpression
+ expect(getExpr.field.literal).toBe(0)
+ expect(getExpr.obj).toBeInstanceOf(GetExpression)
+ const nestedGetExpr = getExpr.obj as GetExpression
+ expect(nestedGetExpr.field.literal).toBe(1)
+ expect(nestedGetExpr.obj).toBeInstanceOf(VariableExpression)
+ expect((nestedGetExpr.obj as VariableExpression).name.lexeme).toBe(
+ 'scoreMinMax'
+ )
+ })
+ })
+})
+
+describe('set', () => {
+ describe('dictionary', () => {
+ test('single field', () => {
+ const stmts = parse(`
+ let movie = {"title": "The Matrix"}
+ movie["title"] = "Gladiator"
+ `)
+ expect(stmts).toBeArrayOfSize(2)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ expect(stmts[1]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[1] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(SetExpression)
+ const setExpr = exprStmt.expression as SetExpression
+ expect(setExpr.field.literal).toBe('title')
+ expect(setExpr.obj).toBeInstanceOf(VariableExpression)
+ expect((setExpr.obj as VariableExpression).name.lexeme).toBe('movie')
+ })
+
+ test('chained', () => {
+ const stmts = parse(`
+ let movie = {"director": {"name": "Peter Jackson"}}
+ movie["director"]["name"] = "James Cameron"
+ `)
+ expect(stmts).toBeArrayOfSize(2)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ expect(stmts[1]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[1] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(SetExpression)
+ const setExpr = exprStmt.expression as SetExpression
+ expect(setExpr.value).toBeInstanceOf(LiteralExpression)
+ expect((setExpr.value as LiteralExpression).value).toBe('James Cameron')
+ expect(setExpr.field.literal).toBe('name')
+ expect(setExpr.obj).toBeInstanceOf(GetExpression)
+ const getExpr = setExpr.obj as GetExpression
+ expect(getExpr.obj).toBeInstanceOf(VariableExpression)
+ expect((getExpr.obj as VariableExpression).name.lexeme).toBe('movie')
+ expect(getExpr.field.literal).toBe('director')
+ })
+ })
+
+ // TODO: add set on arrays
+})
+
+describe('template literal', () => {
+ test('empty', () => {
+ const stmts = parse('``')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(TemplateLiteralExpression)
+ const templateExpr = exprStmt.expression as TemplateLiteralExpression
+ expect(templateExpr.parts).toBeEmpty()
+ })
+
+ test('no placeholders', () => {
+ const stmts = parse('`hello there`')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(TemplateLiteralExpression)
+ const templateExpr = exprStmt.expression as TemplateLiteralExpression
+ expect(templateExpr.parts).toBeArrayOfSize(1)
+ expect(templateExpr.parts[0]).toBeInstanceOf(TemplateTextExpression)
+ const textExpr = templateExpr.parts[0] as TemplateTextExpression
+ expect(textExpr.text.literal).toBe('hello there')
+ })
+
+ test('placeholders', () => {
+ const stmts = parse('`sum of ${2} + ${1+3*5} = ${2+(1+4*5)}`')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(TemplateLiteralExpression)
+ const templateExpr = exprStmt.expression as TemplateLiteralExpression
+ expect(templateExpr.parts).toBeArrayOfSize(6)
+ expect(templateExpr.parts[0]).toBeInstanceOf(TemplateTextExpression)
+ expect(templateExpr.parts[1]).toBeInstanceOf(TemplatePlaceholderExpression)
+ expect(templateExpr.parts[2]).toBeInstanceOf(TemplateTextExpression)
+ expect(templateExpr.parts[3]).toBeInstanceOf(TemplatePlaceholderExpression)
+ expect(templateExpr.parts[4]).toBeInstanceOf(TemplateTextExpression)
+ expect(templateExpr.parts[5]).toBeInstanceOf(TemplatePlaceholderExpression)
+ const part0Expr = templateExpr.parts[0] as TemplateTextExpression
+ expect(part0Expr.text.lexeme).toBe('sum of ')
+ const part1Expr = templateExpr.parts[1] as TemplatePlaceholderExpression
+ expect(part1Expr.inner).toBeInstanceOf(LiteralExpression)
+ const part2Expr = templateExpr.parts[2] as TemplateTextExpression
+ expect(part2Expr.text.lexeme).toBe(' + ')
+ const part3Expr = templateExpr.parts[3] as TemplatePlaceholderExpression
+ expect(part3Expr.inner).toBeInstanceOf(BinaryExpression)
+ const part4Expr = templateExpr.parts[4] as TemplateTextExpression
+ expect(part4Expr.text.lexeme).toBe(' = ')
+ const part5Expr = templateExpr.parts[5] as TemplatePlaceholderExpression
+ expect(part5Expr.inner).toBeInstanceOf(BinaryExpression)
+ })
+})
+
+describe('grouping', () => {
+ test('non-nested', () => {
+ const stmts = parse('(1 + 2)')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(GroupingExpression)
+ const groupingExpr = exprStmt.expression as GroupingExpression
+ expect(groupingExpr.inner).toBeInstanceOf(BinaryExpression)
+ const binaryExpr = groupingExpr.inner as BinaryExpression
+ expect(binaryExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.right).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.operator.type).toBe('PLUS')
+ })
+
+ test('nested', () => {
+ const stmts = parse('(1 + (2 - 3))')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(GroupingExpression)
+ const groupingExpr = exprStmt.expression as GroupingExpression
+ expect(groupingExpr.inner).toBeInstanceOf(BinaryExpression)
+ const binaryExpr = groupingExpr.inner as BinaryExpression
+ expect(binaryExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.right).toBeInstanceOf(GroupingExpression)
+ expect(binaryExpr.operator.type).toBe('PLUS')
+ const nestedGroupingExpr = binaryExpr.right as GroupingExpression
+ expect(nestedGroupingExpr.inner).toBeInstanceOf(BinaryExpression)
+ const nestedBinaryExpr = nestedGroupingExpr.inner as BinaryExpression
+ expect(nestedBinaryExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(nestedBinaryExpr.right).toBeInstanceOf(LiteralExpression)
+ expect(nestedBinaryExpr.operator.type).toBe('MINUS')
+ })
+})
+
+describe('binary', () => {
+ test('addition', () => {
+ const stmts = parse('1 + 2')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(BinaryExpression)
+ const binaryExpr = exprStmt.expression as BinaryExpression
+ expect(binaryExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.right).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.operator.type).toBe('PLUS')
+ })
+
+ test('subtraction', () => {
+ const stmts = parse('1 - 2')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(BinaryExpression)
+ const binaryExpr = exprStmt.expression as BinaryExpression
+ expect(binaryExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.right).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.operator.type).toBe('MINUS')
+ })
+
+ test('multiplication', () => {
+ const stmts = parse('1 * 2')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(BinaryExpression)
+ const binaryExpr = exprStmt.expression as BinaryExpression
+ expect(binaryExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.right).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.operator.type).toBe('STAR')
+ })
+
+ test('division', () => {
+ const stmts = parse('1 / 2')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(BinaryExpression)
+ const binaryExpr = exprStmt.expression as BinaryExpression
+ expect(binaryExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.right).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.operator.type).toBe('SLASH')
+ })
+
+ test('string concatenation', () => {
+ const stmts = parse('"hello" + "world"')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(BinaryExpression)
+ const binaryExpr = exprStmt.expression as BinaryExpression
+ expect(binaryExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.right).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.operator.type).toBe('PLUS')
+ })
+
+ describe('nesting', () => {
+ test('numbers', () => {
+ const stmts = parse('1 + 2 * 3 / 4 - 5')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(BinaryExpression)
+
+ const binaryExpr = exprStmt.expression as BinaryExpression
+ expect(binaryExpr.operator.type).toBe('MINUS')
+ expect(binaryExpr.left).toBeInstanceOf(BinaryExpression)
+ expect(binaryExpr.right).toBeInstanceOf(LiteralExpression)
+
+ const binaryExprRight = binaryExpr.right as LiteralExpression
+ expect(binaryExprRight.value).toBe(5)
+
+ const binaryExprLeft = binaryExpr.left as BinaryExpression
+ expect(binaryExprLeft.operator.type).toBe('PLUS')
+ expect(binaryExprLeft.left).toBeInstanceOf(LiteralExpression)
+ expect(binaryExprLeft.right).toBeInstanceOf(BinaryExpression)
+
+ const binaryExprLeftLeft = binaryExprLeft.left as LiteralExpression
+ expect(binaryExprLeftLeft.value).toBe(1)
+
+ const binaryExprLeftRight = binaryExprLeft.right as BinaryExpression
+ expect(binaryExprLeftRight.operator.type).toBe('SLASH')
+ expect(binaryExprLeftRight.left).toBeInstanceOf(BinaryExpression)
+ expect(binaryExprLeftRight.right).toBeInstanceOf(LiteralExpression)
+
+ const binaryExprLeftRightRight =
+ binaryExprLeftRight.right as LiteralExpression
+ expect(binaryExprLeftRightRight.value).toBe(4)
+
+ const binaryExprLeftRightLeft =
+ binaryExprLeftRight.left as BinaryExpression
+ expect(binaryExprLeftRightLeft.operator.type).toBe('STAR')
+ expect(binaryExprLeftRightLeft.left).toBeInstanceOf(LiteralExpression)
+ expect(binaryExprLeftRightLeft.right).toBeInstanceOf(LiteralExpression)
+ const binaryExprLeftRightLeftLeft =
+ binaryExprLeftRightLeft.left as LiteralExpression
+ expect(binaryExprLeftRightLeftLeft.value).toBe(2)
+ const binaryExprLeftRightLeftRight =
+ binaryExprLeftRightLeft.right as LiteralExpression
+ expect(binaryExprLeftRightLeftRight.value).toBe(3)
+ })
+
+ test('string concatenation', () => {
+ const stmts = parse('"hello" + "world" + "!"')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(BinaryExpression)
+ const binaryExpr = exprStmt.expression as BinaryExpression
+ expect(binaryExpr.operator.type).toBe('PLUS')
+ expect(binaryExpr.left).toBeInstanceOf(BinaryExpression)
+ expect(binaryExpr.right).toBeInstanceOf(LiteralExpression)
+
+ const binaryExprRight = binaryExpr.right as LiteralExpression
+ expect(binaryExprRight.value).toBe('!')
+
+ const binaryExprLeft = binaryExpr.left as BinaryExpression
+ expect(binaryExprLeft.left).toBeInstanceOf(LiteralExpression)
+ expect(binaryExprLeft.right).toBeInstanceOf(LiteralExpression)
+
+ const binaryExprLeftLeft = binaryExprLeft.left as LiteralExpression
+ expect(binaryExprLeftLeft.value).toBe('hello')
+
+ const binaryExprLeftRight = binaryExprLeft.right as LiteralExpression
+ expect(binaryExprLeftRight.value).toBe('world')
+ })
+ })
+})
+
+describe('logical', () => {
+ test('and', () => {
+ const stmts = parse('true and false')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(LogicalExpression)
+ const logicalExpr = exprStmt.expression as LogicalExpression
+ expect(logicalExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(logicalExpr.right).toBeInstanceOf(LiteralExpression)
+ expect(logicalExpr.operator.type).toBe('AND')
+ })
+
+ test('&&', () => {
+ const stmts = parse('true && false')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(LogicalExpression)
+ const logicalExpr = exprStmt.expression as LogicalExpression
+ expect(logicalExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(logicalExpr.right).toBeInstanceOf(LiteralExpression)
+ expect(logicalExpr.operator.type).toBe('AND')
+ })
+
+ test('or', () => {
+ const stmts = parse('true or false')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(LogicalExpression)
+ const logicalExpr = exprStmt.expression as LogicalExpression
+ expect(logicalExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(logicalExpr.right).toBeInstanceOf(LiteralExpression)
+ expect(logicalExpr.operator.type).toBe('OR')
+ })
+
+ test('||', () => {
+ const stmts = parse('true || false')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(LogicalExpression)
+ const logicalExpr = exprStmt.expression as LogicalExpression
+ expect(logicalExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(logicalExpr.right).toBeInstanceOf(LiteralExpression)
+ expect(logicalExpr.operator.type).toBe('OR')
+ })
+})
+
+describe('ternary', () => {
+ test('non-nested', () => {
+ const stmts = parse('true ? 1 : 2')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const expStmt = stmts[0] as ExpressionStatement
+ expect(expStmt.expression).toBeInstanceOf(TernaryExpression)
+ const ternaryExpr = expStmt.expression as TernaryExpression
+ expect(ternaryExpr.thenBranch).toBeInstanceOf(LiteralExpression)
+ expect(ternaryExpr.elseBranch).toBeInstanceOf(LiteralExpression)
+ })
+
+ test('nested', () => {
+ const stmts = parse('true ? 1 : false ? 2 : 3')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const expStmt = stmts[0] as ExpressionStatement
+ expect(expStmt.expression).toBeInstanceOf(TernaryExpression)
+ const ternaryExpr = expStmt.expression as TernaryExpression
+ expect(ternaryExpr.thenBranch).toBeInstanceOf(LiteralExpression)
+ expect(ternaryExpr.elseBranch).toBeInstanceOf(TernaryExpression)
+ const nestedTernaryExpr = ternaryExpr.elseBranch as TernaryExpression
+ expect(nestedTernaryExpr.thenBranch).toBeInstanceOf(LiteralExpression)
+ expect(nestedTernaryExpr.elseBranch).toBeInstanceOf(LiteralExpression)
+ })
+})
+
+describe('if', () => {
+ test('without else', () => {
+ const stmts = parse(`
+ if (true) {
+ let x = 1
+ }
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(IfStatement)
+ const expStmt = stmts[0] as IfStatement
+ expect(expStmt.condition).toBeInstanceOf(LiteralExpression)
+ expect(expStmt.thenBranch).toBeInstanceOf(BlockStatement)
+ const thenStmt = expStmt.thenBranch as BlockStatement
+ expect(thenStmt.statements).toBeArrayOfSize(1)
+ expect(thenStmt.statements[0]).toBeInstanceOf(VariableStatement)
+ expect(expStmt.elseBranch).toBeNil()
+ })
+
+ test('with else', () => {
+ const stmts = parse(`
+ if (true) {
+ let x = 1
+ }
+ else {
+ let x = 2
+ }
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(IfStatement)
+ const expStmt = stmts[0] as IfStatement
+ expect(expStmt.condition).toBeInstanceOf(LiteralExpression)
+ expect(expStmt.thenBranch).toBeInstanceOf(BlockStatement)
+ const thenStmt = expStmt.thenBranch as BlockStatement
+ expect(thenStmt.statements).toBeArrayOfSize(1)
+ expect(thenStmt.statements[0]).toBeInstanceOf(VariableStatement)
+ expect(expStmt.elseBranch).toBeInstanceOf(BlockStatement)
+ const elseStmt = expStmt.elseBranch as BlockStatement
+ expect(elseStmt.statements).toBeArrayOfSize(1)
+ expect(elseStmt.statements[0]).toBeInstanceOf(VariableStatement)
+ })
+
+ test('nested', () => {
+ const stmts = parse(`
+ if (true) {
+ let x = 1
+ }
+ else if (false) {
+ let x = 2
+ }
+ else {
+ let x = 3
+ }
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(IfStatement)
+ const expStmt = stmts[0] as IfStatement
+ expect(expStmt.condition).toBeInstanceOf(LiteralExpression)
+ expect(expStmt.thenBranch).toBeInstanceOf(BlockStatement)
+ const thenStmt = expStmt.thenBranch as BlockStatement
+ expect(thenStmt.statements).toBeArrayOfSize(1)
+ expect(thenStmt.statements[0]).toBeInstanceOf(VariableStatement)
+ expect(expStmt.elseBranch).toBeInstanceOf(IfStatement)
+ const elseIfStmt = expStmt.elseBranch as IfStatement
+ expect(elseIfStmt.condition).toBeInstanceOf(LiteralExpression)
+ expect(elseIfStmt.thenBranch).toBeInstanceOf(BlockStatement)
+ const elseIfStmtThenBlock = elseIfStmt.thenBranch as BlockStatement
+ expect(elseIfStmtThenBlock.statements).toBeArrayOfSize(1)
+ expect(elseIfStmtThenBlock.statements[0]).toBeInstanceOf(VariableStatement)
+ expect(elseIfStmt.elseBranch).toBeInstanceOf(BlockStatement)
+ const elseIfStmtElseBlock = elseIfStmt.elseBranch as BlockStatement
+ expect(elseIfStmtElseBlock.statements).toBeArrayOfSize(1)
+ expect(elseIfStmtElseBlock.statements[0]).toBeInstanceOf(VariableStatement)
+ })
+})
+
+describe('while', () => {
+ test('with single statement', () => {
+ const stmts = parse(`
+ while (true) {
+ let x = 1
+ }
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(WhileStatement)
+ const expStmt = stmts[0] as WhileStatement
+ expect(expStmt.condition).toBeInstanceOf(LiteralExpression)
+ expect(expStmt.body).toBeArrayOfSize(1)
+ expect(expStmt.body[0]).toBeInstanceOf(VariableStatement)
+ })
+})
+
+describe('do while', () => {
+ test('with single statement', () => {
+ const stmts = parse(`
+ do {
+ let x = 1
+ }
+ while (true)
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(DoWhileStatement)
+ const expStmt = stmts[0] as DoWhileStatement
+ expect(expStmt.condition).toBeInstanceOf(LiteralExpression)
+ expect(expStmt.body).toBeArrayOfSize(1)
+ expect(expStmt.body[0]).toBeInstanceOf(VariableStatement)
+ })
+})
+
+describe('block', () => {
+ test('non-nested', () => {
+ const stmts = parse(`
+ {
+ let x = 1
+ let y = 2
+ }
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(BlockStatement)
+ const blockStmt = stmts[0] as BlockStatement
+ expect(blockStmt.statements).toBeArrayOfSize(2)
+ expect(blockStmt.statements[0]).toBeInstanceOf(VariableStatement)
+ expect(blockStmt.statements[1]).toBeInstanceOf(VariableStatement)
+ })
+
+ test('nested', () => {
+ const stmts = parse(`
+ {
+ let x = 1
+ {
+ let y = 2
+ }
+ }
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(BlockStatement)
+ const blockStmt = stmts[0] as BlockStatement
+ expect(blockStmt.statements).toBeArrayOfSize(2)
+ expect(blockStmt.statements[0]).toBeInstanceOf(VariableStatement)
+ expect(blockStmt.statements[1]).toBeInstanceOf(BlockStatement)
+ })
+})
+
+describe('function', () => {
+ test('without parameters', () => {
+ const stmts = parse(`
+ function move() {
+ return 1
+ }
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(FunctionStatement)
+ const functionStmt = stmts[0] as FunctionStatement
+ expect(functionStmt.name.lexeme).toBe('move')
+ expect(functionStmt.parameters).toBeEmpty()
+ expect(functionStmt.body).toBeArrayOfSize(1)
+ expect(functionStmt.body[0]).toBeInstanceOf(ReturnStatement)
+ })
+
+ test('with parameters', () => {
+ const stmts = parse(`
+ function move(from, to) {
+ return from + to
+ }
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(FunctionStatement)
+ const functionStmt = stmts[0] as FunctionStatement
+ expect(functionStmt.name.lexeme).toBe('move')
+ expect(functionStmt.parameters).toBeArrayOfSize(2)
+ expect(functionStmt.parameters[0].name.lexeme).toBe('from')
+ expect(functionStmt.parameters[1].name.lexeme).toBe('to')
+ expect(functionStmt.body).toBeArrayOfSize(1)
+ expect(functionStmt.body[0]).toBeInstanceOf(ReturnStatement)
+ })
+
+ test('with default parameter', () => {
+ const stmts = parse(`
+ function move(from = 0, to = 10) {
+ return from + to
+ }
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(FunctionStatement)
+ const functionStmt = stmts[0] as FunctionStatement
+ expect(functionStmt.name.lexeme).toBe('move')
+ expect(functionStmt.parameters).toBeArrayOfSize(2)
+ expect(functionStmt.parameters[0].name.lexeme).toBe('from')
+ expect(functionStmt.parameters[1].name.lexeme).toBe('to')
+ expect(functionStmt.body).toBeArrayOfSize(1)
+ expect(functionStmt.body[0]).toBeInstanceOf(ReturnStatement)
+ })
+})
+
+describe('return', () => {
+ test('without argument', () => {
+ const stmts = parse('return')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ReturnStatement)
+ const returnStmt = stmts[0] as ReturnStatement
+ expect(returnStmt.value).toBeNull()
+ })
+
+ describe('with argument', () => {
+ test('number', () => {
+ const stmts = parse('return 2')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ReturnStatement)
+ const returnStmt = stmts[0] as ReturnStatement
+ expect(returnStmt.value).toBeInstanceOf(LiteralExpression)
+ const literalExpr = returnStmt.value as LiteralExpression
+ expect(literalExpr.value).toBe(2)
+ })
+
+ test('string', () => {
+ const stmts = parse('return "hello there!"')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ReturnStatement)
+ const returnStmt = stmts[0] as ReturnStatement
+ expect(returnStmt.value).toBeInstanceOf(LiteralExpression)
+ const literalExpr = returnStmt.value as LiteralExpression
+ expect(literalExpr.value).toBe('hello there!')
+ })
+ })
+})
+
+describe('error', () => {
+ describe('number', () => {
+ test('two periods', () => {
+ expect(() => parse('1.3.4')).toThrow(
+ 'A number can only have one decimal point. Did you mean `1.34`?'
+ )
+ })
+ })
+ describe('string', () => {
+ test('unstarted', () => {
+ expect(() => parse('abc"')).toThrow(
+ 'Did you forget the start quote for the "abc" string?'
+ )
+ })
+ test('unterminated - end of file', () => {
+ expect(() => parse('"abc')).toThrow(
+ 'Did you forget the end quote for the "abc" string?'
+ )
+ })
+ test('unterminated - end of line', () => {
+ expect(() => parse('"abc\nsomething_else"')).toThrow(
+ 'Did you forget the end quote for the "abc" string?'
+ )
+ })
+ test('unterminated - newline in string', () => {
+ expect(() => parse('"abc\n"')).toThrow(
+ 'Did you forget the end quote for the "abc" string?'
+ )
+ })
+ })
+
+ describe('call', () => {
+ test('missing opening parenthesis', () => {
+ expect(() =>
+ parse(`
+ function move() {
+ return 1
+ }
+
+ move)
+ `)
+ ).toThrow(
+ 'Did you forget the start parenthesis when trying to call the move function?'
+ )
+ })
+
+ test('missing closing parenthesis', () => {
+ expect(() => parse('move(1')).toThrow(
+ 'Did you forget the end parenthesis when trying to call the move function?'
+ )
+ })
+ })
+
+ describe('statement', () => {
+ test('multiple expressions on single line', () => {
+ expect(() => parse('1 1')).toThrow(
+ "We didn't expect `{{current}}` to appear on this line after the `{{previous}}`. {{suggestion}}"
+ )
+ })
+ })
+})
+
+describe('white space', () => {
+ test('skip over empty lines', () => {
+ const stmts = parse(`
+ let a = 19
+
+ \t\t\t
+ let x = true
+
+ let y = false
+ \t
+
+ `)
+ expect(stmts).toBeArrayOfSize(3)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ expect(stmts[1]).toBeInstanceOf(VariableStatement)
+ expect(stmts[2]).toBeInstanceOf(VariableStatement)
+ })
+})
+
+describe('location', () => {
+ describe('statement', () => {
+ test('expression', () => {
+ const statements = parse('123')
+ expect(statements).toBeArrayOfSize(1)
+ expect(statements[0]).toBeInstanceOf(ExpressionStatement)
+ const expressionStatement = statements[0] as ExpressionStatement
+ expect(expressionStatement.location.line).toBe(1)
+ expect(expressionStatement.location.relative.begin).toBe(1)
+ expect(expressionStatement.location.relative.end).toBe(4)
+ expect(expressionStatement.location.absolute.begin).toBe(1)
+ expect(expressionStatement.location.absolute.end).toBe(4)
+ })
+
+ test('variable', () => {
+ const statements = parse('let x = 1')
+ expect(statements).toBeArrayOfSize(1)
+ expect(statements[0]).toBeInstanceOf(VariableStatement)
+ const expressionStatement = statements[0] as VariableStatement
+ expect(expressionStatement.location.line).toBe(1)
+ expect(expressionStatement.location.relative.begin).toBe(1)
+ expect(expressionStatement.location.relative.end).toBe(10)
+ expect(expressionStatement.location.absolute.begin).toBe(1)
+ expect(expressionStatement.location.absolute.end).toBe(10)
+ })
+
+ test('const', () => {
+ const statements = parse('const x = 1')
+ expect(statements).toBeArrayOfSize(1)
+ expect(statements[0]).toBeInstanceOf(ConstantStatement)
+ const expressionStatement = statements[0] as ConstantStatement
+ expect(expressionStatement.location.line).toBe(1)
+ expect(expressionStatement.location.relative.begin).toBe(1)
+ expect(expressionStatement.location.relative.end).toBe(12)
+ expect(expressionStatement.location.absolute.begin).toBe(1)
+ expect(expressionStatement.location.absolute.end).toBe(12)
+ })
+ })
+
+ describe('expression', () => {
+ test('literal', () => {
+ const statements = parse('123')
+ expect(statements).toBeArrayOfSize(1)
+ expect(statements[0]).toBeInstanceOf(ExpressionStatement)
+ const expressionStatement = statements[0] as ExpressionStatement
+ const expression = expressionStatement.expression
+ expect(expression).toBeInstanceOf(LiteralExpression)
+
+ expect(expression.location.line).toBe(1)
+ expect(expression.location.relative.begin).toBe(1)
+ expect(expression.location.relative.end).toBe(4)
+ expect(expression.location.absolute.begin).toBe(1)
+ expect(expression.location.absolute.end).toBe(4)
+ })
+
+ test('variable', () => {
+ const statements = parse('foo')
+ expect(statements).toBeArrayOfSize(1)
+ expect(statements[0]).toBeInstanceOf(ExpressionStatement)
+ const expressionStatement = statements[0] as ExpressionStatement
+ const expression = expressionStatement.expression
+ expect(expression).toBeInstanceOf(VariableExpression)
+ expect(expression.location.line).toBe(1)
+ expect(expression.location.relative.begin).toBe(1)
+ expect(expression.location.relative.end).toBe(4)
+ expect(expression.location.absolute.begin).toBe(1)
+ expect(expression.location.absolute.end).toBe(4)
+ })
+
+ test('call', () => {
+ const statements = parse('move(7)')
+ expect(statements).toBeArrayOfSize(1)
+ expect(statements[0]).toBeInstanceOf(ExpressionStatement)
+ const expressionStatement = statements[0] as ExpressionStatement
+ const expression = expressionStatement.expression
+ expect(expression).toBeInstanceOf(CallExpression)
+ expect(expression.location.line).toBe(1)
+ expect(expression.location.relative.begin).toBe(1)
+ expect(expression.location.relative.end).toBe(8)
+ expect(expression.location.absolute.begin).toBe(1)
+ expect(expression.location.absolute.end).toBe(8)
+ })
+ })
+})
diff --git a/test/javascript/interpreter/languages/javascript/scanner.test.ts b/test/javascript/interpreter/languages/javascript/scanner.test.ts
new file mode 100644
index 0000000000..d59cadb212
--- /dev/null
+++ b/test/javascript/interpreter/languages/javascript/scanner.test.ts
@@ -0,0 +1,576 @@
+import { scan } from '@/interpreter/languages/javascript/scanner'
+import type { TokenType } from '@/interpreter/languages/javascript/token'
+
+describe('single-character', () => {
+ test.each([
+ ['{', 'LEFT_BRACE'],
+ ['[', 'LEFT_BRACKET'],
+ ['(', 'LEFT_PAREN'],
+ ['}', 'RIGHT_BRACE'],
+ [']', 'RIGHT_BRACKET'],
+ [')', 'RIGHT_PAREN'],
+ [':', 'COLON'],
+ [',', 'COMMA'],
+ ['-', 'MINUS'],
+ ['+', 'PLUS'],
+ ['*', 'STAR'],
+ ['/', 'SLASH'],
+ ['?', 'QUESTION_MARK'],
+ ])("'%s' token", (source: string, expectedType: string) => {
+ const tokens = scan(source)
+ expect(tokens[0].type).toBe(expectedType as TokenType)
+ expect(tokens[0].lexeme).toBe(source)
+ expect(tokens[0].literal).toBeNull
+ })
+})
+
+describe('one, two or three characters', () => {
+ test.each([
+ ['=', 'EQUAL'],
+
+ ['==', 'EQUALITY'],
+ ['!=', 'INEQUALITY'],
+ ['!==', 'STRICT_INEQUALITY'],
+ ['===', 'STRICT_EQUALITY'],
+
+ ['!', 'NOT'],
+ ['>', 'GREATER'],
+ ['>=', 'GREATER_EQUAL'],
+ ['<', 'LESS'],
+ ['<=', 'LESS_EQUAL'],
+ ['&&', 'AMPERSAND_AMPERSAND'],
+ ['||', 'PIPE_PIPE'],
+ ['*=', 'STAR_EQUAL'],
+ ['/=', 'SLASH_EQUAL'],
+ ['+=', 'PLUS_EQUAL'],
+ ['++', 'PLUS_PLUS'],
+ ['-=', 'MINUS_EQUAL'],
+ ['--', 'MINUS_MINUS'],
+ ])("'%s' token", (source: string, expectedType: string) => {
+ const tokens = scan(source)
+ expect(tokens[0].type).toBe(expectedType as TokenType)
+ expect(tokens[0].lexeme).toBe(source)
+ expect(tokens[0].literal).toBeNull
+ })
+})
+
+describe('keyword', () => {
+ test.each([
+ ['and', 'AND'],
+ ['const', 'CONST'],
+ ['do', 'DO'],
+ ['else', 'ELSE'],
+ ['false', 'FALSE'],
+ ['for', 'FOR'],
+ ['function', 'FUNCTION'],
+ ['if', 'IF'],
+ ['in', 'IN'],
+ ['let', 'LET'],
+ ['null', 'NULL'],
+ ['of', 'OF'],
+ ['or', 'OR'],
+ ['return', 'RETURN'],
+ ['true', 'TRUE'],
+ ['while', 'WHILE'],
+ ])("'%s' keyword", (source: string, expectedType: string) => {
+ const tokens = scan(source)
+ expect(tokens[0].type).toBe(expectedType as TokenType)
+ expect(tokens[0].lexeme).toBe(source)
+ expect(tokens[0].literal).toBeNull
+ })
+})
+
+describe('string', () => {
+ test('empty', () => {
+ const tokens = scan('""')
+ expect(tokens[0].type).toBe('STRING')
+ expect(tokens[0].lexeme).toBe('""')
+ expect(tokens[0].literal).toBe('')
+ })
+
+ test('single character', () => {
+ const tokens = scan('"a"')
+ expect(tokens[0].type).toBe('STRING')
+ expect(tokens[0].lexeme).toBe('"a"')
+ expect(tokens[0].literal).toBe('a')
+ })
+
+ test('multiple characters', () => {
+ const tokens = scan('"Hello"')
+ expect(tokens[0].type).toBe('STRING')
+ expect(tokens[0].lexeme).toBe('"Hello"')
+ expect(tokens[0].literal).toBe('Hello')
+ })
+
+ test('containing whitespace', () => {
+ const tokens = scan('" Good\tday! "')
+ expect(tokens[0].type).toBe('STRING')
+ expect(tokens[0].lexeme).toBe('" Good\tday! "')
+ expect(tokens[0].literal).toBe(' Good\tday! ')
+ })
+
+ test('containing number', () => {
+ const tokens = scan('"Testing 1,2,3"')
+ expect(tokens[0].type).toBe('STRING')
+ expect(tokens[0].lexeme).toBe('"Testing 1,2,3"')
+ expect(tokens[0].literal).toBe('Testing 1,2,3')
+ })
+})
+
+describe('template literal', () => {
+ test('empty', () => {
+ const tokens = scan('``')
+ expect(tokens.length).toBeGreaterThanOrEqual(2)
+ expect(tokens[0].type).toBe('BACKTICK')
+ expect(tokens[0].lexeme).toBe('`')
+ expect(tokens[0].literal).toBeNull()
+ expect(tokens[1].type).toBe('BACKTICK')
+ expect(tokens[1].lexeme).toBe('`')
+ expect(tokens[1].literal).toBeNull()
+ })
+
+ describe('text only', () => {
+ test('single character', () => {
+ const tokens = scan('`a`')
+ expect(tokens.length).toBeGreaterThanOrEqual(3)
+ expect(tokens[0].type).toBe('BACKTICK')
+ expect(tokens[0].lexeme).toBe('`')
+ expect(tokens[0].literal).toBeNull()
+ expect(tokens[1].type).toBe('TEMPLATE_LITERAL_TEXT')
+ expect(tokens[1].lexeme).toBe('a')
+ expect(tokens[1].literal).toBe('a')
+ expect(tokens[2].type).toBe('BACKTICK')
+ expect(tokens[2].lexeme).toBe('`')
+ expect(tokens[2].literal).toBeNull()
+ })
+
+ test('multiple characters', () => {
+ const tokens = scan('`hello`')
+ expect(tokens.length).toBeGreaterThanOrEqual(3)
+ expect(tokens[0].type).toBe('BACKTICK')
+ expect(tokens[0].lexeme).toBe('`')
+ expect(tokens[0].literal).toBeNull()
+ expect(tokens[1].type).toBe('TEMPLATE_LITERAL_TEXT')
+ expect(tokens[1].lexeme).toBe('hello')
+ expect(tokens[1].literal).toBe('hello')
+ expect(tokens[2].type).toBe('BACKTICK')
+ expect(tokens[2].lexeme).toBe('`')
+ expect(tokens[2].literal).toBeNull()
+ })
+
+ test('containing whitespace', () => {
+ const tokens = scan('` Good\tday! `')
+ expect(tokens.length).toBeGreaterThanOrEqual(3)
+ expect(tokens[0].type).toBe('BACKTICK')
+ expect(tokens[0].lexeme).toBe('`')
+ expect(tokens[0].literal).toBeNull()
+ expect(tokens[1].type).toBe('TEMPLATE_LITERAL_TEXT')
+ expect(tokens[1].lexeme).toBe(' Good\tday! ')
+ expect(tokens[1].literal).toBe(' Good\tday! ')
+ expect(tokens[2].type).toBe('BACKTICK')
+ expect(tokens[2].lexeme).toBe('`')
+ expect(tokens[2].literal).toBeNull()
+ })
+
+ test('containing number', () => {
+ const tokens = scan('`Testing 1,2,3`')
+ expect(tokens.length).toBeGreaterThanOrEqual(3)
+ expect(tokens[0].type).toBe('BACKTICK')
+ expect(tokens[0].lexeme).toBe('`')
+ expect(tokens[0].literal).toBeNull()
+ expect(tokens[1].type).toBe('TEMPLATE_LITERAL_TEXT')
+ expect(tokens[1].lexeme).toBe('Testing 1,2,3')
+ expect(tokens[1].literal).toBe('Testing 1,2,3')
+ expect(tokens[2].type).toBe('BACKTICK')
+ expect(tokens[2].lexeme).toBe('`')
+ expect(tokens[2].literal).toBeNull()
+ })
+ })
+
+ describe('placeholder only', () => {
+ test('string', () => {
+ const tokens = scan('`${"hello"}`')
+ expect(tokens.length).toBeGreaterThanOrEqual(5)
+ expect(tokens[0].type).toBe('BACKTICK')
+ expect(tokens[0].lexeme).toBe('`')
+ expect(tokens[0].literal).toBeNull()
+ expect(tokens[1].type).toBe('DOLLAR_LEFT_BRACE')
+ expect(tokens[1].lexeme).toBe('${')
+ expect(tokens[1].literal).toBeNull()
+ expect(tokens[2].type).toBe('STRING')
+ expect(tokens[2].lexeme).toBe('"hello"')
+ expect(tokens[2].literal).toBe('hello')
+ expect(tokens[3].type).toBe('RIGHT_BRACE')
+ expect(tokens[3].lexeme).toBe('}')
+ expect(tokens[3].literal).toBeNull()
+ expect(tokens[4].type).toBe('BACKTICK')
+ expect(tokens[4].lexeme).toBe('`')
+ expect(tokens[4].literal).toBeNull()
+ })
+
+ test('binary expression', () => {
+ const tokens = scan('`${2*4}`')
+ expect(tokens.length).toBeGreaterThanOrEqual(7)
+ expect(tokens[0].type).toBe('BACKTICK')
+ expect(tokens[0].lexeme).toBe('`')
+ expect(tokens[0].literal).toBeNull()
+ expect(tokens[1].type).toBe('DOLLAR_LEFT_BRACE')
+ expect(tokens[1].lexeme).toBe('${')
+ expect(tokens[1].literal).toBeNull()
+ expect(tokens[2].type).toBe('NUMBER')
+ expect(tokens[2].lexeme).toBe('2')
+ expect(tokens[2].literal).toBe(2)
+ expect(tokens[3].type).toBe('STAR')
+ expect(tokens[3].lexeme).toBe('*')
+ expect(tokens[3].literal).toBeNull()
+ expect(tokens[4].type).toBe('NUMBER')
+ expect(tokens[4].lexeme).toBe('4')
+ expect(tokens[4].literal).toBe(4)
+ expect(tokens[5].type).toBe('RIGHT_BRACE')
+ expect(tokens[5].lexeme).toBe('}')
+ expect(tokens[5].literal).toBeNull()
+ expect(tokens[6].type).toBe('BACKTICK')
+ expect(tokens[6].lexeme).toBe('`')
+ expect(tokens[6].literal).toBeNull()
+ })
+ })
+
+ test('text and placeholders', () => {
+ const tokens = scan('`sum of ${2} * ${3} is ${"six"}`')
+ expect(tokens.length).toBeGreaterThanOrEqual(5)
+ expect(tokens[0].type).toBe('BACKTICK')
+ expect(tokens[0].lexeme).toBe('`')
+ expect(tokens[0].literal).toBeNull()
+ expect(tokens[1].type).toBe('TEMPLATE_LITERAL_TEXT')
+ expect(tokens[1].lexeme).toBe('sum of ')
+ expect(tokens[1].literal).toBe('sum of ')
+ expect(tokens[2].type).toBe('DOLLAR_LEFT_BRACE')
+ expect(tokens[2].lexeme).toBe('${')
+ expect(tokens[2].literal).toBeNull()
+ expect(tokens[3].type).toBe('NUMBER')
+ expect(tokens[3].lexeme).toBe('2')
+ expect(tokens[3].literal).toBe(2)
+ expect(tokens[4].type).toBe('RIGHT_BRACE')
+ expect(tokens[4].lexeme).toBe('}')
+ expect(tokens[4].literal).toBeNull()
+ expect(tokens[5].type).toBe('TEMPLATE_LITERAL_TEXT')
+ expect(tokens[5].lexeme).toBe(' * ')
+ expect(tokens[5].literal).toBe(' * ')
+ expect(tokens[6].type).toBe('DOLLAR_LEFT_BRACE')
+ expect(tokens[6].lexeme).toBe('${')
+ expect(tokens[6].literal).toBeNull()
+ expect(tokens[7].type).toBe('NUMBER')
+ expect(tokens[7].lexeme).toBe('3')
+ expect(tokens[7].literal).toBe(3)
+ expect(tokens[8].type).toBe('RIGHT_BRACE')
+ expect(tokens[8].lexeme).toBe('}')
+ expect(tokens[8].literal).toBeNull()
+ expect(tokens[9].type).toBe('TEMPLATE_LITERAL_TEXT')
+ expect(tokens[9].lexeme).toBe(' is ')
+ expect(tokens[9].literal).toBe(' is ')
+ expect(tokens[10].type).toBe('DOLLAR_LEFT_BRACE')
+ expect(tokens[10].lexeme).toBe('${')
+ expect(tokens[10].literal).toBeNull()
+ expect(tokens[11].type).toBe('STRING')
+ expect(tokens[11].lexeme).toBe('"six"')
+ expect(tokens[11].literal).toBe('six')
+ expect(tokens[12].type).toBe('RIGHT_BRACE')
+ expect(tokens[12].lexeme).toBe('}')
+ expect(tokens[12].literal).toBeNull()
+ })
+
+ test('binary expression', () => {
+ const tokens = scan('`${2*4}`')
+ expect(tokens.length).toBeGreaterThanOrEqual(7)
+ expect(tokens[0].type).toBe('BACKTICK')
+ expect(tokens[0].lexeme).toBe('`')
+ expect(tokens[0].literal).toBeNull()
+ expect(tokens[1].type).toBe('DOLLAR_LEFT_BRACE')
+ expect(tokens[1].lexeme).toBe('${')
+ expect(tokens[1].literal).toBeNull()
+ expect(tokens[2].type).toBe('NUMBER')
+ expect(tokens[2].lexeme).toBe('2')
+ expect(tokens[2].literal).toBe(2)
+ expect(tokens[3].type).toBe('STAR')
+ expect(tokens[3].lexeme).toBe('*')
+ expect(tokens[3].literal).toBeNull()
+ expect(tokens[4].type).toBe('NUMBER')
+ expect(tokens[4].lexeme).toBe('4')
+ expect(tokens[4].literal).toBe(4)
+ expect(tokens[5].type).toBe('RIGHT_BRACE')
+ expect(tokens[5].lexeme).toBe('}')
+ expect(tokens[5].literal).toBeNull()
+ expect(tokens[6].type).toBe('BACKTICK')
+ expect(tokens[6].lexeme).toBe('`')
+ expect(tokens[6].literal).toBeNull()
+ })
+})
+
+describe('identifier', () => {
+ test('start with lower letter', () => {
+ const tokens = scan('name')
+ expect(tokens[0].type).toBe('IDENTIFIER')
+ expect(tokens[0].lexeme).toBe('name')
+ expect(tokens[0].literal).toBeNull
+ })
+
+ test('start with upper letter', () => {
+ const tokens = scan('Name')
+ expect(tokens[0].type).toBe('IDENTIFIER')
+ expect(tokens[0].lexeme).toBe('Name')
+ expect(tokens[0].literal).toBeNull
+ })
+
+ test('start with underscore', () => {
+ const tokens = scan('_name')
+ expect(tokens[0].type).toBe('IDENTIFIER')
+ expect(tokens[0].lexeme).toBe('_name')
+ expect(tokens[0].literal).toBeNull
+ })
+})
+
+describe('number', () => {
+ test('integer', () => {
+ const tokens = scan('143')
+ expect(tokens[0].type).toBe('NUMBER')
+ expect(tokens[0].lexeme).toBe('143')
+ expect(tokens[0].literal).toBe(143)
+ })
+
+ test('floating-point', () => {
+ const tokens = scan('76.9')
+ expect(tokens[0].type).toBe('NUMBER')
+ expect(tokens[0].lexeme).toBe('76.9')
+ expect(tokens[0].literal).toBe(76.9)
+ })
+})
+
+describe('call', () => {
+ test('without arguments', () => {
+ const tokens = scan('move()')
+ expect(tokens).toBeArrayOfSize(5)
+ expect(tokens[0].type).toBe('IDENTIFIER')
+ expect(tokens[1].type).toBe('LEFT_PAREN')
+ expect(tokens[2].type).toBe('RIGHT_PAREN')
+ expect(tokens[3].type).toBe('EOL')
+ expect(tokens[4].type).toBe('EOF')
+ })
+
+ test('single string argument', () => {
+ const tokens = scan('turn("left")')
+ expect(tokens).toBeArrayOfSize(6)
+ expect(tokens[0].type).toBe('IDENTIFIER')
+ expect(tokens[1].type).toBe('LEFT_PAREN')
+ expect(tokens[2].type).toBe('STRING')
+ expect(tokens[3].type).toBe('RIGHT_PAREN')
+ expect(tokens[4].type).toBe('EOL')
+ expect(tokens[5].type).toBe('EOF')
+ })
+
+ test('single integer argument', () => {
+ const tokens = scan('advance(5)')
+ expect(tokens).toBeArrayOfSize(6)
+ expect(tokens[0].type).toBe('IDENTIFIER')
+ expect(tokens[1].type).toBe('LEFT_PAREN')
+ expect(tokens[2].type).toBe('NUMBER')
+ expect(tokens[3].type).toBe('RIGHT_PAREN')
+ expect(tokens[4].type).toBe('EOL')
+ expect(tokens[5].type).toBe('EOF')
+ })
+})
+
+test('multiple lines', () => {
+ const tokens = scan('move()\nturn("left")\nmove()')
+ expect(tokens).toBeArrayOfSize(14)
+ expect(tokens[0].type).toBe('IDENTIFIER')
+ expect(tokens[1].type).toBe('LEFT_PAREN')
+ expect(tokens[2].type).toBe('RIGHT_PAREN')
+ expect(tokens[3].type).toBe('EOL')
+ expect(tokens[4].type).toBe('IDENTIFIER')
+ expect(tokens[5].type).toBe('LEFT_PAREN')
+ expect(tokens[6].type).toBe('STRING')
+ expect(tokens[7].type).toBe('RIGHT_PAREN')
+ expect(tokens[8].type).toBe('EOL')
+ expect(tokens[9].type).toBe('IDENTIFIER')
+ expect(tokens[10].type).toBe('LEFT_PAREN')
+ expect(tokens[11].type).toBe('RIGHT_PAREN')
+ expect(tokens[12].type).toBe('EOL')
+ expect(tokens[13].type).toBe('EOF')
+})
+
+test('location', () => {
+ const tokens = scan('move()\nturn("left")')
+ expect(tokens).toBeArrayOfSize(10)
+
+ expect(tokens[0].location.line).toBe(1)
+ expect(tokens[0].location.relative.begin).toBe(1)
+ expect(tokens[0].location.relative.end).toBe(5)
+ expect(tokens[0].location.absolute.begin).toBe(1)
+ expect(tokens[0].location.absolute.end).toBe(5)
+
+ expect(tokens[1].location.line).toBe(1)
+ expect(tokens[1].location.relative.begin).toBe(5)
+ expect(tokens[1].location.relative.end).toBe(6)
+ expect(tokens[1].location.absolute.begin).toBe(5)
+ expect(tokens[1].location.absolute.end).toBe(6)
+
+ expect(tokens[2].location.line).toBe(1)
+ expect(tokens[2].location.relative.begin).toBe(6)
+ expect(tokens[2].location.relative.end).toBe(7)
+ expect(tokens[2].location.absolute.begin).toBe(6)
+ expect(tokens[2].location.absolute.end).toBe(7)
+
+ expect(tokens[3].location.line).toBe(1)
+ expect(tokens[3].location.relative.begin).toBe(7)
+ expect(tokens[3].location.relative.end).toBe(8)
+ expect(tokens[3].location.absolute.begin).toBe(7)
+ expect(tokens[3].location.absolute.end).toBe(8)
+
+ expect(tokens[4].location.line).toBe(2)
+ expect(tokens[4].location.relative.begin).toBe(1)
+ expect(tokens[4].location.relative.end).toBe(5)
+ expect(tokens[4].location.absolute.begin).toBe(8)
+ expect(tokens[4].location.absolute.end).toBe(12)
+
+ expect(tokens[5].location.line).toBe(2)
+ expect(tokens[5].location.relative.begin).toBe(5)
+ expect(tokens[5].location.relative.end).toBe(6)
+ expect(tokens[5].location.absolute.begin).toBe(12)
+ expect(tokens[5].location.absolute.end).toBe(13)
+
+ expect(tokens[6].location.line).toBe(2)
+ expect(tokens[6].location.relative.begin).toBe(6)
+ expect(tokens[6].location.relative.end).toBe(12)
+ expect(tokens[6].location.absolute.begin).toBe(13)
+ expect(tokens[6].location.absolute.end).toBe(19)
+
+ expect(tokens[7].location.line).toBe(2)
+ expect(tokens[7].location.relative.begin).toBe(12)
+ expect(tokens[7].location.relative.end).toBe(13)
+ expect(tokens[7].location.absolute.begin).toBe(19)
+ expect(tokens[7].location.absolute.end).toBe(20)
+})
+
+describe('error', () => {
+ describe('token', () => {
+ test('invalid', () => {
+ expect(() => scan('123#')).toThrow("Unknown character: '#'.")
+ })
+
+ test('Exclude listed', () => {
+ expect(() => scan('const x = 1', { ExcludeList: ['CONST'] })).toThrow(
+ "Usage of 'CONST' is not allowed"
+ )
+ })
+
+ test('Include listed', () => {
+ expect(() =>
+ scan('const x = 1', { IncludeList: ['IDENTIFIER', 'NUMBER'] })
+ ).toThrow("Usage of 'CONST' is not allowed")
+ })
+ })
+})
+
+describe('white space', () => {
+ describe('ignore', () => {
+ test('spaces', () => {
+ const tokens = scan(' ')
+ expect(tokens).toHaveLength(1)
+ expect(tokens[0].type).toBe('EOF')
+ })
+
+ test('tabs', () => {
+ const tokens = scan('\t\t\t')
+ expect(tokens).toHaveLength(1)
+ expect(tokens[0].type).toBe('EOF')
+ })
+
+ test('consecutive newlines', () => {
+ const tokens = scan('\n\n\n\n')
+ expect(tokens).toHaveLength(1)
+ expect(tokens[0].type).toBe('EOF')
+ })
+
+ test('between statements', () => {
+ const tokens = scan('1\n\n2\n')
+ expect(tokens).toHaveLength(5)
+ expect(tokens[0].type).toBe('NUMBER')
+ expect(tokens[1].type).toBe('EOL')
+ expect(tokens[2].type).toBe('NUMBER')
+ expect(tokens[3].type).toBe('EOL')
+ expect(tokens[4].type).toBe('EOF')
+ })
+ })
+})
+
+describe('synthetic', () => {
+ describe('EOL', () => {
+ describe('not added', () => {
+ test('empty line', () => {
+ const tokens = scan('')
+ expect(tokens).toBeArrayOfSize(1)
+ expect(tokens[0].type).toBe('EOF')
+ })
+
+ test('before first statement', () => {
+ const tokens = scan('\n1\n')
+ expect(tokens).toHaveLength(3)
+ expect(tokens[0].type).toBe('NUMBER')
+ expect(tokens[1].type).toBe('EOL')
+ expect(tokens[2].type).toBe('EOF')
+ })
+
+ test('between statements', () => {
+ const tokens = scan('1\n\n2\n')
+ expect(tokens).toHaveLength(5)
+ expect(tokens[0].type).toBe('NUMBER')
+ expect(tokens[1].type).toBe('EOL')
+ expect(tokens[2].type).toBe('NUMBER')
+ expect(tokens[3].type).toBe('EOL')
+ expect(tokens[4].type).toBe('EOF')
+ })
+ })
+
+ describe('added', () => {
+ describe('single statement', () => {
+ test('ending with newline', () => {
+ const tokens = scan('1\n')
+ expect(tokens).toBeArrayOfSize(3)
+ expect(tokens[0].type).toBe('NUMBER')
+ expect(tokens[1].type).toBe('EOL')
+ expect(tokens[2].type).toBe('EOF')
+ })
+
+ test('not ending with newline', () => {
+ const tokens = scan('1')
+ expect(tokens).toBeArrayOfSize(3)
+ expect(tokens[0].type).toBe('NUMBER')
+ expect(tokens[1].type).toBe('EOL')
+ expect(tokens[2].type).toBe('EOF')
+ })
+ })
+
+ describe('multiple statements', () => {
+ test('ending with newline', () => {
+ const tokens = scan('1\n2\n')
+ expect(tokens).toBeArrayOfSize(5)
+ expect(tokens[0].type).toBe('NUMBER')
+ expect(tokens[1].type).toBe('EOL')
+ expect(tokens[2].type).toBe('NUMBER')
+ expect(tokens[3].type).toBe('EOL')
+ expect(tokens[4].type).toBe('EOF')
+ })
+
+ test('last statement not ending with newline', () => {
+ const tokens = scan('1\n2')
+ expect(tokens).toBeArrayOfSize(5)
+ expect(tokens[0].type).toBe('NUMBER')
+ expect(tokens[1].type).toBe('EOL')
+ expect(tokens[2].type).toBe('NUMBER')
+ expect(tokens[3].type).toBe('EOL')
+ expect(tokens[4].type).toBe('EOF')
+ })
+ })
+ })
+ })
+})
diff --git a/test/javascript/interpreter/languages/jikiscript/interpreter.test.ts b/test/javascript/interpreter/languages/jikiscript/interpreter.test.ts
new file mode 100644
index 0000000000..96ec44b4e8
--- /dev/null
+++ b/test/javascript/interpreter/languages/jikiscript/interpreter.test.ts
@@ -0,0 +1,1374 @@
+import {
+ Interpreter,
+ interpretJikiScript as interpret,
+ evaluateJikiScriptFunction as evaluateFunction,
+} from '@/interpreter/interpreter'
+import type { ExecutionContext } from '@/interpreter/executor'
+
+describe('statements', () => {
+ describe('expression', () => {
+ test('number', () => {
+ const { frames, error } = interpret('set x to 1')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 1 })
+ })
+
+ test('string', () => {
+ const { frames } = interpret('set x to "hello there"')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 'hello there' })
+ })
+
+ describe('unary', () => {
+ test('negation', () => {
+ const { frames } = interpret('set x to not true')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: false })
+ })
+
+ test('minus', () => {
+ const { frames } = interpret('set x to -3')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: -3 })
+ })
+ })
+
+ describe('binary', () => {
+ describe('arithmetic', () => {
+ test('plus', () => {
+ const { frames } = interpret('set x to 2 + 3')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 5 })
+ })
+
+ test('minus', () => {
+ const { frames } = interpret('set x to 7 - 6')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 1 })
+ })
+
+ test('division', () => {
+ const { frames } = interpret('set x to 20 / 5')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 4 })
+ })
+
+ test('multiplication', () => {
+ const { frames } = interpret('set x to 4 * 2')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 8 })
+ })
+
+ test('remainder', () => {
+ const { frames } = interpret('set x to 4 % 3')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 1 })
+ })
+ })
+
+ describe('comparison', () => {
+ test('equality with is - true', () => {
+ const { frames, error } = interpret('set x to (2 is 2)')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: true })
+ })
+
+ test('equality with equals - true', () => {
+ const { frames } = interpret('set x to 2 equals 2')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: true })
+ })
+
+ test('equality with is - false', () => {
+ const { frames } = interpret('set x to (2 is "2")')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: false })
+ })
+
+ test('equality with equals', () => {
+ const { frames } = interpret('set x to 2 equals "2"')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: false })
+ })
+
+ // TODO: Decide what syntax we want for this.
+ test.skip('inequality', () => {
+ const { frames } = interpret('set x to 2 != "2"')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: false })
+ })
+ })
+
+ describe('logical', () => {
+ test('and', () => {
+ const { frames } = interpret('set x to true and false')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: false })
+ })
+
+ test('or', () => {
+ const { frames } = interpret('set x to true or false')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: true })
+ })
+
+ describe('truthiness', () => {
+ describe('enabled', () => {
+ test('and', () => {
+ const { frames } = interpret('set x to [] and true', {
+ languageFeatures: { truthiness: 'ON' },
+ })
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: true })
+ })
+
+ test('or', () => {
+ const { frames } = interpret('set x to 0 or false', {
+ languageFeatures: { truthiness: 'ON' },
+ })
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: false })
+ })
+ })
+
+ describe('disabled', () => {
+ test('and', () => {
+ const { frames } = interpret('set x to true and []', {
+ languageFeatures: { truthiness: 'OFF' },
+ })
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('ERROR')
+ })
+
+ test('or', () => {
+ const { frames } = interpret('set x to false or 0', {
+ languageFeatures: { truthiness: 'OFF' },
+ })
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('ERROR')
+ })
+ })
+ })
+ })
+
+ describe('strings', () => {
+ test('plus', () => {
+ const { frames } = interpret('set x to "sw" + "eet" ')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 'sweet' })
+ })
+ })
+
+ describe('template literals', () => {
+ test('text only', () => {
+ const { frames } = interpret('set x to `hello`')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 'hello' })
+ })
+
+ test('placeholder only', () => {
+ const { frames } = interpret('set x to `${3*4}`')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: '12' })
+ })
+
+ test('string', () => {
+ const { frames } = interpret('set x to `hello ${"there"}`')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 'hello there' })
+ })
+
+ test('variable', () => {
+ const { frames } = interpret(`
+ set x to 1
+ set y to \`x is \${x}\`
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 1 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 1, y: 'x is 1' })
+ })
+
+ test('expression', () => {
+ const { frames } = interpret('set x to `2 + 3 = ${2 + 3}`')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: '2 + 3 = 5' })
+ })
+
+ test('complex', () => {
+ const { frames } = interpret(
+ 'set x to `${2} + ${"three"} = ${2 + 9 / 3}`'
+ )
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: '2 + three = 5' })
+ })
+ })
+ })
+
+ describe('get', () => {
+ describe('dictionary', () => {
+ test('single field', () => {
+ const { frames } = interpret(`
+ set movie to {"title": "The Matrix"}
+ set title to movie["title"]
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({
+ movie: { title: 'The Matrix' },
+ })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({
+ movie: { title: 'The Matrix' },
+ title: 'The Matrix',
+ })
+ })
+
+ test('chained', () => {
+ const { frames } = interpret(`
+ set movie to {"director": {"name": "Peter Jackson"}}
+ set name to movie["director"]["name"]
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({
+ movie: { director: { name: 'Peter Jackson' } },
+ })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({
+ movie: { director: { name: 'Peter Jackson' } },
+ name: 'Peter Jackson',
+ })
+ })
+
+ describe('array', () => {
+ test('single index', () => {
+ const { frames } = interpret(`
+ set scores to [7, 3, 10]
+ set latest to scores[2]
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({
+ scores: [7, 3, 10],
+ })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({
+ scores: [7, 3, 10],
+ latest: 10,
+ })
+ })
+
+ test('chained', () => {
+ const { frames } = interpret(`
+ set scoreMinMax to [[3, 7], [1, 6]]
+ set secondMin to scoreMinMax[1][0]
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({
+ scoreMinMax: [
+ [3, 7],
+ [1, 6],
+ ],
+ })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({
+ scoreMinMax: [
+ [3, 7],
+ [1, 6],
+ ],
+ secondMin: 1,
+ })
+ })
+ })
+ })
+ })
+
+ describe('set', () => {
+ describe('dictionary', () => {
+ test('single field', () => {
+ const { frames } = interpret(`
+ set movie to {"title": "The Matrix"}
+ set movie["title"] to "Gladiator"
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({
+ movie: { title: 'The Matrix' },
+ })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({
+ movie: { title: 'Gladiator' },
+ })
+ })
+
+ test('chained', () => {
+ const { frames } = interpret(`
+ set movie to {"director": {"name": "Peter Jackson"}}
+ set movie["director"]["name"] to "James Cameron"
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({
+ movie: { director: { name: 'Peter Jackson' } },
+ })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({
+ movie: { director: { name: 'James Cameron' } },
+ })
+ })
+ })
+
+ describe('array', () => {
+ test('single index', () => {
+ const { frames } = interpret(`
+ set scores to [7, 3, 10]
+ set scores[2] to 5
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({
+ scores: [7, 3, 10],
+ })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({
+ scores: [7, 3, 5],
+ })
+ })
+
+ test('chained', () => {
+ const { frames } = interpret(`
+ set scoreMinMax to [[3, 7], [1, 6]]
+ set scoreMinMax[1][0] to 4
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({
+ scoreMinMax: [
+ [3, 7],
+ [1, 6],
+ ],
+ })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({
+ scoreMinMax: [
+ [3, 7],
+ [4, 6],
+ ],
+ })
+ })
+ })
+ })
+
+ describe('assignment', () => {
+ test('regular', () => {
+ const { frames } = interpret(`
+ set x to 2
+ change x to 3
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 2 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 3 })
+ })
+ })
+ })
+
+ describe('variable', () => {
+ test('declare and use', () => {
+ const { frames } = interpret('set x to 2')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 2 })
+ })
+
+ test('errors if declared twice', () => {
+ const { error, frames } = interpret(`
+ set pos to 10
+ set pos to 20
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[1].error!.category).toBe('RuntimeError')
+ expect(frames[1].error!.type).toBe('VariableAlreadyDeclared')
+ })
+
+ test('declare and use', () => {
+ const { frames } = interpret(`
+ set x to 2
+ set y to x + 1
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 2 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 2, y: 3 })
+ })
+ })
+
+ describe('change', () => {
+ test('changes variable correctly', () => {
+ const { error, frames } = interpret(`
+ set pos to 10
+ change pos to 20
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].variables).toMatchObject({ pos: 10 })
+ expect(frames[1].variables).toMatchObject({ pos: 20 })
+ })
+
+ test('errors if not declared', () => {
+ const { error, frames } = interpret(`
+ change pos to 20
+ `)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].error!.category).toBe('RuntimeError')
+ expect(frames[0].error!.type).toBe('VariableNotDeclared')
+ })
+ })
+
+ describe('scope', () => {
+ test('declared variable can be used in blocks', () => {
+ const { error, frames } = interpret(`
+ set pos to 10
+ repeat(5) do
+ change pos to pos + 10
+ end
+ `)
+ expect(frames).toBeArrayOfSize(7)
+ expect(frames[6].variables).toMatchObject({ pos: 60 })
+ })
+
+ test('declared variable is persisted after repeat', () => {
+ const { error, frames } = interpret(`
+ set pos to 10
+ repeat(5) do
+ change pos to pos + 10
+ end
+ change pos to pos + 10
+ `)
+ expect(frames).toBeArrayOfSize(8)
+ expect(frames[7].variables).toMatchObject({ pos: 70 })
+ })
+
+ test('declared variable is persisted after if', () => {
+ const { error, frames } = interpret(`
+ set pos to 10
+ if pos is 10 do
+ change pos to pos + 10
+ end
+ change pos to pos + 5
+ `)
+ expect(frames).toBeArrayOfSize(4)
+ expect(frames[0].variables).toMatchObject({ pos: 10 })
+ expect(frames[1].variables).toMatchObject({ pos: 10 })
+ // expect(frames[2].variables).toMatchObject({ pos: 20 })
+ expect(frames[3].variables).toMatchObject({ pos: 25 })
+ })
+ })
+ describe('function', () => {
+ describe('without parameters', () => {
+ test('define', () => {
+ const { frames } = interpret(`
+ function move {
+ return 1
+ }
+ `)
+ expect(frames).toBeEmpty()
+ })
+
+ describe('call', () => {
+ test('single statement function', () => {
+ const { frames } = interpret(`
+ function move do
+ return 1
+ end
+ set x to move()
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toBeEmpty()
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 1 })
+ })
+ })
+ })
+
+ describe('with parameters', () => {
+ test('define', () => {
+ const { frames } = interpret(`
+ function move with x do
+ return 1 + x
+ end
+ `)
+ expect(frames).toBeEmpty()
+ })
+
+ describe('call', () => {
+ test('single statement function', () => {
+ const { frames } = interpret(`
+ function move with x do
+ return 1 + x
+ end
+ set x to move(2)
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 2 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 3 })
+ })
+ })
+ })
+ })
+
+ describe('if', () => {
+ test('without else', () => {
+ const { frames } = interpret(`
+ if true is true do
+ set x to 2
+ end
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toBeEmpty()
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 2 })
+ })
+
+ test('with else', () => {
+ const { frames } = interpret(`
+ if true is false do
+ set x to 2
+ else do
+ set x to 3
+ end
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toBeEmpty()
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 3 })
+ })
+
+ test('nested', () => {
+ const { frames } = interpret(`
+ if true is false do
+ set x to 2
+ else if true is true do
+ set x to 3
+ else do
+ set x to 4
+ end
+ `)
+ expect(frames).toBeArrayOfSize(3)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toBeEmpty()
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toBeEmpty()
+ expect(frames[2].status).toBe('SUCCESS')
+ expect(frames[2].variables).toMatchObject({ x: 3 })
+ })
+ })
+
+ describe('repeat', () => {
+ test('once', () => {
+ const { error, frames } = interpret(`
+ set x to 0
+ repeat 1 do
+ change x to x + 1
+ end
+ `)
+ expect(frames).toBeArrayOfSize(3)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 0 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 0 })
+ expect(frames[2].status).toBe('SUCCESS')
+ expect(frames[2].variables).toMatchObject({ x: 1 })
+ })
+
+ test('multiple times', () => {
+ const { frames } = interpret(`
+ set x to 0
+ repeat 3 do
+ change x to x + 1
+ end
+ `)
+ expect(frames).toBeArrayOfSize(5)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 0 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 0 })
+ expect(frames[2].status).toBe('SUCCESS')
+ expect(frames[2].variables).toMatchObject({ x: 1 })
+ expect(frames[3].status).toBe('SUCCESS')
+ expect(frames[3].variables).toMatchObject({ x: 2 })
+ expect(frames[4].status).toBe('SUCCESS')
+ expect(frames[4].variables).toMatchObject({ x: 3 })
+ })
+ })
+
+ describe('while', () => {
+ test('once', () => {
+ const { frames } = interpret(`
+ set x to 1
+ while (x > 0) do
+ change x to x - 1
+ end
+ `)
+ expect(frames).toBeArrayOfSize(4)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 1 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 1 })
+ expect(frames[2].status).toBe('SUCCESS')
+ expect(frames[2].variables).toMatchObject({ x: 0 })
+ expect(frames[3].status).toBe('SUCCESS')
+ expect(frames[3].variables).toMatchObject({ x: 0 })
+ })
+
+ test('multiple times', () => {
+ const { frames } = interpret(`
+ set x to 3
+ while x > 0 do
+ change x to x - 1
+ end
+ `)
+ expect(frames).toBeArrayOfSize(8)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 3 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 3 })
+ expect(frames[2].status).toBe('SUCCESS')
+ expect(frames[2].variables).toMatchObject({ x: 2 })
+ expect(frames[3].status).toBe('SUCCESS')
+ expect(frames[3].variables).toMatchObject({ x: 2 })
+ expect(frames[4].status).toBe('SUCCESS')
+ expect(frames[4].variables).toMatchObject({ x: 1 })
+ expect(frames[5].status).toBe('SUCCESS')
+ expect(frames[5].variables).toMatchObject({ x: 1 })
+ expect(frames[6].status).toBe('SUCCESS')
+ expect(frames[6].variables).toMatchObject({ x: 0 })
+ expect(frames[7].status).toBe('SUCCESS')
+ expect(frames[7].variables).toMatchObject({ x: 0 })
+ })
+ })
+
+ describe('foreach', () => {
+ test('empty iterable', () => {
+ const echos: string[] = []
+ const context = {
+ externalFunctions: [
+ {
+ name: 'echo',
+ func: (_: any, n: any) => {
+ echos.push(n.toString())
+ },
+ description: '',
+ },
+ ],
+ }
+
+ const { frames } = interpret(
+ `
+ foreach num in [] do
+ echo(num)
+ end
+ `,
+ context
+ )
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toBeEmpty()
+ expect(echos).toBeEmpty()
+ })
+
+ test('multiple times', () => {
+ const echos: string[] = []
+ const context = {
+ externalFunctions: [
+ {
+ name: 'echo',
+ func: (_: any, n: any) => {
+ echos.push(n.toString())
+ },
+ description: '',
+ },
+ ],
+ }
+
+ const { frames } = interpret(
+ `
+ foreach num in [1, 2, 3] do
+ echo(num)
+ end
+ `,
+ context
+ )
+ expect(frames).toBeArrayOfSize(6)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toBeEmpty()
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ num: 1 })
+ expect(frames[2].status).toBe('SUCCESS')
+ expect(frames[3].status).toBe('SUCCESS')
+ expect(frames[3].variables).toMatchObject({ num: 2 })
+ expect(frames[4].status).toBe('SUCCESS')
+ expect(frames[5].status).toBe('SUCCESS')
+ expect(frames[5].variables).toMatchObject({ num: 3 })
+ expect(echos).toEqual(['1', '2', '3'])
+ })
+ })
+
+ describe('block', () => {
+ test('non-nested', () => {
+ const { frames } = interpret(`
+ do
+ set x to 1
+ set y to 2
+ end
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 1 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ x: 1, y: 2 })
+ })
+
+ test('nested', () => {
+ const { frames } = interpret(`
+ do
+ set x to 1
+ do
+ set y to 2
+ end
+ end
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].variables).toMatchObject({ x: 1 })
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].variables).toMatchObject({ y: 2 })
+ })
+ })
+})
+
+describe('frames', () => {
+ describe('single statement', () => {
+ test('literal', () => {
+ const { frames } = interpret('125')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].code).toBe('125')
+ expect(frames[0].error).toBeNil()
+ expect(frames[0].variables).toBeEmpty()
+ })
+
+ test('call', () => {
+ const echoFunction = (_interpreter: any, _n: any) => {}
+ const context = {
+ externalFunctions: [
+ {
+ name: 'echo',
+ func: echoFunction,
+ description: '',
+ },
+ ],
+ }
+ const { frames } = interpret('echo(1)', context)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].code).toBe('echo(1)')
+ expect(frames[0].error).toBeNil()
+ expect(frames[0].variables).toBeEmpty()
+ })
+
+ test('variable', () => {
+ const { frames } = interpret('set x to 1')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].code).toBe('set x to 1')
+ expect(frames[0].error).toBeNil()
+ expect(frames[0].variables).toMatchObject({ x: 1 })
+ })
+ })
+
+ describe('multiple statements', () => {
+ test('multiple calls', () => {
+ const context = {
+ externalFunctions: [
+ {
+ name: 'echo',
+ func: (_: any, n: any) => {},
+ description: '',
+ },
+ ],
+ }
+ const { frames } = interpret(
+ `
+ echo(1)
+ echo(2)
+ `,
+ context
+ )
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].line).toBe(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].code).toBe('echo(1)')
+ expect(frames[0].error).toBeNil()
+ expect(frames[1].line).toBe(3)
+ expect(frames[1].status).toBe('SUCCESS')
+ expect(frames[1].code).toBe('echo(2)')
+ expect(frames[1].error).toBeNil()
+ })
+ })
+
+ test('no error', () => {
+ const { frames, error } = interpret('125')
+ expect(frames).not.toBeEmpty()
+ expect(error).toBeNull()
+ })
+})
+
+describe('timing', () => {
+ describe('single statement', () => {
+ test('success', () => {
+ const context = {
+ externalFunctions: [
+ { name: 'echo', func: (_: any, _n: any) => {}, description: '' },
+ ],
+ }
+ const { frames } = interpret('echo(1)', context)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].time).toBe(0)
+ })
+
+ test('error', () => {
+ const context = {
+ externalFunctions: [
+ { name: 'echo', func: (_: any, _n: any) => {}, description: '' },
+ ],
+ }
+ const { frames } = interpret('127()', context)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].time).toBe(0)
+ })
+ })
+
+ describe('multiple statements', () => {
+ test('all successes', () => {
+ const context = {
+ externalFunctions: [
+ { name: 'echo', func: (_: any, _n: any) => {}, description: '' },
+ ],
+ }
+ const { frames } = interpret(
+ `
+ echo(1)
+ echo(2)
+ `,
+ context
+ )
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].time).toBe(0)
+ expect(frames[1].time).toBe(1)
+ })
+ })
+
+ describe('execution context', () => {
+ test('from non-user code', () => {
+ const advanceTimeFunction = (
+ { fastForward }: ExecutionContext,
+ n: number
+ ) => fastForward(n)
+ const context = {
+ externalFunctions: [
+ {
+ name: 'advanceTime',
+ func: advanceTimeFunction,
+ description: '',
+ },
+ ],
+ }
+ const { frames } = interpret(
+ `
+ 1
+ advanceTime(20)
+ 2
+ `,
+ context
+ )
+ expect(frames).toBeArrayOfSize(3)
+ expect(frames[0].time).toBe(0)
+ expect(frames[1].time).toBe(1)
+ expect(frames[2].time).toBe(22)
+ })
+
+ test('from user code is not possible', () => {
+ const { frames } = interpret('fastForward(100)')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('ERROR')
+ expect(frames[0].time).toBe(0)
+ })
+
+ test('manipulate state', () => {
+ const state = { count: 10 }
+ const incrementFunction = ({ state }: ExecutionContext) => {
+ state.count++
+ }
+ const context = {
+ externalFunctions: [
+ {
+ name: 'increment',
+ func: incrementFunction,
+ description: '',
+ },
+ ],
+ state,
+ }
+ const { frames } = interpret('increment()', context)
+ expect(state.count).toBe(11)
+
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].time).toBe(0)
+ })
+ })
+})
+
+describe('evaluateFunction', () => {
+ test('without arguments', () => {
+ const { value, frames } = evaluateFunction(
+ `
+ function move do
+ return 1
+ end
+ `,
+ {},
+ 'move'
+ )
+ expect(value).toBe(1)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].result?.value.value).toBe(1)
+ })
+
+ test('with arguments', () => {
+ const { value, frames } = evaluateFunction(
+ `
+ function move with x, y do
+ return x + y
+ end
+ `,
+ {},
+ 'move',
+ 1,
+ 2
+ )
+ expect(value).toBe(3)
+ expect(frames).toBeArrayOfSize(1)
+ })
+
+ test('with complex arguments', () => {
+ const { value, frames } = evaluateFunction(
+ `
+ function move with car, speeds do
+ return car["x"] + speeds[1]
+ end
+ `,
+ {},
+ 'move',
+ { x: 2 },
+ [4, 5, 6]
+ )
+ expect(value).toBe(7)
+ expect(frames).toBeArrayOfSize(1)
+ })
+
+ test('idempotent', () => {
+ const code = `
+ set x to 1
+ function move do
+ change x to x + 1
+ return x
+ end`
+ const interpreter = new Interpreter(code, { language: 'JikiScript' })
+ interpreter.compile()
+ const { value: value1 } = interpreter.evaluateFunction('move')
+ const { value: value2 } = interpreter.evaluateFunction('move')
+ expect(value1).toBe(2)
+ expect(value2).toBe(2)
+ })
+
+ // TODO: Work out all this syntax
+ test.skip('full program', () => {
+ const code = `
+ function chooseEnemy with enemies do
+ set maxRight to 0
+ set rightmostEnemyId to null
+
+ foreach enemy of enemies do
+ if enemy["coords"][0] > maxRight do
+ set maxRight to enemy["coords"][0]
+ set rightmostEnemyId to enemy["id"]
+ end
+ end
+
+ return rightmostEnemyId
+ end
+ `
+
+ const poses = [
+ { id: 1, coords: [2, 4] },
+ { id: 2, coords: [3, 1] },
+ ]
+ const { value, frames } = evaluateFunction(code, {}, 'chooseEnemy', poses)
+ expect(value).toBe(2)
+ expect(frames).toBeArrayOfSize(11)
+ })
+
+ test('twoFer', () => {
+ const code = `
+ function twoFer with name do
+ if(name is "") do
+ return "One for you, one for me."
+ else do
+ return "One for " + name + ", one for me."
+ end
+ end
+ `
+
+ const { value } = evaluateFunction(code, {}, 'twoFer', 'Alice')
+ expect(value).toEqual('One for Alice, one for me.')
+ })
+})
+
+describe('errors', () => {
+ test('scanner', () => {
+ const { frames, error } = interpret('let 123#')
+ expect(frames).toBeEmpty()
+ expect(error).not.toBeNull()
+ expect(error!.category).toBe('SyntaxError')
+ expect(error!.type).toBe('UnknownCharacter')
+ expect(error!.context?.character).toBe('#')
+ })
+
+ test('parser', () => {
+ const { frames, error } = interpret('"abc')
+ expect(frames).toBeEmpty()
+ expect(error).not.toBeNull()
+ expect(error!.category).toBe('SyntaxError')
+ expect(error!.type).toBe('MissingDoubleQuoteToTerminateString')
+ expect(error!.context).toBeNull
+ })
+
+ test('resolver', () => {
+ const { frames, error } = interpret('return 1')
+ expect(frames).toBeEmpty()
+ expect(error).not.toBeNull()
+ expect(error!.category).toBe('SemanticError')
+ expect(error!.type).toBe('TopLevelReturn')
+ expect(error!.context).toBeNull
+ })
+
+ describe('runtime', () => {
+ describe('evaluateFunction', () => {
+ test('first frame', () => {
+ const { value, frames, error } = evaluateFunction(
+ `
+ function move do
+ foo()
+ end
+ `,
+ {},
+ 'move'
+ )
+ expect(value).toBeUndefined()
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(3)
+ expect(frames[0].status).toBe('ERROR')
+ expect(frames[0].code).toBe('foo()')
+ expect(frames[0].error).not.toBeNull()
+ expect(frames[0].error!.category).toBe('RuntimeError')
+ expect(frames[0].error!.type).toBe('CouldNotFindFunctionWithName')
+ expect(error).toBeNull()
+ })
+
+ test('later frame', () => {
+ const code = `
+ function move do
+ set x to 1
+ set y to 2
+ foo()
+ end
+ `
+ const { value, frames, error } = evaluateFunction(code, {}, 'move')
+
+ expect(value).toBeUndefined()
+ expect(frames).toBeArrayOfSize(3)
+ expect(frames[2].line).toBe(5)
+ expect(frames[2].status).toBe('ERROR')
+ expect(frames[2].code).toBe('foo()')
+ expect(frames[2].error).not.toBeNull()
+ expect(frames[2].error!.category).toBe('RuntimeError')
+ expect(frames[2].error!.type).toBe('CouldNotFindFunctionWithName')
+ expect(error).toBeNull()
+ })
+ })
+ })
+
+ describe('interpret', () => {
+ describe('call', () => {
+ test('non-callable', () => {
+ const { frames, error } = interpret('1()')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(1)
+ expect(frames[0].status).toBe('ERROR')
+ expect(frames[0].code).toBe('1()')
+ expect(frames[0].error).not.toBeNull()
+ expect(frames[0].error!.category).toBe('RuntimeError')
+ expect(frames[0].error!.type).toBe('NonCallableTarget')
+ expect(error).toBeNull()
+ })
+
+ describe('arity', () => {
+ describe('no optional parameters', () => {
+ test('too many arguments', () => {
+ const context = {
+ externalFunctions: [
+ {
+ name: 'echo',
+ func: (_: any) => {},
+ description: '',
+ },
+ ],
+ }
+ const { frames, error } = interpret('echo(1, 2)', context)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(1)
+ expect(frames[0].status).toBe('ERROR')
+ expect(frames[0].code).toBe('echo(1, 2)')
+ expect(frames[0].error).not.toBeNull()
+ expect(frames[0].error!.category).toBe('RuntimeError')
+ expect(frames[0].error!.type).toBe('InvalidNumberOfArguments')
+ expect(error).toBeNull()
+ })
+
+ test('too few arguments', () => {
+ const context = {
+ externalFunctions: [
+ {
+ name: 'echo',
+ func: (_int: any, _: any) => {},
+ description: '',
+ },
+ ],
+ }
+ const { frames, error } = interpret('echo()', context)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(1)
+ expect(frames[0].status).toBe('ERROR')
+ expect(frames[0].code).toBe('echo()')
+ expect(frames[0].error).not.toBeNull()
+ expect(frames[0].error!.category).toBe('RuntimeError')
+ expect(frames[0].error!.type).toBe('InvalidNumberOfArguments')
+ expect(error).toBeNull()
+ })
+ })
+ })
+
+ describe('unknown function', () => {
+ test('not misspelled', () => {
+ const { frames, error } = interpret('foo()')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(1)
+ expect(frames[0].status).toBe('ERROR')
+ expect(frames[0].code).toBe('foo()')
+ expect(frames[0].error).not.toBeNull()
+ expect(frames[0].error!.category).toBe('RuntimeError')
+ expect(frames[0].error!.type).toBe('CouldNotFindFunctionWithName')
+ expect(error).toBeNull()
+ })
+
+ test('misspelled', () => {
+ const { frames, error } = interpret(`
+ function foobar do
+ return 1
+ end
+
+ foobor()
+ `)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(6)
+ expect(frames[0].status).toBe('ERROR')
+ expect(frames[0].code).toBe('foobor()')
+ expect(frames[0].error).not.toBeNull()
+ expect(frames[0].error!.message).toBe(
+ "We don't know what `foobor` means. Maybe you meant to use the `foobar` function instead?"
+ )
+ expect(frames[0].error!.category).toBe('RuntimeError')
+ expect(frames[0].error!.type).toBe(
+ 'CouldNotFindFunctionWithNameSuggestion'
+ )
+ expect(error).toBeNull()
+ })
+ })
+
+ test('missing parentheses', () => {
+ const { frames, error } = interpret(`
+ function foo do
+ return 1
+ end
+
+ foo
+ `)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(6)
+ expect(frames[0].status).toBe('ERROR')
+ expect(frames[0].code).toBe('foo')
+ expect(frames[0].error).not.toBeNull()
+ expect(frames[0].error!.message).toBe(
+ 'Did you forget the parenthesis when trying to call the function?'
+ )
+ expect(frames[0].error!.category).toBe('RuntimeError')
+ expect(frames[0].error!.type).toBe('MissingParenthesesForFunctionCall')
+ expect(error).toBeNull()
+ })
+
+ test('after success', () => {
+ const { frames, error } = interpret(`
+ 123
+ foo()
+ `)
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[0].line).toBe(2)
+ expect(frames[0].status).toBe('SUCCESS')
+ expect(frames[0].code).toBe('123')
+ expect(frames[0].error).toBeNil()
+ expect(frames[1].line).toBe(3)
+ expect(frames[1].status).toBe('ERROR')
+ expect(frames[1].code).toBe('foo()')
+ expect(frames[1].error).not.toBeNull()
+ expect(frames[1].error!.category).toBe('RuntimeError')
+ expect(frames[1].error!.type).toBe('CouldNotFindFunctionWithName')
+ expect(error).toBeNull()
+ })
+
+ test('stop execution after error', () => {
+ const { frames, error } = interpret(`
+ foo()
+ 123
+ `)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].line).toBe(2)
+ expect(frames[0].status).toBe('ERROR')
+ expect(frames[0].code).toBe('foo()')
+ expect(frames[0].error).not.toBeNull()
+ expect(frames[0].error!.category).toBe('RuntimeError')
+ expect(frames[0].error!.type).toBe('CouldNotFindFunctionWithName')
+ expect(error).toBeNull()
+ })
+ })
+ })
+
+ describe('suggestions', () => {
+ test('function name differs by one letter', () => {
+ const code = `
+ function move do
+ m0ve()
+ end
+ `
+ const { frames, error } = evaluateFunction(code, {}, 'move')
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].error).not.toBeNull()
+ expect(frames[0].error!.context).toMatchObject({
+ didYouMean: {
+ function: 'move',
+ variable: null,
+ },
+ })
+ })
+
+ test('variable name differs by one letter', () => {
+ const code = 'set size to 23'
+ const { frames } = evaluateFunction(code, {}, 'saize + 2')
+
+ expect(frames).toBeArrayOfSize(2)
+ expect(frames[1].error).not.toBeNull()
+ expect(frames[1].error!.context).toMatchObject({
+ didYouMean: {
+ function: null,
+ variable: 'size',
+ },
+ })
+ })
+ })
+})
+
+describe('context', () => {
+ describe('wrap top-level statements', () => {
+ // TODO: This test doesn't make a huge amount of sense to me.
+ test.skip('wrap non-function statements', () => {
+ const code = `
+ function move with x, y do
+ return x + y
+ end
+
+ set x to 1
+ set y to 2
+ move(x, y)
+ `
+ const { frames } = evaluateFunction(
+ code,
+ { wrapTopLevelStatements: true },
+ 'main'
+ )
+ expect(frames).toBeArrayOfSize(4)
+ expect(frames[3].result?.value.value).toBe(3)
+ })
+
+ test("don't wrap function declarations", () => {
+ const { value, frames } = evaluateFunction(
+ `
+ function move do
+ return 1
+ end
+ `,
+ {},
+ 'move'
+ )
+ expect(value).toBe(1)
+ expect(frames).toBeArrayOfSize(1)
+ expect(frames[0].result?.value.value).toBe(1)
+ })
+ })
+})
diff --git a/test/javascript/interpreter/languages/jikiscript/parser.test.ts b/test/javascript/interpreter/languages/jikiscript/parser.test.ts
new file mode 100644
index 0000000000..794f52e84a
--- /dev/null
+++ b/test/javascript/interpreter/languages/jikiscript/parser.test.ts
@@ -0,0 +1,1065 @@
+import {
+ ArrayExpression,
+ BinaryExpression,
+ CallExpression,
+ GroupingExpression,
+ LiteralExpression,
+ DictionaryExpression,
+ VariableExpression,
+ GetExpression,
+ SetExpression,
+ UnaryExpression,
+ TemplateLiteralExpression,
+ TemplatePlaceholderExpression,
+ TemplateTextExpression,
+ LogicalExpression,
+} from '@/interpreter/expression'
+import {
+ BlockStatement,
+ ExpressionStatement,
+ ForeachStatement,
+ FunctionStatement,
+ IfStatement,
+ RepeatStatement,
+ ReturnStatement,
+ VariableStatement,
+ WhileStatement,
+} from '@/interpreter/statement'
+import { parse } from '@/interpreter/languages/jikiscript/parser'
+
+describe('comments', () => {
+ test('basic text', () => {
+ const stmts = parse('// this is a comment')
+ expect(stmts).toBeArrayOfSize(0)
+ })
+ test('text with symbols', () => {
+ const stmts = parse('// this (is) a. comme,nt do')
+ expect(stmts).toBeArrayOfSize(0)
+ })
+ test('comment after statement', () => {
+ const stmts = parse('set a to 5 // this (is) a. comme,nt do')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ const varStmt = stmts[0] as VariableStatement
+ expect(varStmt.name.lexeme).toBe('a')
+ expect(varStmt.initializer).toBeInstanceOf(LiteralExpression)
+ expect((varStmt.initializer as LiteralExpression).value).toBe(5)
+ })
+ test('text with symbols', () => {
+ const stmts = parse(`
+ // You can use move(), turn_left() and turn_right()
+ // Use the functions in the order you want your character
+ // to use them to solve them maze. We'll start you off by
+ // moving the character one step forward.
+ move()
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ })
+})
+describe('literals', () => {
+ describe('numbers', () => {
+ test('integer', () => {
+ const stmts = parse('1')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(LiteralExpression)
+ const literalExpr = exprStmt.expression as LiteralExpression
+ expect(literalExpr.value).toBe(1)
+ })
+ test('floating points', () => {
+ const stmts = parse('1.5')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(LiteralExpression)
+ const literalExpr = exprStmt.expression as LiteralExpression
+ expect(literalExpr.value).toBe(1.5)
+ })
+
+ test('negative integer', () => {
+ const stmts = parse('-5')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(UnaryExpression)
+ const literalExpr = exprStmt.expression as UnaryExpression
+ expect(literalExpr.operator.lexeme).toBe('-')
+ expect((literalExpr.operand as LiteralExpression).value).toBe(5)
+ })
+ test('negative floating point', () => {
+ const stmts = parse('-1.5')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(UnaryExpression)
+ const literalExpr = exprStmt.expression as UnaryExpression
+ expect(literalExpr.operator.lexeme).toBe('-')
+ expect((literalExpr.operand as LiteralExpression).value).toBe(1.5)
+ })
+ })
+
+ test('string', () => {
+ const stmts = parse('"nice"')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(LiteralExpression)
+ const literalExpr = exprStmt.expression as LiteralExpression
+ expect(literalExpr.value).toBe('nice')
+ })
+
+ test('true', () => {
+ const stmts = parse('true')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(LiteralExpression)
+ const literalExpr = exprStmt.expression as LiteralExpression
+ expect(literalExpr.value).toBe(true)
+ })
+
+ test('false', () => {
+ const stmts = parse('false')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(LiteralExpression)
+ const literalExpr = exprStmt.expression as LiteralExpression
+ expect(literalExpr.value).toBe(false)
+ })
+
+ test('null', () => {
+ const stmts = parse('null')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(LiteralExpression)
+ const literalExpr = exprStmt.expression as LiteralExpression
+ expect(literalExpr.value).toBeNull()
+ })
+})
+
+describe('array', () => {
+ test('empty', () => {
+ const stmts = parse('[]')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(ArrayExpression)
+ const arrayExpr = exprStmt.expression as ArrayExpression
+ expect(arrayExpr.elements).toBeEmpty()
+ })
+
+ test('single element', () => {
+ const stmts = parse('[1]')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(ArrayExpression)
+ const arrayExpr = exprStmt.expression as ArrayExpression
+ expect(arrayExpr.elements).toBeArrayOfSize(1)
+ expect(arrayExpr.elements[0]).toBeInstanceOf(LiteralExpression)
+ const firstElemExpr = arrayExpr.elements[0] as LiteralExpression
+ expect(firstElemExpr.value).toBe(1)
+ })
+
+ test('multiple elements', () => {
+ const stmts = parse('[1,2,3]')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(ArrayExpression)
+ const arrayExpr = exprStmt.expression as ArrayExpression
+ expect(arrayExpr.elements).toBeArrayOfSize(3)
+ expect(arrayExpr.elements[0]).toBeInstanceOf(LiteralExpression)
+ expect(arrayExpr.elements[1]).toBeInstanceOf(LiteralExpression)
+ expect(arrayExpr.elements[2]).toBeInstanceOf(LiteralExpression)
+ expect((arrayExpr.elements[0] as LiteralExpression).value).toBe(1)
+ expect((arrayExpr.elements[1] as LiteralExpression).value).toBe(2)
+ expect((arrayExpr.elements[2] as LiteralExpression).value).toBe(3)
+ })
+
+ test('nested', () => {
+ const stmts = parse('[1,[2,[3]]]')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(ArrayExpression)
+ const arrayExpr = exprStmt.expression as ArrayExpression
+ expect(arrayExpr.elements).toBeArrayOfSize(2)
+ expect(arrayExpr.elements[0]).toBeInstanceOf(LiteralExpression)
+ expect((arrayExpr.elements[0] as LiteralExpression).value).toBe(1)
+ expect(arrayExpr.elements[1]).toBeInstanceOf(ArrayExpression)
+ const nestedExpr = arrayExpr.elements[1] as ArrayExpression
+ expect(nestedExpr.elements).toBeArrayOfSize(2)
+ expect(nestedExpr.elements[0]).toBeInstanceOf(LiteralExpression)
+ expect((nestedExpr.elements[0] as LiteralExpression).value).toBe(2)
+ expect(nestedExpr.elements[0]).toBeInstanceOf(LiteralExpression)
+ const nestedNestedExpr = nestedExpr.elements[1] as ArrayExpression
+ expect(nestedNestedExpr.elements).toBeArrayOfSize(1)
+ expect(nestedNestedExpr.elements[0]).toBeInstanceOf(LiteralExpression)
+ expect((nestedNestedExpr.elements[0] as LiteralExpression).value).toBe(3)
+ })
+
+ test('expressions', () => {
+ const stmts = parse('[-1,2*2,3+3]')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(ArrayExpression)
+ const arrayExpr = exprStmt.expression as ArrayExpression
+ expect(arrayExpr.elements).toBeArrayOfSize(3)
+ expect(arrayExpr.elements[0]).toBeInstanceOf(UnaryExpression)
+ expect(arrayExpr.elements[1]).toBeInstanceOf(BinaryExpression)
+ expect(arrayExpr.elements[2]).toBeInstanceOf(BinaryExpression)
+ })
+})
+
+describe('dictionary', () => {
+ test('empty', () => {
+ const stmts = parse('set empty to {}')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ const varStmt = stmts[0] as VariableStatement
+ expect(varStmt.initializer).toBeInstanceOf(DictionaryExpression)
+ const mapExpr = varStmt.initializer as DictionaryExpression
+ expect(mapExpr.elements).toBeEmpty()
+ })
+
+ test('single element', () => {
+ const stmts = parse('set movie to {"title": "Jurassic Park"}')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ const varStmt = stmts[0] as VariableStatement
+ expect(varStmt.initializer).toBeInstanceOf(DictionaryExpression)
+ const mapExpr = varStmt.initializer as DictionaryExpression
+ expect(mapExpr.elements.size).toBe(1)
+ expect(mapExpr.elements.get('title')).toBeInstanceOf(LiteralExpression)
+ expect((mapExpr.elements.get('title') as LiteralExpression).value).toBe(
+ 'Jurassic Park'
+ )
+ })
+
+ test('multiple elements', () => {
+ const stmts = parse('set movie to {"title": "Jurassic Park", "year": 1993}')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ const varStmt = stmts[0] as VariableStatement
+ expect(varStmt.initializer).toBeInstanceOf(DictionaryExpression)
+ const mapExpr = varStmt.initializer as DictionaryExpression
+ expect(mapExpr.elements.size).toBe(2)
+ expect(mapExpr.elements.get('title')).toBeInstanceOf(LiteralExpression)
+ expect((mapExpr.elements.get('title') as LiteralExpression).value).toBe(
+ 'Jurassic Park'
+ )
+ expect(mapExpr.elements.get('year')).toBeInstanceOf(LiteralExpression)
+ expect((mapExpr.elements.get('year') as LiteralExpression).value).toBe(1993)
+ })
+
+ test('nested', () => {
+ const stmts = parse(
+ 'set movie to {"title": "Jurassic Park", "director": { "name": "Steven Spielberg" } }'
+ )
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ const varStmt = stmts[0] as VariableStatement
+ expect(varStmt.initializer).toBeInstanceOf(DictionaryExpression)
+ const mapExpr = varStmt.initializer as DictionaryExpression
+ expect(mapExpr.elements.size).toBe(2)
+ expect(mapExpr.elements.get('title')).toBeInstanceOf(LiteralExpression)
+ expect((mapExpr.elements.get('title') as LiteralExpression).value).toBe(
+ 'Jurassic Park'
+ )
+ expect(mapExpr.elements.get('director')).toBeInstanceOf(
+ DictionaryExpression
+ )
+ const nestedMapExpr = mapExpr.elements.get(
+ 'director'
+ ) as DictionaryExpression
+ expect(nestedMapExpr.elements.size).toBe(1)
+ expect(nestedMapExpr.elements.get('name')).toBeInstanceOf(LiteralExpression)
+ expect(
+ (nestedMapExpr.elements.get('name') as LiteralExpression).value
+ ).toBe('Steven Spielberg')
+ })
+})
+
+describe('variable', () => {
+ test('single-character name', () => {
+ const statements = parse('set x to 1')
+ expect(statements).toBeArrayOfSize(1)
+ expect(statements[0]).toBeInstanceOf(VariableStatement)
+ const varStatement = statements[0] as VariableStatement
+ expect(varStatement.name.lexeme).toBe('x')
+ const literalExpr = varStatement.initializer as LiteralExpression
+ expect(literalExpr.value).toBe(1)
+ })
+
+ test('multi-character name', () => {
+ const statements = parse('set fooBar to "abc"')
+ expect(statements).toBeArrayOfSize(1)
+ expect(statements[0]).toBeInstanceOf(VariableStatement)
+ const varStatement = statements[0] as VariableStatement
+ expect(varStatement.name.lexeme).toBe('fooBar')
+ const literalExpr = varStatement.initializer as LiteralExpression
+ expect(literalExpr.value).toBe('abc')
+ })
+})
+
+describe('assignment', () => {
+ test('reassignment', () => {
+ const statements = parse(`
+ set x to 1
+ set x to 2
+ `)
+ expect(statements).toBeArrayOfSize(2)
+ expect(statements[1]).toBeInstanceOf(VariableStatement)
+ const varStatement = statements[1] as VariableStatement
+ expect(varStatement.name.lexeme).toBe('x')
+ const literalExpr = varStatement.initializer as LiteralExpression
+ expect(literalExpr.value).toBe(2)
+ })
+})
+
+describe('call', () => {
+ test('without arguments', () => {
+ const stmts = parse('move()')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const expStmt = stmts[0] as ExpressionStatement
+ expect(expStmt.expression).toBeInstanceOf(CallExpression)
+ const callExpr = expStmt.expression as CallExpression
+ expect(callExpr.args).toBeEmpty()
+ })
+
+ test('single argument', () => {
+ const stmts = parse('turn("left")')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(CallExpression)
+ const callExpr = exprStmt.expression as CallExpression
+ expect(callExpr.args).toBeArrayOfSize(1)
+ expect(callExpr.args[0]).toBeInstanceOf(LiteralExpression)
+ })
+
+ test('chained', () => {
+ const stmts = parse('turn("left")("right")')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(CallExpression)
+ const callExpr = exprStmt.expression as CallExpression
+ expect(callExpr.args).toBeArrayOfSize(1)
+ expect(callExpr.args[0]).toBeInstanceOf(LiteralExpression)
+ expect(callExpr.callee).toBeInstanceOf(CallExpression)
+ const nestedCallExpr = callExpr.callee as CallExpression
+ expect(nestedCallExpr.args).toBeArrayOfSize(1)
+ expect(nestedCallExpr.args[0]).toBeInstanceOf(LiteralExpression)
+ })
+})
+
+describe('get', () => {
+ describe('dictionary', () => {
+ test('single field', () => {
+ const stmts = parse(`
+ set movie to {"title": "The Matrix"}
+ set title to movie["title"]
+ `)
+ expect(stmts).toBeArrayOfSize(2)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ expect(stmts[1]).toBeInstanceOf(VariableStatement)
+ const varStmtWithGet = stmts[1] as VariableStatement
+ expect(varStmtWithGet.initializer).toBeInstanceOf(GetExpression)
+ const getExpr = varStmtWithGet.initializer as GetExpression
+ expect(getExpr.field.literal).toBe('title')
+ expect(getExpr.obj).toBeInstanceOf(VariableExpression)
+ expect((getExpr.obj as VariableExpression).name.lexeme).toBe('movie')
+ })
+
+ test('chained', () => {
+ const stmts = parse(`
+ set movie to {"director": {"name": "Peter Jackson"}}
+ set director to movie["director"]["name"]
+ `)
+ expect(stmts).toBeArrayOfSize(2)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ expect(stmts[1]).toBeInstanceOf(VariableStatement)
+ const varStmtWithGet = stmts[1] as VariableStatement
+ expect(varStmtWithGet.initializer).toBeInstanceOf(GetExpression)
+ const getExpr = varStmtWithGet.initializer as GetExpression
+ expect(getExpr.field.literal).toBe('name')
+ expect(getExpr.obj).toBeInstanceOf(GetExpression)
+ const nestedGetExpr = getExpr.obj as GetExpression
+ expect(nestedGetExpr.field.literal).toBe('director')
+ expect(nestedGetExpr.obj).toBeInstanceOf(VariableExpression)
+ expect((nestedGetExpr.obj as VariableExpression).name.lexeme).toBe(
+ 'movie'
+ )
+ })
+ })
+
+ describe('array', () => {
+ test('single field', () => {
+ const stmts = parse(`
+ set scores to [7, 3, 10]
+ set latest to scores[2]
+ `)
+ expect(stmts).toBeArrayOfSize(2)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ expect(stmts[1]).toBeInstanceOf(VariableStatement)
+ const varStmtWithGet = stmts[1] as VariableStatement
+ expect(varStmtWithGet.initializer).toBeInstanceOf(GetExpression)
+ const getExpr = varStmtWithGet.initializer as GetExpression
+ expect(getExpr.field.literal).toBe(2)
+ expect(getExpr.obj).toBeInstanceOf(VariableExpression)
+ expect((getExpr.obj as VariableExpression).name.lexeme).toBe('scores')
+ })
+
+ test('chained', () => {
+ const stmts = parse(`
+ set scoreMinMax to [[3, 7], [1, 6]]
+ set secondMin to scoreMinMax[1][0]
+ `)
+ expect(stmts).toBeArrayOfSize(2)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ expect(stmts[1]).toBeInstanceOf(VariableStatement)
+ const varStmtWithGet = stmts[1] as VariableStatement
+ expect(varStmtWithGet.initializer).toBeInstanceOf(GetExpression)
+ const getExpr = varStmtWithGet.initializer as GetExpression
+ expect(getExpr.field.literal).toBe(0)
+ expect(getExpr.obj).toBeInstanceOf(GetExpression)
+ const nestedGetExpr = getExpr.obj as GetExpression
+ expect(nestedGetExpr.field.literal).toBe(1)
+ expect(nestedGetExpr.obj).toBeInstanceOf(VariableExpression)
+ expect((nestedGetExpr.obj as VariableExpression).name.lexeme).toBe(
+ 'scoreMinMax'
+ )
+ })
+ })
+})
+
+describe('set', () => {
+ describe('dictionary', () => {
+ test('single field', () => {
+ const stmts = parse(`
+ set movie to {"title": "The Matrix"}
+ set movie["title"] to "Gladiator"
+ `)
+ expect(stmts).toBeArrayOfSize(2)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ expect(stmts[1]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[1] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(SetExpression)
+ const setExpr = exprStmt.expression as SetExpression
+ expect(setExpr.field.literal).toBe('title')
+ expect(setExpr.obj).toBeInstanceOf(VariableExpression)
+ expect((setExpr.obj as VariableExpression).name.lexeme).toBe('movie')
+ })
+
+ test('chained', () => {
+ const stmts = parse(`
+ set movie to {"director": {"name": "Peter Jackson"}}
+ set movie["director"]["name"] to "James Cameron"
+ `)
+ expect(stmts).toBeArrayOfSize(2)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ expect(stmts[1]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[1] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(SetExpression)
+ const setExpr = exprStmt.expression as SetExpression
+ expect(setExpr.value).toBeInstanceOf(LiteralExpression)
+ expect((setExpr.value as LiteralExpression).value).toBe('James Cameron')
+ expect(setExpr.field.literal).toBe('name')
+ expect(setExpr.obj).toBeInstanceOf(GetExpression)
+ const getExpr = setExpr.obj as GetExpression
+ expect(getExpr.obj).toBeInstanceOf(VariableExpression)
+ expect((getExpr.obj as VariableExpression).name.lexeme).toBe('movie')
+ expect(getExpr.field.literal).toBe('director')
+ })
+ })
+
+ // TODO: add set on arrays
+})
+
+describe('template literal', () => {
+ test('empty', () => {
+ const stmts = parse('``')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(TemplateLiteralExpression)
+ const templateExpr = exprStmt.expression as TemplateLiteralExpression
+ expect(templateExpr.parts).toBeEmpty()
+ })
+
+ test('no placeholders', () => {
+ const stmts = parse('`hello there`')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(TemplateLiteralExpression)
+ const templateExpr = exprStmt.expression as TemplateLiteralExpression
+ expect(templateExpr.parts).toBeArrayOfSize(1)
+ expect(templateExpr.parts[0]).toBeInstanceOf(TemplateTextExpression)
+ const textExpr = templateExpr.parts[0] as TemplateTextExpression
+ expect(textExpr.text.literal).toBe('hello there')
+ })
+
+ test('placeholders', () => {
+ const stmts = parse('`sum of ${2} + ${1+3*5} = ${2+(1+4*5)}`')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(TemplateLiteralExpression)
+ const templateExpr = exprStmt.expression as TemplateLiteralExpression
+ expect(templateExpr.parts).toBeArrayOfSize(6)
+ expect(templateExpr.parts[0]).toBeInstanceOf(TemplateTextExpression)
+ expect(templateExpr.parts[1]).toBeInstanceOf(TemplatePlaceholderExpression)
+ expect(templateExpr.parts[2]).toBeInstanceOf(TemplateTextExpression)
+ expect(templateExpr.parts[3]).toBeInstanceOf(TemplatePlaceholderExpression)
+ expect(templateExpr.parts[4]).toBeInstanceOf(TemplateTextExpression)
+ expect(templateExpr.parts[5]).toBeInstanceOf(TemplatePlaceholderExpression)
+ const part0Expr = templateExpr.parts[0] as TemplateTextExpression
+ expect(part0Expr.text.lexeme).toBe('sum of ')
+ const part1Expr = templateExpr.parts[1] as TemplatePlaceholderExpression
+ expect(part1Expr.inner).toBeInstanceOf(LiteralExpression)
+ const part2Expr = templateExpr.parts[2] as TemplateTextExpression
+ expect(part2Expr.text.lexeme).toBe(' + ')
+ const part3Expr = templateExpr.parts[3] as TemplatePlaceholderExpression
+ expect(part3Expr.inner).toBeInstanceOf(BinaryExpression)
+ const part4Expr = templateExpr.parts[4] as TemplateTextExpression
+ expect(part4Expr.text.lexeme).toBe(' = ')
+ const part5Expr = templateExpr.parts[5] as TemplatePlaceholderExpression
+ expect(part5Expr.inner).toBeInstanceOf(BinaryExpression)
+ })
+})
+
+describe('grouping', () => {
+ test('non-nested', () => {
+ const stmts = parse('(1 + 2)')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(GroupingExpression)
+ const groupingExpr = exprStmt.expression as GroupingExpression
+ expect(groupingExpr.inner).toBeInstanceOf(BinaryExpression)
+ const binaryExpr = groupingExpr.inner as BinaryExpression
+ expect(binaryExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.right).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.operator.type).toBe('PLUS')
+ })
+
+ test('nested', () => {
+ const stmts = parse('(1 + (2 - 3))')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(GroupingExpression)
+ const groupingExpr = exprStmt.expression as GroupingExpression
+ expect(groupingExpr.inner).toBeInstanceOf(BinaryExpression)
+ const binaryExpr = groupingExpr.inner as BinaryExpression
+ expect(binaryExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.right).toBeInstanceOf(GroupingExpression)
+ expect(binaryExpr.operator.type).toBe('PLUS')
+ const nestedGroupingExpr = binaryExpr.right as GroupingExpression
+ expect(nestedGroupingExpr.inner).toBeInstanceOf(BinaryExpression)
+ const nestedBinaryExpr = nestedGroupingExpr.inner as BinaryExpression
+ expect(nestedBinaryExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(nestedBinaryExpr.right).toBeInstanceOf(LiteralExpression)
+ expect(nestedBinaryExpr.operator.type).toBe('MINUS')
+ })
+})
+
+describe('binary', () => {
+ test('addition', () => {
+ const stmts = parse('1 + 2')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(BinaryExpression)
+ const binaryExpr = exprStmt.expression as BinaryExpression
+ expect(binaryExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.right).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.operator.type).toBe('PLUS')
+ })
+
+ test('subtraction', () => {
+ const stmts = parse('1 - 2')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(BinaryExpression)
+ const binaryExpr = exprStmt.expression as BinaryExpression
+ expect(binaryExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.right).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.operator.type).toBe('MINUS')
+ })
+
+ test('multiplication', () => {
+ const stmts = parse('1 * 2')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(BinaryExpression)
+ const binaryExpr = exprStmt.expression as BinaryExpression
+ expect(binaryExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.right).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.operator.type).toBe('STAR')
+ })
+
+ test('division', () => {
+ const stmts = parse('1 / 2')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(BinaryExpression)
+ const binaryExpr = exprStmt.expression as BinaryExpression
+ expect(binaryExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.right).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.operator.type).toBe('SLASH')
+ })
+
+ test('string concatenation', () => {
+ const stmts = parse('"hello" + "world"')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(BinaryExpression)
+ const binaryExpr = exprStmt.expression as BinaryExpression
+ expect(binaryExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.right).toBeInstanceOf(LiteralExpression)
+ expect(binaryExpr.operator.type).toBe('PLUS')
+ })
+
+ describe('nesting', () => {
+ test('numbers', () => {
+ const stmts = parse('1 + 2 * 3 / 4 - 5')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(BinaryExpression)
+
+ const binaryExpr = exprStmt.expression as BinaryExpression
+ expect(binaryExpr.operator.type).toBe('MINUS')
+ expect(binaryExpr.left).toBeInstanceOf(BinaryExpression)
+ expect(binaryExpr.right).toBeInstanceOf(LiteralExpression)
+
+ const binaryExprRight = binaryExpr.right as LiteralExpression
+ expect(binaryExprRight.value).toBe(5)
+
+ const binaryExprLeft = binaryExpr.left as BinaryExpression
+ expect(binaryExprLeft.operator.type).toBe('PLUS')
+ expect(binaryExprLeft.left).toBeInstanceOf(LiteralExpression)
+ expect(binaryExprLeft.right).toBeInstanceOf(BinaryExpression)
+
+ const binaryExprLeftLeft = binaryExprLeft.left as LiteralExpression
+ expect(binaryExprLeftLeft.value).toBe(1)
+
+ const binaryExprLeftRight = binaryExprLeft.right as BinaryExpression
+ expect(binaryExprLeftRight.operator.type).toBe('SLASH')
+ expect(binaryExprLeftRight.left).toBeInstanceOf(BinaryExpression)
+ expect(binaryExprLeftRight.right).toBeInstanceOf(LiteralExpression)
+
+ const binaryExprLeftRightRight =
+ binaryExprLeftRight.right as LiteralExpression
+ expect(binaryExprLeftRightRight.value).toBe(4)
+
+ const binaryExprLeftRightLeft =
+ binaryExprLeftRight.left as BinaryExpression
+ expect(binaryExprLeftRightLeft.operator.type).toBe('STAR')
+ expect(binaryExprLeftRightLeft.left).toBeInstanceOf(LiteralExpression)
+ expect(binaryExprLeftRightLeft.right).toBeInstanceOf(LiteralExpression)
+ const binaryExprLeftRightLeftLeft =
+ binaryExprLeftRightLeft.left as LiteralExpression
+ expect(binaryExprLeftRightLeftLeft.value).toBe(2)
+ const binaryExprLeftRightLeftRight =
+ binaryExprLeftRightLeft.right as LiteralExpression
+ expect(binaryExprLeftRightLeftRight.value).toBe(3)
+ })
+
+ test('string concatenation', () => {
+ const stmts = parse('"hello" + "world" + "!"')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(BinaryExpression)
+ const binaryExpr = exprStmt.expression as BinaryExpression
+ expect(binaryExpr.operator.type).toBe('PLUS')
+ expect(binaryExpr.left).toBeInstanceOf(BinaryExpression)
+ expect(binaryExpr.right).toBeInstanceOf(LiteralExpression)
+
+ const binaryExprRight = binaryExpr.right as LiteralExpression
+ expect(binaryExprRight.value).toBe('!')
+
+ const binaryExprLeft = binaryExpr.left as BinaryExpression
+ expect(binaryExprLeft.left).toBeInstanceOf(LiteralExpression)
+ expect(binaryExprLeft.right).toBeInstanceOf(LiteralExpression)
+
+ const binaryExprLeftLeft = binaryExprLeft.left as LiteralExpression
+ expect(binaryExprLeftLeft.value).toBe('hello')
+
+ const binaryExprLeftRight = binaryExprLeft.right as LiteralExpression
+ expect(binaryExprLeftRight.value).toBe('world')
+ })
+ })
+})
+
+describe('logical', () => {
+ test('and', () => {
+ const stmts = parse('true and false')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(LogicalExpression)
+ const logicalExpr = exprStmt.expression as LogicalExpression
+ expect(logicalExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(logicalExpr.right).toBeInstanceOf(LiteralExpression)
+ expect(logicalExpr.operator.type).toBe('AND')
+ })
+
+ test('or', () => {
+ const stmts = parse('true or false')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ExpressionStatement)
+ const exprStmt = stmts[0] as ExpressionStatement
+ expect(exprStmt.expression).toBeInstanceOf(LogicalExpression)
+ const logicalExpr = exprStmt.expression as LogicalExpression
+ expect(logicalExpr.left).toBeInstanceOf(LiteralExpression)
+ expect(logicalExpr.right).toBeInstanceOf(LiteralExpression)
+ expect(logicalExpr.operator.type).toBe('OR')
+ })
+})
+
+describe('if', () => {
+ test('without else', () => {
+ const stmts = parse(`
+ if something is true do
+ set x to 1
+ end
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(IfStatement)
+ const expStmt = stmts[0] as IfStatement
+ expect(expStmt.condition).toBeInstanceOf(BinaryExpression)
+ expect(expStmt.thenBranch).toBeInstanceOf(BlockStatement)
+ const thenStmt = expStmt.thenBranch as BlockStatement
+ expect(thenStmt.statements).toBeArrayOfSize(1)
+ expect(thenStmt.statements[0]).toBeInstanceOf(VariableStatement)
+ expect(expStmt.elseBranch).toBeNil()
+ })
+
+ test('with else', () => {
+ const stmts = parse(`
+ if something is true do
+ set x to 1
+ else do
+ set x to 2
+ end
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(IfStatement)
+ const expStmt = stmts[0] as IfStatement
+ expect(expStmt.condition).toBeInstanceOf(BinaryExpression)
+ expect(expStmt.thenBranch).toBeInstanceOf(BlockStatement)
+ const thenStmt = expStmt.thenBranch as BlockStatement
+ expect(thenStmt.statements).toBeArrayOfSize(1)
+ expect(thenStmt.statements[0]).toBeInstanceOf(VariableStatement)
+ expect(expStmt.elseBranch).toBeInstanceOf(BlockStatement)
+ const elseStmt = expStmt.elseBranch as BlockStatement
+ expect(elseStmt.statements).toBeArrayOfSize(1)
+ expect(elseStmt.statements[0]).toBeInstanceOf(VariableStatement)
+ })
+
+ test('nested', () => {
+ const stmts = parse(`
+ if something is true do
+ set x to 1
+ else if something is false do
+ set x to 2
+ else do
+ set x to 3
+ end
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(IfStatement)
+ const expStmt = stmts[0] as IfStatement
+ expect(expStmt.condition).toBeInstanceOf(BinaryExpression)
+ expect(expStmt.thenBranch).toBeInstanceOf(BlockStatement)
+ const thenStmt = expStmt.thenBranch as BlockStatement
+ expect(thenStmt.statements).toBeArrayOfSize(1)
+ expect(thenStmt.statements[0]).toBeInstanceOf(VariableStatement)
+ expect(expStmt.elseBranch).toBeInstanceOf(IfStatement)
+ const elseIfStmt = expStmt.elseBranch as IfStatement
+ expect(elseIfStmt.condition).toBeInstanceOf(BinaryExpression)
+ expect(elseIfStmt.thenBranch).toBeInstanceOf(BlockStatement)
+ const elseIfStmtThenBlock = elseIfStmt.thenBranch as BlockStatement
+ expect(elseIfStmtThenBlock.statements).toBeArrayOfSize(1)
+ expect(elseIfStmtThenBlock.statements[0]).toBeInstanceOf(VariableStatement)
+ expect(elseIfStmt.elseBranch).toBeInstanceOf(BlockStatement)
+ const elseIfStmtElseBlock = elseIfStmt.elseBranch as BlockStatement
+ expect(elseIfStmtElseBlock.statements).toBeArrayOfSize(1)
+ expect(elseIfStmtElseBlock.statements[0]).toBeInstanceOf(VariableStatement)
+ })
+})
+
+describe('repeat', () => {
+ test('with number literal', () => {
+ const stmts = parse(`
+ repeat 3 do
+ set x to 1
+ end
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(RepeatStatement)
+ const expStmt = stmts[0] as RepeatStatement
+ expect(expStmt.count).toBeInstanceOf(LiteralExpression)
+ expect(expStmt.body).toBeArrayOfSize(1)
+ expect(expStmt.body[0]).toBeInstanceOf(VariableStatement)
+ })
+})
+
+describe('while', () => {
+ test('with single statement', () => {
+ const stmts = parse(`
+ while something is true do
+ set x to 1
+ end
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(WhileStatement)
+ const expStmt = stmts[0] as WhileStatement
+ expect(expStmt.condition).toBeInstanceOf(BinaryExpression)
+ expect(expStmt.body).toBeArrayOfSize(1)
+ expect(expStmt.body[0]).toBeInstanceOf(VariableStatement)
+ })
+})
+
+describe('foreach', () => {
+ test('with single statement in body', () => {
+ // TODO: Get rid of let
+ const stmts = parse(`
+ foreach elem in [] do
+ set x to elem + 1
+ end
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ForeachStatement)
+ const foreachStmt = stmts[0] as ForeachStatement
+ expect(foreachStmt.elementName.lexeme).toBe('elem')
+ expect(foreachStmt.iterable).toBeInstanceOf(ArrayExpression)
+ expect(foreachStmt.body).toBeArrayOfSize(1)
+ expect(foreachStmt.body[0]).toBeInstanceOf(VariableStatement)
+ })
+
+ test('with multiple statements in body', () => {
+ const stmts = parse(`
+ foreach elem in [] do
+ set x to elem + 1
+ set y to elem - 1
+ end
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ForeachStatement)
+ const foreachStmt = stmts[0] as ForeachStatement
+ expect(foreachStmt.elementName.lexeme).toBe('elem')
+ expect(foreachStmt.iterable).toBeInstanceOf(ArrayExpression)
+ expect(foreachStmt.body).toBeArrayOfSize(2)
+ expect(foreachStmt.body[0]).toBeInstanceOf(VariableStatement)
+ expect(foreachStmt.body[1]).toBeInstanceOf(VariableStatement)
+ })
+})
+
+describe('block', () => {
+ test('non-nested', () => {
+ const stmts = parse(`
+ do
+ set x to 1
+ set y to 2
+ end
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(BlockStatement)
+ const blockStmt = stmts[0] as BlockStatement
+ expect(blockStmt.statements).toBeArrayOfSize(2)
+ expect(blockStmt.statements[0]).toBeInstanceOf(VariableStatement)
+ expect(blockStmt.statements[1]).toBeInstanceOf(VariableStatement)
+ })
+
+ test('nested', () => {
+ const stmts = parse(`
+ do
+ set x to 1
+ do
+ set y to 2
+ end
+ end
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(BlockStatement)
+ const blockStmt = stmts[0] as BlockStatement
+ expect(blockStmt.statements).toBeArrayOfSize(2)
+ expect(blockStmt.statements[0]).toBeInstanceOf(VariableStatement)
+ expect(blockStmt.statements[1]).toBeInstanceOf(BlockStatement)
+ })
+})
+
+describe('function', () => {
+ test('without parameters', () => {
+ const stmts = parse(`
+ function move do
+ return 1
+ end
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(FunctionStatement)
+ const functionStmt = stmts[0] as FunctionStatement
+ expect(functionStmt.name.lexeme).toBe('move')
+ expect(functionStmt.parameters).toBeEmpty()
+ expect(functionStmt.body).toBeArrayOfSize(1)
+ expect(functionStmt.body[0]).toBeInstanceOf(ReturnStatement)
+ })
+
+ test('with parameters', () => {
+ const stmts = parse(`
+ function move with x, y do
+ return x + y
+ end
+ `)
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(FunctionStatement)
+ const functionStmt = stmts[0] as FunctionStatement
+ expect(functionStmt.name.lexeme).toBe('move')
+ expect(functionStmt.parameters).toBeArrayOfSize(2)
+ expect(functionStmt.parameters[0].name.lexeme).toBe('x')
+ expect(functionStmt.parameters[1].name.lexeme).toBe('y')
+ expect(functionStmt.body).toBeArrayOfSize(1)
+ expect(functionStmt.body[0]).toBeInstanceOf(ReturnStatement)
+ })
+})
+
+describe('return', () => {
+ test('without argument', () => {
+ const stmts = parse('return')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ReturnStatement)
+ const returnStmt = stmts[0] as ReturnStatement
+ expect(returnStmt.value).toBeNull()
+ })
+
+ describe('with argument', () => {
+ test('number', () => {
+ const stmts = parse('return 2')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ReturnStatement)
+ const returnStmt = stmts[0] as ReturnStatement
+ expect(returnStmt.value).toBeInstanceOf(LiteralExpression)
+ const literalExpr = returnStmt.value as LiteralExpression
+ expect(literalExpr.value).toBe(2)
+ })
+
+ test('string', () => {
+ const stmts = parse('return "hello there!"')
+ expect(stmts).toBeArrayOfSize(1)
+ expect(stmts[0]).toBeInstanceOf(ReturnStatement)
+ const returnStmt = stmts[0] as ReturnStatement
+ expect(returnStmt.value).toBeInstanceOf(LiteralExpression)
+ const literalExpr = returnStmt.value as LiteralExpression
+ expect(literalExpr.value).toBe('hello there!')
+ })
+ })
+})
+
+describe('white space', () => {
+ test('skip over empty lines', () => {
+ const stmts = parse(`
+ set a to 19
+
+ \t\t\t
+ set x to true
+
+ set y to false
+ \t
+
+ `)
+ expect(stmts).toBeArrayOfSize(3)
+ expect(stmts[0]).toBeInstanceOf(VariableStatement)
+ expect(stmts[1]).toBeInstanceOf(VariableStatement)
+ expect(stmts[2]).toBeInstanceOf(VariableStatement)
+ })
+})
+
+describe('location', () => {
+ describe('statement', () => {
+ test('expression', () => {
+ const statements = parse('123')
+ expect(statements).toBeArrayOfSize(1)
+ expect(statements[0]).toBeInstanceOf(ExpressionStatement)
+ const expressionStatement = statements[0] as ExpressionStatement
+ expect(expressionStatement.location.line).toBe(1)
+ expect(expressionStatement.location.relative.begin).toBe(1)
+ expect(expressionStatement.location.relative.end).toBe(4)
+ expect(expressionStatement.location.absolute.begin).toBe(1)
+ expect(expressionStatement.location.absolute.end).toBe(4)
+ })
+
+ test('variable', () => {
+ const statements = parse('set x to 1')
+ expect(statements).toBeArrayOfSize(1)
+ expect(statements[0]).toBeInstanceOf(VariableStatement)
+ const expressionStatement = statements[0] as VariableStatement
+ expect(expressionStatement.location.line).toBe(1)
+ expect(expressionStatement.location.relative.begin).toBe(1)
+ expect(expressionStatement.location.relative.end).toBe(11)
+ expect(expressionStatement.location.absolute.begin).toBe(1)
+ expect(expressionStatement.location.absolute.end).toBe(11)
+ })
+ })
+
+ describe('expression', () => {
+ test('literal', () => {
+ const statements = parse('123')
+ expect(statements).toBeArrayOfSize(1)
+ expect(statements[0]).toBeInstanceOf(ExpressionStatement)
+ const expressionStatement = statements[0] as ExpressionStatement
+ const expression = expressionStatement.expression
+ expect(expression).toBeInstanceOf(LiteralExpression)
+
+ expect(expression.location.line).toBe(1)
+ expect(expression.location.relative.begin).toBe(1)
+ expect(expression.location.relative.end).toBe(4)
+ expect(expression.location.absolute.begin).toBe(1)
+ expect(expression.location.absolute.end).toBe(4)
+ })
+
+ test('variable', () => {
+ const statements = parse('foo')
+ expect(statements).toBeArrayOfSize(1)
+ expect(statements[0]).toBeInstanceOf(ExpressionStatement)
+ const expressionStatement = statements[0] as ExpressionStatement
+ const expression = expressionStatement.expression
+ expect(expression).toBeInstanceOf(VariableExpression)
+ expect(expression.location.line).toBe(1)
+ expect(expression.location.relative.begin).toBe(1)
+ expect(expression.location.relative.end).toBe(4)
+ expect(expression.location.absolute.begin).toBe(1)
+ expect(expression.location.absolute.end).toBe(4)
+ })
+
+ test('call', () => {
+ const statements = parse('move(7)')
+ expect(statements).toBeArrayOfSize(1)
+ expect(statements[0]).toBeInstanceOf(ExpressionStatement)
+ const expressionStatement = statements[0] as ExpressionStatement
+ const expression = expressionStatement.expression
+ expect(expression).toBeInstanceOf(CallExpression)
+ expect(expression.location.line).toBe(1)
+ expect(expression.location.relative.begin).toBe(1)
+ expect(expression.location.relative.end).toBe(8)
+ expect(expression.location.absolute.begin).toBe(1)
+ expect(expression.location.absolute.end).toBe(8)
+ })
+ })
+})
diff --git a/test/javascript/interpreter/languages/jikiscript/scanner.test.ts b/test/javascript/interpreter/languages/jikiscript/scanner.test.ts
new file mode 100644
index 0000000000..38c0bae283
--- /dev/null
+++ b/test/javascript/interpreter/languages/jikiscript/scanner.test.ts
@@ -0,0 +1,567 @@
+import { scan } from '@/interpreter/languages/jikiscript/scanner'
+import { type TokenType } from '@/interpreter/languages/jikiscript/token'
+
+describe('single-character', () => {
+ test.each([
+ ['{', 'LEFT_BRACE'],
+ ['[', 'LEFT_BRACKET'],
+ ['(', 'LEFT_PAREN'],
+ ['}', 'RIGHT_BRACE'],
+ [']', 'RIGHT_BRACKET'],
+ [')', 'RIGHT_PAREN'],
+ [':', 'COLON'],
+ [',', 'COMMA'],
+ ['-', 'MINUS'],
+ ['+', 'PLUS'],
+ ['*', 'STAR'],
+ ['/', 'SLASH'],
+ ])("'%s' token", (source: string, expectedType: string) => {
+ const tokens = scan(source)
+ expect(tokens[0].type).toBe(expectedType as TokenType)
+ expect(tokens[0].lexeme).toBe(source)
+ expect(tokens[0].literal).toBeNull
+ })
+})
+
+describe('one, two or three characters', () => {
+ test.each([
+ ['>', 'GREATER'],
+ ['>=', 'GREATER_EQUAL'],
+ ['<', 'LESS'],
+ ['<=', 'LESS_EQUAL'],
+ ])("'%s' token", (source: string, expectedType: string) => {
+ const tokens = scan(source)
+ expect(tokens[0].type).toBe(expectedType as TokenType)
+ expect(tokens[0].lexeme).toBe(source)
+ expect(tokens[0].literal).toBeNull
+ })
+})
+
+describe('keyword', () => {
+ test.each([
+ ['and', 'AND'],
+ ['do', 'DO'],
+ ['else', 'ELSE'],
+ ['end', 'END'],
+ ['false', 'FALSE'],
+ ['for', 'FOR'],
+ ['foreach', 'FOREACH'],
+ ['function', 'FUNCTION'],
+ ['if', 'IF'],
+ ['in', 'IN'],
+ ['null', 'NULL'],
+ ['not', 'NOT'],
+ ['or', 'OR'],
+ ['repeat', 'REPEAT'],
+ ['return', 'RETURN'],
+ ['set', 'SET'],
+ ['to', 'TO'],
+ ['true', 'TRUE'],
+ ['while', 'WHILE'],
+ ['with', 'WITH'],
+ ['is', 'STRICT_EQUALITY'],
+ ['equals', 'STRICT_EQUALITY'],
+ ])("'%s' keyword", (source: string, expectedType: string) => {
+ const tokens = scan(source)
+ expect(tokens[0].type).toBe(expectedType as TokenType)
+ expect(tokens[0].lexeme).toBe(source)
+ expect(tokens[0].literal).toBeNull
+ })
+})
+
+describe('string', () => {
+ test('empty', () => {
+ const tokens = scan('""')
+ expect(tokens[0].type).toBe('STRING')
+ expect(tokens[0].lexeme).toBe('""')
+ expect(tokens[0].literal).toBe('')
+ })
+
+ test('single character', () => {
+ const tokens = scan('"a"')
+ expect(tokens[0].type).toBe('STRING')
+ expect(tokens[0].lexeme).toBe('"a"')
+ expect(tokens[0].literal).toBe('a')
+ })
+
+ test('multiple characters', () => {
+ const tokens = scan('"Hello"')
+ expect(tokens[0].type).toBe('STRING')
+ expect(tokens[0].lexeme).toBe('"Hello"')
+ expect(tokens[0].literal).toBe('Hello')
+ })
+
+ test('containing whitespace', () => {
+ const tokens = scan('" Good\tday! "')
+ expect(tokens[0].type).toBe('STRING')
+ expect(tokens[0].lexeme).toBe('" Good\tday! "')
+ expect(tokens[0].literal).toBe(' Good\tday! ')
+ })
+
+ test('containing number', () => {
+ const tokens = scan('"Testing 1,2,3"')
+ expect(tokens[0].type).toBe('STRING')
+ expect(tokens[0].lexeme).toBe('"Testing 1,2,3"')
+ expect(tokens[0].literal).toBe('Testing 1,2,3')
+ })
+})
+
+describe('template literal', () => {
+ test('empty', () => {
+ const tokens = scan('``')
+ expect(tokens.length).toBeGreaterThanOrEqual(2)
+ expect(tokens[0].type).toBe('BACKTICK')
+ expect(tokens[0].lexeme).toBe('`')
+ expect(tokens[0].literal).toBeNull()
+ expect(tokens[1].type).toBe('BACKTICK')
+ expect(tokens[1].lexeme).toBe('`')
+ expect(tokens[1].literal).toBeNull()
+ })
+
+ describe('text only', () => {
+ test('single character', () => {
+ const tokens = scan('`a`')
+ expect(tokens.length).toBeGreaterThanOrEqual(3)
+ expect(tokens[0].type).toBe('BACKTICK')
+ expect(tokens[0].lexeme).toBe('`')
+ expect(tokens[0].literal).toBeNull()
+ expect(tokens[1].type).toBe('TEMPLATE_LITERAL_TEXT')
+ expect(tokens[1].lexeme).toBe('a')
+ expect(tokens[1].literal).toBe('a')
+ expect(tokens[2].type).toBe('BACKTICK')
+ expect(tokens[2].lexeme).toBe('`')
+ expect(tokens[2].literal).toBeNull()
+ })
+
+ test('multiple characters', () => {
+ const tokens = scan('`hello`')
+ expect(tokens.length).toBeGreaterThanOrEqual(3)
+ expect(tokens[0].type).toBe('BACKTICK')
+ expect(tokens[0].lexeme).toBe('`')
+ expect(tokens[0].literal).toBeNull()
+ expect(tokens[1].type).toBe('TEMPLATE_LITERAL_TEXT')
+ expect(tokens[1].lexeme).toBe('hello')
+ expect(tokens[1].literal).toBe('hello')
+ expect(tokens[2].type).toBe('BACKTICK')
+ expect(tokens[2].lexeme).toBe('`')
+ expect(tokens[2].literal).toBeNull()
+ })
+
+ test('containing whitespace', () => {
+ const tokens = scan('` Good\tday! `')
+ expect(tokens.length).toBeGreaterThanOrEqual(3)
+ expect(tokens[0].type).toBe('BACKTICK')
+ expect(tokens[0].lexeme).toBe('`')
+ expect(tokens[0].literal).toBeNull()
+ expect(tokens[1].type).toBe('TEMPLATE_LITERAL_TEXT')
+ expect(tokens[1].lexeme).toBe(' Good\tday! ')
+ expect(tokens[1].literal).toBe(' Good\tday! ')
+ expect(tokens[2].type).toBe('BACKTICK')
+ expect(tokens[2].lexeme).toBe('`')
+ expect(tokens[2].literal).toBeNull()
+ })
+
+ test('containing number', () => {
+ const tokens = scan('`Testing 1,2,3`')
+ expect(tokens.length).toBeGreaterThanOrEqual(3)
+ expect(tokens[0].type).toBe('BACKTICK')
+ expect(tokens[0].lexeme).toBe('`')
+ expect(tokens[0].literal).toBeNull()
+ expect(tokens[1].type).toBe('TEMPLATE_LITERAL_TEXT')
+ expect(tokens[1].lexeme).toBe('Testing 1,2,3')
+ expect(tokens[1].literal).toBe('Testing 1,2,3')
+ expect(tokens[2].type).toBe('BACKTICK')
+ expect(tokens[2].lexeme).toBe('`')
+ expect(tokens[2].literal).toBeNull()
+ })
+ })
+
+ describe('placeholder only', () => {
+ test('string', () => {
+ const tokens = scan('`${"hello"}`')
+ expect(tokens.length).toBeGreaterThanOrEqual(5)
+ expect(tokens[0].type).toBe('BACKTICK')
+ expect(tokens[0].lexeme).toBe('`')
+ expect(tokens[0].literal).toBeNull()
+ expect(tokens[1].type).toBe('DOLLAR_LEFT_BRACE')
+ expect(tokens[1].lexeme).toBe('${')
+ expect(tokens[1].literal).toBeNull()
+ expect(tokens[2].type).toBe('STRING')
+ expect(tokens[2].lexeme).toBe('"hello"')
+ expect(tokens[2].literal).toBe('hello')
+ expect(tokens[3].type).toBe('RIGHT_BRACE')
+ expect(tokens[3].lexeme).toBe('}')
+ expect(tokens[3].literal).toBeNull()
+ expect(tokens[4].type).toBe('BACKTICK')
+ expect(tokens[4].lexeme).toBe('`')
+ expect(tokens[4].literal).toBeNull()
+ })
+
+ test('binary expression', () => {
+ const tokens = scan('`${2*4}`')
+ expect(tokens.length).toBeGreaterThanOrEqual(7)
+ expect(tokens[0].type).toBe('BACKTICK')
+ expect(tokens[0].lexeme).toBe('`')
+ expect(tokens[0].literal).toBeNull()
+ expect(tokens[1].type).toBe('DOLLAR_LEFT_BRACE')
+ expect(tokens[1].lexeme).toBe('${')
+ expect(tokens[1].literal).toBeNull()
+ expect(tokens[2].type).toBe('NUMBER')
+ expect(tokens[2].lexeme).toBe('2')
+ expect(tokens[2].literal).toBe(2)
+ expect(tokens[3].type).toBe('STAR')
+ expect(tokens[3].lexeme).toBe('*')
+ expect(tokens[3].literal).toBeNull()
+ expect(tokens[4].type).toBe('NUMBER')
+ expect(tokens[4].lexeme).toBe('4')
+ expect(tokens[4].literal).toBe(4)
+ expect(tokens[5].type).toBe('RIGHT_BRACE')
+ expect(tokens[5].lexeme).toBe('}')
+ expect(tokens[5].literal).toBeNull()
+ expect(tokens[6].type).toBe('BACKTICK')
+ expect(tokens[6].lexeme).toBe('`')
+ expect(tokens[6].literal).toBeNull()
+ })
+ })
+
+ test('text and placeholders', () => {
+ const tokens = scan('`sum of ${2} * ${3} is ${"six"}`')
+ expect(tokens.length).toBeGreaterThanOrEqual(5)
+ expect(tokens[0].type).toBe('BACKTICK')
+ expect(tokens[0].lexeme).toBe('`')
+ expect(tokens[0].literal).toBeNull()
+ expect(tokens[1].type).toBe('TEMPLATE_LITERAL_TEXT')
+ expect(tokens[1].lexeme).toBe('sum of ')
+ expect(tokens[1].literal).toBe('sum of ')
+ expect(tokens[2].type).toBe('DOLLAR_LEFT_BRACE')
+ expect(tokens[2].lexeme).toBe('${')
+ expect(tokens[2].literal).toBeNull()
+ expect(tokens[3].type).toBe('NUMBER')
+ expect(tokens[3].lexeme).toBe('2')
+ expect(tokens[3].literal).toBe(2)
+ expect(tokens[4].type).toBe('RIGHT_BRACE')
+ expect(tokens[4].lexeme).toBe('}')
+ expect(tokens[4].literal).toBeNull()
+ expect(tokens[5].type).toBe('TEMPLATE_LITERAL_TEXT')
+ expect(tokens[5].lexeme).toBe(' * ')
+ expect(tokens[5].literal).toBe(' * ')
+ expect(tokens[6].type).toBe('DOLLAR_LEFT_BRACE')
+ expect(tokens[6].lexeme).toBe('${')
+ expect(tokens[6].literal).toBeNull()
+ expect(tokens[7].type).toBe('NUMBER')
+ expect(tokens[7].lexeme).toBe('3')
+ expect(tokens[7].literal).toBe(3)
+ expect(tokens[8].type).toBe('RIGHT_BRACE')
+ expect(tokens[8].lexeme).toBe('}')
+ expect(tokens[8].literal).toBeNull()
+ expect(tokens[9].type).toBe('TEMPLATE_LITERAL_TEXT')
+ expect(tokens[9].lexeme).toBe(' is ')
+ expect(tokens[9].literal).toBe(' is ')
+ expect(tokens[10].type).toBe('DOLLAR_LEFT_BRACE')
+ expect(tokens[10].lexeme).toBe('${')
+ expect(tokens[10].literal).toBeNull()
+ expect(tokens[11].type).toBe('STRING')
+ expect(tokens[11].lexeme).toBe('"six"')
+ expect(tokens[11].literal).toBe('six')
+ expect(tokens[12].type).toBe('RIGHT_BRACE')
+ expect(tokens[12].lexeme).toBe('}')
+ expect(tokens[12].literal).toBeNull()
+ })
+
+ test('binary expression', () => {
+ const tokens = scan('`${2*4}`')
+ expect(tokens.length).toBeGreaterThanOrEqual(7)
+ expect(tokens[0].type).toBe('BACKTICK')
+ expect(tokens[0].lexeme).toBe('`')
+ expect(tokens[0].literal).toBeNull()
+ expect(tokens[1].type).toBe('DOLLAR_LEFT_BRACE')
+ expect(tokens[1].lexeme).toBe('${')
+ expect(tokens[1].literal).toBeNull()
+ expect(tokens[2].type).toBe('NUMBER')
+ expect(tokens[2].lexeme).toBe('2')
+ expect(tokens[2].literal).toBe(2)
+ expect(tokens[3].type).toBe('STAR')
+ expect(tokens[3].lexeme).toBe('*')
+ expect(tokens[3].literal).toBeNull()
+ expect(tokens[4].type).toBe('NUMBER')
+ expect(tokens[4].lexeme).toBe('4')
+ expect(tokens[4].literal).toBe(4)
+ expect(tokens[5].type).toBe('RIGHT_BRACE')
+ expect(tokens[5].lexeme).toBe('}')
+ expect(tokens[5].literal).toBeNull()
+ expect(tokens[6].type).toBe('BACKTICK')
+ expect(tokens[6].lexeme).toBe('`')
+ expect(tokens[6].literal).toBeNull()
+ })
+})
+
+describe('identifier', () => {
+ test('start with lower letter', () => {
+ const tokens = scan('name')
+ expect(tokens[0].type).toBe('IDENTIFIER')
+ expect(tokens[0].lexeme).toBe('name')
+ expect(tokens[0].literal).toBeNull
+ })
+
+ test('start with upper letter', () => {
+ const tokens = scan('Name')
+ expect(tokens[0].type).toBe('IDENTIFIER')
+ expect(tokens[0].lexeme).toBe('Name')
+ expect(tokens[0].literal).toBeNull
+ })
+
+ test('start with underscore', () => {
+ const tokens = scan('_name')
+ expect(tokens[0].type).toBe('IDENTIFIER')
+ expect(tokens[0].lexeme).toBe('_name')
+ expect(tokens[0].literal).toBeNull
+ })
+})
+
+describe('number', () => {
+ test('integer', () => {
+ const tokens = scan('143')
+ expect(tokens[0].type).toBe('NUMBER')
+ expect(tokens[0].lexeme).toBe('143')
+ expect(tokens[0].literal).toBe(143)
+ })
+
+ test('floating-point', () => {
+ const tokens = scan('76.9')
+ expect(tokens[0].type).toBe('NUMBER')
+ expect(tokens[0].lexeme).toBe('76.9')
+ expect(tokens[0].literal).toBe(76.9)
+ })
+})
+
+describe('call', () => {
+ test('without arguments', () => {
+ const tokens = scan('move()')
+ expect(tokens).toBeArrayOfSize(5)
+ expect(tokens[0].type).toBe('IDENTIFIER')
+ expect(tokens[1].type).toBe('LEFT_PAREN')
+ expect(tokens[2].type).toBe('RIGHT_PAREN')
+ expect(tokens[3].type).toBe('EOL')
+ expect(tokens[4].type).toBe('EOF')
+ })
+
+ test('single string argument', () => {
+ const tokens = scan('turn("left")')
+ expect(tokens).toBeArrayOfSize(6)
+ expect(tokens[0].type).toBe('IDENTIFIER')
+ expect(tokens[1].type).toBe('LEFT_PAREN')
+ expect(tokens[2].type).toBe('STRING')
+ expect(tokens[3].type).toBe('RIGHT_PAREN')
+ expect(tokens[4].type).toBe('EOL')
+ expect(tokens[5].type).toBe('EOF')
+ })
+
+ test('single integer argument', () => {
+ const tokens = scan('advance(5)')
+ expect(tokens).toBeArrayOfSize(6)
+ expect(tokens[0].type).toBe('IDENTIFIER')
+ expect(tokens[1].type).toBe('LEFT_PAREN')
+ expect(tokens[2].type).toBe('NUMBER')
+ expect(tokens[3].type).toBe('RIGHT_PAREN')
+ expect(tokens[4].type).toBe('EOL')
+ expect(tokens[5].type).toBe('EOF')
+ })
+})
+
+test('multiple lines', () => {
+ const tokens = scan('move()\nturn("left")\nmove()')
+ expect(tokens).toBeArrayOfSize(14)
+ expect(tokens[0].type).toBe('IDENTIFIER')
+ expect(tokens[1].type).toBe('LEFT_PAREN')
+ expect(tokens[2].type).toBe('RIGHT_PAREN')
+ expect(tokens[3].type).toBe('EOL')
+ expect(tokens[4].type).toBe('IDENTIFIER')
+ expect(tokens[5].type).toBe('LEFT_PAREN')
+ expect(tokens[6].type).toBe('STRING')
+ expect(tokens[7].type).toBe('RIGHT_PAREN')
+ expect(tokens[8].type).toBe('EOL')
+ expect(tokens[9].type).toBe('IDENTIFIER')
+ expect(tokens[10].type).toBe('LEFT_PAREN')
+ expect(tokens[11].type).toBe('RIGHT_PAREN')
+ expect(tokens[12].type).toBe('EOL')
+ expect(tokens[13].type).toBe('EOF')
+})
+
+test('location', () => {
+ const tokens = scan('move()\nturn("left")')
+ expect(tokens).toBeArrayOfSize(10)
+
+ expect(tokens[0].location.line).toBe(1)
+ expect(tokens[0].location.relative.begin).toBe(1)
+ expect(tokens[0].location.relative.end).toBe(5)
+ expect(tokens[0].location.absolute.begin).toBe(1)
+ expect(tokens[0].location.absolute.end).toBe(5)
+
+ expect(tokens[1].location.line).toBe(1)
+ expect(tokens[1].location.relative.begin).toBe(5)
+ expect(tokens[1].location.relative.end).toBe(6)
+ expect(tokens[1].location.absolute.begin).toBe(5)
+ expect(tokens[1].location.absolute.end).toBe(6)
+
+ expect(tokens[2].location.line).toBe(1)
+ expect(tokens[2].location.relative.begin).toBe(6)
+ expect(tokens[2].location.relative.end).toBe(7)
+ expect(tokens[2].location.absolute.begin).toBe(6)
+ expect(tokens[2].location.absolute.end).toBe(7)
+
+ expect(tokens[3].location.line).toBe(1)
+ expect(tokens[3].location.relative.begin).toBe(7)
+ expect(tokens[3].location.relative.end).toBe(8)
+ expect(tokens[3].location.absolute.begin).toBe(7)
+ expect(tokens[3].location.absolute.end).toBe(8)
+
+ expect(tokens[4].location.line).toBe(2)
+ expect(tokens[4].location.relative.begin).toBe(1)
+ expect(tokens[4].location.relative.end).toBe(5)
+ expect(tokens[4].location.absolute.begin).toBe(8)
+ expect(tokens[4].location.absolute.end).toBe(12)
+
+ expect(tokens[5].location.line).toBe(2)
+ expect(tokens[5].location.relative.begin).toBe(5)
+ expect(tokens[5].location.relative.end).toBe(6)
+ expect(tokens[5].location.absolute.begin).toBe(12)
+ expect(tokens[5].location.absolute.end).toBe(13)
+
+ expect(tokens[6].location.line).toBe(2)
+ expect(tokens[6].location.relative.begin).toBe(6)
+ expect(tokens[6].location.relative.end).toBe(12)
+ expect(tokens[6].location.absolute.begin).toBe(13)
+ expect(tokens[6].location.absolute.end).toBe(19)
+
+ expect(tokens[7].location.line).toBe(2)
+ expect(tokens[7].location.relative.begin).toBe(12)
+ expect(tokens[7].location.relative.end).toBe(13)
+ expect(tokens[7].location.absolute.begin).toBe(19)
+ expect(tokens[7].location.absolute.end).toBe(20)
+})
+
+describe('error', () => {
+ describe('token', () => {
+ test('invalid', () => {
+ expect(() => scan('123#')).toThrow("Unknown character: '#'.")
+ })
+
+ test('Exclude listed', () => {
+ expect(() => scan('set x to 1', { ExcludeList: ['SET'] })).toThrow(
+ "Usage of 'SET' is not allowed"
+ )
+ })
+
+ test('Include listed', () => {
+ expect(() =>
+ scan('set x to 1', {
+ IncludeList: ['IDENTIFIER', 'NUMBER'],
+ })
+ ).toThrow("Usage of 'SET' is not allowed")
+ })
+ })
+})
+
+describe('white space', () => {
+ describe('ignore', () => {
+ test('spaces', () => {
+ const tokens = scan(' ')
+ expect(tokens).toHaveLength(1)
+ expect(tokens[0].type).toBe('EOF')
+ })
+
+ test('tabs', () => {
+ const tokens = scan('\t\t\t')
+ expect(tokens).toHaveLength(1)
+ expect(tokens[0].type).toBe('EOF')
+ })
+
+ test('consecutive newlines', () => {
+ const tokens = scan('\n\n\n\n')
+ expect(tokens).toHaveLength(1)
+ expect(tokens[0].type).toBe('EOF')
+ })
+
+ test('between statements', () => {
+ const tokens = scan('1\n\n2\n')
+ expect(tokens).toHaveLength(5)
+ expect(tokens[0].type).toBe('NUMBER')
+ expect(tokens[1].type).toBe('EOL')
+ expect(tokens[2].type).toBe('NUMBER')
+ expect(tokens[3].type).toBe('EOL')
+ expect(tokens[4].type).toBe('EOF')
+ })
+ })
+})
+
+describe('synthetic', () => {
+ describe('EOL', () => {
+ describe('not added', () => {
+ test('empty line', () => {
+ const tokens = scan('')
+ expect(tokens).toBeArrayOfSize(1)
+ expect(tokens[0].type).toBe('EOF')
+ })
+
+ test('before first statement', () => {
+ const tokens = scan('\n1\n')
+ expect(tokens).toHaveLength(3)
+ expect(tokens[0].type).toBe('NUMBER')
+ expect(tokens[1].type).toBe('EOL')
+ expect(tokens[2].type).toBe('EOF')
+ })
+
+ test('between statements', () => {
+ const tokens = scan('1\n\n2\n')
+ expect(tokens).toHaveLength(5)
+ expect(tokens[0].type).toBe('NUMBER')
+ expect(tokens[1].type).toBe('EOL')
+ expect(tokens[2].type).toBe('NUMBER')
+ expect(tokens[3].type).toBe('EOL')
+ expect(tokens[4].type).toBe('EOF')
+ })
+ })
+
+ describe('added', () => {
+ describe('single statement', () => {
+ test('ending with newline', () => {
+ const tokens = scan('1\n')
+ expect(tokens).toBeArrayOfSize(3)
+ expect(tokens[0].type).toBe('NUMBER')
+ expect(tokens[1].type).toBe('EOL')
+ expect(tokens[2].type).toBe('EOF')
+ })
+
+ test('not ending with newline', () => {
+ const tokens = scan('1')
+ expect(tokens).toBeArrayOfSize(3)
+ expect(tokens[0].type).toBe('NUMBER')
+ expect(tokens[1].type).toBe('EOL')
+ expect(tokens[2].type).toBe('EOF')
+ })
+ })
+
+ describe('multiple statements', () => {
+ test('ending with newline', () => {
+ const tokens = scan('1\n2\n')
+ expect(tokens).toBeArrayOfSize(5)
+ expect(tokens[0].type).toBe('NUMBER')
+ expect(tokens[1].type).toBe('EOL')
+ expect(tokens[2].type).toBe('NUMBER')
+ expect(tokens[3].type).toBe('EOL')
+ expect(tokens[4].type).toBe('EOF')
+ })
+
+ test('last statement not ending with newline', () => {
+ const tokens = scan('1\n2')
+ expect(tokens).toBeArrayOfSize(5)
+ expect(tokens[0].type).toBe('NUMBER')
+ expect(tokens[1].type).toBe('EOL')
+ expect(tokens[2].type).toBe('NUMBER')
+ expect(tokens[3].type).toBe('EOL')
+ expect(tokens[4].type).toBe('EOF')
+ })
+ })
+ })
+ })
+})
diff --git a/test/javascript/interpreter/languages/jikiscript/syntaxErrors.test.ts b/test/javascript/interpreter/languages/jikiscript/syntaxErrors.test.ts
new file mode 100644
index 0000000000..0aef419a6f
--- /dev/null
+++ b/test/javascript/interpreter/languages/jikiscript/syntaxErrors.test.ts
@@ -0,0 +1,465 @@
+import { parse } from '@/interpreter/languages/jikiscript/parser'
+import { changeLanguage } from '@/interpreter/translator'
+
+beforeAll(() => {
+ changeLanguage('system')
+})
+
+afterAll(() => {
+ changeLanguage('en')
+})
+
+describe('syntax errors', () => {
+ describe('numbers', () => {
+ test('two periods', () => {
+ expect(() => parse('1.3.4')).toThrow(
+ 'NumberWithMultipleDecimalPoints: suggestion: 1.34'
+ )
+ })
+
+ test('unfinished decimal number', () => {
+ expect(() => parse('123.')).toThrow(
+ 'NumberEndsWithDecimalPoint: suggestion: 123'
+ )
+ })
+
+ test('invalid character in number', () => {
+ expect(() => parse('set x to 123abc')).toThrow(
+ 'NumberContainsAlpha: suggestion: 123'
+ )
+ })
+
+ test('leading zeros', () => {
+ expect(() => parse('set x to 00123')).toThrow(
+ 'NumberStartsWithZero: suggestion: 123'
+ )
+ })
+ })
+
+ describe('strings', () => {
+ test('unstarted', () => {
+ expect(() => parse('abc"')).toThrow(
+ 'MissingDoubleQuoteToStartString: string: abc'
+ )
+ })
+
+ test('unterminated - end of file', () => {
+ expect(() => parse('"abc')).toThrow(
+ 'MissingDoubleQuoteToTerminateString: string: abc'
+ )
+ })
+
+ test('unterminated - end of line', () => {
+ expect(() => parse('"abc\nsomething_else"')).toThrow(
+ 'MissingDoubleQuoteToTerminateString: string: abc'
+ )
+ })
+
+ test('unterminated - newline in string', () => {
+ expect(() => parse('"abc\n"')).toThrow(
+ 'MissingDoubleQuoteToTerminateString: string: abc'
+ )
+ })
+ })
+
+ describe('assignment', () => {
+ test('using = by accident', () => {
+ expect(() => parse('set 123 = "value"')).toThrow('UnknownCharacterEquals')
+ })
+
+ test('number as variable name', () => {
+ expect(() => parse('set 123 to "value"')).toThrow(
+ 'InvalidNumericVariableName: name: 123'
+ )
+ })
+ })
+
+ describe('function definitions', () => {
+ test('missing function name', () => {
+ expect(() =>
+ parse(`
+ function with x, y do
+ set result to x + y
+ end
+ `)
+ ).toThrow('MissingFunctionName')
+ })
+
+ test('missing with', () => {
+ expect(() =>
+ parse(`
+ function foobar a do
+ end
+ `)
+ ).toThrow('MissingWithBeforeParameters')
+ })
+
+ test('missing do', () => {
+ expect(() =>
+ parse(`
+ function foobar with a
+ end
+ `)
+ ).toThrow('MissingDoToStartBlock: type: function')
+ })
+
+ test('missing end', () => {
+ expect(() =>
+ parse(`
+ function foobar with a do
+ `)
+ ).toThrow('MissingEndAfterBlock: type: function')
+ })
+
+ test('missing parameters', () => {
+ expect(() =>
+ parse(`
+ function move with do
+ set result to 10
+ end
+ `)
+ ).toThrow('MissingParameterName')
+ })
+
+ test('unexpected token after function name', () => {
+ expect(() =>
+ parse(`
+ function move unexpected (x, y) do
+ set result to x + y
+ end
+ `)
+ ).toThrow('MissingWithBeforeParameters')
+ })
+
+ test("extra tokens after 'end' keyword", () => {
+ expect(() =>
+ parse(`
+ function move with x, y do
+ set result to x + y
+ end end
+ `)
+ ).toThrow('MissingEndOfLine: previous: end')
+ })
+
+ test('invalid parameter name', () => {
+ expect(() =>
+ parse(`
+ function move with 1x, y do
+ set result to x + y
+ end
+ `)
+ ).toThrow('NumberContainsAlpha: suggestion: 1')
+ })
+
+ test('missing comma between parameters', () => {
+ expect(() =>
+ parse(`
+ function move with x y do
+ set result to x + y
+ end
+ `)
+ ).toThrow('MissingCommaBetweenParameters: parameter: x')
+ })
+
+ test('duplicate parameter names', () => {
+ expect(() =>
+ parse(`
+ function move with x, x do
+ set result to x + x
+ end
+ `)
+ ).toThrow('DuplicateParameterName: parameter: x')
+ })
+
+ test('empty parameter list with invalid syntax', () => {
+ expect(() =>
+ parse(`
+ function move with do
+ set result to 10
+ end
+ `)
+ ).toThrow('MissingParameterName')
+ })
+
+ test('unexpected token inside parameter list', () => {
+ expect(() =>
+ parse(`
+ function move with x, unexpected y do
+ set result to x + y
+ end
+ `)
+ ).toThrow('MissingCommaBetweenParameters: parameter: unexpected')
+ })
+ })
+
+ describe('function definition', () => {
+ test('missing opening parenthesis', () => {
+ expect(() =>
+ parse(`
+ function move do
+ return 1
+ end
+
+ move)
+ `)
+ ).toThrow('MissingLeftParenthesisAfterFunctionCall: function: move')
+ })
+
+ test('missing closing parenthesis - no args', () => {
+ expect(() => parse('move(')).toThrow(
+ 'MissingRightParenthesisAfterFunctionCall: function: move'
+ )
+ })
+
+ test('missing closing parenthesis - 1 arg', () => {
+ expect(() => parse('move(1')).toThrow(
+ 'MissingRightParenthesisAfterFunctionCall: function: move'
+ )
+ })
+
+ test('missing closing parenthesis - 2 args', () => {
+ expect(() => parse('move(1, 2')).toThrow(
+ 'MissingRightParenthesisAfterFunctionCall: function: move'
+ )
+ })
+ })
+
+ describe('statement', () => {
+ test('multiple expressions on single line', () => {
+ expect(() => parse('1 1')).toThrow('MissingEndOfLine')
+ })
+ })
+
+ describe('invalid characters', () => {
+ test('using = by accident', () => {
+ expect(() => parse('set 123 to x = "value"')).toThrow(
+ 'UnknownCharacterEquals'
+ )
+ })
+
+ test('using == by accident', () => {
+ expect(() => parse('set 123 to x == "value"')).toThrow(
+ 'UnknownCharacterEquals'
+ )
+ })
+ })
+
+ describe('missing do', () => {
+ test('repeat', () => {
+ expect(() =>
+ parse(`
+ repeat 5
+ end
+ `)
+ ).toThrow('MissingDoToStartBlock: type: repeat')
+ })
+
+ test('while', () => {
+ expect(() =>
+ parse(`
+ while x equals 1
+ end
+ `)
+ ).toThrow('MissingDoToStartBlock: type: while')
+ })
+ })
+
+ describe('missing end', () => {
+ test('repeat', () => {
+ expect(() =>
+ parse(`
+ repeat 5 do
+ `)
+ ).toThrow('MissingEndAfterBlock: type: repeat')
+ })
+
+ test('while', () => {
+ expect(() =>
+ parse(`
+ while x equals 1 do
+ `)
+ ).toThrow('MissingEndAfterBlock: type: while')
+ })
+ })
+
+ describe('if/else statements', () => {
+ test('missing do on if', () => {
+ expect(() =>
+ parse(`
+ if 5 > 4
+ end
+ `)
+ ).toThrow('MissingDoToStartBlock: type: if')
+ })
+
+ test('missing do on else', () => {
+ expect(() =>
+ parse(`
+ if 5 > 4 do
+ else
+ end
+ `)
+ ).toThrow('MissingDoToStartBlock: type: else')
+ })
+
+ test('missing end on if', () => {
+ expect(() =>
+ parse(`
+ if 5 > 4 do
+ `)
+ ).toThrow('MissingEndAfterBlock: type: if')
+ })
+
+ test('missing end on else', () => {
+ expect(() =>
+ parse(`
+ if 5 > 4 do
+ else do
+ `)
+ ).toThrow('MissingEndAfterBlock: type: else')
+ })
+
+ test('missing condition in if statement', () => {
+ expect(() =>
+ parse(`
+ if do
+ set x to 10
+ end
+ `)
+ ).toThrow('MissingConditionAfterIf')
+ })
+
+ test('else without matching if', () => {
+ expect(() =>
+ parse(`
+ else
+ set x to 10
+ end
+ `)
+ ).toThrow('UnexpectedElseWithoutIf')
+ })
+
+ test('else if without matching if', () => {
+ expect(() =>
+ parse(`
+ else if x is 10 do
+ set x to 20
+ end
+ `)
+ ).toThrow('UnexpectedElseWithoutIf')
+ })
+
+ test('missing condition in else if', () => {
+ expect(() =>
+ parse(`
+ if x is 10 do
+ set x to 20
+ else if do
+ set x to 30
+ end
+ `)
+ ).toThrow('MissingConditionAfterIf')
+ })
+
+ test('misspelt comparison operator', () => {
+ expect(() =>
+ parse(`
+ if x equal 10 do
+ set x to 20
+ end
+ `)
+ ).toThrow(
+ 'UnexpectedVariableExpressionAfterIfWithPotentialTypo: actual: equal, potential: equals'
+ )
+ })
+
+ test('misspelt comparison operator with brackets', () => {
+ expect(() =>
+ parse(`
+ if(x equal 10) do
+ set x to 20
+ end
+ `)
+ ).toThrow(
+ 'MissingRightParenthesisAfterExpressionWithPotentialTypo: actual: equal, potential: equals'
+ )
+ })
+
+ test('nested if without end', () => {
+ expect(() =>
+ parse(`
+ if x is 10 do
+ if y is 20 do
+ set x to 30
+ set y to 40
+ end
+ `)
+ ).toThrow('MissingEndAfterBlock: type: if')
+ })
+
+ test('unexpected token after if condition', () => {
+ expect(() =>
+ parse(`
+ if x is 10 unexpected
+ set x to 20
+ end
+ `)
+ ).toThrow('MissingDoToStartBlock: type: if')
+ })
+
+ test('literal conditions', () => {
+ expect(() =>
+ parse(`
+ if true do
+ set x to 20
+ end
+ `)
+ ).toThrow('UnexpectedLiteralExpressionAfterIf')
+ })
+
+ test('variable conditions', () => {
+ expect(() =>
+ parse(`
+ if something do
+ set x to 20
+ end
+ `)
+ ).toThrow('UnexpectedVariableExpressionAfterIf')
+ })
+
+ // TODO: Could we do better here?
+ test('multiple else statements', () => {
+ expect(() =>
+ parse(`
+ if x is 10 do
+ set x to 20
+ else do
+ set x to 30
+ else do
+ set x to 40
+ end
+ `)
+ ).toThrow('UnexpectedElseWithoutIf')
+ })
+ })
+
+ describe('call', () => {
+ test('missing opening parenthesis', () => {
+ expect(() =>
+ parse(`
+ function move do
+ return 1
+ end
+
+ move)
+ `)
+ ).toThrow('MissingLeftParenthesisAfterFunctionCall: function: move')
+ })
+
+ test('missing closing parenthesis', () => {
+ expect(() => parse('move(1')).toThrow(
+ 'MissingRightParenthesisAfterFunctionCall: function: move'
+ )
+ })
+ })
+})
diff --git a/test/javascript/interpreter/localization.test.ts b/test/javascript/interpreter/localization.test.ts
new file mode 100644
index 0000000000..d27bc977da
--- /dev/null
+++ b/test/javascript/interpreter/localization.test.ts
@@ -0,0 +1,28 @@
+import { scan } from '@/interpreter/languages/javascript/scanner'
+import { changeLanguage, getLanguage } from '@/interpreter/translator'
+
+async function usingLanguage(newLanguage: string, callback: () => void) {
+ const oldLanguage = getLanguage()
+ try {
+ await changeLanguage(newLanguage)
+ callback()
+ } finally {
+ await changeLanguage(oldLanguage)
+ }
+}
+
+describe('scanner', () => {
+ describe('error', () => {
+ test.each([
+ ['en', "Unknown character: '#'."],
+ ['nl', "Onbekend karakter: '#'."],
+ ])(
+ "translated to '%s'",
+ async (language: string, expectedErrorMessage: string) => {
+ usingLanguage(language, () => {
+ expect(() => scan('123#')).toThrow(expectedErrorMessage)
+ })
+ }
+ )
+ })
+})
diff --git a/test/javascript/interpreter/resolver.test.ts b/test/javascript/interpreter/resolver.test.ts
new file mode 100644
index 0000000000..beb2cc1a1d
--- /dev/null
+++ b/test/javascript/interpreter/resolver.test.ts
@@ -0,0 +1,55 @@
+import { type Context } from '@/interpreter/interpreter'
+import { parse } from '@/interpreter/languages/javascript/parser'
+import { Resolver } from '@/interpreter/resolver'
+
+export function resolve(sourceCode: string, context: Context = {}): void {
+ const externalFunctions = context.externalFunctions || {}
+ const functionNames = Object.keys(externalFunctions)
+ const statements = parse(sourceCode, {
+ functionNames: functionNames,
+ languageFeatures: context.languageFeatures || {},
+ shouldWrapTopLevelStatements: context.wrapTopLevelStatements || false,
+ })
+ new Resolver(false, functionNames).resolve(statements)
+}
+
+describe('error', () => {
+ test('declare variable with same name more than once', () => {
+ expect(() =>
+ resolve(`
+ {
+ let a = 1
+ let a = 2
+ }
+ `)
+ ).toThrow('Already a variable with this name in this scope.')
+ })
+
+ describe('assign constant', () => {
+ test('in same scope', () => {
+ expect(() =>
+ resolve(`
+ const a = 1
+ a = 2
+ `)
+ ).toThrow('Cannot re-assign value of constant.')
+ })
+
+ test('in parent scope', () => {
+ expect(() =>
+ resolve(`
+ const a = 1
+ {
+ a = 2
+ }
+ `)
+ ).toThrow('Cannot re-assign value of constant.')
+ })
+ })
+
+ test('return outside of function', () => {
+ expect(() => resolve('return 1')).toThrow(
+ "Can't return from top-level code."
+ )
+ })
+})
diff --git a/test/javascript/setupTests.js b/test/javascript/setupTests.js
index 1580e04094..ed2de6e3b6 100644
--- a/test/javascript/setupTests.js
+++ b/test/javascript/setupTests.js
@@ -19,6 +19,9 @@ export const queryClient = new QueryClient({
},
})
+import * as matchers from 'jest-extended'
+expect.extend(matchers)
+
// https://jestjs.io/docs/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom
Object.defineProperty(window, 'matchMedia', {
writable: true,
diff --git a/test/javascript/validate_bootcamp_content.test.js b/test/javascript/validate_bootcamp_content.test.js
new file mode 100644
index 0000000000..d8fed13d50
--- /dev/null
+++ b/test/javascript/validate_bootcamp_content.test.js
@@ -0,0 +1,63 @@
+import { evaluateJikiScriptFunction } from '@/interpreter/interpreter'
+import fs from 'fs'
+import path from 'path'
+
+const contentDir = path.resolve(__dirname, '../../bootcamp_content/projects')
+
+function getSubdirectories(dir) {
+ return fs
+ .readdirSync(dir)
+ .filter((file) => fs.statSync(path.join(dir, file)).isDirectory())
+}
+
+function getConfig(exerciseDir) {
+ const configPath = path.join(exerciseDir, 'config.json')
+ return JSON.parse(fs.readFileSync(configPath, 'utf-8'))
+}
+
+function getExampleScript(exerciseDir) {
+ const examplePath = path.join(exerciseDir, 'example.jiki')
+ return fs.readFileSync(examplePath, 'utf-8')
+}
+
+describe('Exercise Tests', () => {
+ const projects = getSubdirectories(contentDir)
+
+ projects.forEach((project) => {
+ const projectDir = contentDir + '/' + project + '/exercises'
+ const exercises = getSubdirectories(projectDir)
+ exercises.forEach((exercise) => {
+ const exerciseDir = path.join(projectDir, exercise)
+ const config = getConfig(exerciseDir)
+ const exampleScript = getExampleScript(exerciseDir)
+
+ if (config.tests_type == 'state') {
+ return
+ }
+
+ config.tasks.forEach((task) => {
+ task.tests.forEach((taskTest) => {
+ test(`${project} - ${exercise} - ${task.name} - ${taskTest.name}`, () => {
+ let error, value, frames
+ try {
+ ;({ error, value, frames } = evaluateJikiScriptFunction(
+ exampleScript,
+ {},
+ taskTest.function,
+ ...taskTest.params
+ ))
+ } catch (e) {
+ console.log(e)
+ expect(true).toBe(false)
+ }
+
+ // if(value != taskTest.expected.return) {
+ // console.log(error, value, frames);
+ // }
+ expect(value).toEqual(taskTest.expected)
+ })
+ })
+ })
+ })
+ })
+})
diff --git a/test/models/bootcamp/drawing_test.rb b/test/models/bootcamp/drawing_test.rb
new file mode 100644
index 0000000000..45350315cf
--- /dev/null
+++ b/test/models/bootcamp/drawing_test.rb
@@ -0,0 +1,7 @@
+require "test_helper"
+
+class Bootcamp::DrawingTest < ActiveSupport::TestCase
+ # test "the truth" do
+ # assert true
+ # end
+end
diff --git a/test/test_helper.rb b/test/test_helper.rb
index 1b79a78676..366ba1682c 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -128,6 +128,18 @@ def ==(other)
)
end
+# Setup our indexes once (we'll keep them clear in teardowns)
+opensearch = Exercism.opensearch_client
+[
+ Document::OPENSEARCH_INDEX,
+ Solution::OPENSEARCH_INDEX,
+ Exercise::Representation::OPENSEARCH_INDEX
+].map do |index|
+ opensearch.indices.delete(index:) if opensearch.indices.exists(index:)
+ opensearch.indices.create(index:)
+end
+Exercism::TOUCHED_OPENSEARCH_INDEXES = [] # rubocop:disable Style/MutableConstant
+
class ActionMailer::TestCase
def assert_email(email, to, subject, fixture, bulk: false) # rubocop:disable Lint/UnusedMethodArgument
# Test email can send ok
@@ -156,7 +168,6 @@ class ActiveSupport::TestCase
# parallelize(workers: :number_of_processors)
setup do
- reset_opensearch!
reset_redis!
reset_rack_attack!
@@ -170,6 +181,8 @@ class ActiveSupport::TestCase
end
teardown do
+ reset_opensearch!
+
Bullet.perform_out_of_channel_notifications if Bullet.notification?
Bullet.end_request
end
@@ -294,11 +307,17 @@ def download_s3_file(bucket, key)
# OpenSearch Helpers #
######################
def reset_opensearch!
+ return unless Exercism::TOUCHED_OPENSEARCH_INDEXES.present?
+
+ OpenSearch::Client.unstub(:new)
+ Exercism.unstub(:opensearch_client)
opensearch = Exercism.opensearch_client
- OPENSEARCH_INDEXES.each do |index|
+
+ Exercism::TOUCHED_OPENSEARCH_INDEXES.map do |index|
opensearch.indices.delete(index:) if opensearch.indices.exists(index:)
opensearch.indices.create(index:)
end
+ Exercism::TOUCHED_OPENSEARCH_INDEXES.clear
end
def get_opensearch_doc(index, id)
@@ -312,7 +331,7 @@ def wait_for_opensearch_to_be_synced
perform_enqueued_jobs
# Force an index refresh to ensure there are no concurrent actions in the background
- OPENSEARCH_INDEXES.each do |index|
+ Exercism::TOUCHED_OPENSEARCH_INDEXES.each do |index|
Exercism.opensearch_client.indices.refresh(index:)
end
end
@@ -390,13 +409,6 @@ def reset_user_cache(user)
user.data.reload.update!(cache: nil)
user.reload
end
-
- OPENSEARCH_INDEXES = [
- Document::OPENSEARCH_INDEX,
- Solution::OPENSEARCH_INDEX,
- Exercise::Representation::OPENSEARCH_INDEX
- ].freeze
- private_constant :OPENSEARCH_INDEXES
end
class ActionView::TestCase
diff --git a/tsconfig.json b/tsconfig.json
index 84fc61d9a7..8fc8d779a4 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -5,7 +5,7 @@
"declaration": false,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
- "lib": ["es6", "dom", "DOM.Iterable", "es2018.promise", "es2017"],
+ "lib": ["es6", "dom", "DOM.Iterable", "es2018.promise", "es2017", "es2021"],
"module": "es2020",
"moduleResolution": "node",
"sourceMap": true,
diff --git a/yarn.lock b/yarn.lock
index ff788e132d..cef8bf3306 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,11 +2,40 @@
# yarn lockfile v1
+"@adobe/css-tools@^4.0.1":
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.1.tgz#2447a230bfe072c1659e6815129c03cf170710e3"
+ integrity sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==
+
"@alloc/quick-lru@^5.2.0":
version "5.2.0"
resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30"
integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==
+"@ampproject/remapping@^2.2.0":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4"
+ integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@babel/cli@^7.26.4":
+ version "7.26.4"
+ resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.26.4.tgz#4101ff8ee5de8447a6c395397a97921056411d20"
+ integrity sha512-+mORf3ezU3p3qr+82WvJSnQNE1GAYeoCfEv4fik6B5/2cvKZ75AX8oawWQdXtM9MmndooQj15Jr9kelRFWsuRw==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.25"
+ commander "^6.2.0"
+ convert-source-map "^2.0.0"
+ fs-readdir-recursive "^1.1.0"
+ glob "^7.2.0"
+ make-dir "^2.1.0"
+ slash "^2.0.0"
+ optionalDependencies:
+ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3"
+ chokidar "^3.6.0"
+
"@babel/code-frame@7.12.11":
version "7.12.11"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"
@@ -14,412 +43,274 @@
dependencies:
"@babel/highlight" "^7.10.4"
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789"
- integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2":
+ version "7.26.2"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85"
+ integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==
dependencies:
- "@babel/highlight" "^7.16.7"
+ "@babel/helper-validator-identifier" "^7.25.9"
+ js-tokens "^4.0.0"
+ picocolors "^1.0.0"
-"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8":
- version "7.16.8"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.8.tgz#31560f9f29fdf1868de8cb55049538a1b9732a60"
- integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==
+"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.9", "@babel/compat-data@^7.26.0":
+ version "7.26.3"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.3.tgz#99488264a56b2aded63983abd6a417f03b92ed02"
+ integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==
"@babel/core@^7.1.0", "@babel/core@^7.12.17", "@babel/core@^7.12.3", "@babel/core@^7.14.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0":
- version "7.16.12"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.12.tgz#5edc53c1b71e54881315923ae2aedea2522bb784"
- integrity sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==
- dependencies:
- "@babel/code-frame" "^7.16.7"
- "@babel/generator" "^7.16.8"
- "@babel/helper-compilation-targets" "^7.16.7"
- "@babel/helper-module-transforms" "^7.16.7"
- "@babel/helpers" "^7.16.7"
- "@babel/parser" "^7.16.12"
- "@babel/template" "^7.16.7"
- "@babel/traverse" "^7.16.10"
- "@babel/types" "^7.16.8"
- convert-source-map "^1.7.0"
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40"
+ integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==
+ dependencies:
+ "@ampproject/remapping" "^2.2.0"
+ "@babel/code-frame" "^7.26.0"
+ "@babel/generator" "^7.26.0"
+ "@babel/helper-compilation-targets" "^7.25.9"
+ "@babel/helper-module-transforms" "^7.26.0"
+ "@babel/helpers" "^7.26.0"
+ "@babel/parser" "^7.26.0"
+ "@babel/template" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
+ "@babel/types" "^7.26.0"
+ convert-source-map "^2.0.0"
debug "^4.1.0"
gensync "^1.0.0-beta.2"
- json5 "^2.1.2"
- semver "^6.3.0"
- source-map "^0.5.0"
-
-"@babel/generator@^7.16.8", "@babel/generator@^7.7.2":
- version "7.16.8"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe"
- integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==
- dependencies:
- "@babel/types" "^7.16.8"
- jsesc "^2.5.1"
- source-map "^0.5.0"
-
-"@babel/helper-annotate-as-pure@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862"
- integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b"
- integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==
- dependencies:
- "@babel/helper-explode-assignable-expression" "^7.16.7"
- "@babel/types" "^7.16.7"
-
-"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b"
- integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==
- dependencies:
- "@babel/compat-data" "^7.16.4"
- "@babel/helper-validator-option" "^7.16.7"
- browserslist "^4.17.5"
- semver "^6.3.0"
-
-"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7":
- version "7.16.10"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz#8a6959b9cc818a88815ba3c5474619e9c0f2c21c"
- integrity sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.16.7"
- "@babel/helper-environment-visitor" "^7.16.7"
- "@babel/helper-function-name" "^7.16.7"
- "@babel/helper-member-expression-to-functions" "^7.16.7"
- "@babel/helper-optimise-call-expression" "^7.16.7"
- "@babel/helper-replace-supers" "^7.16.7"
- "@babel/helper-split-export-declaration" "^7.16.7"
-
-"@babel/helper-create-regexp-features-plugin@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz#0cb82b9bac358eb73bfbd73985a776bfa6b14d48"
- integrity sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.16.7"
- regexpu-core "^4.7.1"
-
-"@babel/helper-define-polyfill-provider@^0.3.1":
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665"
- integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==
+ json5 "^2.2.3"
+ semver "^6.3.1"
+
+"@babel/generator@^7.26.0", "@babel/generator@^7.26.3", "@babel/generator@^7.7.2":
+ version "7.26.3"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019"
+ integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==
+ dependencies:
+ "@babel/parser" "^7.26.3"
+ "@babel/types" "^7.26.3"
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.25"
+ jsesc "^3.0.2"
+
+"@babel/helper-annotate-as-pure@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4"
+ integrity sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==
+ dependencies:
+ "@babel/types" "^7.25.9"
+
+"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875"
+ integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==
+ dependencies:
+ "@babel/compat-data" "^7.25.9"
+ "@babel/helper-validator-option" "^7.25.9"
+ browserslist "^4.24.0"
+ lru-cache "^5.1.1"
+ semver "^6.3.1"
+
+"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz#7644147706bb90ff613297d49ed5266bde729f83"
+ integrity sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.25.9"
+ "@babel/helper-member-expression-to-functions" "^7.25.9"
+ "@babel/helper-optimise-call-expression" "^7.25.9"
+ "@babel/helper-replace-supers" "^7.25.9"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
+ semver "^6.3.1"
+
+"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9":
+ version "7.26.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz#5169756ecbe1d95f7866b90bb555b022595302a0"
+ integrity sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.25.9"
+ regexpu-core "^6.2.0"
+ semver "^6.3.1"
+
+"@babel/helper-define-polyfill-provider@^0.6.2", "@babel/helper-define-polyfill-provider@^0.6.3":
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz#f4f2792fae2ef382074bc2d713522cf24e6ddb21"
+ integrity sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==
dependencies:
- "@babel/helper-compilation-targets" "^7.13.0"
- "@babel/helper-module-imports" "^7.12.13"
- "@babel/helper-plugin-utils" "^7.13.0"
- "@babel/traverse" "^7.13.0"
+ "@babel/helper-compilation-targets" "^7.22.6"
+ "@babel/helper-plugin-utils" "^7.22.5"
debug "^4.1.1"
lodash.debounce "^4.0.8"
resolve "^1.14.2"
- semver "^6.1.2"
-
-"@babel/helper-environment-visitor@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7"
- integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-explode-assignable-expression@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a"
- integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-function-name@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f"
- integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==
- dependencies:
- "@babel/helper-get-function-arity" "^7.16.7"
- "@babel/template" "^7.16.7"
- "@babel/types" "^7.16.7"
-
-"@babel/helper-get-function-arity@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419"
- integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-hoist-variables@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246"
- integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-member-expression-to-functions@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0"
- integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==
- dependencies:
- "@babel/types" "^7.16.7"
-"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437"
- integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-module-transforms@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41"
- integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==
- dependencies:
- "@babel/helper-environment-visitor" "^7.16.7"
- "@babel/helper-module-imports" "^7.16.7"
- "@babel/helper-simple-access" "^7.16.7"
- "@babel/helper-split-export-declaration" "^7.16.7"
- "@babel/helper-validator-identifier" "^7.16.7"
- "@babel/template" "^7.16.7"
- "@babel/traverse" "^7.16.7"
- "@babel/types" "^7.16.7"
-
-"@babel/helper-optimise-call-expression@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2"
- integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5"
- integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==
-
-"@babel/helper-remap-async-to-generator@^7.16.8":
- version "7.16.8"
- resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3"
- integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.16.7"
- "@babel/helper-wrap-function" "^7.16.8"
- "@babel/types" "^7.16.8"
-
-"@babel/helper-replace-supers@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1"
- integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==
- dependencies:
- "@babel/helper-environment-visitor" "^7.16.7"
- "@babel/helper-member-expression-to-functions" "^7.16.7"
- "@babel/helper-optimise-call-expression" "^7.16.7"
- "@babel/traverse" "^7.16.7"
- "@babel/types" "^7.16.7"
-
-"@babel/helper-simple-access@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7"
- integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-skip-transparent-expression-wrappers@^7.16.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09"
- integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==
- dependencies:
- "@babel/types" "^7.16.0"
-
-"@babel/helper-split-export-declaration@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b"
- integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-validator-identifier@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad"
- integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==
-
-"@babel/helper-validator-option@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23"
- integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==
-
-"@babel/helper-wrap-function@^7.16.8":
- version "7.16.8"
- resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200"
- integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==
- dependencies:
- "@babel/helper-function-name" "^7.16.7"
- "@babel/template" "^7.16.7"
- "@babel/traverse" "^7.16.8"
- "@babel/types" "^7.16.8"
-
-"@babel/helpers@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc"
- integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==
- dependencies:
- "@babel/template" "^7.16.7"
- "@babel/traverse" "^7.16.7"
- "@babel/types" "^7.16.7"
-
-"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7":
- version "7.16.10"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88"
- integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==
- dependencies:
- "@babel/helper-validator-identifier" "^7.16.7"
- chalk "^2.0.0"
+"@babel/helper-member-expression-to-functions@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz#9dfffe46f727005a5ea29051ac835fb735e4c1a3"
+ integrity sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==
+ dependencies:
+ "@babel/traverse" "^7.25.9"
+ "@babel/types" "^7.25.9"
+
+"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715"
+ integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==
+ dependencies:
+ "@babel/traverse" "^7.25.9"
+ "@babel/types" "^7.25.9"
+
+"@babel/helper-module-transforms@^7.25.9", "@babel/helper-module-transforms@^7.26.0":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae"
+ integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==
+ dependencies:
+ "@babel/helper-module-imports" "^7.25.9"
+ "@babel/helper-validator-identifier" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
+
+"@babel/helper-optimise-call-expression@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz#3324ae50bae7e2ab3c33f60c9a877b6a0146b54e"
+ integrity sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==
+ dependencies:
+ "@babel/types" "^7.25.9"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46"
+ integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==
+
+"@babel/helper-remap-async-to-generator@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz#e53956ab3d5b9fb88be04b3e2f31b523afd34b92"
+ integrity sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.25.9"
+ "@babel/helper-wrap-function" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
+
+"@babel/helper-replace-supers@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz#ba447224798c3da3f8713fc272b145e33da6a5c5"
+ integrity sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "^7.25.9"
+ "@babel/helper-optimise-call-expression" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9"
+ integrity sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==
+ dependencies:
+ "@babel/traverse" "^7.25.9"
+ "@babel/types" "^7.25.9"
+
+"@babel/helper-string-parser@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c"
+ integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==
+
+"@babel/helper-validator-identifier@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7"
+ integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==
+
+"@babel/helper-validator-option@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72"
+ integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==
+
+"@babel/helper-wrap-function@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz#d99dfd595312e6c894bd7d237470025c85eea9d0"
+ integrity sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==
+ dependencies:
+ "@babel/template" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
+ "@babel/types" "^7.25.9"
+
+"@babel/helpers@^7.26.0":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4"
+ integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==
+ dependencies:
+ "@babel/template" "^7.25.9"
+ "@babel/types" "^7.26.0"
+
+"@babel/highlight@^7.10.4":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.9.tgz#8141ce68fc73757946f983b343f1231f4691acc6"
+ integrity sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.25.9"
+ chalk "^2.4.2"
js-tokens "^4.0.0"
+ picocolors "^1.0.0"
-"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.10", "@babel/parser@^7.16.12", "@babel/parser@^7.16.7":
- version "7.16.12"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.12.tgz#9474794f9a650cf5e2f892444227f98e28cdf8b6"
- integrity sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==
-
-"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050"
- integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
-
-"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9"
- integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
- "@babel/plugin-proposal-optional-chaining" "^7.16.7"
-
-"@babel/plugin-proposal-async-generator-functions@^7.16.8":
- version "7.16.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8"
- integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-remap-async-to-generator" "^7.16.8"
- "@babel/plugin-syntax-async-generators" "^7.8.4"
-
-"@babel/plugin-proposal-class-properties@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0"
- integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==
+"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.3":
+ version "7.26.3"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234"
+ integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/types" "^7.26.3"
-"@babel/plugin-proposal-class-static-block@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz#712357570b612106ef5426d13dc433ce0f200c2a"
- integrity sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw==
+"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz#cc2e53ebf0a0340777fff5ed521943e253b4d8fe"
+ integrity sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/plugin-syntax-class-static-block" "^7.14.5"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
-"@babel/plugin-proposal-dynamic-import@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2"
- integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==
+"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz#af9e4fb63ccb8abcb92375b2fcfe36b60c774d30"
+ integrity sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-proposal-export-namespace-from@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163"
- integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz#e8dc26fcd616e6c5bf2bd0d5a2c151d4f92a9137"
+ integrity sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-proposal-json-strings@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8"
- integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz#807a667f9158acac6f6164b4beb85ad9ebc9e1d1"
+ integrity sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9"
+ "@babel/plugin-transform-optional-chaining" "^7.25.9"
-"@babel/plugin-proposal-logical-assignment-operators@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea"
- integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==
+"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz#de7093f1e7deaf68eadd7cc6b07f2ab82543269e"
+ integrity sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
-"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99"
- integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==
+"@babel/plugin-proposal-class-properties@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3"
+ integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/helper-create-class-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-proposal-numeric-separator@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9"
- integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==
+"@babel/plugin-proposal-private-methods@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea"
+ integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+ "@babel/helper-create-class-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-proposal-object-rest-spread@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz#94593ef1ddf37021a25bdcb5754c4a8d534b01d8"
- integrity sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA==
- dependencies:
- "@babel/compat-data" "^7.16.4"
- "@babel/helper-compilation-targets" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-transform-parameters" "^7.16.7"
-
-"@babel/plugin-proposal-optional-catch-binding@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf"
- integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
-
-"@babel/plugin-proposal-optional-chaining@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a"
- integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
- "@babel/plugin-syntax-optional-chaining" "^7.8.3"
-
-"@babel/plugin-proposal-private-methods@^7.16.11":
- version "7.16.11"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50"
- integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==
- dependencies:
- "@babel/helper-create-class-features-plugin" "^7.16.10"
- "@babel/helper-plugin-utils" "^7.16.7"
-
-"@babel/plugin-proposal-private-property-in-object@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce"
- integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.16.7"
- "@babel/helper-create-class-features-plugin" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
-
-"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2"
- integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
+"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2":
+ version "7.21.0-placeholder-for-preset-env.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703"
+ integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==
"@babel/plugin-syntax-async-generators@^7.8.4":
version "7.8.4"
@@ -435,7 +326,7 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3":
+"@babel/plugin-syntax-class-properties@^7.12.13":
version "7.12.13"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
@@ -449,21 +340,28 @@
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-syntax-dynamic-import@^7.0.0-beta.42", "@babel/plugin-syntax-dynamic-import@^7.8.3":
+"@babel/plugin-syntax-dynamic-import@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-export-namespace-from@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
- integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
+"@babel/plugin-syntax-import-assertions@^7.26.0":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz#620412405058efa56e4a564903b79355020f445f"
+ integrity sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==
dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-syntax-import-meta@^7.8.3":
+"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.26.0":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7"
+ integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-syntax-import-meta@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
@@ -477,14 +375,14 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-jsx@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665"
- integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==
+"@babel/plugin-syntax-jsx@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290"
+ integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
@@ -498,7 +396,7 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3":
+"@babel/plugin-syntax-numeric-separator@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
@@ -533,482 +431,614 @@
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3":
+"@babel/plugin-syntax-top-level-await@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-syntax-typescript@^7.16.7", "@babel/plugin-syntax-typescript@^7.7.2":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8"
- integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==
+"@babel/plugin-syntax-typescript@^7.25.9", "@babel/plugin-syntax-typescript@^7.7.2":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399"
+ integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-arrow-functions@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154"
- integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==
+"@babel/plugin-syntax-unicode-sets-regex@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357"
+ integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-async-to-generator@^7.16.8":
- version "7.16.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808"
- integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==
+"@babel/plugin-transform-arrow-functions@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz#7821d4410bee5daaadbb4cdd9a6649704e176845"
+ integrity sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==
dependencies:
- "@babel/helper-module-imports" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-remap-async-to-generator" "^7.16.8"
-
-"@babel/plugin-transform-block-scoped-functions@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620"
- integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
-
-"@babel/plugin-transform-block-scoping@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87"
- integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
-
-"@babel/plugin-transform-classes@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00"
- integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.16.7"
- "@babel/helper-environment-visitor" "^7.16.7"
- "@babel/helper-function-name" "^7.16.7"
- "@babel/helper-optimise-call-expression" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-replace-supers" "^7.16.7"
- "@babel/helper-split-export-declaration" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-async-generator-functions@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz#1b18530b077d18a407c494eb3d1d72da505283a2"
+ integrity sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-remap-async-to-generator" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
+
+"@babel/plugin-transform-async-to-generator@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz#c80008dacae51482793e5a9c08b39a5be7e12d71"
+ integrity sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-remap-async-to-generator" "^7.25.9"
+
+"@babel/plugin-transform-block-scoped-functions@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz#5700691dbd7abb93de300ca7be94203764fce458"
+ integrity sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-block-scoping@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz#c33665e46b06759c93687ca0f84395b80c0473a1"
+ integrity sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-class-properties@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz#a8ce84fedb9ad512549984101fa84080a9f5f51f"
+ integrity sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-class-static-block@^7.26.0":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz#6c8da219f4eb15cae9834ec4348ff8e9e09664a0"
+ integrity sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-classes@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz#7152457f7880b593a63ade8a861e6e26a4469f52"
+ integrity sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.25.9"
+ "@babel/helper-compilation-targets" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-replace-supers" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
globals "^11.1.0"
-"@babel/plugin-transform-computed-properties@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470"
- integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==
+"@babel/plugin-transform-computed-properties@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz#db36492c78460e534b8852b1d5befe3c923ef10b"
+ integrity sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/template" "^7.25.9"
-"@babel/plugin-transform-destructuring@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz#ca9588ae2d63978a4c29d3f33282d8603f618e23"
- integrity sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A==
+"@babel/plugin-transform-destructuring@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1"
+ integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241"
- integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==
+"@babel/plugin-transform-dotall-regex@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz#bad7945dd07734ca52fe3ad4e872b40ed09bb09a"
+ integrity sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-create-regexp-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-duplicate-keys@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9"
- integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==
+"@babel/plugin-transform-duplicate-keys@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz#8850ddf57dce2aebb4394bb434a7598031059e6d"
+ integrity sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-exponentiation-operator@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b"
- integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==
+"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz#6f7259b4de127721a08f1e5165b852fcaa696d31"
+ integrity sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==
dependencies:
- "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-create-regexp-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-for-of@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c"
- integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==
+"@babel/plugin-transform-dynamic-import@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz#23e917de63ed23c6600c5dd06d94669dce79f7b8"
+ integrity sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-function-name@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf"
- integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==
+"@babel/plugin-transform-exponentiation-operator@^7.25.9":
+ version "7.26.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz#e29f01b6de302c7c2c794277a48f04a9ca7f03bc"
+ integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==
dependencies:
- "@babel/helper-compilation-targets" "^7.16.7"
- "@babel/helper-function-name" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-literals@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1"
- integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==
+"@babel/plugin-transform-export-namespace-from@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz#90745fe55053394f554e40584cda81f2c8a402a2"
+ integrity sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-member-expression-literals@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384"
- integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==
+"@babel/plugin-transform-for-of@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz#4bdc7d42a213397905d89f02350c5267866d5755"
+ integrity sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9"
-"@babel/plugin-transform-modules-amd@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186"
- integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==
+"@babel/plugin-transform-function-name@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz#939d956e68a606661005bfd550c4fc2ef95f7b97"
+ integrity sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==
dependencies:
- "@babel/helper-module-transforms" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
- babel-plugin-dynamic-import-node "^2.3.3"
+ "@babel/helper-compilation-targets" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
-"@babel/plugin-transform-modules-commonjs@^7.12.13", "@babel/plugin-transform-modules-commonjs@^7.16.8":
- version "7.16.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe"
- integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==
+"@babel/plugin-transform-json-strings@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz#c86db407cb827cded902a90c707d2781aaa89660"
+ integrity sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==
dependencies:
- "@babel/helper-module-transforms" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-simple-access" "^7.16.7"
- babel-plugin-dynamic-import-node "^2.3.3"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-modules-systemjs@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7"
- integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==
+"@babel/plugin-transform-literals@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz#1a1c6b4d4aa59bc4cad5b6b3a223a0abd685c9de"
+ integrity sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==
dependencies:
- "@babel/helper-hoist-variables" "^7.16.7"
- "@babel/helper-module-transforms" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-validator-identifier" "^7.16.7"
- babel-plugin-dynamic-import-node "^2.3.3"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-modules-umd@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618"
- integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==
+"@babel/plugin-transform-logical-assignment-operators@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz#b19441a8c39a2fda0902900b306ea05ae1055db7"
+ integrity sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==
dependencies:
- "@babel/helper-module-transforms" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8":
- version "7.16.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252"
- integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==
+"@babel/plugin-transform-member-expression-literals@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz#63dff19763ea64a31f5e6c20957e6a25e41ed5de"
+ integrity sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-new-target@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244"
- integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==
+"@babel/plugin-transform-modules-amd@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz#49ba478f2295101544abd794486cd3088dddb6c5"
+ integrity sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-module-transforms" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-object-super@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94"
- integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==
+"@babel/plugin-transform-modules-commonjs@^7.12.13", "@babel/plugin-transform-modules-commonjs@^7.25.9":
+ version "7.26.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz#8f011d44b20d02c3de44d8850d971d8497f981fb"
+ integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-replace-supers" "^7.16.7"
+ "@babel/helper-module-transforms" "^7.26.0"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-parameters@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f"
- integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==
+"@babel/plugin-transform-modules-systemjs@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz#8bd1b43836269e3d33307151a114bcf3ba6793f8"
+ integrity sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-module-transforms" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-validator-identifier" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
-"@babel/plugin-transform-property-literals@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55"
- integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==
+"@babel/plugin-transform-modules-umd@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz#6710079cdd7c694db36529a1e8411e49fcbf14c9"
+ integrity sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-module-transforms" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-react-display-name@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340"
- integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==
+"@babel/plugin-transform-named-capturing-groups-regex@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz#454990ae6cc22fd2a0fa60b3a2c6f63a38064e6a"
+ integrity sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-create-regexp-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-react-jsx-development@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8"
- integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==
+"@babel/plugin-transform-new-target@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz#42e61711294b105c248336dcb04b77054ea8becd"
+ integrity sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==
dependencies:
- "@babel/plugin-transform-react-jsx" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-react-jsx@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz#86a6a220552afd0e4e1f0388a68a372be7add0d4"
- integrity sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==
+"@babel/plugin-transform-nullish-coalescing-operator@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz#bcb1b0d9e948168102d5f7104375ca21c3266949"
+ integrity sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.16.7"
- "@babel/helper-module-imports" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/plugin-syntax-jsx" "^7.16.7"
- "@babel/types" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-react-pure-annotations@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67"
- integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==
+"@babel/plugin-transform-numeric-separator@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz#bfed75866261a8b643468b0ccfd275f2033214a1"
+ integrity sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-regenerator@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb"
- integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==
+"@babel/plugin-transform-object-rest-spread@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz#0203725025074164808bcf1a2cfa90c652c99f18"
+ integrity sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==
dependencies:
- regenerator-transform "^0.14.2"
+ "@babel/helper-compilation-targets" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/plugin-transform-parameters" "^7.25.9"
-"@babel/plugin-transform-reserved-words@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586"
- integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==
+"@babel/plugin-transform-object-super@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz#385d5de135162933beb4a3d227a2b7e52bb4cf03"
+ integrity sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-replace-supers" "^7.25.9"
-"@babel/plugin-transform-runtime@^7.14.3":
- version "7.16.10"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz#53d9fd3496daedce1dd99639097fa5d14f4c7c2c"
- integrity sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w==
+"@babel/plugin-transform-optional-catch-binding@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz#10e70d96d52bb1f10c5caaac59ac545ea2ba7ff3"
+ integrity sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==
dependencies:
- "@babel/helper-module-imports" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
- babel-plugin-polyfill-corejs2 "^0.3.0"
- babel-plugin-polyfill-corejs3 "^0.5.0"
- babel-plugin-polyfill-regenerator "^0.3.0"
- semver "^6.3.0"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-shorthand-properties@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a"
- integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==
+"@babel/plugin-transform-optional-chaining@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz#e142eb899d26ef715435f201ab6e139541eee7dd"
+ integrity sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9"
-"@babel/plugin-transform-spread@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44"
- integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==
+"@babel/plugin-transform-parameters@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz#b856842205b3e77e18b7a7a1b94958069c7ba257"
+ integrity sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-sticky-regex@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660"
- integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==
+"@babel/plugin-transform-private-methods@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz#847f4139263577526455d7d3223cd8bda51e3b57"
+ integrity sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-create-class-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-template-literals@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab"
- integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==
+"@babel/plugin-transform-private-property-in-object@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz#9c8b73e64e6cc3cbb2743633885a7dd2c385fe33"
+ integrity sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-annotate-as-pure" "^7.25.9"
+ "@babel/helper-create-class-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-typeof-symbol@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e"
- integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==
+"@babel/plugin-transform-property-literals@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz#d72d588bd88b0dec8b62e36f6fda91cedfe28e3f"
+ integrity sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-typescript@^7.16.7":
- version "7.16.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz#591ce9b6b83504903fa9dd3652c357c2ba7a1ee0"
- integrity sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==
+"@babel/plugin-transform-react-display-name@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz#4b79746b59efa1f38c8695065a92a9f5afb24f7d"
+ integrity sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/plugin-syntax-typescript" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-unicode-escapes@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3"
- integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==
+"@babel/plugin-transform-react-jsx-development@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz#8fd220a77dd139c07e25225a903b8be8c829e0d7"
+ integrity sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/plugin-transform-react-jsx" "^7.25.9"
-"@babel/plugin-transform-unicode-regex@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2"
- integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==
+"@babel/plugin-transform-react-jsx@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz#06367940d8325b36edff5e2b9cbe782947ca4166"
+ integrity sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-annotate-as-pure" "^7.25.9"
+ "@babel/helper-module-imports" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/plugin-syntax-jsx" "^7.25.9"
+ "@babel/types" "^7.25.9"
-"@babel/preset-env@^7.14.2":
- version "7.16.11"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982"
- integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==
- dependencies:
- "@babel/compat-data" "^7.16.8"
- "@babel/helper-compilation-targets" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-validator-option" "^7.16.7"
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7"
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7"
- "@babel/plugin-proposal-async-generator-functions" "^7.16.8"
- "@babel/plugin-proposal-class-properties" "^7.16.7"
- "@babel/plugin-proposal-class-static-block" "^7.16.7"
- "@babel/plugin-proposal-dynamic-import" "^7.16.7"
- "@babel/plugin-proposal-export-namespace-from" "^7.16.7"
- "@babel/plugin-proposal-json-strings" "^7.16.7"
- "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7"
- "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7"
- "@babel/plugin-proposal-numeric-separator" "^7.16.7"
- "@babel/plugin-proposal-object-rest-spread" "^7.16.7"
- "@babel/plugin-proposal-optional-catch-binding" "^7.16.7"
- "@babel/plugin-proposal-optional-chaining" "^7.16.7"
- "@babel/plugin-proposal-private-methods" "^7.16.11"
- "@babel/plugin-proposal-private-property-in-object" "^7.16.7"
- "@babel/plugin-proposal-unicode-property-regex" "^7.16.7"
- "@babel/plugin-syntax-async-generators" "^7.8.4"
- "@babel/plugin-syntax-class-properties" "^7.12.13"
- "@babel/plugin-syntax-class-static-block" "^7.14.5"
- "@babel/plugin-syntax-dynamic-import" "^7.8.3"
- "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
- "@babel/plugin-syntax-json-strings" "^7.8.3"
- "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
- "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
- "@babel/plugin-syntax-numeric-separator" "^7.10.4"
- "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
- "@babel/plugin-syntax-optional-chaining" "^7.8.3"
- "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
- "@babel/plugin-syntax-top-level-await" "^7.14.5"
- "@babel/plugin-transform-arrow-functions" "^7.16.7"
- "@babel/plugin-transform-async-to-generator" "^7.16.8"
- "@babel/plugin-transform-block-scoped-functions" "^7.16.7"
- "@babel/plugin-transform-block-scoping" "^7.16.7"
- "@babel/plugin-transform-classes" "^7.16.7"
- "@babel/plugin-transform-computed-properties" "^7.16.7"
- "@babel/plugin-transform-destructuring" "^7.16.7"
- "@babel/plugin-transform-dotall-regex" "^7.16.7"
- "@babel/plugin-transform-duplicate-keys" "^7.16.7"
- "@babel/plugin-transform-exponentiation-operator" "^7.16.7"
- "@babel/plugin-transform-for-of" "^7.16.7"
- "@babel/plugin-transform-function-name" "^7.16.7"
- "@babel/plugin-transform-literals" "^7.16.7"
- "@babel/plugin-transform-member-expression-literals" "^7.16.7"
- "@babel/plugin-transform-modules-amd" "^7.16.7"
- "@babel/plugin-transform-modules-commonjs" "^7.16.8"
- "@babel/plugin-transform-modules-systemjs" "^7.16.7"
- "@babel/plugin-transform-modules-umd" "^7.16.7"
- "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8"
- "@babel/plugin-transform-new-target" "^7.16.7"
- "@babel/plugin-transform-object-super" "^7.16.7"
- "@babel/plugin-transform-parameters" "^7.16.7"
- "@babel/plugin-transform-property-literals" "^7.16.7"
- "@babel/plugin-transform-regenerator" "^7.16.7"
- "@babel/plugin-transform-reserved-words" "^7.16.7"
- "@babel/plugin-transform-shorthand-properties" "^7.16.7"
- "@babel/plugin-transform-spread" "^7.16.7"
- "@babel/plugin-transform-sticky-regex" "^7.16.7"
- "@babel/plugin-transform-template-literals" "^7.16.7"
- "@babel/plugin-transform-typeof-symbol" "^7.16.7"
- "@babel/plugin-transform-unicode-escapes" "^7.16.7"
- "@babel/plugin-transform-unicode-regex" "^7.16.7"
- "@babel/preset-modules" "^0.1.5"
- "@babel/types" "^7.16.8"
- babel-plugin-polyfill-corejs2 "^0.3.0"
- babel-plugin-polyfill-corejs3 "^0.5.0"
- babel-plugin-polyfill-regenerator "^0.3.0"
- core-js-compat "^3.20.2"
- semver "^6.3.0"
+"@babel/plugin-transform-react-pure-annotations@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz#ea1c11b2f9dbb8e2d97025f43a3b5bc47e18ae62"
+ integrity sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/preset-modules@^0.1.5":
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9"
- integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==
+"@babel/plugin-transform-regenerator@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz#03a8a4670d6cebae95305ac6defac81ece77740b"
+ integrity sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.9"
+ regenerator-transform "^0.15.2"
+
+"@babel/plugin-transform-regexp-modifiers@^7.26.0":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz#2f5837a5b5cd3842a919d8147e9903cc7455b850"
+ integrity sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-reserved-words@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz#0398aed2f1f10ba3f78a93db219b27ef417fb9ce"
+ integrity sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-runtime@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz#62723ea3f5b31ffbe676da9d6dae17138ae580ea"
+ integrity sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ babel-plugin-polyfill-corejs2 "^0.4.10"
+ babel-plugin-polyfill-corejs3 "^0.10.6"
+ babel-plugin-polyfill-regenerator "^0.6.1"
+ semver "^6.3.1"
+
+"@babel/plugin-transform-shorthand-properties@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz#bb785e6091f99f826a95f9894fc16fde61c163f2"
+ integrity sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-spread@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz#24a35153931b4ba3d13cec4a7748c21ab5514ef9"
+ integrity sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9"
+
+"@babel/plugin-transform-sticky-regex@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz#c7f02b944e986a417817b20ba2c504dfc1453d32"
+ integrity sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-template-literals@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz#6dbd4a24e8fad024df76d1fac6a03cf413f60fe1"
+ integrity sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-typeof-symbol@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz#224ba48a92869ddbf81f9b4a5f1204bbf5a2bc4b"
+ integrity sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-typescript@^7.25.9":
+ version "7.26.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz#3d6add9c78735623317387ee26d5ada540eee3fd"
+ integrity sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.25.9"
+ "@babel/helper-create-class-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9"
+ "@babel/plugin-syntax-typescript" "^7.25.9"
+
+"@babel/plugin-transform-unicode-escapes@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz#a75ef3947ce15363fccaa38e2dd9bc70b2788b82"
+ integrity sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-unicode-property-regex@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz#a901e96f2c1d071b0d1bb5dc0d3c880ce8f53dd3"
+ integrity sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-unicode-regex@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz#5eae747fe39eacf13a8bd006a4fb0b5d1fa5e9b1"
+ integrity sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-unicode-sets-regex@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz#65114c17b4ffc20fa5b163c63c70c0d25621fabe"
+ integrity sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/preset-env@^7.14.2":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.26.0.tgz#30e5c6bc1bcc54865bff0c5a30f6d4ccdc7fa8b1"
+ integrity sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==
+ dependencies:
+ "@babel/compat-data" "^7.26.0"
+ "@babel/helper-compilation-targets" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-validator-option" "^7.25.9"
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9"
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9"
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.9"
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.9"
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.9"
+ "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2"
+ "@babel/plugin-syntax-import-assertions" "^7.26.0"
+ "@babel/plugin-syntax-import-attributes" "^7.26.0"
+ "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6"
+ "@babel/plugin-transform-arrow-functions" "^7.25.9"
+ "@babel/plugin-transform-async-generator-functions" "^7.25.9"
+ "@babel/plugin-transform-async-to-generator" "^7.25.9"
+ "@babel/plugin-transform-block-scoped-functions" "^7.25.9"
+ "@babel/plugin-transform-block-scoping" "^7.25.9"
+ "@babel/plugin-transform-class-properties" "^7.25.9"
+ "@babel/plugin-transform-class-static-block" "^7.26.0"
+ "@babel/plugin-transform-classes" "^7.25.9"
+ "@babel/plugin-transform-computed-properties" "^7.25.9"
+ "@babel/plugin-transform-destructuring" "^7.25.9"
+ "@babel/plugin-transform-dotall-regex" "^7.25.9"
+ "@babel/plugin-transform-duplicate-keys" "^7.25.9"
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9"
+ "@babel/plugin-transform-dynamic-import" "^7.25.9"
+ "@babel/plugin-transform-exponentiation-operator" "^7.25.9"
+ "@babel/plugin-transform-export-namespace-from" "^7.25.9"
+ "@babel/plugin-transform-for-of" "^7.25.9"
+ "@babel/plugin-transform-function-name" "^7.25.9"
+ "@babel/plugin-transform-json-strings" "^7.25.9"
+ "@babel/plugin-transform-literals" "^7.25.9"
+ "@babel/plugin-transform-logical-assignment-operators" "^7.25.9"
+ "@babel/plugin-transform-member-expression-literals" "^7.25.9"
+ "@babel/plugin-transform-modules-amd" "^7.25.9"
+ "@babel/plugin-transform-modules-commonjs" "^7.25.9"
+ "@babel/plugin-transform-modules-systemjs" "^7.25.9"
+ "@babel/plugin-transform-modules-umd" "^7.25.9"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9"
+ "@babel/plugin-transform-new-target" "^7.25.9"
+ "@babel/plugin-transform-nullish-coalescing-operator" "^7.25.9"
+ "@babel/plugin-transform-numeric-separator" "^7.25.9"
+ "@babel/plugin-transform-object-rest-spread" "^7.25.9"
+ "@babel/plugin-transform-object-super" "^7.25.9"
+ "@babel/plugin-transform-optional-catch-binding" "^7.25.9"
+ "@babel/plugin-transform-optional-chaining" "^7.25.9"
+ "@babel/plugin-transform-parameters" "^7.25.9"
+ "@babel/plugin-transform-private-methods" "^7.25.9"
+ "@babel/plugin-transform-private-property-in-object" "^7.25.9"
+ "@babel/plugin-transform-property-literals" "^7.25.9"
+ "@babel/plugin-transform-regenerator" "^7.25.9"
+ "@babel/plugin-transform-regexp-modifiers" "^7.26.0"
+ "@babel/plugin-transform-reserved-words" "^7.25.9"
+ "@babel/plugin-transform-shorthand-properties" "^7.25.9"
+ "@babel/plugin-transform-spread" "^7.25.9"
+ "@babel/plugin-transform-sticky-regex" "^7.25.9"
+ "@babel/plugin-transform-template-literals" "^7.25.9"
+ "@babel/plugin-transform-typeof-symbol" "^7.25.9"
+ "@babel/plugin-transform-unicode-escapes" "^7.25.9"
+ "@babel/plugin-transform-unicode-property-regex" "^7.25.9"
+ "@babel/plugin-transform-unicode-regex" "^7.25.9"
+ "@babel/plugin-transform-unicode-sets-regex" "^7.25.9"
+ "@babel/preset-modules" "0.1.6-no-external-plugins"
+ babel-plugin-polyfill-corejs2 "^0.4.10"
+ babel-plugin-polyfill-corejs3 "^0.10.6"
+ babel-plugin-polyfill-regenerator "^0.6.1"
+ core-js-compat "^3.38.1"
+ semver "^6.3.1"
+
+"@babel/preset-modules@0.1.6-no-external-plugins":
+ version "0.1.6-no-external-plugins"
+ resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a"
+ integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
- "@babel/plugin-transform-dotall-regex" "^7.4.4"
"@babel/types" "^7.4.4"
esutils "^2.0.2"
"@babel/preset-react@^7.13.13":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.7.tgz#4c18150491edc69c183ff818f9f2aecbe5d93852"
- integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==
+ version "7.26.3"
+ resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.26.3.tgz#7c5e028d623b4683c1f83a0bd4713b9100560caa"
+ integrity sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-validator-option" "^7.16.7"
- "@babel/plugin-transform-react-display-name" "^7.16.7"
- "@babel/plugin-transform-react-jsx" "^7.16.7"
- "@babel/plugin-transform-react-jsx-development" "^7.16.7"
- "@babel/plugin-transform-react-pure-annotations" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-validator-option" "^7.25.9"
+ "@babel/plugin-transform-react-display-name" "^7.25.9"
+ "@babel/plugin-transform-react-jsx" "^7.25.9"
+ "@babel/plugin-transform-react-jsx-development" "^7.25.9"
+ "@babel/plugin-transform-react-pure-annotations" "^7.25.9"
"@babel/preset-typescript@^7.13.0":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz#ab114d68bb2020afc069cd51b37ff98a046a70b9"
- integrity sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz#4a570f1b8d104a242d923957ffa1eaff142a106d"
+ integrity sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-validator-option" "^7.16.7"
- "@babel/plugin-transform-typescript" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-validator-option" "^7.25.9"
+ "@babel/plugin-syntax-jsx" "^7.25.9"
+ "@babel/plugin-transform-modules-commonjs" "^7.25.9"
+ "@babel/plugin-transform-typescript" "^7.25.9"
-"@babel/runtime@^7.10.5", "@babel/runtime@^7.12.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7":
- version "7.23.2"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885"
- integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==
+"@babel/runtime@^7.10.5", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1"
+ integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==
dependencies:
regenerator-runtime "^0.14.0"
-"@babel/runtime@^7.12.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa"
- integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==
- dependencies:
- regenerator-runtime "^0.13.4"
-
-"@babel/template@^7.16.7", "@babel/template@^7.3.3":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155"
- integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==
- dependencies:
- "@babel/code-frame" "^7.16.7"
- "@babel/parser" "^7.16.7"
- "@babel/types" "^7.16.7"
-
-"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.10", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.7.2":
- version "7.16.10"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.10.tgz#448f940defbe95b5a8029975b051f75993e8239f"
- integrity sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==
- dependencies:
- "@babel/code-frame" "^7.16.7"
- "@babel/generator" "^7.16.8"
- "@babel/helper-environment-visitor" "^7.16.7"
- "@babel/helper-function-name" "^7.16.7"
- "@babel/helper-hoist-variables" "^7.16.7"
- "@babel/helper-split-export-declaration" "^7.16.7"
- "@babel/parser" "^7.16.10"
- "@babel/types" "^7.16.8"
- debug "^4.1.0"
+"@babel/template@^7.25.9", "@babel/template@^7.3.3":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016"
+ integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==
+ dependencies:
+ "@babel/code-frame" "^7.25.9"
+ "@babel/parser" "^7.25.9"
+ "@babel/types" "^7.25.9"
+
+"@babel/traverse@^7.25.9", "@babel/traverse@^7.7.2":
+ version "7.26.4"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd"
+ integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==
+ dependencies:
+ "@babel/code-frame" "^7.26.2"
+ "@babel/generator" "^7.26.3"
+ "@babel/parser" "^7.26.3"
+ "@babel/template" "^7.25.9"
+ "@babel/types" "^7.26.3"
+ debug "^4.3.1"
globals "^11.1.0"
-"@babel/types@^7.0.0", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
- version "7.16.8"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1"
- integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==
+"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.3", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
+ version "7.26.3"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0"
+ integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==
dependencies:
- "@babel/helper-validator-identifier" "^7.16.7"
- to-fast-properties "^2.0.0"
+ "@babel/helper-string-parser" "^7.25.9"
+ "@babel/helper-validator-identifier" "^7.25.9"
"@ballerina/highlightjs-ballerina@^1.0.1":
version "1.0.1"
@@ -1020,17 +1050,17 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
-"@bugsnag/browser@^7.16.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@bugsnag/browser/-/browser-7.16.0.tgz#c72d956ade84db0707a40412fff9cf8bf8c8d2d1"
- integrity sha512-lVNVgGcesc2M8DJoy2i3e1iaFmPI5WfFU9vzmRrZN3MGXHMn/JYpHwl0cIjbQOOqmV4W7l3/8jshWXtgDDDTaw==
+"@bugsnag/browser@^7.25.0":
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@bugsnag/browser/-/browser-7.25.0.tgz#aa56a8e138dfff268ac29c5fe374cfc3c9b42a76"
+ integrity sha512-PzzWy5d9Ly1CU1KkxTB6ZaOw/dO+CYSfVtqxVJccy832e6+7rW/dvSw5Jy7rsNhgcKSKjZq86LtNkPSvritOLA==
dependencies:
- "@bugsnag/core" "^7.16.0"
+ "@bugsnag/core" "^7.25.0"
-"@bugsnag/core@^7.16.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@bugsnag/core/-/core-7.16.0.tgz#5f21be75325b8193faf0953cc79fa2f97576b1d2"
- integrity sha512-nqf1DteuQ+4+qQFIYn1aNaw58TS0PlVNkOxtJomOyKK+XGwEPHl/oae7XNmxpVujmnXRZPztFfD3AvTVlRlwWA==
+"@bugsnag/core@^7.25.0":
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@bugsnag/core/-/core-7.25.0.tgz#ee4dbc66dba4adc65717a3a8bf05dca55790e218"
+ integrity sha512-JZLak1b5BVzy77CPcklViZrppac/pE07L3uSDmfSvFYSCGReXkik2txOgV05VlF9EDe36dtUAIIV7iAPDfFpQQ==
dependencies:
"@bugsnag/cuid" "^3.0.0"
"@bugsnag/safe-json-stringify" "^6.0.0"
@@ -1039,24 +1069,24 @@
stack-generator "^2.0.3"
"@bugsnag/cuid@^3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@bugsnag/cuid/-/cuid-3.0.0.tgz#2ee7642a30aee6dc86f5e7f824653741e42e5c35"
- integrity sha512-LOt8aaBI+KvOQGneBtpuCz3YqzyEAehd1f3nC5yr9TIYW1+IzYKa2xWS4EiMz5pPOnRPHkyyS5t/wmSmN51Gjg==
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/@bugsnag/cuid/-/cuid-3.1.1.tgz#dbd5d76559f6b7a66306fceacf503888883da514"
+ integrity sha512-d2z4b0rEo3chI07FNN1Xds8v25CNeekecU6FC/2Fs9MxY2EipkZTThVcV2YinMn8dvRUlViKOyC50evoUxg8tw==
"@bugsnag/js@^7.10.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@bugsnag/js/-/js-7.16.0.tgz#63215a9606df6635ed706b96e30515b5183edc8b"
- integrity sha512-0PVzQatQZDcD8ajPVWnd4tpZCJrM6H56Z9HJEkF35iehkWdCdJR2T22dba2SJ46sgV/YYeQqNkBpg9j9QcBCxw==
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@bugsnag/js/-/js-7.25.0.tgz#339d5c4815a8c141a4056759184636a64404ad89"
+ integrity sha512-d8n8SyKdRUz8jMacRW1j/Sj/ckhKbIEp49+Dacp3CS8afRgfMZ//NXhUFFXITsDP5cXouaejR9fx4XVapYXNgg==
dependencies:
- "@bugsnag/browser" "^7.16.0"
- "@bugsnag/node" "^7.16.0"
+ "@bugsnag/browser" "^7.25.0"
+ "@bugsnag/node" "^7.25.0"
-"@bugsnag/node@^7.16.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@bugsnag/node/-/node-7.16.0.tgz#276f0d0a5fd4cd5536269d896bfd533a7dafd2ce"
- integrity sha512-Iyl62gZ1Rl3o8VVSKgmqOFSTJwAKrE106WQ3oAlzWLs5Px91hKnMrxEnV3IrOVZagTy+TowNKgBKs9tk3zXo1Q==
+"@bugsnag/node@^7.25.0":
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@bugsnag/node/-/node-7.25.0.tgz#ce00920ce290333114f33e5167397c6b1657cb47"
+ integrity sha512-KlxBaJ8EREEsfKInybAjTO9LmdDXV3cUH5+XNXyqUZrcRVuPOu4j4xvljh+n24ifok/wbFZTKVXUzrN4iKIeIA==
dependencies:
- "@bugsnag/core" "^7.16.0"
+ "@bugsnag/core" "^7.25.0"
byline "^5.0.0"
error-stack-parser "^2.0.2"
iserror "^0.0.2"
@@ -1064,9 +1094,9 @@
stack-generator "^2.0.3"
"@bugsnag/plugin-react@^7.19.0":
- version "7.19.0"
- resolved "https://registry.yarnpkg.com/@bugsnag/plugin-react/-/plugin-react-7.19.0.tgz#3f86c6ed2745cd60a4099d0e14ca46f2b9cf501f"
- integrity sha512-owC4QXYJWGllMoOPcH5P7sbDIDuFLMCbjGAU6FwH5mBMObSQo+1ViSKImlTJQUFXATM8ySISTBVt7w3C6FFHng==
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@bugsnag/plugin-react/-/plugin-react-7.25.0.tgz#20c9252b399586d9588ec28320c3da1f89854031"
+ integrity sha512-evlH2Aai7vBQsTNt1sP0Pq7uwCdaQR6DOwrZmfA6W6h0eJzTDdlq1jl94NbfHTIMM62zGcDx6ZT/1Q87utnvtA==
"@bugsnag/safe-json-stringify@^6.0.0":
version "6.0.0"
@@ -1081,60 +1111,26 @@
exec-sh "^0.3.2"
minimist "^1.2.0"
-"@codemirror/autocomplete@^0.19.0":
- version "0.19.15"
- resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-0.19.15.tgz#061f09063dc2a68668d85d7ac8430c7bc6df1a82"
- integrity sha512-GQWzvvuXxNUyaEk+5gawbAD8s51/v2Chb++nx0e2eGWrphWk42isBtzOMdc3DxrxrZtPZ55q2ldNp+6G8KJLIQ==
- dependencies:
- "@codemirror/language" "^0.19.0"
- "@codemirror/state" "^0.19.4"
- "@codemirror/text" "^0.19.2"
- "@codemirror/tooltip" "^0.19.12"
- "@codemirror/view" "^0.19.0"
- "@lezer/common" "^0.15.0"
-
-"@codemirror/autocomplete@^6.0.0", "@codemirror/autocomplete@^6.3.2":
- version "6.15.0"
- resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.15.0.tgz#37bc320f20cdda332d6bf4d1fc7f300f8fc5f04c"
- integrity sha512-G2Zm0mXznxz97JhaaOdoEG2cVupn4JjPaS4AcNvZzhOsnnG9YVN68VzfoUw6dYTsIxT6a/cmoFEN47KAWhXaOg==
- dependencies:
- "@codemirror/language" "^6.0.0"
- "@codemirror/state" "^6.0.0"
- "@codemirror/view" "^6.17.0"
- "@lezer/common" "^1.0.0"
-
-"@codemirror/autocomplete@^6.15.0":
- version "6.16.0"
- resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.16.0.tgz#595eb30099ba91a835ed65ed8ff7497388f604b3"
- integrity sha512-P/LeCTtZHRTCU4xQsa89vSKWecYv1ZqwzOd5topheGRf+qtacFgBeIMQi3eL8Kt/BUNvxUWkx+5qP2jlGoARrg==
+"@codemirror/autocomplete@^6.0.0", "@codemirror/autocomplete@^6.10.2", "@codemirror/autocomplete@^6.15.0", "@codemirror/autocomplete@^6.3.2":
+ version "6.18.4"
+ resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.18.4.tgz#4394f55d6771727179f2e28a871ef46bbbeb11b1"
+ integrity sha512-sFAphGQIqyQZfP2ZBsSHV7xQvo9Py0rV0dW7W3IMRdS+zDuNb2l3no78CvUaWKGfzFjI4FTrLdUSj86IGb2hRA==
dependencies:
"@codemirror/language" "^6.0.0"
"@codemirror/state" "^6.0.0"
"@codemirror/view" "^6.17.0"
"@lezer/common" "^1.0.0"
-"@codemirror/commands@^6.0.0":
- version "6.3.3"
- resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.3.3.tgz#03face5bf5f3de0fc4e09b177b3c91eda2ceb7e9"
- integrity sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==
+"@codemirror/commands@^6.0.0", "@codemirror/commands@^6.7.1":
+ version "6.7.1"
+ resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.7.1.tgz#04561e95bc0779eaa49efd63e916c4efb3bbf6d6"
+ integrity sha512-llTrboQYw5H4THfhN4U3qCnSZ1SOJ60ohhz+SzU0ADGtwlc533DtklQP0vSFaQuCPDn3BPpOd1GbbnUtwNjsrw==
dependencies:
"@codemirror/language" "^6.0.0"
"@codemirror/state" "^6.4.0"
- "@codemirror/view" "^6.0.0"
+ "@codemirror/view" "^6.27.0"
"@lezer/common" "^1.1.0"
-"@codemirror/highlight@^0.19.0":
- version "0.19.8"
- resolved "https://registry.yarnpkg.com/@codemirror/highlight/-/highlight-0.19.8.tgz#a95aee8ae4389b01f820aa79c48f7b4388087d92"
- integrity sha512-v/lzuHjrYR8MN2mEJcUD6fHSTXXli9C1XGYpr+ElV6fLBIUhMTNKR3qThp611xuWfXfwDxeL7ppcbkM/MzPV3A==
- dependencies:
- "@codemirror/language" "^0.19.0"
- "@codemirror/rangeset" "^0.19.0"
- "@codemirror/state" "^0.19.3"
- "@codemirror/view" "^0.19.39"
- "@lezer/common" "^0.15.0"
- style-mod "^4.0.0"
-
"@codemirror/lang-cpp@^6.0.2":
version "6.0.2"
resolved "https://registry.yarnpkg.com/@codemirror/lang-cpp/-/lang-cpp-6.0.2.tgz#076c98340c3beabde016d7d83e08eebe17254ef9"
@@ -1144,20 +1140,20 @@
"@lezer/cpp" "^1.0.0"
"@codemirror/lang-css@^6.0.0":
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/@codemirror/lang-css/-/lang-css-6.2.1.tgz#5dc0a43b8e3c31f6af7aabd55ff07fe9aef2a227"
- integrity sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/@codemirror/lang-css/-/lang-css-6.3.1.tgz#763ca41aee81bb2431be55e3cfcc7cc8e91421a3"
+ integrity sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==
dependencies:
"@codemirror/autocomplete" "^6.0.0"
"@codemirror/language" "^6.0.0"
"@codemirror/state" "^6.0.0"
"@lezer/common" "^1.0.2"
- "@lezer/css" "^1.0.0"
+ "@lezer/css" "^1.1.7"
"@codemirror/lang-html@^6.0.0":
- version "6.4.8"
- resolved "https://registry.yarnpkg.com/@codemirror/lang-html/-/lang-html-6.4.8.tgz#961db9b1037efcb1d0f50ae6082e5a367fa1470c"
- integrity sha512-tE2YK7wDlb9ZpAH6mpTPiYm6rhfdQKVDa5r9IwIFlwwgvVaKsCfuKKZoJGWsmMZIf3FQAuJ5CHMPLymOtg1hXw==
+ version "6.4.9"
+ resolved "https://registry.yarnpkg.com/@codemirror/lang-html/-/lang-html-6.4.9.tgz#d586f2cc9c341391ae07d1d7c545990dfa069727"
+ integrity sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==
dependencies:
"@codemirror/autocomplete" "^6.0.0"
"@codemirror/lang-css" "^6.0.0"
@@ -1177,7 +1173,7 @@
"@codemirror/language" "^6.0.0"
"@lezer/java" "^1.0.0"
-"@codemirror/lang-javascript@^6.0.0", "@codemirror/lang-javascript@^6.2.2":
+"@codemirror/lang-javascript@^6.0.0", "@codemirror/lang-javascript@^6.2.1":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@codemirror/lang-javascript/-/lang-javascript-6.2.2.tgz#7141090b22994bef85bcc5608a3bc1257f2db2ad"
integrity sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==
@@ -1202,9 +1198,9 @@
"@lezer/php" "^1.0.0"
"@codemirror/lang-python@^6.1.5":
- version "6.1.5"
- resolved "https://registry.yarnpkg.com/@codemirror/lang-python/-/lang-python-6.1.5.tgz#1cb891dd82bbc27ec1c80469218637650bb2143d"
- integrity sha512-hCm+8X6wrnXJCGf+QhmFu1AXkdTVG7dHy0Ly6SI1N3SRPptaMvwX6oNQonOXOMPvmcjiB0xq342KAxX3BYpijw==
+ version "6.1.6"
+ resolved "https://registry.yarnpkg.com/@codemirror/lang-python/-/lang-python-6.1.6.tgz#0c55e7e2dfa85b68be93b9692e5d3f76f284bbb2"
+ integrity sha512-ai+01WfZhWqM92UqjnvorkxosZ2aq2u28kHvr+N3gu012XqY2CThD67JPMHnGceRfXPDBmn1HnyqowdpF57bNg==
dependencies:
"@codemirror/autocomplete" "^6.3.2"
"@codemirror/language" "^6.8.0"
@@ -1221,44 +1217,22 @@
"@lezer/rust" "^1.0.0"
"@codemirror/lang-yaml@^6.1.1":
- version "6.1.1"
- resolved "https://registry.yarnpkg.com/@codemirror/lang-yaml/-/lang-yaml-6.1.1.tgz#6f6e4e16c5a4e6d549f462c9dc2053439e070d0d"
- integrity sha512-HV2NzbK9bbVnjWxwObuZh5FuPCowx51mEfoFT9y3y+M37fA3+pbxx4I7uePuygFzDsAmCTwQSc/kXh/flab4uw==
+ version "6.1.2"
+ resolved "https://registry.yarnpkg.com/@codemirror/lang-yaml/-/lang-yaml-6.1.2.tgz#c84280c68fa7af456a355d91183b5e537e9b7038"
+ integrity sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw==
dependencies:
"@codemirror/autocomplete" "^6.0.0"
"@codemirror/language" "^6.0.0"
"@codemirror/state" "^6.0.0"
"@lezer/common" "^1.2.0"
"@lezer/highlight" "^1.2.0"
- "@lezer/yaml" "^1.0.0"
-
-"@codemirror/language@^0.19.0":
- version "0.19.10"
- resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-0.19.10.tgz#c3d1330fa5de778c6b6b5177af5572a3d9d596b5"
- integrity sha512-yA0DZ3RYn2CqAAGW62VrU8c4YxscMQn45y/I9sjBlqB1e2OTQLg4CCkMBuMSLXk4xaqjlsgazeOQWaJQOKfV8Q==
- dependencies:
- "@codemirror/state" "^0.19.0"
- "@codemirror/text" "^0.19.0"
- "@codemirror/view" "^0.19.0"
- "@lezer/common" "^0.15.5"
- "@lezer/lr" "^0.15.0"
-
-"@codemirror/language@^6.0.0", "@codemirror/language@^6.10.1", "@codemirror/language@^6.4.0", "@codemirror/language@^6.6.0", "@codemirror/language@^6.8.0":
- version "6.10.1"
- resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.10.1.tgz#428c932a158cb75942387acfe513c1ece1090b05"
- integrity sha512-5GrXzrhq6k+gL5fjkAwt90nYDmjlzTIJV8THnxNFtNKWotMIlzzN+CpqxqwXOECnUdOndmSeWntVrVcv5axWRQ==
- dependencies:
- "@codemirror/state" "^6.0.0"
- "@codemirror/view" "^6.23.0"
- "@lezer/common" "^1.1.0"
- "@lezer/highlight" "^1.0.0"
"@lezer/lr" "^1.0.0"
- style-mod "^4.0.0"
+ "@lezer/yaml" "^1.0.0"
-"@codemirror/language@^6.10.2":
- version "6.10.2"
- resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.10.2.tgz#4056dc219619627ffe995832eeb09cea6060be61"
- integrity sha512-kgbTYTo0Au6dCSc/TFy7fK3fpJmgHDv1sG1KNQKJXVi+xBTEeBPY/M30YXiU6mMXeH+YIDLsbrT4ZwNRdtF+SA==
+"@codemirror/language@^6.0.0", "@codemirror/language@^6.10.1", "@codemirror/language@^6.4.0", "@codemirror/language@^6.6.0", "@codemirror/language@^6.8.0", "@codemirror/language@^6.9.1":
+ version "6.10.8"
+ resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.10.8.tgz#3e3a346a2b0a8cf63ee1cfe03349eb1965dce5f9"
+ integrity sha512-wcP8XPPhDH2vTqf181U8MbZnW+tDyPYy0UzVOa+oHORjyT+mhhom9vBd7dApJwoDz9Nb/a8kHjJIsuA/t8vNFw==
dependencies:
"@codemirror/state" "^6.0.0"
"@codemirror/view" "^6.23.0"
@@ -1268,65 +1242,36 @@
style-mod "^4.0.0"
"@codemirror/legacy-modes@^6.4.0":
- version "6.4.0"
- resolved "https://registry.yarnpkg.com/@codemirror/legacy-modes/-/legacy-modes-6.4.0.tgz#3cf7a863da5deebbd7bf9a90f12f89f06cca6d46"
- integrity sha512-5m/K+1A6gYR0e+h/dEde7LoGimMjRtWXZFg4Lo70cc8HzjSdHe3fLwjWMR0VRl5KFT1SxalSap7uMgPKF28wBA==
+ version "6.4.2"
+ resolved "https://registry.yarnpkg.com/@codemirror/legacy-modes/-/legacy-modes-6.4.2.tgz#723a55aae21304d4c112575943d3467c9040d217"
+ integrity sha512-HsvWu08gOIIk303eZQCal4H4t65O/qp1V4ul4zVa3MHK5FJ0gz3qz3O55FIkm+aQUcshUOjBx38t2hPiJwW5/g==
dependencies:
"@codemirror/language" "^6.0.0"
"@codemirror/lint@^6.0.0":
- version "6.5.0"
- resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.5.0.tgz#ea43b6e653dcc5bcd93456b55e9fe62e63f326d9"
- integrity sha512-+5YyicIaaAZKU8K43IQi8TBy6mF6giGeWAH7N96Z5LC30Wm5JMjqxOYIE9mxwMG1NbhT2mA3l9hA4uuKUM3E5g==
+ version "6.8.4"
+ resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.8.4.tgz#7d8aa5d1a6dec89ffcc23ad45ddca2e12e90982d"
+ integrity sha512-u4q7PnZlJUojeRe8FJa/njJcMctISGgPQ4PnWsd9268R4ZTtU+tfFYmwkBvgcrK2+QQ8tYFVALVb5fVJykKc5A==
dependencies:
"@codemirror/state" "^6.0.0"
- "@codemirror/view" "^6.0.0"
+ "@codemirror/view" "^6.35.0"
crelt "^1.0.5"
-"@codemirror/rangeset@^0.19.0", "@codemirror/rangeset@^0.19.5":
- version "0.19.9"
- resolved "https://registry.yarnpkg.com/@codemirror/rangeset/-/rangeset-0.19.9.tgz#e80895de93c39dc7899f5be31d368c9d88aa4efc"
- integrity sha512-V8YUuOvK+ew87Xem+71nKcqu1SXd5QROMRLMS/ljT5/3MCxtgrRie1Cvild0G/Z2f1fpWxzX78V0U4jjXBorBQ==
- dependencies:
- "@codemirror/state" "^0.19.0"
-
"@codemirror/search@^6.0.0":
- version "6.5.6"
- resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.5.6.tgz#8f858b9e678d675869112e475f082d1e8488db93"
- integrity sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q==
+ version "6.5.8"
+ resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.5.8.tgz#b59b3659b46184cc75d6108d7c050a4ca344c3a0"
+ integrity sha512-PoWtZvo7c1XFeZWmmyaOp2G0XVbOnm+fJzvghqGAktBW3cufwJUWvSCcNG0ppXiBEM05mZu6RhMtXPv2hpllig==
dependencies:
"@codemirror/state" "^6.0.0"
"@codemirror/view" "^6.0.0"
crelt "^1.0.5"
-"@codemirror/state@^0.19.0", "@codemirror/state@^0.19.3", "@codemirror/state@^0.19.4":
- version "0.19.9"
- resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-0.19.9.tgz#b797f9fbc204d6dc7975485e231693c09001b0dd"
- integrity sha512-psOzDolKTZkx4CgUqhBQ8T8gBc0xN5z4gzed109aF6x7D7umpDRoimacI/O6d9UGuyl4eYuDCZmDFr2Rq7aGOw==
+"@codemirror/state@6.5.0", "@codemirror/state@^6.0.0", "@codemirror/state@^6.4.0", "@codemirror/state@^6.5.0":
+ version "6.5.0"
+ resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.5.0.tgz#e98dde85620618651543152fe1c2483300a0ccc9"
+ integrity sha512-MwBHVK60IiIHDcoMet78lxt6iw5gJOGSbNbOIVBHWVXIH4/Nq1+GQgLLGgI1KlnN86WDXsPudVaqYHKBIx7Eyw==
dependencies:
- "@codemirror/text" "^0.19.0"
-
-"@codemirror/state@^6.0.0", "@codemirror/state@^6.4.0":
- version "6.4.1"
- resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.4.1.tgz#da57143695c056d9a3c38705ed34136e2b68171b"
- integrity sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==
-
-"@codemirror/stream-parser@^0.19.0":
- version "0.19.9"
- resolved "https://registry.yarnpkg.com/@codemirror/stream-parser/-/stream-parser-0.19.9.tgz#34955ea91a8047cf72abebd5ce28f0d332aeca48"
- integrity sha512-WTmkEFSRCetpk8xIOvV2yyXdZs3DgYckM0IP7eFi4ewlxWnJO/H4BeJZLs4wQaydWsAqTQoDyIwNH1BCzK5LUQ==
- dependencies:
- "@codemirror/highlight" "^0.19.0"
- "@codemirror/language" "^0.19.0"
- "@codemirror/state" "^0.19.0"
- "@codemirror/text" "^0.19.0"
- "@lezer/common" "^0.15.0"
- "@lezer/lr" "^0.15.0"
-
-"@codemirror/text@^0.19.0", "@codemirror/text@^0.19.2":
- version "0.19.6"
- resolved "https://registry.yarnpkg.com/@codemirror/text/-/text-0.19.6.tgz#9adcbd8137f69b75518eacd30ddb16fd67bbac45"
- integrity sha512-T9jnREMIygx+TPC1bOuepz18maGq/92q2a+n4qTqObKwvNMg+8cMTslb8yxeEDEq7S3kpgGWxgO1UWbQRij0dA==
+ "@marijn/find-cluster-break" "^1.0.0"
"@codemirror/theme-one-dark@^6.1.2":
version "6.1.2"
@@ -1338,42 +1283,12 @@
"@codemirror/view" "^6.0.0"
"@lezer/highlight" "^1.0.0"
-"@codemirror/tooltip@^0.19.12":
- version "0.19.16"
- resolved "https://registry.yarnpkg.com/@codemirror/tooltip/-/tooltip-0.19.16.tgz#6ba2c43f9d8e3d943d9d7bbae22bf800f7726a22"
- integrity sha512-zxKDHryUV5/RS45AQL+wOeN+i7/l81wK56OMnUPoTSzCWNITfxHn7BToDsjtrRKbzHqUxKYmBnn/4hPjpZ4WJQ==
+"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.24.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0":
+ version "6.36.1"
+ resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.36.1.tgz#3c543b8fd72c96b30c4b2b1464d1ebce7e0c5c4b"
+ integrity sha512-miD1nyT4m4uopZaDdO2uXU/LLHliKNYL9kB1C1wJHrunHLm/rpkb5QVSokqgw9hFqEZakrdlb/VGWX8aYZTslQ==
dependencies:
- "@codemirror/state" "^0.19.0"
- "@codemirror/view" "^0.19.0"
-
-"@codemirror/view@^0.19.0":
- version "0.19.40"
- resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-0.19.40.tgz#1be9cac1725568b7fba2252658a6f255b29339eb"
- integrity sha512-0CQV99+/nIKTVVbDs0XjW4Rkp8TobzJBXRaUHF6mOroVjuIBBcolE1eAGVEU5LrCS44C798jiP4r/HhLDNS+rw==
- dependencies:
- "@codemirror/rangeset" "^0.19.5"
- "@codemirror/state" "^0.19.3"
- "@codemirror/text" "^0.19.0"
- style-mod "^4.0.0"
- w3c-keyname "^2.2.4"
-
-"@codemirror/view@^0.19.39":
- version "0.19.48"
- resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-0.19.48.tgz#1c657e2b0f8ed896ac6448d6e2215ab115e2a0fc"
- integrity sha512-0eg7D2Nz4S8/caetCTz61rK0tkHI17V/d15Jy0kLOT8dTLGGNJUponDnW28h2B6bERmPlVHKh8MJIr5OCp1nGw==
- dependencies:
- "@codemirror/rangeset" "^0.19.5"
- "@codemirror/state" "^0.19.3"
- "@codemirror/text" "^0.19.0"
- style-mod "^4.0.0"
- w3c-keyname "^2.2.4"
-
-"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0":
- version "6.26.2"
- resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.26.2.tgz#6df950954cee33933514978c5bbd2da9d546466c"
- integrity sha512-j6V48PlFC/O7ERAR5vRW5QKDdchzmyyfojDdt+zPsB0YXoWgcjlC1IWjmlYfx08aQZ3HN5BtALcgGgtSKGMe7A==
- dependencies:
- "@codemirror/state" "^6.4.0"
+ "@codemirror/state" "^6.5.0"
style-mod "^4.1.0"
w3c-keyname "^2.2.4"
@@ -1382,16 +1297,16 @@
resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz#2cbcf822bf3764c9658c4d2e568bd0c0cb748016"
integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==
-"@emotion/babel-plugin@^11.11.0":
- version "11.11.0"
- resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c"
- integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==
+"@emotion/babel-plugin@^11.13.5":
+ version "11.13.5"
+ resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz#eab8d65dbded74e0ecfd28dc218e75607c4e7bc0"
+ integrity sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==
dependencies:
"@babel/helper-module-imports" "^7.16.7"
"@babel/runtime" "^7.18.3"
- "@emotion/hash" "^0.9.1"
- "@emotion/memoize" "^0.8.1"
- "@emotion/serialize" "^1.1.2"
+ "@emotion/hash" "^0.9.2"
+ "@emotion/memoize" "^0.9.0"
+ "@emotion/serialize" "^1.3.3"
babel-plugin-macros "^3.1.0"
convert-source-map "^1.5.0"
escape-string-regexp "^4.0.0"
@@ -1399,76 +1314,81 @@
source-map "^0.5.7"
stylis "4.2.0"
-"@emotion/cache@^11.11.0", "@emotion/cache@^11.4.0":
- version "11.11.0"
- resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff"
- integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==
+"@emotion/cache@^11.14.0", "@emotion/cache@^11.4.0":
+ version "11.14.0"
+ resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.14.0.tgz#ee44b26986eeb93c8be82bb92f1f7a9b21b2ed76"
+ integrity sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==
dependencies:
- "@emotion/memoize" "^0.8.1"
- "@emotion/sheet" "^1.2.2"
- "@emotion/utils" "^1.2.1"
- "@emotion/weak-memoize" "^0.3.1"
+ "@emotion/memoize" "^0.9.0"
+ "@emotion/sheet" "^1.4.0"
+ "@emotion/utils" "^1.4.2"
+ "@emotion/weak-memoize" "^0.4.0"
stylis "4.2.0"
-"@emotion/hash@^0.9.1":
- version "0.9.1"
- resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43"
- integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==
+"@emotion/hash@^0.9.2":
+ version "0.9.2"
+ resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.2.tgz#ff9221b9f58b4dfe61e619a7788734bd63f6898b"
+ integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==
-"@emotion/memoize@^0.8.1":
- version "0.8.1"
- resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17"
- integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==
+"@emotion/memoize@^0.9.0":
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.9.0.tgz#745969d649977776b43fc7648c556aaa462b4102"
+ integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==
"@emotion/react@^11.8.1":
- version "11.11.1"
- resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.1.tgz#b2c36afac95b184f73b08da8c214fdf861fa4157"
- integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==
+ version "11.14.0"
+ resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.14.0.tgz#cfaae35ebc67dd9ef4ea2e9acc6cd29e157dd05d"
+ integrity sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==
dependencies:
"@babel/runtime" "^7.18.3"
- "@emotion/babel-plugin" "^11.11.0"
- "@emotion/cache" "^11.11.0"
- "@emotion/serialize" "^1.1.2"
- "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1"
- "@emotion/utils" "^1.2.1"
- "@emotion/weak-memoize" "^0.3.1"
+ "@emotion/babel-plugin" "^11.13.5"
+ "@emotion/cache" "^11.14.0"
+ "@emotion/serialize" "^1.3.3"
+ "@emotion/use-insertion-effect-with-fallbacks" "^1.2.0"
+ "@emotion/utils" "^1.4.2"
+ "@emotion/weak-memoize" "^0.4.0"
hoist-non-react-statics "^3.3.1"
-"@emotion/serialize@^1.1.2":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.2.tgz#017a6e4c9b8a803bd576ff3d52a0ea6fa5a62b51"
- integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==
+"@emotion/serialize@^1.3.3":
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.3.3.tgz#d291531005f17d704d0463a032fe679f376509e8"
+ integrity sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==
dependencies:
- "@emotion/hash" "^0.9.1"
- "@emotion/memoize" "^0.8.1"
- "@emotion/unitless" "^0.8.1"
- "@emotion/utils" "^1.2.1"
+ "@emotion/hash" "^0.9.2"
+ "@emotion/memoize" "^0.9.0"
+ "@emotion/unitless" "^0.10.0"
+ "@emotion/utils" "^1.4.2"
csstype "^3.0.2"
-"@emotion/sheet@^1.2.2":
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec"
- integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==
+"@emotion/sheet@^1.4.0":
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.4.0.tgz#c9299c34d248bc26e82563735f78953d2efca83c"
+ integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==
-"@emotion/unitless@^0.8.1":
- version "0.8.1"
- resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3"
- integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==
+"@emotion/unitless@^0.10.0":
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.10.0.tgz#2af2f7c7e5150f497bdabd848ce7b218a27cf745"
+ integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==
-"@emotion/use-insertion-effect-with-fallbacks@^1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963"
- integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==
+"@emotion/use-insertion-effect-with-fallbacks@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz#8a8cb77b590e09affb960f4ff1e9a89e532738bf"
+ integrity sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==
-"@emotion/utils@^1.2.1":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4"
- integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==
+"@emotion/utils@^1.4.2":
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.4.2.tgz#6df6c45881fcb1c412d6688a311a98b7f59c1b52"
+ integrity sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==
-"@emotion/weak-memoize@^0.3.1":
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6"
- integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==
+"@emotion/weak-memoize@^0.4.0":
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz#5e13fac887f08c44f76b0ccaf3370eb00fec9bb6"
+ integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==
+
+"@esbuild/linux-loong64@0.14.54":
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028"
+ integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==
"@eslint/eslintrc@^0.4.3":
version "0.4.3"
@@ -1491,13 +1411,13 @@
integrity sha512-oRSlD9o2twN+AwoL8XSYgbxggt8+rgH+n6y84mjXpuC/MsJoQQGG0Y6gkzuJcloLgB1SuBUt87qJunm4lYQzCA==
"@exercism/codemirror-lang-arturo@^0.1.6":
- version "0.1.6"
- resolved "https://registry.yarnpkg.com/@exercism/codemirror-lang-arturo/-/codemirror-lang-arturo-0.1.6.tgz#fd233d9a7b9a77ce160d1f0f6e8117555b7b0dbd"
- integrity sha512-hOk76CZ4ED+2wNSEW6ePb92eajdudbadRne7cymtEtVfVM+UvV50VAYaldRIW1gqy31swd9mxefnS4TZ2oYf+A==
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/@exercism/codemirror-lang-arturo/-/codemirror-lang-arturo-0.1.7.tgz#f4b876feacea7f4a185dc34838c876fa16a89204"
+ integrity sha512-alNp88QW/Y22/Q4H79NcZb6+KWYRdseJe4fbHl+VrQFmFZmQY7HTDDCPZaBgVFEP4PMf09iAE15id3/k2VY0yw==
dependencies:
- "@codemirror/language" "^6.10.2"
+ "@codemirror/language" "^6.10.1"
"@lezer/highlight" "^1.2.0"
- "@lezer/lr" "^1.4.1"
+ "@lezer/lr" "^1.4.0"
"@exercism/codemirror-lang-gleam@^2.0.1":
version "2.0.1"
@@ -1544,7 +1464,7 @@
"@exercism/twine2-story-format@https://github.com/exercism/twine2-story-format.git":
version "1.0.0"
- resolved "https://github.com/exercism/twine2-story-format.git#94ac1ce6a2560f06db4172dd28707b98220b4fb9"
+ resolved "https://github.com/exercism/twine2-story-format.git#ab0ed60553b2c6f06d51c4f91df35e29ac4ba865"
dependencies:
jquery "^3.2.1"
lz-string "^1.4.4"
@@ -1552,30 +1472,42 @@
npm "^6.3.0"
underscore "^1.8.3"
-"@floating-ui/core@^1.4.2":
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.5.0.tgz#5c05c60d5ae2d05101c3021c1a2a350ddc027f8c"
- integrity sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==
+"@floating-ui/core@^1.6.0":
+ version "1.6.8"
+ resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.8.tgz#aa43561be075815879305965020f492cdb43da12"
+ integrity sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==
dependencies:
- "@floating-ui/utils" "^0.1.3"
+ "@floating-ui/utils" "^0.2.8"
-"@floating-ui/dom@^1.0.1":
- version "1.5.3"
- resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.3.tgz#54e50efcb432c06c23cd33de2b575102005436fa"
- integrity sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==
+"@floating-ui/dom@^1.0.1", "@floating-ui/dom@^1.6.12":
+ version "1.6.12"
+ resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.12.tgz#6333dcb5a8ead3b2bf82f33d6bc410e95f54e556"
+ integrity sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==
dependencies:
- "@floating-ui/core" "^1.4.2"
- "@floating-ui/utils" "^0.1.3"
+ "@floating-ui/core" "^1.6.0"
+ "@floating-ui/utils" "^0.2.8"
-"@floating-ui/utils@^0.1.3":
- version "0.1.6"
- resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.6.tgz#22958c042e10b67463997bd6ea7115fe28cbcaf9"
- integrity sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==
+"@floating-ui/utils@^0.2.8":
+ version "0.2.8"
+ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62"
+ integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==
"@gleam-lang/highlight.js-gleam@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@gleam-lang/highlight.js-gleam/-/highlight.js-gleam-1.0.0.tgz#c9868daf7bc04df3477aaa3357c49a27edd3a18a"
- integrity sha512-PNtTN5u7yQgo3uj+vm4SkZ2dbH+ozVMlsbaq8KdrNW5OPWsbRsPluSvGrhCkjJ2RVQKBsKK1o8WTjEU1hNTY1A==
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@gleam-lang/highlight.js-gleam/-/highlight.js-gleam-1.5.0.tgz#ab9e43b88b2541a697bcf4d67711c7c4a28adcb3"
+ integrity sha512-rKKpXnfmHVTPuHEogMVvN4DflzKtX6kBXqu1GsVDb0uDf/bvO8Z2VnC0XWUMuKNlxa+poKIjY6geyxTaVZiMFA==
+
+"@happy-dom/global-registrator@^15.11.6":
+ version "15.11.7"
+ resolved "https://registry.yarnpkg.com/@happy-dom/global-registrator/-/global-registrator-15.11.7.tgz#690ce2c1f68ad35767672b62ef643a91a0f46d70"
+ integrity sha512-mfOoUlIw8VBiJYPrl5RZfMzkXC/z7gbSpi2ecycrj/gRWLq2CMV+Q+0G+JPjeOmuNFgg0skEIzkVFzVYFP6URw==
+ dependencies:
+ happy-dom "^15.11.7"
+
+"@hotwired/stimulus@^3.2.2":
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/@hotwired/stimulus/-/stimulus-3.2.2.tgz#071aab59c600fed95b97939e605ff261a4251608"
+ integrity sha512-eGeIqNOQpXoPAIP7tC1+1Yc1yl1xnwYqg+3mzqxyrbE5pg5YFBZcA6YoTiByJB6DKAEsiWtl6tjTJS4IYtbB7A==
"@hotwired/turbo-rails@^7.3.0":
version "7.3.0"
@@ -1604,14 +1536,13 @@
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
-"@iarna/cli@^1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@iarna/cli/-/cli-1.2.0.tgz#0f7af5e851afe895104583c4ca07377a8094d641"
- integrity sha512-ukITQAqVs2n9HGmn3car/Ir7d3ta650iXhrG7pjr3EWdFmJuuOVWgYsu7ftsSe5VifEFFhjxVuX9+8F7L8hwcA==
+"@iarna/cli@^2.1.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@iarna/cli/-/cli-2.2.0.tgz#02807c8902fa1b515647c304c9c4d6db8aa9783f"
+ integrity sha512-fn1dwhQuWD/OuM/XZhaEy2GOL5Hta/Dis1ZtER/FAe/BKXTHohD4sxPcYQePHUYmrknD+iV+3uic0M8zH/9sJQ==
dependencies:
+ glob "^7.1.2"
signal-exit "^3.0.2"
- update-notifier "^2.2.0"
- yargs "^8.0.2"
"@isaacs/cliui@^8.0.2":
version "8.0.2"
@@ -1651,142 +1582,156 @@
faker "5.5.3"
lodash "4.17.21"
-"@jest/console@^27.4.6":
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.4.6.tgz#0742e6787f682b22bdad56f9db2a8a77f6a86107"
- integrity sha512-jauXyacQD33n47A44KrlOVeiXHEXDqapSdfb9kTekOchH/Pd18kBIO1+xxJQRLuG+LUuljFCwTG92ra4NW7SpA==
+"@jest/console@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba"
+ integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==
dependencies:
- "@jest/types" "^27.4.2"
+ "@jest/types" "^27.5.1"
"@types/node" "*"
chalk "^4.0.0"
- jest-message-util "^27.4.6"
- jest-util "^27.4.2"
+ jest-message-util "^27.5.1"
+ jest-util "^27.5.1"
slash "^3.0.0"
-"@jest/core@^27.4.7":
- version "27.4.7"
- resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.4.7.tgz#84eabdf42a25f1fa138272ed229bcf0a1b5e6913"
- integrity sha512-n181PurSJkVMS+kClIFSX/LLvw9ExSb+4IMtD6YnfxZVerw9ANYtW0bPrm0MJu2pfe9SY9FJ9FtQ+MdZkrZwjg==
- dependencies:
- "@jest/console" "^27.4.6"
- "@jest/reporters" "^27.4.6"
- "@jest/test-result" "^27.4.6"
- "@jest/transform" "^27.4.6"
- "@jest/types" "^27.4.2"
+"@jest/core@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626"
+ integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==
+ dependencies:
+ "@jest/console" "^27.5.1"
+ "@jest/reporters" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
"@types/node" "*"
ansi-escapes "^4.2.1"
chalk "^4.0.0"
emittery "^0.8.1"
exit "^0.1.2"
- graceful-fs "^4.2.4"
- jest-changed-files "^27.4.2"
- jest-config "^27.4.7"
- jest-haste-map "^27.4.6"
- jest-message-util "^27.4.6"
- jest-regex-util "^27.4.0"
- jest-resolve "^27.4.6"
- jest-resolve-dependencies "^27.4.6"
- jest-runner "^27.4.6"
- jest-runtime "^27.4.6"
- jest-snapshot "^27.4.6"
- jest-util "^27.4.2"
- jest-validate "^27.4.6"
- jest-watcher "^27.4.6"
+ graceful-fs "^4.2.9"
+ jest-changed-files "^27.5.1"
+ jest-config "^27.5.1"
+ jest-haste-map "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-resolve-dependencies "^27.5.1"
+ jest-runner "^27.5.1"
+ jest-runtime "^27.5.1"
+ jest-snapshot "^27.5.1"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
+ jest-watcher "^27.5.1"
micromatch "^4.0.4"
rimraf "^3.0.0"
slash "^3.0.0"
strip-ansi "^6.0.0"
-"@jest/environment@^27.4.6":
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.4.6.tgz#1e92885d64f48c8454df35ed9779fbcf31c56d8b"
- integrity sha512-E6t+RXPfATEEGVidr84WngLNWZ8ffCPky8RqqRK6u1Bn0LK92INe0MDttyPl/JOzaq92BmDzOeuqk09TvM22Sg==
+"@jest/environment@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74"
+ integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==
dependencies:
- "@jest/fake-timers" "^27.4.6"
- "@jest/types" "^27.4.2"
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/types" "^27.5.1"
"@types/node" "*"
- jest-mock "^27.4.6"
+ jest-mock "^27.5.1"
+
+"@jest/expect-utils@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6"
+ integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==
+ dependencies:
+ jest-get-type "^29.6.3"
-"@jest/fake-timers@^27.4.6":
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.4.6.tgz#e026ae1671316dbd04a56945be2fa251204324e8"
- integrity sha512-mfaethuYF8scV8ntPpiVGIHQgS0XIALbpY2jt2l7wb/bvq4Q5pDLk4EP4D7SAvYT1QrPOPVZAtbdGAOOyIgs7A==
+"@jest/fake-timers@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74"
+ integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==
dependencies:
- "@jest/types" "^27.4.2"
+ "@jest/types" "^27.5.1"
"@sinonjs/fake-timers" "^8.0.1"
"@types/node" "*"
- jest-message-util "^27.4.6"
- jest-mock "^27.4.6"
- jest-util "^27.4.2"
+ jest-message-util "^27.5.1"
+ jest-mock "^27.5.1"
+ jest-util "^27.5.1"
-"@jest/globals@^27.4.6":
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.4.6.tgz#3f09bed64b0fd7f5f996920258bd4be8f52f060a"
- integrity sha512-kAiwMGZ7UxrgPzu8Yv9uvWmXXxsy0GciNejlHvfPIfWkSxChzv6bgTS3YqBkGuHcis+ouMFI2696n2t+XYIeFw==
+"@jest/globals@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b"
+ integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==
dependencies:
- "@jest/environment" "^27.4.6"
- "@jest/types" "^27.4.2"
- expect "^27.4.6"
+ "@jest/environment" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ expect "^27.5.1"
-"@jest/reporters@^27.4.6":
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.4.6.tgz#b53dec3a93baf9b00826abf95b932de919d6d8dd"
- integrity sha512-+Zo9gV81R14+PSq4wzee4GC2mhAN9i9a7qgJWL90Gpx7fHYkWpTBvwWNZUXvJByYR9tAVBdc8VxDWqfJyIUrIQ==
+"@jest/reporters@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04"
+ integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==
dependencies:
"@bcoe/v8-coverage" "^0.2.3"
- "@jest/console" "^27.4.6"
- "@jest/test-result" "^27.4.6"
- "@jest/transform" "^27.4.6"
- "@jest/types" "^27.4.2"
+ "@jest/console" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
"@types/node" "*"
chalk "^4.0.0"
collect-v8-coverage "^1.0.0"
exit "^0.1.2"
glob "^7.1.2"
- graceful-fs "^4.2.4"
+ graceful-fs "^4.2.9"
istanbul-lib-coverage "^3.0.0"
istanbul-lib-instrument "^5.1.0"
istanbul-lib-report "^3.0.0"
istanbul-lib-source-maps "^4.0.0"
istanbul-reports "^3.1.3"
- jest-haste-map "^27.4.6"
- jest-resolve "^27.4.6"
- jest-util "^27.4.2"
- jest-worker "^27.4.6"
+ jest-haste-map "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-util "^27.5.1"
+ jest-worker "^27.5.1"
slash "^3.0.0"
source-map "^0.6.0"
string-length "^4.0.1"
terminal-link "^2.0.0"
v8-to-istanbul "^8.1.0"
-"@jest/source-map@^27.4.0":
- version "27.4.0"
- resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.4.0.tgz#2f0385d0d884fb3e2554e8f71f8fa957af9a74b6"
- integrity sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ==
+"@jest/schemas@^29.6.3":
+ version "29.6.3"
+ resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03"
+ integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==
+ dependencies:
+ "@sinclair/typebox" "^0.27.8"
+
+"@jest/source-map@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf"
+ integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==
dependencies:
callsites "^3.0.0"
- graceful-fs "^4.2.4"
+ graceful-fs "^4.2.9"
source-map "^0.6.0"
-"@jest/test-result@^27.4.6":
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.4.6.tgz#b3df94c3d899c040f602cea296979844f61bdf69"
- integrity sha512-fi9IGj3fkOrlMmhQqa/t9xum8jaJOOAi/lZlm6JXSc55rJMXKHxNDN1oCP39B0/DhNOa2OMupF9BcKZnNtXMOQ==
+"@jest/test-result@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb"
+ integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==
dependencies:
- "@jest/console" "^27.4.6"
- "@jest/types" "^27.4.2"
+ "@jest/console" "^27.5.1"
+ "@jest/types" "^27.5.1"
"@types/istanbul-lib-coverage" "^2.0.0"
collect-v8-coverage "^1.0.0"
-"@jest/test-sequencer@^27.4.6":
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.4.6.tgz#447339b8a3d7b5436f50934df30854e442a9d904"
- integrity sha512-3GL+nsf6E1PsyNsJuvPyIz+DwFuCtBdtvPpm/LMXVkBJbdFvQYCDpccYT56qq5BGniXWlE81n2qk1sdXfZebnw==
+"@jest/test-sequencer@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b"
+ integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==
dependencies:
- "@jest/test-result" "^27.4.6"
- graceful-fs "^4.2.4"
- jest-haste-map "^27.4.6"
- jest-runtime "^27.4.6"
+ "@jest/test-result" "^27.5.1"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^27.5.1"
+ jest-runtime "^27.5.1"
"@jest/transform@^26.6.2":
version "26.6.2"
@@ -1809,21 +1754,21 @@
source-map "^0.6.1"
write-file-atomic "^3.0.0"
-"@jest/transform@^27.4.6":
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.4.6.tgz#153621940b1ed500305eacdb31105d415dc30231"
- integrity sha512-9MsufmJC8t5JTpWEQJ0OcOOAXaH5ioaIX6uHVBLBMoCZPfKKQF+EqP8kACAvCZ0Y1h2Zr3uOccg8re+Dr5jxyw==
+"@jest/transform@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409"
+ integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==
dependencies:
"@babel/core" "^7.1.0"
- "@jest/types" "^27.4.2"
+ "@jest/types" "^27.5.1"
babel-plugin-istanbul "^6.1.1"
chalk "^4.0.0"
convert-source-map "^1.4.0"
fast-json-stable-stringify "^2.0.0"
- graceful-fs "^4.2.4"
- jest-haste-map "^27.4.6"
- jest-regex-util "^27.4.0"
- jest-util "^27.4.2"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-util "^27.5.1"
micromatch "^4.0.4"
pirates "^4.0.4"
slash "^3.0.0"
@@ -1841,10 +1786,10 @@
"@types/yargs" "^15.0.0"
chalk "^4.0.0"
-"@jest/types@^27.4.2":
- version "27.4.2"
- resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.4.2.tgz#96536ebd34da6392c2b7c7737d693885b5dd44a5"
- integrity sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==
+"@jest/types@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80"
+ integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==
dependencies:
"@types/istanbul-lib-coverage" "^2.0.0"
"@types/istanbul-reports" "^3.0.0"
@@ -1852,10 +1797,22 @@
"@types/yargs" "^16.0.0"
chalk "^4.0.0"
-"@jridgewell/gen-mapping@^0.3.2":
- version "0.3.5"
- resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36"
- integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
+"@jest/types@^29.6.3":
+ version "29.6.3"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59"
+ integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==
+ dependencies:
+ "@jest/schemas" "^29.6.3"
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ "@types/istanbul-reports" "^3.0.0"
+ "@types/node" "*"
+ "@types/yargs" "^17.0.8"
+ chalk "^4.0.0"
+
+"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.8"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142"
+ integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==
dependencies:
"@jridgewell/set-array" "^1.2.1"
"@jridgewell/sourcemap-codec" "^1.4.10"
@@ -1876,7 +1833,7 @@
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
-"@jridgewell/trace-mapping@^0.3.24":
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
version "0.3.25"
resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
@@ -1884,15 +1841,10 @@
"@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14"
-"@lezer/common@^0.15.0", "@lezer/common@^0.15.5":
- version "0.15.12"
- resolved "https://registry.yarnpkg.com/@lezer/common/-/common-0.15.12.tgz#2f21aec551dd5fd7d24eb069f90f54d5bc6ee5e9"
- integrity sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==
-
"@lezer/common@^1.0.0", "@lezer/common@^1.0.2", "@lezer/common@^1.1.0", "@lezer/common@^1.2.0", "@lezer/common@^1.2.1":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.2.1.tgz#198b278b7869668e1bebbe687586e12a42731049"
- integrity sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.2.3.tgz#138fcddab157d83da557554851017c6c1e5667fd"
+ integrity sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==
"@lezer/cpp@^1.0.0":
version "1.1.2"
@@ -1903,67 +1855,53 @@
"@lezer/highlight" "^1.0.0"
"@lezer/lr" "^1.0.0"
-"@lezer/css@^1.0.0", "@lezer/css@^1.1.0":
- version "1.1.8"
- resolved "https://registry.yarnpkg.com/@lezer/css/-/css-1.1.8.tgz#11fd456dac53bc899b266778794ed4ca9576a5a4"
- integrity sha512-7JhxupKuMBaWQKjQoLtzhGj83DdnZY9MckEOG5+/iLKNK2ZJqKc6hf6uc0HjwCX7Qlok44jBNqZhHKDhEhZYLA==
+"@lezer/css@^1.1.0", "@lezer/css@^1.1.7":
+ version "1.1.9"
+ resolved "https://registry.yarnpkg.com/@lezer/css/-/css-1.1.9.tgz#404563d361422c5a1fe917295f1527ee94845ed1"
+ integrity sha512-TYwgljcDv+YrV0MZFFvYFQHCfGgbPMR6nuqLabBdmZoFH3EP1gvw8t0vae326Ne3PszQkbXfVBjCnf3ZVCr0bA==
dependencies:
"@lezer/common" "^1.2.0"
"@lezer/highlight" "^1.0.0"
"@lezer/lr" "^1.0.0"
"@lezer/highlight@^1.0.0", "@lezer/highlight@^1.1.3", "@lezer/highlight@^1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.2.0.tgz#e5898c3644208b4b589084089dceeea2966f7780"
- integrity sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.2.1.tgz#596fa8f9aeb58a608be0a563e960c373cbf23f8b"
+ integrity sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==
dependencies:
"@lezer/common" "^1.0.0"
"@lezer/html@^1.3.0":
- version "1.3.9"
- resolved "https://registry.yarnpkg.com/@lezer/html/-/html-1.3.9.tgz#097150f0fb0d14e274515d3b3e50e7bd4a1d7ebc"
- integrity sha512-MXxeCMPyrcemSLGaTQEZx0dBUH0i+RPl8RN5GwMAzo53nTsd/Unc/t5ZxACeQoyPUM5/GkPLRUs2WliOImzkRA==
+ version "1.3.10"
+ resolved "https://registry.yarnpkg.com/@lezer/html/-/html-1.3.10.tgz#1be9a029a6fe835c823b20a98a449a630416b2af"
+ integrity sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==
dependencies:
"@lezer/common" "^1.2.0"
"@lezer/highlight" "^1.0.0"
"@lezer/lr" "^1.0.0"
"@lezer/java@^1.0.0":
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/@lezer/java/-/java-1.1.1.tgz#eed8813a5f3eb1a913aa8eaf40d5b20f40dee3d6"
- integrity sha512-mt3dX13fRlpY7RlWELYRakanXgmwXsLRCrhstrn+c1sZd7jR2xle46/3heoxGd+oHxnuTnpoyXTyxcLJQs9+mQ==
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/@lezer/java/-/java-1.1.3.tgz#9efd6a29b4142d07f211076a6fb5e8061c85e147"
+ integrity sha512-yHquUfujwg6Yu4Fd1GNHCvidIvJwi/1Xu2DaKl/pfWIA2c1oXkVvawH3NyXhCaFx4OdlYBVX5wvz2f7Aoa/4Xw==
dependencies:
"@lezer/common" "^1.2.0"
"@lezer/highlight" "^1.0.0"
"@lezer/lr" "^1.0.0"
"@lezer/javascript@^1.0.0":
- version "1.4.14"
- resolved "https://registry.yarnpkg.com/@lezer/javascript/-/javascript-1.4.14.tgz#d94bf2b6338c1c458e1e9f79f2caf5063f346c3e"
- integrity sha512-GEdUyspTRgc5dwIGebUk+f3BekvqEWVIYsIuAC3pA8e8wcikGwBZRWRa450L0s8noGWuULwnmi4yjxTnYz9PpA==
+ version "1.4.21"
+ resolved "https://registry.yarnpkg.com/@lezer/javascript/-/javascript-1.4.21.tgz#8ebf7d1f891c70e3d00864f5a03ac42c75d19492"
+ integrity sha512-lL+1fcuxWYPURMM/oFZLEDm0XuLN128QPV+VuGtKpeaOGdcl9F2LYC3nh1S9LkPqx9M0mndZFdXCipNAZpzIkQ==
dependencies:
"@lezer/common" "^1.2.0"
"@lezer/highlight" "^1.1.3"
"@lezer/lr" "^1.3.0"
-"@lezer/lr@^0.15.0":
- version "0.15.8"
- resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-0.15.8.tgz#1564a911e62b0a0f75ca63794a6aa8c5dc63db21"
- integrity sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==
- dependencies:
- "@lezer/common" "^0.15.0"
-
"@lezer/lr@^1.0.0", "@lezer/lr@^1.1.0", "@lezer/lr@^1.3.0", "@lezer/lr@^1.4.0":
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.4.0.tgz#ed52a75dbbfbb0d1eb63710ea84c35ee647cb67e"
- integrity sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==
- dependencies:
- "@lezer/common" "^1.0.0"
-
-"@lezer/lr@^1.4.1":
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.4.1.tgz#fe25f051880a754e820b28148d90aa2a96b8bdd2"
- integrity sha512-CHsKq8DMKBf9b3yXPDIU4DbH+ZJd/sJdYOW2llbW/HudP5u0VS6Bfq1hLYfgU7uAYGFIyGGQIsSOXGPEErZiJw==
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.4.2.tgz#931ea3dea8e9de84e90781001dae30dea9ff1727"
+ integrity sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==
dependencies:
"@lezer/common" "^1.0.0"
@@ -1977,9 +1915,9 @@
"@lezer/lr" "^1.1.0"
"@lezer/python@^1.1.4":
- version "1.1.13"
- resolved "https://registry.yarnpkg.com/@lezer/python/-/python-1.1.13.tgz#0a1cbdbbd68b588a11ceab1692e6cbb760d039c6"
- integrity sha512-AdbRAtdQq94PfTNd4kqMEJhH2fqa2JdoyyqqVewY6w34w2Gi6dg2JuOtOgR21Bi0zP9r0KjSSHOUq/tP7FVT8A==
+ version "1.1.15"
+ resolved "https://registry.yarnpkg.com/@lezer/python/-/python-1.1.15.tgz#14a21b3bf1997d1b578f0bb959bf2062641798a2"
+ integrity sha512-aVQ43m2zk4FZYedCqL0KHPEUsqZOrmAvRhkhHlVPnDD1HODDyyQv5BRIuod4DadkgBEZd53vQOtXTonNbEgjrQ==
dependencies:
"@lezer/common" "^1.2.0"
"@lezer/highlight" "^1.0.0"
@@ -2003,6 +1941,16 @@
"@lezer/highlight" "^1.0.0"
"@lezer/lr" "^1.4.0"
+"@marijn/find-cluster-break@^1.0.0":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz#775374306116d51c0c500b8c4face0f9a04752d8"
+ integrity sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==
+
+"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3":
+ version "2.1.8-no-fsevents.3"
+ resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz#323d72dd25103d0c4fbdce89dadf574a787b1f9b"
+ integrity sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==
+
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
@@ -2034,16 +1982,30 @@
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
-"@popperjs/core@^2.11.8":
+"@plutojl/lang-julia@^0.12.1":
+ version "0.12.1"
+ resolved "https://registry.yarnpkg.com/@plutojl/lang-julia/-/lang-julia-0.12.1.tgz#638016a5a743aa66bd40f1dd3094ab9e40757e00"
+ integrity sha512-lBF5ycjeuYrDCRiUejkc8FR5nbvvuSMnoW9MsAAJieToy37HAK2omRSbY0WT3aniaW8ZHBiuWsLZUDpZdUl28A==
+ dependencies:
+ "@codemirror/autocomplete" "^6.10.2"
+ "@codemirror/language" "^6.9.1"
+ "@lezer/common" "^1.1.0"
+ "@plutojl/lezer-julia" "^0.12.1"
+
+"@plutojl/lezer-julia@^0.12.1":
+ version "0.12.1"
+ resolved "https://registry.yarnpkg.com/@plutojl/lezer-julia/-/lezer-julia-0.12.1.tgz#397f809a685d20539024132ae9e8cb2b9f9590ec"
+ integrity sha512-xqjtYCCqjMhwvMF7NTwA0/L21+fkuVaU5VxAj7nJXBSF0BJnRm0TexWTsTbJMuG4o5v4SpxhEa5zb4dqMjqsKQ==
+ dependencies:
+ "@lezer/common" "^1.2.1"
+ "@lezer/highlight" "^1.2.0"
+ "@lezer/lr" "^1.4.0"
+
+"@popperjs/core@^2.11.8", "@popperjs/core@^2.9.0":
version "2.11.8"
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f"
integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
-"@popperjs/core@^2.9.0":
- version "2.11.2"
- resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.2.tgz#830beaec4b4091a9e9398ac50f865ddea52186b9"
- integrity sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==
-
"@prettier/plugin-ruby@^0.18.2":
version "0.18.2"
resolved "https://registry.yarnpkg.com/@prettier/plugin-ruby/-/plugin-ruby-0.18.2.tgz#f4d0b48484fcaa1927922fe34a1f5564de76d412"
@@ -2052,14 +2014,14 @@
prettier ">=1.10"
"@rails/actioncable@^6.0.0":
- version "6.1.4"
- resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-6.1.4.tgz#c3c5a9f8302c429af9722b6c50ab48049016d2a3"
- integrity sha512-0LmSKJTuo2dL6BQ+9xxLnS9lbkyfz2mBGeBnQ2J7o9Bn0l0q+ZC6VuoZMZZXPvABI4QT7Nfknv5WhfKYL+boew==
+ version "6.1.710"
+ resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-6.1.710.tgz#5c77515cbc9b8fb5118afa0aa0048192b33c33ea"
+ integrity sha512-YDzMuh8mDRNLFXiexlLVnF1NUwk1bXwwO1gtEhOCsCqIsL6D21JfxpMwAD5x8qzrMJ1J0RZVa2hLl7ofeg+Mqw==
"@rails/actioncable@^7.0":
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-7.0.1.tgz#8f383b672e142d009f89b725d49b0832d99da74a"
- integrity sha512-lbGc1z2RXdiWZJE/8o2GSe2gek82EoKd2YvjRrqV//0J3/JImONUYwZ2XPmS1R9R2oth1XlIG0YidqdeTty0TA==
+ version "7.2.201"
+ resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-7.2.201.tgz#bfb3da01b3e2462f5a18f372c52dedd7de76037f"
+ integrity sha512-wsTdWoZ5EfG5k3t7ORdyQF0ZmDEgN4aVPCanHAiNEwCROqibSZMXXmCbH7IDJUVri4FOeAVwwbPINI7HVHPKBw==
"@sector-labs/postcss-inline-class@^0.0.6":
version "0.0.6"
@@ -2070,10 +2032,15 @@
postcss "^7.0.1"
resolve "^1.1.7"
+"@sinclair/typebox@^0.27.8":
+ version "0.27.8"
+ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e"
+ integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==
+
"@sinonjs/commons@^1.7.0":
- version "1.8.3"
- resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d"
- integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==
+ version "1.8.6"
+ resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9"
+ integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==
dependencies:
type-detect "4.0.8"
@@ -2085,34 +2052,34 @@
"@sinonjs/commons" "^1.7.0"
"@stripe/react-stripe-js@^2.1.1":
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/@stripe/react-stripe-js/-/react-stripe-js-2.1.1.tgz#92fe1498bc9db4e0b51d63df3849214cc8021c55"
- integrity sha512-aHm6cWOqmOyq3eKKlR42hgvrcZhzc9ijL+BeXJ5H3uaWUKKcooSsBys0tiKl0gLxYQHUjUCvrRSX8fYaPBmAKg==
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/@stripe/react-stripe-js/-/react-stripe-js-2.9.0.tgz#1f1a9a3d5eab8ca144e060df1e9fd855a7658aca"
+ integrity sha512-+/j2g6qKAKuWSurhgRMfdlIdKM+nVVJCy/wl0US2Ccodlqx0WqfIIBhUkeONkCG+V/b+bZzcj4QVa3E/rXtT4Q==
dependencies:
prop-types "^15.7.2"
"@stripe/stripe-js@^1.54.1":
- version "1.54.1"
- resolved "https://registry.yarnpkg.com/@stripe/stripe-js/-/stripe-js-1.54.1.tgz#e298b80c2963d9e622ea355db6c35df48e08cd89"
- integrity sha512-smEXPu1GKMcAj9g2luT16+oXfg2jAwyc68t2Dm5wdtYl3p8PqQaZEiI8tQmboaQAjgF8pIGma6byz1T1vgmpbA==
+ version "1.54.2"
+ resolved "https://registry.yarnpkg.com/@stripe/stripe-js/-/stripe-js-1.54.2.tgz#0665848e22cbda936cfd05256facdfbba121438d"
+ integrity sha512-R1PwtDvUfs99cAjfuQ/WpwJ3c92+DAMy9xGApjqlWQMj0FKQabUAys2swfTRNzuYAYJh7NqK2dzcYVNkKLEKUg==
-"@tanstack/query-core@4.33.0":
- version "4.33.0"
- resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.33.0.tgz#7756da9a75a424e521622b1d84eb55b7a2b33715"
- integrity sha512-qYu73ptvnzRh6se2nyBIDHGBQvPY1XXl3yR769B7B6mIDD7s+EZhdlWHQ67JI6UOTFRaI7wupnTnwJ3gE0Mr/g==
+"@tanstack/query-core@4.36.1":
+ version "4.36.1"
+ resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.36.1.tgz#79f8c1a539d47c83104210be2388813a7af2e524"
+ integrity sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==
"@tanstack/react-query@^4.33.0":
- version "4.33.0"
- resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.33.0.tgz#e927b0343a6ecaa948fee59e9ca98fe561062638"
- integrity sha512-97nGbmDK0/m0B86BdiXzx3EW9RcDYKpnyL2+WwyuLHEgpfThYAnXFaMMmnTDuAO4bQJXEhflumIEUfKmP7ESGA==
+ version "4.36.1"
+ resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.36.1.tgz#acb589fab4085060e2e78013164868c9c785e5d2"
+ integrity sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==
dependencies:
- "@tanstack/query-core" "4.33.0"
+ "@tanstack/query-core" "4.36.1"
use-sync-external-store "^1.2.0"
"@testing-library/dom@^9.0.0", "@testing-library/dom@^9.3.1":
- version "9.3.1"
- resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.3.1.tgz#8094f560e9389fb973fe957af41bf766937a9ee9"
- integrity sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w==
+ version "9.3.4"
+ resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.3.4.tgz#50696ec28376926fec0a1bf87d9dbac5e27f60ce"
+ integrity sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==
dependencies:
"@babel/code-frame" "^7.10.4"
"@babel/runtime" "^7.12.5"
@@ -2124,24 +2091,24 @@
pretty-format "^27.0.2"
"@testing-library/jest-dom@^5.11.0":
- version "5.16.1"
- resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.1.tgz#3db7df5ae97596264a7da9696fe14695ba02e51f"
- integrity sha512-ajUJdfDIuTCadB79ukO+0l8O+QwN0LiSxDaYUTI4LndbbUsGi6rWU1SCexXzBA2NSjlVB9/vbkasQIL3tmPBjw==
+ version "5.17.0"
+ resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz#5e97c8f9a15ccf4656da00fecab505728de81e0c"
+ integrity sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==
dependencies:
+ "@adobe/css-tools" "^4.0.1"
"@babel/runtime" "^7.9.2"
"@types/testing-library__jest-dom" "^5.9.1"
aria-query "^5.0.0"
chalk "^3.0.0"
- css "^3.0.0"
css.escape "^1.5.1"
dom-accessibility-api "^0.5.6"
lodash "^4.17.15"
redent "^3.0.0"
"@testing-library/react@^14.0.0":
- version "14.0.0"
- resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-14.0.0.tgz#59030392a6792450b9ab8e67aea5f3cc18d6347c"
- integrity sha512-S04gSNJbYE30TlIMLTzv6QCTzt9AqIF5y6s6SzVFILNcNvbV/jU96GeiTPillGQo+Ny64M/5PV7klNYYgv5Dfg==
+ version "14.3.1"
+ resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-14.3.1.tgz#29513fc3770d6fb75245c4e1245c470e4ffdd830"
+ integrity sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==
dependencies:
"@babel/runtime" "^7.12.5"
"@testing-library/dom" "^9.0.0"
@@ -2172,59 +2139,69 @@
integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
"@types/actioncable@^5.2.3":
- version "5.2.7"
- resolved "https://registry.yarnpkg.com/@types/actioncable/-/actioncable-5.2.7.tgz#b42de922ba32f1a46c863df1ed32807ab08dda80"
- integrity sha512-HVpCvvE4Att0vSfCVNHf3gmCoqQPlySWIhH4THkG4r0hc0IcvRa0gIVyd9ekswMf3WiBsDc52OKnduIZQ7qcRw==
+ version "5.2.11"
+ resolved "https://registry.yarnpkg.com/@types/actioncable/-/actioncable-5.2.11.tgz#4b563cec68f00973dc0c5e2cc6c3810d6169a38b"
+ integrity sha512-aGzv5JS3razLvv4ZJW+wlDuNS5y1IFFVlm1EkZq3ZHs6txju7/2iee1e6sdK6DE4zsz8cIREs1K4BtfF5RMESQ==
+
+"@types/animejs@^3.1.12":
+ version "3.1.12"
+ resolved "https://registry.yarnpkg.com/@types/animejs/-/animejs-3.1.12.tgz#78fcc3df03ac07cbaef50fd37512e5031826dc42"
+ integrity sha512-fpdH+ZtlO0kqjTOqRaBdsEmvpRNOayI8k4EVkEtitL5l6wducDOXk0rgQgfZqWf/ZX9DzXrHf257S5i9xTcISQ==
"@types/aria-query@^5.0.1":
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc"
- integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708"
+ integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==
"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.1.7":
- version "7.1.18"
- resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.18.tgz#1a29abcc411a9c05e2094c98f9a1b7da6cdf49f8"
- integrity sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==
+ version "7.20.5"
+ resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017"
+ integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==
dependencies:
- "@babel/parser" "^7.1.0"
- "@babel/types" "^7.0.0"
+ "@babel/parser" "^7.20.7"
+ "@babel/types" "^7.20.7"
"@types/babel__generator" "*"
"@types/babel__template" "*"
"@types/babel__traverse" "*"
"@types/babel__generator@*":
- version "7.6.4"
- resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7"
- integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==
+ version "7.6.8"
+ resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab"
+ integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==
dependencies:
"@babel/types" "^7.0.0"
"@types/babel__template@*":
- version "7.4.1"
- resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969"
- integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==
+ version "7.4.4"
+ resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f"
+ integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==
dependencies:
"@babel/parser" "^7.1.0"
"@babel/types" "^7.0.0"
"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6":
- version "7.14.2"
- resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43"
- integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==
+ version "7.20.6"
+ resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7"
+ integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==
dependencies:
- "@babel/types" "^7.3.0"
+ "@babel/types" "^7.20.7"
-"@types/codemirror@0.0.109":
- version "0.0.109"
- resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-0.0.109.tgz#89d575ff1c7b462c4c3b8654f8bb38e5622e9036"
- integrity sha512-cSdiHeeLjvGn649lRTNeYrVCDOgDrtP+bDDSFDd1TF+i0jKGPDRozno2NOJ9lTniso+taiv4kiVS8dgM8Jm5lg==
+"@types/bun@^1.1.13":
+ version "1.1.14"
+ resolved "https://registry.yarnpkg.com/@types/bun/-/bun-1.1.14.tgz#587dead368410b281b1bcbfb61d3ce1a07a63234"
+ integrity sha512-opVYiFGtO2af0dnWBdZWlioLBoxSdDO5qokaazLhq8XQtGZbY4pY3/JxY8Zdf/hEwGubbp7ErZXoN1+h2yesxA==
dependencies:
- "@types/tern" "*"
+ bun-types "1.1.37"
+
+"@types/canvas-confetti@^1.6.4":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@types/canvas-confetti/-/canvas-confetti-1.9.0.tgz#d1077752e046413c9881fbb2ba34a70ebe3c1773"
+ integrity sha512-aBGj/dULrimR1XDZLtG9JwxX1b4HPRF6CX9Yfwh3NvstZEm1ZL7RBnel4keCPSqs1ANRu1u2Aoz9R+VmtjYuTg==
-"@types/codemirror@^5.60.4":
- version "5.60.5"
- resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-5.60.5.tgz#5b989a3b4bbe657458cf372c92b6bfda6061a2b7"
- integrity sha512-TiECZmm8St5YxjFUp64LK0c8WU5bxMDt9YaAek1UqUb9swrSCoJhh92fWu1p3mTEqlHjhB5sY7OFBhWroJXZVg==
+"@types/codemirror@^5.60.4", "@types/codemirror@~5.60.5":
+ version "5.60.15"
+ resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-5.60.15.tgz#0f82be6f4126d1e59cf4c4830e56dcd49d3c3e8a"
+ integrity sha512-dTOvwEQ+ouKJ/rE9LT1Ue2hmP6H1mZv5+CCnNWu2qtiOe2LQa9lCprEY20HxiDmV/Bxh+dXjywmy5aKvoGjULA==
dependencies:
"@types/tern" "*"
@@ -2233,10 +2210,20 @@
resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d"
integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==
+"@types/didyoumean@^1.2.3":
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/@types/didyoumean/-/didyoumean-1.2.3.tgz#ae82af90c8ad3e9606f428821e90a12bfa80eba9"
+ integrity sha512-jmogYbzJs7gehniakiGVlKCxrEqVfYL5oKdV2/026DGMGlhbYJWuO88oM4RcncgoZp0p/rCO7ipiYaxYxWedow==
+
+"@types/diff@^6.0.0":
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/@types/diff/-/diff-6.0.0.tgz#031f27cf57564f3cce825f38fb19fdd4349ad07a"
+ integrity sha512-dhVCYGv3ZSbzmQaBSagrv1WJ6rXCdkyTcDyoNu1MD8JohI7pR7k8wdZEm+mvdxRKXyHVwckFzWU1vJc+Z29MlA==
+
"@types/estree@*":
- version "0.0.50"
- resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83"
- integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50"
+ integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==
"@types/faker@5.5.9":
version "5.5.9"
@@ -2249,70 +2236,84 @@
integrity sha512-QJ1znjr9CDax2L17rgBnDOfNHsC1XtVAMswu+lRWvWb+kANhHA0slUNSSBsG8FVNvM4I4yXlN9doJRot3A2hkQ==
"@types/graceful-fs@^4.1.2":
- version "4.1.5"
- resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15"
- integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==
+ version "4.1.9"
+ resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4"
+ integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==
dependencies:
"@types/node" "*"
"@types/humps@^2.0.0":
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/@types/humps/-/humps-2.0.1.tgz#fc87ccbe59913240c3fdca5f0dd43cb9f073eb72"
- integrity sha512-cxIGJjiOQRl5s/KjqoTa0u39qKrVD3T6+6eGsERva0MLBp9AMVG8udKn9JZgVDe9zF0J9H4SRVzKILK6iZ9IZQ==
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/@types/humps/-/humps-2.0.6.tgz#a358688fe092e40b5f50261e0a55e2fa6d68cabe"
+ integrity sha512-Fagm1/a/1J9gDKzGdtlPmmTN5eSw/aaTzHtj740oSfo+MODsSY2WglxMmhTdOglC8nxqUhGGQ+5HfVtBvxo3Kg==
"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44"
- integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7"
+ integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==
"@types/istanbul-lib-report@*":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686"
- integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf"
+ integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==
dependencies:
"@types/istanbul-lib-coverage" "*"
"@types/istanbul-reports@^3.0.0":
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff"
- integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54"
+ integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==
dependencies:
"@types/istanbul-lib-report" "*"
"@types/jest@*":
- version "27.4.0"
- resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.4.0.tgz#037ab8b872067cae842a320841693080f9cb84ed"
- integrity sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ==
+ version "29.5.14"
+ resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5"
+ integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==
dependencies:
- jest-diff "^27.0.0"
- pretty-format "^27.0.0"
+ expect "^29.0.0"
+ pretty-format "^29.0.0"
"@types/jquery@^3.5.5":
- version "3.5.13"
- resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.13.tgz#5482d3ee325d5862f77a91c09369ae0a5b082bf3"
- integrity sha512-ZxJrup8nz/ZxcU0vantG+TPdboMhB24jad2uSap50zE7Q9rUeYlCF25kFMSmHR33qoeOgqcdHEp3roaookC0Sg==
+ version "3.5.32"
+ resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.32.tgz#3eb0da20611b92c7c49ebed6163b52a4fdc57def"
+ integrity sha512-b9Xbf4CkMqS02YH8zACqN1xzdxc3cO735Qe5AbSUFmyOiaWAbcpqh9Wna+Uk0vgACvoQHpWDg2rGdHkYPLmCiQ==
dependencies:
"@types/sizzle" "*"
"@types/json-schema@^7.0.7":
- version "7.0.9"
- resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d"
- integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==
+ version "7.0.15"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
+ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
+
+"@types/lodash.clonedeep@^4.5.9":
+ version "4.5.9"
+ resolved "https://registry.yarnpkg.com/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.9.tgz#ea48276c7cc18d080e00bb56cf965bcceb3f0fc1"
+ integrity sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q==
+ dependencies:
+ "@types/lodash" "*"
+
+"@types/lodash.isequal@^4.5.8":
+ version "4.5.8"
+ resolved "https://registry.yarnpkg.com/@types/lodash.isequal/-/lodash.isequal-4.5.8.tgz#b30bb6ff6a5f6c19b3daf389d649ac7f7a250499"
+ integrity sha512-uput6pg4E/tj2LGxCZo9+y27JNyB2OZuuI/T5F+ylVDYuqICLG2/ktjxx0v6GvVntAf8TvEzeQLcV0ffRirXuA==
+ dependencies:
+ "@types/lodash" "*"
+
+"@types/lodash@*", "@types/lodash@^4.14.165":
+ version "4.17.13"
+ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.13.tgz#786e2d67cfd95e32862143abe7463a7f90c300eb"
+ integrity sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==
-"@types/lodash@4.14.178", "@types/lodash@^4.14.165":
+"@types/lodash@4.14.178":
version "4.14.178"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.178.tgz#341f6d2247db528d4a13ddbb374bcdc80406f4f8"
integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==
-"@types/marked@^2.0.2":
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/@types/marked/-/marked-2.0.5.tgz#453e27f1e97199d45bb25297b0dd2b9bbc1e05ea"
- integrity sha512-shRZ7XnYFD/8n8zSjKvFdto1QNSf4tONZIlNEZGrJe8GsOE8DL/hG1Hbl8gZlfLnjS7+f5tZGIaTgfpyW38h4w==
-
-"@types/marked@^4.0.1":
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/@types/marked/-/marked-4.0.2.tgz#cb2dbf10da2f41cf20bd91fb5f89b67540c282f7"
- integrity sha512-auNrZ/c0w6wsM9DccwVxWHssrMDezHUAXNesdp2RQrCVCyrQbOiSq7yqdJKrUQQpw9VTm7CGYJH2A/YG7jjrjQ==
+"@types/marked@^4.0.7":
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/@types/marked/-/marked-4.3.2.tgz#e2e0ad02ebf5626bd215c5bae2aff6aff0ce9eac"
+ integrity sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==
"@types/minimatch@^3.0.3":
version "3.0.5"
@@ -2320,14 +2321,23 @@
integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
"@types/mousetrap@^1.6.8":
- version "1.6.9"
- resolved "https://registry.yarnpkg.com/@types/mousetrap/-/mousetrap-1.6.9.tgz#f1ef9adbd1eac3466f21b6988b1c82c633a45340"
- integrity sha512-HUAiN65VsRXyFCTicolwb5+I7FM6f72zjMWr+ajGk+YTvzBgXqa2A5U7d+rtsouAkunJ5U4Sb5lNJjo9w+nmXg==
+ version "1.6.15"
+ resolved "https://registry.yarnpkg.com/@types/mousetrap/-/mousetrap-1.6.15.tgz#f144a0c539a4cef553a631824651d48267e53c86"
+ integrity sha512-qL0hyIMNPow317QWW/63RvL1x5MVMV+Ru3NaY9f/CuEpCqrmb7WeuK2071ZY5hczOnm38qExWM2i2WtkXLSqFw==
"@types/node@*":
- version "17.0.14"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.14.tgz#33b9b94f789a8fedd30a68efdbca4dbb06b61f20"
- integrity sha512-SbjLmERksKOGzWzPNuW7fJM7fk3YXVTFiZWB/Hs99gwhk+/dnrQRPBQjPW9aO+fi1tAffi9PrwFvsmOKmDTyng==
+ version "22.10.2"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.2.tgz#a485426e6d1fdafc7b0d4c7b24e2c78182ddabb9"
+ integrity sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==
+ dependencies:
+ undici-types "~6.20.0"
+
+"@types/node@~20.12.8":
+ version "20.12.14"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.14.tgz#0c5cf7ef26aedfd64b0539bba9380ed1f57dcc77"
+ integrity sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg==
+ dependencies:
+ undici-types "~5.26.4"
"@types/normalize-url@^4.2.0":
version "4.2.0"
@@ -2337,9 +2347,9 @@
normalize-url "*"
"@types/parse-json@^4.0.0":
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
- integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239"
+ integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==
"@types/pluralize@^0.0.29":
version "0.0.29"
@@ -2347,92 +2357,80 @@
integrity sha512-BYOID+l2Aco2nBik+iYS4SZX0Lf20KPILP5RGmM1IgzdwNdTs0eebiFriOPcej1sX9mLnSoiNte5zcFxssgpGA==
"@types/prettier@^2.1.5":
- version "2.4.3"
- resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.3.tgz#a3c65525b91fca7da00ab1a3ac2b5a2a4afbffbf"
- integrity sha512-QzSuZMBuG5u8HqYz01qtMdg/Jfctlnvj1z/lYnIDXs/golxw0fxtRAHd9KrzjR7Yxz1qVeI00o0kiO3PmVdJ9w==
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f"
+ integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==
"@types/prop-types@*":
- version "15.7.4"
- resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11"
- integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==
+ version "15.7.14"
+ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.14.tgz#1433419d73b2a7ebfc6918dcefd2ec0d5cd698f2"
+ integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==
"@types/qs@^6.9.5":
- version "6.9.7"
- resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
- integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==
+ version "6.9.17"
+ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.17.tgz#fc560f60946d0aeff2f914eb41679659d3310e1a"
+ integrity sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==
"@types/react-dom@^18.0.0", "@types/react-dom@^18.2.7":
- version "18.2.7"
- resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.7.tgz#67222a08c0a6ae0a0da33c3532348277c70abb63"
- integrity sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==
- dependencies:
- "@types/react" "*"
+ version "18.3.5"
+ resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.5.tgz#45f9f87398c5dcea085b715c58ddcf1faf65f716"
+ integrity sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==
"@types/react-image-crop@^8.1.2":
- version "8.1.3"
- resolved "https://registry.yarnpkg.com/@types/react-image-crop/-/react-image-crop-8.1.3.tgz#1317f4f19f334ca22f7ff15927a72e8a8291ece3"
- integrity sha512-icfA+xMUQIp4/u525uNRKVZyHA/j8C1dp7yFWiGC6dqXSKXoUg5QhqUotrrzxY285LgQMgaWBRjQzXyeUAKUUA==
+ version "8.1.6"
+ resolved "https://registry.yarnpkg.com/@types/react-image-crop/-/react-image-crop-8.1.6.tgz#9e25b6245733284f0ab4b594047b8c4f6d08f7a4"
+ integrity sha512-mH3qs5sk2lq0JitgAOyyFeQQ8Zlz+yCIhn4CNznmoRyH4PIRMpZUWi+hGqLyUeKTSMAg+daS3txHMR3oBAkkRg==
dependencies:
"@types/react" "*"
"@types/react-modal@^3.12.0":
- version "3.13.1"
- resolved "https://registry.yarnpkg.com/@types/react-modal/-/react-modal-3.13.1.tgz#5b9845c205fccc85d9a77966b6e16dc70a60825a"
- integrity sha512-iY/gPvTDIy6Z+37l+ibmrY+GTV4KQTHcCyR5FIytm182RQS69G5ps4PH2FxtC7bAQ2QRHXMevsBgck7IQruHNg==
+ version "3.16.3"
+ resolved "https://registry.yarnpkg.com/@types/react-modal/-/react-modal-3.16.3.tgz#250f32c07f1de28e2bcf9c3e84b56adaa6897013"
+ integrity sha512-xXuGavyEGaFQDgBv4UVm8/ZsG+qxeQ7f77yNrW3n+1J6XAstUy5rYHeIHPh1KzsGc6IkCIdu6lQ2xWzu1jBTLg==
dependencies:
"@types/react" "*"
"@types/react-transition-group@^4.4.0":
- version "4.4.8"
- resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.8.tgz#46f87d80512959cac793ecc610a93d80ef241ccf"
- integrity sha512-QmQ22q+Pb+HQSn04NL3HtrqHwYMf4h3QKArOy5F8U5nEVMaihBs3SR10WiOM1iwPz5jIo8x/u11al+iEGZZrvg==
- dependencies:
- "@types/react" "*"
+ version "4.4.12"
+ resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.12.tgz#b5d76568485b02a307238270bfe96cb51ee2a044"
+ integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==
"@types/react@*":
- version "17.0.38"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.38.tgz#f24249fefd89357d5fa71f739a686b8d7c7202bd"
- integrity sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.2.tgz#9363e6b3ef898c471cb182dd269decc4afc1b4f6"
+ integrity sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg==
dependencies:
- "@types/prop-types" "*"
- "@types/scheduler" "*"
csstype "^3.0.2"
"@types/react@^18.2.21":
- version "18.2.21"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.21.tgz#774c37fd01b522d0b91aed04811b58e4e0514ed9"
- integrity sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==
+ version "18.3.18"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.18.tgz#9b382c4cd32e13e463f97df07c2ee3bbcd26904b"
+ integrity sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==
dependencies:
"@types/prop-types" "*"
- "@types/scheduler" "*"
csstype "^3.0.2"
-"@types/scheduler@*":
- version "0.16.2"
- resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39"
- integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==
-
"@types/sizzle@*":
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef"
- integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==
+ version "2.3.9"
+ resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.9.tgz#d4597dbd4618264c414d7429363e3f50acb66ea2"
+ integrity sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==
"@types/stack-utils@^2.0.0":
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c"
- integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8"
+ integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==
"@types/tern@*":
- version "0.23.4"
- resolved "https://registry.yarnpkg.com/@types/tern/-/tern-0.23.4.tgz#03926eb13dbeaf3ae0d390caf706b2643a0127fb"
- integrity sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==
+ version "0.23.9"
+ resolved "https://registry.yarnpkg.com/@types/tern/-/tern-0.23.9.tgz#6f6093a4a9af3e6bb8dde528e024924d196b367c"
+ integrity sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==
dependencies:
"@types/estree" "*"
"@types/testing-library__jest-dom@^5.9.1":
- version "5.14.2"
- resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.2.tgz#564fb2b2dc827147e937a75b639a05d17ce18b44"
- integrity sha512-vehbtyHUShPxIa9SioxDwCvgxukDMH//icJG90sXQBUm5lJOHLT5kNeU9tnivhnA/TkOFMzGIXN2cTc4hY8/kg==
+ version "5.14.9"
+ resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz#0fb1e6a0278d87b6737db55af5967570b67cb466"
+ integrity sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==
dependencies:
"@types/jest" "*"
@@ -2446,22 +2444,36 @@
resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc"
integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==
+"@types/ws@~8.5.10":
+ version "8.5.13"
+ resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.13.tgz#6414c280875e2691d0d1e080b05addbf5cb91e20"
+ integrity sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==
+ dependencies:
+ "@types/node" "*"
+
"@types/yargs-parser@*":
- version "20.2.1"
- resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129"
- integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==
+ version "21.0.3"
+ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15"
+ integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==
"@types/yargs@^15.0.0":
- version "15.0.14"
- resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06"
- integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==
+ version "15.0.19"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.19.tgz#328fb89e46109ecbdb70c295d96ff2f46dfd01b9"
+ integrity sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==
dependencies:
"@types/yargs-parser" "*"
"@types/yargs@^16.0.0":
- version "16.0.4"
- resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977"
- integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==
+ version "16.0.9"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.9.tgz#ba506215e45f7707e6cbcaf386981155b7ab956e"
+ integrity sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==
+ dependencies:
+ "@types/yargs-parser" "*"
+
+"@types/yargs@^17.0.8":
+ version "17.0.33"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d"
+ integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==
dependencies:
"@types/yargs-parser" "*"
@@ -2535,6 +2547,11 @@
"@typescript-eslint/types" "4.33.0"
eslint-visitor-keys "^2.0.0"
+"@uidotdev/usehooks@^2.4.1":
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/@uidotdev/usehooks/-/usehooks-2.4.1.tgz#4b733eaeae09a7be143c6c9ca158b56cc1ea75bf"
+ integrity sha512-1I+RwWyS+kdv3Mv0Vmc+p0dPYH0DTRAo04HLyXReYBL9AeseDWUJyi4THuksBJcu9F0Pih69Ak150VDnqbVnXg==
+
"@xstate/react@^3.2.2":
version "3.2.2"
resolved "https://registry.yarnpkg.com/@xstate/react/-/react-3.2.2.tgz#ddf0f9d75e2c19375b1e1b7335e72cb99762aed8"
@@ -2552,9 +2569,9 @@ JSONStream@^1.3.4, JSONStream@^1.3.5:
through ">=2.2.7 <3"
abab@^2.0.3, abab@^2.0.5:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a"
- integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291"
+ integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==
abbrev@1, abbrev@~1.1.1:
version "1.1.1"
@@ -2562,14 +2579,14 @@ abbrev@1, abbrev@~1.1.1:
integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
abortcontroller-polyfill@^1.7.3:
- version "1.7.3"
- resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz#1b5b487bd6436b5b764fd52a612509702c3144b5"
- integrity sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==
+ version "1.7.8"
+ resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.8.tgz#fe8d4370403f02e2aa37e3d2b0b178bae9d83f49"
+ integrity sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ==
ace-builds@^1.4.12:
- version "1.4.14"
- resolved "https://registry.yarnpkg.com/ace-builds/-/ace-builds-1.4.14.tgz#2c41ccbccdd09e665d3489f161a20baeb3a3c852"
- integrity sha512-NBOQlm9+7RBqRqZwimpgquaLeTJFayqb9UEPtTkpC3TkkwDnlsT/TwsCC0svjt9kEZ6G9mH5AEOHSz6Q/HrzQQ==
+ version "1.37.1"
+ resolved "https://registry.yarnpkg.com/ace-builds/-/ace-builds-1.37.1.tgz#a29c33c4817b14ecda3916bd1232974ebc11471f"
+ integrity sha512-6/jxFucA1z1C3hgLlVkTE5/znZ+iYvD301vfwtybiMc3k76IDykliCD0xh/eYZMJUfsJtaOQHZ2AJO5ey0PHWw==
acorn-globals@^6.0.0:
version "6.0.0"
@@ -2595,14 +2612,14 @@ acorn@^7.1.1, acorn@^7.4.0:
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
acorn@^8.2.4:
- version "8.7.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf"
- integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==
+ version "8.14.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0"
+ integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==
actioncable@^5.2.4-3:
- version "5.2.6"
- resolved "https://registry.yarnpkg.com/actioncable/-/actioncable-5.2.6.tgz#cea30647183524f3bae8c2a78fa6ecd6d4dbc70c"
- integrity sha512-ofLHm57nN24zghkl+tQe6IVrZeSJ655lNLQjNQJvtQkeTDqlF30McuMB4o9DqpxdHgW/w0RNWaAQHB6VPlleNQ==
+ version "5.2.8"
+ resolved "https://registry.yarnpkg.com/actioncable/-/actioncable-5.2.8.tgz#988c23d2d51513a572969348945eb7785eafcd5f"
+ integrity sha512-M/CfC7qDT7tux8B0BNYPek+aCw6OjB78K9l978Ff94U8v6+G9LOVCEnSFg4gxdAboRV8KTy9eTK3Wxbry4SXJA==
agent-base@4, agent-base@^4.3.0:
version "4.3.0"
@@ -2626,9 +2643,9 @@ agent-base@~4.2.1:
es6-promisify "^5.0.0"
agentkeepalive@^3.4.1:
- version "3.5.2"
- resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67"
- integrity sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==
+ version "3.5.3"
+ resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.3.tgz#c210afce942b4287e2df2fbfe6c0d57eda2ce634"
+ integrity sha512-yqXL+k5rr8+ZRpOAntkaaRgWgE5o8ESAj5DyRmVTCSoZxXmqemb9Dd7T4i5UzwuERdLAJUy6XzR9zFVuf0kzkw==
dependencies:
humanize-ms "^1.2.1"
@@ -2643,26 +2660,31 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4:
uri-js "^4.2.2"
ajv@^8.0.1:
- version "8.9.0"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.9.0.tgz#738019146638824dea25edcf299dcba1b0e7eb18"
- integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==
+ version "8.17.1"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6"
+ integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
dependencies:
- fast-deep-equal "^3.1.1"
+ fast-deep-equal "^3.1.3"
+ fast-uri "^3.0.1"
json-schema-traverse "^1.0.0"
require-from-string "^2.0.2"
- uri-js "^4.2.2"
+
+animejs@^3.2.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/animejs/-/animejs-3.2.2.tgz#59be98c58834339d5847f4a70ddba74ac75b6afc"
+ integrity sha512-Ao95qWLpDPXXM+WrmwcKbl6uNlC5tjnowlaRYtuVDHHoygjtIPfDUoK9NthrlZsQSKjZXlmji2TrBUAVbiH0LQ==
ansi-align@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
- integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=
+ integrity sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==
dependencies:
string-width "^2.0.0"
ansi-colors@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
- integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b"
+ integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==
ansi-escapes@^4.2.1:
version "4.3.2"
@@ -2674,17 +2696,17 @@ ansi-escapes@^4.2.1:
ansi-regex@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
- integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+ integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==
ansi-regex@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
- integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1"
+ integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==
ansi-regex@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
- integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed"
+ integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==
ansi-regex@^5.0.1:
version "5.0.1"
@@ -2723,12 +2745,12 @@ ansi-styles@^6.1.0:
ansicolors@~0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979"
- integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=
+ integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==
ansistyles@~0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539"
- integrity sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk=
+ integrity sha512-6QWEyvMgIXX0eO972y7YPBLSBsq7UWKFAoNNTLGaOJ9bstcEL9sCbcjf96dVfNDdUsRoGOK82vWFJlKApXds7g==
any-promise@^1.0.0:
version "1.3.0"
@@ -2743,15 +2765,7 @@ anymatch@^2.0.0:
micromatch "^3.1.4"
normalize-path "^2.1.1"
-anymatch@^3.0.3:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
- integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
- dependencies:
- normalize-path "^3.0.0"
- picomatch "^2.0.4"
-
-anymatch@~3.1.2:
+anymatch@^3.0.3, anymatch@~3.1.2:
version "3.1.3"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
@@ -2772,7 +2786,7 @@ aproba@^1.0.3, aproba@^1.1.1, aproba@^1.1.2:
archy@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
- integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=
+ integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==
are-we-there-yet@~1.1.2:
version "1.1.7"
@@ -2802,14 +2816,14 @@ aria-query@5.1.3:
deep-equal "^2.0.5"
aria-query@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.0.tgz#210c21aaf469613ee8c9a62c7f86525e058db52c"
- integrity sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59"
+ integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==
arr-diff@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
- integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
+ integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==
arr-flatten@^1.1.0:
version "1.1.0"
@@ -2819,30 +2833,31 @@ arr-flatten@^1.1.0:
arr-union@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
- integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
+ integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==
-array-buffer-byte-length@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead"
- integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==
+array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b"
+ integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==
dependencies:
- call-bind "^1.0.2"
- is-array-buffer "^3.0.1"
+ call-bound "^1.0.3"
+ is-array-buffer "^3.0.5"
array-differ@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b"
integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==
-array-includes@^3.1.3, array-includes@^3.1.4:
- version "3.1.4"
- resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9"
- integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==
+array-includes@^3.1.6, array-includes@^3.1.8:
+ version "3.1.8"
+ resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d"
+ integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.3"
- es-abstract "^1.19.1"
- get-intrinsic "^1.1.1"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-object-atoms "^1.0.0"
+ get-intrinsic "^1.2.4"
is-string "^1.0.7"
array-union@^2.1.0:
@@ -2858,16 +2873,76 @@ array-union@^3.0.1:
array-unique@^0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
- integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+ integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==
-array.prototype.flatmap@^1.2.5:
+array.prototype.findlast@^1.2.5:
version "1.2.5"
- resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz#908dc82d8a406930fdf38598d51e7411d18d4446"
- integrity sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==
+ resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904"
+ integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==
dependencies:
- call-bind "^1.0.0"
- define-properties "^1.1.3"
- es-abstract "^1.19.0"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ es-shim-unscopables "^1.0.2"
+
+array.prototype.flat@^1.3.1:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5"
+ integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==
+ dependencies:
+ call-bind "^1.0.8"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.5"
+ es-shim-unscopables "^1.0.2"
+
+array.prototype.flatmap@^1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b"
+ integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==
+ dependencies:
+ call-bind "^1.0.8"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.5"
+ es-shim-unscopables "^1.0.2"
+
+array.prototype.reduce@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz#6aadc2f995af29cb887eb866d981dc85ab6f7dc7"
+ integrity sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-array-method-boxes-properly "^1.0.0"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ is-string "^1.0.7"
+
+array.prototype.tosorted@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc"
+ integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.3"
+ es-errors "^1.3.0"
+ es-shim-unscopables "^1.0.2"
+
+arraybuffer.prototype.slice@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c"
+ integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==
+ dependencies:
+ array-buffer-byte-length "^1.0.1"
+ call-bind "^1.0.8"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.5"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.6"
+ is-array-buffer "^3.0.4"
arrify@^2.0.1:
version "2.0.1"
@@ -2877,7 +2952,7 @@ arrify@^2.0.1:
asap@^2.0.0, asap@~2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
- integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
+ integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==
asn1@~0.2.3:
version "0.2.6"
@@ -2889,12 +2964,12 @@ asn1@~0.2.3:
assert-plus@1.0.0, assert-plus@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
- integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
+ integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==
assign-symbols@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
- integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
+ integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==
astral-regex@^2.0.0:
version "2.0.0"
@@ -2904,39 +2979,41 @@ astral-regex@^2.0.0:
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
- integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
atob@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
-autoprefixer@^10.4.0:
- version "10.4.2"
- resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.2.tgz#25e1df09a31a9fba5c40b578936b90d35c9d4d3b"
- integrity sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==
+autoprefixer@latest:
+ version "10.4.20"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.20.tgz#5caec14d43976ef42e32dcb4bd62878e96be5b3b"
+ integrity sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==
dependencies:
- browserslist "^4.19.1"
- caniuse-lite "^1.0.30001297"
- fraction.js "^4.1.2"
+ browserslist "^4.23.3"
+ caniuse-lite "^1.0.30001646"
+ fraction.js "^4.3.7"
normalize-range "^0.1.2"
- picocolors "^1.0.0"
+ picocolors "^1.0.1"
postcss-value-parser "^4.2.0"
-available-typed-arrays@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7"
- integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
+available-typed-arrays@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846"
+ integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==
+ dependencies:
+ possible-typed-array-names "^1.0.0"
aws-sign2@~0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
- integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
+ integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==
aws4@^1.8.0:
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
- integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
+ version "1.13.2"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.2.tgz#0aa167216965ac9474ccfa83892cfb6b3e1e52ef"
+ integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==
babel-jest@^26.5.0, babel-jest@^26.6.3:
version "26.6.3"
@@ -2952,34 +3029,20 @@ babel-jest@^26.5.0, babel-jest@^26.6.3:
graceful-fs "^4.2.4"
slash "^3.0.0"
-babel-jest@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.4.6.tgz#4d024e69e241cdf4f396e453a07100f44f7ce314"
- integrity sha512-qZL0JT0HS1L+lOuH+xC2DVASR3nunZi/ozGhpgauJHgmI7f8rudxf6hUjEHympdQ/J64CdKmPkgfJ+A3U6QCrg==
+babel-jest@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444"
+ integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==
dependencies:
- "@jest/transform" "^27.4.6"
- "@jest/types" "^27.4.2"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
"@types/babel__core" "^7.1.14"
babel-plugin-istanbul "^6.1.1"
- babel-preset-jest "^27.4.0"
+ babel-preset-jest "^27.5.1"
chalk "^4.0.0"
- graceful-fs "^4.2.4"
+ graceful-fs "^4.2.9"
slash "^3.0.0"
-babel-plugin-dynamic-import-node-babel-7@^2.0.7:
- version "2.0.7"
- resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node-babel-7/-/babel-plugin-dynamic-import-node-babel-7-2.0.7.tgz#e778a8edb17488b472aa058ec451f1e75da4c0ec"
- integrity sha512-8DO7mdeczoxi0z1ggb6wS/yWkwM2F9uMPKsVeohK1Ff389JENDfZd+aINwM5r2p66IZGR0rkMrYCr2EyEGrGAQ==
- dependencies:
- "@babel/plugin-syntax-dynamic-import" "^7.0.0-beta.42"
-
-babel-plugin-dynamic-import-node@^2.3.3:
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
- integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
- dependencies:
- object.assign "^4.1.0"
-
babel-plugin-istanbul@^6.0.0, babel-plugin-istanbul@^6.1.1:
version "6.1.1"
resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73"
@@ -3001,10 +3064,10 @@ babel-plugin-jest-hoist@^26.6.2:
"@types/babel__core" "^7.0.0"
"@types/babel__traverse" "^7.0.6"
-babel-plugin-jest-hoist@^27.4.0:
- version "27.4.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.4.0.tgz#d7831fc0f93573788d80dee7e682482da4c730d6"
- integrity sha512-Jcu7qS4OX5kTWBc45Hz7BMmgXuJqRnhatqpUhnzGC3OBYpOmf2tv6jFNwZpwM7wU7MUuv2r9IPS/ZlYOuburVw==
+babel-plugin-jest-hoist@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e"
+ integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==
dependencies:
"@babel/template" "^7.3.3"
"@babel/types" "^7.3.3"
@@ -3020,29 +3083,29 @@ babel-plugin-macros@^3.1.0:
cosmiconfig "^7.0.0"
resolve "^1.19.0"
-babel-plugin-polyfill-corejs2@^0.3.0:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5"
- integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==
+babel-plugin-polyfill-corejs2@^0.4.10:
+ version "0.4.12"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz#ca55bbec8ab0edeeef3d7b8ffd75322e210879a9"
+ integrity sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==
dependencies:
- "@babel/compat-data" "^7.13.11"
- "@babel/helper-define-polyfill-provider" "^0.3.1"
- semver "^6.1.1"
+ "@babel/compat-data" "^7.22.6"
+ "@babel/helper-define-polyfill-provider" "^0.6.3"
+ semver "^6.3.1"
-babel-plugin-polyfill-corejs3@^0.5.0:
- version "0.5.2"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72"
- integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==
+babel-plugin-polyfill-corejs3@^0.10.6:
+ version "0.10.6"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7"
+ integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==
dependencies:
- "@babel/helper-define-polyfill-provider" "^0.3.1"
- core-js-compat "^3.21.0"
+ "@babel/helper-define-polyfill-provider" "^0.6.2"
+ core-js-compat "^3.38.0"
-babel-plugin-polyfill-regenerator@^0.3.0:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990"
- integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==
+babel-plugin-polyfill-regenerator@^0.6.1:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz#abeb1f3f1c762eace37587f42548b08b57789bc8"
+ integrity sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==
dependencies:
- "@babel/helper-define-polyfill-provider" "^0.3.1"
+ "@babel/helper-define-polyfill-provider" "^0.6.3"
babel-plugin-transform-react-remove-prop-types@^0.4.24:
version "0.4.24"
@@ -3050,22 +3113,25 @@ babel-plugin-transform-react-remove-prop-types@^0.4.24:
integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==
babel-preset-current-node-syntax@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b"
- integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30"
+ integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==
dependencies:
"@babel/plugin-syntax-async-generators" "^7.8.4"
"@babel/plugin-syntax-bigint" "^7.8.3"
- "@babel/plugin-syntax-class-properties" "^7.8.3"
- "@babel/plugin-syntax-import-meta" "^7.8.3"
+ "@babel/plugin-syntax-class-properties" "^7.12.13"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+ "@babel/plugin-syntax-import-attributes" "^7.24.7"
+ "@babel/plugin-syntax-import-meta" "^7.10.4"
"@babel/plugin-syntax-json-strings" "^7.8.3"
- "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
- "@babel/plugin-syntax-numeric-separator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
"@babel/plugin-syntax-object-rest-spread" "^7.8.3"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
"@babel/plugin-syntax-optional-chaining" "^7.8.3"
- "@babel/plugin-syntax-top-level-await" "^7.8.3"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+ "@babel/plugin-syntax-top-level-await" "^7.14.5"
babel-preset-jest@^26.6.2:
version "26.6.2"
@@ -3075,12 +3141,12 @@ babel-preset-jest@^26.6.2:
babel-plugin-jest-hoist "^26.6.2"
babel-preset-current-node-syntax "^1.0.0"
-babel-preset-jest@^27.4.0:
- version "27.4.0"
- resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.4.0.tgz#70d0e676a282ccb200fbabd7f415db5fdf393bca"
- integrity sha512-NK4jGYpnBvNxcGo7/ZpZJr51jCGT+3bwwpVIDY2oNfTxJJldRtB4VAcYdgp1loDE50ODuTu+yBjpMAswv5tlpg==
+babel-preset-jest@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81"
+ integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==
dependencies:
- babel-plugin-jest-hoist "^27.4.0"
+ babel-plugin-jest-hoist "^27.5.1"
babel-preset-current-node-syntax "^1.0.0"
balanced-match@^1.0.0:
@@ -3104,7 +3170,7 @@ base@^0.11.1:
bcrypt-pbkdf@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
- integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
+ integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==
dependencies:
tweetnacl "^0.14.3"
@@ -3125,7 +3191,7 @@ binary-extensions@^2.0.0:
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
-bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5:
+bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5, bluebird@^3.7.2:
version "3.7.2"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
@@ -3133,7 +3199,7 @@ bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5:
boolbase@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
- integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
+ integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==
boxen@^1.2.1:
version "1.3.0"
@@ -3179,7 +3245,7 @@ braces@^2.3.1:
split-string "^3.0.2"
to-regex "^3.0.1"
-braces@^3.0.1, braces@^3.0.3, braces@~3.0.2:
+braces@^3.0.3, braces@~3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
@@ -3192,33 +3258,21 @@ browser-process-hrtime@^1.0.0:
integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
browserslist-to-esbuild@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/browserslist-to-esbuild/-/browserslist-to-esbuild-1.1.1.tgz#acb743cb7877ddec8c51d41cc9a2a7fe8e7ddbb5"
- integrity sha512-FGnR2nWUvgQhHXN6KFGybfAEdAnHetmv7oiS3EE6qFmERILZ/3fxY9X2KGgvb9+TzBG5sW/sxwknUZJiWJTL5Q==
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserslist-to-esbuild/-/browserslist-to-esbuild-1.2.0.tgz#5c5b9ca73106da02e0168007396c4ec4c1e6d643"
+ integrity sha512-ftrrbI/VHBgEnmnSyhkqvQVMp6jAKybfs0qMIlm7SLBrQTGMsdCIP4q3BoKeLsZTBQllIQtY9kbxgRYV2WU47g==
dependencies:
browserslist "^4.17.3"
-browserslist@^4.0.0, browserslist@^4.16.6:
- version "4.19.3"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.3.tgz#29b7caad327ecf2859485f696f9604214bedd383"
- integrity sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==
- dependencies:
- caniuse-lite "^1.0.30001312"
- electron-to-chromium "^1.4.71"
- escalade "^3.1.1"
- node-releases "^2.0.2"
- picocolors "^1.0.0"
-
-browserslist@^4.17.3, browserslist@^4.17.5, browserslist@^4.19.1:
- version "4.19.1"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3"
- integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==
+browserslist@^4.0.0, browserslist@^4.17.3, browserslist@^4.21.4, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.24.2:
+ version "4.24.3"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.3.tgz#5fc2725ca8fb3c1432e13dac278c7cc103e026d2"
+ integrity sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==
dependencies:
- caniuse-lite "^1.0.30001286"
- electron-to-chromium "^1.4.17"
- escalade "^3.1.1"
- node-releases "^2.0.1"
- picocolors "^1.0.0"
+ caniuse-lite "^1.0.30001688"
+ electron-to-chromium "^1.5.73"
+ node-releases "^2.0.19"
+ update-browserslist-db "^1.1.1"
bser@2.1.1:
version "2.1.1"
@@ -3235,19 +3289,27 @@ buffer-from@^1.0.0:
builtins@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
- integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og=
+ integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==
+
+bun-types@1.1.37:
+ version "1.1.37"
+ resolved "https://registry.yarnpkg.com/bun-types/-/bun-types-1.1.37.tgz#8caab7fa0dd1490a368c5e4dd0614d500e15e7e9"
+ integrity sha512-C65lv6eBr3LPJWFZ2gswyrGZ82ljnH8flVE03xeXxKhi2ZGtFiO4isRKTKnitbSqtRAcaqYSR6djt1whI66AbA==
+ dependencies:
+ "@types/node" "~20.12.8"
+ "@types/ws" "~8.5.10"
byline@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1"
- integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=
+ integrity sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==
byte-size@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-5.0.1.tgz#4b651039a5ecd96767e71a3d7ed380e48bed4191"
integrity sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw==
-cacache@^12.0.0, cacache@^12.0.2, cacache@^12.0.3:
+cacache@^12.0.0, cacache@^12.0.2, cacache@^12.0.4:
version "12.0.4"
resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c"
integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==
@@ -3283,13 +3345,31 @@ cache-base@^1.0.1:
union-value "^1.0.0"
unset-value "^1.0.0"
-call-bind@^1.0.0, call-bind@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
- integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840"
+ integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==
+ dependencies:
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+
+call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.7, call-bind@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c"
+ integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==
+ dependencies:
+ call-bind-apply-helpers "^1.0.0"
+ es-define-property "^1.0.0"
+ get-intrinsic "^1.2.4"
+ set-function-length "^1.2.2"
+
+call-bound@^1.0.2, call-bound@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681"
+ integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==
dependencies:
- function-bind "^1.1.1"
- get-intrinsic "^1.0.2"
+ call-bind-apply-helpers "^1.0.1"
+ get-intrinsic "^1.2.6"
call-limit@^1.1.1:
version "1.1.1"
@@ -3306,10 +3386,10 @@ camelcase-css@^2.0.1:
resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5"
integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
-camelcase@^4.0.0, camelcase@^4.1.0:
+camelcase@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
- integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
+ integrity sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==
camelcase@^5.0.0, camelcase@^5.3.1:
version "5.3.1"
@@ -3331,10 +3411,10 @@ caniuse-api@^3.0.0:
lodash.memoize "^4.1.2"
lodash.uniq "^4.5.0"
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001286, caniuse-lite@^1.0.30001297, caniuse-lite@^1.0.30001312:
- version "1.0.30001618"
- resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001618.tgz"
- integrity sha512-p407+D1tIkDvsEAPS22lJxLQQaG8OTBEqo0KhzfABGk0TU4juBNDSfH0hyAp/HRyx+M8L17z/ltyhxh27FTfQg==
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001688:
+ version "1.0.30001690"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz#f2d15e3aaf8e18f76b2b8c1481abde063b8104c8"
+ integrity sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==
canvas-confetti@^1.9.3:
version "1.9.3"
@@ -3349,16 +3429,16 @@ capture-exit@^2.0.0:
rsvp "^4.8.4"
capture-stack-trace@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d"
- integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz#1c43f6b059d4249e7f3f8724f15f048b927d3a8a"
+ integrity sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==
caseless@~0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
- integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
+ integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==
-chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2:
+chalk@^2.0.1, chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -3389,26 +3469,11 @@ char-regex@^1.0.2:
integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
chart.js@^3.1.0:
- version "3.7.0"
- resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-3.7.0.tgz#7a19c93035341df801d613993c2170a1fcf1d882"
- integrity sha512-31gVuqqKp3lDIFmzpKIrBeum4OpZsQjSIAqlOpgjosHDJZlULtvwLEZKtEhIAZc7JMPaHlYMys40Qy9Mf+1AAg==
-
-chokidar@^3.3.0, chokidar@^3.4.2:
- version "3.5.3"
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
- integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
- dependencies:
- anymatch "~3.1.2"
- braces "~3.0.2"
- glob-parent "~5.1.2"
- is-binary-path "~2.1.0"
- is-glob "~4.0.1"
- normalize-path "~3.0.0"
- readdirp "~3.6.0"
- optionalDependencies:
- fsevents "~2.3.2"
+ version "3.9.1"
+ resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-3.9.1.tgz#3abf2c775169c4c71217a107163ac708515924b8"
+ integrity sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w==
-chokidar@^3.5.3:
+chokidar@^3.3.0, chokidar@^3.4.2, chokidar@^3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
@@ -3439,9 +3504,9 @@ ci-info@^2.0.0:
integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
ci-info@^3.2.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2"
- integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4"
+ integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==
cidr-regex@^2.0.10:
version "2.0.10"
@@ -3451,9 +3516,9 @@ cidr-regex@^2.0.10:
ip-regex "^2.1.0"
cjs-module-lexer@^1.0.0:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40"
- integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170"
+ integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==
class-utils@^0.3.5:
version "0.3.6"
@@ -3468,12 +3533,12 @@ class-utils@^0.3.5:
cli-boxes@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
- integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM=
+ integrity sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==
cli-columns@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/cli-columns/-/cli-columns-3.1.2.tgz#6732d972979efc2ae444a1f08e08fa139c96a18e"
- integrity sha1-ZzLZcpee/CrkRKHwjgj6E5yWoY4=
+ integrity sha512-iQYpDgpPPmCjn534ikQOhi+ydP6uMar+DtJ6a0In4aGL/PKqWfao75s6eF81quQQaz7isGz+goNECLARRZswdg==
dependencies:
string-width "^2.0.0"
strip-ansi "^3.0.1"
@@ -3488,15 +3553,6 @@ cli-table3@^0.5.0, cli-table3@^0.5.1:
optionalDependencies:
colors "^1.1.2"
-cliui@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
- integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
- dependencies:
- string-width "^1.0.1"
- strip-ansi "^3.0.1"
- wrap-ansi "^2.0.0"
-
cliui@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
@@ -3515,15 +3571,24 @@ cliui@^7.0.2:
strip-ansi "^6.0.0"
wrap-ansi "^7.0.0"
+cliui@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
+ integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.1"
+ wrap-ansi "^7.0.0"
+
clone@^1.0.2:
version "1.0.4"
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
- integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
+ integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==
clsx@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188"
- integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12"
+ integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==
cmd-shim@^3.0.0, cmd-shim@^3.0.3:
version "3.0.3"
@@ -3536,16 +3601,24 @@ cmd-shim@^3.0.0, cmd-shim@^3.0.3:
co@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
- integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
+ integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==
code-point-at@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
- integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
+ integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==
"codemirror-lang-elixir@https://github.com/sachinraja/codemirror-lang-elixir":
- version "2.0.0"
- resolved "https://github.com/sachinraja/codemirror-lang-elixir#999a3eb1fc8465d8ca01121aa9c2b52b4ccf9efb"
+ version "3.0.1"
+ resolved "https://github.com/sachinraja/codemirror-lang-elixir#bc0e5af9a57aa5b4cff33bd83aea753106079354"
+
+codemirror-lang-jikiscript@dem4ron/codemirror-lang-jikiscript#jikify:
+ version "0.0.1"
+ resolved "https://codeload.github.com/dem4ron/codemirror-lang-jikiscript/tar.gz/9b6e10b44132a392ec50c6a03f9b021bccb69817"
+ dependencies:
+ "@codemirror/language" "^6.10.1"
+ "@lezer/highlight" "^1.2.0"
+ "@lezer/lr" "^1.4.0"
codemirror-lang-jq@^1.0.0:
version "1.0.0"
@@ -3556,24 +3629,24 @@ codemirror-lang-jq@^1.0.0:
"@lezer/highlight" "^1.0.0"
"@lezer/lr" "^1.0.0"
+codemirror-readonly-ranges@^0.1.0-alpha.2:
+ version "0.1.0-alpha.2"
+ resolved "https://registry.yarnpkg.com/codemirror-readonly-ranges/-/codemirror-readonly-ranges-0.1.0-alpha.2.tgz#90cf1245d81efb60e8b87b5511211b7be8141d0f"
+ integrity sha512-PjT/gDAn9cm7wN/YigxgBMsxYbO52bvPQLbN8dXG9seHNANNE9KELteFaS00/+1UR4fAnCq7Ueh+KmRTlPgFTw==
+ dependencies:
+ range-analyzer ">= 0.1.1-alpha.1"
+
codemirror-spell-checker@1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/codemirror-spell-checker/-/codemirror-spell-checker-1.1.2.tgz#1c660f9089483ccb5113b9ba9ca19c3f4993371e"
- integrity sha1-HGYPkIlIPMtRE7m6nKGcP0mTNx4=
+ integrity sha512-2Tl6n0v+GJRsC9K3MLCdLaMOmvWL0uukajNJseorZJsslaxZyZMgENocPU8R0DyoTAiKsyqiemSOZo7kjGV0LQ==
dependencies:
typo-js "*"
-codemirror6-abap@^0.1.3:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/codemirror6-abap/-/codemirror6-abap-0.1.3.tgz#76a0ebdfbcbdbad5ba0ee6f78d95635ecefa1445"
- integrity sha512-eewTbvm+8HnTjtEi3hcMCHbid6ICyGo60hl5/NOeh/2gdOmhzgaDRpkt4DzNxw8q22LJyXi9K4jXNujLREDhBw==
- dependencies:
- "@codemirror/stream-parser" "^0.19.0"
-
codemirror@^5.63.1:
- version "5.65.1"
- resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.65.1.tgz#5988a812c974c467f964bcc1a00c944e373de502"
- integrity sha512-s6aac+DD+4O2u1aBmdxhB7yz2XU7tG3snOyQ05Kxifahz7hoxnfxIRHxiCSEv3TUC38dIVH8G+lZH9UWSfGQxA==
+ version "5.65.18"
+ resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.65.18.tgz#d7146e4271135a9b4adcd023a270185457c9c428"
+ integrity sha512-Gaz4gHnkbHMGgahNt3CA5HBk5lLQBqmD/pBgeB4kQU6OedZmqMBjlRF0LSrp2tJ4wlLNPm2FfaUd1pDy0mdlpA==
codemirror@^6.0.1:
version "6.0.1"
@@ -3589,14 +3662,14 @@ codemirror@^6.0.1:
"@codemirror/view" "^6.0.0"
collect-v8-coverage@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59"
- integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9"
+ integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==
collection-visit@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
- integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
+ integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==
dependencies:
map-visit "^1.0.0"
object-visit "^1.0.0"
@@ -3618,7 +3691,7 @@ color-convert@^2.0.1:
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
- integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
color-name@~1.1.4:
version "1.1.4"
@@ -3626,9 +3699,9 @@ color-name@~1.1.4:
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
colord@^2.9.1:
- version "2.9.2"
- resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1"
- integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==
+ version "2.9.3"
+ resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43"
+ integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==
colors@^1.1.2:
version "1.4.0"
@@ -3638,7 +3711,7 @@ colors@^1.1.2:
columnify@~1.5.4:
version "1.5.4"
resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb"
- integrity sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=
+ integrity sha512-rFl+iXVT1nhLQPfGDw+3WcS8rmm7XsLKUmhsGE3ihzzpIikeGrTaZPIRKYWeLsLBypsHzjXIvYEltVUZS84XxQ==
dependencies:
strip-ansi "^3.0.0"
wcwidth "^1.0.0"
@@ -3655,15 +3728,20 @@ commander@^4.0.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
+commander@^6.2.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
+ integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==
+
commander@^7.2.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
component-emitter@^1.2.1:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
- integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17"
+ integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==
concat-map@0.0.1:
version "0.0.1"
@@ -3680,7 +3758,7 @@ concat-stream@^1.5.0:
readable-stream "^2.2.2"
typedarray "^0.0.6"
-config-chain@^1.1.12:
+config-chain@^1.1.13:
version "1.1.13"
resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4"
integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==
@@ -3703,24 +3781,22 @@ configstore@^3.0.0:
console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
- integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
-
-convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
- integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
- dependencies:
- safe-buffer "~5.1.1"
+ integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==
-convert-source-map@^1.5.0:
+convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0:
version "1.9.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
+convert-source-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
+ integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
cookie@^0.4.1:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
- integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432"
+ integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
copy-concurrently@^1.0.0:
version "1.0.5"
@@ -3737,32 +3813,31 @@ copy-concurrently@^1.0.0:
copy-descriptor@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
- integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
+ integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==
copy-to-clipboard@^3.3.1:
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae"
- integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0"
+ integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==
dependencies:
toggle-selection "^1.0.6"
-core-js-compat@^3.20.2, core-js-compat@^3.21.0:
- version "3.21.0"
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.21.0.tgz#bcc86aa5a589cee358e7a7fa0a4979d5a76c3885"
- integrity sha512-OSXseNPSK2OPJa6GdtkMz/XxeXx8/CJvfhQWTqd6neuUraujcL4jVsjkLQz1OWnax8xVQJnRPe0V2jqNWORA+A==
+core-js-compat@^3.38.0, core-js-compat@^3.38.1:
+ version "3.39.0"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.39.0.tgz#b12dccb495f2601dc860bdbe7b4e3ffa8ba63f61"
+ integrity sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==
dependencies:
- browserslist "^4.19.1"
- semver "7.0.0"
+ browserslist "^4.24.2"
core-js@^3.6.5:
- version "3.21.0"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.21.0.tgz#f479dbfc3dffb035a0827602dd056839a774aa71"
- integrity sha512-YUdI3fFu4TF/2WykQ2xzSiTQdldLB4KVuL9WeAy5XONZYt5Cun/fpQvctoKbCgvPhmzADeesTk/j2Rdx77AcKQ==
+ version "3.39.0"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.39.0.tgz#57f7647f4d2d030c32a72ea23a0555b2eaa30f83"
+ integrity sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==
core-util-is@1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
- integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+ integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==
core-util-is@~1.0.0:
version "1.0.3"
@@ -3770,9 +3845,9 @@ core-util-is@~1.0.0:
integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
cosmiconfig@^7.0.0:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d"
- integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6"
+ integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==
dependencies:
"@types/parse-json" "^4.0.0"
import-fresh "^3.2.1"
@@ -3783,7 +3858,7 @@ cosmiconfig@^7.0.0:
create-error-class@^3.0.0:
version "3.0.2"
resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
- integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=
+ integrity sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==
dependencies:
capture-stack-trace "^1.0.0"
@@ -3795,16 +3870,16 @@ crelt@^1.0.5:
cross-spawn@^5.0.1:
version "5.1.0"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
- integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
+ integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==
dependencies:
lru-cache "^4.0.1"
shebang-command "^1.2.0"
which "^1.2.9"
cross-spawn@^6.0.0:
- version "6.0.5"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
- integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+ version "6.0.6"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.6.tgz#30d0efa0712ddb7eb5a76e1e8721bffafa6b5d57"
+ integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==
dependencies:
nice-try "^1.0.4"
path-key "^2.0.1"
@@ -3813,9 +3888,9 @@ cross-spawn@^6.0.0:
which "^1.2.9"
cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
- integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"
+ integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
dependencies:
path-key "^3.1.0"
shebang-command "^2.0.0"
@@ -3824,23 +3899,21 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
crypto-random-string@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
- integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=
+ integrity sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==
-css-declaration-sorter@^6.0.3:
- version "6.1.4"
- resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.1.4.tgz#b9bfb4ed9a41f8dcca9bf7184d849ea94a8294b4"
- integrity sha512-lpfkqS0fctcmZotJGhnxkIyJWvBXgpyi2wsFd4J8VB7wzyrT6Ch/3Q+FMNJpjK4gu1+GN5khOnpU2ZVKrLbhCw==
- dependencies:
- timsort "^0.3.0"
+css-declaration-sorter@^6.3.1:
+ version "6.4.1"
+ resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz#28beac7c20bad7f1775be3a7129d7eae409a3a71"
+ integrity sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==
css-select@^4.1.3:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.2.1.tgz#9e665d6ae4c7f9d65dbe69d0316e3221fb274cdd"
- integrity sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b"
+ integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==
dependencies:
boolbase "^1.0.0"
- css-what "^5.1.0"
- domhandler "^4.3.0"
+ css-what "^6.0.1"
+ domhandler "^4.3.1"
domutils "^2.8.0"
nth-check "^2.0.1"
@@ -3860,76 +3933,67 @@ css-tree@^1.1.2, css-tree@^1.1.3:
mdn-data "2.0.14"
source-map "^0.6.1"
-css-what@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe"
- integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==
+css-what@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4"
+ integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==
css.escape@^1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb"
- integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=
-
-css@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d"
- integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==
- dependencies:
- inherits "^2.0.4"
- source-map "^0.6.1"
- source-map-resolve "^0.6.0"
+ integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==
cssesc@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
-cssnano-preset-default@^5.1.12:
- version "5.1.12"
- resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.1.12.tgz#64e2ad8e27a279e1413d2d2383ef89a41c909be9"
- integrity sha512-rO/JZYyjW1QNkWBxMGV28DW7d98UDLaF759frhli58QFehZ+D/LSmwQ2z/ylBAe2hUlsIWTq6NYGfQPq65EF9w==
- dependencies:
- css-declaration-sorter "^6.0.3"
- cssnano-utils "^3.0.2"
- postcss-calc "^8.2.0"
- postcss-colormin "^5.2.5"
- postcss-convert-values "^5.0.4"
- postcss-discard-comments "^5.0.3"
- postcss-discard-duplicates "^5.0.3"
- postcss-discard-empty "^5.0.3"
- postcss-discard-overridden "^5.0.4"
- postcss-merge-longhand "^5.0.6"
- postcss-merge-rules "^5.0.6"
- postcss-minify-font-values "^5.0.4"
- postcss-minify-gradients "^5.0.6"
- postcss-minify-params "^5.0.5"
- postcss-minify-selectors "^5.1.3"
- postcss-normalize-charset "^5.0.3"
- postcss-normalize-display-values "^5.0.3"
- postcss-normalize-positions "^5.0.4"
- postcss-normalize-repeat-style "^5.0.4"
- postcss-normalize-string "^5.0.4"
- postcss-normalize-timing-functions "^5.0.3"
- postcss-normalize-unicode "^5.0.4"
- postcss-normalize-url "^5.0.5"
- postcss-normalize-whitespace "^5.0.4"
- postcss-ordered-values "^5.0.5"
- postcss-reduce-initial "^5.0.3"
- postcss-reduce-transforms "^5.0.4"
- postcss-svgo "^5.0.4"
- postcss-unique-selectors "^5.0.4"
-
-cssnano-utils@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.0.2.tgz#d82b4991a27ba6fec644b39bab35fe027137f516"
- integrity sha512-KhprijuQv2sP4kT92sSQwhlK3SJTbDIsxcfIEySB0O+3m9esFOai7dP9bMx5enHAh2MwarVIcnwiWoOm01RIbQ==
+cssnano-preset-default@^5.2.14:
+ version "5.2.14"
+ resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8"
+ integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==
+ dependencies:
+ css-declaration-sorter "^6.3.1"
+ cssnano-utils "^3.1.0"
+ postcss-calc "^8.2.3"
+ postcss-colormin "^5.3.1"
+ postcss-convert-values "^5.1.3"
+ postcss-discard-comments "^5.1.2"
+ postcss-discard-duplicates "^5.1.0"
+ postcss-discard-empty "^5.1.1"
+ postcss-discard-overridden "^5.1.0"
+ postcss-merge-longhand "^5.1.7"
+ postcss-merge-rules "^5.1.4"
+ postcss-minify-font-values "^5.1.0"
+ postcss-minify-gradients "^5.1.1"
+ postcss-minify-params "^5.1.4"
+ postcss-minify-selectors "^5.2.1"
+ postcss-normalize-charset "^5.1.0"
+ postcss-normalize-display-values "^5.1.0"
+ postcss-normalize-positions "^5.1.1"
+ postcss-normalize-repeat-style "^5.1.1"
+ postcss-normalize-string "^5.1.0"
+ postcss-normalize-timing-functions "^5.1.0"
+ postcss-normalize-unicode "^5.1.1"
+ postcss-normalize-url "^5.1.0"
+ postcss-normalize-whitespace "^5.1.1"
+ postcss-ordered-values "^5.1.3"
+ postcss-reduce-initial "^5.1.2"
+ postcss-reduce-transforms "^5.1.0"
+ postcss-svgo "^5.1.0"
+ postcss-unique-selectors "^5.1.1"
+
+cssnano-utils@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861"
+ integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==
cssnano@^5.0.17:
- version "5.0.17"
- resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.17.tgz#ff45713c05cfc780a1aeb3e663b6f224d091cabf"
- integrity sha512-fmjLP7k8kL18xSspeXTzRhaFtRI7DL9b8IcXR80JgtnWBpvAzHT7sCR/6qdn0tnxIaINUN6OEQu83wF57Gs3Xw==
+ version "5.1.15"
+ resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf"
+ integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==
dependencies:
- cssnano-preset-default "^5.1.12"
+ cssnano-preset-default "^5.2.14"
lilconfig "^2.0.3"
yaml "^1.10.2"
@@ -3958,9 +4022,9 @@ cssstyle@^2.3.0:
cssom "~0.3.6"
csstype@^3.0.2:
- version "3.0.10"
- resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5"
- integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
+ integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
currency.js@^2.0.4:
version "2.0.4"
@@ -3968,14 +4032,14 @@ currency.js@^2.0.4:
integrity sha512-6/OplJYgJ0RUlli74d93HJ/OsKVBi8lB1+Z6eJYS1YZzBuIp4qKKHpJ7ad+GvTlWmLR/hLJOWTykN5Nm8NJ7+w==
cyclist@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
- integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.2.tgz#673b5f233bf34d8e602b949429f8171d9121bea3"
+ integrity sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==
dashdash@^1.12.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
- integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
+ integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==
dependencies:
assert-plus "^1.0.0"
@@ -3988,10 +4052,37 @@ data-urls@^2.0.0:
whatwg-mimetype "^2.3.0"
whatwg-url "^8.0.0"
+data-view-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570"
+ integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==
+ dependencies:
+ call-bound "^1.0.3"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.2"
+
+data-view-byte-length@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735"
+ integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==
+ dependencies:
+ call-bound "^1.0.3"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.2"
+
+data-view-byte-offset@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191"
+ integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
dayjs@^1.8.35:
- version "1.10.7"
- resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.7.tgz#2cf5f91add28116748440866a0a1d26f3a6ce468"
- integrity sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==
+ version "1.11.13"
+ resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c"
+ integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==
debug@3.1.0:
version "3.1.0"
@@ -4001,11 +4092,11 @@ debug@3.1.0:
ms "2.0.0"
debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.0, debug@^4.3.1:
- version "4.3.3"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
- integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a"
+ integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==
dependencies:
- ms "2.1.2"
+ ms "^2.1.3"
debug@^2.2.0, debug@^2.3.3:
version "2.6.9"
@@ -4024,37 +4115,37 @@ debug@^3.1.0:
debuglog@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
- integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=
+ integrity sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==
-decamelize@^1.1.1, decamelize@^1.2.0:
+decamelize@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
- integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+ integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==
decimal.js@^10.2.1:
- version "10.3.1"
- resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783"
- integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==
+ version "10.4.3"
+ resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23"
+ integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==
decode-uri-component@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
- integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9"
+ integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
dedent@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
- integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=
+ integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==
deep-equal@^2.0.5:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.2.tgz#9b2635da569a13ba8e1cc159c2f744071b115daa"
- integrity sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1"
+ integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==
dependencies:
array-buffer-byte-length "^1.0.0"
- call-bind "^1.0.2"
+ call-bind "^1.0.5"
es-get-iterator "^1.1.3"
- get-intrinsic "^1.2.1"
+ get-intrinsic "^1.2.2"
is-arguments "^1.1.1"
is-array-buffer "^3.0.2"
is-date-object "^1.0.5"
@@ -4064,60 +4155,63 @@ deep-equal@^2.0.5:
object-is "^1.1.5"
object-keys "^1.1.1"
object.assign "^4.1.4"
- regexp.prototype.flags "^1.5.0"
+ regexp.prototype.flags "^1.5.1"
side-channel "^1.0.4"
which-boxed-primitive "^1.0.2"
which-collection "^1.0.1"
- which-typed-array "^1.1.9"
+ which-typed-array "^1.1.13"
deep-extend@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
-deep-is@^0.1.3, deep-is@~0.1.3:
+deep-is@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
deepmerge@^4.2.2:
- version "4.2.2"
- resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
- integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a"
+ integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
defaults@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
- integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a"
+ integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==
dependencies:
clone "^1.0.2"
-define-properties@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
- integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+define-data-property@^1.0.1, define-data-property@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
+ integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
dependencies:
- object-keys "^1.0.12"
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ gopd "^1.0.1"
-define-properties@^1.1.4, define-properties@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5"
- integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==
+define-properties@^1.1.3, define-properties@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
+ integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
dependencies:
+ define-data-property "^1.0.1"
has-property-descriptors "^1.0.0"
object-keys "^1.1.1"
define-property@^0.2.5:
version "0.2.5"
resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
- integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
+ integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==
dependencies:
is-descriptor "^0.1.0"
define-property@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
- integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
+ integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==
dependencies:
is-descriptor "^1.0.0"
@@ -4132,12 +4226,12 @@ define-property@^2.0.2:
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
- integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+ integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
delegates@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
- integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
+ integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==
dependency-graph@^0.11.0:
version "0.11.0"
@@ -4147,22 +4241,22 @@ dependency-graph@^0.11.0:
detect-indent@~5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
- integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50=
+ integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==
detect-newline@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
- integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=
+ integrity sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==
detect-newline@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==
-dezalgo@^1.0.0, dezalgo@~1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456"
- integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=
+dezalgo@^1.0.0, dezalgo@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81"
+ integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==
dependencies:
asap "^2.0.0"
wrappy "1"
@@ -4172,25 +4266,30 @@ didyoumean@^1.2.2:
resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037"
integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==
-diff-sequences@^27.4.0:
- version "27.4.0"
- resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.4.0.tgz#d783920ad8d06ec718a060d00196dfef25b132a5"
- integrity sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==
+diff-sequences@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327"
+ integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==
+
+diff-sequences@^29.6.3:
+ version "29.6.3"
+ resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921"
+ integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==
diff2html@^3.4.5:
- version "3.4.15"
- resolved "https://registry.yarnpkg.com/diff2html/-/diff2html-3.4.15.tgz#9cba93d7a8d05104963a0e36e2e4aaca6505ce05"
- integrity sha512-DNzGoknNE1lIPJWkIYCszIe8PxXHrHl939WQX+Rzr8Q5l3ex8VyJjZCGKwzfMN6jiSyli7hNHyoApnz6prfZ3Q==
+ version "3.4.51"
+ resolved "https://registry.yarnpkg.com/diff2html/-/diff2html-3.4.51.tgz#6355170d09d8625525f0846be2c73bc2838ab797"
+ integrity sha512-/rVCSDyokkzSCEGaGjkkElXtIRwyNDRzIa3S8VUhR6pjk25p6+AMnb1s2zGmhjl66D5m/HnV3IeZoxnWsvTy+w==
dependencies:
- diff "5.0.0"
+ diff "^7.0.0"
hogan.js "3.0.2"
optionalDependencies:
- highlight.js "11.2.0"
+ highlight.js "11.9.0"
-diff@5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
- integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==
+diff@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a"
+ integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==
dir-glob@^3.0.1:
version "3.0.1"
@@ -4218,12 +4317,7 @@ doctrine@^3.0.0:
dependencies:
esutils "^2.0.2"
-dom-accessibility-api@^0.5.6:
- version "0.5.11"
- resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.11.tgz#79d5846c4f90eba3e617d9031e921de9324f84ed"
- integrity sha512-7X6GvzjYf4yTdRKuCVScV+aA9Fvh5r8WzWrXBH9w82ZWB/eYDMGCnazoC/YAqAzUJWHzLOnZqr46K3iEyUhUvw==
-
-dom-accessibility-api@^0.5.9:
+dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9:
version "0.5.16"
resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453"
integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==
@@ -4237,9 +4331,9 @@ dom-helpers@^5.0.1:
csstype "^3.0.2"
dom-serializer@^1.0.1:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91"
- integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30"
+ integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==
dependencies:
domelementtype "^2.0.1"
domhandler "^4.2.0"
@@ -4251,9 +4345,9 @@ dom-walk@^0.1.0:
integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
domelementtype@^2.0.1, domelementtype@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57"
- integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
+ integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
domexception@^2.0.1:
version "2.0.1"
@@ -4262,10 +4356,10 @@ domexception@^2.0.1:
dependencies:
webidl-conversions "^5.0.0"
-domhandler@^4.2.0, domhandler@^4.3.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626"
- integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==
+domhandler@^4.2.0, domhandler@^4.3.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c"
+ integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==
dependencies:
domelementtype "^2.2.0"
@@ -4290,10 +4384,19 @@ dotenv@^5.0.1:
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef"
integrity sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==
+dunder-proto@^1.0.0, dunder-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a"
+ integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==
+ dependencies:
+ call-bind-apply-helpers "^1.0.1"
+ es-errors "^1.3.0"
+ gopd "^1.2.0"
+
duplexer3@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
- integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e"
+ integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==
duplexify@^3.4.2, duplexify@^3.6.0:
version "3.7.1"
@@ -4311,20 +4414,20 @@ eastasianwidth@^0.2.0:
integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
easymde@^2.15.0:
- version "2.16.1"
- resolved "https://registry.yarnpkg.com/easymde/-/easymde-2.16.1.tgz#f4c2380312615cb33826f1a1fecfaa4022ff551a"
- integrity sha512-FihYgjRsKfhGNk89SHSqxKLC4aJ1kfybPWW6iAmtb5GnXu+tnFPSzSaGBmk1RRlCuhFSjhF0SnIMGVPjEzkr6g==
+ version "2.18.0"
+ resolved "https://registry.yarnpkg.com/easymde/-/easymde-2.18.0.tgz#ff1397d07329b1a7b9187d2d0c20766fa16b3b1b"
+ integrity sha512-IxVVUxNWIoXLeqtBU4BLc+eS/ScYhT1Dcb6yF5Wchoj1iXAV+TIIDWx+NCaZhY7RcSHqDPKllbYq7nwGKILnoA==
dependencies:
"@types/codemirror" "^5.60.4"
- "@types/marked" "^4.0.1"
+ "@types/marked" "^4.0.7"
codemirror "^5.63.1"
codemirror-spell-checker "1.1.2"
- marked "^4.0.10"
+ marked "^4.1.0"
ecc-jsbn@~0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
- integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
+ integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==
dependencies:
jsbn "~0.1.0"
safer-buffer "^2.1.0"
@@ -4332,17 +4435,12 @@ ecc-jsbn@~0.1.1:
editor@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742"
- integrity sha1-YMf4e9YrzGqJT6jM1q+3gjok90I=
-
-electron-to-chromium@^1.4.17:
- version "1.4.61"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.61.tgz#97689f81b4ac5c996363d9ee7babd3406c44d6c3"
- integrity sha512-kpzCOOFlx63C9qKRyIDEsKIUgzoe98ump7T4gU+/OLzj8gYkkWf2SIyBjhTSE0keAjMAp3i7C262YtkQOMYrGw==
+ integrity sha512-SoRmbGStwNYHgKfjOrX2L0mUvp9bUVv0uPppZSOMAntEbcFtoC3MKF5b3T6HQPXKIV+QGY3xPO3JK5it5lVkuw==
-electron-to-chromium@^1.4.71:
- version "1.4.71"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz#17056914465da0890ce00351a3b946fd4cd51ff6"
- integrity sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw==
+electron-to-chromium@^1.5.73:
+ version "1.5.76"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz#db20295c5061b68f07c8ea4dfcbd701485d94a3d"
+ integrity sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==
emittery@^0.8.1:
version "0.8.1"
@@ -4379,17 +4477,23 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0:
once "^1.4.0"
enquirer@^2.3.5:
- version "2.3.6"
- resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
- integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56"
+ integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==
dependencies:
ansi-colors "^4.1.1"
+ strip-ansi "^6.0.1"
entities@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
+entities@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
+ integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
+
env-paths@^2.2.0:
version "2.2.1"
resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
@@ -4398,7 +4502,7 @@ env-paths@^2.2.0:
err-code@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960"
- integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=
+ integrity sha512-CJAN+O0/yA1CKfRn9SXOGctSpEM7DCon/r/5r2eXFMY2zCCJBasFhcM5I+1kh3Ap11FsQCX+vGHceNPvpWKhoA==
errno@~0.1.7:
version "0.1.8"
@@ -4407,7 +4511,7 @@ errno@~0.1.7:
dependencies:
prr "~1.0.1"
-error-ex@^1.2.0, error-ex@^1.3.1:
+error-ex@^1.3.1:
version "1.3.2"
resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
@@ -4415,37 +4519,81 @@ error-ex@^1.2.0, error-ex@^1.3.1:
is-arrayish "^0.2.1"
error-stack-parser@^2.0.2, error-stack-parser@^2.0.3:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8"
- integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==
- dependencies:
- stackframe "^1.1.1"
-
-es-abstract@^1.19.0, es-abstract@^1.19.1:
- version "1.19.1"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3"
- integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==
- dependencies:
- call-bind "^1.0.2"
- es-to-primitive "^1.2.1"
- function-bind "^1.1.1"
- get-intrinsic "^1.1.1"
- get-symbol-description "^1.0.0"
- has "^1.0.3"
- has-symbols "^1.0.2"
- internal-slot "^1.0.3"
- is-callable "^1.2.4"
- is-negative-zero "^2.0.1"
- is-regex "^1.1.4"
- is-shared-array-buffer "^1.0.1"
- is-string "^1.0.7"
- is-weakref "^1.0.1"
- object-inspect "^1.11.0"
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286"
+ integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==
+ dependencies:
+ stackframe "^1.3.4"
+
+es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6:
+ version "1.23.8"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.8.tgz#99754723118355d82fcef9ce4c90ccbcd5d2a285"
+ integrity sha512-lfab8IzDn6EpI1ibZakcgS6WsfEBiB+43cuJo+wgylx1xKXf+Sp+YR3vFuQwC/u3sxYwV8Cxe3B0DpVUu/WiJQ==
+ dependencies:
+ array-buffer-byte-length "^1.0.2"
+ arraybuffer.prototype.slice "^1.0.4"
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.8"
+ call-bound "^1.0.3"
+ data-view-buffer "^1.0.2"
+ data-view-byte-length "^1.0.2"
+ data-view-byte-offset "^1.0.1"
+ es-define-property "^1.0.1"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ es-set-tostringtag "^2.0.3"
+ es-to-primitive "^1.3.0"
+ function.prototype.name "^1.1.8"
+ get-intrinsic "^1.2.6"
+ get-symbol-description "^1.1.0"
+ globalthis "^1.0.4"
+ gopd "^1.2.0"
+ has-property-descriptors "^1.0.2"
+ has-proto "^1.2.0"
+ has-symbols "^1.1.0"
+ hasown "^2.0.2"
+ internal-slot "^1.1.0"
+ is-array-buffer "^3.0.5"
+ is-callable "^1.2.7"
+ is-data-view "^1.0.2"
+ is-regex "^1.2.1"
+ is-shared-array-buffer "^1.0.4"
+ is-string "^1.1.1"
+ is-typed-array "^1.1.15"
+ is-weakref "^1.1.0"
+ math-intrinsics "^1.1.0"
+ object-inspect "^1.13.3"
object-keys "^1.1.1"
- object.assign "^4.1.2"
- string.prototype.trimend "^1.0.4"
- string.prototype.trimstart "^1.0.4"
- unbox-primitive "^1.0.1"
+ object.assign "^4.1.7"
+ own-keys "^1.0.0"
+ regexp.prototype.flags "^1.5.3"
+ safe-array-concat "^1.1.3"
+ safe-push-apply "^1.0.0"
+ safe-regex-test "^1.1.0"
+ string.prototype.trim "^1.2.10"
+ string.prototype.trimend "^1.0.9"
+ string.prototype.trimstart "^1.0.8"
+ typed-array-buffer "^1.0.3"
+ typed-array-byte-length "^1.0.3"
+ typed-array-byte-offset "^1.0.4"
+ typed-array-length "^1.0.7"
+ unbox-primitive "^1.1.0"
+ which-typed-array "^1.1.18"
+
+es-array-method-boxes-properly@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e"
+ integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==
+
+es-define-property@^1.0.0, es-define-property@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa"
+ integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==
+
+es-errors@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
+ integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
es-get-iterator@^1.1.3:
version "1.1.3"
@@ -4462,14 +4610,59 @@ es-get-iterator@^1.1.3:
isarray "^2.0.5"
stop-iteration-iterator "^1.0.0"
-es-to-primitive@^1.2.1:
+es-iterator-helpers@^1.2.1:
version "1.2.1"
- resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
- integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz#d1dd0f58129054c0ad922e6a9a1e65eef435fe75"
+ integrity sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.3"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.6"
+ es-errors "^1.3.0"
+ es-set-tostringtag "^2.0.3"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.6"
+ globalthis "^1.0.4"
+ gopd "^1.2.0"
+ has-property-descriptors "^1.0.2"
+ has-proto "^1.2.0"
+ has-symbols "^1.1.0"
+ internal-slot "^1.1.0"
+ iterator.prototype "^1.1.4"
+ safe-array-concat "^1.1.3"
+
+es-object-atoms@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941"
+ integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==
+ dependencies:
+ es-errors "^1.3.0"
+
+es-set-tostringtag@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777"
+ integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==
+ dependencies:
+ get-intrinsic "^1.2.4"
+ has-tostringtag "^1.0.2"
+ hasown "^2.0.1"
+
+es-shim-unscopables@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763"
+ integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==
+ dependencies:
+ hasown "^2.0.0"
+
+es-to-primitive@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18"
+ integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==
dependencies:
- is-callable "^1.1.4"
- is-date-object "^1.0.1"
- is-symbol "^1.0.2"
+ is-callable "^1.2.7"
+ is-date-object "^1.0.5"
+ is-symbol "^1.0.4"
es6-promise@^4.0.3:
version "4.2.8"
@@ -4479,34 +4672,39 @@ es6-promise@^4.0.3:
es6-promisify@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
- integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
+ integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==
dependencies:
es6-promise "^4.0.3"
-esbuild-android-arm64@0.14.17:
- version "0.14.17"
- resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.17.tgz#7216810cb8d5b8cd03ce70bdc241dcdd90c34755"
- integrity sha512-y7EJm8ADC9qKbo/dJ2zBXwNdIILJ76tTv7JDGvOkbLT8HJXIsgbpa0NJk7iFhyvP4GpsYvXTbvEQNn0DhyBhLA==
+esbuild-android-64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be"
+ integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==
+
+esbuild-android-arm64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771"
+ integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==
-esbuild-darwin-64@0.14.17:
- version "0.14.17"
- resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.17.tgz#1419e020f41814f8a74ce92b2dcab29a6d47e510"
- integrity sha512-V2JAP8yyVbW6qR4SVXsEDqRicYM0x5niUuB05IFiE5itPI45k8j2dA2l+DtirR2SGXr+LEqgX347+2VA6eyTiA==
+esbuild-darwin-64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25"
+ integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==
-esbuild-darwin-arm64@0.14.17:
- version "0.14.17"
- resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.17.tgz#95acf1022066d48346a63ffc5e4d36a07b83c9b0"
- integrity sha512-ENkSKpjF4SImyA2TdHhKiZqtYc1DkMykICe1KSBw0YNF1sentjFI6wu+CRiYMpC7REf/3TQXoems2XPqIqDMlQ==
+esbuild-darwin-arm64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73"
+ integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==
-esbuild-freebsd-64@0.14.17:
- version "0.14.17"
- resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.17.tgz#a3455199862110854937b05a0eecbed3e1aeec41"
- integrity sha512-2i0nTNJM8ftNTvtR00vdqkru8XpHwAbkR2MBLoK2IDSzjsLStwCj+mxf6v83eVM9Abe3QA8xP+irqOdBlwDQ2g==
+esbuild-freebsd-64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d"
+ integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==
-esbuild-freebsd-arm64@0.14.17:
- version "0.14.17"
- resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.17.tgz#8a70f2a36f5b0da7d2efdd6fd02aa78611007fd0"
- integrity sha512-QOmRi1n+uly2G7BbMbHb86YiFA5aM7B2T96A6OF1VG57LNwXwy8LPVM0PVjl7f9cV3pE3fy3VtXPJHJo8XggTA==
+esbuild-freebsd-arm64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48"
+ integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==
esbuild-jest@^0.5.0:
version "0.5.0"
@@ -4517,50 +4715,55 @@ esbuild-jest@^0.5.0:
"@babel/plugin-transform-modules-commonjs" "^7.12.13"
babel-jest "^26.6.3"
-esbuild-linux-32@0.14.17:
- version "0.14.17"
- resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.17.tgz#b7123f6e4780687e017454604d909fbe558862e9"
- integrity sha512-qG5NDk7FHHUVw01rjHESON0HvigF2X80b645TUlgTKsWRlrbzzHhMCmQguA01O5PiCimKnyoxti8aJIFNHpQnQ==
-
-esbuild-linux-64@0.14.17:
- version "0.14.17"
- resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.17.tgz#47a6b510c2f7faef595a4d6257a629e65385fdc3"
- integrity sha512-De8OcmNvfNyFfQRLWbfuZqau6NpYBJxNTLP7Ls/PqQcw0HAwfaYThutY8ozHpPbKFPa7wgqabXlIC4NVSWT0/A==
-
-esbuild-linux-arm64@0.14.17:
- version "0.14.17"
- resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.17.tgz#dfd9022b7215ca660d464fcb20597b88887c7e64"
- integrity sha512-WDEOD/YRA4J1lxhETKZff3gRxGYqqZEiVwIOqNfvCh2YcwWU2y6UmNGZsxcuKk18wot4dAXCXQyNZgBkVUTCLw==
-
-esbuild-linux-arm@0.14.17:
- version "0.14.17"
- resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.17.tgz#e6f6bb9fe52def5260d7d49b790fbec0e7c6d9cb"
- integrity sha512-ZwsgFUk3gR2pEMJdh5z4Ds18fvGETgElPqmNdx1NtZTCOVlFMAwFB5u/tOR2FrXbMFv+LkGnNxPDh48PYPDz9A==
-
-esbuild-linux-mips64le@0.14.17:
- version "0.14.17"
- resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.17.tgz#bceaad33ff18a822b6da0396c6497a231397b6c3"
- integrity sha512-Lf4X9NB7r6imzp/11TaGs4kWL0DUn1JxI9gAAKotnKh6T8Y/0sLvZSvQS8WvSZcr0V8RRCrRZwiQqjOALUU/9g==
-
-esbuild-linux-ppc64le@0.14.17:
- version "0.14.17"
- resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.17.tgz#9562f094d1e5e6c3b61b776b15a9bbd657042654"
- integrity sha512-aExhxbrK7/Mh9FArdiC9MbvrQz2bGCDI8cBALKJbmhKg0h7LNt6y1E1S9GGBZ/ZXkHDvV9FFVrXXZKFVU5Qpiw==
-
-esbuild-linux-s390x@0.14.17:
- version "0.14.17"
- resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.17.tgz#2963cfe62c227bbf1da64e36d4ca0b23db8008fe"
- integrity sha512-b0T20rNcS7POi5YLw5dFlsiC+riobR5IfppQGn5NWer6QiIkdL1vOx9eC9CUD3z1itpkLboRAZYieZfKfhCA2Q==
-
-esbuild-netbsd-64@0.14.17:
- version "0.14.17"
- resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.17.tgz#1d156023f9ae6be79b8627ab0cda2d7feb7f3a48"
- integrity sha512-pFgTaAa2JF18nqNfCND9wOu1jbZ/mbDSaMxUp5fTkLlofyHhXeb5aChgXUkeipty2Pgq0OwOnxjHmiAxMI7N4g==
-
-esbuild-openbsd-64@0.14.17:
- version "0.14.17"
- resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.17.tgz#3fc44102c9b65375385112f4ce5899ae5e38f349"
- integrity sha512-K5+plb6gsAfBcFqB0EG4KvLbgBKslVAfEyJggicwt/QoDwQGJAzao4M6zOA4PG7LlXOwWSqv7VmSFbH+b6DyKw==
+esbuild-linux-32@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5"
+ integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==
+
+esbuild-linux-64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652"
+ integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==
+
+esbuild-linux-arm64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b"
+ integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==
+
+esbuild-linux-arm@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59"
+ integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==
+
+esbuild-linux-mips64le@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34"
+ integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==
+
+esbuild-linux-ppc64le@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e"
+ integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==
+
+esbuild-linux-riscv64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8"
+ integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==
+
+esbuild-linux-s390x@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6"
+ integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==
+
+esbuild-netbsd-64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81"
+ integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==
+
+esbuild-openbsd-64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b"
+ integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==
esbuild-plugin-import-glob@^0.1.1:
version "0.1.1"
@@ -4569,59 +4772,62 @@ esbuild-plugin-import-glob@^0.1.1:
dependencies:
fast-glob "^3.2.5"
-esbuild-sunos-64@0.14.17:
- version "0.14.17"
- resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.17.tgz#5bd24e7a7e863ea89d7e4eafd5364a155c9ea507"
- integrity sha512-o1FINkbHRi9JB1YteOSXZdkDOmVUbmnCxRmTLkHvk8pfCFNpv/5/7ktt95teYKbEiJna2dEt3M4ckJ/+UVnW+w==
+esbuild-sunos-64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da"
+ integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==
-esbuild-windows-32@0.14.17:
- version "0.14.17"
- resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.17.tgz#8bda31c550fb6b425707114141d2c6ba034dab9b"
- integrity sha512-Qutilz0I7OADWBtWrC/FD+2O/TNAkhwbZ+wIns7kF87lxIMtmqpBt3KnMk1e4F47aTrZRr0oH55Zhztd7m2PAA==
+esbuild-windows-32@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31"
+ integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==
-esbuild-windows-64@0.14.17:
- version "0.14.17"
- resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.17.tgz#50b42c06908d3ce9fab8f0f9673199de5d0f9cbc"
- integrity sha512-b21/oRV+PHrav0HkRpKjbM2yNRVe34gAfbdMppbZFea416wa8SrjcmVfSd7n4jgqoTQG0xe+MGgOpwXtjiB3DQ==
+esbuild-windows-64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4"
+ integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==
-esbuild-windows-arm64@0.14.17:
- version "0.14.17"
- resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.17.tgz#62d3921a810b64a03fcace76dad4db51d2128b45"
- integrity sha512-4HN9E1idllewYvptcrrdfTA6DIWgg11kK0Zrv6yjxstJZLJeKxfilGBEaksLGs4Pst2rAYMx3H2vbYq7AWLQNA==
+esbuild-windows-arm64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982"
+ integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==
esbuild@^0.14.5:
- version "0.14.17"
- resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.17.tgz#6a634e56447aa0e90b34c42091d472d802d399e5"
- integrity sha512-JLgyC6Uv31mv9T9Mm2xF1LntUMCNBSzvg2n32d8cTKZMwFr1wmMFY2FkVum98TSoEsDff0cR+Aj49H2sbBcjKQ==
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2"
+ integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==
optionalDependencies:
- esbuild-android-arm64 "0.14.17"
- esbuild-darwin-64 "0.14.17"
- esbuild-darwin-arm64 "0.14.17"
- esbuild-freebsd-64 "0.14.17"
- esbuild-freebsd-arm64 "0.14.17"
- esbuild-linux-32 "0.14.17"
- esbuild-linux-64 "0.14.17"
- esbuild-linux-arm "0.14.17"
- esbuild-linux-arm64 "0.14.17"
- esbuild-linux-mips64le "0.14.17"
- esbuild-linux-ppc64le "0.14.17"
- esbuild-linux-s390x "0.14.17"
- esbuild-netbsd-64 "0.14.17"
- esbuild-openbsd-64 "0.14.17"
- esbuild-sunos-64 "0.14.17"
- esbuild-windows-32 "0.14.17"
- esbuild-windows-64 "0.14.17"
- esbuild-windows-arm64 "0.14.17"
-
-escalade@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
- integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+ "@esbuild/linux-loong64" "0.14.54"
+ esbuild-android-64 "0.14.54"
+ esbuild-android-arm64 "0.14.54"
+ esbuild-darwin-64 "0.14.54"
+ esbuild-darwin-arm64 "0.14.54"
+ esbuild-freebsd-64 "0.14.54"
+ esbuild-freebsd-arm64 "0.14.54"
+ esbuild-linux-32 "0.14.54"
+ esbuild-linux-64 "0.14.54"
+ esbuild-linux-arm "0.14.54"
+ esbuild-linux-arm64 "0.14.54"
+ esbuild-linux-mips64le "0.14.54"
+ esbuild-linux-ppc64le "0.14.54"
+ esbuild-linux-riscv64 "0.14.54"
+ esbuild-linux-s390x "0.14.54"
+ esbuild-netbsd-64 "0.14.54"
+ esbuild-openbsd-64 "0.14.54"
+ esbuild-sunos-64 "0.14.54"
+ esbuild-windows-32 "0.14.54"
+ esbuild-windows-64 "0.14.54"
+ esbuild-windows-arm64 "0.14.54"
+
+escalade@^3.1.1, escalade@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
- integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
escape-string-regexp@^2.0.0:
version "2.0.0"
@@ -4634,14 +4840,13 @@ escape-string-regexp@^4.0.0:
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
escodegen@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd"
- integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17"
+ integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==
dependencies:
esprima "^4.0.1"
estraverse "^5.2.0"
esutils "^2.0.2"
- optionator "^0.8.1"
optionalDependencies:
source-map "~0.6.1"
@@ -4660,29 +4865,33 @@ eslint-plugin-jest@^24.1.0:
"@typescript-eslint/experimental-utils" "^4.0.1"
eslint-plugin-react-hooks@^4.1.2:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz#318dbf312e06fab1c835a4abef00121751ac1172"
- integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596"
+ integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==
eslint-plugin-react@^7.21.3:
- version "7.28.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz#8f3ff450677571a659ce76efc6d80b6a525adbdf"
- integrity sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==
- dependencies:
- array-includes "^3.1.4"
- array.prototype.flatmap "^1.2.5"
+ version "7.37.3"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz#567549e9251533975c4ea9706f986c3a64832031"
+ integrity sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==
+ dependencies:
+ array-includes "^3.1.8"
+ array.prototype.findlast "^1.2.5"
+ array.prototype.flatmap "^1.3.3"
+ array.prototype.tosorted "^1.1.4"
doctrine "^2.1.0"
+ es-iterator-helpers "^1.2.1"
estraverse "^5.3.0"
+ hasown "^2.0.2"
jsx-ast-utils "^2.4.1 || ^3.0.0"
- minimatch "^3.0.4"
- object.entries "^1.1.5"
- object.fromentries "^2.0.5"
- object.hasown "^1.1.0"
- object.values "^1.1.5"
- prop-types "^15.7.2"
- resolve "^2.0.0-next.3"
- semver "^6.3.0"
- string.prototype.matchall "^4.0.6"
+ minimatch "^3.1.2"
+ object.entries "^1.1.8"
+ object.fromentries "^2.0.8"
+ object.values "^1.2.1"
+ prop-types "^15.8.1"
+ resolve "^2.0.0-next.5"
+ semver "^6.3.1"
+ string.prototype.matchall "^4.0.12"
+ string.prototype.repeat "^1.0.0"
eslint-plugin-testing-library@^4.1.2:
version "4.12.4"
@@ -4784,9 +4993,9 @@ esprima@^4.0.0, esprima@^4.0.1:
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
esquery@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
- integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7"
+ integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==
dependencies:
estraverse "^5.1.0"
@@ -4820,7 +5029,7 @@ exec-sh@^0.3.2:
execa@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
- integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=
+ integrity sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==
dependencies:
cross-spawn "^5.0.1"
get-stream "^3.0.0"
@@ -4876,17 +5085,17 @@ execa@^5.0.0:
exenv@^1.2.0:
version "1.2.2"
resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d"
- integrity sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=
+ integrity sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==
exit@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
- integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=
+ integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==
expand-brackets@^2.1.4:
version "2.1.4"
resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
- integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
+ integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==
dependencies:
debug "^2.3.3"
define-property "^0.2.5"
@@ -4896,27 +5105,38 @@ expand-brackets@^2.1.4:
snapdragon "^0.8.1"
to-regex "^3.0.1"
-expect@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/expect/-/expect-27.4.6.tgz#f335e128b0335b6ceb4fcab67ece7cbd14c942e6"
- integrity sha512-1M/0kAALIaj5LaG66sFJTbRsWTADnylly82cu4bspI0nl+pgP4E6Bh/aqdHlTUjul06K7xQnnrAoqfxVU0+/ag==
+expect@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74"
+ integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ jest-get-type "^27.5.1"
+ jest-matcher-utils "^27.5.1"
+ jest-message-util "^27.5.1"
+
+expect@^29.0.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc"
+ integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==
dependencies:
- "@jest/types" "^27.4.2"
- jest-get-type "^27.4.0"
- jest-matcher-utils "^27.4.6"
- jest-message-util "^27.4.6"
+ "@jest/expect-utils" "^29.7.0"
+ jest-get-type "^29.6.3"
+ jest-matcher-utils "^29.7.0"
+ jest-message-util "^29.7.0"
+ jest-util "^29.7.0"
extend-shallow@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
- integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
+ integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==
dependencies:
is-extendable "^0.1.0"
extend-shallow@^3.0.0, extend-shallow@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
- integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
+ integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==
dependencies:
assign-symbols "^1.0.0"
is-extendable "^1.0.1"
@@ -4943,7 +5163,7 @@ extglob@^2.0.4:
extsprintf@1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
- integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
+ integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==
extsprintf@^1.2.0:
version "1.4.1"
@@ -4960,18 +5180,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-fast-glob@^3.2.5, fast-glob@^3.2.7, fast-glob@^3.2.9:
- version "3.2.11"
- resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9"
- integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==
- dependencies:
- "@nodelib/fs.stat" "^2.0.2"
- "@nodelib/fs.walk" "^1.2.3"
- glob-parent "^5.1.2"
- merge2 "^1.3.0"
- micromatch "^4.0.4"
-
-fast-glob@^3.3.0:
+fast-glob@^3.2.5, fast-glob@^3.2.7, fast-glob@^3.2.9, fast-glob@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
@@ -4987,10 +5196,15 @@ fast-json-stable-stringify@^2.0.0:
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
-fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6:
+fast-levenshtein@^2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
- integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fast-uri@^3.0.1:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.3.tgz#892a1c91802d5d7860de728f18608a0573142241"
+ integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==
fastparse@^1.1.2:
version "1.1.2"
@@ -4998,20 +5212,20 @@ fastparse@^1.1.2:
integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==
fastq@^1.6.0:
- version "1.17.1"
- resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47"
- integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==
+ version "1.18.0"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.18.0.tgz#d631d7e25faffea81887fe5ea8c9010e1b36fee0"
+ integrity sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==
dependencies:
reusify "^1.0.4"
fb-watchman@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85"
- integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c"
+ integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==
dependencies:
bser "2.1.1"
-figgy-pudding@^3.4.1, figgy-pudding@^3.5.1:
+figgy-pudding@^3.4.1, figgy-pudding@^3.5.1, figgy-pudding@^3.5.2:
version "3.5.2"
resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e"
integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==
@@ -5026,7 +5240,7 @@ file-entry-cache@^6.0.1:
fill-range@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
- integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
+ integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==
dependencies:
extend-shallow "^2.0.1"
is-number "^3.0.0"
@@ -5043,7 +5257,7 @@ fill-range@^7.1.1:
filter-obj@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b"
- integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs=
+ integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==
find-npm-prefix@^1.0.2:
version "1.0.2"
@@ -5055,13 +5269,6 @@ find-root@^1.1.0:
resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
-find-up@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
- integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
- dependencies:
- locate-path "^2.0.0"
-
find-up@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
@@ -5078,17 +5285,18 @@ find-up@^4.0.0, find-up@^4.1.0:
path-exists "^4.0.0"
flat-cache@^3.0.4:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
- integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee"
+ integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==
dependencies:
- flatted "^3.1.0"
+ flatted "^3.2.9"
+ keyv "^4.5.3"
rimraf "^3.0.2"
-flatted@^3.1.0:
- version "3.2.5"
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3"
- integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==
+flatted@^3.2.9:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27"
+ integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==
flush-promises@^1.0.2:
version "1.0.2"
@@ -5104,14 +5312,14 @@ flush-write-stream@^1.0.0:
readable-stream "^2.3.6"
focus-visible@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/focus-visible/-/focus-visible-5.2.0.tgz#3a9e41fccf587bd25dcc2ef045508284f0a4d6b3"
- integrity sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/focus-visible/-/focus-visible-5.2.1.tgz#38615e8be4d4df7819a0d9d92cdee4fda183ac96"
+ integrity sha512-8Bx950VD1bWTQJEH/AM6SpEk+SU55aVnp4Ujhuuxy3eMEBCRwBnTBnVXr9YAPvZL3/CNjCa8u4IWfNmEO53whA==
fontfaceobserver@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/fontfaceobserver/-/fontfaceobserver-2.1.0.tgz#e2705d293e2c585a6531c2a722905657317a2991"
- integrity sha512-ReOsO2F66jUa0jmv2nlM/s1MiutJx/srhAe2+TE8dJCMi02ZZOcCTxTCQFr3Yet+uODUtnr4Mewg+tNQ+4V1Ng==
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz#5fb392116e75d5024b7ec8e4f2ce92106d1488c8"
+ integrity sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==
for-each@^0.3.3:
version "0.3.3"
@@ -5123,7 +5331,7 @@ for-each@^0.3.3:
for-in@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
- integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
+ integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==
foreground-child@^3.1.0:
version "3.3.0"
@@ -5136,12 +5344,12 @@ foreground-child@^3.1.0:
forever-agent@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
- integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
+ integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==
form-data@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
- integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.2.tgz#83ad9ced7c03feaad97e293d6f6091011e1659c8"
+ integrity sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
@@ -5156,22 +5364,22 @@ form-data@~2.3.2:
combined-stream "^1.0.6"
mime-types "^2.1.12"
-fraction.js@^4.1.2:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.2.tgz#13e420a92422b6cf244dff8690ed89401029fbe8"
- integrity sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==
+fraction.js@^4.3.7:
+ version "4.3.7"
+ resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7"
+ integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==
fragment-cache@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
- integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
+ integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==
dependencies:
map-cache "^0.2.2"
from2@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/from2/-/from2-1.3.0.tgz#88413baaa5f9a597cfde9221d86986cd3c061dfd"
- integrity sha1-iEE7qqX5pZfP3pIh2GmGzTwGHf0=
+ integrity sha512-1eKYoECvhpM4IT70THQV8XNfmZoIlnROymbwOSazfmQO3kK+zCV+LSqUDzl7gDo3MZddCFeVa9Zg3Hi6FXqcgg==
dependencies:
inherits "~2.0.1"
readable-stream "~1.1.10"
@@ -5179,15 +5387,15 @@ from2@^1.3.0:
from2@^2.1.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
- integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=
+ integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==
dependencies:
inherits "^2.0.1"
readable-stream "^2.0.0"
fs-extra@^10.0.0:
- version "10.0.0"
- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1"
- integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==
+ version "10.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf"
+ integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==
dependencies:
graceful-fs "^4.2.0"
jsonfile "^6.0.1"
@@ -5200,10 +5408,15 @@ fs-minipass@^1.2.7:
dependencies:
minipass "^2.6.0"
+fs-readdir-recursive@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27"
+ integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==
+
fs-vacuum@^1.2.10, fs-vacuum@~1.2.10:
version "1.2.10"
resolved "https://registry.yarnpkg.com/fs-vacuum/-/fs-vacuum-1.2.10.tgz#b7629bec07a4031a2548fdf99f5ecf1cc8b31e36"
- integrity sha1-t2Kb7AekAxolSP35n17PHMizHjY=
+ integrity sha512-bwbv1FcWYwxN1F08I1THN8nS4Qe/pGq0gM8dy1J34vpxxp3qgZKJPPaqex36RyZO0sD2J+2ocnbwC2d/OjYICQ==
dependencies:
graceful-fs "^4.1.2"
path-is-inside "^1.0.1"
@@ -5212,7 +5425,7 @@ fs-vacuum@^1.2.10, fs-vacuum@~1.2.10:
fs-write-stream-atomic@^1.0.8, fs-write-stream-atomic@~1.0.10:
version "1.0.10"
resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
- integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=
+ integrity sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==
dependencies:
graceful-fs "^4.1.2"
iferr "^0.1.5"
@@ -5224,25 +5437,32 @@ fs.realpath@^1.0.0:
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
-fsevents@^2.1.2, fsevents@^2.3.2:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
- integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
-
-fsevents@~2.3.2:
+fsevents@^2.1.2, fsevents@^2.3.2, fsevents@~2.3.2:
version "2.3.3"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
-function-bind@^1.1.1, function-bind@^1.1.2:
+function-bind@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+function.prototype.name@^1.1.6, function.prototype.name@^1.1.8:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78"
+ integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.3"
+ define-properties "^1.2.1"
+ functions-have-names "^1.2.3"
+ hasown "^2.0.2"
+ is-callable "^1.2.7"
+
functional-red-black-tree@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
- integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+ integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==
functions-have-names@^1.2.3:
version "1.2.3"
@@ -5252,7 +5472,7 @@ functions-have-names@^1.2.3:
gauge@~2.7.3:
version "2.7.4"
resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
- integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
+ integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==
dependencies:
aproba "^1.0.3"
console-control-strings "^1.0.0"
@@ -5290,34 +5510,26 @@ gentle-fs@^2.3.0, gentle-fs@^2.3.1:
read-cmd-shim "^1.0.1"
slide "^1.1.6"
-get-caller-file@^1.0.1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
- integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
-
get-caller-file@^2.0.1, get-caller-file@^2.0.5:
version "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-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
- integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
- dependencies:
- function-bind "^1.1.1"
- has "^1.0.3"
- has-symbols "^1.0.1"
-
-get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82"
- integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==
- dependencies:
- function-bind "^1.1.1"
- has "^1.0.3"
- has-proto "^1.0.1"
- has-symbols "^1.0.3"
+get-intrinsic@^1.1.3, get-intrinsic@^1.2.2, get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6:
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.6.tgz#43dd3dd0e7b49b82b2dfcad10dc824bf7fc265d5"
+ integrity sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==
+ dependencies:
+ call-bind-apply-helpers "^1.0.1"
+ dunder-proto "^1.0.0"
+ es-define-property "^1.0.1"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ function-bind "^1.1.2"
+ gopd "^1.2.0"
+ has-symbols "^1.1.0"
+ hasown "^2.0.2"
+ math-intrinsics "^1.0.0"
get-package-type@^0.1.0:
version "0.1.0"
@@ -5337,7 +5549,7 @@ get-stdin@^9.0.0:
get-stream@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
- integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
+ integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==
get-stream@^4.0.0, get-stream@^4.1.0:
version "4.1.0"
@@ -5358,23 +5570,24 @@ get-stream@^6.0.0:
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
-get-symbol-description@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
- integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
+get-symbol-description@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee"
+ integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==
dependencies:
- call-bind "^1.0.2"
- get-intrinsic "^1.1.1"
+ call-bound "^1.0.3"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.6"
get-value@^2.0.3, get-value@^2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
- integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+ integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==
getpass@^0.1.1:
version "0.1.7"
resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
- integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
+ integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==
dependencies:
assert-plus "^1.0.0"
@@ -5404,22 +5617,22 @@ glob@^10.3.10:
package-json-from-dist "^1.0.0"
path-scurry "^1.11.1"
-glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
- integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
+glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0, glob@^7.2.3:
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
- minimatch "^3.0.4"
+ minimatch "^3.1.1"
once "^1.3.0"
path-is-absolute "^1.0.0"
global-dirs@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445"
- integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=
+ integrity sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==
dependencies:
ini "^1.3.4"
@@ -5437,12 +5650,20 @@ globals@^11.1.0:
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
globals@^13.6.0, globals@^13.9.0:
- version "13.12.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e"
- integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==
+ version "13.24.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171"
+ integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==
dependencies:
type-fest "^0.20.2"
+globalthis@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236"
+ integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==
+ dependencies:
+ define-properties "^1.2.1"
+ gopd "^1.0.1"
+
globby@^11.0.3:
version "11.1.0"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
@@ -5467,17 +5688,15 @@ globby@^12.0.0:
merge2 "^1.4.1"
slash "^4.0.0"
-gopd@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
- integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
- dependencies:
- get-intrinsic "^1.1.3"
+gopd@^1.0.1, gopd@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1"
+ integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
got@^6.7.1:
version "6.7.1"
resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
- integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=
+ integrity sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==
dependencies:
create-error-class "^3.0.0"
duplexer3 "^0.1.4"
@@ -5491,20 +5710,29 @@ got@^6.7.1:
unzip-response "^2.0.1"
url-parse-lax "^1.0.0"
-graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.4:
- version "4.2.9"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
- integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
+graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
graphql@^15.3.0:
- version "15.8.0"
- resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.8.0.tgz#33410e96b012fa3bdb1091cc99a94769db212b38"
- integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==
+ version "15.9.0"
+ resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.9.0.tgz#4e8ca830cfd30b03d44d3edd9cac2b0690304b53"
+ integrity sha512-GCOQdvm7XxV1S4U4CGrsdlEN37245eC8P9zaYCMr6K1BG0IPGy5lUwmJsEOGyl1GD6HXjOtl2keCP9asRBwNvA==
+
+happy-dom@^15.11.7:
+ version "15.11.7"
+ resolved "https://registry.yarnpkg.com/happy-dom/-/happy-dom-15.11.7.tgz#db9854f11e5dd3fd4ab20cbbcfdf7bd9e17cd971"
+ integrity sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg==
+ dependencies:
+ entities "^4.5.0"
+ webidl-conversions "^7.0.0"
+ whatwg-mimetype "^3.0.0"
har-schema@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
- integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
+ integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==
har-validator@~5.1.3:
version "5.1.5"
@@ -5519,59 +5747,56 @@ harmony-reflect@^1.4.6:
resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710"
integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==
-has-bigints@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
- integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==
+has-bigints@^1.0.2:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe"
+ integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
- integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
has-flag@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
-has-property-descriptors@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861"
- integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==
+has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854"
+ integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
dependencies:
- get-intrinsic "^1.1.1"
-
-has-proto@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0"
- integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==
+ es-define-property "^1.0.0"
-has-symbols@^1.0.1, has-symbols@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
- integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
+has-proto@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5"
+ integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==
+ dependencies:
+ dunder-proto "^1.0.0"
-has-symbols@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
- integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+has-symbols@^1.0.3, has-symbols@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338"
+ integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
-has-tostringtag@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
- integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+has-tostringtag@^1.0.0, has-tostringtag@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
+ integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
dependencies:
- has-symbols "^1.0.2"
+ has-symbols "^1.0.3"
has-unicode@^2.0.0, has-unicode@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
- integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
+ integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==
has-value@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
- integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
+ integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==
dependencies:
get-value "^2.0.3"
has-values "^0.1.4"
@@ -5580,7 +5805,7 @@ has-value@^0.3.1:
has-value@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
- integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
+ integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==
dependencies:
get-value "^2.0.6"
has-values "^1.0.0"
@@ -5589,22 +5814,17 @@ has-value@^1.0.0:
has-values@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
- integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
+ integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==
has-values@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
- integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
+ integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==
dependencies:
is-number "^3.0.0"
kind-of "^4.0.0"
-has@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6"
- integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==
-
-hasown@^2.0.2:
+hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
@@ -5616,16 +5836,16 @@ headers-utils@^1.2.0:
resolved "https://registry.yarnpkg.com/headers-utils/-/headers-utils-1.2.5.tgz#899d6a76b21bcbe18d6108f56136fdbd4f30c404"
integrity sha512-DAzV5P/pk3wTU/8TLZN+zFTDv4Xa1QDTU8pRvovPetcOMbmqq8CwsAvZBLPZHH6usxyy31zMp7I4aCYb6XIf6w==
-highlight.js@11.2.0:
- version "11.2.0"
- resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.2.0.tgz#a7e3b8c1fdc4f0538b93b2dc2ddd53a40c6ab0f0"
- integrity sha512-JOySjtOEcyG8s4MLR2MNbLUyaXqUunmSnL2kdV/KuGJOmHZuAR5xC54Ko7goAXBWNhf09Vy3B+U7vR62UZ/0iw==
-
-highlight.js@11.9.0, highlight.js@^11.9.0:
+highlight.js@11.9.0:
version "11.9.0"
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.9.0.tgz#04ab9ee43b52a41a047432c8103e2158a1b8b5b0"
integrity sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==
+highlight.js@^11.10.0, highlight.js@^11.9.0:
+ version "11.11.1"
+ resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.11.1.tgz#fca06fa0e5aeecf6c4d437239135fabc15213585"
+ integrity sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==
+
highlightjs-bqn@^0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/highlightjs-bqn/-/highlightjs-bqn-0.0.1.tgz#2e007db225899d0325c6ad2afc86f41f28ee76c6"
@@ -5637,9 +5857,9 @@ highlightjs-chapel@^0.1.0:
integrity sha512-lnpOBA/5vAp3YkE0v9h1PsUsWq8nvMo/tMPaEsCUpu0dZhHiJmVj/1g315n4WS417onsYJhLERh54gmJuSbzJA==
highlightjs-cobol@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/highlightjs-cobol/-/highlightjs-cobol-0.3.1.tgz#22ee6ca0f32f075b10bf768b4898523bf1af7764"
- integrity sha512-BcAHY2v3IhY0pRD4bQUHi9jicWZE93SjeVDXiO53vjNtWWiBMeDlG9yA+a/2IjCBvCMqLLa8aEiZj3hTcTKOSg==
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/highlightjs-cobol/-/highlightjs-cobol-0.3.3.tgz#b1e8a9cbec6cbb33df806f824906e53db5e23435"
+ integrity sha512-sdEHzA1UQM9Fjx6wMkWLq8VN70SHascq84aFJJzenOF2TwHE4nwtKCbhHGzOWQKN0AUnn0yAHfXQqaH8i2C8YA==
dependencies:
minimist ">=1.2.6"
mkdirp "^1.0.4"
@@ -5674,7 +5894,7 @@ highlightjs-zig@^1.0.2:
hogan.js@3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/hogan.js/-/hogan.js-3.0.2.tgz#4cd9e1abd4294146e7679e41d7898732b02c7bfd"
- integrity sha1-TNnhq9QpQUbnZ55B14mHMrAse/0=
+ integrity sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==
dependencies:
mkdirp "0.3.0"
nopt "1.0.10"
@@ -5728,7 +5948,7 @@ http-proxy-agent@^4.0.1:
http-signature@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
- integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
+ integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==
dependencies:
assert-plus "^1.0.0"
jsprim "^1.2.2"
@@ -5743,9 +5963,9 @@ https-proxy-agent@^2.2.3:
debug "^3.1.0"
https-proxy-agent@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
- integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
+ integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
dependencies:
agent-base "6"
debug "4"
@@ -5758,19 +5978,33 @@ human-signals@^2.1.0:
humanize-ms@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
- integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=
+ integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==
dependencies:
ms "^2.0.0"
humps@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/humps/-/humps-2.0.1.tgz#dd02ea6081bd0568dc5d073184463957ba9ef9aa"
- integrity sha1-3QLqYIG9BWjcXQcxhEY5V7qe+ao=
+ integrity sha512-E0eIbrFWUhwfXJmsbdjRQFQPrl5pTEoKlz163j1mTqqUnU9PgR4AgB8AIITzuB3vLBdxZXyZ9TDIrwB2OASz4g==
husky@^8.0.0:
- version "8.0.1"
- resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.1.tgz#511cb3e57de3e3190514ae49ed50f6bc3f50b3e9"
- integrity sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==
+ version "8.0.3"
+ resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184"
+ integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==
+
+i18next-resources-to-backend@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/i18next-resources-to-backend/-/i18next-resources-to-backend-1.2.1.tgz#fded121e63e3139ce839c9901b9449dbbea7351d"
+ integrity sha512-okHbVA+HZ7n1/76MsfhPqDou0fptl2dAlhRDu2ideXloRRduzHsqDOznJBef+R3DFZnbvWoBW+KxJ7fnFjd6Yw==
+ dependencies:
+ "@babel/runtime" "^7.23.2"
+
+i18next@^23.16.6:
+ version "23.16.8"
+ resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.16.8.tgz#3ae1373d344c2393f465556f394aba5a9233b93a"
+ integrity sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==
+ dependencies:
+ "@babel/runtime" "^7.23.2"
iconv-lite@0.4.24:
version "0.4.24"
@@ -5796,7 +6030,7 @@ identity-obj-proxy@^3.0.0:
iferr@^0.1.5:
version "0.1.5"
resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
- integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
+ integrity sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==
iferr@^1.0.2:
version "1.0.2"
@@ -5816,14 +6050,19 @@ ignore@^4.0.6:
integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
ignore@^5.1.4, ignore@^5.1.8, ignore@^5.1.9, ignore@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
- integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
+ integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
immediate@~3.0.5:
version "3.0.6"
resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
- integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=
+ integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==
+
+immer@^10.1.1:
+ version "10.1.1"
+ resolved "https://registry.yarnpkg.com/immer/-/immer-10.1.1.tgz#206f344ea372d8ea176891545ee53ccc062db7bc"
+ integrity sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==
import-fresh@^3.0.0, import-fresh@^3.2.1:
version "3.3.0"
@@ -5836,12 +6075,12 @@ import-fresh@^3.0.0, import-fresh@^3.2.1:
import-lazy@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
- integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
+ integrity sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==
import-local@^3.0.2:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
- integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260"
+ integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==
dependencies:
pkg-dir "^4.2.0"
resolve-cwd "^3.0.0"
@@ -5849,7 +6088,7 @@ import-local@^3.0.2:
imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
- integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
indent-string@^4.0.0:
version "4.0.0"
@@ -5864,7 +6103,7 @@ infer-owner@^1.0.3, infer-owner@^1.0.4:
inflight@^1.0.4, inflight@~1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
- integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
dependencies:
once "^1.3.0"
wrappy "1"
@@ -5893,81 +6132,67 @@ init-package-json@^1.10.3:
validate-npm-package-license "^3.0.1"
validate-npm-package-name "^3.0.0"
-internal-slot@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c"
- integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==
- dependencies:
- get-intrinsic "^1.1.0"
- has "^1.0.3"
- side-channel "^1.0.4"
-
-internal-slot@^1.0.4:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986"
- integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==
+internal-slot@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961"
+ integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==
dependencies:
- get-intrinsic "^1.2.0"
- has "^1.0.3"
- side-channel "^1.0.4"
-
-invert-kv@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
- integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
+ es-errors "^1.3.0"
+ hasown "^2.0.2"
+ side-channel "^1.1.0"
ip-regex@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
- integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=
+ integrity sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==
ip@1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
- integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
-
-is-accessor-descriptor@^0.1.6:
- version "0.1.6"
- resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
- integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
- dependencies:
- kind-of "^3.0.2"
+ integrity sha512-rBtCAQAJm8A110nbwn6YdveUnuZH3WrC36IwkRXxDnq53JvXA2NVQvB7IHyKomxK1MJ4VDNw3UtFDdXQ+AvLYA==
-is-accessor-descriptor@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
- integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
+is-accessor-descriptor@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz#3223b10628354644b86260db29b3e693f5ceedd4"
+ integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==
dependencies:
- kind-of "^6.0.0"
+ hasown "^2.0.0"
is-arguments@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
- integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.2.0.tgz#ad58c6aecf563b78ef2bf04df540da8f5d7d8e1b"
+ integrity sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==
dependencies:
- call-bind "^1.0.2"
- has-tostringtag "^1.0.0"
+ call-bound "^1.0.2"
+ has-tostringtag "^1.0.2"
-is-array-buffer@^3.0.1, is-array-buffer@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe"
- integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==
+is-array-buffer@^3.0.2, is-array-buffer@^3.0.4, is-array-buffer@^3.0.5:
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280"
+ integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==
dependencies:
- call-bind "^1.0.2"
- get-intrinsic "^1.2.0"
- is-typed-array "^1.1.10"
+ call-bind "^1.0.8"
+ call-bound "^1.0.3"
+ get-intrinsic "^1.2.6"
is-arrayish@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
- integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+ integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
-is-bigint@^1.0.1:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
- integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+is-async-function@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646"
+ integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-bigint@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672"
+ integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==
dependencies:
- has-bigints "^1.0.1"
+ has-bigints "^1.0.2"
is-binary-path@~2.1.0:
version "2.1.0"
@@ -5976,29 +6201,24 @@ is-binary-path@~2.1.0:
dependencies:
binary-extensions "^2.0.0"
-is-boolean-object@^1.1.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
- integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+is-boolean-object@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.1.tgz#c20d0c654be05da4fbc23c562635c019e93daf89"
+ integrity sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==
dependencies:
- call-bind "^1.0.2"
- has-tostringtag "^1.0.0"
+ call-bound "^1.0.2"
+ has-tostringtag "^1.0.2"
is-buffer@^1.1.5:
version "1.1.6"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
-is-callable@^1.1.3:
+is-callable@^1.1.3, is-callable@^1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
-is-callable@^1.1.4, is-callable@^1.2.4:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
- integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==
-
is-ci@^1.0.10:
version "1.2.1"
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"
@@ -6013,77 +6233,64 @@ is-ci@^2.0.0:
dependencies:
ci-info "^2.0.0"
-is-cidr@^3.0.0:
+is-cidr@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-3.1.1.tgz#e92ef121bdec2782271a77ce487a8b8df3718ab7"
integrity sha512-Gx+oErgq1j2jAKCR2Kbq0b3wbH0vQKqZ0wOlHxm0o56nq51Cs/DZA8oz9dMDhbHyHEGgJ86eTeVudtgMMOx3Mw==
dependencies:
cidr-regex "^2.0.10"
-is-core-module@^2.13.0:
- version "2.15.1"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37"
- integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==
+is-core-module@^2.13.0, is-core-module@^2.16.0:
+ version "2.16.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4"
+ integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==
dependencies:
hasown "^2.0.2"
-is-core-module@^2.2.0:
- version "2.8.1"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
- integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
- dependencies:
- has "^1.0.3"
-
-is-core-module@^2.8.1:
- version "2.13.0"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db"
- integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==
- dependencies:
- has "^1.0.3"
-
-is-data-descriptor@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
- integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
+is-data-descriptor@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz#2109164426166d32ea38c405c1e0945d9e6a4eeb"
+ integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==
dependencies:
- kind-of "^3.0.2"
+ hasown "^2.0.0"
-is-data-descriptor@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
- integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+is-data-view@^1.0.1, is-data-view@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e"
+ integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==
dependencies:
- kind-of "^6.0.0"
+ call-bound "^1.0.2"
+ get-intrinsic "^1.2.6"
+ is-typed-array "^1.1.13"
-is-date-object@^1.0.1, is-date-object@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
- integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+is-date-object@^1.0.5, is-date-object@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7"
+ integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==
dependencies:
- has-tostringtag "^1.0.0"
+ call-bound "^1.0.2"
+ has-tostringtag "^1.0.2"
is-descriptor@^0.1.0:
- version "0.1.6"
- resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
- integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.7.tgz#2727eb61fd789dcd5bdf0ed4569f551d2fe3be33"
+ integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==
dependencies:
- is-accessor-descriptor "^0.1.6"
- is-data-descriptor "^0.1.4"
- kind-of "^5.0.0"
+ is-accessor-descriptor "^1.0.1"
+ is-data-descriptor "^1.0.1"
is-descriptor@^1.0.0, is-descriptor@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
- integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.3.tgz#92d27cb3cd311c4977a4db47df457234a13cb306"
+ integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==
dependencies:
- is-accessor-descriptor "^1.0.0"
- is-data-descriptor "^1.0.0"
- kind-of "^6.0.2"
+ is-accessor-descriptor "^1.0.1"
+ is-data-descriptor "^1.0.1"
is-extendable@^0.1.0, is-extendable@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
- integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
+ integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==
is-extendable@^1.0.1:
version "1.0.1"
@@ -6097,17 +6304,24 @@ is-extglob@^2.1.1:
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+is-finalizationregistry@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90"
+ integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==
+ dependencies:
+ call-bound "^1.0.3"
+
is-fullwidth-code-point@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
- integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
+ integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==
dependencies:
number-is-nan "^1.0.0"
is-fullwidth-code-point@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
- integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+ integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
@@ -6119,6 +6333,13 @@ is-generator-fn@^2.0.0:
resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
+is-generator-function@^1.0.10:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72"
+ integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
@@ -6129,37 +6350,33 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
is-installed-globally@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80"
- integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=
+ integrity sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==
dependencies:
global-dirs "^0.1.0"
is-path-inside "^1.0.0"
-is-map@^2.0.1, is-map@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127"
- integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==
-
-is-negative-zero@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
- integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
+is-map@^2.0.2, is-map@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e"
+ integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==
is-npm@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
- integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ=
+ integrity sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==
-is-number-object@^1.0.4:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0"
- integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==
+is-number-object@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541"
+ integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==
dependencies:
- has-tostringtag "^1.0.0"
+ call-bound "^1.0.3"
+ has-tostringtag "^1.0.2"
is-number@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
- integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
+ integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==
dependencies:
kind-of "^3.0.2"
@@ -6171,12 +6388,12 @@ is-number@^7.0.0:
is-obj@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
- integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8=
+ integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==
is-path-inside@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
- integrity sha1-jvW33lBDej/cprToZe96pVy0gDY=
+ integrity sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==
dependencies:
path-is-inside "^1.0.1"
@@ -6195,93 +6412,93 @@ is-potential-custom-element-name@^1.0.1:
is-redirect@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
- integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=
+ integrity sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==
-is-regex@^1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
- integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+is-regex@^1.1.4, is-regex@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22"
+ integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==
dependencies:
- call-bind "^1.0.2"
- has-tostringtag "^1.0.0"
+ call-bound "^1.0.2"
+ gopd "^1.2.0"
+ has-tostringtag "^1.0.2"
+ hasown "^2.0.2"
is-retry-allowed@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
-is-set@^2.0.1, is-set@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec"
- integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==
-
-is-shared-array-buffer@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6"
- integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==
+is-set@^2.0.2, is-set@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d"
+ integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==
-is-shared-array-buffer@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
- integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
+is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f"
+ integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==
dependencies:
- call-bind "^1.0.2"
+ call-bound "^1.0.3"
is-stream@^1.0.0, is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
- integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
+ integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==
is-stream@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
-is-string@^1.0.5, is-string@^1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
- integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+is-string@^1.0.7, is-string@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9"
+ integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==
dependencies:
- has-tostringtag "^1.0.0"
+ call-bound "^1.0.3"
+ has-tostringtag "^1.0.2"
-is-symbol@^1.0.2, is-symbol@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
- integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+is-symbol@^1.0.4, is-symbol@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634"
+ integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==
dependencies:
- has-symbols "^1.0.2"
+ call-bound "^1.0.2"
+ has-symbols "^1.1.0"
+ safe-regex-test "^1.1.0"
-is-typed-array@^1.1.10:
- version "1.1.12"
- resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a"
- integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==
+is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15:
+ version "1.1.15"
+ resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b"
+ integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==
dependencies:
- which-typed-array "^1.1.11"
+ which-typed-array "^1.1.16"
is-typedarray@^1.0.0, is-typedarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
- integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+ integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==
-is-weakmap@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2"
- integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==
+is-weakmap@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd"
+ integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==
-is-weakref@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
- integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+is-weakref@^1.0.2, is-weakref@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.0.tgz#47e3472ae95a63fa9cf25660bcf0c181c39770ef"
+ integrity sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==
dependencies:
- call-bind "^1.0.2"
+ call-bound "^1.0.2"
-is-weakset@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d"
- integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==
+is-weakset@^2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca"
+ integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==
dependencies:
- call-bind "^1.0.2"
- get-intrinsic "^1.1.1"
+ call-bound "^1.0.3"
+ get-intrinsic "^1.2.6"
is-windows@^1.0.2:
version "1.0.2"
@@ -6291,12 +6508,12 @@ is-windows@^1.0.2:
isarray@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
- integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+ integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==
isarray@1.0.0, isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
- integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+ integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
isarray@^2.0.5:
version "2.0.5"
@@ -6306,24 +6523,24 @@ isarray@^2.0.5:
iserror@0.0.2, iserror@^0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/iserror/-/iserror-0.0.2.tgz#bd53451fe2f668b9f2402c1966787aaa2c7c0bf5"
- integrity sha1-vVNFH+L2aLnyQCwZZnh6qix8C/U=
+ integrity sha512-oKGGrFVaWwETimP3SiWwjDeY27ovZoyZPHtxblC4hCq9fXxed/jasx+ATWFFjCVSRZng8VTMsN1nDnGo6zMBSw==
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
- integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
isobject@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
- integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
+ integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==
dependencies:
isarray "1.0.0"
isobject@^3.0.0, isobject@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
- integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
+ integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
isomorphic-fetch@^3.0.0:
version "3.0.0"
@@ -6336,17 +6553,17 @@ isomorphic-fetch@^3.0.0:
isstream@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
- integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
+ integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==
istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3"
- integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756"
+ integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==
istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a"
- integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d"
+ integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==
dependencies:
"@babel/core" "^7.12.3"
"@babel/parser" "^7.14.7"
@@ -6355,12 +6572,12 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0:
semver "^6.3.0"
istanbul-lib-report@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6"
- integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d"
+ integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==
dependencies:
istanbul-lib-coverage "^3.0.0"
- make-dir "^3.0.0"
+ make-dir "^4.0.0"
supports-color "^7.1.0"
istanbul-lib-source-maps@^4.0.0:
@@ -6373,13 +6590,25 @@ istanbul-lib-source-maps@^4.0.0:
source-map "^0.6.1"
istanbul-reports@^3.1.3:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.3.tgz#4bcae3103b94518117930d51283690960b50d3c2"
- integrity sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==
+ version "3.1.7"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b"
+ integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==
dependencies:
html-escaper "^2.0.0"
istanbul-lib-report "^3.0.0"
+iterator.prototype@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.4.tgz#4ae6cf98b97fdc717b7e159d79dc25f8fc9482f1"
+ integrity sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-object-atoms "^1.0.0"
+ get-intrinsic "^1.2.6"
+ has-symbols "^1.1.0"
+ reflect.getprototypeof "^1.0.8"
+ set-function-name "^2.0.2"
+
jackspeak@^3.1.2:
version "3.4.3"
resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a"
@@ -6389,143 +6618,168 @@ jackspeak@^3.1.2:
optionalDependencies:
"@pkgjs/parseargs" "^0.11.0"
-jest-changed-files@^27.4.2:
- version "27.4.2"
- resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.4.2.tgz#da2547ea47c6e6a5f6ed336151bd2075736eb4a5"
- integrity sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A==
+jest-changed-files@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5"
+ integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==
dependencies:
- "@jest/types" "^27.4.2"
+ "@jest/types" "^27.5.1"
execa "^5.0.0"
throat "^6.0.1"
-jest-circus@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.4.6.tgz#d3af34c0eb742a967b1919fbb351430727bcea6c"
- integrity sha512-UA7AI5HZrW4wRM72Ro80uRR2Fg+7nR0GESbSI/2M+ambbzVuA63mn5T1p3Z/wlhntzGpIG1xx78GP2YIkf6PhQ==
+jest-circus@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc"
+ integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==
dependencies:
- "@jest/environment" "^27.4.6"
- "@jest/test-result" "^27.4.6"
- "@jest/types" "^27.4.2"
+ "@jest/environment" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/types" "^27.5.1"
"@types/node" "*"
chalk "^4.0.0"
co "^4.6.0"
dedent "^0.7.0"
- expect "^27.4.6"
+ expect "^27.5.1"
is-generator-fn "^2.0.0"
- jest-each "^27.4.6"
- jest-matcher-utils "^27.4.6"
- jest-message-util "^27.4.6"
- jest-runtime "^27.4.6"
- jest-snapshot "^27.4.6"
- jest-util "^27.4.2"
- pretty-format "^27.4.6"
+ jest-each "^27.5.1"
+ jest-matcher-utils "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-runtime "^27.5.1"
+ jest-snapshot "^27.5.1"
+ jest-util "^27.5.1"
+ pretty-format "^27.5.1"
slash "^3.0.0"
stack-utils "^2.0.3"
throat "^6.0.1"
-jest-cli@^27.4.7:
- version "27.4.7"
- resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.4.7.tgz#d00e759e55d77b3bcfea0715f527c394ca314e5a"
- integrity sha512-zREYhvjjqe1KsGV15mdnxjThKNDgza1fhDT+iUsXWLCq3sxe9w5xnvyctcYVT5PcdLSjv7Y5dCwTS3FCF1tiuw==
+jest-cli@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145"
+ integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==
dependencies:
- "@jest/core" "^27.4.7"
- "@jest/test-result" "^27.4.6"
- "@jest/types" "^27.4.2"
+ "@jest/core" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/types" "^27.5.1"
chalk "^4.0.0"
exit "^0.1.2"
- graceful-fs "^4.2.4"
+ graceful-fs "^4.2.9"
import-local "^3.0.2"
- jest-config "^27.4.7"
- jest-util "^27.4.2"
- jest-validate "^27.4.6"
+ jest-config "^27.5.1"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
prompts "^2.0.1"
yargs "^16.2.0"
-jest-config@^27.4.7:
- version "27.4.7"
- resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.4.7.tgz#4f084b2acbd172c8b43aa4cdffe75d89378d3972"
- integrity sha512-xz/o/KJJEedHMrIY9v2ParIoYSrSVY6IVeE4z5Z3i101GoA5XgfbJz+1C8EYPsv7u7f39dS8F9v46BHDhn0vlw==
+jest-config@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41"
+ integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==
dependencies:
"@babel/core" "^7.8.0"
- "@jest/test-sequencer" "^27.4.6"
- "@jest/types" "^27.4.2"
- babel-jest "^27.4.6"
+ "@jest/test-sequencer" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ babel-jest "^27.5.1"
chalk "^4.0.0"
ci-info "^3.2.0"
deepmerge "^4.2.2"
glob "^7.1.1"
- graceful-fs "^4.2.4"
- jest-circus "^27.4.6"
- jest-environment-jsdom "^27.4.6"
- jest-environment-node "^27.4.6"
- jest-get-type "^27.4.0"
- jest-jasmine2 "^27.4.6"
- jest-regex-util "^27.4.0"
- jest-resolve "^27.4.6"
- jest-runner "^27.4.6"
- jest-util "^27.4.2"
- jest-validate "^27.4.6"
+ graceful-fs "^4.2.9"
+ jest-circus "^27.5.1"
+ jest-environment-jsdom "^27.5.1"
+ jest-environment-node "^27.5.1"
+ jest-get-type "^27.5.1"
+ jest-jasmine2 "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-runner "^27.5.1"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
micromatch "^4.0.4"
- pretty-format "^27.4.6"
+ parse-json "^5.2.0"
+ pretty-format "^27.5.1"
slash "^3.0.0"
+ strip-json-comments "^3.1.1"
+
+jest-diff@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def"
+ integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==
+ dependencies:
+ chalk "^4.0.0"
+ diff-sequences "^27.5.1"
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
-jest-diff@^27.0.0, jest-diff@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.4.6.tgz#93815774d2012a2cbb6cf23f84d48c7a2618f98d"
- integrity sha512-zjaB0sh0Lb13VyPsd92V7HkqF6yKRH9vm33rwBt7rPYrpQvS1nCvlIy2pICbKta+ZjWngYLNn4cCK4nyZkjS/w==
+jest-diff@^29.0.0, jest-diff@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a"
+ integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==
dependencies:
chalk "^4.0.0"
- diff-sequences "^27.4.0"
- jest-get-type "^27.4.0"
- pretty-format "^27.4.6"
+ diff-sequences "^29.6.3"
+ jest-get-type "^29.6.3"
+ pretty-format "^29.7.0"
-jest-docblock@^27.4.0:
- version "27.4.0"
- resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.4.0.tgz#06c78035ca93cbbb84faf8fce64deae79a59f69f"
- integrity sha512-7TBazUdCKGV7svZ+gh7C8esAnweJoG+SvcF6Cjqj4l17zA2q1cMwx2JObSioubk317H+cjcHgP+7fTs60paulg==
+jest-docblock@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0"
+ integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==
dependencies:
detect-newline "^3.0.0"
-jest-each@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.4.6.tgz#e7e8561be61d8cc6dbf04296688747ab186c40ff"
- integrity sha512-n6QDq8y2Hsmn22tRkgAk+z6MCX7MeVlAzxmZDshfS2jLcaBlyhpF3tZSJLR+kXmh23GEvS0ojMR8i6ZeRvpQcA==
+jest-each@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e"
+ integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==
dependencies:
- "@jest/types" "^27.4.2"
+ "@jest/types" "^27.5.1"
chalk "^4.0.0"
- jest-get-type "^27.4.0"
- jest-util "^27.4.2"
- pretty-format "^27.4.6"
-
-jest-environment-jsdom@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.4.6.tgz#c23a394eb445b33621dfae9c09e4c8021dea7b36"
- integrity sha512-o3dx5p/kHPbUlRvSNjypEcEtgs6LmvESMzgRFQE6c+Prwl2JLA4RZ7qAnxc5VM8kutsGRTB15jXeeSbJsKN9iA==
- dependencies:
- "@jest/environment" "^27.4.6"
- "@jest/fake-timers" "^27.4.6"
- "@jest/types" "^27.4.2"
+ jest-get-type "^27.5.1"
+ jest-util "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-environment-jsdom@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546"
+ integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/types" "^27.5.1"
"@types/node" "*"
- jest-mock "^27.4.6"
- jest-util "^27.4.2"
+ jest-mock "^27.5.1"
+ jest-util "^27.5.1"
jsdom "^16.6.0"
-jest-environment-node@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.4.6.tgz#ee8cd4ef458a0ef09d087c8cd52ca5856df90242"
- integrity sha512-yfHlZ9m+kzTKZV0hVfhVu6GuDxKAYeFHrfulmy7Jxwsq4V7+ZK7f+c0XP/tbVDMQW7E4neG2u147hFkuVz0MlQ==
+jest-environment-node@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e"
+ integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==
dependencies:
- "@jest/environment" "^27.4.6"
- "@jest/fake-timers" "^27.4.6"
- "@jest/types" "^27.4.2"
+ "@jest/environment" "^27.5.1"
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/types" "^27.5.1"
"@types/node" "*"
- jest-mock "^27.4.6"
- jest-util "^27.4.2"
+ jest-mock "^27.5.1"
+ jest-util "^27.5.1"
+
+jest-extended@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/jest-extended/-/jest-extended-4.0.2.tgz#d23b52e687cedf66694e6b2d77f65e211e99e021"
+ integrity sha512-FH7aaPgtGYHc9mRjriS0ZEHYM5/W69tLrFTIdzm+yJgeoCmmrSB/luSfMSqWP9O29QWHPEmJ4qmU6EwsZideog==
+ dependencies:
+ jest-diff "^29.0.0"
+ jest-get-type "^29.0.0"
-jest-get-type@^27.4.0:
- version "27.4.0"
- resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.4.0.tgz#7503d2663fffa431638337b3998d39c5e928e9b5"
- integrity sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==
+jest-get-type@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1"
+ integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==
+
+jest-get-type@^29.0.0, jest-get-type@^29.6.3:
+ version "29.6.3"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1"
+ integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==
jest-haste-map@^26.6.2:
version "26.6.2"
@@ -6548,183 +6802,207 @@ jest-haste-map@^26.6.2:
optionalDependencies:
fsevents "^2.1.2"
-jest-haste-map@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.4.6.tgz#c60b5233a34ca0520f325b7e2cc0a0140ad0862a"
- integrity sha512-0tNpgxg7BKurZeFkIOvGCkbmOHbLFf4LUQOxrQSMjvrQaQe3l6E8x6jYC1NuWkGo5WDdbr8FEzUxV2+LWNawKQ==
+jest-haste-map@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f"
+ integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==
dependencies:
- "@jest/types" "^27.4.2"
+ "@jest/types" "^27.5.1"
"@types/graceful-fs" "^4.1.2"
"@types/node" "*"
anymatch "^3.0.3"
fb-watchman "^2.0.0"
- graceful-fs "^4.2.4"
- jest-regex-util "^27.4.0"
- jest-serializer "^27.4.0"
- jest-util "^27.4.2"
- jest-worker "^27.4.6"
+ graceful-fs "^4.2.9"
+ jest-regex-util "^27.5.1"
+ jest-serializer "^27.5.1"
+ jest-util "^27.5.1"
+ jest-worker "^27.5.1"
micromatch "^4.0.4"
walker "^1.0.7"
optionalDependencies:
fsevents "^2.3.2"
-jest-jasmine2@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.4.6.tgz#109e8bc036cb455950ae28a018f983f2abe50127"
- integrity sha512-uAGNXF644I/whzhsf7/qf74gqy9OuhvJ0XYp8SDecX2ooGeaPnmJMjXjKt0mqh1Rl5dtRGxJgNrHlBQIBfS5Nw==
+jest-jasmine2@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4"
+ integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==
dependencies:
- "@jest/environment" "^27.4.6"
- "@jest/source-map" "^27.4.0"
- "@jest/test-result" "^27.4.6"
- "@jest/types" "^27.4.2"
+ "@jest/environment" "^27.5.1"
+ "@jest/source-map" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/types" "^27.5.1"
"@types/node" "*"
chalk "^4.0.0"
co "^4.6.0"
- expect "^27.4.6"
+ expect "^27.5.1"
is-generator-fn "^2.0.0"
- jest-each "^27.4.6"
- jest-matcher-utils "^27.4.6"
- jest-message-util "^27.4.6"
- jest-runtime "^27.4.6"
- jest-snapshot "^27.4.6"
- jest-util "^27.4.2"
- pretty-format "^27.4.6"
+ jest-each "^27.5.1"
+ jest-matcher-utils "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-runtime "^27.5.1"
+ jest-snapshot "^27.5.1"
+ jest-util "^27.5.1"
+ pretty-format "^27.5.1"
throat "^6.0.1"
-jest-leak-detector@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.4.6.tgz#ed9bc3ce514b4c582637088d9faf58a33bd59bf4"
- integrity sha512-kkaGixDf9R7CjHm2pOzfTxZTQQQ2gHTIWKY/JZSiYTc90bZp8kSZnUMS3uLAfwTZwc0tcMRoEX74e14LG1WapA==
+jest-leak-detector@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8"
+ integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==
+ dependencies:
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-matcher-utils@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab"
+ integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==
dependencies:
- jest-get-type "^27.4.0"
- pretty-format "^27.4.6"
+ chalk "^4.0.0"
+ jest-diff "^27.5.1"
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
-jest-matcher-utils@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.4.6.tgz#53ca7f7b58170638590e946f5363b988775509b8"
- integrity sha512-XD4PKT3Wn1LQnRAq7ZsTI0VRuEc9OrCPFiO1XL7bftTGmfNF0DcEwMHRgqiu7NGf8ZoZDREpGrCniDkjt79WbA==
+jest-matcher-utils@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12"
+ integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==
dependencies:
chalk "^4.0.0"
- jest-diff "^27.4.6"
- jest-get-type "^27.4.0"
- pretty-format "^27.4.6"
+ jest-diff "^29.7.0"
+ jest-get-type "^29.6.3"
+ pretty-format "^29.7.0"
-jest-message-util@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.4.6.tgz#9fdde41a33820ded3127465e1a5896061524da31"
- integrity sha512-0p5szriFU0U74czRSFjH6RyS7UYIAkn/ntwMuOwTGWrQIOh5NzXXrq72LOqIkJKKvFbPq+byZKuBz78fjBERBA==
+jest-message-util@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf"
+ integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==
dependencies:
"@babel/code-frame" "^7.12.13"
- "@jest/types" "^27.4.2"
+ "@jest/types" "^27.5.1"
"@types/stack-utils" "^2.0.0"
chalk "^4.0.0"
- graceful-fs "^4.2.4"
+ graceful-fs "^4.2.9"
+ micromatch "^4.0.4"
+ pretty-format "^27.5.1"
+ slash "^3.0.0"
+ stack-utils "^2.0.3"
+
+jest-message-util@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3"
+ integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@jest/types" "^29.6.3"
+ "@types/stack-utils" "^2.0.0"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
micromatch "^4.0.4"
- pretty-format "^27.4.6"
+ pretty-format "^29.7.0"
slash "^3.0.0"
stack-utils "^2.0.3"
-jest-mock@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.4.6.tgz#77d1ba87fbd33ccb8ef1f061697e7341b7635195"
- integrity sha512-kvojdYRkst8iVSZ1EJ+vc1RRD9llueBjKzXzeCytH3dMM7zvPV/ULcfI2nr0v0VUgm3Bjt3hBCQvOeaBz+ZTHw==
+jest-mock@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6"
+ integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==
dependencies:
- "@jest/types" "^27.4.2"
+ "@jest/types" "^27.5.1"
"@types/node" "*"
jest-pnp-resolver@^1.2.2:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c"
- integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e"
+ integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==
jest-regex-util@^26.0.0:
version "26.0.0"
resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28"
integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==
-jest-regex-util@^27.4.0:
- version "27.4.0"
- resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.4.0.tgz#e4c45b52653128843d07ad94aec34393ea14fbca"
- integrity sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg==
+jest-regex-util@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95"
+ integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==
-jest-resolve-dependencies@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.6.tgz#fc50ee56a67d2c2183063f6a500cc4042b5e2327"
- integrity sha512-W85uJZcFXEVZ7+MZqIPCscdjuctruNGXUZ3OHSXOfXR9ITgbUKeHj+uGcies+0SsvI5GtUfTw4dY7u9qjTvQOw==
+jest-resolve-dependencies@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8"
+ integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==
dependencies:
- "@jest/types" "^27.4.2"
- jest-regex-util "^27.4.0"
- jest-snapshot "^27.4.6"
+ "@jest/types" "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-snapshot "^27.5.1"
-jest-resolve@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.4.6.tgz#2ec3110655e86d5bfcfa992e404e22f96b0b5977"
- integrity sha512-SFfITVApqtirbITKFAO7jOVN45UgFzcRdQanOFzjnbd+CACDoyeX7206JyU92l4cRr73+Qy/TlW51+4vHGt+zw==
+jest-resolve@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384"
+ integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==
dependencies:
- "@jest/types" "^27.4.2"
+ "@jest/types" "^27.5.1"
chalk "^4.0.0"
- graceful-fs "^4.2.4"
- jest-haste-map "^27.4.6"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^27.5.1"
jest-pnp-resolver "^1.2.2"
- jest-util "^27.4.2"
- jest-validate "^27.4.6"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
resolve "^1.20.0"
resolve.exports "^1.1.0"
slash "^3.0.0"
-jest-runner@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.4.6.tgz#1d390d276ec417e9b4d0d081783584cbc3e24773"
- integrity sha512-IDeFt2SG4DzqalYBZRgbbPmpwV3X0DcntjezPBERvnhwKGWTW7C5pbbA5lVkmvgteeNfdd/23gwqv3aiilpYPg==
- dependencies:
- "@jest/console" "^27.4.6"
- "@jest/environment" "^27.4.6"
- "@jest/test-result" "^27.4.6"
- "@jest/transform" "^27.4.6"
- "@jest/types" "^27.4.2"
+jest-runner@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5"
+ integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==
+ dependencies:
+ "@jest/console" "^27.5.1"
+ "@jest/environment" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
"@types/node" "*"
chalk "^4.0.0"
emittery "^0.8.1"
- exit "^0.1.2"
- graceful-fs "^4.2.4"
- jest-docblock "^27.4.0"
- jest-environment-jsdom "^27.4.6"
- jest-environment-node "^27.4.6"
- jest-haste-map "^27.4.6"
- jest-leak-detector "^27.4.6"
- jest-message-util "^27.4.6"
- jest-resolve "^27.4.6"
- jest-runtime "^27.4.6"
- jest-util "^27.4.2"
- jest-worker "^27.4.6"
+ graceful-fs "^4.2.9"
+ jest-docblock "^27.5.1"
+ jest-environment-jsdom "^27.5.1"
+ jest-environment-node "^27.5.1"
+ jest-haste-map "^27.5.1"
+ jest-leak-detector "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-runtime "^27.5.1"
+ jest-util "^27.5.1"
+ jest-worker "^27.5.1"
source-map-support "^0.5.6"
throat "^6.0.1"
-jest-runtime@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.4.6.tgz#83ae923818e3ea04463b22f3597f017bb5a1cffa"
- integrity sha512-eXYeoR/MbIpVDrjqy5d6cGCFOYBFFDeKaNWqTp0h6E74dK0zLHzASQXJpl5a2/40euBmKnprNLJ0Kh0LCndnWQ==
- dependencies:
- "@jest/environment" "^27.4.6"
- "@jest/fake-timers" "^27.4.6"
- "@jest/globals" "^27.4.6"
- "@jest/source-map" "^27.4.0"
- "@jest/test-result" "^27.4.6"
- "@jest/transform" "^27.4.6"
- "@jest/types" "^27.4.2"
+jest-runtime@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af"
+ integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/globals" "^27.5.1"
+ "@jest/source-map" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
chalk "^4.0.0"
cjs-module-lexer "^1.0.0"
collect-v8-coverage "^1.0.0"
execa "^5.0.0"
glob "^7.1.3"
- graceful-fs "^4.2.4"
- jest-haste-map "^27.4.6"
- jest-message-util "^27.4.6"
- jest-mock "^27.4.6"
- jest-regex-util "^27.4.0"
- jest-resolve "^27.4.6"
- jest-snapshot "^27.4.6"
- jest-util "^27.4.2"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-mock "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-snapshot "^27.5.1"
+ jest-util "^27.5.1"
slash "^3.0.0"
strip-bom "^4.0.0"
@@ -6736,40 +7014,40 @@ jest-serializer@^26.6.2:
"@types/node" "*"
graceful-fs "^4.2.4"
-jest-serializer@^27.4.0:
- version "27.4.0"
- resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.4.0.tgz#34866586e1cae2388b7d12ffa2c7819edef5958a"
- integrity sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ==
+jest-serializer@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64"
+ integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==
dependencies:
"@types/node" "*"
- graceful-fs "^4.2.4"
+ graceful-fs "^4.2.9"
-jest-snapshot@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.4.6.tgz#e2a3b4fff8bdce3033f2373b2e525d8b6871f616"
- integrity sha512-fafUCDLQfzuNP9IRcEqaFAMzEe7u5BF7mude51wyWv7VRex60WznZIC7DfKTgSIlJa8aFzYmXclmN328aqSDmQ==
+jest-snapshot@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1"
+ integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==
dependencies:
"@babel/core" "^7.7.2"
"@babel/generator" "^7.7.2"
"@babel/plugin-syntax-typescript" "^7.7.2"
"@babel/traverse" "^7.7.2"
"@babel/types" "^7.0.0"
- "@jest/transform" "^27.4.6"
- "@jest/types" "^27.4.2"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
"@types/babel__traverse" "^7.0.4"
"@types/prettier" "^2.1.5"
babel-preset-current-node-syntax "^1.0.0"
chalk "^4.0.0"
- expect "^27.4.6"
- graceful-fs "^4.2.4"
- jest-diff "^27.4.6"
- jest-get-type "^27.4.0"
- jest-haste-map "^27.4.6"
- jest-matcher-utils "^27.4.6"
- jest-message-util "^27.4.6"
- jest-util "^27.4.2"
+ expect "^27.5.1"
+ graceful-fs "^4.2.9"
+ jest-diff "^27.5.1"
+ jest-get-type "^27.5.1"
+ jest-haste-map "^27.5.1"
+ jest-matcher-utils "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-util "^27.5.1"
natural-compare "^1.4.0"
- pretty-format "^27.4.6"
+ pretty-format "^27.5.1"
semver "^7.3.2"
jest-util@^26.6.2:
@@ -6784,41 +7062,53 @@ jest-util@^26.6.2:
is-ci "^2.0.0"
micromatch "^4.0.2"
-jest-util@^27.4.2:
- version "27.4.2"
- resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.4.2.tgz#ed95b05b1adfd761e2cda47e0144c6a58e05a621"
- integrity sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA==
+jest-util@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9"
+ integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==
dependencies:
- "@jest/types" "^27.4.2"
+ "@jest/types" "^27.5.1"
"@types/node" "*"
chalk "^4.0.0"
ci-info "^3.2.0"
- graceful-fs "^4.2.4"
+ graceful-fs "^4.2.9"
+ picomatch "^2.2.3"
+
+jest-util@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc"
+ integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==
+ dependencies:
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ ci-info "^3.2.0"
+ graceful-fs "^4.2.9"
picomatch "^2.2.3"
-jest-validate@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.4.6.tgz#efc000acc4697b6cf4fa68c7f3f324c92d0c4f1f"
- integrity sha512-872mEmCPVlBqbA5dToC57vA3yJaMRfIdpCoD3cyHWJOMx+SJwLNw0I71EkWs41oza/Er9Zno9XuTkRYCPDUJXQ==
+jest-validate@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067"
+ integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==
dependencies:
- "@jest/types" "^27.4.2"
+ "@jest/types" "^27.5.1"
camelcase "^6.2.0"
chalk "^4.0.0"
- jest-get-type "^27.4.0"
+ jest-get-type "^27.5.1"
leven "^3.1.0"
- pretty-format "^27.4.6"
+ pretty-format "^27.5.1"
-jest-watcher@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.4.6.tgz#673679ebeffdd3f94338c24f399b85efc932272d"
- integrity sha512-yKQ20OMBiCDigbD0quhQKLkBO+ObGN79MO4nT7YaCuQ5SM+dkBNWE8cZX0FjU6czwMvWw6StWbe+Wv4jJPJ+fw==
+jest-watcher@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2"
+ integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==
dependencies:
- "@jest/test-result" "^27.4.6"
- "@jest/types" "^27.4.2"
+ "@jest/test-result" "^27.5.1"
+ "@jest/types" "^27.5.1"
"@types/node" "*"
ansi-escapes "^4.2.1"
chalk "^4.0.0"
- jest-util "^27.4.2"
+ jest-util "^27.5.1"
string-length "^4.0.1"
jest-worker@^26.6.2:
@@ -6830,33 +7120,33 @@ jest-worker@^26.6.2:
merge-stream "^2.0.0"
supports-color "^7.0.0"
-jest-worker@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.6.tgz#5d2d93db419566cb680752ca0792780e71b3273e"
- integrity sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw==
+jest-worker@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
+ integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
dependencies:
"@types/node" "*"
merge-stream "^2.0.0"
supports-color "^8.0.0"
jest@27:
- version "27.4.7"
- resolved "https://registry.yarnpkg.com/jest/-/jest-27.4.7.tgz#87f74b9026a1592f2da05b4d258e57505f28eca4"
- integrity sha512-8heYvsx7nV/m8m24Vk26Y87g73Ba6ueUd0MWed/NXMhSZIm62U/llVbS0PJe1SHunbyXjJ/BqG1z9bFjGUIvTg==
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc"
+ integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==
dependencies:
- "@jest/core" "^27.4.7"
+ "@jest/core" "^27.5.1"
import-local "^3.0.2"
- jest-cli "^27.4.7"
+ jest-cli "^27.5.1"
-jiti@^1.21.0:
- version "1.21.6"
- resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268"
- integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==
+jiti@^1.21.6:
+ version "1.21.7"
+ resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.7.tgz#9dd81043424a3d28458b193d965f0d18a2300ba9"
+ integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==
jquery@^3.2.1:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470"
- integrity sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==
+ version "3.7.1"
+ resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de"
+ integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
@@ -6874,7 +7164,7 @@ js-yaml@^3.13.1:
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
- integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
+ integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==
jsdom@^16.6.0:
version "16.7.0"
@@ -6909,15 +7199,20 @@ jsdom@^16.6.0:
ws "^7.4.6"
xml-name-validator "^3.0.0"
-jsesc@^2.5.1:
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
- integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+jsesc@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d"
+ integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==
+
+jsesc@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e"
+ integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==
-jsesc@~0.5.0:
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
- integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
+json-buffer@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
+ integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.2:
version "1.0.2"
@@ -6947,19 +7242,17 @@ json-schema@0.4.0:
json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
- integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
+ integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
json-stringify-safe@~5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
- integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
+ integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==
-json5@^2.1.2:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3"
- integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==
- dependencies:
- minimist "^1.2.5"
+json5@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
jsonfile@^6.0.1:
version "6.1.0"
@@ -6973,7 +7266,7 @@ jsonfile@^6.0.1:
jsonparse@^1.2.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
- integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=
+ integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==
jsprim@^1.2.2:
version "1.4.2"
@@ -6986,33 +7279,37 @@ jsprim@^1.2.2:
verror "1.10.0"
"jsx-ast-utils@^2.4.1 || ^3.0.0":
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b"
- integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==
+ version "3.3.5"
+ resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a"
+ integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==
+ dependencies:
+ array-includes "^3.1.6"
+ array.prototype.flat "^1.3.1"
+ object.assign "^4.1.4"
+ object.values "^1.1.6"
+
+keyv@^4.5.3:
+ version "4.5.4"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
+ integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
dependencies:
- array-includes "^3.1.3"
- object.assign "^4.1.2"
+ json-buffer "3.0.1"
kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
version "3.2.2"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
- integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
+ integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==
dependencies:
is-buffer "^1.1.5"
kind-of@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
- integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
+ integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==
dependencies:
is-buffer "^1.1.5"
-kind-of@^5.0.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
- integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
-
-kind-of@^6.0.0, kind-of@^6.0.2:
+kind-of@^6.0.2:
version "6.0.3"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
@@ -7022,36 +7319,17 @@ kleur@^3.0.3:
resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
-lang-julia@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/lang-julia/-/lang-julia-0.1.0.tgz#7a7fa9262bd6d9146b4208cd5a8e1e448cb4ca73"
- integrity sha512-wn+KzHfYeznohwugBQ6mXEC1ug1OHaN3BJ2yymhi+A7s3h7Mo3OS94ZXmTgu/upuDwvM7MEj0WSmETxMls7n2w==
- dependencies:
- "@codemirror/autocomplete" "^0.19.0"
- "@codemirror/highlight" "^0.19.0"
- "@codemirror/language" "^0.19.0"
- "@codemirror/state" "^0.19.0"
- "@lezer/common" "^0.15.0"
- lezer-julia "^0.1.0"
-
latest-version@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15"
- integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=
+ integrity sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==
dependencies:
package-json "^4.0.0"
lazy-property@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/lazy-property/-/lazy-property-1.0.0.tgz#84ddc4b370679ba8bd4cdcfa4c06b43d57111147"
- integrity sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc=
-
-lcid@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
- integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
- dependencies:
- invert-kv "^1.0.0"
+ integrity sha512-O52TK7FHpBPzdtvc5GoF0EPLQIBMqrAupANPGBidPkrDpl9IXlzuma3T+m0o0OpkRVPmTu3SDoT7985lw4KbNQ==
leven@^3.1.0:
version "3.1.0"
@@ -7066,22 +7344,6 @@ levn@^0.4.1:
prelude-ls "^1.2.1"
type-check "~0.4.0"
-levn@~0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
- integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
- dependencies:
- prelude-ls "~1.1.2"
- type-check "~0.3.2"
-
-lezer-julia@^0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/lezer-julia/-/lezer-julia-0.1.1.tgz#962498a9f506923998b23f771103854d2eeac5d4"
- integrity sha512-n27PSx669B/WyyP4aIy9eFvSLVESS0Ee71nZGWQTQCj3Rs+B6ESOmgkd11X5XE0p9WILTFPHOf1/NAXuEUiJgQ==
- dependencies:
- "@lezer/common" "^0.15.0"
- "@lezer/lr" "^0.15.0"
-
libcipm@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-4.0.8.tgz#dcea4919e10dfbce420327e63901613b9141bc89"
@@ -7219,40 +7481,25 @@ libnpx@^10.2.4:
lie@3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e"
- integrity sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=
+ integrity sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==
dependencies:
immediate "~3.0.5"
-lilconfig@^2.0.3, lilconfig@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082"
- integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==
-
-lilconfig@^2.1.0:
+lilconfig@^2.0.3, lilconfig@^2.0.5:
version "2.1.0"
resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52"
integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==
-lilconfig@^3.0.0:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb"
- integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==
+lilconfig@^3.0.0, lilconfig@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4"
+ integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==
lines-and-columns@^1.1.6:
version "1.2.4"
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
-load-json-file@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
- integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=
- dependencies:
- graceful-fs "^4.1.2"
- parse-json "^2.2.0"
- pify "^2.0.0"
- strip-bom "^3.0.0"
-
localforage@^1.9.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4"
@@ -7260,14 +7507,6 @@ localforage@^1.9.0:
dependencies:
lie "3.1.1"
-locate-path@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
- integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
- dependencies:
- p-locate "^2.0.0"
- path-exists "^3.0.0"
-
locate-path@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
@@ -7283,12 +7522,12 @@ locate-path@^5.0.0:
dependencies:
p-locate "^4.1.0"
-lock-verify@^2.0.2, lock-verify@^2.1.0:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.2.1.tgz#81107948c51ed16f97b96ff8b60675affb243fc1"
- integrity sha512-n0Zw2DVupKfZMazy/HIFVNohJ1z8fIoZ77WBnyyBGG6ixw83uJNyrbiJvvHWe1QKkGiBCjj8RCPlymltliqEww==
+lock-verify@^2.0.2, lock-verify@^2.1.0, lock-verify@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.2.2.tgz#9e93c0999dc3cbbede4f16f9cfdaa93ead8c76ef"
+ integrity sha512-2CUNtr1ZSVKJHcYP8uEzafmmuyauCB5zZimj8TvQd/Lflt9kXVZs+8S+EbAzZLaVUDn8CYGmeC3DFGdYfnCzeQ==
dependencies:
- "@iarna/cli" "^1.2.0"
+ "@iarna/cli" "^2.1.0"
npm-package-arg "^6.1.0"
semver "^5.4.1"
@@ -7302,7 +7541,7 @@ lockfile@^1.0.4:
lodash._baseuniq@~4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8"
- integrity sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg=
+ integrity sha512-Ja1YevpHZctlI5beLA7oc5KNDhGcPixFhcqSiORHNsp/1QTv7amAXzw+gu4YOvErqVlMVyIJGgtzeepCnnur0A==
dependencies:
lodash._createset "~4.0.0"
lodash._root "~3.0.0"
@@ -7310,27 +7549,32 @@ lodash._baseuniq@~4.6.0:
lodash._createset@~4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26"
- integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY=
+ integrity sha512-GTkC6YMprrJZCYU3zcqZj+jkXkrXzq3IPBcF/fIPpNEAB4hZEtXU8zp/RwKOvZl43NUmwDbyRk3+ZTbeRdEBXA==
lodash._root@~3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
- integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=
+ integrity sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==
lodash.clonedeep@^4.5.0, lodash.clonedeep@~4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
- integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
+ integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==
lodash.debounce@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
- integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
+ integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
+
+lodash.isequal@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
+ integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==
lodash.memoize@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
- integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
+ integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==
lodash.merge@^4.6.2:
version "4.6.2"
@@ -7340,22 +7584,22 @@ lodash.merge@^4.6.2:
lodash.truncate@^4.4.2:
version "4.4.2"
resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
- integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=
+ integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==
lodash.union@~4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88"
- integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=
+ integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==
lodash.uniq@^4.5.0, lodash.uniq@~4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
- integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
+ integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==
lodash.without@~4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac"
- integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw=
+ integrity sha512-M3MefBwfDhgKgINVuBJCO1YR3+gf6s9HNJsIiZ/Ru77Ws6uTb9eBuvrkpzO+9iLoAaRodGuq7tyrPCx+74QYGQ==
lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.7.0, lodash@latest:
version "4.17.21"
@@ -7399,19 +7643,7 @@ lru-cache@^5.1.1:
dependencies:
yallist "^3.0.2"
-lru-cache@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
- integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
- dependencies:
- yallist "^4.0.0"
-
-lz-string@^1.4.4:
- version "1.4.4"
- resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26"
- integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=
-
-lz-string@^1.5.0:
+lz-string@^1.4.4, lz-string@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941"
integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==
@@ -7423,12 +7655,20 @@ make-dir@^1.0.0:
dependencies:
pify "^3.0.0"
-make-dir@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
- integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+make-dir@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
+ integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
+ dependencies:
+ pify "^4.0.1"
+ semver "^5.6.0"
+
+make-dir@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e"
+ integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==
dependencies:
- semver "^6.0.0"
+ semver "^7.5.3"
make-fetch-happen@^5.0.0:
version "5.0.2"
@@ -7457,12 +7697,12 @@ makeerror@1.0.12:
map-cache@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
- integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
+ integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==
map-visit@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
- integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
+ integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==
dependencies:
object-visit "^1.0.0"
@@ -7471,10 +7711,10 @@ marked@^0.4:
resolved "https://registry.yarnpkg.com/marked/-/marked-0.4.0.tgz#9ad2c2a7a1791f10a852e0112f77b571dce10c66"
integrity sha512-tMsdNBgOsrUophCAFQl0XPe6Zqk/uy9gnue+jIIKhykO51hxyu6uNx7zBPy0+y/WKYVZZMspV9YeXLNdKk+iYw==
-marked@^4.0.10:
- version "4.0.12"
- resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.12.tgz#2262a4e6fd1afd2f13557726238b69a48b982f7d"
- integrity sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==
+marked@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3"
+ integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==
match-sorter@^4.1.0:
version "4.2.1"
@@ -7484,23 +7724,21 @@ match-sorter@^4.1.0:
"@babel/runtime" "^7.10.5"
remove-accents "0.4.2"
+math-intrinsics@^1.0.0, math-intrinsics@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
+ integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
+
mdn-data@2.0.14:
version "2.0.14"
resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50"
integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==
-meant@^1.0.2:
+meant@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/meant/-/meant-1.0.3.tgz#67769af9de1d158773e928ae82c456114903554c"
integrity sha512-88ZRGcNxAq4EH38cQ4D85PM57pikCwS8Z99EWHODxN7KBY+UuPiqzRTtZzS8KTXO/ywSWbdjjJST2Hly/EQxLw==
-mem@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
- integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=
- dependencies:
- mimic-fn "^1.0.0"
-
memoize-one@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045"
@@ -7535,15 +7773,7 @@ micromatch@^3.1.4:
snapdragon "^0.8.1"
to-regex "^3.0.2"
-micromatch@^4.0.2:
- version "4.0.4"
- resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
- integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
- dependencies:
- braces "^3.0.1"
- picomatch "^2.2.3"
-
-micromatch@^4.0.4, micromatch@^4.0.5:
+micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
@@ -7551,22 +7781,17 @@ micromatch@^4.0.4, micromatch@^4.0.5:
braces "^3.0.3"
picomatch "^2.3.1"
-mime-db@1.51.0:
- version "1.51.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c"
- integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
mime-types@^2.1.12, mime-types@~2.1.19:
- version "2.1.34"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24"
- integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==
+ version "2.1.35"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
dependencies:
- mime-db "1.51.0"
-
-mimic-fn@^1.0.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
- integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
+ mime-db "1.52.0"
mimic-fn@^2.1.0:
version "2.1.0"
@@ -7576,7 +7801,7 @@ mimic-fn@^2.1.0:
min-document@^2.19.0:
version "2.19.0"
resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
- integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
+ integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==
dependencies:
dom-walk "^0.1.0"
@@ -7585,7 +7810,7 @@ min-indent@^1.0.0:
resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
-minimatch@^3.0.4:
+minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
@@ -7599,15 +7824,10 @@ minimatch@^9.0.4:
dependencies:
brace-expansion "^2.0.1"
-minimist@>=1.2.6:
- version "1.2.6"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
- integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
-
-minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5:
- version "1.2.5"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
- integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+minimist@>=1.2.6, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.6:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
minipass@^2.3.5, minipass@^2.6.0, minipass@^2.9.0:
version "2.9.0"
@@ -7656,14 +7876,14 @@ mixin-deep@^1.2.0:
mkdirp@0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e"
- integrity sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=
+ integrity sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==
-mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.0:
- version "0.5.5"
- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
- integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@^0.5.6, mkdirp@~0.5.0:
+ version "0.5.6"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
+ integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
dependencies:
- minimist "^1.2.5"
+ minimist "^1.2.6"
mkdirp@^1.0.4:
version "1.0.4"
@@ -7678,7 +7898,7 @@ mousetrap@^1.6.5:
move-concurrently@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
- integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=
+ integrity sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==
dependencies:
aproba "^1.1.1"
copy-concurrently "^1.0.0"
@@ -7695,14 +7915,9 @@ mri@^1.1.4:
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
- integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+ integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
-ms@2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
- integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-
-ms@^2.0.0, ms@^2.1.1:
+ms@^2.0.0, ms@^2.1.1, ms@^2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
@@ -7750,10 +7965,10 @@ mz@^2.7.0:
object-assign "^4.0.1"
thenify-all "^1.0.0"
-nanoid@^3.3.6, nanoid@^3.3.7:
- version "3.3.7"
- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
- integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+nanoid@^3.3.7:
+ version "3.3.8"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf"
+ integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==
nanomatch@^1.2.9:
version "1.2.13"
@@ -7775,7 +7990,7 @@ nanomatch@^1.2.9:
natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
- integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
nice-try@^1.0.4:
version "1.0.5"
@@ -7797,13 +8012,13 @@ node-fetch-npm@^2.0.2:
safe-buffer "^5.1.1"
node-fetch@^2.6.1:
- version "2.6.7"
- resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
- integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
+ integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
dependencies:
whatwg-url "^5.0.0"
-node-gyp@^5.0.2, node-gyp@^5.1.0:
+node-gyp@^5.0.2, node-gyp@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.1.1.tgz#eb915f7b631c937d282e33aed44cb7a025f62a3e"
integrity sha512-WH0WKGi+a4i4DUt2mHnvocex/xPLp9pYt5R6M2JdFB7pJ7Z34hveZ4nDTGTiLXCkitA9T8HFZjhinBCiVHYcWw==
@@ -7823,22 +8038,17 @@ node-gyp@^5.0.2, node-gyp@^5.1.0:
node-int64@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
- integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
+ integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==
node-match-path@^0.4.4:
version "0.4.4"
resolved "https://registry.yarnpkg.com/node-match-path/-/node-match-path-0.4.4.tgz#516a10926093c0cc6f237d020685b593b19baebb"
integrity sha512-pBq9gp7TG0r0VXuy/oeZmQsjBSnYQo7G886Ly/B3azRwZuEtHCY155dzmfoKWcDPGgyfIGD8WKVC7h3+6y7yTg==
-node-releases@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5"
- integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==
-
-node-releases@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01"
- integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==
+node-releases@^2.0.19:
+ version "2.0.19"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314"
+ integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==
node-request-interceptor@^0.5.1:
version "0.5.9"
@@ -7852,7 +8062,7 @@ node-request-interceptor@^0.5.1:
nopt@1.0.10:
version "1.0.10"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
- integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=
+ integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==
dependencies:
abbrev "1"
@@ -7864,7 +8074,7 @@ nopt@^4.0.1, nopt@^4.0.3:
abbrev "1"
osenv "^0.1.4"
-normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0:
+normalize-package-data@^2.0.0, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
@@ -7877,7 +8087,7 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-
normalize-path@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
- integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
+ integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==
dependencies:
remove-trailing-separator "^1.0.1"
@@ -7889,12 +8099,12 @@ normalize-path@^3.0.0, normalize-path@~3.0.0:
normalize-range@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
- integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=
+ integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==
normalize-url@*:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-7.0.3.tgz#12e56889f7a54b2d5b09616f36c442a9063f61af"
- integrity sha512-RiCOdwdPnzvwcBFJE4iI1ss3dMVRIrEzFpn8ftje6iBfzBInqlnRrNhxcLwBEKjPPXQKzm1Ptlxtaiv9wdcj5w==
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.1.tgz#9b7d96af9836577c58f5883e939365fa15623a4a"
+ integrity sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==
normalize-url@^6.0.1:
version "6.1.0"
@@ -7919,7 +8129,7 @@ npm-bundled@^1.0.1:
npm-cache-filename@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz#ded306c5b0bfc870a9e9faf823bc5f283e05ae11"
- integrity sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE=
+ integrity sha512-5v2y1KG06izpGvZJDSBR5q1Ej+NaPDO05yAAWBJE6+3eiId0R176Gz3Qc2vEmJnE+VGul84g6Qpq8fXzD82/JA==
npm-install-checks@^3.0.2:
version "3.0.2"
@@ -8005,7 +8215,7 @@ npm-registry-fetch@^4.0.0, npm-registry-fetch@^4.0.7:
npm-run-path@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
- integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
+ integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==
dependencies:
path-key "^2.0.0"
@@ -8029,9 +8239,9 @@ npm-user-validate@^1.0.1:
integrity sha512-uQwcd/tY+h1jnEaze6cdX/LrhWhoBxfSknxentoqmIuStxUExxjWd3ULMLFPiFUrZKbOVMowH6Jq2FRWfmhcEw==
npm@^6.3.0:
- version "6.14.16"
- resolved "https://registry.yarnpkg.com/npm/-/npm-6.14.16.tgz#a882d6b0b32d5212461f0c58719152add1a7b99a"
- integrity sha512-LMiLGYsVNJfVPlQg7v2NYjG7iRIapcLv+oMunlq7fkXVx0BATCjRu7XyWl0G+iuZzHy4CjtM32QB8ox8juTgaw==
+ version "6.14.18"
+ resolved "https://registry.yarnpkg.com/npm/-/npm-6.14.18.tgz#5cd431567f0961e1fe63d46738cf37f74f7999eb"
+ integrity sha512-p3SjqSchSuNQUqbJBgwdv0L3O6bKkaSfQrQzJsskNpNKLg0g37c5xTXFV0SqTlX9GWvoGxBELVJMRWq0J8oaLA==
dependencies:
JSONStream "^1.3.5"
abbrev "~1.1.1"
@@ -8040,9 +8250,9 @@ npm@^6.3.0:
aproba "^2.0.0"
archy "~1.0.0"
bin-links "^1.1.8"
- bluebird "^3.5.5"
+ bluebird "^3.7.2"
byte-size "^5.0.1"
- cacache "^12.0.3"
+ cacache "^12.0.4"
call-limit "^1.1.1"
chownr "^1.1.4"
ci-info "^2.0.0"
@@ -8050,18 +8260,18 @@ npm@^6.3.0:
cli-table3 "^0.5.1"
cmd-shim "^3.0.3"
columnify "~1.5.4"
- config-chain "^1.1.12"
+ config-chain "^1.1.13"
detect-indent "~5.0.0"
detect-newline "^2.1.0"
- dezalgo "~1.0.3"
+ dezalgo "^1.0.4"
editor "~1.0.0"
- figgy-pudding "^3.5.1"
+ figgy-pudding "^3.5.2"
find-npm-prefix "^1.0.2"
fs-vacuum "~1.2.10"
fs-write-stream-atomic "~1.0.10"
gentle-fs "^2.3.1"
- glob "^7.1.6"
- graceful-fs "^4.2.4"
+ glob "^7.2.3"
+ graceful-fs "^4.2.10"
has-unicode "~2.0.1"
hosted-git-info "^2.8.9"
iferr "^1.0.2"
@@ -8070,7 +8280,7 @@ npm@^6.3.0:
inherits "^2.0.4"
ini "^1.3.8"
init-package-json "^1.10.3"
- is-cidr "^3.0.0"
+ is-cidr "^3.1.1"
json-parse-better-errors "^1.0.2"
lazy-property "~1.0.0"
libcipm "^4.0.8"
@@ -8081,7 +8291,7 @@ npm@^6.3.0:
libnpmsearch "^2.0.2"
libnpmteam "^1.0.2"
libnpx "^10.2.4"
- lock-verify "^2.1.0"
+ lock-verify "^2.2.2"
lockfile "^1.0.4"
lodash._baseuniq "~4.6.0"
lodash.clonedeep "~4.5.0"
@@ -8089,11 +8299,11 @@ npm@^6.3.0:
lodash.uniq "~4.5.0"
lodash.without "~4.4.0"
lru-cache "^5.1.1"
- meant "^1.0.2"
+ meant "^1.0.3"
mississippi "^3.0.0"
- mkdirp "^0.5.5"
+ mkdirp "^0.5.6"
move-concurrently "^1.0.1"
- node-gyp "^5.1.0"
+ node-gyp "^5.1.1"
nopt "^4.0.3"
normalize-package-data "^2.5.0"
npm-audit-report "^1.3.3"
@@ -8114,19 +8324,19 @@ npm@^6.3.0:
path-is-inside "~1.0.2"
promise-inflight "~1.0.1"
qrcode-terminal "^0.12.0"
- query-string "^6.8.2"
- qw "~1.0.1"
+ query-string "^6.14.1"
+ qw "^1.0.2"
read "~1.0.7"
read-cmd-shim "^1.0.5"
read-installed "~4.0.3"
- read-package-json "^2.1.1"
+ read-package-json "^2.1.2"
read-package-tree "^5.3.1"
readable-stream "^3.6.0"
readdir-scoped-modules "^1.1.0"
- request "^2.88.0"
+ request "^2.88.2"
retry "^0.12.0"
rimraf "^2.7.1"
- safe-buffer "^5.1.2"
+ safe-buffer "^5.2.1"
semver "^5.7.1"
sha "^3.0.0"
slide "~1.1.6"
@@ -8142,7 +8352,7 @@ npm@^6.3.0:
unique-filename "^1.1.1"
unpipe "~1.0.0"
update-notifier "^2.5.0"
- uuid "^3.3.3"
+ uuid "^3.4.0"
validate-npm-package-license "^3.0.4"
validate-npm-package-name "~3.0.0"
which "^1.3.1"
@@ -8160,21 +8370,21 @@ npmlog@^4.1.2, npmlog@~4.1.2:
set-blocking "~2.0.0"
nth-check@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2"
- integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d"
+ integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==
dependencies:
boolbase "^1.0.0"
number-is-nan@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
- integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
+ integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==
nwsapi@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7"
- integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==
+ version "2.2.16"
+ resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.16.tgz#177760bba02c351df1d2644e220c31dfec8cdb43"
+ integrity sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==
oauth-sign@~0.9.0:
version "0.9.0"
@@ -8184,12 +8394,12 @@ oauth-sign@~0.9.0:
object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
- integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
object-copy@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
- integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
+ integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==
dependencies:
copy-descriptor "^0.1.0"
define-property "^0.2.5"
@@ -8200,20 +8410,20 @@ object-hash@^3.0.0:
resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9"
integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==
-object-inspect@^1.11.0, object-inspect@^1.9.0:
- version "1.12.0"
- resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0"
- integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==
+object-inspect@^1.13.3:
+ version "1.13.3"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a"
+ integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==
object-is@^1.1.5:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
- integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07"
+ integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.3"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
-object-keys@^1.0.12, object-keys@^1.1.1:
+object-keys@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
@@ -8221,85 +8431,75 @@ object-keys@^1.0.12, object-keys@^1.1.1:
object-visit@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
- integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
+ integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==
dependencies:
isobject "^3.0.0"
-object.assign@^4.1.0, object.assign@^4.1.2:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
- integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
- dependencies:
- call-bind "^1.0.0"
- define-properties "^1.1.3"
- has-symbols "^1.0.1"
- object-keys "^1.1.1"
-
-object.assign@^4.1.4:
- version "4.1.4"
- resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f"
- integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==
+object.assign@^4.1.4, object.assign@^4.1.7:
+ version "4.1.7"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d"
+ integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.4"
- has-symbols "^1.0.3"
+ call-bind "^1.0.8"
+ call-bound "^1.0.3"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+ has-symbols "^1.1.0"
object-keys "^1.1.1"
-object.entries@^1.1.5:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861"
- integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==
+object.entries@^1.1.8:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41"
+ integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.3"
- es-abstract "^1.19.1"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
-object.fromentries@^2.0.5:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251"
- integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==
+object.fromentries@^2.0.8:
+ version "2.0.8"
+ resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65"
+ integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.3"
- es-abstract "^1.19.1"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-object-atoms "^1.0.0"
object.getownpropertydescriptors@^2.0.3:
- version "2.1.3"
- resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e"
- integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==
- dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.3"
- es-abstract "^1.19.1"
-
-object.hasown@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.0.tgz#7232ed266f34d197d15cac5880232f7a4790afe5"
- integrity sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==
- dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.19.1"
+ version "2.1.8"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz#2f1fe0606ec1a7658154ccd4f728504f69667923"
+ integrity sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==
+ dependencies:
+ array.prototype.reduce "^1.0.6"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-object-atoms "^1.0.0"
+ gopd "^1.0.1"
+ safe-array-concat "^1.1.2"
object.pick@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
- integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
+ integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==
dependencies:
isobject "^3.0.1"
-object.values@^1.1.5:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac"
- integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==
+object.values@^1.1.6, object.values@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216"
+ integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.3"
- es-abstract "^1.19.1"
+ call-bind "^1.0.8"
+ call-bound "^1.0.3"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
once@^1.3.0, once@^1.3.1, once@^1.4.0, once@~1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
- integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
dependencies:
wrappy "1"
@@ -8315,48 +8515,27 @@ opener@^1.5.2:
resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598"
integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==
-optionator@^0.8.1:
- version "0.8.3"
- resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
- integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
- dependencies:
- deep-is "~0.1.3"
- fast-levenshtein "~2.0.6"
- levn "~0.3.0"
- prelude-ls "~1.1.2"
- type-check "~0.3.2"
- word-wrap "~1.2.3"
-
optionator@^0.9.1:
- version "0.9.1"
- resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
- integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
+ version "0.9.4"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734"
+ integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==
dependencies:
deep-is "^0.1.3"
fast-levenshtein "^2.0.6"
levn "^0.4.1"
prelude-ls "^1.2.1"
type-check "^0.4.0"
- word-wrap "^1.2.3"
+ word-wrap "^1.2.5"
os-homedir@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
- integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
-
-os-locale@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
- integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==
- dependencies:
- execa "^0.7.0"
- lcid "^1.0.0"
- mem "^1.1.0"
+ integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==
os-tmpdir@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
- integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
+ integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==
osenv@^0.1.4, osenv@^0.1.5:
version "0.1.5"
@@ -8366,23 +8545,25 @@ osenv@^0.1.4, osenv@^0.1.5:
os-homedir "^1.0.0"
os-tmpdir "^1.0.0"
+own-keys@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358"
+ integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==
+ dependencies:
+ get-intrinsic "^1.2.6"
+ object-keys "^1.1.1"
+ safe-push-apply "^1.0.0"
+
p-finally@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
- integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
+ integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==
p-finally@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561"
integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==
-p-limit@^1.1.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
- integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
- dependencies:
- p-try "^1.0.0"
-
p-limit@^2.0.0, p-limit@^2.2.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
@@ -8390,13 +8571,6 @@ p-limit@^2.0.0, p-limit@^2.2.0:
dependencies:
p-try "^2.0.0"
-p-locate@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
- integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
- dependencies:
- p-limit "^1.1.0"
-
p-locate@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
@@ -8411,11 +8585,6 @@ p-locate@^4.1.0:
dependencies:
p-limit "^2.2.0"
-p-try@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
- integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
-
p-try@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
@@ -8429,7 +8598,7 @@ package-json-from-dist@^1.0.0:
package-json@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
- integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=
+ integrity sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==
dependencies:
got "^6.7.1"
registry-auth-token "^3.0.1"
@@ -8488,14 +8657,7 @@ parent-module@^1.0.0:
dependencies:
callsites "^3.0.0"
-parse-json@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
- integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
- dependencies:
- error-ex "^1.2.0"
-
-parse-json@^5.0.0:
+parse-json@^5.0.0, parse-json@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
@@ -8513,12 +8675,12 @@ parse5@6.0.1:
pascalcase@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
- integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+ integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==
path-exists@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
- integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
+ integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==
path-exists@^4.0.0:
version "4.0.0"
@@ -8533,19 +8695,19 @@ path-is-absolute@^1.0.0:
path-is-inside@^1.0.1, path-is-inside@^1.0.2, path-is-inside@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
- integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
+ integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==
path-key@^2.0.0, path-key@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
- integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
+ integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==
path-key@^3.0.0, path-key@^3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
-path-parse@^1.0.6, path-parse@^1.0.7:
+path-parse@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
@@ -8558,13 +8720,6 @@ path-scurry@^1.11.1:
lru-cache "^10.2.0"
minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
-path-type@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
- integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=
- dependencies:
- pify "^2.0.0"
-
path-type@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
@@ -8573,14 +8728,14 @@ path-type@^4.0.0:
performance-now@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
- integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+ integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
picocolors@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f"
integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==
-picocolors@^1.0.0, picocolors@^1.1.0:
+picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0, picocolors@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
@@ -8590,26 +8745,26 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1:
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
-pify@^2.0.0, pify@^2.3.0:
+pify@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
- integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
+ integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
pify@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
- integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
+ integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==
+
+pify@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
+ integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
-pirates@^4.0.1:
+pirates@^4.0.1, pirates@^4.0.4:
version "4.0.6"
resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9"
integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==
-pirates@^4.0.4:
- version "4.0.5"
- resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b"
- integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==
-
pkg-dir@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
@@ -8625,9 +8780,14 @@ pluralize@^8.0.0:
posix-character-classes@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
- integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
+ integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==
+
+possible-typed-array-names@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f"
+ integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==
-postcss-calc@^8.2.0:
+postcss-calc@^8.2.3:
version "8.2.4"
resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5"
integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==
@@ -8653,42 +8813,43 @@ postcss-cli@^9.1.0:
slash "^4.0.0"
yargs "^17.0.0"
-postcss-colormin@^5.2.5:
- version "5.2.5"
- resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.2.5.tgz#d1fc269ac2ad03fe641d462b5d1dada35c69968a"
- integrity sha512-+X30aDaGYq81mFqwyPpnYInsZQnNpdxMX0ajlY7AExCexEFkPVV+KrO7kXwayqEWL2xwEbNQ4nUO0ZsRWGnevg==
+postcss-colormin@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f"
+ integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==
dependencies:
- browserslist "^4.16.6"
+ browserslist "^4.21.4"
caniuse-api "^3.0.0"
colord "^2.9.1"
postcss-value-parser "^4.2.0"
-postcss-convert-values@^5.0.4:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.0.4.tgz#3e74dd97c581f475ae7b4500bc0a7c4fb3a6b1b6"
- integrity sha512-bugzSAyjIexdObovsPZu/sBCTHccImJxLyFgeV0MmNBm/Lw5h5XnjfML6gzEmJ3A6nyfCW7hb1JXzcsA4Zfbdw==
+postcss-convert-values@^5.1.3:
+ version "5.1.3"
+ resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393"
+ integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==
dependencies:
+ browserslist "^4.21.4"
postcss-value-parser "^4.2.0"
-postcss-discard-comments@^5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.0.3.tgz#011acb63418d600fdbe18804e1bbecb543ad2f87"
- integrity sha512-6W5BemziRoqIdAKT+1QjM4bNcJAQ7z7zk073730NHg4cUXh3/rQHHj7pmYxUB9aGhuRhBiUf0pXvIHkRwhQP0Q==
+postcss-discard-comments@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696"
+ integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==
-postcss-discard-duplicates@^5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.3.tgz#10f202a4cfe9d407b73dfea7a477054d21ea0c1f"
- integrity sha512-vPtm1Mf+kp7iAENTG7jI1MN1lk+fBqL5y+qxyi4v3H+lzsXEdfS3dwUZD45KVhgzDEgduur8ycB4hMegyMTeRw==
+postcss-discard-duplicates@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848"
+ integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==
-postcss-discard-empty@^5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.0.3.tgz#ec185af4a3710b88933b0ff751aa157b6041dd6a"
- integrity sha512-xGJugpaXKakwKI7sSdZjUuN4V3zSzb2Y0LOlmTajFbNinEjTfVs9PFW2lmKBaC/E64WwYppfqLD03P8l9BuueA==
+postcss-discard-empty@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c"
+ integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==
-postcss-discard-overridden@^5.0.4:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.0.4.tgz#cc999d6caf18ea16eff8b2b58f48ec3ddee35c9c"
- integrity sha512-3j9QH0Qh1KkdxwiZOW82cId7zdwXVQv/gRXYDnwx5pBtR1sTkU4cXRK9lp5dSdiM0r0OICO/L8J6sV1/7m0kHg==
+postcss-discard-overridden@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e"
+ integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==
postcss-flexbugs-fixes@^5.0.2:
version "5.0.2"
@@ -8728,14 +8889,14 @@ postcss-js@^4.0.1:
camelcase-css "^2.0.1"
postcss-load-config@^3.0.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.1.tgz#2f53a17f2f543d9e63864460af42efdac0d41f87"
- integrity sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855"
+ integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==
dependencies:
- lilconfig "^2.0.4"
+ lilconfig "^2.0.5"
yaml "^1.10.2"
-postcss-load-config@^4.0.1:
+postcss-load-config@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3"
integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==
@@ -8743,57 +8904,57 @@ postcss-load-config@^4.0.1:
lilconfig "^3.0.0"
yaml "^2.3.4"
-postcss-merge-longhand@^5.0.6:
- version "5.0.6"
- resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.0.6.tgz#090e60d5d3b3caad899f8774f8dccb33217d2166"
- integrity sha512-rkmoPwQO6ymJSmWsX6l2hHeEBQa7C4kJb9jyi5fZB1sE8nSCv7sqchoYPixRwX/yvLoZP2y6FA5kcjiByeJqDg==
+postcss-merge-longhand@^5.1.7:
+ version "5.1.7"
+ resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16"
+ integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==
dependencies:
postcss-value-parser "^4.2.0"
- stylehacks "^5.0.3"
+ stylehacks "^5.1.1"
-postcss-merge-rules@^5.0.6:
- version "5.0.6"
- resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.0.6.tgz#26b37411fe1e80202fcef61cab027265b8925f2b"
- integrity sha512-nzJWJ9yXWp8AOEpn/HFAW72WKVGD2bsLiAmgw4hDchSij27bt6TF+sIK0cJUBAYT3SGcjtGGsOR89bwkkMuMgQ==
+postcss-merge-rules@^5.1.4:
+ version "5.1.4"
+ resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c"
+ integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==
dependencies:
- browserslist "^4.16.6"
+ browserslist "^4.21.4"
caniuse-api "^3.0.0"
- cssnano-utils "^3.0.2"
+ cssnano-utils "^3.1.0"
postcss-selector-parser "^6.0.5"
-postcss-minify-font-values@^5.0.4:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.0.4.tgz#627d824406b0712243221891f40a44fffe1467fd"
- integrity sha512-RN6q3tyuEesvyCYYFCRGJ41J1XFvgV+dvYGHr0CeHv8F00yILlN8Slf4t8XW4IghlfZYCeyRrANO6HpJ948ieA==
+postcss-minify-font-values@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b"
+ integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==
dependencies:
postcss-value-parser "^4.2.0"
-postcss-minify-gradients@^5.0.6:
- version "5.0.6"
- resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.0.6.tgz#b07cef51a93f075e94053fd972ff1cba2eaf6503"
- integrity sha512-E/dT6oVxB9nLGUTiY/rG5dX9taugv9cbLNTFad3dKxOO+BQg25Q/xo2z2ddG+ZB1CbkZYaVwx5blY8VC7R/43A==
+postcss-minify-gradients@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c"
+ integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==
dependencies:
colord "^2.9.1"
- cssnano-utils "^3.0.2"
+ cssnano-utils "^3.1.0"
postcss-value-parser "^4.2.0"
-postcss-minify-params@^5.0.5:
- version "5.0.5"
- resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.0.5.tgz#86cb624358cd45c21946f8c317893f0449396646"
- integrity sha512-YBNuq3Rz5LfLFNHb9wrvm6t859b8qIqfXsWeK7wROm3jSKNpO1Y5e8cOyBv6Acji15TgSrAwb3JkVNCqNyLvBg==
+postcss-minify-params@^5.1.4:
+ version "5.1.4"
+ resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352"
+ integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==
dependencies:
- browserslist "^4.16.6"
- cssnano-utils "^3.0.2"
+ browserslist "^4.21.4"
+ cssnano-utils "^3.1.0"
postcss-value-parser "^4.2.0"
-postcss-minify-selectors@^5.1.3:
- version "5.1.3"
- resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.1.3.tgz#6ac12d52aa661fd509469d87ab2cebb0a1e3a1b5"
- integrity sha512-9RJfTiQEKA/kZhMaEXND893nBqmYQ8qYa/G+uPdVnXF6D/FzpfI6kwBtWEcHx5FqDbA79O9n6fQJfrIj6M8jvQ==
+postcss-minify-selectors@^5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6"
+ integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==
dependencies:
postcss-selector-parser "^6.0.5"
-postcss-nested@^6.0.1:
+postcss-nested@^6.2.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131"
integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==
@@ -8808,96 +8969,96 @@ postcss-nesting@^10.0.3:
"@csstools/selector-specificity" "^2.0.0"
postcss-selector-parser "^6.0.10"
-postcss-normalize-charset@^5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.0.3.tgz#719fb9f9ca9835fcbd4fed8d6e0d72a79e7b5472"
- integrity sha512-iKEplDBco9EfH7sx4ut7R2r/dwTnUqyfACf62Unc9UiyFuI7uUqZZtY+u+qp7g8Qszl/U28HIfcsI3pEABWFfA==
+postcss-normalize-charset@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed"
+ integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==
-postcss-normalize-display-values@^5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.3.tgz#94cc82e20c51cc4ffba6b36e9618adc1e50db8c1"
- integrity sha512-FIV5FY/qs4Ja32jiDb5mVj5iWBlS3N8tFcw2yg98+8MkRgyhtnBgSC0lxU+16AMHbjX5fbSJgw5AXLMolonuRQ==
+postcss-normalize-display-values@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8"
+ integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==
dependencies:
postcss-value-parser "^4.2.0"
-postcss-normalize-positions@^5.0.4:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.0.4.tgz#4001f38c99675437b83277836fb4291887fcc6cc"
- integrity sha512-qynirjBX0Lc73ROomZE3lzzmXXTu48/QiEzKgMeqh28+MfuHLsuqC9po4kj84igZqqFGovz8F8hf44hA3dPYmQ==
+postcss-normalize-positions@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92"
+ integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==
dependencies:
postcss-value-parser "^4.2.0"
-postcss-normalize-repeat-style@^5.0.4:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.4.tgz#d005adf9ee45fae78b673031a376c0c871315145"
- integrity sha512-Innt+wctD7YpfeDR7r5Ik6krdyppyAg2HBRpX88fo5AYzC1Ut/l3xaxACG0KsbX49cO2n5EB13clPwuYVt8cMA==
+postcss-normalize-repeat-style@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2"
+ integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==
dependencies:
postcss-value-parser "^4.2.0"
-postcss-normalize-string@^5.0.4:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.0.4.tgz#b5e00a07597e7aa8a871817bfeac2bfaa59c3333"
- integrity sha512-Dfk42l0+A1CDnVpgE606ENvdmksttLynEqTQf5FL3XGQOyqxjbo25+pglCUvziicTxjtI2NLUR6KkxyUWEVubQ==
+postcss-normalize-string@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228"
+ integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==
dependencies:
postcss-value-parser "^4.2.0"
-postcss-normalize-timing-functions@^5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.3.tgz#47210227bfcba5e52650d7a18654337090de7072"
- integrity sha512-QRfjvFh11moN4PYnJ7hia4uJXeFotyK3t2jjg8lM9mswleGsNw2Lm3I5wO+l4k1FzK96EFwEVn8X8Ojrp2gP4g==
+postcss-normalize-timing-functions@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb"
+ integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==
dependencies:
postcss-value-parser "^4.2.0"
-postcss-normalize-unicode@^5.0.4:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.4.tgz#02866096937005cdb2c17116c690f29505a1623d"
- integrity sha512-W79Regn+a+eXTzB+oV/8XJ33s3pDyFTND2yDuUCo0Xa3QSy1HtNIfRVPXNubHxjhlqmMFADr3FSCHT84ITW3ig==
+postcss-normalize-unicode@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030"
+ integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==
dependencies:
- browserslist "^4.16.6"
+ browserslist "^4.21.4"
postcss-value-parser "^4.2.0"
-postcss-normalize-url@^5.0.5:
- version "5.0.5"
- resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.0.5.tgz#c39efc12ff119f6f45f0b4f516902b12c8080e3a"
- integrity sha512-Ws3tX+PcekYlXh+ycAt0wyzqGthkvVtZ9SZLutMVvHARxcpu4o7vvXcNoiNKyjKuWecnjS6HDI3fjBuDr5MQxQ==
+postcss-normalize-url@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc"
+ integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==
dependencies:
normalize-url "^6.0.1"
postcss-value-parser "^4.2.0"
-postcss-normalize-whitespace@^5.0.4:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.4.tgz#1d477e7da23fecef91fc4e37d462272c7b55c5ca"
- integrity sha512-wsnuHolYZjMwWZJoTC9jeI2AcjA67v4UuidDrPN9RnX8KIZfE+r2Nd6XZRwHVwUiHmRvKQtxiqo64K+h8/imaw==
+postcss-normalize-whitespace@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa"
+ integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==
dependencies:
postcss-value-parser "^4.2.0"
-postcss-ordered-values@^5.0.5:
- version "5.0.5"
- resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.0.5.tgz#e878af822a130c3f3709737e24cb815ca7c6d040"
- integrity sha512-mfY7lXpq+8bDEHfP+muqibDPhZ5eP9zgBEF9XRvoQgXcQe2Db3G1wcvjbnfjXG6wYsl+0UIjikqq4ym1V2jGMQ==
+postcss-ordered-values@^5.1.3:
+ version "5.1.3"
+ resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38"
+ integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==
dependencies:
- cssnano-utils "^3.0.2"
+ cssnano-utils "^3.1.0"
postcss-value-parser "^4.2.0"
-postcss-reduce-initial@^5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.0.3.tgz#68891594defd648253703bbd8f1093162f19568d"
- integrity sha512-c88TkSnQ/Dnwgb4OZbKPOBbCaauwEjbECP5uAuFPOzQ+XdjNjRH7SG0dteXrpp1LlIFEKK76iUGgmw2V0xeieA==
+postcss-reduce-initial@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6"
+ integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==
dependencies:
- browserslist "^4.16.6"
+ browserslist "^4.21.4"
caniuse-api "^3.0.0"
-postcss-reduce-transforms@^5.0.4:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.4.tgz#717e72d30befe857f7d2784dba10eb1157863712"
- integrity sha512-VIJB9SFSaL8B/B7AXb7KHL6/GNNbbCHslgdzS9UDfBZYIA2nx8NLY7iD/BXFSO/1sRUILzBTfHCoW5inP37C5g==
+postcss-reduce-transforms@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9"
+ integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==
dependencies:
postcss-value-parser "^4.2.0"
postcss-reporter@^7.0.0:
- version "7.0.5"
- resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-7.0.5.tgz#e55bd0fdf8d17e4f25fb55e9143fcd79349a2ceb"
- integrity sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-7.1.0.tgz#5ec476d224e2fe25a054e3c66d9b2901d4fab422"
+ integrity sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==
dependencies:
picocolors "^1.0.0"
thenby "^1.3.4"
@@ -8907,17 +9068,9 @@ postcss-reuse@^2.2.0:
resolved "https://registry.yarnpkg.com/postcss-reuse/-/postcss-reuse-2.2.0.tgz#50fd1bb2a06dae21740505519102614e7d570aa4"
integrity sha512-1o2bWK0e4CHr4IPAdqG5aow9EgVmrXYGIbzB2UWX8jcSyPnoocbvnCOJh/RzLtP7UzRBV6K3PurKzAYoNuPcjg==
dependencies:
- css-selector-tokenizer "0.8.x"
-
-postcss-selector-parser@^6.0.10:
- version "6.0.13"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b"
- integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==
- dependencies:
- cssesc "^3.0.0"
- util-deprecate "^1.0.2"
+ css-selector-tokenizer "0.8.x"
-postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.1.1:
+postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9, postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2:
version "6.1.2"
resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de"
integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==
@@ -8925,26 +9078,18 @@ postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.1.1:
cssesc "^3.0.0"
util-deprecate "^1.0.2"
-postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9:
- version "6.0.9"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f"
- integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==
- dependencies:
- cssesc "^3.0.0"
- util-deprecate "^1.0.2"
-
-postcss-svgo@^5.0.4:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.0.4.tgz#cfa8682f47b88f7cd75108ec499e133b43102abf"
- integrity sha512-yDKHvULbnZtIrRqhZoA+rxreWpee28JSRH/gy9727u0UCgtpv1M/9WEWY3xySlFa0zQJcqf6oCBJPR5NwkmYpg==
+postcss-svgo@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d"
+ integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==
dependencies:
postcss-value-parser "^4.2.0"
svgo "^2.7.0"
-postcss-unique-selectors@^5.0.4:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.0.4.tgz#08e188126b634ddfa615fb1d6c262bafdd64826e"
- integrity sha512-5ampwoSDJCxDPoANBIlMgoBcYUHnhaiuLYJR5pj1DLnYQvMRVyFuTA5C3Bvt+aHtiqWpJkD/lXT50Vo1D0ZsAQ==
+postcss-unique-selectors@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6"
+ integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==
dependencies:
postcss-selector-parser "^6.0.5"
@@ -8961,54 +9106,36 @@ postcss@^7.0.1:
picocolors "^0.2.1"
source-map "^0.6.1"
-postcss@^8.4.23:
- version "8.4.47"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365"
- integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==
+postcss@^8.4.47, postcss@latest:
+ version "8.4.49"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19"
+ integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==
dependencies:
nanoid "^3.3.7"
- picocolors "^1.1.0"
+ picocolors "^1.1.1"
source-map-js "^1.2.1"
-postcss@^8.4.5:
- version "8.4.29"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.29.tgz#33bc121cf3b3688d4ddef50be869b2a54185a1dd"
- integrity sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==
- dependencies:
- nanoid "^3.3.6"
- picocolors "^1.0.0"
- source-map-js "^1.0.2"
-
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
-prelude-ls@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
- integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
-
prepend-http@^1.0.1:
version "1.0.4"
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
- integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
+ integrity sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==
-prettier@>=1.10, prettier@^2.0.5:
- version "2.5.1"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a"
- integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==
+prettier@>=1.10:
+ version "3.4.2"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f"
+ integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==
-pretty-format@^27.0.0, pretty-format@^27.4.6:
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.4.6.tgz#1b784d2f53c68db31797b2348fa39b49e31846b7"
- integrity sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g==
- dependencies:
- ansi-regex "^5.0.1"
- ansi-styles "^5.0.0"
- react-is "^17.0.1"
+prettier@^2.0.5:
+ version "2.8.8"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da"
+ integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
-pretty-format@^27.0.2:
+pretty-format@^27.0.2, pretty-format@^27.5.1:
version "27.5.1"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e"
integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==
@@ -9017,10 +9144,19 @@ pretty-format@^27.0.2:
ansi-styles "^5.0.0"
react-is "^17.0.1"
+pretty-format@^29.0.0, pretty-format@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812"
+ integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==
+ dependencies:
+ "@jest/schemas" "^29.6.3"
+ ansi-styles "^5.0.0"
+ react-is "^18.0.0"
+
pretty-hrtime@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
- integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=
+ integrity sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==
pretty-quick@^2.0.1:
version "2.0.2"
@@ -9042,7 +9178,7 @@ process-nextick-args@~2.0.0:
process@^0.11.10:
version "0.11.10"
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
- integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
+ integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
progress@^2.0.0:
version "2.0.3"
@@ -9052,20 +9188,20 @@ progress@^2.0.0:
promise-inflight@^1.0.1, promise-inflight@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
- integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
+ integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==
promise-retry@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d"
- integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=
+ integrity sha512-StEy2osPr28o17bIW776GtwO6+Q+M9zPiZkYfosciUUMYqjhU/ffwRAH0zN2+uvGyUsn8/YICIHRzLbPacpZGw==
dependencies:
err-code "^1.0.0"
retry "^0.10.0"
promise@^8.1.0:
- version "8.1.0"
- resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e"
- integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a"
+ integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==
dependencies:
asap "~2.0.6"
@@ -9080,11 +9216,11 @@ prompts@^2.0.1:
promzard@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee"
- integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=
+ integrity sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw==
dependencies:
read "1"
-prop-types@^15.5.0, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2:
+prop-types@^15.5.0, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1:
version "15.8.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
@@ -9096,7 +9232,7 @@ prop-types@^15.5.0, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2:
proto-list@~1.2.1:
version "1.2.4"
resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
- integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
+ integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==
protoduck@^5.0.1:
version "5.0.1"
@@ -9108,17 +9244,19 @@ protoduck@^5.0.1:
prr@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
- integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
+ integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==
pseudomap@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
- integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
+ integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==
psl@^1.1.28, psl@^1.1.33:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
- integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+ version "1.15.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6"
+ integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==
+ dependencies:
+ punycode "^2.3.1"
pump@^2.0.0:
version "2.0.1"
@@ -9129,9 +9267,9 @@ pump@^2.0.0:
once "^1.3.1"
pump@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
- integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8"
+ integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==
dependencies:
end-of-stream "^1.1.0"
once "^1.3.1"
@@ -9145,10 +9283,10 @@ pumpify@^1.3.3:
inherits "^2.0.3"
pump "^2.0.0"
-punycode@^2.1.0, punycode@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
- integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
qrcode-terminal@^0.12.0:
version "0.12.0"
@@ -9156,18 +9294,18 @@ qrcode-terminal@^0.12.0:
integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==
qs@^6.9.6:
- version "6.10.3"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e"
- integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==
+ version "6.13.1"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.1.tgz#3ce5fc72bd3a8171b85c99b93c65dd20b7d1b16e"
+ integrity sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==
dependencies:
- side-channel "^1.0.4"
+ side-channel "^1.0.6"
qs@~6.5.2:
version "6.5.3"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad"
integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==
-query-string@^6.8.2:
+query-string@^6.14.1:
version "6.14.1"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a"
integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==
@@ -9177,12 +9315,17 @@ query-string@^6.8.2:
split-on-first "^1.0.0"
strict-uri-encode "^2.0.0"
+querystringify@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
+ integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
+
queue-microtask@^1.2.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
-qw@~1.0.1:
+qw@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/qw/-/qw-1.0.2.tgz#0c31a6f810320a91c58b05198679427103b03c4a"
integrity sha512-1PhZ/iLKwlVNq45dnerTMKFjMof49uqli7/0QsvPNbX5OJ3IZ8msa9lUpvPheVdP+IYYPrf6cOaVil7S35joVA==
@@ -9194,6 +9337,11 @@ raf@^3.4.1:
dependencies:
performance-now "^2.1.0"
+"range-analyzer@>= 0.1.1-alpha.1":
+ version "0.1.1-alpha.2"
+ resolved "https://registry.yarnpkg.com/range-analyzer/-/range-analyzer-0.1.1-alpha.2.tgz#2e8bf334fe3f53391a5e69cd157a3af7af85ef58"
+ integrity sha512-Ad9J4t3zljH/DHNSDthAFyQdd5DniHTaqES/oTwAFB7prV7E4u01et6WYCpqbJSmUDC05XlMMR2ycO84Hi1IvA==
+
rc@^1.0.1, rc@^1.1.6:
version "1.2.8"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
@@ -9224,13 +9372,13 @@ react-async-script@^1.1.1:
hoist-non-react-statics "^3.3.0"
prop-types "^15.5.0"
-react-dom@^18.2.0:
- version "18.2.0"
- resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
- integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
+react-dom@^18.3.1:
+ version "18.3.1"
+ resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4"
+ integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==
dependencies:
loose-envify "^1.1.0"
- scheduler "^0.23.0"
+ scheduler "^0.23.2"
react-error-boundary@^3.1.0:
version "3.1.4"
@@ -9240,9 +9388,9 @@ react-error-boundary@^3.1.0:
"@babel/runtime" "^7.12.5"
react-fast-compare@^3.0.1, react-fast-compare@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb"
- integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49"
+ integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==
react-google-recaptcha@^2.1.0:
version "2.1.0"
@@ -9270,15 +9418,20 @@ react-is@^17.0.1:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
+react-is@^18.0.0:
+ version "18.3.1"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e"
+ integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
+
react-lifecycles-compat@^3.0.0:
version "3.0.4"
resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
react-modal@^3.16.1:
- version "3.16.1"
- resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.16.1.tgz#34018528fc206561b1a5467fc3beeaddafb39b2b"
- integrity sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==
+ version "3.16.3"
+ resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.16.3.tgz#c412d41915782e3c261253435d01468e2439b11b"
+ integrity sha512-yCYRJB5YkeQDQlTt17WGAgFJ7jr2QYcWa1SHqZ3PluDmnKJ/7+tVU+E6uKyZ0nODaeEj+xCpK4LcSnKXLMC0Nw==
dependencies:
exenv "^1.2.0"
prop-types "^15.7.2"
@@ -9301,9 +9454,9 @@ react-query-devtools@^2.6.3:
match-sorter "^4.1.0"
react-select@^5.7.7:
- version "5.7.7"
- resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.7.7.tgz#dbade9dbf711ef2a181970c10f8ab319ac37fbd0"
- integrity sha512-HhashZZJDRlfF/AKj0a0Lnfs3sRdw/46VJIRd8IbB9/Ovr74+ZIwkAdSBjSPXsFMG+u72c5xShqwLSKIJllzqw==
+ version "5.9.0"
+ resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.9.0.tgz#41325b7bfe8452a8d401b82fc4fb7d44a03e29c5"
+ integrity sha512-nwRKGanVHGjdccsnzhFte/PULziueZxGD8LL2WojON78Mvnq7LdAMEtu2frrwld1fr3geixg3iiMBIc/LLAZpw==
dependencies:
"@babel/runtime" "^7.12.0"
"@emotion/cache" "^11.4.0"
@@ -9313,15 +9466,14 @@ react-select@^5.7.7:
memoize-one "^6.0.0"
prop-types "^15.6.0"
react-transition-group "^4.3.0"
- use-isomorphic-layout-effect "^1.1.2"
+ use-isomorphic-layout-effect "^1.2.0"
react-simplemde-editor@^5:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/react-simplemde-editor/-/react-simplemde-editor-5.0.2.tgz#0e18cdc8f1e15824c595e6328d6808fcbceb75ce"
- integrity sha512-yaqZSaUBf6B0kQY0mH8WP/nHnvJFz48aO8cMYCL1e/AFiuB/H8UDuyZFP9/exOtwVpaG373HYR1YedKMtCh+Kw==
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/react-simplemde-editor/-/react-simplemde-editor-5.2.0.tgz#7a4c8b97e4989cb129b45ba140145d71bdc0684e"
+ integrity sha512-GkTg1MlQHVK2Rks++7sjuQr/GVS/xm6y+HchZ4GPBWrhcgLieh4CjK04GTKbsfYorSRYKa0n37rtNSJmOzEDkQ==
dependencies:
- "@types/codemirror" "0.0.109"
- "@types/marked" "^2.0.2"
+ "@types/codemirror" "~5.60.5"
react-transition-group@^4.3.0:
version "4.4.5"
@@ -9333,10 +9485,10 @@ react-transition-group@^4.3.0:
loose-envify "^1.4.0"
prop-types "^15.6.2"
-react@^18.2.0:
- version "18.2.0"
- resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
- integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
+react@^18.3.1:
+ version "18.3.1"
+ resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891"
+ integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==
dependencies:
loose-envify "^1.1.0"
@@ -9357,7 +9509,7 @@ read-cmd-shim@^1.0.1, read-cmd-shim@^1.0.5:
read-installed@~4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067"
- integrity sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=
+ integrity sha512-O03wg/IYuV/VtnK2h/KXEt9VIbMUFbk3ERG0Iu4FhLZw0EP0T9znqrYDGn6ncbEsXUFaUjiVAWXHzxwt3lhRPQ==
dependencies:
debuglog "^1.0.1"
read-package-json "^2.0.0"
@@ -9368,7 +9520,7 @@ read-installed@~4.0.3:
optionalDependencies:
graceful-fs "^4.1.2"
-"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.13, read-package-json@^2.1.1:
+"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.13, read-package-json@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a"
integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==
@@ -9387,34 +9539,17 @@ read-package-tree@^5.3.1:
readdir-scoped-modules "^1.0.0"
util-promisify "^2.1.0"
-read-pkg-up@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
- integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=
- dependencies:
- find-up "^2.0.0"
- read-pkg "^2.0.0"
-
-read-pkg@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
- integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=
- dependencies:
- load-json-file "^2.0.0"
- normalize-package-data "^2.3.2"
- path-type "^2.0.0"
-
read@1, read@~1.0.1, read@~1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
- integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=
+ integrity sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==
dependencies:
mute-stream "~0.0.4"
"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.6, readable-stream@~2.3.6:
- version "2.3.7"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
- integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
+ integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.3"
@@ -9425,9 +9560,9 @@ read@1, read@~1.0.1, read@~1.0.7:
util-deprecate "~1.0.1"
readable-stream@^3.6.0:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
- integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
+ integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
dependencies:
inherits "^2.0.3"
string_decoder "^1.1.1"
@@ -9436,7 +9571,7 @@ readable-stream@^3.6.0:
readable-stream@~1.1.10:
version "1.1.14"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
- integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
+ integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.1"
@@ -9473,10 +9608,24 @@ redent@^3.0.0:
indent-string "^4.0.0"
strip-indent "^3.0.0"
-regenerate-unicode-properties@^9.0.0:
- version "9.0.0"
- resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326"
- integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==
+reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.8, reflect.getprototypeof@^1.0.9:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz#c905f3386008de95a62315f3ea8630404be19e2f"
+ integrity sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==
+ dependencies:
+ call-bind "^1.0.8"
+ define-properties "^1.2.1"
+ dunder-proto "^1.0.1"
+ es-abstract "^1.23.6"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.6"
+ gopd "^1.2.0"
+ which-builtin-type "^1.2.1"
+
+regenerate-unicode-properties@^10.2.0:
+ version "10.2.0"
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0"
+ integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==
dependencies:
regenerate "^1.4.2"
@@ -9485,20 +9634,20 @@ regenerate@^1.4.2:
resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
-regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7:
- version "0.13.9"
- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
- integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
+regenerator-runtime@^0.13.7:
+ version "0.13.11"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
+ integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
regenerator-runtime@^0.14.0:
- version "0.14.0"
- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45"
- integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==
+ version "0.14.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
+ integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
-regenerator-transform@^0.14.2:
- version "0.14.5"
- resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4"
- integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==
+regenerator-transform@^0.15.2:
+ version "0.15.2"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4"
+ integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==
dependencies:
"@babel/runtime" "^7.8.4"
@@ -9510,39 +9659,32 @@ regex-not@^1.0.0, regex-not@^1.0.2:
extend-shallow "^3.0.2"
safe-regex "^1.1.0"
-regexp.prototype.flags@^1.3.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307"
- integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==
- dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.3"
-
-regexp.prototype.flags@^1.5.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb"
- integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==
+regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.3:
+ version "1.5.3"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42"
+ integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.2.0"
- functions-have-names "^1.2.3"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-errors "^1.3.0"
+ set-function-name "^2.0.2"
regexpp@^3.1.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
-regexpu-core@^4.7.1:
- version "4.8.0"
- resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0"
- integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==
+regexpu-core@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.2.0.tgz#0e5190d79e542bf294955dccabae04d3c7d53826"
+ integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==
dependencies:
regenerate "^1.4.2"
- regenerate-unicode-properties "^9.0.0"
- regjsgen "^0.5.2"
- regjsparser "^0.7.0"
+ regenerate-unicode-properties "^10.2.0"
+ regjsgen "^0.8.0"
+ regjsparser "^0.12.0"
unicode-match-property-ecmascript "^2.0.0"
- unicode-match-property-value-ecmascript "^2.0.0"
+ unicode-match-property-value-ecmascript "^2.1.0"
registry-auth-token@^3.0.1:
version "3.4.0"
@@ -9555,21 +9697,21 @@ registry-auth-token@^3.0.1:
registry-url@^3.0.3:
version "3.1.0"
resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942"
- integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI=
+ integrity sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==
dependencies:
rc "^1.0.1"
-regjsgen@^0.5.2:
- version "0.5.2"
- resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733"
- integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==
+regjsgen@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab"
+ integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==
-regjsparser@^0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968"
- integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==
+regjsparser@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.12.0.tgz#0e846df6c6530586429377de56e0475583b088dc"
+ integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==
dependencies:
- jsesc "~0.5.0"
+ jsesc "~3.0.2"
remove-accents@0.4.2:
version "0.4.2"
@@ -9579,7 +9721,7 @@ remove-accents@0.4.2:
remove-trailing-separator@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
- integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
+ integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==
repeat-element@^1.1.2:
version "1.1.4"
@@ -9589,9 +9731,9 @@ repeat-element@^1.1.2:
repeat-string@^1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
- integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+ integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==
-request@^2.88.0:
+request@^2.88.0, request@^2.88.2:
version "2.88.2"
resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
@@ -9620,23 +9762,23 @@ request@^2.88.0:
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
- integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
require-from-string@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
-require-main-filename@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
- integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
-
require-main-filename@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+requires-port@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+ integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
+
resolve-cwd@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
@@ -9657,39 +9799,31 @@ resolve-from@^5.0.0:
resolve-url@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
- integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+ integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==
resolve.exports@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9"
- integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999"
+ integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==
-resolve@^1.1.7, resolve@^1.22.2:
- version "1.22.8"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
- integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
+resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.8:
+ version "1.22.10"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39"
+ integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==
dependencies:
- is-core-module "^2.13.0"
+ is-core-module "^2.16.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
-resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0:
- version "1.22.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198"
- integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==
+resolve@^2.0.0-next.5:
+ version "2.0.0-next.5"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c"
+ integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==
dependencies:
- is-core-module "^2.8.1"
+ is-core-module "^2.13.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
-resolve@^2.0.0-next.3:
- version "2.0.0-next.3"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46"
- integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==
- dependencies:
- is-core-module "^2.2.0"
- path-parse "^1.0.6"
-
ret@~0.1.10:
version "0.1.15"
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
@@ -9698,12 +9832,12 @@ ret@~0.1.10:
retry@^0.10.0:
version "0.10.1"
resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4"
- integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=
+ integrity sha512-ZXUSQYTHdl3uS7IuCehYfMzKyIDBNoAuUblvy5oGO5UJSUTmStUUVPXbA9Qxd173Bgre53yCQczQuHgRWAdvJQ==
retry@^0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
- integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
+ integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==
reusify@^1.0.4:
version "1.0.4"
@@ -9744,10 +9878,21 @@ run-parallel@^1.1.9:
run-queue@^1.0.0, run-queue@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
- integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=
+ integrity sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==
dependencies:
aproba "^1.1.1"
+safe-array-concat@^1.1.2, safe-array-concat@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3"
+ integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.2"
+ get-intrinsic "^1.2.6"
+ has-symbols "^1.1.0"
+ isarray "^2.0.5"
+
safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
@@ -9758,10 +9903,27 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1:
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+safe-push-apply@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5"
+ integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==
+ dependencies:
+ es-errors "^1.3.0"
+ isarray "^2.0.5"
+
+safe-regex-test@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1"
+ integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ is-regex "^1.2.1"
+
safe-regex@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
- integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
+ integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==
dependencies:
ret "~0.1.10"
@@ -9792,46 +9954,61 @@ saxes@^5.0.1:
dependencies:
xmlchars "^2.2.0"
-scheduler@^0.23.0:
- version "0.23.0"
- resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe"
- integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
+scheduler@^0.23.2:
+ version "0.23.2"
+ resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3"
+ integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==
dependencies:
loose-envify "^1.1.0"
semver-diff@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
- integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=
+ integrity sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==
dependencies:
semver "^5.0.3"
"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.1:
- version "5.7.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
- integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
-
-semver@7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
- integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
+ version "5.7.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
+ integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
-semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
- version "6.3.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
- integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+semver@^6.3.0, semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
-semver@^7.2.1, semver@^7.3.2, semver@^7.3.5:
- version "7.3.5"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
- integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
- dependencies:
- lru-cache "^6.0.0"
+semver@^7.2.1, semver@^7.3.2, semver@^7.3.5, semver@^7.5.3:
+ version "7.6.3"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143"
+ integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
set-blocking@^2.0.0, set-blocking@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
- integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+ integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
+
+set-function-length@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449"
+ integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.2"
+
+set-function-name@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985"
+ integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ functions-have-names "^1.2.3"
+ has-property-descriptors "^1.0.2"
set-value@^2.0.0, set-value@^2.0.1:
version "2.0.1"
@@ -9853,7 +10030,7 @@ sha@^3.0.0:
shebang-command@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
- integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+ integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==
dependencies:
shebang-regex "^1.0.0"
@@ -9867,26 +10044,57 @@ shebang-command@^2.0.0:
shebang-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
- integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+ integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==
shebang-regex@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
-side-channel@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
- integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+side-channel-list@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad"
+ integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==
+ dependencies:
+ es-errors "^1.3.0"
+ object-inspect "^1.13.3"
+
+side-channel-map@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42"
+ integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==
dependencies:
- call-bind "^1.0.0"
- get-intrinsic "^1.0.2"
- object-inspect "^1.9.0"
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.5"
+ object-inspect "^1.13.3"
+
+side-channel-weakmap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea"
+ integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.5"
+ object-inspect "^1.13.3"
+ side-channel-map "^1.0.1"
+
+side-channel@^1.0.4, side-channel@^1.0.6, side-channel@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9"
+ integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==
+ dependencies:
+ es-errors "^1.3.0"
+ object-inspect "^1.13.3"
+ side-channel-list "^1.0.0"
+ side-channel-map "^1.0.1"
+ side-channel-weakmap "^1.0.2"
signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3:
- version "3.0.6"
- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af"
- integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
signal-exit@^4.0.1:
version "4.1.0"
@@ -9898,6 +10106,11 @@ sisteransi@^1.0.5:
resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
+slash@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
+ integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
+
slash@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
@@ -9920,7 +10133,7 @@ slice-ansi@^4.0.0:
slide@^1.1.6, slide@~1.1.3, slide@~1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
- integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=
+ integrity sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==
smart-buffer@^4.1.0:
version "4.2.0"
@@ -9976,17 +10189,17 @@ socks@~2.3.2:
sorted-object@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/sorted-object/-/sorted-object-2.0.1.tgz#7d631f4bd3a798a24af1dffcfbfe83337a5df5fc"
- integrity sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw=
+ integrity sha512-oKAAs26HeTu3qbawzUGCkTOBv/5MRrcuJyRWwbfEnWdpXnXsj+WEM3HTvarV73tMcf9uBEZNZoNDVRL62VLxzA==
sorted-union-stream@~2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/sorted-union-stream/-/sorted-union-stream-2.1.3.tgz#c7794c7e077880052ff71a8d4a2dbb4a9a638ac7"
- integrity sha1-x3lMfgd4gAUv9xqNSi27Sppjisc=
+ integrity sha512-RaKskQJZkmVREIwyAFho1RRU+sKjDdg51Crvxg2VxmIyiIrNhPNoJD/by5/pklWBXAZoO6LfAAGv8xd47p9TnQ==
dependencies:
from2 "^1.3.0"
stream-iterate "^1.1.0"
-source-map-js@^1.0.2, source-map-js@^1.2.1:
+source-map-js@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
@@ -10002,14 +10215,6 @@ source-map-resolve@^0.5.0:
source-map-url "^0.4.0"
urix "^0.1.0"
-source-map-resolve@^0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2"
- integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==
- dependencies:
- atob "^2.1.2"
- decode-uri-component "^0.2.0"
-
source-map-support@^0.5.6:
version "0.5.21"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
@@ -10023,10 +10228,10 @@ source-map-url@^0.4.0:
resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
-source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7:
+source-map@^0.5.6, source-map@^0.5.7:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
- integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+ integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
version "0.6.1"
@@ -10034,22 +10239,22 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
source-map@^0.7.3:
- version "0.7.3"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
- integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
+ version "0.7.4"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656"
+ integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==
spdx-correct@^3.0.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
- integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c"
+ integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==
dependencies:
spdx-expression-parse "^3.0.0"
spdx-license-ids "^3.0.0"
spdx-exceptions@^2.1.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
- integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66"
+ integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==
spdx-expression-parse@^3.0.0:
version "3.0.1"
@@ -10060,9 +10265,9 @@ spdx-expression-parse@^3.0.0:
spdx-license-ids "^3.0.0"
spdx-license-ids@^3.0.0:
- version "3.0.11"
- resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95"
- integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==
+ version "3.0.20"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89"
+ integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==
split-on-first@^1.0.0:
version "1.1.0"
@@ -10079,12 +10284,12 @@ split-string@^3.0.1, split-string@^3.0.2:
sprintf-js@~1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
- integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+ integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
sshpk@^1.7.0:
- version "1.17.0"
- resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5"
- integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==
+ version "1.18.0"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028"
+ integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==
dependencies:
asn1 "~0.2.3"
assert-plus "^1.0.0"
@@ -10109,28 +10314,28 @@ stable@^0.1.8:
integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
stack-generator@^2.0.3:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.5.tgz#fb00e5b4ee97de603e0773ea78ce944d81596c36"
- integrity sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q==
+ version "2.0.10"
+ resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.10.tgz#8ae171e985ed62287d4f1ed55a1633b3fb53bb4d"
+ integrity sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==
dependencies:
- stackframe "^1.1.1"
+ stackframe "^1.3.4"
stack-utils@^2.0.3:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5"
- integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f"
+ integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==
dependencies:
escape-string-regexp "^2.0.0"
-stackframe@^1.1.1:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303"
- integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==
+stackframe@^1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310"
+ integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==
static-extend@^0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
- integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
+ integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==
dependencies:
define-property "^0.2.5"
object-copy "^0.1.0"
@@ -10141,11 +10346,12 @@ statuses@^2.0.0:
integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
stop-iteration-iterator@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4"
- integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad"
+ integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==
dependencies:
- internal-slot "^1.0.4"
+ es-errors "^1.3.0"
+ internal-slot "^1.1.0"
stream-each@^1.1.0:
version "1.2.3"
@@ -10158,20 +10364,20 @@ stream-each@^1.1.0:
stream-iterate@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/stream-iterate/-/stream-iterate-1.2.0.tgz#2bd7c77296c1702a46488b8ad41f79865eecd4e1"
- integrity sha1-K9fHcpbBcCpGSIuK1B95hl7s1OE=
+ integrity sha512-QVfGkdBQ8NzsSIiL3rV6AoFFWwMvlg1qpTwVQaMGY5XYThDUuNM4hYSzi8pbKlimTsWyQdaWRZE+jwlPsMiiZw==
dependencies:
readable-stream "^2.1.5"
stream-shift "^1.0.0"
stream-shift@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
- integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b"
+ integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==
strict-uri-encode@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
- integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY=
+ integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==
string-length@^4.0.1:
version "4.0.2"
@@ -10181,6 +10387,11 @@ string-length@^4.0.1:
char-regex "^1.0.2"
strip-ansi "^6.0.0"
+string-similarity-js@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/string-similarity-js/-/string-similarity-js-2.1.4.tgz#73716330691946f2ebc435859aba8327afd31307"
+ integrity sha512-uApODZNjCHGYROzDSAdCmAHf60L/pMDHnP/yk6TAbvGg7JSPZlSto/ceCI7hZEqzc53/juU2aOJFkM2yUVTMTA==
+
"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
@@ -10193,7 +10404,7 @@ string-length@^4.0.1:
string-width@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
- integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
+ integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==
dependencies:
code-point-at "^1.0.0"
is-fullwidth-code-point "^1.0.0"
@@ -10225,35 +10436,64 @@ string-width@^5.0.1, string-width@^5.1.2:
emoji-regex "^9.2.2"
strip-ansi "^7.0.1"
-string.prototype.matchall@^4.0.6:
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa"
- integrity sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==
- dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.3"
- es-abstract "^1.19.1"
- get-intrinsic "^1.1.1"
- has-symbols "^1.0.2"
- internal-slot "^1.0.3"
- regexp.prototype.flags "^1.3.1"
- side-channel "^1.0.4"
-
-string.prototype.trimend@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80"
- integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==
+string.prototype.matchall@^4.0.12:
+ version "4.0.12"
+ resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz#6c88740e49ad4956b1332a911e949583a275d4c0"
+ integrity sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.3"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.6"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ get-intrinsic "^1.2.6"
+ gopd "^1.2.0"
+ has-symbols "^1.1.0"
+ internal-slot "^1.1.0"
+ regexp.prototype.flags "^1.5.3"
+ set-function-name "^2.0.2"
+ side-channel "^1.1.0"
+
+string.prototype.repeat@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a"
+ integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==
dependencies:
- call-bind "^1.0.2"
define-properties "^1.1.3"
+ es-abstract "^1.17.5"
-string.prototype.trimstart@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed"
- integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==
+string.prototype.trim@^1.2.10:
+ version "1.2.10"
+ resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81"
+ integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.2"
+ define-data-property "^1.1.4"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.5"
+ es-object-atoms "^1.0.0"
+ has-property-descriptors "^1.0.2"
+
+string.prototype.trimend@^1.0.9:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942"
+ integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.2"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+
+string.prototype.trimstart@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde"
+ integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.3"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
string_decoder@^1.1.1:
version "1.3.0"
@@ -10265,7 +10505,7 @@ string_decoder@^1.1.1:
string_decoder@~0.10.x:
version "0.10.31"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
- integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
+ integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==
string_decoder@~1.1.1:
version "1.1.1"
@@ -10289,14 +10529,14 @@ stringify-package@^1.0.0, stringify-package@^1.0.1:
strip-ansi@^3.0.0, strip-ansi@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
- integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==
dependencies:
ansi-regex "^2.0.0"
strip-ansi@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
- integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
+ integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==
dependencies:
ansi-regex "^3.0.0"
@@ -10314,11 +10554,6 @@ strip-ansi@^7.0.1:
dependencies:
ansi-regex "^6.0.1"
-strip-bom@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
- integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
-
strip-bom@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
@@ -10327,7 +10562,7 @@ strip-bom@^4.0.0:
strip-eof@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
- integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
+ integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==
strip-final-newline@^2.0.0:
version "2.0.0"
@@ -10349,19 +10584,19 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
- integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+ integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
style-mod@^4.0.0, style-mod@^4.1.0:
version "4.1.2"
resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.1.2.tgz#ca238a1ad4786520f7515a8539d5a63691d7bf67"
integrity sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==
-stylehacks@^5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.0.3.tgz#2ef3de567bfa2be716d29a93bf3d208c133e8d04"
- integrity sha512-ENcUdpf4yO0E1rubu8rkxI+JGQk4CgjchynZ4bDBJDfqdy+uhTRSWb8/F3Jtu+Bw5MW45Po3/aQGeIyyxgQtxg==
+stylehacks@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9"
+ integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==
dependencies:
- browserslist "^4.16.6"
+ browserslist "^4.21.4"
postcss-selector-parser "^6.0.4"
stylis@4.2.0:
@@ -10369,7 +10604,7 @@ stylis@4.2.0:
resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51"
integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==
-sucrase@^3.32.0:
+sucrase@^3.35.0:
version "3.35.0"
resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263"
integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==
@@ -10404,9 +10639,9 @@ supports-color@^8.0.0:
has-flag "^4.0.0"
supports-hyperlinks@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb"
- integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624"
+ integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==
dependencies:
has-flag "^4.0.0"
supports-color "^7.0.0"
@@ -10435,9 +10670,9 @@ symbol-tree@^3.2.4:
integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
table@^6.0.9:
- version "6.8.0"
- resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca"
- integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==
+ version "6.9.0"
+ resolved "https://registry.yarnpkg.com/table/-/table-6.9.0.tgz#50040afa6264141c7566b3b81d4d82c47a8668f5"
+ integrity sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==
dependencies:
ajv "^8.0.1"
lodash.truncate "^4.4.2"
@@ -10445,33 +10680,33 @@ table@^6.0.9:
string-width "^4.2.3"
strip-ansi "^6.0.1"
-tailwindcss@^3.4.14:
- version "3.4.14"
- resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.14.tgz#6dd23a7f54ec197b19159e91e3bb1e55e7aa73ac"
- integrity sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==
+tailwindcss@latest:
+ version "3.4.17"
+ resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.17.tgz#ae8406c0f96696a631c790768ff319d46d5e5a63"
+ integrity sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==
dependencies:
"@alloc/quick-lru" "^5.2.0"
arg "^5.0.2"
- chokidar "^3.5.3"
+ chokidar "^3.6.0"
didyoumean "^1.2.2"
dlv "^1.1.3"
- fast-glob "^3.3.0"
+ fast-glob "^3.3.2"
glob-parent "^6.0.2"
is-glob "^4.0.3"
- jiti "^1.21.0"
- lilconfig "^2.1.0"
- micromatch "^4.0.5"
+ jiti "^1.21.6"
+ lilconfig "^3.1.3"
+ micromatch "^4.0.8"
normalize-path "^3.0.0"
object-hash "^3.0.0"
- picocolors "^1.0.0"
- postcss "^8.4.23"
+ picocolors "^1.1.1"
+ postcss "^8.4.47"
postcss-import "^15.1.0"
postcss-js "^4.0.1"
- postcss-load-config "^4.0.1"
- postcss-nested "^6.0.1"
- postcss-selector-parser "^6.0.11"
- resolve "^1.22.2"
- sucrase "^3.32.0"
+ postcss-load-config "^4.0.2"
+ postcss-nested "^6.2.0"
+ postcss-selector-parser "^6.1.2"
+ resolve "^1.22.8"
+ sucrase "^3.35.0"
tar@^4.4.10, tar@^4.4.12, tar@^4.4.19:
version "4.4.19"
@@ -10489,7 +10724,7 @@ tar@^4.4.10, tar@^4.4.12, tar@^4.4.19:
term-size@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
- integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=
+ integrity sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==
dependencies:
execa "^0.7.0"
@@ -10513,7 +10748,7 @@ test-exclude@^6.0.0:
text-table@^0.2.0, text-table@~0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
- integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
+ integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
thenby@^1.3.4:
version "1.3.4"
@@ -10535,9 +10770,9 @@ thenify-all@^1.0.0:
any-promise "^1.0.0"
throat@^6.0.1:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375"
- integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe"
+ integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==
through2@^2.0.0:
version "2.0.5"
@@ -10550,17 +10785,12 @@ through2@^2.0.0:
"through@>=2.2.7 <3":
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
- integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+ integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
timed-out@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
- integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
-
-timsort@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
- integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
+ integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==
tiny-relative-date@^1.3.0:
version "1.3.0"
@@ -10579,22 +10809,17 @@ tmpl@1.0.5:
resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==
-to-fast-properties@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
- integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
-
to-object-path@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
- integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
+ integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==
dependencies:
kind-of "^3.0.2"
to-regex-range@^2.1.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
- integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
+ integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==
dependencies:
is-number "^3.0.0"
repeat-string "^1.6.1"
@@ -10619,16 +10844,17 @@ to-regex@^3.0.1, to-regex@^3.0.2:
toggle-selection@^1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
- integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI=
+ integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==
tough-cookie@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4"
- integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==
+ version "4.1.4"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36"
+ integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==
dependencies:
psl "^1.1.33"
punycode "^2.1.1"
- universalify "^0.1.2"
+ universalify "^0.2.0"
+ url-parse "^1.5.3"
tough-cookie@~2.5.0:
version "2.5.0"
@@ -10648,7 +10874,7 @@ tr46@^2.1.0:
tr46@~0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
- integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=
+ integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
ts-interface-checker@^0.1.9:
version "0.1.13"
@@ -10660,6 +10886,11 @@ tslib@^1.8.1:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+tslib@^2.8.1:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
+ integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
+
tsutils@^3.21.0:
version "3.21.0"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
@@ -10670,14 +10901,14 @@ tsutils@^3.21.0:
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
- integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
+ integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==
dependencies:
safe-buffer "^5.0.1"
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
version "0.14.5"
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
- integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
+ integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==
type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0"
@@ -10686,13 +10917,6 @@ type-check@^0.4.0, type-check@~0.4.0:
dependencies:
prelude-ls "^1.2.1"
-type-check@~0.3.2:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
- integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
- dependencies:
- prelude-ls "~1.1.2"
-
type-detect@4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
@@ -10708,6 +10932,51 @@ type-fest@^0.21.3:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+typed-array-buffer@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536"
+ integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==
+ dependencies:
+ call-bound "^1.0.3"
+ es-errors "^1.3.0"
+ is-typed-array "^1.1.14"
+
+typed-array-byte-length@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce"
+ integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==
+ dependencies:
+ call-bind "^1.0.8"
+ for-each "^0.3.3"
+ gopd "^1.2.0"
+ has-proto "^1.2.0"
+ is-typed-array "^1.1.14"
+
+typed-array-byte-offset@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355"
+ integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==
+ dependencies:
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.8"
+ for-each "^0.3.3"
+ gopd "^1.2.0"
+ has-proto "^1.2.0"
+ is-typed-array "^1.1.15"
+ reflect.getprototypeof "^1.0.9"
+
+typed-array-length@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d"
+ integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==
+ dependencies:
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ is-typed-array "^1.1.13"
+ possible-typed-array-names "^1.0.0"
+ reflect.getprototypeof "^1.0.6"
+
typedarray-to-buffer@^3.1.5:
version "3.1.5"
resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
@@ -10718,52 +10987,70 @@ typedarray-to-buffer@^3.1.5:
typedarray@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
- integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+ integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
typescript@^4.0.3:
- version "4.5.5"
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3"
- integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==
+ version "4.9.5"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a"
+ integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
+
+typewriter-effect@^2.21.0:
+ version "2.21.0"
+ resolved "https://registry.yarnpkg.com/typewriter-effect/-/typewriter-effect-2.21.0.tgz#7150f12fd2c188248ab2b2b031f77c0663d24c54"
+ integrity sha512-Y3VL1fuJpUBj0gS4OTXBLzy1gnYTYaBuVuuO99tGNyTkkub5CXi+b/hsV7Og9fp6HlhogOwWJwgq7iXI5sQlEg==
+ dependencies:
+ prop-types "^15.8.1"
+ raf "^3.4.1"
typo-js@*:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/typo-js/-/typo-js-1.2.1.tgz#334a0d8c3f6c56f2f1e15fdf6c31677793cbbe9b"
- integrity sha512-bTGLjbD3WqZDR3CgEFkyi9Q/SS2oM29ipXrWfDb4M74ea69QwKAECVceYpaBu0GfdnASMg9Qfl67ttB23nePHg==
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/typo-js/-/typo-js-1.2.5.tgz#0aa65e0be9b69036463a3827de8185b4144e3086"
+ integrity sha512-F45vFWdGX8xahIk/sOp79z2NJs8ETMYsmMChm9D5Hlx3+9j7VnCyQyvij5MOCrNY3NNe8noSyokRjQRfq+Bc7A==
ua-parser-js@^1.0.37:
- version "1.0.37"
- resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.37.tgz#b5dc7b163a5c1f0c510b08446aed4da92c46373f"
- integrity sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==
+ version "1.0.40"
+ resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.40.tgz#ac6aff4fd8ea3e794a6aa743ec9c2fc29e75b675"
+ integrity sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==
uid-number@0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
- integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=
+ integrity sha512-c461FXIljswCuscZn67xq9PpszkPT6RjheWFQTgCyabJrTUozElanb0YEqv2UGgk247YpcJkFBuSGNvBlpXM9w==
umask@^1.1.0, umask@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d"
- integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=
+ integrity sha512-lE/rxOhmiScJu9L6RTNVgB/zZbF+vGC0/p6D3xnkAePI2o0sMyFG966iR5Ki50OI/0mNi2yaRnxfLsPmEZF/JA==
-unbox-primitive@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
- integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==
+unbox-primitive@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2"
+ integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==
dependencies:
- function-bind "^1.1.1"
- has-bigints "^1.0.1"
- has-symbols "^1.0.2"
- which-boxed-primitive "^1.0.2"
+ call-bound "^1.0.3"
+ has-bigints "^1.0.2"
+ has-symbols "^1.1.0"
+ which-boxed-primitive "^1.1.1"
underscore@^1.8.3:
- version "1.13.2"
- resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.2.tgz#276cea1e8b9722a8dbed0100a407dda572125881"
- integrity sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==
+ version "1.13.7"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.7.tgz#970e33963af9a7dda228f17ebe8399e5fbe63a10"
+ integrity sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==
+
+undici-types@~5.26.4:
+ version "5.26.5"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
+ integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+
+undici-types@~6.20.0:
+ version "6.20.0"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433"
+ integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==
unicode-canonical-property-names-ecmascript@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
- integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2"
+ integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==
unicode-match-property-ecmascript@^2.0.0:
version "2.0.0"
@@ -10773,15 +11060,15 @@ unicode-match-property-ecmascript@^2.0.0:
unicode-canonical-property-names-ecmascript "^2.0.0"
unicode-property-aliases-ecmascript "^2.0.0"
-unicode-match-property-value-ecmascript@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714"
- integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==
+unicode-match-property-value-ecmascript@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz#a0401aee72714598f739b68b104e4fe3a0cb3c71"
+ integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==
unicode-property-aliases-ecmascript@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8"
- integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd"
+ integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==
union-value@^1.0.0:
version "1.0.1"
@@ -10810,29 +11097,29 @@ unique-slug@^2.0.0:
unique-string@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a"
- integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=
+ integrity sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==
dependencies:
crypto-random-string "^1.0.0"
-universalify@^0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
- integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+universalify@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0"
+ integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==
universalify@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
- integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d"
+ integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
- integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
+ integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
unset-value@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
- integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
+ integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==
dependencies:
has-value "^0.3.1"
isobject "^3.0.0"
@@ -10840,9 +11127,17 @@ unset-value@^1.0.0:
unzip-response@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97"
- integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=
+ integrity sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==
+
+update-browserslist-db@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5"
+ integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==
+ dependencies:
+ escalade "^3.2.0"
+ picocolors "^1.1.0"
-update-notifier@^2.2.0, update-notifier@^2.3.0, update-notifier@^2.5.0:
+update-notifier@^2.3.0, update-notifier@^2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6"
integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==
@@ -10868,24 +11163,32 @@ uri-js@^4.2.2:
urix@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
- integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+ integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==
url-parse-lax@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
- integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=
+ integrity sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==
dependencies:
prepend-http "^1.0.1"
+url-parse@^1.5.3:
+ version "1.5.10"
+ resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
+ integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
+ dependencies:
+ querystringify "^2.1.1"
+ requires-port "^1.0.0"
+
use-is-mounted@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/use-is-mounted/-/use-is-mounted-1.0.0.tgz#9b92038aa43d5f9b429fec5bcb337f090da686b2"
integrity sha512-hageAWvDBwxHxOgmMzVyT3xkJsj8jv3AUCEm0E1SAmPZ0rnTYal2CNhxVXvlV+orZ62NitsR5/va2djaP/iCLw==
-use-isomorphic-layout-effect@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb"
- integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==
+use-isomorphic-layout-effect@^1.1.2, use-isomorphic-layout-effect@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.0.tgz#afb292eb284c39219e8cb8d3d62d71999361a21d"
+ integrity sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w==
use-memory-value@^1.2.0:
version "1.2.0"
@@ -10893,9 +11196,9 @@ use-memory-value@^1.2.0:
integrity sha512-q4V1dsRM68aaVBZ33msnKTqAfFWCt4nowAhlYqNGoSnRCJt1AFcDAbtgj7YvYQaGGtJNFW7U9MhYthCU09OMmg==
use-sync-external-store@^1.0.0, use-sync-external-store@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a"
- integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz#adbc795d8eeb47029963016cefdf89dc799fcebc"
+ integrity sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==
use@^3.1.0:
version "3.1.1"
@@ -10905,21 +11208,21 @@ use@^3.1.0:
util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
- integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+ integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
util-extend@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f"
- integrity sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=
+ integrity sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==
util-promisify@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/util-promisify/-/util-promisify-2.1.0.tgz#3c2236476c4d32c5ff3c47002add7c13b9a82a53"
- integrity sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=
+ integrity sha512-K+5eQPYs14b3+E+hmE2J6gCZ4JmMl9DbYS6BeP2CHq6WMuNxErxf5B/n0fz85L8zUuoO6rIzNNmIQDu/j+1OcA==
dependencies:
object.getownpropertydescriptors "^2.0.3"
-uuid@^3.3.2, uuid@^3.3.3:
+uuid@^3.3.2, uuid@^3.4.0:
version "3.4.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
@@ -10930,9 +11233,9 @@ uuid@^8.3.1:
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
v8-compile-cache@^2.0.3:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
- integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz#cdada8bec61e15865f05d097c5f4fd30e94dc128"
+ integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==
v8-to-istanbul@^8.1.0:
version "8.1.1"
@@ -10954,14 +11257,14 @@ validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4:
validate-npm-package-name@^3.0.0, validate-npm-package-name@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e"
- integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34=
+ integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==
dependencies:
builtins "^1.0.3"
verror@1.10.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
- integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
+ integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==
dependencies:
assert-plus "^1.0.0"
core-util-is "1.0.2"
@@ -11003,14 +11306,14 @@ warning@^4.0.2, warning@^4.0.3:
wcwidth@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
- integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=
+ integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==
dependencies:
defaults "^1.0.3"
webidl-conversions@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
- integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=
+ integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
webidl-conversions@^5.0.0:
version "5.0.0"
@@ -11022,6 +11325,11 @@ webidl-conversions@^6.1.0:
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514"
integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==
+webidl-conversions@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a"
+ integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==
+
whatwg-encoding@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
@@ -11030,19 +11338,24 @@ whatwg-encoding@^1.0.5:
iconv-lite "0.4.24"
whatwg-fetch@^3.4.1:
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c"
- integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==
+ version "3.6.20"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70"
+ integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==
whatwg-mimetype@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
+whatwg-mimetype@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7"
+ integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==
+
whatwg-url@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
- integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0=
+ integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
dependencies:
tr46 "~0.0.3"
webidl-conversions "^3.0.0"
@@ -11056,42 +11369,62 @@ whatwg-url@^8.0.0, whatwg-url@^8.5.0:
tr46 "^2.1.0"
webidl-conversions "^6.1.0"
-which-boxed-primitive@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
- integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+which-boxed-primitive@^1.0.2, which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e"
+ integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==
dependencies:
- is-bigint "^1.0.1"
- is-boolean-object "^1.1.0"
- is-number-object "^1.0.4"
- is-string "^1.0.5"
- is-symbol "^1.0.3"
+ is-bigint "^1.1.0"
+ is-boolean-object "^1.2.1"
+ is-number-object "^1.1.1"
+ is-string "^1.1.1"
+ is-symbol "^1.1.1"
-which-collection@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906"
- integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==
+which-builtin-type@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e"
+ integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==
+ dependencies:
+ call-bound "^1.0.2"
+ function.prototype.name "^1.1.6"
+ has-tostringtag "^1.0.2"
+ is-async-function "^2.0.0"
+ is-date-object "^1.1.0"
+ is-finalizationregistry "^1.1.0"
+ is-generator-function "^1.0.10"
+ is-regex "^1.2.1"
+ is-weakref "^1.0.2"
+ isarray "^2.0.5"
+ which-boxed-primitive "^1.1.0"
+ which-collection "^1.0.2"
+ which-typed-array "^1.1.16"
+
+which-collection@^1.0.1, which-collection@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0"
+ integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==
dependencies:
- is-map "^2.0.1"
- is-set "^2.0.1"
- is-weakmap "^2.0.1"
- is-weakset "^2.0.1"
+ is-map "^2.0.3"
+ is-set "^2.0.3"
+ is-weakmap "^2.0.2"
+ is-weakset "^2.0.3"
which-module@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
- integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409"
+ integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==
-which-typed-array@^1.1.11, which-typed-array@^1.1.9:
- version "1.1.11"
- resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a"
- integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==
+which-typed-array@^1.1.13, which-typed-array@^1.1.16, which-typed-array@^1.1.18:
+ version "1.1.18"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.18.tgz#df2389ebf3fbb246a71390e90730a9edb6ce17ad"
+ integrity sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==
dependencies:
- available-typed-arrays "^1.0.5"
- call-bind "^1.0.2"
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.8"
+ call-bound "^1.0.3"
for-each "^0.3.3"
- gopd "^1.0.1"
- has-tostringtag "^1.0.0"
+ gopd "^1.2.0"
+ has-tostringtag "^1.0.2"
which@^1.2.9, which@^1.3.0, which@^1.3.1:
version "1.3.1"
@@ -11121,10 +11454,10 @@ widest-line@^2.0.0:
dependencies:
string-width "^2.1.1"
-word-wrap@^1.2.3, word-wrap@~1.2.3:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
- integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+word-wrap@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
+ integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
worker-farm@^1.6.0, worker-farm@^1.7.0:
version "1.7.0"
@@ -11142,14 +11475,6 @@ worker-farm@^1.6.0, worker-farm@^1.7.0:
string-width "^4.1.0"
strip-ansi "^6.0.0"
-wrap-ansi@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
- integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
- dependencies:
- string-width "^1.0.1"
- strip-ansi "^3.0.1"
-
wrap-ansi@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
@@ -11193,14 +11518,14 @@ write-file-atomic@^3.0.0:
typedarray-to-buffer "^3.1.5"
ws@^7.4.6:
- version "7.5.6"
- resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b"
- integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==
+ version "7.5.10"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9"
+ integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==
xdg-basedir@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
- integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=
+ integrity sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==
xml-name-validator@^3.0.0:
version "3.0.0"
@@ -11213,20 +11538,15 @@ xmlchars@^2.2.0:
integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
xstate@^4.38.2:
- version "4.38.2"
- resolved "https://registry.yarnpkg.com/xstate/-/xstate-4.38.2.tgz#1b74544fc9c8c6c713ba77f81c6017e65aa89804"
- integrity sha512-Fba/DwEPDLneHT3tbJ9F3zafbQXszOlyCJyQqqdzmtlY/cwE2th462KK48yaANf98jHlP6lJvxfNtN0LFKXPQg==
+ version "4.38.3"
+ resolved "https://registry.yarnpkg.com/xstate/-/xstate-4.38.3.tgz#4e15e7ad3aa0ca1eea2010548a5379966d8f1075"
+ integrity sha512-SH7nAaaPQx57dx6qvfcIgqKRXIh4L0A1iYEqim4s1u7c9VoCgzZc+63FY90AKU4ZzOC2cfJzTnpO4zK7fCUzzw==
xtend@~4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
-y18n@^3.2.1:
- version "3.2.2"
- resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696"
- integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==
-
y18n@^4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
@@ -11240,27 +11560,22 @@ y18n@^5.0.5:
yallist@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
- integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
+ integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==
yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
-yallist@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
- integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
-
yaml@^1.10.0, yaml@^1.10.2:
version "1.10.2"
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
yaml@^2.3.4:
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.0.tgz#14059ad9d0b1680d0f04d3a60fe00f3a857303c3"
- integrity sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.1.tgz#42f2b1ba89203f374609572d5349fb8686500773"
+ integrity sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==
yargs-parser@^15.0.1:
version "15.0.3"
@@ -11275,17 +11590,10 @@ yargs-parser@^20.2.2:
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
-yargs-parser@^21.0.0:
- version "21.0.0"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55"
- integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==
-
-yargs-parser@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
- integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k=
- dependencies:
- camelcase "^4.1.0"
+yargs-parser@^21.1.1:
+ version "21.1.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
+ integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
yargs@^14.2.3:
version "14.2.3"
@@ -11318,33 +11626,19 @@ yargs@^16.0.3, yargs@^16.2.0:
yargs-parser "^20.2.2"
yargs@^17.0.0:
- version "17.3.1"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.3.1.tgz#da56b28f32e2fd45aefb402ed9c26f42be4c07b9"
- integrity sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==
+ version "17.7.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
+ integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
dependencies:
- cliui "^7.0.2"
+ cliui "^8.0.1"
escalade "^3.1.1"
get-caller-file "^2.0.5"
require-directory "^2.1.1"
string-width "^4.2.3"
y18n "^5.0.5"
- yargs-parser "^21.0.0"
+ yargs-parser "^21.1.1"
-yargs@^8.0.2:
- version "8.0.2"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
- integrity sha1-YpmpBVsc78lp/355wdkY3Osiw2A=
- dependencies:
- camelcase "^4.1.0"
- cliui "^3.2.0"
- decamelize "^1.1.1"
- get-caller-file "^1.0.1"
- os-locale "^2.0.0"
- read-pkg-up "^2.0.0"
- require-directory "^2.1.1"
- require-main-filename "^1.0.1"
- set-blocking "^2.0.0"
- string-width "^2.0.0"
- which-module "^2.0.0"
- y18n "^3.2.1"
- yargs-parser "^7.0.0"
+zustand@^5.0.1:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/zustand/-/zustand-5.0.2.tgz#f7595ada55a565f1fd6464f002a91e701ee0cfca"
+ integrity sha512-8qNdnJVJlHlrKXi50LDqqUNmUbuBjoKLrYQBnoChIbVph7vni+sY+YpvdjXG9YLd/Bxr6scMcR+rm5H3aSqPaw==