@prismicio/mock 0.0.7 → 0.0.10

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 (85) hide show
  1. package/dist/api/index.cjs +208 -100
  2. package/dist/api/index.cjs.map +1 -1
  3. package/dist/api/index.d.ts +1 -1
  4. package/dist/api/index.js +208 -100
  5. package/dist/api/index.js.map +1 -1
  6. package/dist/index.cjs +365 -255
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.d.ts +36 -30
  9. package/dist/index.js +364 -253
  10. package/dist/index.js.map +1 -1
  11. package/dist/model/index.cjs +168 -74
  12. package/dist/model/index.cjs.map +1 -1
  13. package/dist/model/index.d.ts +4 -2
  14. package/dist/model/index.js +168 -74
  15. package/dist/model/index.js.map +1 -1
  16. package/dist/value/index.cjs +334 -224
  17. package/dist/value/index.cjs.map +1 -1
  18. package/dist/value/index.d.ts +29 -25
  19. package/dist/value/index.js +334 -224
  20. package/dist/value/index.js.map +1 -1
  21. package/package.json +19 -17
  22. package/src/api/query.ts +2 -2
  23. package/src/api/ref.ts +3 -3
  24. package/src/api/repository.ts +5 -5
  25. package/src/lib/buildEmbedField.ts +16 -27
  26. package/src/lib/buildImageFieldImage.ts +3 -2
  27. package/src/lib/createFaker.ts +98 -20
  28. package/src/lib/generateCustomTypeId.ts +1 -1
  29. package/src/lib/generateFieldId.ts +1 -3
  30. package/src/lib/generateTags.ts +4 -12
  31. package/src/lib/getMockEmbedData.ts +33 -12
  32. package/src/lib/getMockImageData.ts +1 -1
  33. package/src/lib/lorem.ts +112 -0
  34. package/src/model/boolean.ts +1 -1
  35. package/src/model/buildMockGroupFieldMap.ts +1 -1
  36. package/src/model/color.ts +2 -2
  37. package/src/model/contentRelationship.ts +2 -2
  38. package/src/model/customType.ts +3 -3
  39. package/src/model/date.ts +2 -2
  40. package/src/model/embed.ts +2 -2
  41. package/src/model/geoPoint.ts +1 -1
  42. package/src/model/group.ts +1 -1
  43. package/src/model/image.ts +5 -9
  44. package/src/model/integrationFields.ts +5 -3
  45. package/src/model/keyText.ts +2 -2
  46. package/src/model/link.ts +3 -3
  47. package/src/model/linkToMedia.ts +2 -2
  48. package/src/model/number.ts +2 -2
  49. package/src/model/richText.ts +6 -6
  50. package/src/model/select.ts +2 -2
  51. package/src/model/sharedSlice.ts +2 -2
  52. package/src/model/sharedSliceVariation.ts +4 -4
  53. package/src/model/slice.ts +4 -4
  54. package/src/model/timestamp.ts +2 -2
  55. package/src/model/title.ts +5 -5
  56. package/src/model/uid.ts +2 -2
  57. package/src/types.ts +105 -92
  58. package/src/value/boolean.ts +1 -1
  59. package/src/value/color.ts +1 -1
  60. package/src/value/contentRelationship.ts +3 -3
  61. package/src/value/customType.ts +5 -5
  62. package/src/value/embed.ts +20 -7
  63. package/src/value/geoPoint.ts +2 -4
  64. package/src/value/group.ts +31 -25
  65. package/src/value/integrationFields.ts +4 -4
  66. package/src/value/keyText.ts +1 -3
  67. package/src/value/link.ts +3 -3
  68. package/src/value/linkToMedia.ts +7 -6
  69. package/src/value/number.ts +1 -1
  70. package/src/value/richText/embed.ts +2 -2
  71. package/src/value/richText/heading.ts +3 -10
  72. package/src/value/richText/image.ts +3 -5
  73. package/src/value/richText/index.ts +3 -8
  74. package/src/value/richText/list.ts +4 -8
  75. package/src/value/richText/oList.ts +4 -8
  76. package/src/value/richText/paragraph.ts +8 -4
  77. package/src/value/richText/preformatted.ts +9 -5
  78. package/src/value/select.ts +2 -2
  79. package/src/value/sharedSlice.ts +1 -1
  80. package/src/value/sharedSliceVariation.ts +2 -6
  81. package/src/value/slice.ts +2 -6
  82. package/src/value/sliceZone.ts +50 -49
  83. package/src/value/timestamp.ts +28 -15
  84. package/src/value/title.ts +26 -13
  85. package/src/value/uid.ts +1 -1
