diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json index f127854f9..645bdec78 100644 --- a/packages/editor-ui/package.json +++ b/packages/editor-ui/package.json @@ -84,6 +84,7 @@ "xss": "^1.0.10" }, "devDependencies": { + "@faker-js/faker": "^7.6.0", "@pinia/testing": "^0.0.14", "@testing-library/jest-dom": "^5.16.5", "@testing-library/vue": "^5.8.3", @@ -102,6 +103,7 @@ "@vitejs/plugin-vue2": "^2.2.0", "c8": "^7.12.0", "jshint": "^2.9.7", + "miragejs": "^0.1.47", "sass": "^1.55.0", "sass-loader": "^10.1.1", "string-template-parser": "^1.2.6", diff --git a/packages/editor-ui/src/__tests__/server/endpoints/credential.ts b/packages/editor-ui/src/__tests__/server/endpoints/credential.ts new file mode 100644 index 000000000..949004b48 --- /dev/null +++ b/packages/editor-ui/src/__tests__/server/endpoints/credential.ts @@ -0,0 +1,10 @@ +import { Response, Server } from 'miragejs'; +import { AppSchema } from '../types'; + +export function routesForCredentials(server: Server) { + server.get('/rest/credentials', (schema: AppSchema) => { + const { models: data } = schema.all('credential'); + + return new Response(200, {}, { data }); + }); +} diff --git a/packages/editor-ui/src/__tests__/server/endpoints/credentialType.ts b/packages/editor-ui/src/__tests__/server/endpoints/credentialType.ts new file mode 100644 index 000000000..3f9ee6eaa --- /dev/null +++ b/packages/editor-ui/src/__tests__/server/endpoints/credentialType.ts @@ -0,0 +1,10 @@ +import { Response, Server } from 'miragejs'; +import { AppSchema } from '../types'; + +export function routesForCredentialTypes(server: Server) { + server.get('/types/credentials.json', (schema: AppSchema) => { + const { models: data } = schema.all('credentialType'); + + return new Response(200, {}, data); + }); +} diff --git a/packages/editor-ui/src/__tests__/server/endpoints/index.ts b/packages/editor-ui/src/__tests__/server/endpoints/index.ts new file mode 100644 index 000000000..0b82fa233 --- /dev/null +++ b/packages/editor-ui/src/__tests__/server/endpoints/index.ts @@ -0,0 +1,12 @@ +import { routesForUsers } from './user'; +import { routesForCredentials } from './credential'; +import { Server } from 'miragejs'; +import { routesForCredentialTypes } from '@/__tests__/server/endpoints/credentialType'; + +const endpoints: Array<(server: Server) => void> = [ + routesForCredentials, + routesForCredentialTypes, + routesForUsers, +]; + +export { endpoints }; diff --git a/packages/editor-ui/src/__tests__/server/endpoints/user.ts b/packages/editor-ui/src/__tests__/server/endpoints/user.ts new file mode 100644 index 000000000..7822231ba --- /dev/null +++ b/packages/editor-ui/src/__tests__/server/endpoints/user.ts @@ -0,0 +1,10 @@ +import { Response, Server } from 'miragejs'; +import { AppSchema } from '../types'; + +export function routesForUsers(server: Server) { + server.get('/rest/users', (schema: AppSchema) => { + const { models: data } = schema.all('user'); + + return new Response(200, {}, { data }); + }); +} diff --git a/packages/editor-ui/src/__tests__/server/factories/credential.ts b/packages/editor-ui/src/__tests__/server/factories/credential.ts new file mode 100644 index 000000000..b97bbbaea --- /dev/null +++ b/packages/editor-ui/src/__tests__/server/factories/credential.ts @@ -0,0 +1,24 @@ +import { Factory } from 'miragejs'; +import { faker } from '@faker-js/faker'; +import type { ICredentialsResponse } from '@/Interface'; + +export const credentialFactory = Factory.extend({ + id(i: number) { + return `${i}`; + }, + createdAt() { + return faker.date.recent().toISOString(); + }, + name() { + return faker.company.name(); + }, + nodesAccess() { + return []; + }, + type() { + return 'notionApi'; + }, + updatedAt() { + return ''; + }, +}); diff --git a/packages/editor-ui/src/__tests__/server/factories/credentialType.ts b/packages/editor-ui/src/__tests__/server/factories/credentialType.ts new file mode 100644 index 000000000..517e4e720 --- /dev/null +++ b/packages/editor-ui/src/__tests__/server/factories/credentialType.ts @@ -0,0 +1,26 @@ +import { Factory } from 'miragejs'; +import { faker } from '@faker-js/faker'; +import type { ICredentialType } from 'n8n-workflow'; + +const credentialTypes = [ + 'airtableApi', + 'dropboxApi', + 'figmaApi', + 'googleApi', + 'gitlabApi', + 'jenkinsApi', + 'metabaseApi', + 'notionApi', +]; + +export const credentialTypeFactory = Factory.extend({ + name(i) { + return credentialTypes[i]; + }, + displayName(i) { + return credentialTypes[i]; + }, + properties() { + return []; + }, +}); diff --git a/packages/editor-ui/src/__tests__/server/factories/index.ts b/packages/editor-ui/src/__tests__/server/factories/index.ts new file mode 100644 index 000000000..181ff9b9a --- /dev/null +++ b/packages/editor-ui/src/__tests__/server/factories/index.ts @@ -0,0 +1,13 @@ +import { userFactory } from './user'; +import { credentialFactory } from './credential'; +import { credentialTypeFactory } from './credentialType'; + +export * from './user'; +export * from './credential'; +export * from './credentialType'; + +export const factories = { + credential: credentialFactory, + credentialType: credentialTypeFactory, + user: userFactory, +}; diff --git a/packages/editor-ui/src/__tests__/server/factories/user.ts b/packages/editor-ui/src/__tests__/server/factories/user.ts new file mode 100644 index 000000000..f8d593b56 --- /dev/null +++ b/packages/editor-ui/src/__tests__/server/factories/user.ts @@ -0,0 +1,31 @@ +import { Factory } from 'miragejs'; +import { faker } from '@faker-js/faker'; +import { SignInType } from '@/constants'; +import type { IUser } from '@/Interface'; + +export const userFactory = Factory.extend({ + id(i: number) { + return `${i}`; + }, + firstName() { + return faker.name.firstName(); + }, + lastName() { + return faker.name.lastName(); + }, + isDefaultUser() { + return false; + }, + isOwner() { + return false; + }, + isPending() { + return false; + }, + isPendingUser() { + return false; + }, + signInType(): SignInType { + return SignInType.EMAIL; + }, +}); diff --git a/packages/editor-ui/src/__tests__/server/index.ts b/packages/editor-ui/src/__tests__/server/index.ts new file mode 100644 index 000000000..edff6894e --- /dev/null +++ b/packages/editor-ui/src/__tests__/server/index.ts @@ -0,0 +1,42 @@ +import { createServer } from 'miragejs'; +import { endpoints } from './endpoints'; +import { models } from './models'; +import { factories } from './factories'; + +export function setupServer() { + const server = createServer({ + models, + factories, + seeds(server) { + server.createList('credentialType', 8); + server.create('user', { + isDefaultUser: true, + }); + }, + }); + + // Set server url prefix + server.urlPrefix = process.env.API_URL || ''; + + // Enable logging + server.logging = false; + + // Handle undefined endpoints + server.post('/rest/:any', () => new Promise(() => {})); + + // Handle defined endpoints + for (const endpointsFn of endpoints) { + endpointsFn(server); + } + + // Reset for everything else + server.namespace = ''; + server.passthrough(); + + if (server.logging) { + console.log('Mirage database'); + console.log(server.db.dump()); + } + + return server; +} diff --git a/packages/editor-ui/src/__tests__/server/models/credential.ts b/packages/editor-ui/src/__tests__/server/models/credential.ts new file mode 100644 index 000000000..17d4f45dc --- /dev/null +++ b/packages/editor-ui/src/__tests__/server/models/credential.ts @@ -0,0 +1,5 @@ +import { ICredentialsResponse } from '@/Interface'; +import { Model } from 'miragejs'; +import type { ModelDefinition } from 'miragejs/-types'; + +export const CredentialModel: ModelDefinition = Model.extend({}); diff --git a/packages/editor-ui/src/__tests__/server/models/credentialType.ts b/packages/editor-ui/src/__tests__/server/models/credentialType.ts new file mode 100644 index 000000000..216260e0b --- /dev/null +++ b/packages/editor-ui/src/__tests__/server/models/credentialType.ts @@ -0,0 +1,5 @@ +import { Model } from 'miragejs'; +import type { ModelDefinition } from 'miragejs/-types'; +import type { ICredentialType } from 'n8n-workflow'; + +export const CredentialTypeModel: ModelDefinition = Model.extend({}); diff --git a/packages/editor-ui/src/__tests__/server/models/index.ts b/packages/editor-ui/src/__tests__/server/models/index.ts new file mode 100644 index 000000000..310b832a4 --- /dev/null +++ b/packages/editor-ui/src/__tests__/server/models/index.ts @@ -0,0 +1,9 @@ +import { UserModel } from './user'; +import { CredentialModel } from './credential'; +import { CredentialTypeModel } from './credentialType'; + +export const models = { + credential: CredentialModel, + credentialType: CredentialTypeModel, + user: UserModel, +}; diff --git a/packages/editor-ui/src/__tests__/server/models/user.ts b/packages/editor-ui/src/__tests__/server/models/user.ts new file mode 100644 index 000000000..cef64c360 --- /dev/null +++ b/packages/editor-ui/src/__tests__/server/models/user.ts @@ -0,0 +1,5 @@ +import { IUser } from '@/Interface'; +import { Model } from 'miragejs'; +import type { ModelDefinition } from 'miragejs/-types'; + +export const UserModel: ModelDefinition = Model.extend({}); diff --git a/packages/editor-ui/src/__tests__/server/types.ts b/packages/editor-ui/src/__tests__/server/types.ts new file mode 100644 index 000000000..bc3e75e4f --- /dev/null +++ b/packages/editor-ui/src/__tests__/server/types.ts @@ -0,0 +1,10 @@ +import { Registry } from 'miragejs'; + +// eslint-disable-next-line import/no-unresolved +import Schema from 'miragejs/orm/schema'; + +import { models } from './models'; +import { factories } from './factories'; + +type AppRegistry = Registry; +export type AppSchema = Schema; diff --git a/packages/editor-ui/src/stores/__tests__/credentials.spec.ts b/packages/editor-ui/src/stores/__tests__/credentials.spec.ts new file mode 100644 index 000000000..96539a2dc --- /dev/null +++ b/packages/editor-ui/src/stores/__tests__/credentials.spec.ts @@ -0,0 +1,41 @@ +import { afterAll, beforeAll } from 'vitest'; +import { setActivePinia, createPinia } from 'pinia'; +import { setupServer } from '@/__tests__/server'; +import { useCredentialsStore } from '@/stores/credentials'; + +describe('store', () => { + let server: ReturnType; + + beforeAll(() => { + server = setupServer(); + server.createList('credential', 3); + }); + + beforeEach(() => { + setActivePinia(createPinia()); + }); + + afterAll(() => { + server.shutdown(); + }); + + describe('credentials', () => { + describe('fetchCredentialTypes()', () => { + it('should fetch all credential types', async () => { + const credentialsStore = useCredentialsStore(); + await credentialsStore.fetchCredentialTypes(false); + + expect(credentialsStore.allCredentialTypes).toHaveLength(8); + }); + }); + + describe('fetchAllCredentials()', () => { + it('should fetch all credentials', async () => { + const credentialsStore = useCredentialsStore(); + await credentialsStore.fetchAllCredentials(); + + expect(credentialsStore.allCredentials).toHaveLength(3); + }); + }); + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1a8ad959f..def31059e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -558,6 +558,7 @@ importers: '@codemirror/lint': ^6.0.0 '@codemirror/state': ^6.1.4 '@codemirror/view': ^6.5.1 + '@faker-js/faker': ^7.6.0 '@fontsource/open-sans': ^4.5.0 '@fortawesome/fontawesome-svg-core': ^1.2.35 '@fortawesome/free-regular-svg-icons': ^6.1.1 @@ -599,6 +600,7 @@ importers: jsonpath: ^1.1.1 lodash-es: ^4.17.21 luxon: ^3.1.0 + miragejs: ^0.1.47 monaco-editor: ^0.33.0 n8n-design-system: workspace:* n8n-workflow: workspace:* @@ -688,6 +690,7 @@ importers: vue2-touch-events: 3.2.2 xss: 1.0.14 devDependencies: + '@faker-js/faker': 7.6.0 '@pinia/testing': 0.0.14_pinia@2.0.23+vue@2.7.14 '@testing-library/jest-dom': 5.16.5 '@testing-library/vue': 5.8.3_rhqkolmkwunxzlyyxxsuwaiuri @@ -706,6 +709,7 @@ importers: '@vitejs/plugin-vue2': 2.2.0_vite@4.0.4+vue@2.7.14 c8: 7.12.0 jshint: 2.13.5 + miragejs: 0.1.47 sass: 1.55.0 sass-loader: 10.3.1_sass@1.55.0+webpack@5.75.0 string-template-parser: 1.2.6 @@ -3077,6 +3081,11 @@ packages: - supports-color dev: true + /@faker-js/faker/7.6.0: + resolution: {integrity: sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==} + engines: {node: '>=14.0.0', npm: '>=6.0.0'} + dev: true + /@fal-works/esbuild-plugin-global-externals/2.1.2: resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} dev: true @@ -3633,6 +3642,10 @@ packages: react: 17.0.2 dev: true + /@miragejs/pretender-node-polyfill/0.1.2: + resolution: {integrity: sha512-M/BexG/p05C5lFfMunxo/QcgIJnMT2vDVCd00wNqK2ImZONIlEETZwWJu1QtLxtmYlSHlCFl3JNzp0tLe7OJ5g==} + dev: true + /@msgpackr-extract/msgpackr-extract-darwin-arm64/2.2.0: resolution: {integrity: sha512-Z9LFPzfoJi4mflGWV+rv7o7ZbMU5oAU9VmzCgL240KnqDW65Y2HFCT3MW06/ITJSnbVLacmcEJA8phywK7JinQ==} cpu: [arm64] @@ -6545,7 +6558,7 @@ packages: vite: ^3.0.0 || ^4.0.0 vue: ^2.7.0-0 dependencies: - vite: 4.0.4_sass@1.58.0 + vite: 4.0.4_sass@1.55.0+terser@5.16.1 vue: 2.7.14 dev: true @@ -11118,6 +11131,10 @@ packages: resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} engines: {'0': node >=0.6.0} + /fake-xml-http-request/2.1.2: + resolution: {integrity: sha512-HaFMBi7r+oEC9iJNpc3bvcW7Z7iLmM26hPDmlb0mFwyANSsOQAtJxbdWsXITKOzZUyMYK0zYCv3h5yDj9TsiXg==} + dev: true + /fancy-log/1.3.3: resolution: {integrity: sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==} engines: {node: '>= 0.10'} @@ -12529,6 +12546,10 @@ packages: dev: false optional: true + /inflected/2.1.0: + resolution: {integrity: sha512-hAEKNxvHf2Iq3H60oMBHkB4wl5jn3TPF3+fXek/sRwAB5gP9xWs4r7aweSF95f99HFoz69pnZTcu8f0SIHV18w==} + dev: true + /inflight/1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: @@ -14456,23 +14477,24 @@ packages: /lodash.assign/4.2.0: resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} - dev: false /lodash.assignwith/4.2.0: resolution: {integrity: sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==} dev: false + /lodash.camelcase/4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true + /lodash.clone/4.5.0: resolution: {integrity: sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==} dev: false /lodash.clonedeep/4.5.0: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - dev: false /lodash.compact/3.0.1: resolution: {integrity: sha512-2ozeiPi+5eBXW1CLtzjk8XQFhQOEMwwfxblqeq6EGyTxZJ1bPATqilY0e6g2SLQpP4KuMeuioBhEnWz5Pr7ICQ==} - dev: false /lodash.concat/4.5.0: resolution: {integrity: sha512-US6b1Nqek3shg2qmv1IjTN5P7tPL1RKu77VpdGtVprxmnTI/HlsHGqI2Oa5Irznk0ZB5IXHwocMeMZK8vf4+CA==} @@ -14500,7 +14522,6 @@ packages: /lodash.find/4.6.0: resolution: {integrity: sha512-yaRZoAV3Xq28F1iafWN1+a0rflOej93l1DQUejs3SZ41h2O9UJBoS9aueGjPDgAl4B6tPC0NuuchLKaDQQ3Isg==} - dev: false /lodash.first/3.0.0: resolution: {integrity: sha512-FnBs6c5eWZY1P88K2+NHiLZjp+pBRbLbt9kDGBCtiY+tfRGhR7LmIxTphpspmRXxyQeJXM5LHoq62yVjcBjcCw==} @@ -14508,19 +14529,30 @@ packages: /lodash.flatten/4.4.0: resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} - dev: false /lodash.flow/3.5.0: resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} dev: false + /lodash.forin/4.4.0: + resolution: {integrity: sha512-APldePP4yvGhMcplVxv9L+exdLHMRHRhH1Q9O70zRJMm9HbTm6zxaihXtNl+ICOBApeFWoH7jNmFr/L4XfWeiQ==} + dev: true + /lodash.get/4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + /lodash.has/4.5.2: + resolution: {integrity: sha512-rnYUdIo6xRCJnQmbVFEwcxF144erlD+M3YcJUVesflU9paQaE8p+fJDcIQrlMYbxoANFL+AB9hZrzSBBk5PL+g==} + dev: true + /lodash.intersection/4.4.0: resolution: {integrity: sha512-N+L0cCfnqMv6mxXtSPeKt+IavbOBBSiAEkKyLasZ8BVcP9YXQgxLO12oPR8OyURwKV8l5vJKiE1M8aS70heuMg==} dev: false + /lodash.invokemap/4.6.0: + resolution: {integrity: sha512-CfkycNtMqgUlfjfdh2BhKO/ZXrP8ePOX5lEU/g0R3ItJcnuxWDwokMGKx1hWcfOikmyOVx6X9IwWnDGlgKl61w==} + dev: true + /lodash.isarguments/3.1.0: resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} dev: false @@ -14532,15 +14564,26 @@ packages: /lodash.isempty/4.4.0: resolution: {integrity: sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==} - dev: false /lodash.isequal/4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + /lodash.isfunction/3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + dev: true + + /lodash.isinteger/4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + dev: true + /lodash.isobject/3.0.2: resolution: {integrity: sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==} dev: false + /lodash.isplainobject/4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: true + /lodash.isstring/4.0.1: resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} dev: false @@ -14553,13 +14596,20 @@ packages: resolution: {integrity: sha512-14mq7rSkCxG4XMy9lF2FbIOqqgF0aH0NfPuQ3LPR3vIh0kHnUvIYP70dqa1Hf47zyXfQ8FzAg0MYOQeSuE1R7A==} dev: false + /lodash.lowerfirst/4.3.1: + resolution: {integrity: sha512-UUKX7VhP1/JL54NXg2aq/E1Sfnjjes8fNYTNkPU8ZmsaVeBvPHKdbNaN79Re5XRL01u6wbq3j0cbYZj71Fcu5w==} + dev: true + /lodash.lt/3.9.2: resolution: {integrity: sha512-WMyxj1+48IlnUWMYALOD6+o61apx5xdiXDtHBOp6QlkeZ19QpX7LiqHMXCnZWGd35QMZoZV/iJIhIhM01WPz3A==} dev: false /lodash.map/4.6.0: resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} - dev: false + + /lodash.mapvalues/4.6.0: + resolution: {integrity: sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==} + dev: true /lodash.memoize/4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} @@ -14590,7 +14640,6 @@ packages: /lodash.pick/4.4.0: resolution: {integrity: sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==} - dev: false /lodash.pickby/4.6.0: resolution: {integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==} @@ -14608,6 +14657,10 @@ packages: resolution: {integrity: sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==} dev: false + /lodash.snakecase/4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + dev: true + /lodash.some/4.6.0: resolution: {integrity: sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==} dev: false @@ -14646,11 +14699,9 @@ packages: /lodash.uniq/4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - dev: false /lodash.uniqby/4.7.0: resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} - dev: false /lodash.unset/4.5.2: resolution: {integrity: sha512-bwKX88k2JhCV9D1vtE8+naDKlLiGrSmf8zi/Y9ivFHwbmRfA8RxS/aVJ+sIht2XOwqoNr4xUPUkGZpc1sHFEKg==} @@ -14660,6 +14711,10 @@ packages: resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} dev: false + /lodash.values/4.3.0: + resolution: {integrity: sha512-r0RwvdCv8id9TUblb/O7rYPwVy6lerCbcawrfdo9iC/1t1wsNMJknO79WNBgwkH0hIeJ08jmvvESbFpNb4jH0Q==} + dev: true + /lodash.zip/4.2.0: resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==} dev: false @@ -15166,6 +15221,38 @@ packages: minipass: 3.3.6 yallist: 4.0.0 + /miragejs/0.1.47: + resolution: {integrity: sha512-99tuCbIAlMhNhyF3s5d3+5/FdJ7O4jSq/5e3e+sDv7L8dZdwJuwutXe0pobJ7hm6yRChTDjK+Nn8dZZd175wbg==} + engines: {node: 6.* || 8.* || >= 10.*} + dependencies: + '@miragejs/pretender-node-polyfill': 0.1.2 + inflected: 2.1.0 + lodash.assign: 4.2.0 + lodash.camelcase: 4.3.0 + lodash.clonedeep: 4.5.0 + lodash.compact: 3.0.1 + lodash.find: 4.6.0 + lodash.flatten: 4.4.0 + lodash.forin: 4.4.0 + lodash.get: 4.4.2 + lodash.has: 4.5.2 + lodash.invokemap: 4.6.0 + lodash.isempty: 4.4.0 + lodash.isequal: 4.5.0 + lodash.isfunction: 3.0.9 + lodash.isinteger: 4.0.4 + lodash.isplainobject: 4.0.6 + lodash.lowerfirst: 4.3.1 + lodash.map: 4.6.0 + lodash.mapvalues: 4.6.0 + lodash.pick: 4.4.0 + lodash.snakecase: 4.1.1 + lodash.uniq: 4.5.0 + lodash.uniqby: 4.7.0 + lodash.values: 4.3.0 + pretender: 3.4.7 + dev: true + /mixin-deep/1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} @@ -16818,6 +16905,13 @@ packages: engines: {node: '>= 0.8.0'} dev: true + /pretender/3.4.7: + resolution: {integrity: sha512-jkPAvt1BfRi0RKamweJdEcnjkeu7Es8yix3bJ+KgBC5VpG/Ln4JE3hYN6vJym4qprm8Xo5adhWpm3HCoft1dOw==} + dependencies: + fake-xml-http-request: 2.1.2 + route-recognizer: 0.3.4 + dev: true + /prettier-linter-helpers/1.0.0: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} @@ -17897,6 +17991,10 @@ packages: fsevents: 2.3.2 dev: true + /route-recognizer/0.3.4: + resolution: {integrity: sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g==} + dev: true + /rss-parser/3.12.0: resolution: {integrity: sha512-aqD3E8iavcCdkhVxNDIdg1nkBI17jgqF+9OqPS1orwNaOgySdpvq6B+DoONLhzjzwV8mWg37sb60e4bmLK117A==} dependencies: