UNPKG

vite-plugin-lessmock

Version:

A vite plugin that auto generate mock data with fake data for TypeScript interfaces.

118 lines (117 loc) 3.99 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.GenerateMock = void 0; const ts_json_schema_generator_1 = require("ts-json-schema-generator"); const faker_1 = require("@faker-js/faker"); const lodash_1 = __importDefault(require("lodash")); class GenerateMock { constructor(tsFilepath) { this.USE_TYPE = 'TLessMock'; this.filepath = tsFilepath; this.schema = this.getJsonSchema(); } generate() { if (this.schema === null) return null; const data = this.schema.definitions[this.USE_TYPE]; if (typeof data === 'object') { return this.parse(data); } return null; } getJsonSchema() { if (this.schema === null) return null; if (this.schema) return this.schema; const config = { path: this.filepath, type: this.USE_TYPE, skipTypeCheck: true }; try { const d = (0, ts_json_schema_generator_1.createGenerator)(config).createSchema(config.type); return d; } catch (err) { return null; } } parseObjectType(schema) { const data = {}; const required = schema.required || []; Object.entries(schema.properties || {}).forEach(([field, value]) => { if (required.includes(field) || faker_1.faker.datatype.boolean()) { data[field] = this.parse(value); } }); return data; } parseArrayType(schema) { if (!lodash_1.default.isObject(schema.items)) return null; return new Array(schema.maxItems || schema.maxLength || 1).fill(null).map(() => { return this.parse(schema.items); }); } parseOtherType(schema) { const type = schema.type; if (schema.anyOf) { const d = faker_1.faker.random.arrayElement(schema.anyOf); return this.parse(d); } if (schema.const !== undefined) { return schema.const; } if (schema.enum) { return faker_1.faker.random.arrayElement(schema.enum); } if (schema.format) { // eslint-disable-next-line no-new-func return new Function('faker', `return ${schema.format}`)(faker_1.faker); } if (type === 'string') { const s = faker_1.faker.lorem.sentences(1); const len = schema.maxLength === undefined ? s.length : schema.maxLength; return s.slice(0, len); } if (type === 'number') { const { maximum, minimum } = schema; return faker_1.faker.datatype.number({ max: maximum, min: minimum }); } if (type === 'boolean') { return faker_1.faker.datatype.boolean(); } return null; } unref(schema) { if (lodash_1.default.isObject(schema) && schema.type === undefined && schema.$ref) { const key = schema.$ref.replace('#/definitions/', ''); const rest = lodash_1.default.omit(schema, '$ref'); const newSchema = this.schema.definitions[decodeURIComponent(key)]; return Object.assign(rest, newSchema); } return schema; } parse(data) { let mock; data = this.unref(data); if (typeof data === 'object') { switch (data.type) { case 'object': mock = this.parseObjectType(data); break; case 'array': mock = this.parseArrayType(data); break; default: mock = this.parseOtherType(data); } } return mock; } } exports.GenerateMock = GenerateMock;