@kubb/plugin-faker 5.1.10 → 5.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { posix } from "node:path";
2
- import { Diagnostics, Resolver, addGenerator, assertPluginOption, ast, containsCircularRef, createResolver, defineExtension, defineGenerator, setMacros, setResolver } from "kubb/kit";
2
+ import { Diagnostics, Resolver, addGenerator, ast, containsCircularRef, createResolver, defineExtension, defineGenerator, setMacros, setResolver } from "kubb/kit";
3
3
  import { File, Function, jsxRenderer } from "kubb/jsx";
4
4
  import { Fragment, jsx, jsxs } from "kubb/jsx/jsx-runtime";
5
5
  import { buildParams, enumTypeName, pluginTsName } from "@kubb/plugin-ts";
@@ -396,6 +396,12 @@ const NON_INLINABLE_RESPONSE_TYPES = /* @__PURE__ */ new Set([
396
396
  function canOverrideSchema(node) {
397
397
  return !NON_OVERRIDABLE_TYPES.has(node.type);
398
398
  }
399
+ /**
400
+ * Follows a ref, including alias chains, to the schema it resolves to. Unresolved refs are returned as is.
401
+ */
402
+ function resolveRefTarget(node) {
403
+ return node.type === "ref" && node.schema ? resolveRefTarget(node.schema) : node;
404
+ }
399
405
  function shouldInlineSingleResponseSchema(schema) {
400
406
  return !NON_INLINABLE_RESPONSE_TYPES.has(schema.type);
401
407
  }
@@ -486,7 +492,7 @@ function resolveFakerTypeUsage(node, typeName, canOverride) {
486
492
  return {
487
493
  dataType,
488
494
  returnType,
489
- usesTypeName: dataType.includes(typeName) || Boolean(returnType?.includes(typeName))
495
+ usesTypeName: canOverride && dataType.includes(typeName) || Boolean(returnType?.includes(typeName))
490
496
  };
491
497
  }
492
498
  //#endregion
@@ -890,18 +896,22 @@ function parseEnumValue(value) {
890
896
  return value;
891
897
  }
892
898
  /**
893
- * Reads the discriminator literal off a variant, or `undefined` when it can't be determined.
899
+ * Reads the discriminator literal off a variant, with whether its property is required, or
900
+ * `undefined` when it can't be determined.
894
901
  *
895
902
  * A variant carries exactly one discriminator value, so a property resolving to several literals
896
903
  * (a `ref` to the enum shared by every branch, say) identifies no branch and narrows nothing.
897
904
  */
898
- function getDiscriminatorValue(member, discriminatorPropertyName) {
905
+ function getDiscriminator(member, discriminatorPropertyName) {
899
906
  for (const property of ast.resolveSchemaProperties({
900
907
  node: member,
901
908
  propertyName: discriminatorPropertyName
902
909
  })) {
903
910
  const values = ast.getSchemaLiteralValues(property.schema);
904
- if (values.length === 1) return values[0];
911
+ if (values.length === 1) return {
912
+ value: values[0],
913
+ required: property.required
914
+ };
905
915
  }
906
916
  }
907
917
  /**
@@ -973,7 +983,7 @@ const printerFaker = ast.createPrinter((options) => {
973
983
  });
974
984
  if (this.options.schemaName && refName === this.options.schemaName) return this.options.typeName ? `undefined as unknown as ${this.options.typeName}` : "undefined as unknown";
975
985
  const resolvedName = node.ref ? this.options.resolver.name(refName) : refName;
976
- if (!this.options.nestedInObject) return `${resolvedName}(data)`;
986
+ if (!this.options.nestedInObject && canOverrideSchema(resolveRefTarget(node))) return `${resolvedName}(data)`;
977
987
  return `${resolvedName}()`;
978
988
  },
979
989
  enum(node) {
@@ -984,9 +994,10 @@ const printerFaker = ast.createPrinter((options) => {
984
994
  const { discriminatorPropertyName } = node;
985
995
  const baseTypeName = this.options.typeName;
986
996
  return `faker.helpers.arrayElement([${mapSchemaMembers(node, (member) => {
987
- const value = discriminatorPropertyName ? getDiscriminatorValue(member, discriminatorPropertyName) : void 0;
988
- if (baseTypeName && value !== void 0) {
989
- const typeName = `Extract<NonNullable<${baseTypeName}>, { ${JSON.stringify(discriminatorPropertyName)}: ${parseEnumValue(value)} }>`;
997
+ const discriminator = discriminatorPropertyName ? getDiscriminator(member, discriminatorPropertyName) : void 0;
998
+ if (baseTypeName && discriminator) {
999
+ const key = `${JSON.stringify(discriminatorPropertyName)}${discriminator.required ? "" : "?"}`;
1000
+ const typeName = `Extract<NonNullable<${baseTypeName}>, { ${key}: ${parseEnumValue(discriminator.value)} }>`;
990
1001
  return printNested(member, {
991
1002
  typeName,
992
1003
  nestedInObject: true,
@@ -1396,7 +1407,7 @@ var compatibility = {
1396
1407
  };
1397
1408
  //#endregion
1398
1409
  //#region package.json
1399
- var version = "5.1.10";
1410
+ var version = "5.1.11";
1400
1411
  //#endregion
1401
1412
  //#region src/resolvers/resolverFaker.ts
1402
1413
  /**
@@ -1464,18 +1475,6 @@ const pluginFaker = defineExtension({
1464
1475
  path: "mocks",
1465
1476
  barrel: { type: "named" }
1466
1477
  }, seed, locale = "en", group, exclude = [], include, override = [], typeMode = "inferred", dateParser = "faker", regexGenerator = "faker", printer, resolver: userResolver, macros: userMacros } = options;
1467
- assertPluginOption({
1468
- plugin: pluginFakerName,
1469
- option: "typeMode",
1470
- value: typeMode,
1471
- allowed: ["inferred", "schema"]
1472
- });
1473
- assertPluginOption({
1474
- plugin: pluginFakerName,
1475
- option: "regexGenerator",
1476
- value: regexGenerator,
1477
- allowed: ["faker", "randexp"]
1478
- });
1479
1478
  setResolver(userResolver ? Resolver.merge(resolverFaker, userResolver) : resolverFaker);
1480
1479
  if (userMacros?.length) setMacros(userMacros);
1481
1480
  addGenerator(fakerGenerator);