- Routes to populate/depopulate demo event/item data
This commit is contained in:
89
fixtures/event.js
Normal file
89
fixtures/event.js
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
const faker = require('faker');
|
||||||
|
|
||||||
|
const capacities = {
|
||||||
|
high: faker.random.number({ min: 400, max: 600 }),
|
||||||
|
low: faker.random.number({ min: 125, max: 250 }),
|
||||||
|
};
|
||||||
|
|
||||||
|
const dates = {
|
||||||
|
near: faker.date.future(faker.random.number({ min: 0.125, max: 0.75 })),
|
||||||
|
past: faker.date.recent(faker.random.number({ min: 3, max: 16 })),
|
||||||
|
}
|
||||||
|
|
||||||
|
const getPosts = (number = 3) => {
|
||||||
|
let posts = [];
|
||||||
|
for (let i = 0; i < number; i++) {
|
||||||
|
const date = faker.date.recent(faker.random.number({ min: 3, max: 16 }));
|
||||||
|
const scheduledPost = faker.random.boolean();
|
||||||
|
|
||||||
|
posts.push({
|
||||||
|
author: faker.name.findName(),
|
||||||
|
title: faker.lorem.sentence(),
|
||||||
|
content: faker.lorem.paragraphs(faker.random.number({ min: 3, max: 5 })),
|
||||||
|
isPublic: faker.random.boolean(),
|
||||||
|
scheduledPost: scheduledPost,
|
||||||
|
sendNotification: scheduledPost ? faker.date.future(faker.random.number({ min: 0.125, max: 0.25 })) : null,
|
||||||
|
timestamp: date,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return posts;
|
||||||
|
};
|
||||||
|
|
||||||
|
const getTickets = (ticketItems = []) => {
|
||||||
|
let tickets = [];
|
||||||
|
|
||||||
|
if (ticketItems !== false) {
|
||||||
|
const count = typeof ticketItems === 'array' ? ticketItems.length :
|
||||||
|
faker.random.number({ min: 1, max: 5 });
|
||||||
|
|
||||||
|
for (let i = 0; i < count; i++) {
|
||||||
|
const ticketItem = ticketItems[i] || {};
|
||||||
|
const {
|
||||||
|
capacity = capacities[faker.random.arrayElement(['high', 'low'])],
|
||||||
|
itemId = faker.random.uuid(),
|
||||||
|
name = faker.lorem.sentence(),
|
||||||
|
price = faker.random.number({ min: 50, max: 450 }),
|
||||||
|
} = ticketItem;
|
||||||
|
|
||||||
|
tickets.push({
|
||||||
|
available: (capacity -
|
||||||
|
faker.random.number({ min: Math.floor(capacity / 2), max: (capacity - 50) })),
|
||||||
|
capacity,
|
||||||
|
endSale: dates.near,
|
||||||
|
itemId,
|
||||||
|
name,
|
||||||
|
price,
|
||||||
|
startSale: dates.past,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tickets;
|
||||||
|
}
|
||||||
|
|
||||||
|
const getEvent = (isTicketed = true) => ({
|
||||||
|
description: faker.lorem.sentences(faker.random.number({ min: 3, max: 5 }), '. '),
|
||||||
|
endTime: dates.near,
|
||||||
|
images: [
|
||||||
|
{ url: faker.image.imageUrl(640, 480, 'cats', true, true) },
|
||||||
|
{ url: faker.image.imageUrl(640, 480, 'cats', true, true) },
|
||||||
|
{ url: faker.image.imageUrl(640, 480, 'cats', true, true) },
|
||||||
|
],
|
||||||
|
isTicketed: isTicketed,
|
||||||
|
posts: getPosts(faker.random.number({ min: 4, max: 12 })),
|
||||||
|
requireLoginToSeeAuction: false,
|
||||||
|
showFrom: dates.past - (14*24*60*60*1000),
|
||||||
|
showUntil: dates.near + (14*24*60*60*1000),
|
||||||
|
startTime: dates.past,
|
||||||
|
tagline: faker.lorem.sentence(),
|
||||||
|
ticketClasses: getTickets(isTicketed),
|
||||||
|
title: faker.lorem.words(faker.random.number({ min: 1, max: 4 })),
|
||||||
|
url: 'https://www.mfa.org/summer-party',
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
getEvent,
|
||||||
|
getPosts,
|
||||||
|
getTickets,
|
||||||
|
};
|
||||||
154
fixtures/item.js
154
fixtures/item.js
@@ -1,37 +1,123 @@
|
|||||||
const item = {
|
const faker = require('faker');
|
||||||
eventId: 'x9374bdH93u3ihds453s',
|
|
||||||
title: 'Stay Local, Get Away!',
|
const item = ({
|
||||||
subtitle: 'A romantic weekend for two at the Malden Econolodge!',
|
donor,
|
||||||
donor: 'Charlie Baker',
|
end,
|
||||||
description: 'There may be bedbugs, there is absolutely no continental breakfast, and bring earplugs to sleep through police actions. A luxurious courtyard double.',
|
eventId,
|
||||||
images: [
|
index,
|
||||||
{ url: 'https://random.pics/chdgfj' },
|
quantityAvailable,
|
||||||
{ url: 'https://random.pics/745gdf' },
|
soldCount,
|
||||||
{ url: 'https://random.pics/34sd56' },
|
start,
|
||||||
|
startPrice,
|
||||||
|
subtitle,
|
||||||
|
title,
|
||||||
|
type,
|
||||||
|
}) => {
|
||||||
|
const isAuction = type === 'auction';
|
||||||
|
const startingPrice = startPrice || faker.random.number({ min: 100, max: 500 });
|
||||||
|
const bidCount = isAuction ? faker.random.number({ min: 0, max: 5 }) : 0;
|
||||||
|
const bidIncrement = isAuction ? faker.random.number({ min: 5, max: 100 }) : null;
|
||||||
|
|
||||||
|
currentPrice = !isAuction ? null : startPrice;
|
||||||
|
currentPrice = bidCount > 0
|
||||||
|
? currentPrice + faker.random.number({ min: (bidIncrement * bidCount), max: (bidIncrement * bidCount * 4) })
|
||||||
|
: currentPrice;
|
||||||
|
|
||||||
|
const estimatedValue = isAuction ?
|
||||||
|
(startingPrice * faker.random.number({ min: 15, max: 20 })) : 0;
|
||||||
|
const reservePrice = isAuction && faker.random.boolean() ?
|
||||||
|
(startingPrice * faker.random.number({ min: 5, max: 10 })) : 0;
|
||||||
|
|
||||||
|
const isShippable = faker.random.boolean();
|
||||||
|
|
||||||
|
return {
|
||||||
|
eventId: eventId || faker.random.uuid(),
|
||||||
|
title: title || faker.lorem.sentence(),
|
||||||
|
subtitle: subtitle === false ? null : subtitle || faker.lorem.sentence(),
|
||||||
|
donor: donor === false ? null : donor || faker.name.findName(),
|
||||||
|
description: faker.lorem.sentences(faker.random.number({ min: 2, max: 5 }, '. ')),
|
||||||
|
images: type === 'ticket' ? null : [
|
||||||
|
{ url: faker.image.imageUrl(640, 480, 'cats', true, true) },
|
||||||
|
{ url: faker.image.imageUrl(640, 480, 'cats', true, true) },
|
||||||
|
{ url: faker.image.imageUrl(640, 480, 'cats', true, true) },
|
||||||
],
|
],
|
||||||
type: 'auction',
|
type: type || faker.random.arrayElement(),
|
||||||
quantityAvailable: 1,
|
quantityAvailable: quantityAvailable || 1,
|
||||||
soldCount: 0,
|
soldCount: soldCount || 0,
|
||||||
currentPrice: 125,
|
currentPrice: currentPrice === false ? null : faker.random.number({ }),
|
||||||
startingPrice: 100,
|
startingPrice,
|
||||||
reservePrice: 199,
|
reservePrice,
|
||||||
estimatedValue: 225.49,
|
estimatedValue,
|
||||||
currentWinner: 'mifi',
|
currentWinner: null,
|
||||||
bidders: [
|
bidders: [],
|
||||||
{ name: 'mifi' },
|
bidCount,
|
||||||
{ name: 'mifi79' },
|
bidIncrement,
|
||||||
],
|
catalogNumber: index || null,
|
||||||
bidCount: 2,
|
start,
|
||||||
bidIncrement: 5,
|
end: end || start + (3*60*60*1000),
|
||||||
catalogNumber: 16,
|
hideBeforeStart: faker.random.boolean(),
|
||||||
start: Date.now(),
|
hideAfterEnd: faker.random.boolean(),
|
||||||
end: Date.now() + (3*60*60*1000),
|
notifyOnAvailable: faker.random.boolean(),
|
||||||
hideBeforeStart: false,
|
isShippable,
|
||||||
hideAfterEnd: true,
|
shippingCost: isShippable ? faker.random.number({ min: 5.5, max: 39.98 }) : null,
|
||||||
notifyOnAvailable: false,
|
organizationTake: isAuction ? faker.random.number({ min: 0.25, max: 1 }) : 1,
|
||||||
isShippable: true,
|
};
|
||||||
shippingCost: 25.68,
|
|
||||||
organizationTake: 0.75,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = item;
|
const getItems = ({
|
||||||
|
eventId = faker.random.uuid(),
|
||||||
|
auction = 10,
|
||||||
|
ticket = 4,
|
||||||
|
eventStart = Date.now(),
|
||||||
|
eventEnd = (Date.now() + (3*60*60*1000)),
|
||||||
|
}) => {
|
||||||
|
let items = [];
|
||||||
|
|
||||||
|
if (typeof ticket === 'number') {
|
||||||
|
for (let i = 0; i < ticket; i++) {
|
||||||
|
items.push(item({
|
||||||
|
donor: false,
|
||||||
|
end: eventEnd,
|
||||||
|
eventId,
|
||||||
|
index: false,
|
||||||
|
start: eventStart,
|
||||||
|
subtitle: false,
|
||||||
|
type: 'ticket',
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof ticket === 'object' && ticket.length) {
|
||||||
|
for (let i = 0; i < ticket.length; i++) {
|
||||||
|
items.push(item({
|
||||||
|
donor: false,
|
||||||
|
end: ticket[i].endSale,
|
||||||
|
eventId,
|
||||||
|
index: false,
|
||||||
|
quantityAvailable: ticket[i].capacity,
|
||||||
|
soldCount: (ticket[i].capacity - ticket[i].available),
|
||||||
|
start: ticket[i].startSale,
|
||||||
|
startPrice: ticket[i].price,
|
||||||
|
subtitle: false,
|
||||||
|
type: 'ticket',
|
||||||
|
title: ticket[i].name,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof auction === 'number') {
|
||||||
|
for (let i = 0; i < auction; i++) {
|
||||||
|
items.push(item({
|
||||||
|
end: eventEnd,
|
||||||
|
eventId,
|
||||||
|
index: i,
|
||||||
|
start: eventStart,
|
||||||
|
type: 'auction',
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return items;
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = getItems;
|
||||||
|
|||||||
@@ -20,14 +20,16 @@ const PostSchema = new mongoose.Schema(
|
|||||||
default: true,
|
default: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
scheduledPost: String,
|
scheduledPost: {
|
||||||
|
|
||||||
sendNotification: {
|
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
sendNotification: Date,
|
||||||
notificationContent: String,
|
notificationContent: String,
|
||||||
notificationLinksTo: String,
|
notificationLinksTo: String,
|
||||||
|
|
||||||
|
timestamp: Date,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -59,14 +61,12 @@ const TicketSchema = new mongoose.Schema(
|
|||||||
},
|
},
|
||||||
|
|
||||||
startSale: {
|
startSale: {
|
||||||
type: String,
|
type: Date,
|
||||||
required: true,
|
required: true,
|
||||||
trim: true,
|
|
||||||
},
|
},
|
||||||
endSale: {
|
endSale: {
|
||||||
type: String,
|
type: Date,
|
||||||
required: true,
|
required: true,
|
||||||
trim: true,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -75,18 +75,12 @@ const TicketSchema = new mongoose.Schema(
|
|||||||
|
|
||||||
const EventSchema = new mongoose.Schema(
|
const EventSchema = new mongoose.Schema(
|
||||||
{
|
{
|
||||||
eventDate: {
|
|
||||||
type: String,
|
|
||||||
required: true,
|
|
||||||
trim: true,
|
|
||||||
},
|
|
||||||
startTime: {
|
startTime: {
|
||||||
type: String,
|
type: Date,
|
||||||
required: true,
|
required: true,
|
||||||
trim: true,
|
|
||||||
},
|
},
|
||||||
endTime: {
|
endTime: {
|
||||||
type: Number,
|
type: Date,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -113,14 +107,12 @@ const EventSchema = new mongoose.Schema(
|
|||||||
ticketClasses: [ TicketSchema ],
|
ticketClasses: [ TicketSchema ],
|
||||||
|
|
||||||
showFrom: {
|
showFrom: {
|
||||||
type: String,
|
type: Date,
|
||||||
required: true,
|
required: true,
|
||||||
trim: true,
|
|
||||||
},
|
},
|
||||||
showUntil: {
|
showUntil: {
|
||||||
type: String,
|
type: Date,
|
||||||
required: true,
|
required: true,
|
||||||
trim: true,
|
|
||||||
},
|
},
|
||||||
|
|
||||||
requireLoginToSeeAuction: {
|
requireLoginToSeeAuction: {
|
||||||
|
|||||||
@@ -81,11 +81,11 @@ const ItemSchema = new mongoose.Schema(
|
|||||||
},
|
},
|
||||||
|
|
||||||
start: {
|
start: {
|
||||||
type: Number,
|
type: Date,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
end: {
|
end: {
|
||||||
type: Number,
|
type: Date,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
hideBeforeStart: {
|
hideBeforeStart: {
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"api-query-params": "^4.13.0",
|
"api-query-params": "^4.13.0",
|
||||||
"crypto": "^1.0.1",
|
"crypto": "^1.0.1",
|
||||||
|
"faker": "^4.1.0",
|
||||||
"jsonwebtoken": "^8.5.1",
|
"jsonwebtoken": "^8.5.1",
|
||||||
"mongoose": "^5.6.0",
|
"mongoose": "^5.6.0",
|
||||||
"mongoose-timestamp": "^0.6.0",
|
"mongoose-timestamp": "^0.6.0",
|
||||||
|
|||||||
@@ -90,49 +90,49 @@ module.exports = function (server, auth) {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
server.get(
|
// server.get(
|
||||||
'/auth/facebook/link',
|
// '/auth/facebook/link',
|
||||||
auth.secure,
|
// auth.secure,
|
||||||
(req, res, next) => {
|
// (req, res, next) => {
|
||||||
req.user.record.setLinkCheckBit((err, linkCheckBit) => {
|
// req.user.record.setLinkCheckBit((err, linkCheckBit) => {
|
||||||
passport.authenticate('facebookLink', {
|
// passport.authenticate('facebookLink', {
|
||||||
scope: ['email', 'public_profile'],
|
// scope: ['email', 'public_profile'],
|
||||||
session: false,
|
// session: false,
|
||||||
state: linkCheckbit,
|
// state: linkCheckbit,
|
||||||
})(req, res, next),
|
// })(req, res, next);
|
||||||
});
|
// });
|
||||||
},
|
// },
|
||||||
);
|
// );
|
||||||
|
//
|
||||||
server.get(
|
// server.get(
|
||||||
'/auth/facebook/linked',
|
// '/auth/facebook/linked',
|
||||||
(req, res, next) => {
|
// (req, res, next) => {
|
||||||
const linkCheckBit = req.query.state;
|
// const linkCheckBit = req.query.state;
|
||||||
|
//
|
||||||
return passport.authenticate(
|
// return passport.authenticate(
|
||||||
'facebook',
|
// 'facebook',
|
||||||
{ failureRedirect: '/profile' },
|
// { failureRedirect: '/profile' },
|
||||||
(err, profile) => {
|
// (err, profile) => {
|
||||||
if (err) {
|
// if (err) {
|
||||||
return next(err);
|
// return next(err);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
User.linkFacebookProfile(linkCheckBit, profile, (err, user) => {
|
// User.linkFacebookProfile(linkCheckBit, profile, (err, user) => {
|
||||||
if (err) {
|
// if (err) {
|
||||||
return next(err);
|
// return next(err);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
if (!user) {
|
// if (!user) {
|
||||||
return next(err, false, 'Linking the account to Facebook was unsuccessful, please try again.');
|
// return next(err, false, 'Linking the account to Facebook was unsuccessful, please try again.');
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
res.send({
|
// res.send({
|
||||||
success: true,
|
// success: true,
|
||||||
info: 'Facerbook account successfully linked',
|
// info: 'Facerbook account successfully linked',
|
||||||
});
|
// });
|
||||||
});
|
// });
|
||||||
},
|
// },
|
||||||
)(req, res, next);
|
// )(req, res, next);
|
||||||
}
|
// }
|
||||||
);
|
// );
|
||||||
};
|
};
|
||||||
|
|||||||
102
routes/demo.js
Normal file
102
routes/demo.js
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
const aqp = require('api-query-params');
|
||||||
|
const errors = require('restify-errors');
|
||||||
|
|
||||||
|
const EventFixture = require('../fixtures/event');
|
||||||
|
const ItemFixture = require('../fixtures/item');
|
||||||
|
|
||||||
|
const Event = require('../models/event');
|
||||||
|
const Item = require('../models/item');
|
||||||
|
|
||||||
|
const mergeItemTicketsWithEventStubTickets = (items, ticketStubs, callback) => {
|
||||||
|
const getMatchingTicket = (doc) => {
|
||||||
|
for (let i = 0; i < ticketStubs.length; i++) {
|
||||||
|
if (doc.title === ticketStubs[i].name) {
|
||||||
|
ticketStubs[i].itemId = doc.id;
|
||||||
|
return ticketStubs[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
let ticketsWithItemIds = [];
|
||||||
|
items.forEach((item) => {
|
||||||
|
if (item.type === 'ticket') {
|
||||||
|
const mergedTicket = getMatchingTicket(item);
|
||||||
|
if (mergedTicket) {
|
||||||
|
ticketsWithItemIds.push(mergedTicket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
callback(ticketsWithItemIds);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = function (server, auth) {
|
||||||
|
|
||||||
|
server.get('/demo/populate', auth.manager, (req, res, next) => {
|
||||||
|
const eventStub = EventFixture.getEvent(true);
|
||||||
|
const eventTickets = eventStub.ticketClasses;
|
||||||
|
delete eventStub.ticketClasses;
|
||||||
|
|
||||||
|
Event.create(eventStub, (err, event) => {
|
||||||
|
if (err) {
|
||||||
|
return next(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!event) {
|
||||||
|
return next(err, false, 'There was a problem creating the event');
|
||||||
|
}
|
||||||
|
|
||||||
|
const itemsStub = ItemFixture({
|
||||||
|
eventId: event.id,
|
||||||
|
auction: 10,
|
||||||
|
ticket: eventTickets,
|
||||||
|
eventStart: eventStub.startTime,
|
||||||
|
eventEnd: eventStub.endTime,
|
||||||
|
});
|
||||||
|
|
||||||
|
Item.insertMany(itemsStub, (err, items) => {
|
||||||
|
if (err) {
|
||||||
|
return next(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!items.length) {
|
||||||
|
return next(err, false, 'No items were inserted.');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
mergeItemTicketsWithEventStubTickets(items, eventTickets, (ticketsWithIds) => {
|
||||||
|
Event.updateOne(
|
||||||
|
{ _id: event.id },
|
||||||
|
{ $set: { ticketed: true, ticketClasses: ticketsWithIds } },
|
||||||
|
(err, event) => {
|
||||||
|
if (err) {
|
||||||
|
return next(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
res.send({ success: true, info: 'Demo data successfully inserted.' });
|
||||||
|
next();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
server.get('/demo/depopulate', auth.manager, (req, res, next) => {
|
||||||
|
let report = { items: null, events: null };
|
||||||
|
|
||||||
|
Event.deleteMany({}, (err, { deletedCount = 0 }) => {
|
||||||
|
report.events = deletedCount;
|
||||||
|
Item.deleteMany({}, (err, { deletedCount = 0 }) => {
|
||||||
|
report.items = deletedCount;
|
||||||
|
res.send({ report });
|
||||||
|
return next();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
next();
|
||||||
|
});
|
||||||
|
};
|
||||||
@@ -20,7 +20,7 @@ module.exports = function (server, auth) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
server.get('/events', auth.basic, (req, res, next) => {
|
server.get('/events', auth.basic, (req, res, next) => {
|
||||||
Event.apiQuery(req.params, function(err, docs) {
|
Event.find(req.params, function(err, docs) {
|
||||||
if (err) {
|
if (err) {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
return next(
|
return next(
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
module.exports = function(server, auth) {
|
module.exports = function(server, auth) {
|
||||||
require('./auth.js')(server, auth);
|
require('./auth.js')(server, auth);
|
||||||
require('./bids.js')(server, auth);
|
require('./bids.js')(server, auth);
|
||||||
|
require('./demo.js')(server, auth);
|
||||||
require('./events.js')(server, auth);
|
require('./events.js')(server, auth);
|
||||||
require('./installs.js')(server, auth);
|
require('./installs.js')(server, auth);
|
||||||
require('./items.js')(server, auth);
|
require('./items.js')(server, auth);
|
||||||
|
|||||||
@@ -303,6 +303,11 @@ extsprintf@^1.2.0, extsprintf@^1.4.0:
|
|||||||
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
|
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
|
||||||
integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
|
integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
|
||||||
|
|
||||||
|
faker@^4.1.0:
|
||||||
|
version "4.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/faker/-/faker-4.1.0.tgz#1e45bbbecc6774b3c195fad2835109c6d748cc3f"
|
||||||
|
integrity sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8=
|
||||||
|
|
||||||
fast-decode-uri-component@^1.0.0:
|
fast-decode-uri-component@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz#46f8b6c22b30ff7a81357d4f59abfae938202543"
|
resolved "https://registry.yarnpkg.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz#46f8b6c22b30ff7a81357d4f59abfae938202543"
|
||||||
|
|||||||
Reference in New Issue
Block a user