@prismicio/mock 0.0.8 → 0.1.0

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.
Files changed (97) hide show
  1. package/dist/api/index.cjs +348 -236
  2. package/dist/api/index.cjs.map +1 -1
  3. package/dist/api/index.d.ts +52 -6
  4. package/dist/api/index.js +348 -236
  5. package/dist/api/index.js.map +1 -1
  6. package/dist/index.cjs +893 -543
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.d.ts +247 -73
  9. package/dist/index.js +885 -542
  10. package/dist/index.js.map +1 -1
  11. package/dist/model/index.cjs +398 -134
  12. package/dist/model/index.cjs.map +1 -1
  13. package/dist/model/index.d.ts +114 -28
  14. package/dist/model/index.js +398 -134
  15. package/dist/model/index.js.map +1 -1
  16. package/dist/value/index.cjs +598 -468
  17. package/dist/value/index.cjs.map +1 -1
  18. package/dist/value/index.d.ts +96 -40
  19. package/dist/value/index.js +598 -468
  20. package/dist/value/index.js.map +1 -1
  21. package/package.json +22 -20
  22. package/src/api/createAPIMockFactory.ts +56 -0
  23. package/src/api/query.ts +4 -4
  24. package/src/api/ref.ts +6 -6
  25. package/src/api/repository.ts +12 -14
  26. package/src/api/tags.ts +5 -2
  27. package/src/createMockFactory.ts +52 -0
  28. package/src/index.ts +15 -0
  29. package/src/lib/buildEmbedField.ts +28 -30
  30. package/src/lib/buildImageFieldImage.ts +19 -7
  31. package/src/lib/createFaker.ts +99 -22
  32. package/src/lib/generateCustomTypeId.ts +13 -5
  33. package/src/lib/generateFieldId.ts +13 -7
  34. package/src/lib/generateTags.ts +17 -16
  35. package/src/lib/getMockEmbedData.ts +45 -16
  36. package/src/lib/getMockImageData.ts +13 -5
  37. package/src/lib/lorem.ts +112 -0
  38. package/src/lib/valueForModel.ts +47 -30
  39. package/src/lib/valueForModelMap.ts +24 -4
  40. package/src/model/boolean.ts +6 -6
  41. package/src/model/buildMockGroupFieldMap.ts +5 -5
  42. package/src/model/color.ts +4 -4
  43. package/src/model/contentRelationship.ts +4 -4
  44. package/src/model/createModelMockFactory.ts +213 -0
  45. package/src/model/customType.ts +6 -6
  46. package/src/model/date.ts +4 -4
  47. package/src/model/embed.ts +4 -4
  48. package/src/model/geoPoint.ts +3 -3
  49. package/src/model/group.ts +7 -7
  50. package/src/model/image.ts +8 -12
  51. package/src/model/index.ts +2 -0
  52. package/src/model/integrationFields.ts +4 -4
  53. package/src/model/keyText.ts +4 -4
  54. package/src/model/link.ts +6 -6
  55. package/src/model/linkToMedia.ts +5 -5
  56. package/src/model/number.ts +4 -4
  57. package/src/model/richText.ts +8 -8
  58. package/src/model/select.ts +5 -5
  59. package/src/model/sharedSlice.ts +5 -5
  60. package/src/model/sharedSliceVariation.ts +10 -10
  61. package/src/model/slice.ts +7 -7
  62. package/src/model/sliceZone.ts +7 -4
  63. package/src/model/timestamp.ts +4 -4
  64. package/src/model/title.ts +7 -7
  65. package/src/model/uid.ts +4 -4
  66. package/src/types.ts +70 -31
  67. package/src/value/boolean.ts +4 -6
  68. package/src/value/color.ts +3 -3
  69. package/src/value/contentRelationship.ts +21 -18
  70. package/src/value/createValueMockFactory.ts +236 -0
  71. package/src/value/customType.ts +12 -12
  72. package/src/value/date.ts +6 -2
  73. package/src/value/embed.ts +23 -7
  74. package/src/value/geoPoint.ts +4 -6
  75. package/src/value/group.ts +6 -11
  76. package/src/value/image.ts +26 -18
  77. package/src/value/integrationFields.ts +12 -26
  78. package/src/value/keyText.ts +3 -5
  79. package/src/value/link.ts +11 -9
  80. package/src/value/linkToMedia.ts +9 -8
  81. package/src/value/number.ts +3 -3
  82. package/src/value/richText/embed.ts +6 -3
  83. package/src/value/richText/heading.ts +32 -27
  84. package/src/value/richText/image.ts +9 -8
  85. package/src/value/richText/index.ts +71 -48
  86. package/src/value/richText/list.ts +6 -10
  87. package/src/value/richText/oList.ts +6 -10
  88. package/src/value/richText/paragraph.ts +10 -6
  89. package/src/value/richText/preformatted.ts +11 -7
  90. package/src/value/select.ts +11 -7
  91. package/src/value/sharedSlice.ts +5 -5
  92. package/src/value/sharedSliceVariation.ts +11 -16
  93. package/src/value/slice.ts +11 -15
  94. package/src/value/sliceZone.ts +14 -18
  95. package/src/value/timestamp.ts +31 -18
  96. package/src/value/title.ts +7 -3
  97. package/src/value/uid.ts +6 -4
