Merge branch 'master' into feature/relational-fields

This commit is contained in:
Alexandre Bodin 2020-12-17 12:58:34 +01:00
commit aa3d7eb2e0
9 changed files with 211 additions and 176 deletions

View File

@ -12,7 +12,7 @@
"strapi": "strapi" "strapi": "strapi"
}, },
"dependencies": { "dependencies": {
"knex": "^0.20.0", "knex": "^0.21.13",
"lodash": "4.17.19", "lodash": "4.17.19",
"mysql": "^2.17.1", "mysql": "^2.17.1",
"pg": "8.4.0", "pg": "8.4.0",

View File

@ -84,7 +84,7 @@
"react-redux": "7.2.0", "react-redux": "7.2.0",
"react-router": "^5.0.0", "react-router": "^5.0.0",
"react-router-dom": "^5.0.0", "react-router-dom": "^5.0.0",
"react-select": "^3.0.8", "react-select": "^3.1.1",
"react-transition-group": "4.4.1", "react-transition-group": "4.4.1",
"react-virtualized": "^9.21.2", "react-virtualized": "^9.21.2",
"reactstrap": "8.4.1", "reactstrap": "8.4.1",

View File

@ -9,7 +9,7 @@ const { getManyRelations } = require('./utils/associations');
const createMigrationRunner = require('./migrations/create-migration-runner'); const createMigrationRunner = require('./migrations/create-migration-runner');
const draftPublishMigration = require('./migrations/draft-publish-migration'); const draftPublishMigration = require('./migrations/draft-publish-migration');
const migrateSchemas = async ({ ORM, loadedModel, definition, connection, model }) => { const migrateSchemas = async ({ ORM, loadedModel, definition, connection, model }, context) => {
// Add created_at and updated_at field if timestamp option is true // Add created_at and updated_at field if timestamp option is true
if (loadedModel.hasTimestamps) { if (loadedModel.hasTimestamps) {
definition.attributes[loadedModel.hasTimestamps[0]] = { type: 'currentTimestamp' }; definition.attributes[loadedModel.hasTimestamps[0]] = { type: 'currentTimestamp' };
@ -18,13 +18,16 @@ const migrateSchemas = async ({ ORM, loadedModel, definition, connection, model
// Equilize tables // Equilize tables
if (connection.options && connection.options.autoMigration !== false) { if (connection.options && connection.options.autoMigration !== false) {
await createOrUpdateTable({ await createOrUpdateTable(
table: loadedModel.tableName, {
attributes: definition.attributes, table: loadedModel.tableName,
definition, attributes: definition.attributes,
ORM, definition,
model, ORM,
}); model,
},
context
);
} }
// Equilize polymorphic relations // Equilize polymorphic relations
@ -42,13 +45,16 @@ const migrateSchemas = async ({ ORM, loadedModel, definition, connection, model
}; };
if (connection.options && connection.options.autoMigration !== false) { if (connection.options && connection.options.autoMigration !== false) {
await createOrUpdateTable({ await createOrUpdateTable(
table: `${loadedModel.tableName}_morph`, {
attributes, table: `${loadedModel.tableName}_morph`,
definition, attributes,
ORM, definition,
model, ORM,
}); model,
},
context
);
} }
} }
@ -85,7 +91,7 @@ const migrateSchemas = async ({ ORM, loadedModel, definition, connection, model
const table = manyRelation.tableCollectionName; const table = manyRelation.tableCollectionName;
if (connection.options && connection.options.autoMigration !== false) { if (connection.options && connection.options.autoMigration !== false) {
await createOrUpdateTable({ table, attributes, definition, ORM, model }); await createOrUpdateTable({ table, attributes, definition, ORM, model }, context);
} }
} }
} }
@ -203,7 +209,7 @@ const buildColType = ({ name, attribute, table, tableExists = false, definition,
}; };
// Equilize database tables // Equilize database tables
const createOrUpdateTable = async ({ table, attributes, definition, ORM, model }) => { const createOrUpdateTable = async ({ table, attributes, definition, ORM, model }, context) => {
const tableExists = await ORM.knex.schema.hasTable(table); const tableExists = await ORM.knex.schema.hasTable(table);
const createIdType = table => { const createIdType = table => {
@ -300,84 +306,93 @@ const createOrUpdateTable = async ({ table, attributes, definition, ORM, model }
ORM ORM
); );
if (columnsToAlter.length > 0) { const shouldRebuild =
if (definition.client === 'sqlite3') { columnsToAlter.length > 0 || (definition.client === 'sqlite3' && context.recreateSqliteTable);
const tmpTable = `tmp_${table}`;
const rebuildTable = async trx => { if (shouldRebuild) {
await trx.schema.renameTable(table, tmpTable); switch (definition.client) {
case 'sqlite3': {
const tmpTable = `tmp_${table}`;
// drop possible conflicting indexes const rebuildTable = async trx => {
await Promise.all( await trx.schema.renameTable(table, tmpTable);
attributesNames.map(key => trx.raw('DROP INDEX IF EXISTS ??', uniqueColName(table, key)))
);
// create the table // drop possible conflicting indexes
await createTable(table, { trx }); await Promise.all(
attributesNames.map(key =>
const attrs = attributesNames.filter(attributeName => trx.raw('DROP INDEX IF EXISTS ??', uniqueColName(table, key))
isColumn({ )
definition,
attribute: attributes[attributeName],
name: attributeName,
})
);
const allAttrs = ['id', ...attrs];
await trx.insert(qb => qb.select(allAttrs).from(tmpTable)).into(table);
await trx.schema.dropTableIfExists(tmpTable);
};
try {
await ORM.knex.transaction(trx => rebuildTable(trx));
} catch (err) {
if (err.message.includes('UNIQUE constraint failed')) {
strapi.log.error(
`Unique constraint fails, make sure to update your data and restart to apply the unique constraint.\n\t- ${err.stack}`
); );
} else {
strapi.log.error(`Migration failed`);
strapi.log.error(err);
}
return false; // create the table
await createTable(table, { trx });
const attrs = attributesNames.filter(attributeName =>
isColumn({
definition,
attribute: attributes[attributeName],
name: attributeName,
})
);
const allAttrs = ['id', ...attrs];
await trx.insert(qb => qb.select(allAttrs).from(tmpTable)).into(table);
await trx.schema.dropTableIfExists(tmpTable);
};
try {
await ORM.knex.transaction(trx => rebuildTable(trx));
} catch (err) {
if (err.message.includes('UNIQUE constraint failed')) {
strapi.log.error(
`Unique constraint fails, make sure to update your data and restart to apply the unique constraint.\n\t- ${err.stack}`
);
} else {
strapi.log.error(`Migration failed`);
strapi.log.error(err);
}
return false;
}
break;
} }
} else { default: {
const alterTable = async trx => { const alterTable = async trx => {
await Promise.all( await Promise.all(
columnsToAlter.map(col => { columnsToAlter.map(col => {
return ORM.knex.schema return ORM.knex.schema
.alterTable(table, tbl => { .alterTable(table, tbl => {
tbl.dropUnique(col, uniqueColName(table, col)); tbl.dropUnique(col, uniqueColName(table, col));
}) })
.catch(() => {}); .catch(() => {});
}) })
); );
await trx.schema.alterTable(table, tbl => { await trx.schema.alterTable(table, tbl => {
alterColumns(tbl, _.pick(attributes, columnsToAlter), { alterColumns(tbl, _.pick(attributes, columnsToAlter), {
tableExists, tableExists,
});
}); });
}); };
};
try { try {
await ORM.knex.transaction(trx => alterTable(trx)); await ORM.knex.transaction(trx => alterTable(trx));
} catch (err) { } catch (err) {
if (err.code === '23505' && definition.client === 'pg') { if (err.code === '23505' && definition.client === 'pg') {
strapi.log.error( strapi.log.error(
`Unique constraint fails, make sure to update your data and restart to apply the unique constraint.\n\t- ${err.message}\n\t- ${err.detail}` `Unique constraint fails, make sure to update your data and restart to apply the unique constraint.\n\t- ${err.message}\n\t- ${err.detail}`
); );
} else if (definition.client === 'mysql' && err.errno === 1062) { } else if (definition.client === 'mysql' && err.errno === 1062) {
strapi.log.error( strapi.log.error(
`Unique constraint fails, make sure to update your data and restart to apply the unique constraint.\n\t- ${err.sqlMessage}` `Unique constraint fails, make sure to update your data and restart to apply the unique constraint.\n\t- ${err.sqlMessage}`
); );
} else { } else {
strapi.log.error(`Migration failed`); strapi.log.error(`Migration failed`);
strapi.log.error(err); strapi.log.error(err);
}
return false;
} }
return false;
} }
} }
} }

View File

@ -2,27 +2,27 @@
const _ = require('lodash'); const _ = require('lodash');
const createMigrationRunner = (migrationFunction, { hooks = [] } = {}) => { const createMigrationRunner = (migrationFunction, { hooks = [] } = {}, context = {}) => {
const beforeHook = async options => { const beforeHook = async (options, context) => {
for (const migration of hooks) { for (const migration of hooks) {
if (_.isFunction(migration.before)) { if (_.isFunction(migration.before)) {
await migration.before(options); await migration.before(options, context);
} }
} }
}; };
const afterHook = async options => { const afterHook = async (options, context) => {
for (const migration of hooks.slice(0).reverse()) { for (const migration of hooks.slice(0).reverse()) {
if (_.isFunction(migration.after)) { if (_.isFunction(migration.after)) {
await migration.after(options); await migration.after(options, context);
} }
} }
}; };
const run = async options => { const run = async options => {
await beforeHook(options); await beforeHook(options, context);
await migrationFunction(options); await migrationFunction(options, context);
await afterHook(options); await afterHook(options, context);
}; };
return { return {

View File

@ -23,7 +23,7 @@ const getDraftAndPublishMigrationWay = async ({ definition, ORM }) => {
} }
}; };
const before = async ({ definition, ORM }) => { const before = async ({ definition, ORM }, context) => {
const way = await getDraftAndPublishMigrationWay({ definition, ORM }); const way = await getDraftAndPublishMigrationWay({ definition, ORM });
if (way === 'disable') { if (way === 'disable') {
@ -37,9 +37,15 @@ const before = async ({ definition, ORM }) => {
.delete() .delete()
.where(PUBLISHED_AT_ATTRIBUTE, null); .where(PUBLISHED_AT_ATTRIBUTE, null);
await ORM.knex.schema.table(definition.collectionName, table => { if (definition.client === 'sqlite3') {
table.dropColumn(PUBLISHED_AT_ATTRIBUTE); // Bug when droping column with sqlite3 https://github.com/knex/knex/issues/631
}); // Need to recreate the table
context.recreateSqliteTable = true;
} else {
await ORM.knex.schema.table(definition.collectionName, table => {
table.dropColumn(PUBLISHED_AT_ATTRIBUTE);
});
}
} }
} }
}; };

View File

@ -16,6 +16,10 @@ const dogModel = {
name: { name: {
type: 'string', type: 'string',
}, },
code: {
type: 'string',
unique: true,
},
}, },
connection: 'default', connection: 'default',
name: 'dog', name: 'dog',
@ -26,9 +30,11 @@ const dogModel = {
const dogs = [ const dogs = [
{ {
name: 'Nelson', name: 'Nelson',
code: '1',
}, },
{ {
name: 'Atos', name: 'Atos',
code: '2',
}, },
]; ];
@ -143,6 +149,24 @@ describe('Migration - draft and publish', () => {
expect(body.results[0]).toMatchObject(_.pick(data.dogs[0], ['name'])); expect(body.results[0]).toMatchObject(_.pick(data.dogs[0], ['name']));
expect(body.results[0].published_at).toBeUndefined(); expect(body.results[0].published_at).toBeUndefined();
}); });
test('Unique constraint is kept after disabling the feature', async () => {
const dogToCreate = { code: 'sameCode' };
let res = await rq({
method: 'POST',
url: `/content-manager/explorer/application::dog.dog/`,
body: dogToCreate,
});
expect(res.statusCode).toBe(200);
expect(res.body).toMatchObject(dogToCreate);
data.dogs.push(res.body);
res = await rq({
method: 'POST',
url: `/content-manager/explorer/application::dog.dog/`,
body: dogToCreate,
});
expect(res.statusCode).toBe(400);
});
}); });
}); });
}); });

