feat: Add Mirage.js server to enable editor-ui unit tests (#5671)

feat: add Mirage.js server to enable editor-ui unit tests
This commit is contained in:
Alex Grozav 2023-03-13 11:05:08 +02:00 committed by GitHub
parent c6ba0bd8de
commit d253aa3e95
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 364 additions and 11 deletions

View file

@ -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",

View file

@ -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 });
});
}

View file

@ -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);
});
}

View file

@ -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 };

View file

@ -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 });
});
}

View file

@ -0,0 +1,24 @@
import { Factory } from 'miragejs';
import { faker } from '@faker-js/faker';
import type { ICredentialsResponse } from '@/Interface';
export const credentialFactory = Factory.extend<ICredentialsResponse>({
id(i: number) {
return `${i}`;
},
createdAt() {
return faker.date.recent().toISOString();
},
name() {
return faker.company.name();
},
nodesAccess() {
return [];
},
type() {
return 'notionApi';
},
updatedAt() {
return '';
},
});

View file

@ -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<ICredentialType>({
name(i) {
return credentialTypes[i];
},
displayName(i) {
return credentialTypes[i];
},
properties() {
return [];
},
});

View file

@ -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,
};

View file

@ -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<IUser>({
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;
},
});

View file

@ -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;
}

View file

@ -0,0 +1,5 @@
import { ICredentialsResponse } from '@/Interface';
import { Model } from 'miragejs';
import type { ModelDefinition } from 'miragejs/-types';
export const CredentialModel: ModelDefinition<ICredentialsResponse> = Model.extend({});

View file

@ -0,0 +1,5 @@
import { Model } from 'miragejs';
import type { ModelDefinition } from 'miragejs/-types';
import type { ICredentialType } from 'n8n-workflow';
export const CredentialTypeModel: ModelDefinition<ICredentialType> = Model.extend({});

View file

@ -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,
};

View file

@ -0,0 +1,5 @@
import { IUser } from '@/Interface';
import { Model } from 'miragejs';
import type { ModelDefinition } from 'miragejs/-types';
export const UserModel: ModelDefinition<IUser> = Model.extend({});

View file

@ -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<typeof models, typeof factories>;
export type AppSchema = Schema<AppRegistry>;

View file

@ -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<typeof setupServer>;
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);
});
});
});
});

View file

@ -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: