@prismicio/mock 0.0.6 → 0.0.9

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 (99) hide show
  1. package/README.md +4 -1
  2. package/dist/api/index.cjs +242 -122
  3. package/dist/api/index.cjs.map +1 -0
  4. package/dist/api/index.d.ts +3 -2
  5. package/dist/api/index.d.ts.map +1 -0
  6. package/dist/api/index.js +669 -0
  7. package/dist/api/index.js.map +1 -0
  8. package/dist/index.cjs +581 -571
  9. package/dist/index.cjs.map +1 -0
  10. package/dist/index.d.ts +155 -247
  11. package/dist/{index.mjs → index.js} +574 -561
  12. package/dist/index.js.map +1 -0
  13. package/dist/model/index.cjs +294 -257
  14. package/dist/model/index.cjs.map +1 -0
  15. package/dist/model/index.d.ts +72 -106
  16. package/dist/model/index.d.ts.map +1 -0
  17. package/dist/model/index.js +556 -0
  18. package/dist/model/index.js.map +1 -0
  19. package/dist/value/index.cjs +500 -647
  20. package/dist/value/index.cjs.map +1 -0
  21. package/dist/value/index.d.ts +71 -129
  22. package/dist/value/index.d.ts.map +1 -0
  23. package/dist/value/index.js +1461 -0
  24. package/dist/value/index.js.map +1 -0
  25. package/package.json +30 -27
  26. package/src/api/query.ts +2 -2
  27. package/src/api/ref.ts +3 -3
  28. package/src/api/repository.ts +5 -5
  29. package/src/lib/buildContentRelationshipField.ts +6 -1
  30. package/src/lib/buildEmbedField.ts +16 -27
  31. package/src/lib/buildImageFieldImage.ts +49 -0
  32. package/src/lib/createFaker.ts +98 -20
  33. package/src/lib/generateCustomTypeId.ts +1 -1
  34. package/src/lib/generateFieldId.ts +1 -3
  35. package/src/lib/generateTags.ts +4 -12
  36. package/src/lib/getMockEmbedData.ts +33 -12
  37. package/src/lib/getMockImageData.ts +1 -1
  38. package/src/lib/lorem.ts +112 -0
  39. package/src/model/boolean.ts +1 -1
  40. package/src/model/buildMockGroupFieldMap.ts +65 -0
  41. package/src/model/color.ts +2 -2
  42. package/src/model/contentRelationship.ts +16 -23
  43. package/src/model/customType.ts +49 -48
  44. package/src/model/date.ts +2 -2
  45. package/src/model/embed.ts +2 -2
  46. package/src/model/geoPoint.ts +1 -1
  47. package/src/model/group.ts +9 -16
  48. package/src/model/image.ts +16 -20
  49. package/src/model/index.ts +2 -0
  50. package/src/model/integrationFields.ts +5 -3
  51. package/src/model/keyText.ts +2 -2
  52. package/src/model/link.ts +3 -3
  53. package/src/model/linkToMedia.ts +2 -2
  54. package/src/model/number.ts +2 -2
  55. package/src/model/richText.ts +6 -6
  56. package/src/model/select.ts +13 -18
  57. package/src/model/sharedSlice.ts +15 -42
  58. package/src/model/sharedSliceVariation.ts +36 -24
  59. package/src/model/slice.ts +19 -23
  60. package/src/model/sliceZone.ts +23 -59
  61. package/src/model/timestamp.ts +2 -2
  62. package/src/model/title.ts +5 -5
  63. package/src/model/uid.ts +2 -2
  64. package/src/types.ts +130 -88
  65. package/src/value/boolean.ts +1 -1
  66. package/src/value/color.ts +16 -6
  67. package/src/value/contentRelationship.ts +54 -39
  68. package/src/value/customType.ts +5 -5
  69. package/src/value/date.ts +25 -9
  70. package/src/value/embed.ts +32 -7
  71. package/src/value/geoPoint.ts +21 -11
  72. package/src/value/group.ts +31 -45
  73. package/src/value/image.ts +22 -9
  74. package/src/value/integrationFields.ts +26 -14
  75. package/src/value/keyText.ts +16 -6
  76. package/src/value/link.ts +36 -37
  77. package/src/value/linkToMedia.ts +19 -23
  78. package/src/value/number.ts +16 -6
  79. package/src/value/richText/embed.ts +2 -2
  80. package/src/value/richText/heading.ts +10 -17
  81. package/src/value/richText/image.ts +8 -6
  82. package/src/value/richText/index.ts +4 -9
  83. package/src/value/richText/list.ts +4 -8
  84. package/src/value/richText/oList.ts +4 -8
  85. package/src/value/richText/paragraph.ts +8 -4
  86. package/src/value/richText/preformatted.ts +9 -5
  87. package/src/value/select.ts +23 -8
  88. package/src/value/sharedSlice.ts +3 -3
  89. package/src/value/sharedSliceVariation.ts +4 -36
  90. package/src/value/slice.ts +3 -32
  91. package/src/value/sliceZone.ts +54 -69
  92. package/src/value/timestamp.ts +42 -16
  93. package/src/value/title.ts +26 -13
  94. package/src/value/uid.ts +2 -2
  95. package/dist/api/index.mjs +0 -515
  96. package/dist/model/index.mjs +0 -465
  97. package/dist/value/index.mjs +0 -1554
  98. package/src/lib/buildImageField.ts +0 -34
  99. package/src/lib/buildMockGroupFieldMap.ts +0 -84
@@ -8,12 +8,12 @@ import { MockRichTextValueConfig } from "../../types";
8
8
  import * as modelGen from "../../model";
9
9
 
10
10
  type RichTextNodeTitleType =
11
- | prismicT.RichTextNodeType.heading1
12
- | prismicT.RichTextNodeType.heading2
13
- | prismicT.RichTextNodeType.heading3
14
- | prismicT.RichTextNodeType.heading4
15
- | prismicT.RichTextNodeType.heading5
16
- | prismicT.RichTextNodeType.heading6;
11
+ | typeof prismicT.RichTextNodeType.heading1
12
+ | typeof prismicT.RichTextNodeType.heading2
13
+ | typeof prismicT.RichTextNodeType.heading3
14
+ | typeof prismicT.RichTextNodeType.heading4
15
+ | typeof prismicT.RichTextNodeType.heading5
16
+ | typeof prismicT.RichTextNodeType.heading6;
17
17
 
18
18
  type RTHeadingNode =
19
19
  | prismicT.RTHeading1Node
@@ -61,27 +61,20 @@ export const heading = (
61
61
  prismicT.RichTextNodeType.heading4,
62
62
  prismicT.RichTextNodeType.heading5,
63
63
  prismicT.RichTextNodeType.heading6,
64
- ].includes(type as prismicT.RichTextNodeType),
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
  };
@@ -1,6 +1,6 @@
1
1
  import * as prismicT from "@prismicio/types";
2
2
 
3
- import { buildImageField } from "../../lib/buildImageField";
3
+ import { buildImageFieldImage } from "../../lib/buildImageFieldImage";
4
4
  import { getMockImageData } from "../../lib/getMockImageData";
5
5
 
6
6
  import { MockRichTextValueConfig } from "../../types";
@@ -11,15 +11,17 @@ export const image = (
11
11
  config: MockRichTextImageValueConfig = {},
12
12
  ): prismicT.RTImageNode | undefined => {
13
13
  const imageData = getMockImageData({ seed: config.seed });
14
- const imageField = buildImageField({ seed: config.seed, imageData });
14
+ const imageField = buildImageFieldImage({
15
+ seed: config.seed,
16
+ imageData,
17
+ state: "filled",
18
+ });
15
19
 
16
20
  return {
17
21
  type: prismicT.RichTextNodeType.image,
18
22
  alt: imageField.alt,
19
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
20
- url: imageField.url!,
23
+ url: imageField.url,
21
24
  copyright: imageField.copyright,
22
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
23
- dimensions: imageField.dimensions!,
25
+ dimensions: imageField.dimensions,
24
26
  };
25
27
  };
@@ -70,29 +70,24 @@ 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 });
92
87
  })
93
88
  .flat()
94
89
  .filter((block): block is prismicT.RTNode => block !== undefined)
95
- .slice(0, blockCount);
90
+ .slice(0, blockCount) as prismicT.RichTextField;
96
91
  } else {
97
92
  return [];
98
93
  }
@@ -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
  };
@@ -2,23 +2,38 @@ import * as prismicT from "@prismicio/types";
2
2
 
3
3
  import { createFaker } from "../lib/createFaker";
4
4
 
5
- import { MockValueConfig } from "../types";
5
+ import { MockValueStateConfig, MockValueConfig } from "../types";
6
6
 
7
7
  import * as modelGen from "../model";
8
8
 
9
9
  export type MockSelectValueConfig<
10
10
  Model extends prismicT.CustomTypeModelSelectField = prismicT.CustomTypeModelSelectField,
11
- > = MockValueConfig<Model>;
11
+ State extends prismicT.FieldState = prismicT.FieldState,
12
+ > = MockValueConfig<Model> & MockValueStateConfig<State>;
12
13
 
13
- export const select = (
14
- config: MockSelectValueConfig = {},
15
- ): prismicT.SelectField => {
14
+ export type MockSelectValue<
15
+ Model extends prismicT.CustomTypeModelSelectField = prismicT.CustomTypeModelSelectField,
16
+ State extends prismicT.FieldState = prismicT.FieldState,
17
+ > = prismicT.SelectField<Model["config"]["options"][number], State>;
18
+
19
+ export const select = <
20
+ Model extends prismicT.CustomTypeModelSelectField = prismicT.CustomTypeModelSelectField,
21
+ State extends prismicT.FieldState = "filled",
22
+ >(
23
+ config: MockSelectValueConfig<Model, State> = {},
24
+ ): MockSelectValue<Model, State> => {
16
25
  const faker = createFaker(config.seed);
17
26
 
18
27
  const model = config.model || modelGen.select({ seed: config.seed });
19
28
  const defaultValue = model.config.default_value;
20
29
 
21
- return typeof defaultValue === "string" && faker.datatype.boolean()
22
- ? defaultValue
23
- : faker.random.arrayElement(model.config.options);
30
+ if (config.state === "empty") {
31
+ return null as MockSelectValue<Model, State>;
32
+ } else {
33
+ return (
34
+ typeof defaultValue === "string" && faker.boolean()
35
+ ? defaultValue
36
+ : faker.randomElement(model.config.options)
37
+ ) as MockSelectValue<Model, State>;
38
+ }
24
39
  };
@@ -14,7 +14,7 @@ export type MockSharedSliceValueConfig<
14
14
  Model extends prismicT.SharedSliceModel = prismicT.SharedSliceModel,
15
15
  > = Pick<
16
16
  MockSharedSliceVariationValueConfig,
17
- "pattern" | "primaryFieldConfigs" | "itemsFieldConfigs"
17
+ "itemsCount" | "primaryFieldConfigs" | "itemsFieldConfigs"
18
18
  > &
19
19
  MockValueConfig<Model>;
20
20
 
@@ -26,12 +26,12 @@ 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,
33
33
  model: variationModel,
34
- pattern: config.pattern,
34
+ itemsCount: config.itemsCount,
35
35
  type: model.id,
36
36
  primaryFieldConfigs: config.primaryFieldConfigs,
37
37
  itemsFieldConfigs: config.itemsFieldConfigs,
@@ -1,5 +1,4 @@
1
1
  import * as prismicT from "@prismicio/types";
2
- import * as changeCase from "change-case";
3
2
 
4
3
  import { MockValueConfig, ModelValue } from "../types";
5
4
 
@@ -12,31 +11,12 @@ import {
12
11
 
13
12
  import * as modelGen from "../model";
14
13
 
15
- const patterns = {
16
- none: {
17
- minItems: 0,
18
- maxItems: 0,
19
- },
20
- short: {
21
- minItems: 1,
22
- maxItems: 3,
23
- },
24
- medium: {
25
- minItems: 3,
26
- maxItems: 6,
27
- },
28
- long: {
29
- minItems: 6,
30
- maxItems: 12,
31
- },
32
- } as const;
33
-
34
14
  export type MockSharedSliceVariationValueConfig<
35
15
  Model extends prismicT.SharedSliceModelVariation = prismicT.SharedSliceModelVariation,
36
16
  > = {
37
17
  type?: string;
38
18
  label?: string;
39
- pattern?: keyof typeof patterns;
19
+ itemsCount?: number;
40
20
  primaryFieldConfigs?: ValueForModelMapConfigs;
41
21
  itemsFieldConfigs?: ValueForModelMapConfigs;
42
22
  } & MockValueConfig<Model>;
@@ -51,30 +31,18 @@ export const sharedSliceVariation = <
51
31
  const model =
52
32
  config.model || modelGen.sharedSliceVariation({ seed: config.seed });
53
33
 
54
- const patternKey =
55
- config.pattern ||
56
- faker.random.arrayElement(
57
- Object.keys(patterns) as (keyof typeof patterns)[],
58
- );
59
- const pattern = patterns[patternKey];
60
-
61
34
  const sliceType = config.type ?? generateFieldId({ seed: config.seed });
62
- const sliceLabel =
63
- config.label ?? changeCase.capitalCase(faker.company.bsNoun());
64
35
 
65
36
  const itemsCount =
66
37
  Object.keys(model.items).length > 0
67
- ? faker.datatype.number({
68
- min: pattern.minItems,
69
- max: pattern.maxItems,
70
- })
38
+ ? config.itemsCount ?? faker.range(1, 6)
71
39
  : 0;
72
40
 
73
41
  return {
74
42
  slice_type: sliceType,
75
- slice_label: sliceLabel,
43
+ slice_label: null,
76
44
  variation: model.id,
77
- version: faker.git.shortSha(),
45
+ version: faker.hash(7),
78
46
  primary: valueForModelMap({
79
47
  seed: config.seed,
80
48
  map: model.primary,
@@ -12,31 +12,12 @@ import {
12
12
 
13
13
  import * as modelGen from "../model";
14
14
 
15
- const patterns = {
16
- none: {
17
- minItems: 0,
18
- maxItems: 0,
19
- },
20
- short: {
21
- minItems: 1,
22
- maxItems: 3,
23
- },
24
- medium: {
25
- minItems: 3,
26
- maxItems: 6,
27
- },
28
- long: {
29
- minItems: 6,
30
- maxItems: 12,
31
- },
32
- } as const;
33
-
34
15
  export type MockSliceValueConfig<
35
16
  Model extends prismicT.CustomTypeModelSlice = prismicT.CustomTypeModelSlice,
36
17
  > = {
37
18
  type?: string;
38
19
  label?: string | null;
39
- pattern?: keyof typeof patterns;
20
+ itemsCount?: number;
40
21
  primaryFieldConfigs?: ValueForModelMapConfigs;
41
22
  itemsFieldConfigs?: ValueForModelMapConfigs;
42
23
  } & MockValueConfig<Model>;
@@ -50,25 +31,15 @@ export const slice = <
50
31
 
51
32
  const model = config.model || modelGen.slice({ seed: config.seed });
52
33
 
53
- const patternKey =
54
- config.pattern ||
55
- faker.random.arrayElement(
56
- Object.keys(patterns) as (keyof typeof patterns)[],
57
- );
58
- const pattern = patterns[patternKey];
59
-
60
34
  const sliceType = config.type ?? generateFieldId({ seed: config.seed });
61
35
  const sliceLabel =
62
36
  config.label !== undefined
63
37
  ? config.label
64
- : changeCase.capitalCase(faker.company.bsNoun());
38
+ : changeCase.capitalCase(faker.words(faker.range(1, 2)));
65
39
 
66
40
  const itemsCount =
67
41
  Object.keys(model.repeat).length > 0
68
- ? faker.datatype.number({
69
- min: pattern.minItems,
70
- max: pattern.maxItems,
71
- })
42
+ ? config.itemsCount ?? faker.range(1, 6)
72
43
  : 0;
73
44
 
74
45
  return {
@@ -3,97 +3,82 @@ 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
 
10
10
  import { slice } from "./slice";
11
11
  import { sharedSlice } from "./sharedSlice";
12
12
 
13
- const patterns = {
14
- short: {
15
- minItems: 1,
16
- maxItems: 3,
17
- },
18
- medium: {
19
- minItems: 3,
20
- maxItems: 6,
21
- },
22
- long: {
23
- minItems: 6,
24
- maxItems: 12,
25
- },
26
- } as const;
27
-
28
13
  export type MockSliceZoneValueConfig<
29
14
  Model extends prismicT.CustomTypeModelSliceZoneField = prismicT.CustomTypeModelSliceZoneField,
15
+ State extends prismicT.FieldState = prismicT.FieldState,
30
16
  > = {
31
17
  sharedSliceModels?: prismicT.SharedSliceModel[];
32
- pattern?: keyof typeof patterns;
18
+ itemsCount?: State extends "empty" ? 0 : number;
33
19
  primaryFieldConfigs?: ValueForModelMapConfigs;
34
20
  itemsFieldConfigs?: ValueForModelMapConfigs;
35
- } & MockValueConfig<Model>;
21
+ } & MockValueConfig<Model> &
22
+ MockValueStateConfig<State>;
36
23
 
37
24
  export const sliceZone = <
38
25
  Model extends prismicT.CustomTypeModelSliceZoneField = prismicT.CustomTypeModelSliceZoneField,
26
+ State extends prismicT.FieldState = prismicT.FieldState,
39
27
  >(
40
- config: MockSliceZoneValueConfig<Model> = {},
41
- ): ModelValue<Model> => {
42
- const faker = createFaker(config.seed);
43
-
44
- const model = config.model || modelGen.sliceZone({ seed: config.seed });
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);
45
34
 
46
- const patternKey =
47
- config.pattern ||
48
- faker.random.arrayElement(
49
- Object.keys(patterns) as (keyof typeof patterns)[],
50
- );
51
- const pattern = patterns[patternKey];
35
+ const model = config.model || modelGen.sliceZone({ seed: config.seed });
52
36
 
53
- const itemsCount = faker.datatype.number({
54
- min: pattern.minItems,
55
- max: pattern.maxItems,
56
- });
37
+ if (Object.keys(model.config.choices).length > 0) {
38
+ const itemsCount = config.itemsCount ?? faker.range(1, 6);
57
39
 
58
- return Array(itemsCount)
59
- .fill(undefined)
60
- .map(() => {
61
- const choices = Object.entries(model.config.choices);
62
- const [choiceType, choiceModel] = faker.random.arrayElement(choices);
40
+ return Array(itemsCount)
41
+ .fill(undefined)
42
+ .map(() => {
43
+ const choices = Object.entries(model.config.choices);
44
+ const [choiceType, choiceModel] = faker.randomElement(choices);
63
45
 
64
- const choiceLabels = model.config.labels[choiceType] || [];
65
- const choiceLabel = faker.random.arrayElement(choiceLabels);
46
+ const choiceLabels = model.config.labels[choiceType] || [];
47
+ const choiceLabel = faker.randomElement(choiceLabels);
66
48
 
67
- switch (choiceModel.type) {
68
- case prismicT.CustomTypeModelSliceType.Slice: {
69
- return slice({
70
- seed: config.seed,
71
- model: choiceModel,
72
- type: choiceType,
73
- label: choiceLabel ? choiceLabel.name : null,
74
- primaryFieldConfigs: config.primaryFieldConfigs,
75
- itemsFieldConfigs: config.itemsFieldConfigs,
76
- });
77
- }
49
+ switch (choiceModel.type) {
50
+ case prismicT.CustomTypeModelSliceType.Slice: {
51
+ return slice({
52
+ seed: config.seed,
53
+ model: choiceModel,
54
+ type: choiceType,
55
+ label: choiceLabel ? choiceLabel.name : null,
56
+ primaryFieldConfigs: config.primaryFieldConfigs,
57
+ itemsFieldConfigs: config.itemsFieldConfigs,
58
+ });
59
+ }
78
60
 
79
- case prismicT.CustomTypeModelSliceType.SharedSlice: {
80
- const sharedSliceModel = config.sharedSliceModels?.find(
81
- (sharedSliceModel) => sharedSliceModel.id === choiceType,
82
- );
61
+ case prismicT.CustomTypeModelSliceType.SharedSlice: {
62
+ const sharedSliceModel = config.sharedSliceModels?.find(
63
+ (sharedSliceModel) => sharedSliceModel.id === choiceType,
64
+ );
83
65
 
84
- if (sharedSliceModel) {
85
- return sharedSlice({
86
- seed: config.seed,
87
- model: sharedSliceModel,
88
- primaryFieldConfigs: config.primaryFieldConfigs,
89
- itemsFieldConfigs: config.itemsFieldConfigs,
90
- });
66
+ if (sharedSliceModel) {
67
+ return sharedSlice({
68
+ seed: config.seed,
69
+ model: sharedSliceModel,
70
+ primaryFieldConfigs: config.primaryFieldConfigs,
71
+ itemsFieldConfigs: config.itemsFieldConfigs,
72
+ });
73
+ }
74
+ }
91
75
  }
92
- }
93
- }
94
- })
95
- .filter(
96
- (slice): slice is prismicT.Slice | prismicT.SharedSlice =>
97
- slice !== undefined,
98
- ) 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
+ }
83
+ }
99
84
  };
@@ -2,29 +2,55 @@ import * as prismicT from "@prismicio/types";
2
2
 
3
3
  import { createFaker } from "../lib/createFaker";
4
4
 
5
- import { MockValueConfig } from "../types";
5
+ import { MockValueStateConfig, MockValueConfig } from "../types";
6
6
 
7
7
  export type MockTimestampValueConfig<
8
8
  Model extends prismicT.CustomTypeModelTimestampField = prismicT.CustomTypeModelTimestampField,
9
+ State extends prismicT.FieldState = prismicT.FieldState,
9
10
  > = {
10
11
  after?: Date;
11
12
  before?: Date;
12
- } & MockValueConfig<Model>;
13
+ } & MockValueConfig<Model> &
14
+ MockValueStateConfig<State>;
13
15
 
14
- export const timestamp = (
15
- config: MockTimestampValueConfig = {},
16
- ): prismicT.TimestampField => {
16
+ export type MockTimestampValue<
17
+ State extends prismicT.FieldState = prismicT.FieldState,
18
+ > = prismicT.TimestampField<State>;
19
+
20
+ export const timestamp = <
21
+ Model extends prismicT.CustomTypeModelTimestampField = prismicT.CustomTypeModelTimestampField,
22
+ State extends prismicT.FieldState = "filled",
23
+ >(
24
+ config: MockTimestampValueConfig<Model, State> = {},
25
+ ): MockTimestampValue<State> => {
17
26
  const faker = createFaker(config.seed);
18
27
 
19
- // Faker seems to have problems accepting parameters for `faker.date.between`
20
- // if the parameters are too precise. We can get around this by only using
21
- // generated dates, not timestamps.
22
- const after =
23
- config.after ||
24
- faker.date.past(20, new Date("2021-03-07")).toISOString().split("T")[0];
25
- const before =
26
- config.before ||
27
- faker.date.future(20, new Date("2021-03-07")).toISOString().split("T")[0];
28
-
29
- return faker.date.between(after, before).toISOString();
28
+ if (config.state === "empty") {
29
+ return null as MockTimestampValue<State>;
30
+ } else {
31
+ let date: Date;
32
+
33
+ // Working with Date objects produces non-deterministic values;
34
+ // machines can return different values due to differing
35
+ // timezones and other unknown factors. To get around this, we
36
+ // can can remove time from the given values and only use their dates.
37
+ const after = config.after
38
+ ? new Date(config.after.toISOString().split("T")[0])
39
+ : undefined;
40
+ const before = config.before
41
+ ? new Date(config.before.toISOString().split("T")[0])
42
+ : undefined;
43
+
44
+ if (after && before) {
45
+ date = faker.dateBetween(after, before);
46
+ } else if (after) {
47
+ date = faker.dateAfter(after);
48
+ } else if (before) {
49
+ date = faker.dateBefore(before);
50
+ } else {
51
+ date = faker.date();
52
+ }
53
+
54
+ return date.toISOString() as MockTimestampValue<State>;
55
+ }
30
56
  };