@@ -7,24 +7,37 @@ import { MockValueStateConfig, MockValueConfig } from "../types";
7
7
 
8
8
  export type MockEmbedValueConfig<
9
9
  Model extends prismicT.CustomTypeModelEmbedField = prismicT.CustomTypeModelEmbedField,
10
+ Data extends prismicT.AnyOEmbed = prismicT.AnyOEmbed,
10
11
  State extends prismicT.FieldState = prismicT.FieldState,
11
- > = MockValueConfig<Model> & MockValueStateConfig<State>;
12
+ > = {
13
+ url?: string;
14
+ html?: string;
15
+ data?: Data;
16
+ } & MockValueConfig<Model> &
17
+ MockValueStateConfig<State>;
12
18
 
13
19
  export type MockEmbedValue<
20
+ Data extends prismicT.AnyOEmbed = prismicT.AnyOEmbed,
14
21
  State extends prismicT.FieldState = prismicT.FieldState,
15
- > = prismicT.EmbedField<prismicT.AnyOEmbed & prismicT.OEmbedExtra, State>;
22
+ > = prismicT.EmbedField<Data, State>;
16
23
 
17
24
  export const embed = <
18
25
  Model extends prismicT.CustomTypeModelEmbedField = prismicT.CustomTypeModelEmbedField,
26
+ Data extends prismicT.AnyOEmbed = prismicT.AnyOEmbed,
19
27
  State extends prismicT.FieldState = "filled",
20
28
  >(
21
- config: MockEmbedValueConfig<Model, State> = {},
22
- ): MockEmbedValue<State> => {
23
- const embedData = getMockEmbedData({ seed: config.seed });
29
+ config: MockEmbedValueConfig<Model, Data, State> = {},
30
+ ): MockEmbedValue<Data, State> => {
31
+ const data = config.data ?? getMockEmbedData({ seed: config.seed });
24
32
 
25
33
  return (
26
34
  config.state === "empty"
27
35
  ? {}
28
- : buildEmbedField({ seed: config.seed, embedData })
29
- ) as MockEmbedValue<State>;
36
+ : buildEmbedField({
37
+ seed: config.seed,
38
+ url: config.url ?? ("embed_url" in data ? data.embed_url : undefined),
39
+ html: config.html ?? ("html" in data ? data.html : undefined),
40
+ data,
41
+ })
42
+ ) as MockEmbedValue<Data, State>;
30
43
  };
@@ -21,14 +21,12 @@ export const geoPoint = <
21
21
  ): MockGeoPointValue<State> => {
22
22
  const faker = createFaker(config.seed);
23
23
 
24
- const coordinates = faker.address.nearbyGPSCoordinate();
25
-
26
24
  return (
27
25
  config.state === "empty"
28
26
  ? {}
29
27
  : {
30
- longitude: Number.parseFloat(coordinates[0]),
31
- latitude: Number.parseFloat(coordinates[1]),
28
+ longitude: faker.rangeFloat(-180, 180),
29
+ latitude: faker.rangeFloat(-90, 90),
32
30
  }
33
31
  ) as MockGeoPointValue<State>;
34
32
  };
@@ -6,40 +6,46 @@ import {
6
6
  ValueForModelMapConfigs,
7
7
  } from "../lib/valueForModelMap";
8
8
 
9
- import { MockValueConfig, ModelValue } from "../types";
9
+ import { MockValueConfig, MockValueStateConfig, ModelValue } from "../types";
10
10
 
11
11
  import * as modelGen from "../model";
12
12
 
13
13
  export type MockGroupValueConfig<
14
14
  Model extends prismicT.CustomTypeModelGroupField = prismicT.CustomTypeModelGroupField,
15
+ State extends prismicT.FieldState = prismicT.FieldState,
15
16
  > = {
16
- itemsCount?: number;
17
+ itemsCount?: State extends "empty" ? 0 : number;
17
18
  configs?: ValueForModelMapConfigs;
18
- } & MockValueConfig<Model>;
19
+ } & MockValueConfig<Model> &
20
+ MockValueStateConfig<State>;
21
+
22
+ export type MockGroupValue<
23
+ State extends prismicT.FieldState = prismicT.FieldState,
24
+ > = prismicT.DateField<State>;
19
25
 
20
26
  export const group = <
21
27
  Model extends prismicT.CustomTypeModelGroupField = prismicT.CustomTypeModelGroupField,
28
+ State extends prismicT.FieldState = "filled",
22
29
  >(
23
- config: MockGroupValueConfig<Model> = {},
24
- ): ModelValue<Model> => {
25
- const faker = createFaker(config.seed);
26
-
27
- const model = config.model || modelGen.group({ seed: config.seed });
28
-
29
- const itemsCount =
30
- config.itemsCount ??
31
- faker.datatype.number({
32
- min: 1,
33
- max: 6,
34
- });
35
-
36
- return Array(itemsCount)
37
- .fill(undefined)
38
- .map(() => {
39
- return valueForModelMap({
40
- seed: config.seed,
41
- map: model.config.fields,
42
- configs: config.configs,
43
- });
44
- }) as ModelValue<Model>;
30
+ config: MockGroupValueConfig<Model, State> = {},
31
+ ): ModelValue<Model, State> => {
32
+ if (config.state === "empty") {
33
+ return [] as ModelValue<Model, State>;
34
+ } else {
35
+ const faker = createFaker(config.seed);
36
+
37
+ const model = config.model || modelGen.group({ seed: config.seed });
38
+
39
+ const itemsCount = config.itemsCount ?? faker.range(1, 6);
40
+
41
+ return Array(itemsCount)
42
+ .fill(undefined)
43
+ .map(() => {
44
+ return valueForModelMap({
45
+ seed: config.seed,
46
+ map: model.config.fields,
47
+ configs: config.configs,
48
+ });
49
+ }) as ModelValue<Model, State>;
50
+ }
45
51
  };
@@ -35,11 +35,11 @@ export const integrationFields = <
35
35
  config.state === "empty"
36
36
  ? null
37
37
  : {
38
- id: faker.git.shortSha(),
39
- title: changeCase.capitalCase(faker.lorem.words(3)),
40
- description: faker.lorem.sentence(),
38
+ id: faker.hash(7),
39
+ title: changeCase.capitalCase(faker.words(faker.range(1, 3))),
40
+ description: changeCase.sentenceCase(faker.words(faker.range(5, 10))),
41
41
  image_url: imageData.url,
42
- last_update: faker.date.past(20, new Date("2021-03-07")).getTime(),
42
+ last_update: faker.date().getTime(),
43
43
  blob: config.data as Blob,
44
44
  }
45
45
  ) as MockIntegrationFieldsValue<Blob, State>;
@@ -23,8 +23,6 @@ export const keyText = <
23
23
  const faker = createFaker(config.seed);
24
24
 
25
25
  return (
26
- config.state === "empty"
27
- ? null
28
- : changeCase.sentenceCase(faker.lorem.words(3))
26
+ config.state === "empty" ? null : changeCase.sentenceCase(faker.words(3))
29
27
  ) as MockKeyTextValue<State>;
30
28
  };
package/src/value/link.ts CHANGED
@@ -51,7 +51,7 @@ export const link = <
51
51
 
52
52
  const type =
53
53
  config.type ||
