UNPKG

@sanity-typed/faker

Version:
921 lines (914 loc) 34.7 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __defProps = Object.defineProperties; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropDescs = Object.getOwnPropertyDescriptors; var __getOwnPropNames = Object.getOwnPropertyNames; var __getOwnPropSymbols = Object.getOwnPropertySymbols; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]); if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) { if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]); } return a; }; var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var index_exports = {}; __export(index_exports, { customFaker: () => customFaker, sanityConfigToFaker: () => sanityConfigToFaker, sanityDocumentsFaker: () => sanityDocumentsFaker }); module.exports = __toCommonJS(index_exports); // src/internal.ts var import_faker = require("@faker-js/faker"); var import_fast_json_stable_stringify = __toESM(require("fast-json-stable-stringify")); var import_fp3 = require("lodash/fp"); var import_randexp = __toESM(require("randexp")); // ../traverse-validation/src/index.ts var import_fp = require("lodash/fp"); var traverseValidation = ({ validation }) => { const Rule = (value) => { const rule2 = { value, error: () => rule2, warning: () => Rule({}), custom: (...args) => { var _a; return Rule(__spreadProps(__spreadValues({}, value), { custom: [...(_a = value.custom) != null ? _a : [], args] })); }, email: (...args) => { var _a; return Rule(__spreadProps(__spreadValues({}, value), { email: [...(_a = value.email) != null ? _a : [], args] })); }, greaterThan: (...args) => { var _a; return Rule(__spreadProps(__spreadValues({}, value), { greaterThan: [...(_a = value.greaterThan) != null ? _a : [], args] })); }, integer: (...args) => { var _a; return Rule(__spreadProps(__spreadValues({}, value), { integer: [...(_a = value.integer) != null ? _a : [], args] })); }, length: (...args) => { var _a; return Rule(__spreadProps(__spreadValues({}, value), { length: [...(_a = value.length) != null ? _a : [], args] })); }, lessThan: (...args) => { var _a; return Rule(__spreadProps(__spreadValues({}, value), { lessThan: [...(_a = value.lessThan) != null ? _a : [], args] })); }, lowercase: (...args) => { var _a; return Rule(__spreadProps(__spreadValues({}, value), { lowercase: [...(_a = value.lowercase) != null ? _a : [], args] })); }, max: (...args) => { var _a; return Rule(__spreadProps(__spreadValues({}, value), { max: [...(_a = value.max) != null ? _a : [], args] })); }, min: (...args) => { var _a; return Rule(__spreadProps(__spreadValues({}, value), { min: [...(_a = value.min) != null ? _a : [], args] })); }, negative: (...args) => { var _a; return Rule(__spreadProps(__spreadValues({}, value), { negative: [...(_a = value.negative) != null ? _a : [], args] })); }, optional: () => ( // Looks like the only rule that actually overwrites another one Rule(__spreadValues({}, (0, import_fp.omit)("required", value))) ), positive: (...args) => { var _a; return Rule(__spreadProps(__spreadValues({}, value), { positive: [...(_a = value.positive) != null ? _a : [], args] })); }, precision: (...args) => { var _a; return Rule(__spreadProps(__spreadValues({}, value), { precision: [...(_a = value.precision) != null ? _a : [], args] })); }, regex: (...args) => { var _a; return Rule(__spreadProps(__spreadValues({}, value), { regex: [...(_a = value.regex) != null ? _a : [], args] })); }, required: (...args) => { var _a; return Rule(__spreadProps(__spreadValues({}, value), { required: [...(_a = value.required) != null ? _a : [], args] })); }, unique: (...args) => { var _a; return Rule(__spreadProps(__spreadValues({}, value), { unique: [...(_a = value.unique) != null ? _a : [], args] })); }, uppercase: (...args) => { var _a; return Rule(__spreadProps(__spreadValues({}, value), { uppercase: [...(_a = value.uppercase) != null ? _a : [], args] })); }, uri: (...args) => { var _a; return Rule(__spreadProps(__spreadValues({}, value), { uri: [...(_a = value.uri) != null ? _a : [], args] })); }, valueOfField: () => ({ path: "", type: Symbol("TODO") }) }; return rule2; }; const rule = validation == null ? void 0 : validation( // @ts-expect-error -- EXPECTED This type is technically impossible, mainly because custom is conflicting across everything Rule({}) ); return !rule ? {} : (Array.isArray(rule) ? rule : [rule]).map(({ value }) => value).reduce((acc, current) => __spreadValues(__spreadValues({}, acc), current)); }; // ../types/src/internal.ts var import_sanity = require("sanity"); var referenced = Symbol("referenced"); var makeDefineArrayMember = () => (arrayOfSchema, defineOptions) => (0, import_sanity.defineArrayMember)( arrayOfSchema, defineOptions ); var defineArrayMember = makeDefineArrayMember(); var defineType = (schemaDefinition, defineOptions) => (0, import_sanity.defineType)( schemaDefinition, defineOptions ); // ../utils/src/index.ts var import_fp2 = require("lodash/fp"); var isPlainObject = (value) => (0, import_fp2.isPlainObject)(value); var ternary = (condition, ifTrue, ifFalse) => condition ? ifTrue() : ifFalse(); var addIndexSignature = (obj) => obj; var values = (obj) => Object.values(obj); // src/internal.ts var constantFakers = { boolean: (faker) => faker.datatype.boolean(), crossDatasetReference: (faker) => __spreadValues({ _dataset: "dataset", _projectId: "projectId", _ref: faker.string.uuid(), _type: "crossDatasetReference" }, true ? {} : { _weak: false }), email: (faker) => faker.internet.email(), geopoint: (faker) => __spreadValues({ _type: "geopoint", lat: faker.location.latitude(), lng: faker.location.longitude() }, faker.datatype.boolean() ? {} : { alt: faker.number.float({ min: 0, max: 1e4, fractionDigits: 3 }) }), slug: (faker) => ({ _type: "slug", current: faker.lorem.slug({ min: 1, max: 3 }) }) }; var emptyArrayToUndefined = (arr) => !(arr == null ? void 0 : arr.length) ? void 0 : arr; var dateAndDatetimeFaker = (schemaType) => { var _a, _b, _c, _d; const traversal = traverseValidation(schemaType); const from = new Date( Math.max( ...((_b = emptyArrayToUndefined( (_a = traversal.min) == null ? void 0 : _a.map(([minDate]) => minDate).filter((minDate) => typeof minDate === "string") )) != null ? _b : ["2015-01-01T00:00:00.000Z"]).map((minDate) => new Date(minDate).valueOf()) ) ); const to = new Date( Math.min( ...((_d = emptyArrayToUndefined( (_c = traversal.max) == null ? void 0 : _c.map(([maxDate]) => maxDate).filter((maxDate) => typeof maxDate === "string") )) != null ? _d : ["2023-01-01T00:00:00.000Z"]).map((maxDate) => new Date(maxDate).valueOf()) ) ); return (faker) => faker.date.between({ from, to }).toISOString(); }; var dateFaker = (schemaType) => { const baseFaker = dateAndDatetimeFaker(schemaType); return (faker) => baseFaker(faker).slice(0, 10); }; var datetimeFaker = (schemaType) => dateAndDatetimeFaker(schemaType); var numberFaker = (schemaType) => { var _a, _b, _c, _d, _e, _f, _g, _h, _i; const traversal = traverseValidation(schemaType); const epsilon = traversal.integer ? 1 : Number.EPSILON; const min = Math.max( Number.MIN_SAFE_INTEGER, ...((_a = traversal.min) != null ? _a : []).map(([minNumber]) => minNumber).filter( (minNumber) => typeof minNumber === "number" ), ...((_b = traversal.greaterThan) != null ? _b : []).map(([limit]) => limit).filter((limit) => typeof limit === "number").map((limit) => limit - epsilon), ...!traversal.positive ? [] : [0] ); const max = Math.min( Number.MAX_SAFE_INTEGER, ...((_c = traversal.max) != null ? _c : []).map(([maxNumber]) => maxNumber).filter( (maxNumber) => typeof maxNumber === "number" ), ...((_d = traversal.lessThan) != null ? _d : []).map(([limit]) => limit).filter((limit) => typeof limit === "number").map((limit) => limit - epsilon), ...!((_e = traversal.negative) == null ? void 0 : _e.length) ? [] : [-epsilon] ); const fractionDigits = (_g = (_f = traversal.precision) == null ? void 0 : _f.map(([limit]) => limit).filter((limit) => typeof limit === "number").map((limit) => limit)) == null ? void 0 : _g[0]; return ternary( Boolean((_i = (_h = schemaType.options) == null ? void 0 : _h.list) == null ? void 0 : _i.length), () => { const literals = schemaType.options.list.map( (maybeTitledListValue) => typeof maybeTitledListValue === "number" ? maybeTitledListValue : maybeTitledListValue.value ); return (faker) => faker.helpers.arrayElement(literals); }, () => traversal.integer ? (faker) => faker.number.int({ min, max }) : (faker) => faker.number.float({ min, max, fractionDigits }) ); }; var referenceFaker = (schemaType, referencedIdFaker) => (faker, index) => __spreadValues(__spreadValues({ _ref: referencedIdFaker( faker.helpers.arrayElement(schemaType.to.map(({ type }) => type)) )(faker, index), _type: "reference" }, {}), ternary( schemaType.weak, () => __spreadValues({}, faker.datatype.boolean() ? {} : __spreadValues({ _weak: true }, faker.datatype.boolean() ? {} : { _strengthenOnPublish: __spreadValues(__spreadValues({ type: "string" }, true ? {} : { weak: faker.datatype.boolean() }), true ? {} : { template: { id: "string", params: {} } }) })), () => ({}) )); var regexFaker = (regex) => { const randexp = new import_randexp.default(regex); return (faker) => { randexp.randInt = (min, max) => faker.number.int({ min, max }); return randexp.gen(); }; }; var stringAndTextFaker = (schemaType, stringFaker2) => { var _a, _b, _c; const traversal = traverseValidation(schemaType); const length = (_a = traversal.length) == null ? void 0 : _a.map(([exactLength]) => exactLength).find( (exactLength) => typeof exactLength === "number" ); const min = length != null ? length : Math.max( 0, ...((_b = traversal.min) != null ? _b : []).map(([minLength]) => minLength).filter( (minLength) => typeof minLength === "number" ) ); const max = length != null ? length : Math.min( Number.MAX_SAFE_INTEGER, ...((_c = traversal.max) != null ? _c : []).map(([minLength]) => minLength).filter( (minLength) => typeof minLength === "number" ) ); return traversal.regex ? regexFaker(traversal.regex[0][0]) : traversal.email ? (faker) => faker.internet.email() : (faker) => (0, import_fp3.flow)( import_fp3.identity, (value) => !traversal.uppercase ? value : value.toUpperCase(), (value) => !traversal.lowercase ? value : value.toLowerCase() )(stringFaker2(faker).slice(0, faker.number.int({ min, max }))); }; var stringFaker = (schemaType) => { var _a, _b; return ternary( Boolean((_b = (_a = schemaType.options) == null ? void 0 : _a.list) == null ? void 0 : _b.length), () => { const literals = schemaType.options.list.map( (maybeTitledListValue) => typeof maybeTitledListValue === "string" ? maybeTitledListValue : maybeTitledListValue.value ); return (faker) => faker.helpers.arrayElement(literals); }, () => stringAndTextFaker(schemaType, (faker) => faker.lorem.sentence()) ); }; var textFaker = (schemaType) => stringAndTextFaker( schemaType, (faker) => faker.lorem.paragraphs({ min: 1, max: 5 }) ); var urlFaker = (schemaType) => { var _a, _b, _c; const traversal = traverseValidation(schemaType); const { // TODO https://github.com/saiichihashimoto/sanity-typed/issues/539 allowRelative = false, relativeOnly = false } = (_c = (_b = (_a = traversal.uri) == null ? void 0 : _a[0]) == null ? void 0 : _b[0]) != null ? _c : {}; return (faker) => { const relative = relativeOnly || allowRelative && faker.datatype.boolean(); return (relative ? "" : faker.internet.url({ appendSlash: false })) + faker.system.filePath(); }; }; var instantiateFaker = (options, seed) => (path) => { const faker = new import_faker.Faker(options); faker.seed( // https://stackoverflow.com/a/7616484 [...path].reduce( (hash, chr) => Math.trunc( // eslint-disable-next-line no-bitwise -- https://stackoverflow.com/a/7616484 (hash << 5) - hash + chr.codePointAt(0) ), seed ) ); return (fn) => (index) => fn(faker, index); }; var addType = (type) => (fn) => (...args) => { const value = fn(...args); return ternary( typeof type !== "string", () => value, () => ternary( isPlainObject(value), () => __spreadProps(__spreadValues({}, value), { _type: type }), () => value ) ); }; var addKey = (fn) => (faker, count) => { const value = fn(faker, count); return ternary( isPlainObject(value), () => __spreadProps(__spreadValues({}, value), { _key: faker.database.mongodbObjectId() }), () => value ); }; var membersFaker = (members, getFakers, instantiateFakerByPath, documentIdFaker, referencedIdFaker, { unique = false } = {}) => { const memberFakers = members.map( (member) => addType(member.name)( // eslint-disable-next-line @typescript-eslint/no-use-before-define -- recursive schemaTypeToFaker( member, getFakers, instantiateFakerByPath, documentIdFaker, referencedIdFaker ) ) ); const memberFaker = (faker, index) => faker.helpers.arrayElement(memberFakers)(index); return unique ? (faker, index, { min = 1, max = 5 }) => faker.helpers.uniqueArray( () => (0, import_fast_json_stable_stringify.default)(memberFaker(faker, index)), faker.number.int({ min, max }) ).map( (value) => addKey(() => JSON.parse(value))( faker, index ) ) : (faker, index, { min = 1, max = 5 }) => faker.helpers.multiple(() => addKey(memberFaker)(faker, index), { count: { min, max } }); }; var noInfinity = (value) => value === Number.POSITIVE_INFINITY || value === Number.NEGATIVE_INFINITY ? void 0 : value; var arrayFaker = (schemaType, getFakers, instantiateFakerByPath, documentIdFaker, referencedIdFaker) => { var _a, _b, _c; const traversal = traverseValidation(schemaType); const length = (_a = traversal.length) == null ? void 0 : _a.map(([exactLength]) => exactLength).find( (exactLength) => typeof exactLength === "number" ); const minChosen = length != null ? length : noInfinity( Math.max( ...((_b = traversal.min) != null ? _b : []).map(([minLength]) => minLength).filter( (minLength) => typeof minLength === "number" ) ) ); const maxChosen = length != null ? length : noInfinity( Math.min( ...((_c = traversal.max) != null ? _c : []).map(([maxLength]) => maxLength).filter( (maxLength) => typeof maxLength === "number" ) ) ); const min = minChosen != null ? minChosen : maxChosen !== void 0 ? Math.max(0, maxChosen - 4) : 1; const max = maxChosen != null ? maxChosen : minChosen !== void 0 ? minChosen + 4 : 5; const members = membersFaker( schemaType.of, getFakers, instantiateFakerByPath, documentIdFaker, referencedIdFaker, { unique: Boolean(traversal.unique) } ); return ((faker, index) => members(faker, index, { min, max })); }; var spanFaker = ({ marks: { decorators } = {} }) => (faker) => { var _a; return __spreadProps(__spreadValues({}, {}), { _key: faker.database.mongodbObjectId(), _type: "span", marks: faker.helpers.arrayElements( [ () => faker.database.mongodbObjectId(), ...(_a = decorators == null ? void 0 : decorators.map( ({ value }) => () => value )) != null ? _a : [ () => "strong", () => "em", () => "code", () => "underline", () => "strike-through" ] ], { min: 0, max: 2 } ).map((fn) => fn()), text: faker.lorem.paragraph({ min: 1, max: 5 }) }); }; var blockFieldsFaker = ({ lists, styles }) => { return (faker) => __spreadProps(__spreadValues({ _type: "block" }, faker.datatype.boolean() ? {} : { level: 0, listItem: ternary( !(lists == null ? void 0 : lists.length), () => faker.helpers.arrayElement(["bullet", "number"]), () => faker.helpers.arrayElement( lists.map( ({ value }) => value ) ) ) }), { style: ternary( !(styles == null ? void 0 : styles.length), () => faker.helpers.arrayElement([ "blockquote", "h1", "h2", "h3", "h4", "h5", "h6", "normal" ]), () => faker.helpers.arrayElement( styles.map( ({ value }) => value ) ) ) }); }; var blockFaker = (schemaType, getFakers, instantiateFakerByPath, documentIdFaker, referencedIdFaker) => { var _a, _b; const blockFields = blockFieldsFaker(schemaType); const span = spanFaker(schemaType); const of = (_a = schemaType.of) != null ? _a : []; const members = membersFaker( of, getFakers, instantiateFakerByPath, documentIdFaker, referencedIdFaker ); const markDefs = !((_b = schemaType.marks) == null ? void 0 : _b.annotations) ? void 0 : membersFaker( schemaType.marks.annotations, getFakers, instantiateFakerByPath, documentIdFaker, referencedIdFaker ); return ((faker, index) => { var _a2; const length = faker.number.int({ min: 1, max: 5 }); const numSpans = !of.length ? length : faker.number.int({ min: 0, max: length }); return __spreadProps(__spreadValues({}, blockFields(faker)), { children: faker.helpers.shuffle([ ...Array.from({ length: numSpans }).map(() => span(faker)), ...numSpans === length ? [] : members(faker, index, { min: length - numSpans, max: length - numSpans }) ]), markDefs: (_a2 = markDefs == null ? void 0 : markDefs(faker, index, { min: 1, max: 5 })) != null ? _a2 : [] }); }); }; var fieldsFaker = ({ fields = [] }, getFakers, instantiateFakerByPath, documentIdFaker, referencedIdFaker) => { const fieldsFakers = fields.map((field) => { const fieldFaker = schemaTypeToFaker( field, getFakers, instantiateFakerByPath, documentIdFaker, referencedIdFaker ); return [ field.name, // TODO ternary traverseValidation(field).required ? (faker, index) => fieldFaker(index) : (faker, index) => faker.helpers.maybe(() => fieldFaker(index)) ]; }); return ((faker, index) => Object.fromEntries( fieldsFakers.map(([name, fieldFaker]) => [name, fieldFaker(faker, index)]).filter(([, value]) => value !== void 0) )); }; var objectFaker = (schema, getFakers, instantiateFakerByPath, documentIdFaker, referencedIdFaker) => fieldsFaker( schema, getFakers, instantiateFakerByPath, documentIdFaker, referencedIdFaker ); var documentFieldsFaker = (documentIdFaker) => (faker, index) => { const createdAt = faker.date.between({ from: "2015-01-01T00:00:00.000Z", to: "2023-01-01T00:00:00.000Z" }); return { _createdAt: createdAt.toISOString(), _id: documentIdFaker(index), _rev: faker.string.alphanumeric(22), _type: "document", _updatedAt: faker.date.between({ from: createdAt, to: "2023-01-01T00:00:00.000Z" }).toISOString() }; }; var documentFaker = (schema, getFakers, instantiateFakerByPath, documentIdFaker, referencedIdFaker) => { const documentFields = documentFieldsFaker(documentIdFaker(schema.name)); const fields = fieldsFaker( schema, getFakers, instantiateFakerByPath, documentIdFaker, referencedIdFaker ); return ((faker, index) => __spreadValues(__spreadValues({}, documentFields(faker, index)), fields(faker, index))); }; var fileFieldsFaker = (referencedIdFaker) => { const assetReferenceFaker = referenceFaker( defineType({ name: "sanity.fileAsset", type: "reference", to: [{ type: "sanity.fileAsset" }] }), referencedIdFaker ); return (faker, index) => ({ _type: "file", asset: assetReferenceFaker(faker, index) }); }; var fileFaker = (schema, getFakers, instantiateFakerByPath, documentIdFaker, referencedIdFaker) => { const fileFields = fileFieldsFaker(referencedIdFaker); const fields = fieldsFaker( schema, getFakers, instantiateFakerByPath, documentIdFaker, referencedIdFaker ); return ((faker, index) => __spreadValues(__spreadValues({}, fileFields(faker, index)), fields(faker, index))); }; var imageFieldsFaker = (referencedIdFaker) => { const assetReferenceFaker = referenceFaker( defineType({ name: "sanity.imageAsset", type: "reference", to: [{ type: "sanity.imageAsset" }] }), referencedIdFaker ); return (faker, index) => ({ _type: "image", asset: assetReferenceFaker(faker, index) }); }; var imageHotspotFaker = (faker) => ({ crop: __spreadProps(__spreadValues({}, true ? {} : { _type: "sanity.imageCrop" }), { bottom: faker.number.float({ min: 0, max: 0.5 }), left: faker.number.float({ min: 0, max: 0.5 }), right: faker.number.float({ min: 0, max: 0.5 }), top: faker.number.float({ min: 0, max: 0.5 }) }), hotspot: __spreadProps(__spreadValues({}, true ? {} : { _type: "sanity.imageHotspot" }), { height: faker.number.float({ min: 0, max: 0.5 }), width: faker.number.float({ min: 0, max: 0.5 }), x: faker.number.float({ min: 0, max: 0.5 }), y: faker.number.float({ min: 0, max: 0.5 }) }) }); var imageFaker = (schema, getFakers, instantiateFakerByPath, documentIdFaker, referencedIdFaker) => { const imageFields = imageFieldsFaker(referencedIdFaker); const fields = fieldsFaker( schema, getFakers, instantiateFakerByPath, documentIdFaker, referencedIdFaker ); return ((faker, index) => { var _a; return __spreadValues(__spreadValues(__spreadValues({}, imageFields(faker, index)), ternary( !((_a = schema.options) == null ? void 0 : _a.hotspot), () => ({}), () => imageHotspotFaker(faker) )), fields(faker, index)); }); }; var aliasFaker = ({ type }, getFakers) => (faker, index) => { var _a, _b, _c; return (_c = (_b = (_a = getFakers())[type]) == null ? void 0 : _b.call(_a, index)) != null ? _c : void 0; }; var customFakerFn = Symbol("customFakerFn"); var customFaker = (schemaType, fakerFn) => __spreadProps(__spreadValues({}, schemaType), { [customFakerFn]: fakerFn }); var schemaTypeToFaker = (schema, getFakers, instantiateFakerByPath, documentIdFaker, referencedIdFaker) => { const prefixedInstantiateFakerByPath = (path) => { var _a; return instantiateFakerByPath(`.${(_a = schema.name) != null ? _a : `<${schema.type}>`}${path}`); }; const schemaTypeFaker = schema.type in constantFakers ? constantFakers[schema.type] : schema.type === "date" ? dateFaker( schema ) : schema.type === "datetime" ? datetimeFaker( schema ) : schema.type === "number" ? numberFaker( schema ) : schema.type === "reference" ? referenceFaker( schema, referencedIdFaker ) : schema.type === "string" ? stringFaker( schema ) : schema.type === "text" ? textFaker( schema ) : schema.type === "url" ? urlFaker( schema ) : schema.type === "array" ? arrayFaker( schema, getFakers, prefixedInstantiateFakerByPath, documentIdFaker, referencedIdFaker ) : schema.type === "block" ? blockFaker( schema, getFakers, prefixedInstantiateFakerByPath, documentIdFaker, referencedIdFaker ) : schema.type === "object" ? objectFaker( schema, getFakers, prefixedInstantiateFakerByPath, documentIdFaker, referencedIdFaker ) : schema.type === "document" ? documentFaker( schema, getFakers, prefixedInstantiateFakerByPath, documentIdFaker, referencedIdFaker ) : schema.type === "file" ? fileFaker( schema, getFakers, prefixedInstantiateFakerByPath, documentIdFaker, referencedIdFaker ) : schema.type === "image" ? imageFaker( schema, getFakers, prefixedInstantiateFakerByPath, documentIdFaker, referencedIdFaker ) : aliasFaker(schema, getFakers); return (0, import_fp3.flow)( import_fp3.identity, customFakerFn in schema ? (schemaTypeFaker2) => (faker, index) => schema[customFakerFn](faker, schemaTypeFaker2(faker, index), index) : import_fp3.identity, prefixedInstantiateFakerByPath("") )(schemaTypeFaker); }; var assetFaker = (faker, mimeTypePrefix) => { const mimeType = !mimeTypePrefix ? faker.system.mimeType() : faker.helpers.arrayElement( Object.keys(faker.definitions.system.mime_type).filter( (mimeType2) => mimeType2.startsWith(mimeTypePrefix) ) ); const extension = faker.system.fileExt(mimeType); const originalFilename = `${faker.system.fileName()}.${extension}`; const path = `${faker.system.directoryPath()}/${originalFilename}`.slice(1); return __spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({ extension, mimeType, path, assetId: faker.string.alphanumeric(40), sha1hash: faker.string.alphanumeric(40), size: faker.number.int({ min: 100, max: 1e3 }), url: `${faker.internet.url()}/${path}` }, faker.datatype.boolean() ? {} : { creditLine: faker.person.fullName() }), faker.datatype.boolean() ? {} : { description: faker.lorem.lines(1) }), faker.datatype.boolean() ? {} : { label: faker.lorem.words({ min: 3, max: 5 }) }), faker.datatype.boolean() ? {} : { originalFilename }), faker.datatype.boolean() ? {} : { title: faker.lorem.words({ min: 3, max: 5 }) }), faker.datatype.boolean() ? {} : { source: __spreadValues({ id: faker.string.uuid(), name: faker.lorem.words({ min: 3, max: 5 }) }, faker.datatype.boolean() ? {} : { url: faker.internet.url() }) }); }; var fileAssetFaker = (documentIdFaker) => { const documentFields = documentFieldsFaker( documentIdFaker("sanity.fileAsset") ); return (faker, index) => __spreadProps(__spreadValues(__spreadValues({}, assetFaker(faker)), documentFields(faker, index)), { _type: "sanity.fileAsset", metadata: addIndexSignature({}) }); }; var imageSwatchFaker = (faker) => __spreadValues({ _type: "sanity.imagePaletteSwatch", background: faker.color.rgb(), foreground: faker.color.rgb(), population: faker.number.int({ min: 0, max: 1292 }) }, faker.datatype.boolean() ? {} : { title: faker.color.rgb() }); var imageAssetFaker = (documentIdFaker) => { const documentFields = documentFieldsFaker( documentIdFaker("sanity.imageAsset") ); return (faker, index) => { const height = faker.number.int({ min: 300, max: 2e3 }); const width = faker.number.int({ min: 300, max: 2e3 }); return __spreadProps(__spreadValues(__spreadValues({}, assetFaker(faker, "image/")), documentFields(faker, index)), { _type: "sanity.imageAsset", url: faker.image.url({ height, width }), metadata: addIndexSignature(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({ _type: "sanity.imageMetadata", hasAlpha: faker.datatype.boolean(), isOpaque: faker.datatype.boolean(), dimensions: { height, width, _type: "sanity.imageDimensions", aspectRatio: width / height } }, faker.datatype.boolean() ? {} : { blurHash: faker.string.sample(44) }), faker.datatype.boolean() ? {} : { exif: addIndexSignature({ _type: "sanity.imageExifMetadata" }) }), faker.datatype.boolean() ? {} : { location: constantFakers.geopoint(faker) }), faker.datatype.boolean() ? {} : { // TODO Can we mock a base64 image? lqip: `data:image/jpeg;base64,${faker.string.alphanumeric(300)}` }), faker.datatype.boolean() ? {} : { palette: __spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({ _type: "sanity.imagePalette" }, faker.datatype.boolean() ? {} : { darkMuted: imageSwatchFaker(faker) }), faker.datatype.boolean() ? {} : { darkVibrant: imageSwatchFaker(faker) }), faker.datatype.boolean() ? {} : { dominant: imageSwatchFaker(faker) }), faker.datatype.boolean() ? {} : { lightMuted: imageSwatchFaker(faker) }), faker.datatype.boolean() ? {} : { lightVibrant: imageSwatchFaker(faker) }), faker.datatype.boolean() ? {} : { muted: imageSwatchFaker(faker) }), faker.datatype.boolean() ? {} : { vibrant: imageSwatchFaker(faker) }) })) }); }; }; var implicitDocumentFakers = (instantiateFakerByPath, documentIdFaker) => ({ "sanity.fileAsset": instantiateFakerByPath(`.sanity.fileAsset`)( fileAssetFaker(documentIdFaker) ), "sanity.imageAsset": instantiateFakerByPath(`.sanity.imageAsset`)( imageAssetFaker(documentIdFaker) ) }); var sanityConfigToFakerInner = ({ schema: { types: typesUntyped = [] } = {}, plugins: pluginsUntyped = [] }, instantiateFakerByPath, documentIdFaker, referencedIdFaker) => { const implicitDocuments = implicitDocumentFakers( instantiateFakerByPath, documentIdFaker ); const types = typesUntyped; const plugins = pluginsUntyped; const pluginsFakers = plugins.map( (plugin) => sanityConfigToFakerInner( plugin, instantiateFakerByPath, documentIdFaker, referencedIdFaker ) ).reduce( (acc, fakers2) => __spreadValues(__spreadValues({}, acc), fakers2), implicitDocuments ); const fakers = Array.isArray(types) ? __spreadValues(__spreadValues({}, implicitDocuments), Object.fromEntries( types.map((type) => { const schemaTypeFaker = schemaTypeToFaker( type, () => __spreadValues(__spreadValues({}, pluginsFakers), fakers), instantiateFakerByPath, documentIdFaker, referencedIdFaker ); return [ type.name, addType(type.name)(schemaTypeFaker) ]; }) )) : ( // TODO https://www.sanity.io/docs/configuration#1ed5d17ef21e void 0 ); return fakers; }; var counter = (fn) => { let count = -1; return () => fn(count += 1); }; var sanityConfigToFakerTyped = (config, { faker, referencedChunkSize = 5, seed = 0 }) => { const documentIdMemos = {}; const documentIdUndefined = instantiateFaker(faker, seed)("<undefined>._id")( (faker2) => faker2.string.uuid() ); const documentIdFakerMemos = {}; const documentIdFaker = (type) => { var _a; if (!type) { return documentIdUndefined; } documentIdFakerMemos[type] = (_a = documentIdFakerMemos[type]) != null ? _a : instantiateFaker(faker, seed)(`.${type}._id`)( (faker2, index) => { var _a2, _b, _c; while (((_b = (_a2 = documentIdMemos[type]) == null ? void 0 : _a2.length) != null ? _b : 0) <= index) { documentIdMemos[type] = [ ...(_c = documentIdMemos[type]) != null ? _c : [], faker2.string.uuid() ]; } return documentIdMemos[type][index]; } ); return documentIdFakerMemos[type]; }; const referencedIdFaker = (type) => { const documentId = documentIdFaker(type); return (faker2, index) => documentId( faker2.number.int({ min: index - index % referencedChunkSize, max: index - index % referencedChunkSize + referencedChunkSize - 1 }) ); }; const fakersInner = sanityConfigToFakerInner( config, instantiateFaker(faker, seed), documentIdFaker, referencedIdFaker ); return Object.fromEntries( Object.entries(fakersInner).map( ([name, typeFaker]) => [name, counter(typeFaker)] ) ); }; var sanityConfigToFaker = (...args) => sanityConfigToFakerTyped(...args); var sanityDocumentsFaker = (config, fakers, { referencedChunkSize = 5 } = {}) => { var _a, _b; const types = (_b = (_a = config.schema) == null ? void 0 : _a.types) != null ? _b : []; const documentTypes = Array.isArray(types) ? [ "sanity.fileAsset", "sanity.imageAsset", ...types.filter(({ type }) => type === "document").map(({ name }) => name) ] : ( // TODO https://www.sanity.io/docs/configuration#1ed5d17ef21e void 0 ); return (0, import_fp3.flow)( import_fp3.identity, (0, import_fp3.pick)(documentTypes), values, (fakers2) => () => fakers2.flatMap( (faker) => Array.from({ length: referencedChunkSize }).map( () => faker() ) ) )(fakers); }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { customFaker, sanityConfigToFaker, sanityDocumentsFaker });