diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1bfe497a..c78e4097 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,10 +1,6 @@ name: Build on: - push: - branches: [$default-branch] - paths-ignore: - - '**.md' pull_request: paths-ignore: - '**.md' @@ -25,7 +21,7 @@ jobs: - name: Checkout Books uses: actions/checkout@v2 - - name: Setup Books + - name: Install Dependencies run: yarn - name: Install RPM diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index fa66c771..29a6c700 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -14,7 +14,7 @@ jobs: - name: Checkout Books uses: actions/checkout@v2 - - name: Setup Books + - name: Install Dependencies run: | yarn set version 1.22.18 yarn @@ -65,7 +65,7 @@ jobs: - name: Checkout Books uses: actions/checkout@v2 - - name: Setup Books + - name: Install Dependencies run: | yarn set version 1.22.18 yarn @@ -113,7 +113,7 @@ jobs: - name: Checkout Books uses: actions/checkout@v2 - - name: Setup Books + - name: Install Dependencies run: yarn - name: Set Error Log Creds diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..79dc254d --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,32 @@ +name: Test + +on: + push: + branches: [$default-branch] + paths-ignore: + - '**.md' + pull_request: + paths-ignore: + - '**.md' + workflow_dispatch: + +jobs: + setup_and_test: + runs-on: macos-11 + steps: + - name: Setup node + uses: actions/setup-node@v2 + with: + node-version: '16.13.1' + + - name: Set yarn version + run: yarn set version 1.22.18 + + - name: Checkout Books + uses: actions/checkout@v2 + + - name: Install Dependencies + run: yarn + + - name: Yarn Tests + run: yarn test \ No newline at end of file diff --git a/backend/database/tests/testCore.spec.ts b/backend/database/tests/testCore.spec.ts index 248a1a46..13f21d85 100644 --- a/backend/database/tests/testCore.spec.ts +++ b/backend/database/tests/testCore.spec.ts @@ -1,6 +1,5 @@ -import * as assert from 'assert'; -import 'mocha'; import { FieldTypeEnum, RawValue, Schema } from 'schemas/types'; +import test from 'tape'; import { getMapFromList, getValueMapFromList, sleep } from 'utils'; import { getDefaultMetaFieldValueMap, sqliteTypeMap } from '../../helpers'; import DatabaseCore from '../core'; @@ -9,7 +8,7 @@ import { assertDoesNotThrow, assertThrows, BaseMetaKey, - getBuiltTestSchemaMap, + getBuiltTestSchemaMap } from './helpers'; /** @@ -23,602 +22,530 @@ import { * This also implies that assert calls should have discriptive */ -describe('DatabaseCore: Connect Migrate Close', function () { +const schemaMap = getBuiltTestSchemaMap(); +async function getDb(shouldMigrate: boolean = true): Promise { const db = new DatabaseCore(); - specify('dbPath', function () { - assert.strictEqual(db.dbPath, ':memory:'); - }); + await db.connect(); + db.setSchemaMap(schemaMap); + if (shouldMigrate) { + await db.migrate(); + } + return db; +} + +test('db init, migrate, close', async (t) => { + const db = new DatabaseCore(); + t.equal(db.dbPath, ':memory:'); const schemaMap = getBuiltTestSchemaMap(); db.setSchemaMap(schemaMap); - specify('schemaMap', function () { - assert.strictEqual(schemaMap, db.schemaMap); - }); - specify('connect', async function () { - await assertDoesNotThrow(async () => await db.connect()); - assert.notStrictEqual(db.knex, undefined); - }); + // Same Object + t.equal(schemaMap, db.schemaMap); - specify('migrate and close', async function () { - // Does not throw - await db.migrate(); - // Does not throw - await db.close(); - }); + await assertDoesNotThrow(async () => await db.connect()); + t.notEqual(db.knex, undefined); + + await assertDoesNotThrow(async () => await db.migrate()); + + await assertDoesNotThrow(async () => await db.close()); }); -describe('DatabaseCore: Migrate and Check Db', function () { - let db: DatabaseCore; - const schemaMap = getBuiltTestSchemaMap(); +/** + * DatabaseCore: Migrate and Check Db + */ - this.beforeEach(async function () { - db = new DatabaseCore(); - await db.connect(); - db.setSchemaMap(schemaMap); - }); - - this.afterEach(async function () { - await db.close(); - }); - - specify(`Pre Migrate TableInfo`, async function () { - for (const schemaName in schemaMap) { - const columns = await db.knex?.raw('pragma table_info(??)', schemaName); - assert.strictEqual(columns.length, 0, `column count ${schemaName}`); - } - }); - - specify('Post Migrate TableInfo', async function () { - await db.migrate(); - for (const schemaName in schemaMap) { - const schema = schemaMap[schemaName] as Schema; - const fieldMap = getMapFromList(schema.fields, 'fieldname'); - const columns: SqliteTableInfo[] = await db.knex!.raw( - 'pragma table_info(??)', - schemaName - ); - - let columnCount = schema.fields.filter( - (f) => f.fieldtype !== FieldTypeEnum.Table - ).length; - - if (schema.isSingle) { - columnCount = 0; - } - - assert.strictEqual( - columns.length, - columnCount, - `${schemaName}:: column count: ${columns.length}, ${columnCount}` - ); - - for (const column of columns) { - const field = fieldMap[column.name]; - const dbColType = sqliteTypeMap[field.fieldtype]; - - assert.strictEqual( - column.name, - field.fieldname, - `${schemaName}.${column.name}:: name check: ${column.name}, ${field.fieldname}` - ); - - assert.strictEqual( - column.type.toLowerCase(), - dbColType, - `${schemaName}.${column.name}:: type check: ${column.type}, ${dbColType}` - ); - - if (field.required !== undefined) { - assert.strictEqual( - !!column.notnull, - field.required, - `${schemaName}.${column.name}:: iotnull iheck: ${column.notnull}, ${field.required}` - ); - } else { - assert.strictEqual( - column.notnull, - 0, - `${schemaName}.${column.name}:: notnull check: ${column.notnull}, ${field.required}` - ); - } - - if (column.dflt_value === null) { - assert.strictEqual( - field.default, - undefined, - `${schemaName}.${column.name}:: dflt_value check: ${column.dflt_value}, ${field.default}` - ); - } else { - assert.strictEqual( - column.dflt_value.slice(1, -1), - String(field.default), - `${schemaName}.${column.name}:: dflt_value check: ${column.type}, ${dbColType}` - ); - } - } - } - }); +test(`Pre Migrate TableInfo`, async function (t) { + const db = await getDb(false); + for (const schemaName in schemaMap) { + const columns = await db.knex?.raw('pragma table_info(??)', schemaName); + t.equal(columns.length, 0, `column count ${schemaName}`); + } + await db.close(); }); -describe('DatabaseCore: CRUD', function () { - let db: DatabaseCore; - const schemaMap = getBuiltTestSchemaMap(); +test('Post Migrate TableInfo', async function (t) { + const db = await getDb(); + for (const schemaName in schemaMap) { + const schema = schemaMap[schemaName] as Schema; + const fieldMap = getMapFromList(schema.fields, 'fieldname'); + const columns: SqliteTableInfo[] = await db.knex!.raw( + 'pragma table_info(??)', + schemaName + ); - this.beforeEach(async function () { - db = new DatabaseCore(); - await db.connect(); - db.setSchemaMap(schemaMap); - await db.migrate(); - }); + let columnCount = schema.fields.filter( + (f) => f.fieldtype !== FieldTypeEnum.Table + ).length; - this.afterEach(async function () { - await db.close(); - }); + if (schema.isSingle) { + columnCount = 0; + } - specify('exists() before insertion', async function () { - for (const schemaName in schemaMap) { - const doesExist = await db.exists(schemaName); - if (['SingleValue', 'SystemSettings'].includes(schemaName)) { - assert.strictEqual(doesExist, true, `${schemaName} exists`); + t.equal( + columns.length, + columnCount, + `${schemaName}:: column count: ${columns.length}, ${columnCount}` + ); + + for (const column of columns) { + const field = fieldMap[column.name]; + const dbColType = sqliteTypeMap[field.fieldtype]; + + t.equal( + column.name, + field.fieldname, + `${schemaName}.${column.name}:: name check: ${column.name}, ${field.fieldname}` + ); + + t.equal( + column.type.toLowerCase(), + dbColType, + `${schemaName}.${column.name}:: type check: ${column.type}, ${dbColType}` + ); + + if (field.required !== undefined) { + t.equal( + !!column.notnull, + field.required, + `${schemaName}.${column.name}:: iotnull iheck: ${column.notnull}, ${field.required}` + ); } else { - assert.strictEqual(doesExist, false, `${schemaName} exists`); + t.equal( + column.notnull, + 0, + `${schemaName}.${column.name}:: notnull check: ${column.notnull}, ${field.required}` + ); } - } - }); - specify('CRUD single values', async function () { - /** - * Checking default values which are created when db.migrate - * takes place. - */ - let rows: Record[] = await db.knex!.raw( - 'select * from SingleValue' - ); - const defaultMap = getValueMapFromList( - (schemaMap.SystemSettings as Schema).fields, - 'fieldname', - 'default' - ); - for (const row of rows) { - assert.strictEqual( - row.value, - defaultMap[row.fieldname as string], - `${row.fieldname} default values equality` - ); - } - - /** - * Insertion and updation for single values call the same function. - * - * Insert - */ - - let localeRow = rows.find((r) => r.fieldname === 'locale'); - const localeEntryName = localeRow?.name as string; - const localeEntryCreated = localeRow?.created as string; - - let locale = 'hi-IN'; - await db.insert('SystemSettings', { locale }); - rows = await db.knex!.raw('select * from SingleValue'); - localeRow = rows.find((r) => r.fieldname === 'locale'); - - assert.notStrictEqual(localeEntryName, undefined, 'localeEntryName'); - assert.strictEqual(rows.length, 2, 'rows length insert'); - assert.strictEqual( - localeRow?.name as string, - localeEntryName, - `localeEntryName ${localeRow?.name}, ${localeEntryName}` - ); - assert.strictEqual( - localeRow?.value, - locale, - `locale ${localeRow?.value}, ${locale}` - ); - assert.strictEqual( - localeRow?.created, - localeEntryCreated, - `locale ${localeRow?.value}, ${locale}` - ); - - /** - * Update - */ - locale = 'ca-ES'; - await db.update('SystemSettings', { locale }); - rows = await db.knex!.raw('select * from SingleValue'); - localeRow = rows.find((r) => r.fieldname === 'locale'); - - assert.notStrictEqual(localeEntryName, undefined, 'localeEntryName'); - assert.strictEqual(rows.length, 2, 'rows length update'); - assert.strictEqual( - localeRow?.name as string, - localeEntryName, - `localeEntryName ${localeRow?.name}, ${localeEntryName}` - ); - assert.strictEqual( - localeRow?.value, - locale, - `locale ${localeRow?.value}, ${locale}` - ); - assert.strictEqual( - localeRow?.created, - localeEntryCreated, - `locale ${localeRow?.value}, ${locale}` - ); - - /** - * Delete - */ - await db.delete('SystemSettings', 'locale'); - rows = await db.knex!.raw('select * from SingleValue'); - assert.strictEqual(rows.length, 1, 'delete one'); - await db.delete('SystemSettings', 'dateFormat'); - rows = await db.knex!.raw('select * from SingleValue'); - assert.strictEqual(rows.length, 0, 'delete two'); - - const dateFormat = 'dd/mm/yy'; - await db.insert('SystemSettings', { locale, dateFormat }); - rows = await db.knex!.raw('select * from SingleValue'); - assert.strictEqual(rows.length, 2, 'delete two'); - - /** - * Read - * - * getSingleValues - */ - const svl = await db.getSingleValues('locale', 'dateFormat'); - assert.strictEqual(svl.length, 2, 'getSingleValues length'); - for (const sv of svl) { - assert.strictEqual( - sv.parent, - 'SystemSettings', - `singleValue parent ${sv.parent}` - ); - assert.strictEqual( - sv.value, - { locale, dateFormat }[sv.fieldname], - `singleValue value ${sv.value}` - ); - - /** - * get - */ - const svlMap = await db.get('SystemSettings'); - assert.strictEqual(Object.keys(svlMap).length, 2, 'get key length'); - assert.strictEqual(svlMap.locale, locale, 'get locale'); - assert.strictEqual(svlMap.dateFormat, dateFormat, 'get locale'); - } - }); - - specify('CRUD nondependent schema', async function () { - const schemaName = 'Customer'; - let rows = await db.knex!(schemaName); - assert.strictEqual(rows.length, 0, 'rows length before insertion'); - - /** - * Insert - */ - const metaValues = getDefaultMetaFieldValueMap(); - const name = 'John Thoe'; - - await assertThrows( - async () => await db.insert(schemaName, { name }), - 'insert() did not throw without meta values' - ); - - const updateMap = Object.assign({}, metaValues, { name }); - await db.insert(schemaName, updateMap); - rows = await db.knex!(schemaName); - let firstRow = rows?.[0]; - assert.strictEqual(rows.length, 1, `rows length insert ${rows.length}`); - assert.strictEqual( - firstRow.name, - name, - `name check ${firstRow.name}, ${name}` - ); - assert.strictEqual(firstRow.email, null, `email check ${firstRow.email}`); - - for (const key in metaValues) { - assert.strictEqual( - firstRow[key], - metaValues[key as BaseMetaKey], - `${key} check` - ); - } - - /** - * Update - */ - const email = 'john@thoe.com'; - await sleep(1); // required for modified to change - await db.update(schemaName, { - name, - email, - modified: new Date().toISOString(), - }); - rows = await db.knex!(schemaName); - firstRow = rows?.[0]; - assert.strictEqual(rows.length, 1, `rows length update ${rows.length}`); - assert.strictEqual( - firstRow.name, - name, - `name check update ${firstRow.name}, ${name}` - ); - assert.strictEqual( - firstRow.email, - email, - `email check update ${firstRow.email}` - ); - - const phone = '8149133530'; - await sleep(1); - await db.update(schemaName, { - name, - phone, - modified: new Date().toISOString(), - }); - rows = await db.knex!(schemaName); - firstRow = rows?.[0]; - assert.strictEqual( - firstRow.email, - email, - `email check update ${firstRow.email}` - ); - assert.strictEqual( - firstRow.phone, - phone, - `email check update ${firstRow.phone}` - ); - - for (const key in metaValues) { - const val = firstRow[key]; - const expected = metaValues[key as BaseMetaKey]; - if (key !== 'modified') { - assert.strictEqual(val, expected, `${key} check ${val}, ${expected}`); + if (column.dflt_value === null) { + t.equal( + field.default, + undefined, + `${schemaName}.${column.name}:: dflt_value check: ${column.dflt_value}, ${field.default}` + ); } else { - assert.notStrictEqual( - val, - expected, - `${key} check ${val}, ${expected}` + t.equal( + column.dflt_value.slice(1, -1), + String(field.default), + `${schemaName}.${column.name}:: dflt_value check: ${column.type}, ${dbColType}` ); } } + } - /** - * Delete - */ - await db.delete(schemaName, name); - rows = await db.knex!(schemaName); - assert.strictEqual(rows.length, 0, `rows length delete ${rows.length}`); + await db.close(); +}); - /** - * Get - */ - let fvMap = await db.get(schemaName, name); - assert.strictEqual( - Object.keys(fvMap).length, - 0, - `key count get ${JSON.stringify(fvMap)}` - ); - - /** - * > 1 entries - */ - - const cOne = { name: 'John Whoe', ...getDefaultMetaFieldValueMap() }; - const cTwo = { name: 'Jane Whoe', ...getDefaultMetaFieldValueMap() }; - - // Insert - await db.insert(schemaName, cOne); - assert.strictEqual( - (await db.knex!(schemaName)).length, - 1, - `rows length minsert` - ); - await db.insert(schemaName, cTwo); - rows = await db.knex!(schemaName); - assert.strictEqual(rows.length, 2, `rows length minsert`); - - const cs = [cOne, cTwo]; - for (const i in cs) { - for (const k in cs[i]) { - const val = cs[i][k as BaseMetaKey]; - assert.strictEqual( - rows?.[i]?.[k], - val, - `equality check ${i} ${k} ${val} ${rows?.[i]?.[k]}` - ); - } +test('exists() before insertion', async function (t) { + const db = await getDb(); + for (const schemaName in schemaMap) { + const doesExist = await db.exists(schemaName); + if (['SingleValue', 'SystemSettings'].includes(schemaName)) { + t.equal(doesExist, true, `${schemaName} exists`); + } else { + t.equal(doesExist, false, `${schemaName} exists`); } + } + await db.close(); +}); - // Update - await db.update(schemaName, { name: cOne.name, email }); - const cOneEmail = await db.get(schemaName, cOne.name, 'email'); - assert.strictEqual( - cOneEmail.email, - email, - `mi update check one ${cOneEmail}` +test('CRUD single values', async function (t) { + const db = await getDb(); + /** + * Checking default values which are created when db.migrate + * takes place. + */ + let rows: Record[] = await db.knex!.raw( + 'select * from SingleValue' + ); + const defaultMap = getValueMapFromList( + (schemaMap.SystemSettings as Schema).fields, + 'fieldname', + 'default' + ); + for (const row of rows) { + t.equal( + row.value, + defaultMap[row.fieldname as string], + `${row.fieldname} default values equality` ); - const cTwoEmail = await db.get(schemaName, cTwo.name, 'email'); - assert.strictEqual( - cOneEmail.email, - email, - `mi update check two ${cTwoEmail}` + } + + /** + * Insertion and updation for single values call the same function. + * + * Insert + */ + + let localeRow = rows.find((r) => r.fieldname === 'locale'); + const localeEntryName = localeRow?.name as string; + const localeEntryCreated = localeRow?.created as string; + + let locale = 'hi-IN'; + await db.insert('SystemSettings', { locale }); + rows = await db.knex!.raw('select * from SingleValue'); + localeRow = rows.find((r) => r.fieldname === 'locale'); + + t.notEqual(localeEntryName, undefined, 'localeEntryName'); + t.equal(rows.length, 2, 'rows length insert'); + t.equal( + localeRow?.name as string, + localeEntryName, + `localeEntryName ${localeRow?.name}, ${localeEntryName}` + ); + t.equal(localeRow?.value, locale, `locale ${localeRow?.value}, ${locale}`); + t.equal( + localeRow?.created, + localeEntryCreated, + `locale ${localeRow?.value}, ${locale}` + ); + + /** + * Update + */ + locale = 'ca-ES'; + await db.update('SystemSettings', { locale }); + rows = await db.knex!.raw('select * from SingleValue'); + localeRow = rows.find((r) => r.fieldname === 'locale'); + + t.notEqual(localeEntryName, undefined, 'localeEntryName'); + t.equal(rows.length, 2, 'rows length update'); + t.equal( + localeRow?.name as string, + localeEntryName, + `localeEntryName ${localeRow?.name}, ${localeEntryName}` + ); + t.equal(localeRow?.value, locale, `locale ${localeRow?.value}, ${locale}`); + t.equal( + localeRow?.created, + localeEntryCreated, + `locale ${localeRow?.value}, ${locale}` + ); + + /** + * Delete + */ + await db.delete('SystemSettings', 'locale'); + rows = await db.knex!.raw('select * from SingleValue'); + t.equal(rows.length, 1, 'delete one'); + await db.delete('SystemSettings', 'dateFormat'); + rows = await db.knex!.raw('select * from SingleValue'); + t.equal(rows.length, 0, 'delete two'); + + const dateFormat = 'dd/mm/yy'; + await db.insert('SystemSettings', { locale, dateFormat }); + rows = await db.knex!.raw('select * from SingleValue'); + t.equal(rows.length, 2, 'delete two'); + + /** + * Read + * + * getSingleValues + */ + const svl = await db.getSingleValues('locale', 'dateFormat'); + t.equal(svl.length, 2, 'getSingleValues length'); + for (const sv of svl) { + t.equal(sv.parent, 'SystemSettings', `singleValue parent ${sv.parent}`); + t.equal( + sv.value, + { locale, dateFormat }[sv.fieldname], + `singleValue value ${sv.value}` ); - // Rename - const newName = 'Johnny Whoe'; - await db.rename(schemaName, cOne.name, newName); + /** + * get + */ + const svlMap = await db.get('SystemSettings'); + t.equal(Object.keys(svlMap).length, 2, 'get key length'); + t.equal(svlMap.locale, locale, 'get locale'); + t.equal(svlMap.dateFormat, dateFormat, 'get locale'); + } - fvMap = await db.get(schemaName, cOne.name); - assert.strictEqual( - Object.keys(fvMap).length, - 0, - `mi rename check old ${JSON.stringify(fvMap)}` - ); + await db.close(); +}); - fvMap = await db.get(schemaName, newName); - assert.strictEqual( - fvMap.email, - email, - `mi rename check new ${JSON.stringify(fvMap)}` - ); +test('CRUD nondependent schema', async function (t) { + const db = await getDb(); + const schemaName = 'Customer'; + let rows = await db.knex!(schemaName); + t.equal(rows.length, 0, 'rows length before insertion'); - // Delete - await db.delete(schemaName, newName); - rows = await db.knex!(schemaName); - assert.strictEqual(rows.length, 1, `mi delete length ${rows.length}`); - assert.strictEqual( - rows[0].name, - cTwo.name, - `mi delete name ${rows[0].name}` - ); + /** + * Insert + */ + const metaValues = getDefaultMetaFieldValueMap(); + const name = 'John Thoe'; + + await assertThrows( + async () => await db.insert(schemaName, { name }), + 'insert() did not throw without meta values' + ); + + const updateMap = Object.assign({}, metaValues, { name }); + await db.insert(schemaName, updateMap); + rows = await db.knex!(schemaName); + let firstRow = rows?.[0]; + t.equal(rows.length, 1, `rows length insert ${rows.length}`); + t.equal(firstRow.name, name, `name check ${firstRow.name}, ${name}`); + t.equal(firstRow.email, null, `email check ${firstRow.email}`); + + for (const key in metaValues) { + t.equal(firstRow[key], metaValues[key as BaseMetaKey], `${key} check`); + } + + /** + * Update + */ + const email = 'john@thoe.com'; + await sleep(1); // required for modified to change + await db.update(schemaName, { + name, + email, + modified: new Date().toISOString(), }); + rows = await db.knex!(schemaName); + firstRow = rows?.[0]; + t.equal(rows.length, 1, `rows length update ${rows.length}`); + t.equal(firstRow.name, name, `name check update ${firstRow.name}, ${name}`); + t.equal(firstRow.email, email, `email check update ${firstRow.email}`); - specify('CRUD dependent schema', async function () { - const Customer = 'Customer'; - const SalesInvoice = 'SalesInvoice'; - const SalesInvoiceItem = 'SalesInvoiceItem'; + const phone = '8149133530'; + await sleep(1); + await db.update(schemaName, { + name, + phone, + modified: new Date().toISOString(), + }); + rows = await db.knex!(schemaName); + firstRow = rows?.[0]; + t.equal(firstRow.email, email, `email check update ${firstRow.email}`); + t.equal(firstRow.phone, phone, `email check update ${firstRow.phone}`); - const customer: FieldValueMap = { - name: 'John Whoe', - email: 'john@whoe.com', - ...getDefaultMetaFieldValueMap(), - }; + for (const key in metaValues) { + const val = firstRow[key]; + const expected = metaValues[key as BaseMetaKey]; + if (key !== 'modified') { + t.equal(val, expected, `${key} check ${val}, ${expected}`); + } else { + t.notEqual(val, expected, `${key} check ${val}, ${expected}`); + } + } - const invoice: FieldValueMap = { - name: 'SINV-1001', - date: '2022-01-21', - customer: customer.name, - account: 'Debtors', - submitted: false, - cancelled: false, - ...getDefaultMetaFieldValueMap(), - }; + /** + * Delete + */ + await db.delete(schemaName, name); + rows = await db.knex!(schemaName); + t.equal(rows.length, 0, `rows length delete ${rows.length}`); - await assertThrows( - async () => await db.insert(SalesInvoice, invoice), - 'foreign key constraint fail failed' - ); + /** + * Get + */ + let fvMap = await db.get(schemaName, name); + t.equal( + Object.keys(fvMap).length, + 0, + `key count get ${JSON.stringify(fvMap)}` + ); - await assertDoesNotThrow(async () => { - await db.insert(Customer, customer); - await db.insert(SalesInvoice, invoice); - }, 'insertion failed'); + /** + * > 1 entries + */ - await assertThrows( - async () => await db.delete(Customer, customer.name as string), - 'foreign key constraint fail failed' - ); + const cOne = { name: 'John Whoe', ...getDefaultMetaFieldValueMap() }; + const cTwo = { name: 'Jane Whoe', ...getDefaultMetaFieldValueMap() }; - await assertDoesNotThrow(async () => { - await db.delete(SalesInvoice, invoice.name as string); - await db.delete(Customer, customer.name as string); - }, 'deletion failed'); + // Insert + await db.insert(schemaName, cOne); + t.equal((await db.knex!(schemaName)).length, 1, `rows length minsert`); + await db.insert(schemaName, cTwo); + rows = await db.knex!(schemaName); + t.equal(rows.length, 2, `rows length minsert`); + const cs = [cOne, cTwo]; + for (const i in cs) { + for (const k in cs[i]) { + const val = cs[i][k as BaseMetaKey]; + t.equal( + rows?.[i]?.[k], + val, + `equality check ${i} ${k} ${val} ${rows?.[i]?.[k]}` + ); + } + } + + // Update + await db.update(schemaName, { name: cOne.name, email }); + const cOneEmail = await db.get(schemaName, cOne.name, 'email'); + t.equal(cOneEmail.email, email, `mi update check one ${cOneEmail}`); + const cTwoEmail = await db.get(schemaName, cTwo.name, 'email'); + t.equal(cOneEmail.email, email, `mi update check two ${cTwoEmail}`); + + // Rename + const newName = 'Johnny Whoe'; + await db.rename(schemaName, cOne.name, newName); + + fvMap = await db.get(schemaName, cOne.name); + t.equal( + Object.keys(fvMap).length, + 0, + `mi rename check old ${JSON.stringify(fvMap)}` + ); + + fvMap = await db.get(schemaName, newName); + t.equal(fvMap.email, email, `mi rename check new ${JSON.stringify(fvMap)}`); + + // Delete + await db.delete(schemaName, newName); + rows = await db.knex!(schemaName); + t.equal(rows.length, 1, `mi delete length ${rows.length}`); + t.equal(rows[0].name, cTwo.name, `mi delete name ${rows[0].name}`); + await db.close(); +}); + +test('CRUD dependent schema', async function (t) { + const db = await getDb(); + + const Customer = 'Customer'; + const SalesInvoice = 'SalesInvoice'; + const SalesInvoiceItem = 'SalesInvoiceItem'; + + const customer: FieldValueMap = { + name: 'John Whoe', + email: 'john@whoe.com', + ...getDefaultMetaFieldValueMap(), + }; + + const invoice: FieldValueMap = { + name: 'SINV-1001', + date: '2022-01-21', + customer: customer.name, + account: 'Debtors', + submitted: false, + cancelled: false, + ...getDefaultMetaFieldValueMap(), + }; + + await assertThrows( + async () => await db.insert(SalesInvoice, invoice), + 'foreign key constraint fail failed' + ); + + await assertDoesNotThrow(async () => { await db.insert(Customer, customer); await db.insert(SalesInvoice, invoice); + }, 'insertion failed'); - let fvMap = await db.get(SalesInvoice, invoice.name as string); - for (const key in invoice) { - let expected = invoice[key]; - if (typeof expected === 'boolean') { - expected = +expected; - } - - assert.strictEqual( - fvMap[key], - expected, - `equality check ${key}: ${fvMap[key]}, ${invoice[key]}` - ); - } - - assert.strictEqual( - (fvMap.items as unknown[])?.length, - 0, - 'empty items check' - ); - - const items: FieldValueMap[] = [ - { - item: 'Bottle Caps', - quantity: 2, - rate: 100, - amount: 200, - }, - ]; - - await assertThrows( - async () => await db.insert(SalesInvoice, { name: invoice.name, items }), - 'invoice insertion with ct did not fail' - ); - await assertDoesNotThrow( - async () => await db.update(SalesInvoice, { name: invoice.name, items }), - 'ct insertion failed' - ); - - fvMap = await db.get(SalesInvoice, invoice.name as string); - const ct = fvMap.items as FieldValueMap[]; - assert.strictEqual(ct.length, 1, `ct length ${ct.length}`); - assert.strictEqual(ct[0].parent, invoice.name, `ct parent ${ct[0].parent}`); - assert.strictEqual( - ct[0].parentFieldname, - 'items', - `ct parentFieldname ${ct[0].parentFieldname}` - ); - assert.strictEqual( - ct[0].parentSchemaName, - SalesInvoice, - `ct parentSchemaName ${ct[0].parentSchemaName}` - ); - for (const key in items[0]) { - assert.strictEqual( - ct[0][key], - items[0][key], - `ct values ${key}: ${ct[0][key]}, ${items[0][key]}` - ); - } - - items.push({ - item: 'Mentats', - quantity: 4, - rate: 200, - amount: 800, - }); - await assertDoesNotThrow( - async () => await db.update(SalesInvoice, { name: invoice.name, items }), - 'ct updation failed' - ); - - let rows = await db.getAll(SalesInvoiceItem, { - fields: ['item', 'quantity', 'rate', 'amount'], - }); - assert.strictEqual(rows.length, 2, `ct length update ${rows.length}`); - - for (const i in rows) { - for (const key in rows[i]) { - assert.strictEqual( - rows[i][key], - items[i][key], - `ct values ${i},${key}: ${rows[i][key]}` - ); - } - } - - invoice.date = '2022-04-01'; - invoice.modified = new Date().toISOString(); - await db.update('SalesInvoice', { - name: invoice.name, - date: invoice.date, - modified: invoice.modified, - }); - - rows = await db.knex!(SalesInvoiceItem); - assert.strictEqual(rows.length, 2, `postupdate ct empty ${rows.length}`); + await assertThrows( + async () => await db.delete(Customer, customer.name as string), + 'foreign key constraint fail failed' + ); + await assertDoesNotThrow(async () => { await db.delete(SalesInvoice, invoice.name as string); - rows = await db.getAll(SalesInvoiceItem); - assert.strictEqual(rows.length, 0, `ct length delete ${rows.length}`); + await db.delete(Customer, customer.name as string); + }, 'deletion failed'); + + await db.insert(Customer, customer); + await db.insert(SalesInvoice, invoice); + + let fvMap = await db.get(SalesInvoice, invoice.name as string); + for (const key in invoice) { + let expected = invoice[key]; + if (typeof expected === 'boolean') { + expected = +expected; + } + + t.equal( + fvMap[key], + expected, + `equality check ${key}: ${fvMap[key]}, ${invoice[key]}` + ); + } + + t.equal((fvMap.items as unknown[])?.length, 0, 'empty items check'); + + const items: FieldValueMap[] = [ + { + item: 'Bottle Caps', + quantity: 2, + rate: 100, + amount: 200, + }, + ]; + + await assertThrows( + async () => await db.insert(SalesInvoice, { name: invoice.name, items }), + 'invoice insertion with ct did not fail' + ); + await assertDoesNotThrow( + async () => await db.update(SalesInvoice, { name: invoice.name, items }), + 'ct insertion failed' + ); + + fvMap = await db.get(SalesInvoice, invoice.name as string); + const ct = fvMap.items as FieldValueMap[]; + t.equal(ct.length, 1, `ct length ${ct.length}`); + t.equal(ct[0].parent, invoice.name, `ct parent ${ct[0].parent}`); + t.equal( + ct[0].parentFieldname, + 'items', + `ct parentFieldname ${ct[0].parentFieldname}` + ); + t.equal( + ct[0].parentSchemaName, + SalesInvoice, + `ct parentSchemaName ${ct[0].parentSchemaName}` + ); + for (const key in items[0]) { + t.equal( + ct[0][key], + items[0][key], + `ct values ${key}: ${ct[0][key]}, ${items[0][key]}` + ); + } + + items.push({ + item: 'Mentats', + quantity: 4, + rate: 200, + amount: 800, }); + await assertDoesNotThrow( + async () => await db.update(SalesInvoice, { name: invoice.name, items }), + 'ct updation failed' + ); + + let rows = await db.getAll(SalesInvoiceItem, { + fields: ['item', 'quantity', 'rate', 'amount'], + }); + t.equal(rows.length, 2, `ct length update ${rows.length}`); + + for (const i in rows) { + for (const key in rows[i]) { + t.equal( + rows[i][key], + items[i][key], + `ct values ${i},${key}: ${rows[i][key]}` + ); + } + } + + invoice.date = '2022-04-01'; + invoice.modified = new Date().toISOString(); + await db.update('SalesInvoice', { + name: invoice.name, + date: invoice.date, + modified: invoice.modified, + }); + + rows = await db.knex!(SalesInvoiceItem); + t.equal(rows.length, 2, `postupdate ct empty ${rows.length}`); + + await db.delete(SalesInvoice, invoice.name as string); + rows = await db.getAll(SalesInvoiceItem); + t.equal(rows.length, 0, `ct length delete ${rows.length}`); + + await db.close(); }); diff --git a/dummy/tests/testDummy.spec.ts b/dummy/tests/testDummy.spec.ts index a756b223..0e93f2f8 100644 --- a/dummy/tests/testDummy.spec.ts +++ b/dummy/tests/testDummy.spec.ts @@ -1,49 +1,27 @@ -import * as assert from 'assert'; -import { DatabaseManager } from 'backend/database/manager'; import { assertDoesNotThrow } from 'backend/database/tests/helpers'; import { purchaseItemPartyMap } from 'dummy/helpers'; -import { Fyo } from 'fyo'; -import { DummyAuthDemux } from 'fyo/tests/helpers'; -import 'mocha'; -import { getTestDbPath } from 'tests/helpers'; +import test from 'tape'; +import { getTestDbPath, getTestFyo } from 'tests/helpers'; import { setupDummyInstance } from '..'; -describe('dummy', function () { - const dbPath = getTestDbPath(); +const dbPath = getTestDbPath(); +const fyo = getTestFyo(); - let fyo: Fyo; - - this.beforeAll(function () { - fyo = new Fyo({ - DatabaseDemux: DatabaseManager, - AuthDemux: DummyAuthDemux, - isTest: true, - isElectron: false, - }); - }); - - this.afterAll(async function () { - await fyo.close(); - }); - - specify('setupDummyInstance', async function () { - await assertDoesNotThrow(async () => { - await setupDummyInstance(dbPath, fyo, 1, 25); - }, 'setup instance failed'); - - for (const item in purchaseItemPartyMap) { - assert.strictEqual( - await fyo.db.exists('Item', item), - true, - `not found ${item}` - ); - - const party = purchaseItemPartyMap[item]; - assert.strictEqual( - await fyo.db.exists('Party', party), - true, - `not found ${party}` - ); - } - }).timeout(120_000); +test('setupDummyInstance', async () => { + await assertDoesNotThrow(async () => { + await setupDummyInstance(dbPath, fyo, 1, 25); + }, 'setup instance failed'); +}); + +test('purchaseItemParty Existance', async (t) => { + for (const item in purchaseItemPartyMap) { + t.ok(await fyo.db.exists('Item', item), `item exists: ${item}`); + + const party = purchaseItemPartyMap[item]; + t.ok(await fyo.db.exists('Party', party), `party exists: ${party}`); + } +}); + +test.onFinish(async () => { + await fyo.close(); }); diff --git a/fyo/tests/testFyo.spec.ts b/fyo/tests/testFyo.spec.ts index c1078f8e..6c4208f7 100644 --- a/fyo/tests/testFyo.spec.ts +++ b/fyo/tests/testFyo.spec.ts @@ -1,71 +1,36 @@ -import * as assert from 'assert'; -import 'mocha'; import { getRegionalModels, models } from 'models'; import { getSchemas } from 'schemas'; -import { Fyo } from '..'; -import { DatabaseManager } from '../../backend/database/manager'; -import { DummyAuthDemux } from './helpers'; +import test from 'tape'; +import { getTestFyo } from 'tests/helpers'; -describe('Fyo Init', function () { - const fyo = new Fyo({ - DatabaseDemux: DatabaseManager, - AuthDemux: DummyAuthDemux, - isTest: true, - isElectron: false, - }); +test('Fyo Init', async (t) => { + const fyo = getTestFyo(); + t.equal(Object.keys(fyo.schemaMap).length, 0, 'zero schemas'); - specify('Init', async function () { - assert.strictEqual( - Object.keys(fyo.schemaMap).length, - 0, - 'zero schemas one' - ); + await fyo.db.createNewDatabase(':memory:', 'in'); + await fyo.initializeAndRegister({}, {}); - assert.strictEqual( - Object.keys(fyo.schemaMap).length, - 0, - 'zero schemas two' - ); - - await fyo.db.createNewDatabase(':memory:', 'in'); - await fyo.initializeAndRegister({}, {}); - assert.strictEqual( - Object.keys(fyo.schemaMap).length > 0, - true, - 'non zero schemas' - ); - await fyo.db.purgeCache(); - }); + t.equal(Object.keys(fyo.schemaMap).length > 0, true, 'non zero schemas'); + await fyo.close(); }); -describe('Fyo Docs', function () { +test('Fyo Docs', async (t) => { const countryCode = 'in'; - let fyo: Fyo; + const fyo = getTestFyo(); const schemaMap = getSchemas(countryCode); - this.beforeEach(async function () { - fyo = new Fyo({ - DatabaseDemux: DatabaseManager, - isTest: true, - isElectron: false, - }); + const regionalModels = await getRegionalModels(countryCode); + await fyo.db.createNewDatabase(':memory:', countryCode); + await fyo.initializeAndRegister(models, regionalModels); - const regionalModels = await getRegionalModels(countryCode); - await fyo.db.createNewDatabase(':memory:', countryCode); - await fyo.initializeAndRegister(models, regionalModels); - }); - - this.afterEach(async function () { - await fyo.close(); - }); - - specify('getNewDoc', async function () { - for (const schemaName in schemaMap) { - const schema = schemaMap[schemaName]; - if (schema?.isSingle) { - continue; - } - - const doc = fyo.doc.getNewDoc(schemaName); + for (const schemaName in schemaMap) { + const schema = schemaMap[schemaName]; + if (schema?.isSingle) { + continue; } - }); + + const doc = fyo.doc.getNewDoc(schemaName); + t.equal(doc.schemaName, schemaName, `equal schemaNames: ${schemaName}`); + } + + await fyo.close(); }); diff --git a/fyo/tests/testObservable.spec.ts b/fyo/tests/testObservable.spec.ts index 23cfa386..43172306 100644 --- a/fyo/tests/testObservable.spec.ts +++ b/fyo/tests/testObservable.spec.ts @@ -1,131 +1,84 @@ -import * as assert from 'assert'; +import { strictEqual } from 'assert'; import Observable from 'fyo/utils/observable'; -import 'mocha'; +import test from 'tape'; enum ObsEvent { A = 'event-a', B = 'event-b', } -describe('Observable', function () { - const obs = new Observable(); - let counter = 0; - const params = { aOne: 18, aTwo: 21, b: 42 }; +const obs = new Observable(); +let counter = 0; +const params = { aOne: 18, aTwo: 21, b: 42 }; - const listenerAOnce = (value: number) => { - assert.strictEqual(params.aOne, value, 'listenerAOnce'); - }; +const listenerAOnce = (value: number) => { + strictEqual(params.aOne, value, 'listenerAOnce'); +}; - const listenerAEvery = (value: number) => { - if (counter === 0) { - assert.strictEqual(params.aOne, value, 'listenerAEvery 0'); - } else if (counter === 1) { - assert.strictEqual(params.aTwo, value, 'listenerAEvery 1'); - } else { - throw new Error("this shouldn't run"); - } - counter += 1; - }; +const listenerAEvery = (value: number) => { + if (counter === 0) { + strictEqual(params.aOne, value, 'listenerAEvery 0'); + } else if (counter === 1) { + strictEqual(params.aTwo, value, 'listenerAEvery 1'); + } else { + throw new Error("this shouldn't run"); + } + counter += 1; +}; - const listenerBOnce = (value: number) => { - assert.strictEqual(params.b, value, 'listenerBOnce'); - }; +const listenerBOnce = (value: number) => { + strictEqual(params.b, value, 'listenerBOnce'); +}; - specify('set A One', function () { - assert.strictEqual(obs.hasListener(ObsEvent.A), false, 'pre'); +test('set A One', function (t) { + t.equal(obs.hasListener(ObsEvent.A), false, 'pre'); - obs.once(ObsEvent.A, listenerAOnce); - assert.strictEqual(obs.hasListener(ObsEvent.A), true, 'non specific'); - assert.strictEqual( - obs.hasListener(ObsEvent.A, listenerAOnce), - true, - 'specific once' - ); - assert.strictEqual( - obs.hasListener(ObsEvent.A, listenerAEvery), - false, - 'specific every' - ); - }); - - specify('set A Two', function () { - obs.on(ObsEvent.A, listenerAEvery); - assert.strictEqual(obs.hasListener(ObsEvent.A), true, 'non specific'); - assert.strictEqual( - obs.hasListener(ObsEvent.A, listenerAOnce), - true, - 'specific once' - ); - assert.strictEqual( - obs.hasListener(ObsEvent.A, listenerAEvery), - true, - 'specific every' - ); - }); - - specify('set B', function () { - assert.strictEqual(obs.hasListener(ObsEvent.B), false, 'pre'); - - obs.once(ObsEvent.B, listenerBOnce); - assert.strictEqual( - obs.hasListener(ObsEvent.A, listenerBOnce), - false, - 'specific false' - ); - assert.strictEqual( - obs.hasListener(ObsEvent.B, listenerBOnce), - true, - 'specific true' - ); - }); - - specify('trigger A 0', async function () { - await obs.trigger(ObsEvent.A, params.aOne); - assert.strictEqual(obs.hasListener(ObsEvent.A), true, 'non specific'); - assert.strictEqual( - obs.hasListener(ObsEvent.A, listenerAOnce), - false, - 'specific' - ); - }); - - specify('trigger A 1', async function () { - assert.strictEqual( - obs.hasListener(ObsEvent.A, listenerAEvery), - true, - 'specific pre' - ); - await obs.trigger(ObsEvent.A, params.aTwo); - assert.strictEqual( - obs.hasListener(ObsEvent.A, listenerAEvery), - true, - 'specific post' - ); - }); - - specify('trigger B', async function () { - assert.strictEqual( - obs.hasListener(ObsEvent.B, listenerBOnce), - true, - 'specific pre' - ); - await obs.trigger(ObsEvent.B, params.b); - assert.strictEqual( - obs.hasListener(ObsEvent.B, listenerBOnce), - false, - 'specific post' - ); - }); - - specify('remove A', async function () { - obs.off(ObsEvent.A, listenerAEvery); - assert.strictEqual( - obs.hasListener(ObsEvent.A, listenerAEvery), - false, - 'specific pre' - ); - - assert.strictEqual(counter, 2, 'incorrect counter'); - await obs.trigger(ObsEvent.A, 777); - }); + obs.once(ObsEvent.A, listenerAOnce); + t.equal(obs.hasListener(ObsEvent.A), true, 'non specific'); + t.equal(obs.hasListener(ObsEvent.A, listenerAOnce), true, 'specific once'); + t.equal(obs.hasListener(ObsEvent.A, listenerAEvery), false, 'specific every'); + t.end() +}); + +test('set A Two', function (t) { + obs.on(ObsEvent.A, listenerAEvery); + t.equal(obs.hasListener(ObsEvent.A), true, 'non specific'); + t.equal(obs.hasListener(ObsEvent.A, listenerAOnce), true, 'specific once'); + t.equal(obs.hasListener(ObsEvent.A, listenerAEvery), true, 'specific every'); + t.end() +}); + +test('set B', function (t) { + t.equal(obs.hasListener(ObsEvent.B), false, 'pre'); + + obs.once(ObsEvent.B, listenerBOnce); + t.equal(obs.hasListener(ObsEvent.A, listenerBOnce), false, 'specific false'); + t.equal(obs.hasListener(ObsEvent.B, listenerBOnce), true, 'specific true'); + t.end() +}); + +test('trigger A 0', async function (t) { + await obs.trigger(ObsEvent.A, params.aOne); + t.equal(obs.hasListener(ObsEvent.A), true, 'non specific'); + t.equal(obs.hasListener(ObsEvent.A, listenerAOnce), false, 'specific'); +}); + +test('trigger A 1', async function (t) { + t.equal(obs.hasListener(ObsEvent.A, listenerAEvery), true, 'specific pre'); + await obs.trigger(ObsEvent.A, params.aTwo); + t.equal(obs.hasListener(ObsEvent.A, listenerAEvery), true, 'specific post'); +}); + +test('trigger B', async function (t) { + t.equal(obs.hasListener(ObsEvent.B, listenerBOnce), true, 'specific pre'); + await obs.trigger(ObsEvent.B, params.b); + t.equal(obs.hasListener(ObsEvent.B, listenerBOnce), false, 'specific post'); +}); + +test('remove A', async function (t) { + obs.off(ObsEvent.A, listenerAEvery); + t.equal(obs.hasListener(ObsEvent.A, listenerAEvery), false, 'specific pre'); + + t.equal(counter, 2, 'incorrect counter'); + await obs.trigger(ObsEvent.A, 777); }); diff --git a/package.json b/package.json index 17a23658..2c90a154 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "electron:serve": "vue-cli-service electron:serve", "script:translate": "scripts/runner.sh scripts/generateTranslations.ts", "script:profile": "scripts/profile.sh", - "test": "scripts/runner.sh ./node_modules/.bin/mocha ./**/tests/**/*.spec.ts --exit" + "test": "scripts/runner.sh ./node_modules/.bin/tape ./**/tests/**/*.spec.ts | tap-spec" }, "dependencies": { "@popperjs/core": "^2.10.2", @@ -43,6 +43,7 @@ "@types/mocha": "^9.1.0", "@types/node": "^17.0.23", "@types/node-fetch": "^2.6.1", + "@types/tape": "^4.13.2", "@typescript-eslint/eslint-plugin": "^4.15.1", "@typescript-eslint/parser": "^4.15.1", "@vue/cli-plugin-babel": "^4.5.0", @@ -65,11 +66,12 @@ "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-vue": "^7.0.0", "lint-staged": "^11.2.6", - "mocha": "^9.2.2", "postcss": "^8", "prettier": "^2.4.1", "raw-loader": "^4.0.2", "tailwindcss": "npm:@tailwindcss/postcss7-compat", + "tap-spec": "^5.0.0", + "tape": "^5.6.1", "ts-node": "^10.7.0", "tsconfig-paths": "^3.14.1", "tslib": "^2.3.1", diff --git a/schemas/tests/testSchemaBuilder.spec.ts b/schemas/tests/testSchemaBuilder.spec.ts index fbec69cf..7f4e2cbc 100644 --- a/schemas/tests/testSchemaBuilder.spec.ts +++ b/schemas/tests/testSchemaBuilder.spec.ts @@ -1,224 +1,212 @@ -import * as assert from 'assert'; import { cloneDeep, isEqual } from 'lodash'; -import { describe } from 'mocha'; +import test from 'tape'; import { getMapFromList } from 'utils'; import { addMetaFields, cleanSchemas, getAbstractCombinedSchemas, getRegionalCombinedSchemas, - setSchemaNameOnFields, + setSchemaNameOnFields } from '../index'; import { metaSchemas } from '../schemas'; import { everyFieldExists, getTestSchemaMap, someFieldExists, - subtract, + subtract } from './helpers'; -describe('Schema Builder', function () { - const { appSchemaMap, regionalSchemaMap } = getTestSchemaMap(); - describe('Raw Schemas', function () { - specify('Meta Properties', function () { - assert.strictEqual(appSchemaMap.Party.isAbstract, true); - assert.strictEqual(appSchemaMap.Customer.extends, 'Party'); - assert.strictEqual(appSchemaMap.Account.isTree, true); - assert.strictEqual(appSchemaMap.JournalEntryAccount.isChild, true); - }); - - specify('Field Counts', function () { - assert.strictEqual(appSchemaMap.Account.fields?.length, 6); - assert.strictEqual(appSchemaMap.JournalEntry.fields?.length, 9); - assert.strictEqual(appSchemaMap.JournalEntryAccount.fields?.length, 3); - assert.strictEqual(appSchemaMap.Party.fields?.length, 9); - assert.strictEqual(appSchemaMap.Customer.fields?.length, undefined); - assert.strictEqual(regionalSchemaMap.Party.fields?.length, 2); - }); - - specify('Quick Edit Field Counts', function () { - assert.strictEqual(appSchemaMap.Party.quickEditFields?.length, 5); - assert.strictEqual(regionalSchemaMap.Party.quickEditFields?.length, 8); - }); - }); - - const regionalCombined = getRegionalCombinedSchemas( - appSchemaMap, - regionalSchemaMap - ); - describe('Regional Combined Schemas', function () { - specify('Field Counts', function () { - assert.strictEqual(regionalCombined.Party.fields?.length, 11); - }); - - specify('Quick Edit Field Counts', function () { - assert.strictEqual(regionalSchemaMap.Party.quickEditFields?.length, 8); - }); - - specify('Schema Equality with App Schemas', function () { - assert.strictEqual( - isEqual(regionalCombined.Account, appSchemaMap.Account), - true - ); - assert.strictEqual( - isEqual(regionalCombined.JournalEntry, appSchemaMap.JournalEntry), - true - ); - assert.strictEqual( - isEqual( - regionalCombined.JournalEntryAccount, - appSchemaMap.JournalEntryAccount - ), - true - ); - assert.strictEqual( - isEqual(regionalCombined.Customer, appSchemaMap.Customer), - true - ); - assert.strictEqual( - isEqual(regionalCombined.Party, appSchemaMap.Party), - false - ); - }); - }); - - const abstractCombined = cleanSchemas( - getAbstractCombinedSchemas(regionalCombined) - ); - describe('Abstract Combined Schemas', function () { - specify('Meta Properties', function () { - assert.strictEqual(abstractCombined.Customer!.extends, undefined); - }); - - specify('Abstract Schema Existance', function () { - assert.strictEqual(abstractCombined.Party, undefined); - }); - - specify('Field Counts', function () { - assert.strictEqual(abstractCombined.Customer!.fields?.length, 11); - }); - - specify('Quick Edit Field Counts', function () { - assert.strictEqual(abstractCombined.Customer!.quickEditFields?.length, 8); - }); - - specify('Schema Equality with App Schemas', function () { - assert.strictEqual( - isEqual(abstractCombined.Account, appSchemaMap.Account), - true - ); - assert.strictEqual( - isEqual(abstractCombined.JournalEntry, appSchemaMap.JournalEntry), - true - ); - assert.strictEqual( - isEqual( - abstractCombined.JournalEntryAccount, - appSchemaMap.JournalEntryAccount - ), - true - ); - assert.strictEqual( - isEqual(abstractCombined.Customer, appSchemaMap.Customer), - false - ); - }); - - specify('Schema Field Existance', function () { - assert.strictEqual( - everyFieldExists( - regionalSchemaMap.Party.quickEditFields ?? [], - abstractCombined.Customer! - ), - true - ); - }); - }); - - let almostFinalSchemas = cloneDeep(abstractCombined); - almostFinalSchemas = addMetaFields(almostFinalSchemas); - const finalSchemas = setSchemaNameOnFields(almostFinalSchemas); - const metaSchemaMap = getMapFromList(metaSchemas, 'name'); - const baseFieldNames = metaSchemaMap.base.fields!.map((f) => f.fieldname); - const childFieldNames = metaSchemaMap.child.fields!.map((f) => f.fieldname); - const treeFieldNames = metaSchemaMap.tree.fields!.map((f) => f.fieldname); - const submittableFieldNames = metaSchemaMap.submittable.fields!.map( - (f) => f.fieldname - ); - const allFieldNames = [ - ...baseFieldNames, - ...childFieldNames, - ...treeFieldNames, - ...submittableFieldNames, - ]; - - describe('Final Schemas', function () { - specify('Schema Name Existsance', function () { - for (const schemaName in finalSchemas) { - for (const field of finalSchemas[schemaName]?.fields!) { - assert.strictEqual(field.schemaName, schemaName); - } - } - }); - - specify('Schema Field Existance', function () { - assert.strictEqual( - everyFieldExists(baseFieldNames, finalSchemas.Customer!), - true - ); - - assert.strictEqual( - someFieldExists( - subtract(allFieldNames, baseFieldNames), - finalSchemas.Customer! - ), - false - ); - - assert.strictEqual( - everyFieldExists( - [...baseFieldNames, ...submittableFieldNames], - finalSchemas.JournalEntry! - ), - true - ); - - assert.strictEqual( - someFieldExists( - subtract(allFieldNames, baseFieldNames, submittableFieldNames), - finalSchemas.JournalEntry! - ), - false - ); - - assert.strictEqual( - everyFieldExists(childFieldNames, finalSchemas.JournalEntryAccount!), - true - ); - - assert.strictEqual( - someFieldExists( - subtract(allFieldNames, childFieldNames), - finalSchemas.JournalEntryAccount! - ), - false - ); - - assert.strictEqual( - everyFieldExists( - [...treeFieldNames, ...baseFieldNames], - finalSchemas.Account! - ), - true - ); - - assert.strictEqual( - someFieldExists( - subtract(allFieldNames, treeFieldNames, baseFieldNames), - finalSchemas.Account! - ), - false - ); - }); - }); +const { appSchemaMap, regionalSchemaMap } = getTestSchemaMap(); +test('Meta Properties', function (t) { + t.equal(appSchemaMap.Party.isAbstract, true); + t.equal(appSchemaMap.Customer.extends, 'Party'); + t.equal(appSchemaMap.Account.isTree, true); + t.equal(appSchemaMap.JournalEntryAccount.isChild, true); + t.end(); +}); + +test('Field Counts', function (t) { + t.equal(appSchemaMap.Account.fields?.length, 6); + t.equal(appSchemaMap.JournalEntry.fields?.length, 9); + t.equal(appSchemaMap.JournalEntryAccount.fields?.length, 3); + t.equal(appSchemaMap.Party.fields?.length, 9); + t.equal(appSchemaMap.Customer.fields?.length, undefined); + t.equal(regionalSchemaMap.Party.fields?.length, 2); + t.end(); +}); + +test('Quick Edit Field Counts', function (t) { + t.equal(appSchemaMap.Party.quickEditFields?.length, 5); + t.equal(regionalSchemaMap.Party.quickEditFields?.length, 8); + t.end(); +}); + +const regionalCombined = getRegionalCombinedSchemas( + appSchemaMap, + regionalSchemaMap +); + +test('Field Counts', function (t) { + t.equal(regionalCombined.Party.fields?.length, 11); + t.end(); +}); + +test('Quick Edit Field Counts', function (t) { + t.equal(regionalSchemaMap.Party.quickEditFields?.length, 8); + t.end(); +}); + +test('Schema Equality with App Schemas', function (t) { + t.equal(isEqual(regionalCombined.Account, appSchemaMap.Account), true); + t.equal( + isEqual(regionalCombined.JournalEntry, appSchemaMap.JournalEntry), + true + ); + t.equal( + isEqual( + regionalCombined.JournalEntryAccount, + appSchemaMap.JournalEntryAccount + ), + true + ); + t.equal(isEqual(regionalCombined.Customer, appSchemaMap.Customer), true); + t.equal(isEqual(regionalCombined.Party, appSchemaMap.Party), false); + t.end(); +}); + +const abstractCombined = cleanSchemas( + getAbstractCombinedSchemas(regionalCombined) +); + +test('Meta Properties', function (t) { + t.equal(abstractCombined.Customer!.extends, undefined); + t.end(); +}); + +test('Abstract Schema Existance', function (t) { + t.equal(abstractCombined.Party, undefined); + t.end(); +}); + +test('Field Counts', function (t) { + t.equal(abstractCombined.Customer!.fields?.length, 11); + t.end(); +}); + +test('Quick Edit Field Counts', function (t) { + t.equal(abstractCombined.Customer!.quickEditFields?.length, 8); + t.end(); +}); + +test('Schema Equality with App Schemas', function (t) { + t.equal(isEqual(abstractCombined.Account, appSchemaMap.Account), true); + t.equal( + isEqual(abstractCombined.JournalEntry, appSchemaMap.JournalEntry), + true + ); + t.equal( + isEqual( + abstractCombined.JournalEntryAccount, + appSchemaMap.JournalEntryAccount + ), + true + ); + t.equal(isEqual(abstractCombined.Customer, appSchemaMap.Customer), false); + t.end(); +}); + +test('Schema Field Existance', function (t) { + t.equal( + everyFieldExists( + regionalSchemaMap.Party.quickEditFields ?? [], + abstractCombined.Customer! + ), + true + ); + t.end(); +}); + +let almostFinalSchemas = cloneDeep(abstractCombined); +almostFinalSchemas = addMetaFields(almostFinalSchemas); +const finalSchemas = setSchemaNameOnFields(almostFinalSchemas); +const metaSchemaMap = getMapFromList(metaSchemas, 'name'); +const baseFieldNames = metaSchemaMap.base.fields!.map((f) => f.fieldname); +const childFieldNames = metaSchemaMap.child.fields!.map((f) => f.fieldname); +const treeFieldNames = metaSchemaMap.tree.fields!.map((f) => f.fieldname); +const submittableFieldNames = metaSchemaMap.submittable.fields!.map( + (f) => f.fieldname +); +const allFieldNames = [ + ...baseFieldNames, + ...childFieldNames, + ...treeFieldNames, + ...submittableFieldNames, +]; + +test('Schema Name Existsance', function (t) { + for (const schemaName in finalSchemas) { + for (const field of finalSchemas[schemaName]?.fields!) { + t.equal(field.schemaName, schemaName); + } + } + t.end(); +}); + +test('Schema Field Existance', function (t) { + t.equal(everyFieldExists(baseFieldNames, finalSchemas.Customer!), true); + + t.equal( + someFieldExists( + subtract(allFieldNames, baseFieldNames), + finalSchemas.Customer! + ), + false + ); + + t.equal( + everyFieldExists( + [...baseFieldNames, ...submittableFieldNames], + finalSchemas.JournalEntry! + ), + true + ); + + t.equal( + someFieldExists( + subtract(allFieldNames, baseFieldNames, submittableFieldNames), + finalSchemas.JournalEntry! + ), + false + ); + + t.equal( + everyFieldExists(childFieldNames, finalSchemas.JournalEntryAccount!), + true + ); + + t.equal( + someFieldExists( + subtract(allFieldNames, childFieldNames), + finalSchemas.JournalEntryAccount! + ), + false + ); + + t.equal( + everyFieldExists( + [...treeFieldNames, ...baseFieldNames], + finalSchemas.Account! + ), + true + ); + + t.equal( + someFieldExists( + subtract(allFieldNames, treeFieldNames, baseFieldNames), + finalSchemas.Account! + ), + false + ); + + t.end(); }); diff --git a/tests/helpers.ts b/tests/helpers.ts index 415d8a12..951cc0e9 100644 --- a/tests/helpers.ts +++ b/tests/helpers.ts @@ -1,4 +1,7 @@ +import { DatabaseManager } from 'backend/database/manager'; import { config } from 'dotenv'; +import { Fyo } from 'fyo'; +import { DummyAuthDemux } from 'fyo/tests/helpers'; import { SetupWizardOptions } from 'src/setup/types'; import { getFiscalYear } from 'utils/misc'; @@ -21,3 +24,12 @@ export function getTestDbPath(dbPath?: string) { config(); return dbPath ?? process.env.TEST_DB_PATH ?? ':memory:'; } + +export function getTestFyo(): Fyo { + return new Fyo({ + DatabaseDemux: DatabaseManager, + AuthDemux: DummyAuthDemux, + isTest: true, + isElectron: false, + }); +} diff --git a/tests/testSetupInstance.spec.ts b/tests/testSetupInstance.spec.ts index f2577a2b..6c56cefc 100644 --- a/tests/testSetupInstance.spec.ts +++ b/tests/testSetupInstance.spec.ts @@ -1,78 +1,66 @@ -import * as assert from 'assert'; -import { DatabaseManager } from 'backend/database/manager'; import { assertDoesNotThrow } from 'backend/database/tests/helpers'; -import { Fyo } from 'fyo'; -import { DummyAuthDemux } from 'fyo/tests/helpers'; -import 'mocha'; import setupInstance from 'src/setup/setupInstance'; import { SetupWizardOptions } from 'src/setup/types'; +import test from 'tape'; import { getValueMapFromList } from 'utils'; -import { getTestDbPath, getTestSetupWizardOptions } from './helpers'; +import { + getTestDbPath, + getTestFyo, + getTestSetupWizardOptions +} from './helpers'; -describe('setupInstance', function () { - const dbPath = getTestDbPath(); - const setupOptions = getTestSetupWizardOptions(); +const dbPath = getTestDbPath(); +const setupOptions = getTestSetupWizardOptions(); +const fyo = getTestFyo(); - let fyo: Fyo; - - this.beforeAll(function () { - fyo = new Fyo({ - DatabaseDemux: DatabaseManager, - AuthDemux: DummyAuthDemux, - isTest: true, - isElectron: false, - }); - }); - - this.afterAll(async function () { - await fyo.close(); - }); - - specify('setupInstance', async function () { - await assertDoesNotThrow(async () => { - await setupInstance(dbPath, setupOptions, fyo); - }, 'setup instance failed'); - }); - - specify('check setup Singles', async function () { - const setupFields = [ - 'companyName', - 'country', - 'fullname', - 'email', - 'bankName', - 'fiscalYearStart', - 'fiscalYearEnd', - 'currency', - ]; - - const setupSingles = await fyo.db.getSingleValues(...setupFields); - const singlesMap = getValueMapFromList(setupSingles, 'fieldname', 'value'); - - for (const field of setupFields) { - let dbValue = singlesMap[field]; - const optionsValue = setupOptions[field as keyof SetupWizardOptions]; - - if (dbValue instanceof Date) { - dbValue = dbValue.toISOString().split('T')[0]; - } - - assert.strictEqual( - dbValue as string, - optionsValue, - `${field} mismatch (${dbValue},${optionsValue})` - ); - } - }); - - specify('check null singles', async function () { - const nullFields = ['gstin', 'logo', 'phone', 'address']; - const nullSingles = await fyo.db.getSingleValues(...nullFields); - - assert.strictEqual( - nullSingles.length, - 0, - `null singles found ${JSON.stringify(nullSingles)}` - ); - }); +test('setupInstance', async () => { + await assertDoesNotThrow(async () => { + await setupInstance(dbPath, setupOptions, fyo); + }, 'setup instance failed'); +}); + +test('check setup Singles', async (t) => { + const setupFields = [ + 'companyName', + 'country', + 'fullname', + 'email', + 'bankName', + 'fiscalYearStart', + 'fiscalYearEnd', + 'currency', + ]; + + const setupSingles = await fyo.db.getSingleValues(...setupFields); + const singlesMap = getValueMapFromList(setupSingles, 'fieldname', 'value'); + + for (const field of setupFields) { + let dbValue = singlesMap[field]; + const optionsValue = setupOptions[field as keyof SetupWizardOptions]; + + if (dbValue instanceof Date) { + dbValue = dbValue.toISOString().split('T')[0]; + } + + t.equal( + dbValue as string, + optionsValue, + `${field}: (${dbValue}, ${optionsValue})` + ); + } +}); + +test('check null singles', async (t) => { + const nullFields = ['gstin', 'logo', 'phone', 'address']; + const nullSingles = await fyo.db.getSingleValues(...nullFields); + + t.equal( + nullSingles.length, + 0, + `null singles: ${JSON.stringify(nullSingles)}` + ); +}); + +test.onFinish(async () => { + await fyo.close(); }); diff --git a/yarn.lock b/yarn.lock index 914036f2..f04d69a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1594,6 +1594,13 @@ resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== +"@types/tape@^4.13.2": + version "4.13.2" + resolved "https://registry.yarnpkg.com/@types/tape/-/tape-4.13.2.tgz#77215c065b1c7840da3ca5e061337bb4c7258122" + integrity sha512-V1ez/RtYRGN9cNYApw5xf27DpMkTB0033X6a2i3KUmKhSojBfbWN0i3EgZxboUG96WJLHLdOyZ01aiZwVW5aSA== + dependencies: + "@types/node" "*" + "@types/uglify-js@*": version "3.13.1" resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea" @@ -1725,11 +1732,6 @@ "@typescript-eslint/types" "4.33.0" eslint-visitor-keys "^2.0.0" -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - "@vue/babel-helper-vue-jsx-merge-props@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz#31624a7a505fb14da1d58023725a4c5f270e6a81" @@ -2583,16 +2585,16 @@ ansi-align@^3.0.0: dependencies: string-width "^4.1.0" -ansi-colors@4.1.1, 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== - ansi-colors@^3.0.0: version "3.2.4" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== +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== + ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -2802,6 +2804,16 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.every@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/array.prototype.every/-/array.prototype.every-1.1.3.tgz#31f01b48e1160bc4b49ecab246bf7f765c6686f9" + integrity sha512-vWnriJI//SOMOWtXbU/VXhJ/InfnNHPF6BLKn5WfY8xXy+NWql0fUy20GO3sdqBhCAO+qw8S/E5nJiZX+QFdCA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + is-string "^1.0.7" + arrify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" @@ -2919,6 +2931,11 @@ autoprefixer@^9, autoprefixer@^9.8.6: postcss "^7.0.32" postcss-value-parser "^4.1.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== + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -3201,11 +3218,6 @@ brorand@^1.0.1, brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" @@ -3332,6 +3344,11 @@ buffer-json@^2.0.0: resolved "https://registry.yarnpkg.com/buffer-json/-/buffer-json-2.0.0.tgz#f73e13b1e42f196fe2fd67d001c7d7107edd7c23" integrity sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw== +buffer-shims@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + integrity sha512-Zy8ZXMyxIT6RMTeY7OP/bDndfj6bwCan7SS98CEndS6deHwWPpseeHlwarNcBim+etXnF9HBc1non5JgDaJU1g== + buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -3627,7 +3644,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -3665,21 +3682,6 @@ check-types@^8.0.3: resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== -chokidar@3.5.3, chokidar@^3.3.0: - 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" - chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -3714,6 +3716,21 @@ chokidar@^3.0.2, chokidar@^3.4.1, chokidar@^3.5.2: optionalDependencies: fsevents "~2.3.2" +chokidar@^3.3.0: + 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" + chownr@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" @@ -4573,13 +4590,6 @@ debug@4, debug@4.3.4, debug@^4.3.3, debug@^4.3.4: dependencies: ms "2.1.2" -debug@4.3.3, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - debug@^3.1.1, debug@^3.2.6: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -4587,16 +4597,18 @@ debug@^3.1.1, debug@^3.2.6: dependencies: ms "^2.1.1" +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - 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" @@ -4628,6 +4640,27 @@ deep-equal@^1.0.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" +deep-equal@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.0.5.tgz#55cd2fe326d83f9cbf7261ef0e060b3f724c5cb9" + integrity sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw== + dependencies: + call-bind "^1.0.0" + es-get-iterator "^1.1.1" + get-intrinsic "^1.0.1" + is-arguments "^1.0.4" + is-date-object "^1.0.2" + is-regex "^1.1.1" + isarray "^2.0.5" + object-is "^1.1.4" + object-keys "^1.1.1" + object.assign "^4.1.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.3" + which-boxed-primitive "^1.0.1" + which-collection "^1.0.1" + which-typed-array "^1.1.2" + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -4692,6 +4725,14 @@ define-properties@^1.1.2, define-properties@^1.1.3: dependencies: object-keys "^1.0.12" +define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + 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" @@ -4784,11 +4825,6 @@ didyoumean@^1.2.2: resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== -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@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -4984,6 +5020,13 @@ dotenv@^9.0.2: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== +dotignore@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" + integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== + dependencies: + minimatch "^3.0.4" + duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -5300,6 +5343,50 @@ es-abstract@^1.17.2, es-abstract@^1.19.1: string.prototype.trimstart "^1.0.4" unbox-primitive "^1.0.1" +es-abstract@^1.19.0, es-abstract@^1.19.5, es-abstract@^1.20.0: + version "1.20.4" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" + integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.3" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.2" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +es-get-iterator@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" + integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.0" + has-symbols "^1.0.1" + is-arguments "^1.1.0" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.5" + isarray "^2.0.5" + es-module-lexer@^0.9.0: version "0.9.3" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" @@ -5334,16 +5421,16 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - escape-string-regexp@^1.0.2, 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= +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + eslint-config-prettier@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" @@ -5858,6 +5945,14 @@ figgy-pudding@^3.5.1: resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== +figures@^1.4.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ== + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + figures@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -5945,14 +6040,6 @@ find-cache-dir@^3.0.0, find-cache-dir@^3.3.1: make-dir "^3.0.2" pkg-dir "^4.1.0" -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.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" @@ -5976,11 +6063,6 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - flatted@^3.1.0: version "3.2.2" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" @@ -5999,6 +6081,13 @@ follow-redirects@^1.0.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.8.tgz#016996fb9a11a100566398b1c6839337d7bfa8fc" integrity sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -6197,11 +6286,26 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + 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= +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + gauge@^4.0.3: version "4.0.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" @@ -6240,6 +6344,15 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.0.1, get-intrinsic@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + 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" @@ -6345,7 +6458,7 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7.2.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7: +glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -6357,6 +6470,18 @@ glob@7.2.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glo once "^1.3.0" path-is-absolute "^1.0.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.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^8.0.1: version "8.0.3" resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" @@ -6531,11 +6656,6 @@ graceful-fs@^4.2.6: resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - gzip-size@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" @@ -6574,6 +6694,19 @@ has-bigints@^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.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-dynamic-import@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-dynamic-import/-/has-dynamic-import-2.0.1.tgz#9bca87846aa264f2ad224fcd014946f5e5182f52" + integrity sha512-X3fbtsZmwb6W7fJGR9o7x65fZoodygCrZ3TVycvghP62yYQfS0t4RS0Qcz+j5tQYUKeSWS09tHkWW6WhFV3XhQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -6584,11 +6717,23 @@ has-flag@^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== + dependencies: + get-intrinsic "^1.1.1" + 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-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-tostringtag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" @@ -6671,7 +6816,7 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -he@1.2.0, he@1.2.x: +he@1.2.x: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -7163,7 +7308,7 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-arguments@^1.0.4: +is-arguments@^1.0.4, is-arguments@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -7215,6 +7360,11 @@ is-buffer@^1.1.5: 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.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" @@ -7260,6 +7410,13 @@ is-core-module@^2.2.0, is-core-module@^2.8.0, is-core-module@^2.8.1: dependencies: has "^1.0.3" +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + 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" @@ -7274,7 +7431,7 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.2: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -7326,6 +7483,11 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= +is-finite@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + 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" @@ -7375,11 +7537,21 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= +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.1" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + is-npm@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" @@ -7443,11 +7615,6 @@ is-plain-obj@^1.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - is-plain-obj@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" @@ -7460,7 +7627,7 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-regex@^1.0.4, is-regex@^1.1.4: +is-regex@^1.0.4, is-regex@^1.1.1, 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== @@ -7478,11 +7645,23 @@ is-resolvable@^1.0.0: resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== +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-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== + dependencies: + call-bind "^1.0.2" + is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -7507,6 +7686,17 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" +is-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.9.tgz#246d77d2871e7d9f5aeb1d54b9f52c71329ece67" + integrity sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.20.0" + for-each "^0.3.3" + has-tostringtag "^1.0.0" + 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" @@ -7517,6 +7707,11 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-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-weakref@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" @@ -7524,6 +7719,21 @@ is-weakref@^1.0.1: dependencies: call-bind "^1.0.0" +is-weakref@^1.0.2: + 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== + dependencies: + call-bind "^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== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -7551,6 +7761,11 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isbinaryfile@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" @@ -7651,13 +7866,6 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@4.1.0, js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" @@ -7666,6 +7874,13 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -7993,13 +8208,6 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -8070,14 +8278,6 @@ lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@4.1.0, log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -8085,6 +8285,14 @@ log-symbols@^2.2.0: dependencies: chalk "^2.0.1" +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + log-update@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" @@ -8424,14 +8632,7 @@ minimatch@3.0.4, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimatch@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" - integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.1.2: +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== @@ -8552,36 +8753,6 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mocha@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" - integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== - dependencies: - "@ungap/promise-all-settled" "1.1.2" - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.3" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.2.0" - growl "1.10.5" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "4.2.1" - ms "2.1.3" - nanoid "3.3.1" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - which "2.0.2" - workerpool "6.2.0" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - modern-normalize@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/modern-normalize/-/modern-normalize-1.1.0.tgz#da8e80140d9221426bd4f725c6e11283d34f90b7" @@ -8651,11 +8822,6 @@ nan@^2.12.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== -nanoid@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" - integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== - nanoid@^3.1.22, nanoid@^3.1.30: version "3.1.32" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.32.tgz#8f96069e6239cc0a9ae8c0d3b41a3b4933a88c0a" @@ -8986,7 +9152,12 @@ object-inspect@^1.11.0, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== -object-is@^1.0.1: +object-inspect@^1.12.2: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + +object-is@^1.0.1, object-is@^1.1.4, 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== @@ -9016,6 +9187,16 @@ object.assign@^4.1.0, object.assign@^4.1.2: 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== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: version "2.1.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" @@ -9211,13 +9392,6 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - p-map@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" @@ -9309,6 +9483,11 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse-ms@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" + integrity sha512-LpH1Cf5EYuVjkBvCDBYvkUPh+iv2bk3FHflxHkpCYT0/FZ1d3N3uJaLiHr4yGuMcFUhv6eAivitTvWZI4B/chg== + parse5-htmlparser2-tree-adapter@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" @@ -9507,6 +9686,11 @@ plist@^3.0.1, plist@^3.0.4: base64-js "^1.5.1" xmlbuilder "^9.0.7" +plur@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156" + integrity sha512-qSnKBSZeDY8ApxwhfVIwKwF36KVJqb1/9nzYYq3j3vdwocULCXT8f8fQGkiw1Nk9BGfxiDagEe/pwakA+bOBqw== + pnp-webpack-plugin@^1.6.4: version "1.7.0" resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz#65741384f6d8056f36e2255a8d67ffc20866f5c9" @@ -10007,6 +10191,20 @@ pretty-hrtime@^1.0.3: resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= +pretty-ms@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-2.1.0.tgz#4257c256df3fb0b451d6affaab021884126981dc" + integrity sha512-H2enpsxzDhuzRl3zeSQpQMirn8dB0Z/gxW96j06tMfTviUWvX14gjKb7qd1gtkUyYhDPuoNe00K5PqNvy2oQNg== + dependencies: + is-finite "^1.0.1" + parse-ms "^1.0.0" + plur "^1.0.0" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + integrity sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -10252,6 +10450,11 @@ rc@^1.2.7, rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" +re-emitter@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/re-emitter/-/re-emitter-1.1.3.tgz#fa9e319ffdeeeb35b27296ef0f3d374dac2f52a7" + integrity sha512-bHJul9CWcocrS+w5e5QrKYXV9NkbSA9hxSEyhYuctwm6keY9NXR2Xt/4A0vbMP0QvuwyfEyb4bkowYXv1ziEbg== + read-config-file@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.2.0.tgz#71536072330bcd62ba814f91458b12add9fc7ade" @@ -10286,6 +10489,19 @@ read-pkg@^5.1.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@2.2.9: + version "2.2.9" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" + integrity sha512-iuxqX7b7FYt08AriYECxUsK9KTXE3A/FenxIa3IPmvANHxaTP/wGIwwf+IidvvIDk/MsCp/oEV6A8CXo4SDcCg== + dependencies: + buffer-shims "~1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~1.0.0" + util-deprecate "~1.0.1" + readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" @@ -10366,6 +10582,15 @@ regexp.prototype.flags@^1.2.0: call-bind "^1.0.2" define-properties "^1.1.3" +regexp.prototype.flags@^1.3.0, regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + regexpp@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" @@ -10435,7 +10660,7 @@ repeat-element@^1.1.2: resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== -repeat-string@^1.6.1: +repeat-string@^1.5.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= @@ -10544,6 +10769,15 @@ resolve@^1.3.2: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^2.0.0-next.3: + version "2.0.0-next.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -10574,6 +10808,13 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +resumer@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" + integrity sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w== + dependencies: + through "~2.3.4" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -10683,6 +10924,15 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -10841,13 +11091,6 @@ serialize-error@^7.0.1: dependencies: type-fest "^0.13.1" -serialize-javascript@6.0.0, serialize-javascript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -10862,6 +11105,13 @@ serialize-javascript@^5.0.1: dependencies: randombytes "^2.1.0" +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" @@ -10977,7 +11227,7 @@ shell-quote@^1.6.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== -side-channel@^1.0.4: +side-channel@^1.0.3, 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== @@ -11255,6 +11505,13 @@ split2@^4.1.0: resolved "https://registry.yarnpkg.com/split2/-/split2-4.1.0.tgz#101907a24370f85bb782f08adaabe4e281ecf809" integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ== +split@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.0.tgz#c4395ce683abcd254bc28fe1dabb6e5c27dcffae" + integrity sha512-3SVfJe2A0WZg3D+ZEtXqYkvpSGAVaZ1MgufNCeHioBESCqQFsuT1VcQufiopBfJZqh92ZwQ6ddL378iUSbqVNQ== + dependencies: + through "2" + sprintf-js@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" @@ -11406,6 +11663,15 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string.prototype.trim@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.6.tgz#824960787db37a9e24711802ed0c1d1c0254f83e" + integrity sha512-8lMR2m+U0VJTPp6JjvJTtGyc4FIGq9CdRt7O9p6T0e6K4vjU+OP+SQJpbe/SBmRcCUIvNUnjsbmY6lnMp8MhsQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + 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" @@ -11414,6 +11680,15 @@ string.prototype.trimend@^1.0.4: call-bind "^1.0.2" define-properties "^1.1.3" +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.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" @@ -11422,6 +11697,15 @@ string.prototype.trimstart@^1.0.4: call-bind "^1.0.2" define-properties "^1.1.3" +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -11429,6 +11713,13 @@ string_decoder@^1.0.0, string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +string_decoder@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + integrity sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ== + dependencies: + safe-buffer "~5.1.0" + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -11493,7 +11784,7 @@ strip-indent@^2.0.0: resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= -strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -11634,6 +11925,30 @@ table@^6.0.9: resolve "^1.20.0" tmp "^0.2.1" +tap-out@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tap-out/-/tap-out-2.1.0.tgz#c093079a915036de8b835bfa3297f14458b15358" + integrity sha512-LJE+TBoVbOWhwdz4+FQk40nmbIuxJLqaGvj3WauQw3NYYU5TdjoV3C0x/yq37YAvVyi+oeBXmWnxWSjJ7IEyUw== + dependencies: + re-emitter "1.1.3" + readable-stream "2.2.9" + split "1.0.0" + trim "0.0.1" + +tap-spec@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/tap-spec/-/tap-spec-5.0.0.tgz#7329e4e66e8aa68da2a164215abbb903a7c5d352" + integrity sha512-zMDVJiE5I6Y4XGjlueGXJIX2YIkbDN44broZlnypT38Hj/czfOXrszHNNJBF/DXR8n+x6gbfSx68x04kIEHdrw== + dependencies: + chalk "^1.0.0" + duplexer "^0.1.1" + figures "^1.4.0" + lodash "^4.17.10" + pretty-ms "^2.1.0" + repeat-string "^1.5.2" + tap-out "^2.1.0" + through2 "^2.0.0" + tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -11644,6 +11959,33 @@ tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tape@^5.6.1: + version "5.6.1" + resolved "https://registry.yarnpkg.com/tape/-/tape-5.6.1.tgz#bbc1420e5e13003cbd7e2cf0efaa091bfb5c970a" + integrity sha512-reNzS3rzsJtKk0f+zJx2XlzIsjJXlIcOIrIxk5shHAG/DzW3BKyMg8UfN79oluYlcWo4lIt56ahLqwgpRT4idg== + dependencies: + array.prototype.every "^1.1.3" + call-bind "^1.0.2" + deep-equal "^2.0.5" + defined "^1.0.0" + dotignore "^0.1.2" + for-each "^0.3.3" + get-package-type "^0.1.0" + glob "^7.2.3" + has "^1.0.3" + has-dynamic-import "^2.0.1" + inherits "^2.0.4" + is-regex "^1.1.4" + minimist "^1.2.6" + object-inspect "^1.12.2" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + resolve "^2.0.0-next.3" + resumer "^0.0.0" + string.prototype.trim "^1.2.6" + through "^2.3.8" + tar-fs@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" @@ -11811,7 +12153,7 @@ through2@^2.0.0, through2@~2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.6, through@^2.3.8: +through@2, through@^2.3.6, through@^2.3.8, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -11934,6 +12276,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ== + truncate-utf8-bytes@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" @@ -12143,6 +12490,16 @@ unbox-primitive@^1.0.1: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + 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" @@ -12818,7 +13175,7 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -which-boxed-primitive@^1.0.2: +which-boxed-primitive@^1.0.1, 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== @@ -12829,17 +13186,32 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +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== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + 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= -which@2.0.2, which@^2.0.1, which@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== +which-typed-array@^1.1.2: + version "1.1.8" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.8.tgz#0cfd53401a6f334d90ed1125754a42ed663eb01f" + integrity sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw== dependencies: - isexe "^2.0.0" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.20.0" + for-each "^0.3.3" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.9" which@^1.2.9: version "1.3.1" @@ -12848,6 +13220,13 @@ which@^1.2.9: dependencies: isexe "^2.0.0" +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + wide-align@^1.1.0, wide-align@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" @@ -12881,11 +13260,6 @@ worker-rpc@^0.1.0: dependencies: microevent.ts "~0.1.1" -workerpool@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" - integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== - wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" @@ -12990,11 +13364,6 @@ yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" @@ -13013,29 +13382,6 @@ yargs-parser@^21.0.0: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@16.2.0, yargs@^16.0.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - yargs@^13.3.2: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" @@ -13052,6 +13398,19 @@ yargs@^13.3.2: y18n "^4.0.0" yargs-parser "^13.1.2" +yargs@^16.0.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@^17.0.1: version "17.2.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.2.1.tgz#e2c95b9796a0e1f7f3bf4427863b42e0418191ea"