mirror of
https://github.com/strapi/strapi.git
synced 2025-08-27 10:15:59 +00:00
Merge branch 'master' into feature/relational-fields
This commit is contained in:
commit
aa3d7eb2e0
@ -12,7 +12,7 @@
|
||||
"strapi": "strapi"
|
||||
},
|
||||
"dependencies": {
|
||||
"knex": "^0.20.0",
|
||||
"knex": "^0.21.13",
|
||||
"lodash": "4.17.19",
|
||||
"mysql": "^2.17.1",
|
||||
"pg": "8.4.0",
|
||||
|
@ -84,7 +84,7 @@
|
||||
"react-redux": "7.2.0",
|
||||
"react-router": "^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-virtualized": "^9.21.2",
|
||||
"reactstrap": "8.4.1",
|
||||
|
@ -9,7 +9,7 @@ const { getManyRelations } = require('./utils/associations');
|
||||
const createMigrationRunner = require('./migrations/create-migration-runner');
|
||||
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
|
||||
if (loadedModel.hasTimestamps) {
|
||||
definition.attributes[loadedModel.hasTimestamps[0]] = { type: 'currentTimestamp' };
|
||||
@ -18,13 +18,16 @@ const migrateSchemas = async ({ ORM, loadedModel, definition, connection, model
|
||||
|
||||
// Equilize tables
|
||||
if (connection.options && connection.options.autoMigration !== false) {
|
||||
await createOrUpdateTable({
|
||||
table: loadedModel.tableName,
|
||||
attributes: definition.attributes,
|
||||
definition,
|
||||
ORM,
|
||||
model,
|
||||
});
|
||||
await createOrUpdateTable(
|
||||
{
|
||||
table: loadedModel.tableName,
|
||||
attributes: definition.attributes,
|
||||
definition,
|
||||
ORM,
|
||||
model,
|
||||
},
|
||||
context
|
||||
);
|
||||
}
|
||||
|
||||
// Equilize polymorphic relations
|
||||
@ -42,13 +45,16 @@ const migrateSchemas = async ({ ORM, loadedModel, definition, connection, model
|
||||
};
|
||||
|
||||
if (connection.options && connection.options.autoMigration !== false) {
|
||||
await createOrUpdateTable({
|
||||
table: `${loadedModel.tableName}_morph`,
|
||||
attributes,
|
||||
definition,
|
||||
ORM,
|
||||
model,
|
||||
});
|
||||
await createOrUpdateTable(
|
||||
{
|
||||
table: `${loadedModel.tableName}_morph`,
|
||||
attributes,
|
||||
definition,
|
||||
ORM,
|
||||
model,
|
||||
},
|
||||
context
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -85,7 +91,7 @@ const migrateSchemas = async ({ ORM, loadedModel, definition, connection, model
|
||||
|
||||
const table = manyRelation.tableCollectionName;
|
||||
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
|
||||
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 createIdType = table => {
|
||||
@ -300,84 +306,93 @@ const createOrUpdateTable = async ({ table, attributes, definition, ORM, model }
|
||||
ORM
|
||||
);
|
||||
|
||||
if (columnsToAlter.length > 0) {
|
||||
if (definition.client === 'sqlite3') {
|
||||
const tmpTable = `tmp_${table}`;
|
||||
const shouldRebuild =
|
||||
columnsToAlter.length > 0 || (definition.client === 'sqlite3' && context.recreateSqliteTable);
|
||||
|
||||
const rebuildTable = async trx => {
|
||||
await trx.schema.renameTable(table, tmpTable);
|
||||
if (shouldRebuild) {
|
||||
switch (definition.client) {
|
||||
case 'sqlite3': {
|
||||
const tmpTable = `tmp_${table}`;
|
||||
|
||||
// drop possible conflicting indexes
|
||||
await Promise.all(
|
||||
attributesNames.map(key => trx.raw('DROP INDEX IF EXISTS ??', uniqueColName(table, key)))
|
||||
);
|
||||
const rebuildTable = async trx => {
|
||||
await trx.schema.renameTable(table, tmpTable);
|
||||
|
||||
// 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}`
|
||||
// drop possible conflicting indexes
|
||||
await Promise.all(
|
||||
attributesNames.map(key =>
|
||||
trx.raw('DROP INDEX IF EXISTS ??', uniqueColName(table, key))
|
||||
)
|
||||
);
|
||||
} 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 {
|
||||
const alterTable = async trx => {
|
||||
await Promise.all(
|
||||
columnsToAlter.map(col => {
|
||||
return ORM.knex.schema
|
||||
.alterTable(table, tbl => {
|
||||
tbl.dropUnique(col, uniqueColName(table, col));
|
||||
})
|
||||
.catch(() => {});
|
||||
})
|
||||
);
|
||||
await trx.schema.alterTable(table, tbl => {
|
||||
alterColumns(tbl, _.pick(attributes, columnsToAlter), {
|
||||
tableExists,
|
||||
default: {
|
||||
const alterTable = async trx => {
|
||||
await Promise.all(
|
||||
columnsToAlter.map(col => {
|
||||
return ORM.knex.schema
|
||||
.alterTable(table, tbl => {
|
||||
tbl.dropUnique(col, uniqueColName(table, col));
|
||||
})
|
||||
.catch(() => {});
|
||||
})
|
||||
);
|
||||
await trx.schema.alterTable(table, tbl => {
|
||||
alterColumns(tbl, _.pick(attributes, columnsToAlter), {
|
||||
tableExists,
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
try {
|
||||
await ORM.knex.transaction(trx => alterTable(trx));
|
||||
} catch (err) {
|
||||
if (err.code === '23505' && definition.client === 'pg') {
|
||||
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}`
|
||||
);
|
||||
} else if (definition.client === 'mysql' && err.errno === 1062) {
|
||||
strapi.log.error(
|
||||
`Unique constraint fails, make sure to update your data and restart to apply the unique constraint.\n\t- ${err.sqlMessage}`
|
||||
);
|
||||
} else {
|
||||
strapi.log.error(`Migration failed`);
|
||||
strapi.log.error(err);
|
||||
try {
|
||||
await ORM.knex.transaction(trx => alterTable(trx));
|
||||
} catch (err) {
|
||||
if (err.code === '23505' && definition.client === 'pg') {
|
||||
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}`
|
||||
);
|
||||
} else if (definition.client === 'mysql' && err.errno === 1062) {
|
||||
strapi.log.error(
|
||||
`Unique constraint fails, make sure to update your data and restart to apply the unique constraint.\n\t- ${err.sqlMessage}`
|
||||
);
|
||||
} else {
|
||||
strapi.log.error(`Migration failed`);
|
||||
strapi.log.error(err);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,27 +2,27 @@
|
||||
|
||||
const _ = require('lodash');
|
||||
|
||||
const createMigrationRunner = (migrationFunction, { hooks = [] } = {}) => {
|
||||
const beforeHook = async options => {
|
||||
const createMigrationRunner = (migrationFunction, { hooks = [] } = {}, context = {}) => {
|
||||
const beforeHook = async (options, context) => {
|
||||
for (const migration of hooks) {
|
||||
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()) {
|
||||
if (_.isFunction(migration.after)) {
|
||||
await migration.after(options);
|
||||
await migration.after(options, context);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const run = async options => {
|
||||
await beforeHook(options);
|
||||
await migrationFunction(options);
|
||||
await afterHook(options);
|
||||
await beforeHook(options, context);
|
||||
await migrationFunction(options, context);
|
||||
await afterHook(options, context);
|
||||
};
|
||||
|
||||
return {
|
||||
|
@ -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 });
|
||||
|
||||
if (way === 'disable') {
|
||||
@ -37,9 +37,15 @@ const before = async ({ definition, ORM }) => {
|
||||
.delete()
|
||||
.where(PUBLISHED_AT_ATTRIBUTE, null);
|
||||
|
||||
await ORM.knex.schema.table(definition.collectionName, table => {
|
||||
table.dropColumn(PUBLISHED_AT_ATTRIBUTE);
|
||||
});
|
||||
if (definition.client === 'sqlite3') {
|
||||
// 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);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -16,6 +16,10 @@ const dogModel = {
|
||||
name: {
|
||||
type: 'string',
|
||||
},
|
||||
code: {
|
||||
type: 'string',
|
||||
unique: true,
|
||||
},
|
||||
},
|
||||
connection: 'default',
|
||||
name: 'dog',
|
||||
@ -26,9 +30,11 @@ const dogModel = {
|
||||
const dogs = [
|
||||
{
|
||||
name: 'Nelson',
|
||||
code: '1',
|
||||
},
|
||||
{
|
||||
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].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);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -1,24 +1,24 @@
|
||||
{
|
||||
"components.Row.generatedDate": "Last generation",
|
||||
"components.Row.open": "Open",
|
||||
"components.Row.regenerate": "Regenerate",
|
||||
"containers.HomePage.Block.title": "Versions",
|
||||
"containers.HomePage.Button.open": "Open the documentation",
|
||||
"containers.HomePage.Button.update": "Update",
|
||||
"containers.HomePage.PluginHeader.description": "Configure the documentation plugin",
|
||||
"containers.HomePage.PluginHeader.title": "Documentation - Settings",
|
||||
"containers.HomePage.PopUpWarning.confirm": "I understand",
|
||||
"containers.HomePage.PopUpWarning.message": "Are you sure you want to delete this version?",
|
||||
"containers.HomePage.form.password": "Password",
|
||||
"containers.HomePage.form.password.inputDescription": "Set the password to access the documentation",
|
||||
"containers.HomePage.form.restrictedAccess": "Restricted access",
|
||||
"containers.HomePage.form.restrictedAccess.inputDescription": "Make the documentation endpoint private. By default, the access is public",
|
||||
"containers.HomePage.form.showGeneratedFiles": "Show generated files",
|
||||
"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",
|
||||
"error.deleteDoc.versionMissing": "The version you are trying to delete does not exist.",
|
||||
"error.noVersion": "A version is required",
|
||||
"error.regenerateDoc": "An error occurred while regenerating the doc",
|
||||
"error.regenerateDoc.versionMissing": "The version you are trying to generate doesn't exist",
|
||||
"notification.update.success": "Settings updated successfully",
|
||||
"components.Row.generatedDate": "Letztes Mal generiert",
|
||||
"components.Row.open": "Öffnen",
|
||||
"components.Row.regenerate": "Neu generieren",
|
||||
"containers.HomePage.Block.title": "Versionen",
|
||||
"containers.HomePage.Button.open": "Dokumentation öffnen",
|
||||
"containers.HomePage.Button.update": "Aktualisieren",
|
||||
"containers.HomePage.PluginHeader.description": "Einstellungen des Dokumentation-Plugins ändern",
|
||||
"containers.HomePage.PluginHeader.title": "Dokumentation - Einstellungen",
|
||||
"containers.HomePage.PopUpWarning.confirm": "Ich verstehe",
|
||||
"containers.HomePage.PopUpWarning.message": "Sind Sie sich sicher, dass Sie diese Version löschen wollen?",
|
||||
"containers.HomePage.form.password": "Passwort",
|
||||
"containers.HomePage.form.password.inputDescription": "Setzen Sie ein Passwort, um die Dokumentation privat zu machen",
|
||||
"containers.HomePage.form.restrictedAccess": "Zugriff beschränken",
|
||||
"containers.HomePage.form.restrictedAccess.inputDescription": "Den Endpoint der Dokumentation privat machen. Dieser ist standardmäßig öffentlich.",
|
||||
"containers.HomePage.form.showGeneratedFiles": "Generierte Dateien anzeigen",
|
||||
"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": "Die Version, die Sie zu löschen versuchen, existiert nicht.",
|
||||
"error.noVersion": "Eine Version wird benötigt",
|
||||
"error.regenerateDoc": "Ein Fehler ist während dem Neu-Erstellen der Dokumentation aufgetreten.",
|
||||
"error.regenerateDoc.versionMissing": "Die Version, die Sie zu generieren versuchen, existiert nicht",
|
||||
"notification.update.success": "Einstellungen wurden erfolgreich aktualisiert",
|
||||
"plugin.name": "Dokumentation"
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
import de from './de.json';
|
||||
import en from './en.json';
|
||||
import es from './es.json';
|
||||
import fr from './fr.json';
|
||||
@ -12,6 +13,7 @@ import sk from './sk.json';
|
||||
import zh from './zh.json';
|
||||
|
||||
const trads = {
|
||||
de,
|
||||
en,
|
||||
es,
|
||||
fr,
|
||||
|
98
yarn.lock
98
yarn.lock
@ -5625,12 +5625,7 @@ color@^3.0.0, color@^3.1.2:
|
||||
color-convert "^1.9.1"
|
||||
color-string "^1.5.2"
|
||||
|
||||
colorette@1.1.0:
|
||||
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:
|
||||
colorette@1.2.1, colorette@^1.2.1:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b"
|
||||
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"
|
||||
integrity sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=
|
||||
|
||||
commander@6.1.0, commander@^6.0.0:
|
||||
commander@6.1.0:
|
||||
version "6.1.0"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-6.1.0.tgz#f8d722b78103141006b66f4c7ba1e97315ba75bc"
|
||||
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"
|
||||
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
|
||||
|
||||
commander@^4.1.1:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
|
||||
integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
|
||||
commander@^6.0.0, commander@^6.2.0:
|
||||
version "6.2.1"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
|
||||
integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==
|
||||
|
||||
commander@~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"
|
||||
integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
|
||||
|
||||
debug@*, debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1"
|
||||
integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==
|
||||
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.3.1"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
|
||||
integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
|
||||
dependencies:
|
||||
ms "2.1.2"
|
||||
|
||||
@ -9825,7 +9820,7 @@ inflight@^1.0.4:
|
||||
once "^1.3.0"
|
||||
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"
|
||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
||||
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"
|
||||
integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
|
||||
|
||||
interpret@^2.0.0:
|
||||
interpret@^2.2.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
|
||||
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"
|
||||
integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==
|
||||
|
||||
knex@^0.20.0:
|
||||
version "0.20.15"
|
||||
resolved "https://registry.yarnpkg.com/knex/-/knex-0.20.15.tgz#b7e9e1efd9cf35d214440d9439ed21153574679d"
|
||||
integrity sha512-WHmvgfQfxA5v8pyb9zbskxCS1L1WmYgUbwBhHojlkmdouUOazvroUWlCr6KIKMQ8anXZh1NXOOtIUMnxENZG5Q==
|
||||
knex@^0.21.13:
|
||||
version "0.21.13"
|
||||
resolved "https://registry.yarnpkg.com/knex/-/knex-0.21.13.tgz#5738db52d041d38f8bd9ab15d64f4a8ebb1e97c4"
|
||||
integrity sha512-O3Zfc7ZHWe32q5k1Z8TqzmiGYVQ9+Tiqb4wP9tPF/ho9DUrHuuy5fLVDdkwDN0gHIr+q5t+XJzNW40DkmeL7lw==
|
||||
dependencies:
|
||||
colorette "1.1.0"
|
||||
commander "^4.1.1"
|
||||
debug "4.1.1"
|
||||
colorette "1.2.1"
|
||||
commander "^6.2.0"
|
||||
debug "4.3.1"
|
||||
esm "^3.2.25"
|
||||
getopts "2.2.5"
|
||||
inherits "~2.0.4"
|
||||
interpret "^2.0.0"
|
||||
interpret "^2.2.0"
|
||||
liftoff "3.1.0"
|
||||
lodash "^4.17.15"
|
||||
mkdirp "^0.5.1"
|
||||
pg-connection-string "2.1.0"
|
||||
tarn "^2.0.0"
|
||||
lodash "^4.17.20"
|
||||
pg-connection-string "2.4.0"
|
||||
tarn "^3.0.1"
|
||||
tildify "2.0.0"
|
||||
uuid "^7.0.1"
|
||||
v8flags "^3.1.3"
|
||||
v8flags "^3.2.0"
|
||||
|
||||
known-css-properties@^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"
|
||||
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
|
||||
|
||||
pg-connection-string@2.1.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:
|
||||
pg-connection-string@2.4.0, pg-connection-string@^2.4.0:
|
||||
version "2.4.0"
|
||||
resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.4.0.tgz#c979922eb47832999a204da5dbe1ebf2341b6a10"
|
||||
integrity sha512-3iBXuv7XKvxeMrIgym7njT+HlZkwZqqGX4Bu9cci8xHZNT+Um1gWKqCsAzcC0d95rcKMU5WBg6YRUcHyV0HZKQ==
|
||||
@ -15598,10 +15585,10 @@ react-router@^5.0.0:
|
||||
tiny-invariant "^1.0.2"
|
||||
tiny-warning "^1.0.0"
|
||||
|
||||
react-select@^3.0.8:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/react-select/-/react-select-3.1.0.tgz#ab098720b2e9fe275047c993f0d0caf5ded17c27"
|
||||
integrity sha512-wBFVblBH1iuCBprtpyGtd1dGMadsG36W5/t2Aj8OE6WbByDg5jIFyT7X5gT+l0qmT5TqWhxX+VsKJvCEl2uL9g==
|
||||
react-select@^3.1.1:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/react-select/-/react-select-3.1.1.tgz#156a5b4a6c22b1e3d62a919cb1fd827adb4060bc"
|
||||
integrity sha512-HjC6jT2BhUxbIbxMZWqVcDibrEpdUJCfGicN0MMV+BQyKtCaPTgFekKWiOizSCy4jdsLMGjLqcFGJMhVGWB0Dg==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.4.4"
|
||||
"@emotion/cache" "^10.0.9"
|
||||
@ -15635,13 +15622,6 @@ react-test-renderer@^16.0.0-0:
|
||||
react-is "^16.8.6"
|
||||
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:
|
||||
version "17.0.1"
|
||||
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"
|
||||
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:
|
||||
version "4.4.1"
|
||||
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"
|
||||
yallist "^3.0.3"
|
||||
|
||||
tarn@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/tarn/-/tarn-2.0.0.tgz#c68499f69881f99ae955b4317ca7d212d942fdee"
|
||||
integrity sha512-7rNMCZd3s9bhQh47ksAQd92ADFcJUjjbyOvyFjNLwTPpGieFHMC84S+LOzw0fx1uh6hnDz/19r8CPMnIjJlMMA==
|
||||
tarn@^3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.1.tgz#ebac2c6dbc6977d34d4526e0a7814200386a8aec"
|
||||
integrity sha512-6usSlV9KyHsspvwu2duKH+FMUhqJnAh6J5J/4MITl8s94iSUQTLkJggdiewKv4RyARQccnigV48Z+khiuVZDJw==
|
||||
|
||||
teeny-request@^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"
|
||||
integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
|
||||
|
||||
uuid@^7.0.1, uuid@^7.0.3:
|
||||
uuid@^7.0.3:
|
||||
version "7.0.3"
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b"
|
||||
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"
|
||||
source-map "^0.7.3"
|
||||
|
||||
v8flags@^3.1.3:
|
||||
v8flags@^3.2.0:
|
||||
version "3.2.0"
|
||||
resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656"
|
||||
integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==
|
||||
|
Loading…
x
Reference in New Issue
Block a user