View File

@ -1,24 +1,24 @@
{ {
"components.Row.generatedDate": "Last generation", "components.Row.generatedDate": "Letztes Mal generiert",
"components.Row.open": "Open", "components.Row.open": "Öffnen",
"components.Row.regenerate": "Regenerate", "components.Row.regenerate": "Neu generieren",
"containers.HomePage.Block.title": "Versions", "containers.HomePage.Block.title": "Versionen",
"containers.HomePage.Button.open": "Open the documentation", "containers.HomePage.Button.open": "Dokumentation öffnen",
"containers.HomePage.Button.update": "Update", "containers.HomePage.Button.update": "Aktualisieren",
"containers.HomePage.PluginHeader.description": "Configure the documentation plugin", "containers.HomePage.PluginHeader.description": "Einstellungen des Dokumentation-Plugins ändern",
"containers.HomePage.PluginHeader.title": "Documentation - Settings", "containers.HomePage.PluginHeader.title": "Dokumentation - Einstellungen",
"containers.HomePage.PopUpWarning.confirm": "I understand", "containers.HomePage.PopUpWarning.confirm": "Ich verstehe",
"containers.HomePage.PopUpWarning.message": "Are you sure you want to delete this version?", "containers.HomePage.PopUpWarning.message": "Sind Sie sich sicher, dass Sie diese Version löschen wollen?",
"containers.HomePage.form.password": "Password", "containers.HomePage.form.password": "Passwort",
"containers.HomePage.form.password.inputDescription": "Set the password to access the documentation", "containers.HomePage.form.password.inputDescription": "Setzen Sie ein Passwort, um die Dokumentation privat zu machen",
"containers.HomePage.form.restrictedAccess": "Restricted access", "containers.HomePage.form.restrictedAccess": "Zugriff beschränken",
"containers.HomePage.form.restrictedAccess.inputDescription": "Make the documentation endpoint private. By default, the access is public", "containers.HomePage.form.restrictedAccess.inputDescription": "Den Endpoint der Dokumentation privat machen. Dieser ist standardmäßig öffentlich.",
"containers.HomePage.form.showGeneratedFiles": "Show generated files", "containers.HomePage.form.showGeneratedFiles": "Generierte Dateien anzeigen",
"containers.HomePage.form.showGeneratedFiles.inputDescription": "Useful when you want to override the generated documentation. \nThe plugin will generate files split by model and plugin. \nBy enabling this option it will be easier to customize your documentation", "containers.HomePage.form.showGeneratedFiles.inputDescription": "Nützlich, wenn Sie die generierte Dokumentation überschreiben möchten. \nDas Plugin wird nach Modell und Plugin geteilte Dateien erzeugen. \nDurch die Aktivierung dieser Option wird es einfacher sein, Ihre Dokumentation anzupassen.",
"error.deleteDoc.versionMissing": "The version you are trying to delete does not exist.", "error.deleteDoc.versionMissing": "Die Version, die Sie zu löschen versuchen, existiert nicht.",
"error.noVersion": "A version is required", "error.noVersion": "Eine Version wird benötigt",
"error.regenerateDoc": "An error occurred while regenerating the doc", "error.regenerateDoc": "Ein Fehler ist während dem Neu-Erstellen der Dokumentation aufgetreten.",
"error.regenerateDoc.versionMissing": "The version you are trying to generate doesn't exist", "error.regenerateDoc.versionMissing": "Die Version, die Sie zu generieren versuchen, existiert nicht",
"notification.update.success": "Settings updated successfully", "notification.update.success": "Einstellungen wurden erfolgreich aktualisiert",
"plugin.name": "Dokumentation" "plugin.name": "Dokumentation"
} }

