@sanity-typed/faker
Version:
Generate Mock Data from Sanity Schemas
921 lines (914 loc) • 34.7 kB
JavaScript
;
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
});