@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
package/src/value/date.ts CHANGED
@@ -1,18 +1,34 @@
1
1
  import * as prismicT from "@prismicio/types";
2
2
 
3
- import { MockValueConfig } from "../types";
3
+ import { MockValueStateConfig, MockValueConfig } from "../types";
4
4
 
5
5
  import { MockTimestampValueConfig, timestamp } from "./timestamp";
6
6
 
7
7
  export type MockDateValueConfig<
8
8
  Model extends prismicT.CustomTypeModelDateField = prismicT.CustomTypeModelDateField,
9
- > = Pick<MockTimestampValueConfig, "after" | "before"> & MockValueConfig<Model>;
9
+ State extends prismicT.FieldState = prismicT.FieldState,
10
+ > = Pick<MockTimestampValueConfig, "after" | "before"> &
11
+ MockValueConfig<Model> &
12
+ MockValueStateConfig<State>;
10
13
 
11
- export const date = (config: MockDateValueConfig = {}): prismicT.DateField => {
12
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
13
- return timestamp({
14
- seed: config.seed,
15
- after: config.after,
16
- before: config.before,
17
- })!.split("T")[0];
14
+ export type MockDateValue<
15
+ State extends prismicT.FieldState = prismicT.FieldState,
16
+ > = prismicT.DateField<State>;
17
+
18
+ export const date = <
19
+ Model extends prismicT.CustomTypeModelDateField = prismicT.CustomTypeModelDateField,
20
+ State extends prismicT.FieldState = "filled",
21
+ >(
22
+ config: MockDateValueConfig<Model, State> = {},
23
+ ): MockDateValue<State> => {
24
+ return (
25
+ config.state === "empty"
26
+ ? null
27
+ : timestamp({
28
+ seed: config.seed,
29
+ after: config.after,
30
+ before: config.before,
31
+ state: "filled",
32
+ }).split("T")[0]
33
+ ) as MockDateValue<State>;
18
34
  };
@@ -3,16 +3,41 @@ import * as prismicT from "@prismicio/types";
3
3
  import { buildEmbedField } from "../lib/buildEmbedField";
4
4
  import { getMockEmbedData } from "../lib/getMockEmbedData";
5
5
 
6
- import { MockValueConfig } from "../types";
6
+ import { MockValueStateConfig, MockValueConfig } from "../types";
7
7
 
8
8
  export type MockEmbedValueConfig<
9
9
  Model extends prismicT.CustomTypeModelEmbedField = prismicT.CustomTypeModelEmbedField,
10
- > = MockValueConfig<Model>;
10
+ Data extends prismicT.AnyOEmbed = prismicT.AnyOEmbed,
11
+ State extends prismicT.FieldState = prismicT.FieldState,
12
+ > = {
13
+ url?: string;
14
+ html?: string;
15
+ data?: Data;
16
+ } & MockValueConfig<Model> &
17
+ MockValueStateConfig<State>;
11
18
 
12
- export const embed = (
13
- config: MockEmbedValueConfig = {},
14
- ): prismicT.EmbedField => {
15
- const embedData = getMockEmbedData({ seed: config.seed });
19
+ export type MockEmbedValue<
20
+ Data extends prismicT.AnyOEmbed = prismicT.AnyOEmbed,
21
+ State extends prismicT.FieldState = prismicT.FieldState,
22
+ > = prismicT.EmbedField<Data, State>;
16
23
 
17
- return buildEmbedField({ seed: config.seed, embedData });
24
+ export const embed = <
25
+ Model extends prismicT.CustomTypeModelEmbedField = prismicT.CustomTypeModelEmbedField,
26
+ Data extends prismicT.AnyOEmbed = prismicT.AnyOEmbed,
27
+ State extends prismicT.FieldState = "filled",
28
+ >(
29
+ config: MockEmbedValueConfig<Model, Data, State> = {},
30
+ ): MockEmbedValue<Data, State> => {
31
+ const data = config.data ?? getMockEmbedData({ seed: config.seed });
32
+
33
+ return (
34
+ config.state === "empty"
35
+ ? {}
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>;
18
43
  };
@@ -2,21 +2,31 @@ 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 MockGeoPointValueConfig<
8
8
  Model extends prismicT.CustomTypeModelGeoPointField = prismicT.CustomTypeModelGeoPointField,
9
- > = MockValueConfig<Model>;
9
+ State extends prismicT.FieldState = prismicT.FieldState,
10
+ > = MockValueConfig<Model> & MockValueStateConfig<State>;
10
11
 
11
- export const geoPoint = (
12
- config: MockGeoPointValueConfig = {},
13
- ): prismicT.GeoPointField => {
14
- const faker = createFaker(config.seed);
12
+ export type MockGeoPointValue<
13
+ State extends prismicT.FieldState = prismicT.FieldState,
14
+ > = prismicT.GeoPointField<State>;
15
15
 
16
- const coordinates = faker.address.nearbyGPSCoordinate();
16
+ export const geoPoint = <
17
+ Model extends prismicT.CustomTypeModelGeoPointField = prismicT.CustomTypeModelGeoPointField,
18
+ State extends prismicT.FieldState = "filled",
19
+ >(
20
+ config: MockGeoPointValueConfig<Model, State> = {},
21
+ ): MockGeoPointValue<State> => {
22
+ const faker = createFaker(config.seed);
17
23
 
18
- return {
19
- longitude: Number.parseFloat(coordinates[0]),
20
- latitude: Number.parseFloat(coordinates[1]),
21
- };
24
+ return (
25
+ config.state === "empty"
26
+ ? {}
27
+ : {
28
+ longitude: faker.rangeFloat(-180, 180),
29
+ latitude: faker.rangeFloat(-90, 90),
30
+ }
31
+ ) as MockGeoPointValue<State>;
22
32
  };
@@ -6,60 +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
- 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 MockGroupValueConfig<
29
14
  Model extends prismicT.CustomTypeModelGroupField = prismicT.CustomTypeModelGroupField,
15
+ State extends prismicT.FieldState = prismicT.FieldState,
30
16
  > = {
31
- pattern?: keyof typeof patterns;
17
+ itemsCount?: State extends "empty" ? 0 : number;
32
18
  configs?: ValueForModelMapConfigs;
33
- } & MockValueConfig<Model>;
19
+ } & MockValueConfig<Model> &
20
+ MockValueStateConfig<State>;
21
+
22
+ export type MockGroupValue<
23
+ State extends prismicT.FieldState = prismicT.FieldState,
24
+ > = prismicT.DateField<State>;
34
25
 
35
26
  export const group = <
36
27
  Model extends prismicT.CustomTypeModelGroupField = prismicT.CustomTypeModelGroupField,
28
+ State extends prismicT.FieldState = "filled",
37
29
  >(
38
- config: MockGroupValueConfig<Model> = {},
39
- ): ModelValue<Model> => {
40
- const faker = createFaker(config.seed);
41
-
42
- const model = config.model || modelGen.group({ seed: config.seed });
43
-
44
- const patternKey =
45
- config.pattern ||
46
- faker.random.arrayElement(
47
- Object.keys(patterns) as (keyof typeof patterns)[],
48
- );
49
- const pattern = patterns[patternKey];
50
-
51
- const itemsCount = faker.datatype.number({
52
- min: pattern.minItems,
53
- max: pattern.maxItems,
54
- });
55
-
56
- return Array(itemsCount)
57
- .fill(undefined)
58
- .map(() => {
59
- return valueForModelMap({
60
- seed: config.seed,
61
- map: model.config.fields,
62
- configs: config.configs,
63
- });
64
- }) 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
+ }
65
51
  };
@@ -1,36 +1,49 @@
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
- import { MockValueConfig } from "../types";
6
+ import { MockValueStateConfig, MockValueConfig } from "../types";
7
7
 
8
8
  import * as modelGen from "../model";
9
9
 
10
10
  export type MockImageValueConfig<
11
11
  Model extends prismicT.CustomTypeModelImageField = prismicT.CustomTypeModelImageField,
12
- > = MockValueConfig<Model>;
12
+ State extends prismicT.FieldState = prismicT.FieldState,
13
+ > = MockValueConfig<Model> & MockValueStateConfig<State>;
13
14
 
14
- export const image = (
15
- config: MockImageValueConfig = {},
16
- ): prismicT.ImageField => {
15
+ export type MockImageValue<
16
+ Model extends prismicT.CustomTypeModelImageField = prismicT.CustomTypeModelImageField,
17
+ State extends prismicT.FieldState = prismicT.FieldState,
18
+ > = prismicT.ImageField<Model["config"]["thumbnails"][number]["name"], State>;
19
+
20
+ export const image = <
21
+ Model extends prismicT.CustomTypeModelImageField = prismicT.CustomTypeModelImageField,
22
+ State extends prismicT.FieldState = "filled",
23
+ >(
24
+ config: MockImageValueConfig<Model, State> = {},
25
+ ): MockImageValue<Model, State> => {
17
26
  const model = config.model || modelGen.image({ seed: config.seed });
18
27
  const imageData = getMockImageData({ seed: config.seed });
19
28
 
20
- const value = buildImageField({
29
+ const value = buildImageFieldImage({
21
30
  seed: config.seed,
22
31
  imageData,
23
32
  constraint: model.config.constraint,
24
- });
33
+ state: config.state,
34
+ }) as MockImageValue<Model, State>;
25
35
 
26
36
  for (const thumbnail of model.config.thumbnails) {
27
- value[thumbnail.name] = buildImageField({
37
+ // TODO: Resolve the following type error
38
+ // @ts-expect-error - Unsure how to fix this type mismatch
39
+ value[thumbnail.name as keyof typeof value] = buildImageFieldImage({
28
40
  seed: config.seed,
29
41
  imageData,
30
42
  constraint: {
31
43
  width: thumbnail.width,
32
44
  height: thumbnail.height,
33
45
  },
46
+ state: config.state,
34
47
  });
35
48
  }
36
49
 
@@ -4,31 +4,43 @@ import * as changeCase from "change-case";
4
4
  import { createFaker } from "../lib/createFaker";
5
5
  import { getMockImageData } from "../lib/getMockImageData";
6
6
 
7
- import { MockValueConfig } from "../types";
7
+ import { MockValueStateConfig, MockValueConfig } from "../types";
8
8
 
9
9
  export type MockIntegrationFieldsValueConfig<
10
10
  Model extends prismicT.CustomTypeModelIntegrationFieldsField = prismicT.CustomTypeModelIntegrationFieldsField,
11
- Blob extends unknown = unknown,
11
+ Blob = unknown,
12
+ State extends prismicT.FieldState = prismicT.FieldState,
12
13
  > = {
13
14
  data?: Blob;
14
- } & MockValueConfig<Model>;
15
+ } & MockValueConfig<Model> &
16
+ MockValueStateConfig<State>;
17
+
18
+ export type MockIntegrationFieldsValue<
19
+ Blob = unknown,
20
+ State extends prismicT.FieldState = prismicT.FieldState,
21
+ > = prismicT.IntegrationFields<Blob, State>;
15
22
 
16
23
  export const integrationFields = <
17
24
  Model extends prismicT.CustomTypeModelIntegrationFieldsField = prismicT.CustomTypeModelIntegrationFieldsField,
18
- Blob extends unknown = unknown,
25
+ Blob = unknown,
26
+ State extends prismicT.FieldState = "filled",
19
27
  >(
20
- config: MockIntegrationFieldsValueConfig<Model, Blob> = {},
21
- ): prismicT.IntegrationFields<Blob> => {
28
+ config: MockIntegrationFieldsValueConfig<Model, Blob, State> = {},
29
+ ): MockIntegrationFieldsValue<Blob, State> => {
22
30
  const faker = createFaker(config.seed);
23
31
 
24
32
  const imageData = getMockImageData({ seed: config.seed });
25
33
 
26
- return {
27
- id: faker.git.shortSha(),
28
- title: changeCase.capitalCase(faker.lorem.words(3)),
29
- description: faker.lorem.sentence(),
30
- image_url: imageData.url,
31
- last_update: faker.date.past(20, new Date("2021-03-07")).getTime(),
32
- blob: config.data as Blob,
33
- };
34
+ return (
35
+ config.state === "empty"
36
+ ? null
37
+ : {
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
+ image_url: imageData.url,
42
+ last_update: faker.date().getTime(),
43
+ blob: config.data as Blob,
44
+ }
45
+ ) as MockIntegrationFieldsValue<Blob, State>;
34
46
  };
@@ -3,16 +3,26 @@ import * as changeCase from "change-case";
3
3
 
4
4
  import { createFaker } from "../lib/createFaker";
5
5
 
6
- import { MockValueConfig } from "../types";
6
+ import { MockValueStateConfig, MockValueConfig } from "../types";
7
7
 
8
8
  export type MockKeyTextValueConfig<
9
9
  Model extends prismicT.CustomTypeModelKeyTextField = prismicT.CustomTypeModelKeyTextField,
10
- > = MockValueConfig<Model>;
10
+ State extends prismicT.FieldState = prismicT.FieldState,
11
+ > = MockValueConfig<Model> & MockValueStateConfig<State>;
11
12
 
12
- export const keyText = (
13
- config: MockKeyTextValueConfig = {},
14
- ): prismicT.KeyTextField => {
13
+ export type MockKeyTextValue<
14
+ State extends prismicT.FieldState = prismicT.FieldState,
15
+ > = prismicT.KeyTextField<State>;
16
+
17
+ export const keyText = <
18
+ Model extends prismicT.CustomTypeModelKeyTextField = prismicT.CustomTypeModelKeyTextField,
19
+ State extends prismicT.FieldState = "filled",
20
+ >(
21
+ config: MockKeyTextValueConfig<Model, State> = {},
22
+ ): MockKeyTextValue<State> => {
15
23
  const faker = createFaker(config.seed);
16
24
 
17
- return changeCase.sentenceCase(faker.lorem.words(3));
25
+ return (
26
+ config.state === "empty" ? null : changeCase.sentenceCase(faker.words(3))
27
+ ) as MockKeyTextValue<State>;
18
28
  };
package/src/value/link.ts CHANGED
@@ -2,7 +2,7 @@ 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
 
@@ -10,89 +10,88 @@ import { contentRelationship } from "./contentRelationship";
10
10
  import { linkToMedia } from "./linkToMedia";
11
11
 
12
12
  export type MockLinkValueConfig<
13
- LinkType extends prismicT.LinkType = prismicT.LinkType,
14
- IsFilled extends boolean = true,
13
+ LinkType extends typeof prismicT.LinkType[keyof typeof prismicT.LinkType] = typeof prismicT.LinkType[keyof typeof prismicT.LinkType],
15
14
  Model extends prismicT.CustomTypeModelLinkField = prismicT.CustomTypeModelLinkField,
15
+ State extends prismicT.FieldState = prismicT.FieldState,
16
16
  > = {
17
17
  type?: LinkType;
18
- isFilled?: IsFilled;
19
18
  withTargetBlank?: Model["config"]["allowTargetBlank"] extends undefined
20
19
  ? false
21
20
  : boolean;
22
21
  /**
23
22
  * A list of potential documents to which the field can be linked.
24
23
  */
25
- linkableDocuments?: LinkType extends prismicT.LinkType.Document
24
+ linkableDocuments?: LinkType extends typeof prismicT.LinkType.Document
26
25
  ? prismicT.PrismicDocument[]
27
26
  : never;
28
- } & MockValueConfig<Model>;
27
+ } & MockValueConfig<Model> &
28
+ MockValueStateConfig<State>;
29
29
 
30
30
  type MockLinkValue<
31
- LinkType extends prismicT.LinkType = prismicT.LinkType,
32
- IsFilled extends boolean = true,
33
- > = IsFilled extends true
34
- ? LinkType extends prismicT.LinkType.Web
35
- ? prismicT.FilledLinkToWebField
36
- : LinkType extends prismicT.LinkType.Media
37
- ? prismicT.FilledLinkToMediaField
38
- : LinkType extends prismicT.LinkType.Document
39
- ? prismicT.FilledLinkToDocumentField
40
- : never
41
- : prismicT.EmptyLinkField<LinkType>;
31
+ LinkType extends typeof prismicT.LinkType[keyof typeof prismicT.LinkType] = typeof prismicT.LinkType[keyof typeof prismicT.LinkType],
32
+ State extends prismicT.FieldState = "filled",
33
+ > = State extends "empty"
34
+ ? prismicT.EmptyLinkField<LinkType>
35
+ : LinkType extends typeof prismicT.LinkType.Web
36
+ ? prismicT.FilledLinkToWebField
37
+ : LinkType extends typeof prismicT.LinkType.Media
38
+ ? prismicT.FilledLinkToMediaField
39
+ : LinkType extends typeof prismicT.LinkType.Document
40
+ ? prismicT.FilledLinkToDocumentField
41
+ : never;
42
42
 
43
43
  export const link = <
44
- LinkType extends prismicT.LinkType = prismicT.LinkType,
45
- IsFilled extends boolean = true,
44
+ LinkType extends typeof prismicT.LinkType[keyof typeof prismicT.LinkType] = typeof prismicT.LinkType[keyof typeof prismicT.LinkType],
46
45
  Model extends prismicT.CustomTypeModelLinkField = prismicT.CustomTypeModelLinkField,
46
+ State extends prismicT.FieldState = "filled",
47
47
  >(
48
- config: MockLinkValueConfig<LinkType, IsFilled, Model> = {},
49
- ): MockLinkValue<LinkType, IsFilled> => {
48
+ config: MockLinkValueConfig<LinkType, Model, State> = {},
49
+ ): MockLinkValue<LinkType, State> => {
50
50
  const faker = createFaker(config.seed);
51
51
 
52
- const isFilled = config.isFilled ?? true;
53
-
54
52
  const type =
55
53
  config.type ||
56
- faker.random.arrayElement([
54
+ faker.randomElement([
57
55
  prismicT.LinkType.Web,
58
56
  prismicT.LinkType.Document,
59
57
  prismicT.LinkType.Media,
60
58
  ]);
61
59
 
62
- if (isFilled) {
60
+ if (config.state === "empty") {
61
+ return {
62
+ link_type: type,
63
+ } as MockLinkValue<LinkType, State>;
64
+ } else {
63
65
  switch (type) {
64
66
  case prismicT.LinkType.Document: {
65
67
  return contentRelationship({
66
68
  seed: config.seed,
67
- isFilled,
69
+ state: config.state,
68
70
  linkableDocuments: config.linkableDocuments,
69
- }) as MockLinkValue<LinkType, IsFilled>;
71
+ }) as unknown as MockLinkValue<LinkType, State>;
70
72
  }
71
73
 
72
74
  case prismicT.LinkType.Media: {
73
75
  return linkToMedia({
74
76
  seed: config.seed,
75
- isFilled,
76
- }) as MockLinkValue<LinkType, IsFilled>;
77
+ state: config.state,
78
+ }) as MockLinkValue<LinkType, State>;
77
79
  }
78
80
 
79
- case prismicT.LinkType.Web: {
81
+ case prismicT.LinkType.Web:
82
+ default: {
80
83
  const model = config.model || modelGen.link({ seed: config.seed });
81
84
 
82
85
  return {
83
86
  link_type: prismicT.LinkType.Web,
84
- url: faker.internet.url(),
87
+ url: faker.url(),
85
88
  target:
86
89
  config.withTargetBlank ??
87
- (model.config.allowTargetBlank && faker.datatype.boolean())
90
+ (model.config.allowTargetBlank && faker.boolean())
88
91
  ? "_blank"
89
92
  : undefined,
90
- } as MockLinkValue<LinkType, IsFilled>;
93
+ } as MockLinkValue<LinkType, State>;
91
94
  }
92
95
  }
93
96
  }
94
-
95
- return {
96
- link_type: type,
97
- } as MockLinkValue<LinkType, IsFilled>;
98
97
  };
@@ -1,44 +1,40 @@
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
 
5
- import { MockValueConfig } from "../types";
6
+ import { MockValueStateConfig, MockValueConfig } from "../types";
6
7
 
7
8
  export type MockLinkToMediaValueConfig<
8
- IsFilled extends boolean = true,
9
9
  Model extends prismicT.CustomTypeModelLinkToMediaField = prismicT.CustomTypeModelLinkToMediaField,
10
- > = {
11
- isFilled?: IsFilled;
12
- } & MockValueConfig<Model>;
10
+ State extends prismicT.FieldState = prismicT.FieldState,
11
+ > = MockValueConfig<Model> & MockValueStateConfig<State>;
13
12
 
14
- type MockLinkToMediaValue<IsFilled extends boolean = true> =
15
- IsFilled extends true
16
- ? prismicT.FilledLinkToMediaField
17
- : prismicT.EmptyLinkField<prismicT.LinkType.Media>;
13
+ type MockLinkToMediaValue<
14
+ State extends prismicT.FieldState = prismicT.FieldState,
15
+ > = prismicT.LinkToMediaField<State>;
18
16
 
19
17
  export const linkToMedia = <
20
- IsFilled extends boolean = true,
21
18
  Model extends prismicT.CustomTypeModelLinkToMediaField = prismicT.CustomTypeModelLinkToMediaField,
19
+ State extends prismicT.FieldState = "filled",
22
20
  >(
23
- config: MockLinkToMediaValueConfig<IsFilled, Model> = {},
24
- ): MockLinkToMediaValue<IsFilled> => {
21
+ config: MockLinkToMediaValueConfig<Model, State> = {},
22
+ ): MockLinkToMediaValue<State> => {
25
23
  const faker = createFaker(config.seed);
26
24
 
27
- const isFilled = config.isFilled ?? true;
28
-
29
- if (isFilled) {
25
+ if (config.state === "empty") {
30
26
  return {
31
27
  link_type: prismicT.LinkType.Media,
32
- name: faker.system.commonFileName(),
33
- kind: faker.system.commonFileType(),
34
- url: faker.internet.url(),
35
- size: faker.datatype.number().toString(),
36
- height: faker.datatype.number().toString(),
37
- width: faker.datatype.number().toString(),
38
- } as prismicT.FilledLinkToMediaField;
28
+ } as MockLinkToMediaValue<State>;
39
29
  } else {
40
30
  return {
41
31
  link_type: prismicT.LinkType.Media,
42
- } as MockLinkToMediaValue<IsFilled>;
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(),
38
+ } as MockLinkToMediaValue<State>;
43
39
  }
44
40
  };
@@ -2,16 +2,26 @@ 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 MockNumberValueConfig<
8
8
  Model extends prismicT.CustomTypeModelNumberField = prismicT.CustomTypeModelNumberField,
9
- > = MockValueConfig<Model>;
9
+ State extends prismicT.FieldState = prismicT.FieldState,
10
+ > = MockValueConfig<Model> & MockValueStateConfig<State>;
10
11
 
11
- export const number = (
12
- config: MockNumberValueConfig = {},
13
- ): prismicT.NumberField => {
12
+ export type MockNumberValue<
13
+ State extends prismicT.FieldState = prismicT.FieldState,
14
+ > = prismicT.NumberField<State>;
15
+
16
+ export const number = <
17
+ Model extends prismicT.CustomTypeModelNumberField = prismicT.CustomTypeModelNumberField,
18
+ State extends prismicT.FieldState = "filled",
19
+ >(
20
+ config: MockNumberValueConfig<Model, State> = {},
21
+ ): MockNumberValue<State> => {
14
22
  const faker = createFaker(config.seed);
15
23
 
16
- return faker.datatype.number();
24
+ return (
25
+ config.state === "empty" ? null : faker.range(1, 100)
26
+ ) as MockNumberValue<State>;
17
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,