@dbs-portal/core-api
Version:
HTTP client and API utilities for DBS Portal
221 lines • 6.8 kB
JavaScript
/**
* Mock data generation utilities
*/
import { nanoid } from 'nanoid';
/**
* Generate a random ID
*/
export function generateId() {
return nanoid();
}
/**
* Generate a random UUID (v4 format)
*/
export function generateUuid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
const r = Math.random() * 16 | 0;
const v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
/**
* Generate random string
*/
export function generateString(length = 10, charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') {
let result = '';
for (let i = 0; i < length; i++) {
result += charset.charAt(Math.floor(Math.random() * charset.length));
}
return result;
}
/**
* Generate random number within range
*/
export function generateNumber(min = 0, max = 100) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
/**
* Generate random boolean
*/
export function generateBoolean(probability = 0.5) {
return Math.random() < probability;
}
/**
* Generate random date within range
*/
export function generateDate(startDate, endDate) {
const start = startDate || new Date(2020, 0, 1);
const end = endDate || new Date();
return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime()));
}
/**
* Generate random email
*/
export function generateEmail(domain = 'example.com') {
const username = generateString(8, 'abcdefghijklmnopqrstuvwxyz');
return `${username}@${domain}`;
}
/**
* Generate random phone number
*/
export function generatePhoneNumber(format = '+1-XXX-XXX-XXXX') {
return format.replace(/X/g, () => generateNumber(0, 9).toString());
}
/**
* Generate random name
*/
export function generateName() {
const firstNames = [
'John', 'Jane', 'Michael', 'Sarah', 'David', 'Emily', 'Robert', 'Jessica',
'William', 'Ashley', 'James', 'Amanda', 'Christopher', 'Stephanie', 'Daniel',
'Melissa', 'Matthew', 'Nicole', 'Anthony', 'Elizabeth'
];
const lastNames = [
'Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis',
'Rodriguez', 'Martinez', 'Hernandez', 'Lopez', 'Gonzalez', 'Wilson', 'Anderson',
'Thomas', 'Taylor', 'Moore', 'Jackson', 'Martin'
];
const first = firstNames[Math.floor(Math.random() * firstNames.length)] || 'John';
const last = lastNames[Math.floor(Math.random() * lastNames.length)] || 'Doe';
return {
first,
last,
full: `${first} ${last}`,
};
}
/**
* Generate random address
*/
export function generateAddress() {
const streets = [
'Main St', 'Oak Ave', 'Pine St', 'Maple Dr', 'Cedar Ln', 'Elm St',
'Park Ave', 'First St', 'Second St', 'Third St'
];
const cities = [
'Springfield', 'Franklin', 'Georgetown', 'Madison', 'Washington',
'Arlington', 'Richmond', 'Fairview', 'Salem', 'Bristol'
];
const states = [
'CA', 'NY', 'TX', 'FL', 'IL', 'PA', 'OH', 'GA', 'NC', 'MI'
];
return {
street: `${generateNumber(1, 9999)} ${streets[Math.floor(Math.random() * streets.length)] || 'Main St'}`,
city: cities[Math.floor(Math.random() * cities.length)] || 'Anytown',
state: states[Math.floor(Math.random() * states.length)] || 'CA',
zipCode: generateNumber(10000, 99999).toString(),
country: 'US',
};
}
/**
* Pick random item from array
*/
export function pickRandom(items) {
if (items.length === 0) {
throw new Error('Cannot choose from empty array');
}
return items[Math.floor(Math.random() * items.length)];
}
/**
* Pick multiple random items from array
*/
export function pickRandomMultiple(items, count) {
const shuffled = [...items].sort(() => 0.5 - Math.random());
return shuffled.slice(0, Math.min(count, items.length));
}
/**
* Generate array of items using a factory function
*/
export function generateArray(factory, count) {
return Array.from({ length: count }, (_, index) => factory(index));
}
/**
* Create paginated response from array of items
*/
export function createPaginatedResponse(options) {
const { items, page, pageSize, total } = options;
const totalItems = total ?? items.length;
const totalPages = Math.ceil(totalItems / pageSize);
const startIndex = (page - 1) * pageSize;
const endIndex = startIndex + pageSize;
const paginatedItems = items.slice(startIndex, endIndex);
return {
data: paginatedItems,
meta: {
total: totalItems,
page,
limit: pageSize,
totalPages,
hasNext: page < totalPages,
hasPrevious: page > 1,
}
};
}
/**
* Generate mock user data
*/
export function generateUser(overrides = {}) {
const name = generateName();
const address = generateAddress();
return {
id: generateId(),
email: generateEmail(),
username: generateString(8).toLowerCase(),
firstName: name.first,
lastName: name.last,
fullName: name.full,
phone: generatePhoneNumber(),
address,
isActive: generateBoolean(0.9),
createdAt: generateDate(new Date(2020, 0, 1)),
updatedAt: generateDate(),
...overrides,
};
}
/**
* Generate mock file data
*/
export function generateFile(overrides = {}) {
const extensions = ['jpg', 'png', 'pdf', 'docx', 'xlsx', 'txt'];
const extension = pickRandom(extensions);
const name = generateString(8).toLowerCase();
return {
id: generateId(),
filename: `${name}.${extension}`,
originalName: `${generateString(12)}.${extension}`,
mimeType: getMimeType(extension),
size: generateNumber(1024, 10485760), // 1KB to 10MB
url: `/files/${name}.${extension}`,
uploadedAt: generateDate(),
...overrides,
};
}
/**
* Get MIME type for file extension
*/
function getMimeType(extension) {
const mimeTypes = {
jpg: 'image/jpeg',
jpeg: 'image/jpeg',
png: 'image/png',
gif: 'image/gif',
pdf: 'application/pdf',
docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
txt: 'text/plain',
json: 'application/json',
xml: 'application/xml',
};
return mimeTypes[extension] || 'application/octet-stream';
}
/**
* Generate mock API response metadata
*/
export function generateResponseMeta(overrides = {}) {
return {
timestamp: new Date().toISOString(),
requestId: generateId(),
version: '1.0.0',
...overrides,
};
}
//# sourceMappingURL=data-generator.js.map