@@ -5,7 +5,7 @@ import { createFaker } from "../lib/createFaker";
5
5
 
6
6
  import { MockModelConfig } from "../types";
7
7
 
8
- type MockSharedSliceModelConfig<
8
+ export type MockSharedSliceModelConfig<
9
9
  Variation extends prismicT.SharedSliceModelVariation,
10
10
  > = {
11
11
  id?: string;
@@ -16,12 +16,12 @@ type MockSharedSliceModelConfig<
16
16
  export const sharedSlice = <
17
17
  Variation extends prismicT.SharedSliceModelVariation,
18
18
  >(
19
- config: MockSharedSliceModelConfig<Variation> = {},
19
+ config: MockSharedSliceModelConfig<Variation>,
20
20
  ): prismicT.SharedSliceModel<string, Variation> => {
21
- const faker = createFaker(config.seed);
21
+ const faker = config.faker || createFaker(config.seed);
22
22
 
23
23
  let name: string =
24
- config.name || changeCase.capitalCase(faker.company.bsNoun());
24
+ config.name || changeCase.capitalCase(faker.words(faker.range(1, 2)));
25
25
  let id: string = config.id || changeCase.snakeCase(name);
26
26
 
27
27
  if (config.id && !config.name) {
@@ -34,7 +34,7 @@ export const sharedSlice = <
34
34
  type: prismicT.CustomTypeModelSliceType.SharedSlice,
35
35
  id,
36
36
  name,
37
- description: faker.lorem.sentence(),
37
+ description: changeCase.sentenceCase(faker.words(faker.range(5, 10))),
38
38
  variations: config.variations || ([] as Variation[]),
39
39
  };
40
40
  };
@@ -2,6 +2,7 @@ import * as prismicT from "@prismicio/types";
2
2
  import * as changeCase from "change-case";
3
3
 
4
4
  import { createFaker } from "../lib/createFaker";
5
+ import { getMockImageData } from "../lib/getMockImageData";
5
6
 
6
7
  import { GroupFieldModelMap, MockModelConfig } from "../types";
7
8
 
@@ -21,16 +22,12 @@ export const sharedSliceVariation = <
21
22
  PrimaryFields extends GroupFieldModelMap,
22
23
  ItemsFields extends GroupFieldModelMap,
23
24
  >(
24
- config: MockSharedSliceVariationModelConfig<
25
- ID,
26
- PrimaryFields,
27
- ItemsFields
28
- > = {},
25
+ config: MockSharedSliceVariationModelConfig<ID, PrimaryFields, ItemsFields>,
29
26
  ): prismicT.SharedSliceModelVariation<ID, PrimaryFields, ItemsFields> => {
30
- const faker = createFaker(config.seed);
27
+ const faker = config.faker || createFaker(config.seed);
31
28
 
32
29
  let name: string =
33
- config.name || changeCase.capitalCase(faker.company.bsNoun());
30
+ config.name || changeCase.capitalCase(faker.words(faker.range(1, 2)));
34
31
  let id: ID = config.id || (changeCase.snakeCase(name) as ID);
35
32
 
36
33
  if (config.id && !config.name) {
@@ -39,13 +36,16 @@ export const sharedSliceVariation = <
39
36
  id = changeCase.snakeCase(config.name) as ID;
40
37
  }
41
38
 
39
+ const imageData = getMockImageData({ faker });
40
+
42
41
  return {
43
42
  id,
44
43
  name,
45
- description: faker.lorem.sentence(),
46
- docURL: faker.internet.url(),
47
- version: faker.git.shortSha(),
44
+ description: changeCase.sentenceCase(faker.words(faker.range(5, 10))),
45
+ docURL: faker.url(),
46
+ version: faker.hash(7),
48
47
  primary: config.primaryFields || ({} as PrimaryFields),
49
48
  items: config.itemsFields || ({} as ItemsFields),
49
+ imageUrl: imageData.url,
50
50
  };
51
51
  };
@@ -5,7 +5,7 @@ import { createFaker } from "../lib/createFaker";
5
5
 
6
6
  import { GroupFieldModelMap, MockModelConfig } from "../types";
7
7
 
8
- type MockSliceModelConfig<
8
+ export type MockSliceModelConfig<
9
9
  NonRepeatFields extends GroupFieldModelMap = GroupFieldModelMap,
10
10
  RepeatFields extends GroupFieldModelMap = GroupFieldModelMap,
11
11
  > = {
@@ -17,18 +17,18 @@ export const slice = <
17
17
  NonRepeatFields extends GroupFieldModelMap,
18
18
  RepeatFields extends GroupFieldModelMap,
19
19
  >(
20
- config: MockSliceModelConfig<NonRepeatFields, RepeatFields> = {},
20
+ config: MockSliceModelConfig<NonRepeatFields, RepeatFields>,
21
21
  ): prismicT.CustomTypeModelSlice<NonRepeatFields, RepeatFields> => {
22
- const faker = createFaker(config.seed);
22
+ const faker = config.faker || createFaker(config.seed);
23
23
 
24
24
  return {
25
25
  type: prismicT.CustomTypeModelSliceType.Slice,
26
- icon: changeCase.snakeCase(faker.company.bsNoun()),
27
- display: faker.datatype.boolean()
26
+ icon: changeCase.snakeCase(faker.word()),
27
+ display: faker.boolean()
28
28
  ? prismicT.CustomTypeModelSliceDisplay.Grid
29
29
  : prismicT.CustomTypeModelSliceDisplay.List,
30
- fieldset: changeCase.capitalCase(faker.lorem.words()),
31
- description: faker.lorem.sentence(),
30
+ fieldset: changeCase.capitalCase(faker.words(2)),
31
+ description: changeCase.sentenceCase(faker.words(faker.range(5, 10))),
32
32
  repeat: config.repeatFields || ({} as RepeatFields),
33
33
  "non-repeat": config.nonRepeatFields || ({} as NonRepeatFields),
34
34
  };
@@ -2,7 +2,7 @@ import * as prismicT from "@prismicio/types";
2
2
 
3
3
  import { MockModelConfig } from "../types";
4
4
 
5
- type MockSliceZoneModelConfig<
5
+ export type MockSliceZoneModelConfig<
6
6
  Slices extends Record<
7
7
  string,
8
8
  prismicT.CustomTypeModelSlice | prismicT.CustomTypeModelSharedSlice
@@ -20,10 +20,13 @@ export const sliceZone = <
20
20
  prismicT.CustomTypeModelSlice | prismicT.CustomTypeModelSharedSlice
21
21
  >,
22
22
  >(
23
- config: MockSliceZoneModelConfig<Slices> = {},
23
+ config: MockSliceZoneModelConfig<Slices>,
24
24
  ): prismicT.CustomTypeModelSliceZoneField<Slices> => {
25
- const labels =
26
- {} as prismicT.CustomTypeModelSliceZoneField<Slices>["config"]["labels"];
25
+ const labels = {} as NonNullable<
26
+ NonNullable<
27
+ prismicT.CustomTypeModelSliceZoneField<Slices>["config"]
28
+ >["labels"]
29
+ >;
27
30
 
28
31
  for (const choiceId in config.choices) {
29
32
  const choice = config.choices[choiceId];
@@ -8,15 +8,15 @@ import { MockModelConfig } from "../types";
8
8
  export type MockTimestampModelConfig = MockModelConfig;
9
9
 
10
10
  export const timestamp = (
11
- config: MockTimestampModelConfig = {},
11
+ config: MockTimestampModelConfig,
12
12
  ): prismicT.CustomTypeModelTimestampField => {
13
- const faker = createFaker(config.seed);
13
+ const faker = config.faker || createFaker(config.seed);
14
14
 
15
15
  return {
16
16
  type: prismicT.CustomTypeModelFieldType.Timestamp,
17
17
  config: {
18
- label: changeCase.capitalCase(faker.company.bsNoun()),
19
- placeholder: changeCase.sentenceCase(faker.lorem.words(3)),
18
+ label: changeCase.capitalCase(faker.word()),
19
+ placeholder: changeCase.sentenceCase(faker.words(3)),
20
20
  },
21
21
  };
22
22
  };
@@ -8,12 +8,12 @@ import { MockModelConfig } from "../types";
8
8
  export type MockTitleModelConfig = MockModelConfig;
9
9
 
10
10
  export const title = (
11
- config: MockTitleModelConfig = {},
11
+ config: MockTitleModelConfig,
12
12
  ): prismicT.CustomTypeModelTitleField => {
13
- const faker = createFaker(config.seed);
13
+ const faker = config.faker || createFaker(config.seed);
14
14
 
15
- const single = faker.random
16
- .arrayElements([
15
+ const single = faker
16
+ .randomElements([
17
17
  "heading1",
18
18
  "heading2",
19
19
  "heading3",
@@ -26,10 +26,10 @@ export const title = (
26
26
  return {
27
27
  type: prismicT.CustomTypeModelFieldType.StructuredText,
28
28
  config: {
29
- label: changeCase.capitalCase(faker.company.bsNoun()),
30
- placeholder: changeCase.sentenceCase(faker.lorem.words(3)),
29
+ label: changeCase.capitalCase(faker.word()),
30
+ placeholder: changeCase.sentenceCase(faker.words(3)),
31
31
  single,
32
- allowTargetBlank: faker.datatype.boolean() ? true : undefined,
32
+ allowTargetBlank: faker.boolean() || undefined,
33
33
  },
34
34
  };
35
35
  };
package/src/model/uid.ts CHANGED
@@ -8,15 +8,15 @@ import { MockModelConfig } from "../types";
8
8
  export type MockUIDModelConfig = MockModelConfig;
9
9
 
10
10
  export const uid = (
11
- config: MockUIDModelConfig = {},
11
+ config: MockUIDModelConfig,
12
12
  ): prismicT.CustomTypeModelUIDField => {
13
- const faker = createFaker(config.seed);
13
+ const faker = config.faker || createFaker(config.seed);
14
14
 
15
15
  return {
16
16
  type: prismicT.CustomTypeModelFieldType.UID,
17
17
  config: {
18
- label: changeCase.capitalCase(faker.company.bsNoun()),
19
- placeholder: changeCase.sentenceCase(faker.lorem.words(3)),
18
+ label: changeCase.capitalCase(faker.word()),
19
+ placeholder: changeCase.sentenceCase(faker.words(3)),
20
20
  },
21
21
  };
22
22
  };
package/src/types.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import * as prismicT from "@prismicio/types";
2
+ import { Faker } from "./lib/createFaker";
2
3
 
3
4
  import * as value from "./value";
4
5
 
@@ -27,7 +28,11 @@ export type SetRequired<BaseType, Keys extends keyof BaseType> = Simplify<
27
28
  Required<Pick<BaseType, Keys>>
28
29
  >;
29
30
 
30
- export type Seed = string | number | number[];
31
+ export type Seed = string | number;
32
+
33
+ export type WithoutFakerConfig<T> = {
34
+ [P in keyof T as P extends "seed" | "faker" ? never : P]: T[P];
35
+ };
31
36
 
32
37
  export interface MockImageData {
33
38
  url: string;
@@ -35,22 +40,31 @@ export interface MockImageData {
35
40
  height: number;
36
41
  }
37
42
 
38
- export interface MockEmbedData {
39
- url: string;
40
- embed_url: string;
41
- html: string;
42
- thumbnail_url: string | null;
43
- thumbnail_height: number | null;
44
- thumbnail_width: number | null;
45
- }
43
+ export type MockEmbedData = prismicT.AnyOEmbed &
44
+ prismicT.OEmbedExtra & {
45
+ embed_url: string;
46
+ html: string;
47
+ };
46
48
 
47
- export type MockRestApiConfig = {
48
- seed?: Seed;
49
- };
49
+ export type MockRestApiConfig =
50
+ | {
51
+ seed: Seed;
52
+ faker?: never;
53
+ }
54
+ | {
55
+ faker: Faker;
56
+ seed?: never;
57
+ };
50
58
 
51
- export type MockModelConfig = {
52
- seed?: Seed;
53
- };
59
+ export type MockModelConfig =
60
+ | {
61
+ seed: Seed;
62
+ faker?: never;
63
+ }
64
+ | {
65
+ faker: Faker;
66
+ seed?: never;
67
+ };
54
68
 
55
69
  // TODO: Add to @prismicio/types
56
70
  export type PrismicModel =
@@ -66,9 +80,17 @@ export type GroupFieldModelMap = Record<
66
80
  >;
67
81
 
68
82
  export type MockValueConfig<Model extends PrismicModel = PrismicModel> = {
69
- seed?: Seed;
70
83
  model?: Model;
71
- };
84
+ } & (
85
+ | {
86
+ seed: Seed;
87
+ faker?: never;
88
+ }
89
+ | {
90
+ faker: Faker;
91
+ seed?: never;
92
+ }
93
+ );
72
94
 
73
95
  export type MockValueStateConfig<
74
96
  State extends prismicT.FieldState = prismicT.FieldState,
@@ -88,7 +110,7 @@ export type MockValueConfigForModel<
88
110
  : Model extends prismicT.CustomTypeModelDateField
89
111
  ? value.MockDateValueConfig<Model, State>
90
112
  : Model extends prismicT.CustomTypeModelEmbedField
91
- ? value.MockEmbedValueConfig<Model, State>
113
+ ? value.MockEmbedValueConfig<Model, prismicT.AnyOEmbed, State>
92
114
  : Model extends prismicT.CustomTypeModelGeoPointField
93
115
  ? value.MockGeoPointValueConfig<Model, State>
94
116
  : Model extends prismicT.CustomTypeModelImageField
@@ -124,9 +146,17 @@ type CustomTypeModelStructuredTextField =
124
146
  export type MockRichTextValueConfig<
125
147
  Model extends CustomTypeModelStructuredTextField = CustomTypeModelStructuredTextField,
126
148
  > = {
127
- seed?: Seed;
128
149
  model?: Model;
129
- };
150
+ } & (
151
+ | {
152
+ seed: Seed;
153
+ faker?: never;
154
+ }
155
+ | {
156
+ faker: Faker;
157
+ seed?: never;
158
+ }
159
+ );
130
160
 
131
161
  export type ModelValueMap<
132
162
  T extends Record<string, prismicT.CustomTypeModelField>,
@@ -148,14 +178,18 @@ export type ModelValue<
148
178
  : T extends prismicT.CustomTypeModelSliceZoneField
149
179
  ? prismicT.SliceZone<
150
180
  ValueOf<{
151
- [P in keyof T["config"]["choices"] as P extends string
181
+ [P in keyof NonNullable<T["config"]>["choices"] as P extends string
152
182
  ? P
153
- : never]: T["config"]["choices"][P] extends prismicT.CustomTypeModelSlice
183
+ : never]: NonNullable<
184
+ T["config"]
185
+ >["choices"][P] extends prismicT.CustomTypeModelSlice
154
186
  ? CustomTypeModelSliceValue<
155
- T["config"]["choices"][P],
187
+ NonNullable<T["config"]>["choices"][P],
156
188
  P extends string ? P : string
157
189
  >
158
- : T["config"]["choices"][P] extends prismicT.CustomTypeModelSharedSlice
190
+ : NonNullable<
191
+ T["config"]
192
+ >["choices"][P] extends prismicT.CustomTypeModelSharedSlice
159
193
  ? prismicT.SharedSlice<P extends string ? P : string>
160
194
  : never;
161
195
  }>,
@@ -217,27 +251,32 @@ type CustomTypeModelFieldForGroupValue<
217
251
  : T extends prismicT.CustomTypeModelGeoPointField
218
252
  ? prismicT.GeoPointField<State>
219
253
  : T extends prismicT.CustomTypeModelIntegrationFieldsField
220
- ? prismicT.IntegrationFields<unknown, State>
254
+ ? prismicT.IntegrationFields<Record<string, unknown>, State>
221
255
  : never;
222
256
 
223
257
  type CustomTypeModelGroupFieldValue<
224
258
  T extends prismicT.CustomTypeModelGroupField,
225
259
  State extends prismicT.FieldState = prismicT.FieldState,
226
- > = prismicT.GroupField<ModelValueMap<T["config"]["fields"]>, State>;
260
+ > = prismicT.GroupField<
261
+ ModelValueMap<NonNullable<NonNullable<T["config"]>["fields"]>>,
262
+ State
263
+ >;
227
264
 
228
265
  type CustomTypeModelSliceValue<
229
266
  T extends prismicT.CustomTypeModelSlice,
230
267
  SliceType = string,
231
268
  > = prismicT.Slice<
232
269
  SliceType,
233
- ModelValueMap<T["non-repeat"]>,
234
- ModelValueMap<T["repeat"]>
270
+ ModelValueMap<NonNullable<T["non-repeat"]>>,
271
+ ModelValueMap<NonNullable<T["repeat"]>>
235
272
  >;
236
273
 
237
274
  type SharedSliceModelValue<T extends prismicT.SharedSliceModel> =
238
275
  prismicT.SharedSlice<
239
276
  T["id"],
240
- SharedSliceModelVariationValue<IterableElement<T["variations"]>>
277
+ SharedSliceModelVariationValue<
278
+ IterableElement<NonNullable<T["variations"]>>
279
+ >
241
280
  >;
242
281
 
243
282
  type SharedSliceModelVariationValue<
@@ -246,7 +285,7 @@ type SharedSliceModelVariationValue<
246
285
  string,
247
286
  prismicT.SharedSliceVariation<
248
287
  T["id"],
249
- ModelValueMap<T["primary"]>,
250
- ModelValueMap<T["items"]>
288
+ ModelValueMap<NonNullable<T["primary"]>>,
289
+ ModelValueMap<NonNullable<T["items"]>>
251
290
  >
252
291
  >;
@@ -8,12 +8,10 @@ export type MockBooleanValueConfig<
8
8
  Model extends prismicT.CustomTypeModelBooleanField = prismicT.CustomTypeModelBooleanField,
9
9
  > = MockValueConfig<Model>;
10
10
 
11
- export const boolean = <
12
- Model extends prismicT.CustomTypeModelBooleanField = prismicT.CustomTypeModelBooleanField,
13
- >(
14
- config: MockBooleanValueConfig<Model> = {},
11
+ export const boolean = <Model extends prismicT.CustomTypeModelBooleanField>(
12
+ config: MockBooleanValueConfig<Model>,
15
13
  ): prismicT.BooleanField => {
16
- const faker = createFaker(config.seed);
14
+ const faker = config.faker || createFaker(config.seed);
17
15
 
18
- return faker.datatype.boolean();
16
+ return faker.boolean();
19
17
  };
@@ -17,11 +17,11 @@ export const color = <
17
17
  Model extends prismicT.CustomTypeModelColorField = prismicT.CustomTypeModelColorField,
18
18
  State extends prismicT.FieldState = "filled",
19
19
  >(
20
- config: MockColorValueConfig<Model, State> = {},
20
+ config: MockColorValueConfig<Model, State>,
21
21
  ): MockColorValue<State> => {
22
- const faker = createFaker(config.seed);
22
+ const faker = config.faker || createFaker(config.seed);
23
23
 
24
24
  return (
25
- config.state === "empty" ? null : faker.internet.color().toUpperCase()
25
+ config.state === "empty" ? null : faker.hexColor().toUpperCase()
26
26
  ) as MockColorValue<State>;
27
27
  };
@@ -5,7 +5,11 @@ import { createFaker } from "../lib/createFaker";
5
5
  import { generateCustomTypeId } from "../lib/generateCustomTypeId";
6
6
  import { generateTags } from "../lib/generateTags";
7
7
 
8
- import { MockValueStateConfig, MockValueConfig } from "../types";
8
+ import {
9
+ MockValueStateConfig,
10
+ MockValueConfig,
11
+ IterableElement,
12
+ } from "../types";
9
13
 
10
14
  import * as modelGen from "../model";
11
15
 
@@ -26,7 +30,7 @@ type MockContentRelationshipValue<
26
30
  Model extends prismicT.CustomTypeModelContentRelationshipField = prismicT.CustomTypeModelContentRelationshipField,
27
31
  State extends prismicT.FieldState = prismicT.FieldState,
28
32
  > = prismicT.RelationField<
29
- Model["config"]["customtypes"],
33
+ IterableElement<NonNullable<Model["config"]>["customtypes"]>,
30
34
  string,
31
35
  never,
32
36
  State
@@ -36,17 +40,16 @@ export const contentRelationship = <
36
40
  Model extends prismicT.CustomTypeModelContentRelationshipField = prismicT.CustomTypeModelContentRelationshipField,
37
41
  State extends prismicT.FieldState = "filled",
38
42
  >(
39
- config: MockContentRelationshipValueConfig<Model, State> = {},
43
+ config: MockContentRelationshipValueConfig<Model, State>,
40
44
  ): MockContentRelationshipValue<Model, State> => {
41
- const faker = createFaker(config.seed);
45
+ const faker = config.faker || createFaker(config.seed);
42
46
 
43
47
  if (config.state === "empty") {
44
48
  return {
45
49
  link_type: prismicT.LinkType.Document,
46
50
  } as MockContentRelationshipValue<Model, State>;
47
51
  } else {
48
- const model =
49
- config.model || modelGen.contentRelationship({ seed: config.seed });
52
+ const model = config.model || modelGen.contentRelationship({ faker });
50
53
 
51
54
  const linkableDocuments = config.linkableDocuments
52
55
  ? config.linkableDocuments.filter(
@@ -54,16 +57,16 @@ export const contentRelationship = <
54
57
  document,
55
58
  ): document is prismicT.PrismicDocument<
56
59
  never,
57
- NonNullable<Model["config"]["customtypes"]>[number]
60
+ NonNullable<NonNullable<Model["config"]>["customtypes"]>[number]
58
61
  > => {
59
62
  let shouldKeep = true;
60
63
 
61
- if (model.config.customtypes) {
64
+ if (model.config?.customtypes) {
62
65
  shouldKeep =
63
66
  shouldKeep && model.config.customtypes.includes(document.type);
64
67
  }
65
68
 
66
- if (model.config.tags) {
69
+ if (model.config?.tags) {
67
70
  shouldKeep =
68
71
  shouldKeep &&
69
72
  model.config.tags.some((tag) => document.tags.includes(tag));
@@ -74,20 +77,20 @@ export const contentRelationship = <
74
77
  )
75
78
  : [
76
79
  {
77
- ...documentGen({ seed: config.seed }),
78
- type: model.config.customtypes
79
- ? faker.random.arrayElement(model.config.customtypes)
80
- : generateCustomTypeId({ seed: config.seed }),
81
- tags: model.config.tags
82
- ? faker.random.arrayElements(model.config.tags)
83
- : generateTags({ seed: config.seed }),
80
+ ...documentGen({ faker }),
81
+ type: model.config?.customtypes
82
+ ? faker.randomElement(model.config.customtypes)
83
+ : generateCustomTypeId({ faker }),
84
+ tags: model.config?.tags
85
+ ? faker.randomElements(model.config.tags)
86
+ : generateTags({ faker }),
84
87
  } as prismicT.PrismicDocument<
85
88
  never,
86
- NonNullable<Model["config"]["customtypes"]>[number]
89
+ NonNullable<NonNullable<Model["config"]>["customtypes"]>[number]
87
90
  >,
88
91
  ];
89
92
 
90
- const document = faker.random.arrayElement(linkableDocuments);
93
+ const document = faker.randomElement(linkableDocuments);
91
94
 
92
95
  if (!document) {
93
96
  throw new Error("A linkable document could not be found.");