54
- faker.random.arrayElement([
54
+ faker.randomElement([
55
55
  prismicT.LinkType.Web,
56
56
  prismicT.LinkType.Document,
57
57
  prismicT.LinkType.Media,
@@ -84,10 +84,10 @@ export const link = <
84
84
 
85
85
  return {
86
86
  link_type: prismicT.LinkType.Web,
87
- url: faker.internet.url(),
87
+ url: faker.url(),
88
88
  target:
89
89
  config.withTargetBlank ??
90
- (model.config.allowTargetBlank && faker.datatype.boolean())
90
+ (model.config.allowTargetBlank && faker.boolean())
91
91
  ? "_blank"
92
92
  : undefined,
93
93
  } as MockLinkValue<LinkType, State>;
@@ -1,4 +1,5 @@
1
1
  import * as prismicT from "@prismicio/types";
2
+ import * as changeCase from "change-case";
2
3
 
3
4
  import { createFaker } from "../lib/createFaker";
4
5
 
@@ -28,12 +29,12 @@ export const linkToMedia = <
28
29
  } else {
29
30
  return {
30
31
  link_type: prismicT.LinkType.Media,
31
- name: faker.system.commonFileName(),
32
- kind: faker.system.commonFileType(),
33
- url: faker.internet.url(),
34
- size: faker.datatype.number().toString(),
35
- height: faker.datatype.number().toString(),
36
- width: faker.datatype.number().toString(),
32
+ name: `${changeCase.snakeCase(faker.words(faker.range(1, 2)))}.example`,
33
+ kind: changeCase.snakeCase(faker.word()),
34
+ url: faker.url(),
35
+ size: faker.range(500, 3000).toString(),
36
+ height: faker.range(500, 3000).toString(),
37
+ width: faker.range(500, 3000).toString(),
37
38
  } as MockLinkToMediaValue<State>;
38
39
  }
39
40
  };
@@ -22,6 +22,6 @@ export const number = <
22
22
  const faker = createFaker(config.seed);
23
23
 
24
24
  return (
25
- config.state === "empty" ? null : faker.datatype.number()
25
+ config.state === "empty" ? null : faker.range(1, 100)
26
26
  ) as MockNumberValue<State>;
27
27
  };
@@ -10,8 +10,8 @@ type MockRichTextEmbedValueConfig = MockRichTextValueConfig;
10
10
  export const embed = (
11
11
  config: MockRichTextEmbedValueConfig = {},
12
12
  ): prismicT.RTEmbedNode | undefined => {
13
- const embedData = getMockEmbedData({ seed: config.seed });
14
- const embedField = buildEmbedField({ seed: config.seed, embedData });
13
+ const data = getMockEmbedData({ seed: config.seed });
14
+ const embedField = buildEmbedField({ seed: config.seed, data });
15
15
 
16
16
  return {
17
17
  type: prismicT.RichTextNodeType.embed,
@@ -63,25 +63,18 @@ export const heading = (
63
63
  prismicT.RichTextNodeType.heading6,
64
64
  ].includes(type as RichTextNodeTitleType),
65
65
  ) as RichTextNodeTitleType[];
66
- const type = faker.random.arrayElement(types);
66
+ const type = faker.randomElement(types);
67
67
 
68
68
  if (type) {
69
69
  const patternKey =
70
70
  config.pattern ||
71
- faker.random.arrayElement(
72
- Object.keys(patterns) as (keyof typeof patterns)[],
73
- );
71
+ faker.randomElement(Object.keys(patterns) as (keyof typeof patterns)[]);
74
72
  const pattern = patterns[patternKey];
75
73
 
76
74
  return {
77
75
  type,
78
76
  text: changeCase.capitalCase(
79
- faker.lorem.words(
80
- faker.datatype.number({
81
- min: pattern.minWords,
82
- max: pattern.maxWords,
83
- }),
84
- ),
77
+ faker.words(faker.range(pattern.minWords, pattern.maxWords)),
85
78
  ),
86
79
  spans: [],
87
80
  };
@@ -14,16 +14,14 @@ export const image = (
14
14
  const imageField = buildImageFieldImage({
15
15
  seed: config.seed,
16
16
  imageData,
17
- state: false,
17
+ state: "filled",
18
18
  });
19
19
 
20
20
  return {
21
21
  type: prismicT.RichTextNodeType.image,
22
22
  alt: imageField.alt,
23
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
24
- url: imageField.url!,
23
+ url: imageField.url,
25
24
  copyright: imageField.copyright,
26
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
27
- dimensions: imageField.dimensions!,
25
+ dimensions: imageField.dimensions,
28
26
  };
29
27
  };
@@ -70,22 +70,17 @@ export const richText = (
70
70
  if (types.length > 0) {
71
71
  const patternKey =
72
72
  config.pattern ||
73
- faker.random.arrayElement(
74
- Object.keys(patterns) as (keyof typeof patterns)[],
75
- );
73
+ faker.randomElement(Object.keys(patterns) as (keyof typeof patterns)[]);
76
74
  const pattern = patterns[patternKey];
77
75
 
78
76
  const blockCount = supportsMultipleBlocks
79
- ? faker.datatype.number({
80
- min: pattern.blockCountMin,
81
- max: pattern.blockCountMax,
82
- })
77
+ ? faker.range(pattern.blockCountMin, pattern.blockCountMax)
83
78
  : 1;
84
79
 
85
80
  return Array(blockCount)
86
81
  .fill(undefined)
87
82
  .map(() => {
88
- const type = faker.random.arrayElement(types);
83
+ const type = faker.randomElement(types);
89
84
  const generator = generators[type];
90
85
 
91
86
  return generator({ seed: config.seed, model });
@@ -1,4 +1,5 @@
1
1
  import * as prismicT from "@prismicio/types";
2
+ import * as changeCase from "change-case";
2
3
 
3
4
  import { createFaker } from "../../lib/createFaker";
4
5
 
@@ -30,22 +31,17 @@ export const list = (
30
31
 
31
32
  const patternKey =
32
33
  config.pattern ||
33
- faker.random.arrayElement(
34
- Object.keys(patterns) as (keyof typeof patterns)[],
35
- );
34
+ faker.randomElement(Object.keys(patterns) as (keyof typeof patterns)[]);
36
35
  const pattern = patterns[patternKey];
37
36
 
38
- const itemsCount = faker.datatype.number({
39
- min: pattern.minItems,
40
- max: pattern.maxItems,
41
- });
37
+ const itemsCount = faker.range(pattern.minItems, pattern.maxItems);
42
38
 
43
39
  return Array(itemsCount)
44
40
  .fill(undefined)
45
41
  .map(() => {
46
42
  return {
47
43
  type: prismicT.RichTextNodeType.listItem,
48
- text: faker.lorem.sentence(),
44
+ text: changeCase.sentenceCase(faker.words(faker.range(5, 15))),
49
45
  spans: [],
50
46
  };
51
47
  });
@@ -1,4 +1,5 @@
1
1
  import * as prismicT from "@prismicio/types";
2
+ import * as changeCase from "change-case";
2
3
 
3
4
  import { createFaker } from "../../lib/createFaker";
4
5
 
@@ -30,22 +31,17 @@ export const oList = (
30
31
 
31
32
  const patternKey =
32
33
  config.pattern ||
33
- faker.random.arrayElement(
34
- Object.keys(patterns) as (keyof typeof patterns)[],
35
- );
34
+ faker.randomElement(Object.keys(patterns) as (keyof typeof patterns)[]);
36
35
  const pattern = patterns[patternKey];
37
36
 
38
- const itemsCount = faker.datatype.number({
39
- min: pattern.minItems,
40
- max: pattern.maxItems,
41
- });
37
+ const itemsCount = faker.range(pattern.minItems, pattern.maxItems);
42
38
 
43
39
  return Array(itemsCount)
44
40
  .fill(undefined)
45
41
  .map(() => {
46
42
  return {
47
43
  type: prismicT.RichTextNodeType.oListItem,
48
- text: faker.lorem.sentence(),
44
+ text: changeCase.sentenceCase(faker.words(faker.range(5, 15))),
49
45
  spans: [],
50
46
  };
51
47
  });
@@ -1,4 +1,5 @@
1
1
  import * as prismicT from "@prismicio/types";
2
+ import * as changeCase from "change-case";
2
3
 
3
4
  import { createFaker } from "../../lib/createFaker";
4
5
 
@@ -27,14 +28,17 @@ export const paragraph = (
27
28
 
28
29
  const patternKey =
29
30
  config.pattern ||
30
- faker.random.arrayElement(
31
- Object.keys(patterns) as (keyof typeof patterns)[],
32
- );
31
+ faker.randomElement(Object.keys(patterns) as (keyof typeof patterns)[]);
33
32
  const pattern = patterns[patternKey];
34
33
 
34
+ const text = Array.from(
35
+ { length: pattern.sentenceCount },
36
+ () => changeCase.sentenceCase(faker.words(faker.range(5, 15))) + ".",
37
+ ).join(" ");
38
+
35
39
  return {
36
40
  type: prismicT.RichTextNodeType.paragraph,
37
- text: faker.lorem.paragraph(pattern.sentenceCount),
41
+ text,
38
42
  spans: [],
39
43
  };
40
44
  };
@@ -1,4 +1,5 @@
1
1
  import * as prismicT from "@prismicio/types";
2
+ import * as changeCase from "change-case";
2
3
 
3
4
  import { createFaker } from "../../lib/createFaker";
4
5
 
@@ -27,15 +28,18 @@ export const preformatted = (
27
28
 
28
29
  const patternKey =
29
30
  config.pattern ||
30
- faker.random.arrayElement(
31
- Object.keys(patterns) as (keyof typeof patterns)[],
32
- );
31
+ faker.randomElement(Object.keys(patterns) as (keyof typeof patterns)[]);
33
32
  const pattern = patterns[patternKey];
34
33
 
34
+ // TODO: Use code, not lorem ipsum.
35
+ const text = Array.from(
36
+ { length: pattern.sentenceCount },
37
+ () => changeCase.sentenceCase(faker.words(faker.range(5, 15))) + ".",
38
+ ).join(" ");
39
+
35
40
  return {
36
41
  type: prismicT.RichTextNodeType.preformatted,
37
- // TODO: Use code, not lorem ipsum.
38
- text: faker.lorem.paragraph(pattern.sentenceCount),
42
+ text,
39
43
  spans: [],
40
44
  };
41
45
  };
@@ -31,9 +31,9 @@ export const select = <
31
31
  return null as MockSelectValue<Model, State>;
32
32
  } else {
33
33
  return (
34
- typeof defaultValue === "string" && faker.datatype.boolean()
34
+ typeof defaultValue === "string" && faker.boolean()
35
35
  ? defaultValue
36
- : faker.random.arrayElement(model.config.options)
36
+ : faker.randomElement(model.config.options)
37
37
  ) as MockSelectValue<Model, State>;
38
38
  }
39
39
  };
@@ -26,7 +26,7 @@ export const sharedSlice = <
26
26
  const faker = createFaker(config.seed);
27
27
 
28
28
  const model = config.model || modelGen.sharedSlice({ seed: config.seed });
29
- const variationModel = faker.random.arrayElement(model.variations);
29
+ const variationModel = faker.randomElement(model.variations);
30
30
 
31
31
  return sharedSliceVariation({
32
32
  seed: config.seed,
@@ -35,18 +35,14 @@ export const sharedSliceVariation = <
35
35
 
36
36
  const itemsCount =
37
37
  Object.keys(model.items).length > 0
38
- ? config.itemsCount ??
39
- faker.datatype.number({
40
- min: 1,
41
- max: 6,
42
- })
38
+ ? config.itemsCount ?? faker.range(1, 6)
43
39
  : 0;
44
40
 
45
41
  return {
46
42
  slice_type: sliceType,
47
43
  slice_label: null,
48
44
  variation: model.id,
49
- version: faker.git.shortSha(),
45
+ version: faker.hash(7),
50
46
  primary: valueForModelMap({
51
47
  seed: config.seed,
52
48
  map: model.primary,
@@ -35,15 +35,11 @@ export const slice = <
35
35
  const sliceLabel =
36
36
  config.label !== undefined
37
37
  ? config.label
38
- : changeCase.capitalCase(faker.company.bsNoun());
38
+ : changeCase.capitalCase(faker.words(faker.range(1, 2)));
39
39
 
40
40
  const itemsCount =
41
41
  Object.keys(model.repeat).length > 0
42
- ? config.itemsCount ??
43
- faker.datatype.number({
44
- min: 1,
45
- max: 6,
46
- })
42
+ ? config.itemsCount ?? faker.range(1, 6)
47
43
  : 0;
48
44
 
49
45
  return {
@@ -3,7 +3,7 @@ import * as prismicT from "@prismicio/types";
3
3
  import { createFaker } from "../lib/createFaker";
4
4
  import { ValueForModelMapConfigs } from "../lib/valueForModelMap";
5
5
 
6
- import { MockValueConfig, ModelValue } from "../types";
6
+ import { MockValueConfig, MockValueStateConfig, ModelValue } from "../types";
7
7
 
8
8
  import * as modelGen from "../model";
9
9
 
@@ -12,72 +12,73 @@ import { sharedSlice } from "./sharedSlice";
12
12
 
13
13
  export type MockSliceZoneValueConfig<
14
14
  Model extends prismicT.CustomTypeModelSliceZoneField = prismicT.CustomTypeModelSliceZoneField,
15
+ State extends prismicT.FieldState = prismicT.FieldState,
15
16
  > = {
16
17
  sharedSliceModels?: prismicT.SharedSliceModel[];
17
- itemsCount?: number;
18
+ itemsCount?: State extends "empty" ? 0 : number;
18
19
  primaryFieldConfigs?: ValueForModelMapConfigs;
19
20
  itemsFieldConfigs?: ValueForModelMapConfigs;
20
- } & MockValueConfig<Model>;
21
+ } & MockValueConfig<Model> &
22
+ MockValueStateConfig<State>;
21
23
 
22
24
  export const sliceZone = <
23
25
  Model extends prismicT.CustomTypeModelSliceZoneField = prismicT.CustomTypeModelSliceZoneField,
26
+ State extends prismicT.FieldState = prismicT.FieldState,
24
27
  >(
25
- config: MockSliceZoneValueConfig<Model> = {},
26
- ): ModelValue<Model> => {
27
- const faker = createFaker(config.seed);
28
-
29
- const model = config.model || modelGen.sliceZone({ seed: config.seed });
30
-
31
- if (Object.keys(model.config.choices).length > 0) {
32
- const itemsCount =
33
- config.itemsCount ??
34
- faker.datatype.number({
35
- min: 1,
36
- max: 6,
37
- });
28
+ config: MockSliceZoneValueConfig<Model, State> = {},
29
+ ): ModelValue<Model, State> => {
30
+ if (config.state === "empty") {
31
+ return [] as ModelValue<Model, State>;
32
+ } else {
33
+ const faker = createFaker(config.seed);
38
34
 
39
- return Array(itemsCount)
40
- .fill(undefined)
41
- .map(() => {
42
- const choices = Object.entries(model.config.choices);
43
- const [choiceType, choiceModel] = faker.random.arrayElement(choices);
35
+ const model = config.model || modelGen.sliceZone({ seed: config.seed });
44
36
 
45
- const choiceLabels = model.config.labels[choiceType] || [];
46
- const choiceLabel = faker.random.arrayElement(choiceLabels);
37
+ if (Object.keys(model.config.choices).length > 0) {
38
+ const itemsCount = config.itemsCount ?? faker.range(1, 6);
47
39
 
48
- switch (choiceModel.type) {
49
- case prismicT.CustomTypeModelSliceType.Slice: {
50
- return slice({
51
- seed: config.seed,
52
- model: choiceModel,
53
- type: choiceType,
54
- label: choiceLabel ? choiceLabel.name : null,
55
- primaryFieldConfigs: config.primaryFieldConfigs,
56
- itemsFieldConfigs: config.itemsFieldConfigs,
57
- });
58
- }
40
+ return Array(itemsCount)
41
+ .fill(undefined)
42
+ .map(() => {
43
+ const choices = Object.entries(model.config.choices);
44
+ const [choiceType, choiceModel] = faker.randomElement(choices);
59
45
 
60
- case prismicT.CustomTypeModelSliceType.SharedSlice: {
61
- const sharedSliceModel = config.sharedSliceModels?.find(
62
- (sharedSliceModel) => sharedSliceModel.id === choiceType,
63
- );
46
+ const choiceLabels = model.config.labels[choiceType] || [];
47
+ const choiceLabel = faker.randomElement(choiceLabels);
64
48
 
65
- if (sharedSliceModel) {
66
- return sharedSlice({
49
+ switch (choiceModel.type) {
50
+ case prismicT.CustomTypeModelSliceType.Slice: {
51
+ return slice({
67
52
  seed: config.seed,
68
- model: sharedSliceModel,
53
+ model: choiceModel,
54
+ type: choiceType,
55
+ label: choiceLabel ? choiceLabel.name : null,
69
56
  primaryFieldConfigs: config.primaryFieldConfigs,
70
57
  itemsFieldConfigs: config.itemsFieldConfigs,
71
58
  });
72
59
  }
60
+
61
+ case prismicT.CustomTypeModelSliceType.SharedSlice: {
62
+ const sharedSliceModel = config.sharedSliceModels?.find(
63
+ (sharedSliceModel) => sharedSliceModel.id === choiceType,
64
+ );
65
+
66
+ if (sharedSliceModel) {
67
+ return sharedSlice({
68
+ seed: config.seed,
69
+ model: sharedSliceModel,
70
+ primaryFieldConfigs: config.primaryFieldConfigs,
71
+ itemsFieldConfigs: config.itemsFieldConfigs,
72
+ });
73
+ }
74
+ }
73
75
  }
74
- }
75
- })
76
- .filter(
77
- (slice): slice is prismicT.Slice | prismicT.SharedSlice =>
78
- slice !== undefined,
79
- ) as ModelValue<Model>;
80
- } else {
81
- return [] as unknown as ModelValue<Model>;
76
+ })
77
+ .filter(
78
+ (slice): slice is NonNullable<typeof slice> => slice !== undefined,
79
+ ) as ModelValue<Model, State>;
80
+ } else {
81
+ return [] as unknown as ModelValue<Model, State>;
82
+ }
82
83
  }
83
84
  };