View File

@ -1,3 +1,4 @@
import de from './de.json';
import en from './en.json'; import en from './en.json';
import es from './es.json'; import es from './es.json';
import fr from './fr.json'; import fr from './fr.json';
@ -12,6 +13,7 @@ import sk from './sk.json';
import zh from './zh.json'; import zh from './zh.json';
const trads = { const trads = {
de,
en, en,
es, es,
fr, fr,

View File

@ -5625,12 +5625,7 @@ color@^3.0.0, color@^3.1.2:
color-convert "^1.9.1" color-convert "^1.9.1"
color-string "^1.5.2" color-string "^1.5.2"
colorette@1.1.0: colorette@1.2.1, colorette@^1.2.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.1.0.tgz#1f943e5a357fac10b4e0f5aaef3b14cdc1af6ec7"
integrity sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg==
colorette@^1.2.1:
version "1.2.1" version "1.2.1"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b"
integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==
@ -5670,7 +5665,7 @@ commander@2.3.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873"
integrity sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM= integrity sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=
commander@6.1.0, commander@^6.0.0: commander@6.1.0:
version "6.1.0" version "6.1.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-6.1.0.tgz#f8d722b78103141006b66f4c7ba1e97315ba75bc" resolved "https://registry.yarnpkg.com/commander/-/commander-6.1.0.tgz#f8d722b78103141006b66f4c7ba1e97315ba75bc"
integrity sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA== integrity sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA==
@ -5680,10 +5675,10 @@ commander@^2.19.0, commander@^2.20.0, commander@^2.20.3:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
commander@^4.1.1: commander@^6.0.0, commander@^6.2.0:
version "4.1.1" version "6.2.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==
commander@~2.19.0: commander@~2.19.0:
version "2.19.0" version "2.19.0"
@ -6508,10 +6503,10 @@ dateformat@^3.0.0:
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
debug@*, debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: debug@*, debug@4, debug@4.3.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0:
version "4.2.0" version "4.3.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
dependencies: dependencies:
ms "2.1.2" ms "2.1.2"
@ -9825,7 +9820,7 @@ inflight@^1.0.4:
once "^1.3.0" once "^1.3.0"
wrappy "1" wrappy "1"
inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.4" version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@ -9919,7 +9914,7 @@ interpret@^1.4.0:
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
interpret@^2.0.0: interpret@^2.2.0:
version "2.2.0" version "2.2.0"
resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
@ -11369,26 +11364,23 @@ klona@^2.0.3:
resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0"
integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==
knex@^0.20.0: knex@^0.21.13:
version "0.20.15" version "0.21.13"
resolved "https://registry.yarnpkg.com/knex/-/knex-0.20.15.tgz#b7e9e1efd9cf35d214440d9439ed21153574679d" resolved "https://registry.yarnpkg.com/knex/-/knex-0.21.13.tgz#5738db52d041d38f8bd9ab15d64f4a8ebb1e97c4"
integrity sha512-WHmvgfQfxA5v8pyb9zbskxCS1L1WmYgUbwBhHojlkmdouUOazvroUWlCr6KIKMQ8anXZh1NXOOtIUMnxENZG5Q== integrity sha512-O3Zfc7ZHWe32q5k1Z8TqzmiGYVQ9+Tiqb4wP9tPF/ho9DUrHuuy5fLVDdkwDN0gHIr+q5t+XJzNW40DkmeL7lw==
dependencies: dependencies:
colorette "1.1.0" colorette "1.2.1"
commander "^4.1.1" commander "^6.2.0"
debug "4.1.1" debug "4.3.1"
esm "^3.2.25" esm "^3.2.25"
getopts "2.2.5" getopts "2.2.5"
inherits "~2.0.4" interpret "^2.2.0"
interpret "^2.0.0"
liftoff "3.1.0" liftoff "3.1.0"
lodash "^4.17.15" lodash "^4.17.20"
mkdirp "^0.5.1" pg-connection-string "2.4.0"
pg-connection-string "2.1.0" tarn "^3.0.1"
tarn "^2.0.0"
tildify "2.0.0" tildify "2.0.0"
uuid "^7.0.1" v8flags "^3.2.0"
v8flags "^3.1.3"
known-css-properties@^0.14.0: known-css-properties@^0.14.0:
version "0.14.0" version "0.14.0"
@ -14209,12 +14201,7 @@ performance-now@^2.1.0:
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
pg-connection-string@2.1.0: pg-connection-string@2.4.0, pg-connection-string@^2.4.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.1.0.tgz#e07258f280476540b24818ebb5dca29e101ca502"
integrity sha512-bhlV7Eq09JrRIvo1eKngpwuqKtJnNhZdpdOlvrPrA4dxqXPjxSrbNrfnIDmTpwMyRszrcV4kU5ZA4mMsQUrjdg==
pg-connection-string@^2.4.0:
version "2.4.0" version "2.4.0"
resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.4.0.tgz#c979922eb47832999a204da5dbe1ebf2341b6a10" resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.4.0.tgz#c979922eb47832999a204da5dbe1ebf2341b6a10"
integrity sha512-3iBXuv7XKvxeMrIgym7njT+HlZkwZqqGX4Bu9cci8xHZNT+Um1gWKqCsAzcC0d95rcKMU5WBg6YRUcHyV0HZKQ== integrity sha512-3iBXuv7XKvxeMrIgym7njT+HlZkwZqqGX4Bu9cci8xHZNT+Um1gWKqCsAzcC0d95rcKMU5WBg6YRUcHyV0HZKQ==
@ -15598,10 +15585,10 @@ react-router@^5.0.0:
tiny-invariant "^1.0.2" tiny-invariant "^1.0.2"
tiny-warning "^1.0.0" tiny-warning "^1.0.0"
react-select@^3.0.8: react-select@^3.1.1:
version "3.1.0" version "3.1.1"
resolved "https://registry.yarnpkg.com/react-select/-/react-select-3.1.0.tgz#ab098720b2e9fe275047c993f0d0caf5ded17c27" resolved "https://registry.yarnpkg.com/react-select/-/react-select-3.1.1.tgz#156a5b4a6c22b1e3d62a919cb1fd827adb4060bc"
integrity sha512-wBFVblBH1iuCBprtpyGtd1dGMadsG36W5/t2Aj8OE6WbByDg5jIFyT7X5gT+l0qmT5TqWhxX+VsKJvCEl2uL9g== integrity sha512-HjC6jT2BhUxbIbxMZWqVcDibrEpdUJCfGicN0MMV+BQyKtCaPTgFekKWiOizSCy4jdsLMGjLqcFGJMhVGWB0Dg==
dependencies: dependencies:
"@babel/runtime" "^7.4.4" "@babel/runtime" "^7.4.4"
"@emotion/cache" "^10.0.9" "@emotion/cache" "^10.0.9"
@ -15635,13 +15622,6 @@ react-test-renderer@^16.0.0-0:
react-is "^16.8.6" react-is "^16.8.6"
scheduler "^0.19.1" scheduler "^0.19.1"
react-tooltip@4.2.11:
version "4.2.11"
resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-4.2.11.tgz#244d4d1833c583160c4e6c95a8a89e0fb320e18a"
integrity sha512-exREte3mK/qbeuQpFbEL3ImdF5/TSAb+x/T7pkVfKmgVcfQLZKHSgLN+Msv7ZOHxaWNJwuCrSsCAy/iTGoPigg==
dependencies:
prop-types "^15.7.2"
uuid "^7.0.3"
react-test-renderer@^17.0.1: react-test-renderer@^17.0.1:
version "17.0.1" version "17.0.1"
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-17.0.1.tgz#3187e636c3063e6ae498aedf21ecf972721574c7" resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-17.0.1.tgz#3187e636c3063e6ae498aedf21ecf972721574c7"
@ -15652,6 +15632,14 @@ react-test-renderer@^17.0.1:
react-shallow-renderer "^16.13.1" react-shallow-renderer "^16.13.1"
scheduler "^0.20.1" scheduler "^0.20.1"
react-tooltip@4.2.11:
version "4.2.11"
resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-4.2.11.tgz#244d4d1833c583160c4e6c95a8a89e0fb320e18a"
integrity sha512-exREte3mK/qbeuQpFbEL3ImdF5/TSAb+x/T7pkVfKmgVcfQLZKHSgLN+Msv7ZOHxaWNJwuCrSsCAy/iTGoPigg==
dependencies:
prop-types "^15.7.2"
uuid "^7.0.3"
react-transition-group@4.4.1, react-transition-group@^4.3.0: react-transition-group@4.4.1, react-transition-group@^4.3.0:
version "4.4.1" version "4.4.1"
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9"
@ -18418,10 +18406,10 @@ tar@^4, tar@^4.4.10, tar@^4.4.12, tar@^4.4.8:
safe-buffer "^5.1.2" safe-buffer "^5.1.2"
yallist "^3.0.3" yallist "^3.0.3"
tarn@^2.0.0: tarn@^3.0.1:
version "2.0.0" version "3.0.1"
resolved "https://registry.yarnpkg.com/tarn/-/tarn-2.0.0.tgz#c68499f69881f99ae955b4317ca7d212d942fdee" resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.1.tgz#ebac2c6dbc6977d34d4526e0a7814200386a8aec"
integrity sha512-7rNMCZd3s9bhQh47ksAQd92ADFcJUjjbyOvyFjNLwTPpGieFHMC84S+LOzw0fx1uh6hnDz/19r8CPMnIjJlMMA== integrity sha512-6usSlV9KyHsspvwu2duKH+FMUhqJnAh6J5J/4MITl8s94iSUQTLkJggdiewKv4RyARQccnigV48Z+khiuVZDJw==
teeny-request@^3.11.3: teeny-request@^3.11.3:
version "3.11.3" version "3.11.3"
@ -19282,7 +19270,7 @@ uuid@^3.0.1, uuid@^3.1.0, uuid@^3.2.1, uuid@^3.3.2, uuid@^3.3.3, uuid@^3.4.0:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
uuid@^7.0.1, uuid@^7.0.3: uuid@^7.0.3:
version "7.0.3" version "7.0.3"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b"
integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==
@ -19306,7 +19294,7 @@ v8-to-istanbul@^7.0.0:
convert-source-map "^1.6.0" convert-source-map "^1.6.0"
source-map "^0.7.3" source-map "^0.7.3"
v8flags@^3.1.3: v8flags@^3.2.0:
version "3.2.0" version "3.2.0"
resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656" resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656"
integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg== integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==