UNPKG

@dbs-portal/core-api

Version:

HTTP client and API utilities for DBS Portal

221 lines 6.8 kB
/** * 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