@prismicio/mock 0.0.6 → 0.0.7

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 (66) hide show
  1. package/README.md +4 -1
  2. package/dist/api/index.cjs +39 -27
  3. package/dist/api/index.cjs.map +1 -0
  4. package/dist/api/index.d.ts +2 -1
  5. package/dist/api/index.d.ts.map +1 -0
  6. package/dist/api/{index.mjs → index.js} +104 -58
  7. package/dist/api/index.js.map +1 -0
  8. package/dist/index.cjs +293 -393
  9. package/dist/index.cjs.map +1 -0
  10. package/dist/index.d.ts +132 -230
  11. package/dist/{index.mjs → index.js} +286 -384
  12. package/dist/index.js.map +1 -0
  13. package/dist/model/index.cjs +148 -205
  14. package/dist/model/index.cjs.map +1 -0
  15. package/dist/model/index.d.ts +68 -104
  16. package/dist/model/index.d.ts.map +1 -0
  17. package/dist/model/index.js +462 -0
  18. package/dist/model/index.js.map +1 -0
  19. package/dist/value/index.cjs +238 -495
  20. package/dist/value/index.cjs.map +1 -0
  21. package/dist/value/index.d.ts +54 -116
  22. package/dist/value/index.d.ts.map +1 -0
  23. package/dist/value/{index.mjs → index.js} +407 -610
  24. package/dist/value/index.js.map +1 -0
  25. package/package.json +21 -21
  26. package/src/lib/buildContentRelationshipField.ts +6 -1
  27. package/src/lib/buildEmbedField.ts +1 -1
  28. package/src/lib/buildImageFieldImage.ts +48 -0
  29. package/src/model/buildMockGroupFieldMap.ts +65 -0
  30. package/src/model/contentRelationship.ts +14 -21
  31. package/src/model/customType.ts +49 -48
  32. package/src/model/group.ts +8 -15
  33. package/src/model/image.ts +13 -13
  34. package/src/model/index.ts +2 -0
  35. package/src/model/select.ts +11 -16
  36. package/src/model/sharedSlice.ts +14 -41
  37. package/src/model/sharedSliceVariation.ts +33 -21
  38. package/src/model/slice.ts +15 -19
  39. package/src/model/sliceZone.ts +23 -59
  40. package/src/types.ts +41 -12
  41. package/src/value/color.ts +16 -6
  42. package/src/value/contentRelationship.ts +51 -36
  43. package/src/value/date.ts +25 -9
  44. package/src/value/embed.ts +18 -6
  45. package/src/value/geoPoint.ts +21 -9
  46. package/src/value/group.ts +7 -27
  47. package/src/value/image.ts +22 -9
  48. package/src/value/integrationFields.ts +26 -14
  49. package/src/value/keyText.ts +18 -6
  50. package/src/value/link.ts +33 -34
  51. package/src/value/linkToMedia.ts +15 -20
  52. package/src/value/number.ts +16 -6
  53. package/src/value/richText/heading.ts +7 -7
  54. package/src/value/richText/image.ts +6 -2
  55. package/src/value/richText/index.ts +1 -1
  56. package/src/value/select.ts +23 -8
  57. package/src/value/sharedSlice.ts +2 -2
  58. package/src/value/sharedSliceVariation.ts +6 -34
  59. package/src/value/slice.ts +5 -30
  60. package/src/value/sliceZone.ts +44 -60
  61. package/src/value/timestamp.ts +19 -6
  62. package/src/value/title.ts +1 -1
  63. package/src/value/uid.ts +1 -1
  64. package/dist/model/index.mjs +0 -465
  65. package/src/lib/buildImageField.ts +0 -34
  66. package/src/lib/buildMockGroupFieldMap.ts +0 -84
@@ -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 MockColorValueConfig<
8
8
  Model extends prismicT.CustomTypeModelColorField = prismicT.CustomTypeModelColorField,
9
- > = MockValueConfig<Model>;
9
+ State extends prismicT.FieldState = prismicT.FieldState,
10
+ > = MockValueConfig<Model> & MockValueStateConfig<State>;
10
11
 
11
- export const color = (
12
- config: MockColorValueConfig = {},
13
- ): prismicT.ColorField => {
12
+ export type MockColorValue<
13
+ State extends prismicT.FieldState = prismicT.FieldState,
14
+ > = prismicT.ColorField<State>;
15
+
16
+ export const color = <
17
+ Model extends prismicT.CustomTypeModelColorField = prismicT.CustomTypeModelColorField,
18
+ State extends prismicT.FieldState = "filled",
19
+ >(
20
+ config: MockColorValueConfig<Model, State> = {},
21
+ ): MockColorValue<State> => {
14
22
  const faker = createFaker(config.seed);
15
23
 
16
- return faker.internet.color().toUpperCase() as prismicT.ColorField;
24
+ return (
25
+ config.state === "empty" ? null : faker.internet.color().toUpperCase()
26
+ ) as MockColorValue<State>;
17
27
  };
@@ -5,59 +5,73 @@ import { createFaker } from "../lib/createFaker";
5
5
  import { generateCustomTypeId } from "../lib/generateCustomTypeId";
6
6
  import { generateTags } from "../lib/generateTags";
7
7
 
8
- import { MockValueConfig } from "../types";
8
+ import { MockValueStateConfig, MockValueConfig } from "../types";
9
9
 
10
10
  import * as modelGen from "../model";
11
11
 
12
12
  import { document as documentGen } from "./document";
13
13
 
14
14
  export type MockContentRelationshipValueConfig<
15
- IsFilled extends boolean = boolean,
16
15
  Model extends prismicT.CustomTypeModelContentRelationshipField = prismicT.CustomTypeModelContentRelationshipField,
16
+ State extends prismicT.FieldState = prismicT.FieldState,
17
17
  > = {
18
- isFilled?: IsFilled;
19
18
  /**
20
19
  * A list of potential documents to which the field can be linked.
21
20
  */
22
21
  linkableDocuments?: prismicT.PrismicDocument[];
23
- } & MockValueConfig<Model>;
22
+ } & MockValueConfig<Model> &
23
+ MockValueStateConfig<State>;
24
24
 
25
- type MockContentRelationshipValue<IsFilled extends boolean = boolean> =
26
- IsFilled extends true
27
- ? prismicT.FilledLinkToDocumentField
28
- : prismicT.EmptyLinkField<prismicT.LinkType.Document>;
25
+ type MockContentRelationshipValue<
26
+ Model extends prismicT.CustomTypeModelContentRelationshipField = prismicT.CustomTypeModelContentRelationshipField,
27
+ State extends prismicT.FieldState = prismicT.FieldState,
28
+ > = prismicT.RelationField<
29
+ Model["config"]["customtypes"],
30
+ string,
31
+ never,
32
+ State
33
+ >;
29
34
 
30
35
  export const contentRelationship = <
31
- IsFilled extends boolean = true,
32
36
  Model extends prismicT.CustomTypeModelContentRelationshipField = prismicT.CustomTypeModelContentRelationshipField,
37
+ State extends prismicT.FieldState = "filled",
33
38
  >(
34
- config: MockContentRelationshipValueConfig<IsFilled, Model> = {},
35
- ): MockContentRelationshipValue<IsFilled> => {
39
+ config: MockContentRelationshipValueConfig<Model, State> = {},
40
+ ): MockContentRelationshipValue<Model, State> => {
36
41
  const faker = createFaker(config.seed);
37
42
 
38
- const isFilled = config.isFilled ?? true;
39
-
40
- if (isFilled) {
43
+ if (config.state === "empty") {
44
+ return {
45
+ link_type: prismicT.LinkType.Document,
46
+ } as MockContentRelationshipValue<Model, State>;
47
+ } else {
41
48
  const model =
42
49
  config.model || modelGen.contentRelationship({ seed: config.seed });
43
50
 
44
51
  const linkableDocuments = config.linkableDocuments
45
- ? config.linkableDocuments.filter((document) => {
46
- let shouldKeep = true;
47
-
48
- if (model.config.customtypes) {
49
- shouldKeep =
50
- shouldKeep && model.config.customtypes.includes(document.type);
51
- }
52
-
53
- if (model.config.tags) {
54
- shouldKeep =
55
- shouldKeep &&
56
- model.config.tags.some((tag) => document.tags.includes(tag));
57
- }
58
-
59
- return shouldKeep;
60
- })
52
+ ? config.linkableDocuments.filter(
53
+ (
54
+ document,
55
+ ): document is prismicT.PrismicDocument<
56
+ never,
57
+ NonNullable<Model["config"]["customtypes"]>[number]
58
+ > => {
59
+ let shouldKeep = true;
60
+
61
+ if (model.config.customtypes) {
62
+ shouldKeep =
63
+ shouldKeep && model.config.customtypes.includes(document.type);
64
+ }
65
+
66
+ if (model.config.tags) {
67
+ shouldKeep =
68
+ shouldKeep &&
69
+ model.config.tags.some((tag) => document.tags.includes(tag));
70
+ }
71
+
72
+ return shouldKeep;
73
+ },
74
+ )
61
75
  : [
62
76
  {
63
77
  ...documentGen({ seed: config.seed }),
@@ -67,7 +81,10 @@ export const contentRelationship = <
67
81
  tags: model.config.tags
68
82
  ? faker.random.arrayElements(model.config.tags)
69
83
  : generateTags({ seed: config.seed }),
70
- },
84
+ } as prismicT.PrismicDocument<
85
+ never,
86
+ NonNullable<Model["config"]["customtypes"]>[number]
87
+ >,
71
88
  ];
72
89
 
73
90
  const document = faker.random.arrayElement(linkableDocuments);
@@ -76,10 +93,8 @@ export const contentRelationship = <
76
93
  throw new Error("A linkable document could not be found.");
77
94
  }
78
95
 
79
- return buildContentRelationshipField({ document });
80
- } else {
81
- return {
82
- link_type: prismicT.LinkType.Document,
83
- } as MockContentRelationshipValue<IsFilled>;
96
+ return buildContentRelationshipField({
97
+ document,
98
+ }) as unknown as MockContentRelationshipValue<Model, State>;
84
99
  }
85
100
  };
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,28 @@ 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
+ State extends prismicT.FieldState = prismicT.FieldState,
11
+ > = MockValueConfig<Model> & MockValueStateConfig<State>;
11
12
 
12
- export const embed = (
13
- config: MockEmbedValueConfig = {},
14
- ): prismicT.EmbedField => {
13
+ export type MockEmbedValue<
14
+ State extends prismicT.FieldState = prismicT.FieldState,
15
+ > = prismicT.EmbedField<prismicT.AnyOEmbed & prismicT.OEmbedExtra, State>;
16
+
17
+ export const embed = <
18
+ Model extends prismicT.CustomTypeModelEmbedField = prismicT.CustomTypeModelEmbedField,
19
+ State extends prismicT.FieldState = "filled",
20
+ >(
21
+ config: MockEmbedValueConfig<Model, State> = {},
22
+ ): MockEmbedValue<State> => {
15
23
  const embedData = getMockEmbedData({ seed: config.seed });
16
24
 
17
- return buildEmbedField({ seed: config.seed, embedData });
25
+ return (
26
+ config.state === "empty"
27
+ ? {}
28
+ : buildEmbedField({ seed: config.seed, embedData })
29
+ ) as MockEmbedValue<State>;
18
30
  };
@@ -2,21 +2,33 @@ 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 => {
12
+ export type MockGeoPointValue<
13
+ State extends prismicT.FieldState = prismicT.FieldState,
14
+ > = prismicT.GeoPointField<State>;
15
+
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> => {
14
22
  const faker = createFaker(config.seed);
15
23
 
16
24
  const coordinates = faker.address.nearbyGPSCoordinate();
17
25
 
18
- return {
19
- longitude: Number.parseFloat(coordinates[0]),
20
- latitude: Number.parseFloat(coordinates[1]),
21
- };
26
+ return (
27
+ config.state === "empty"
28
+ ? {}
29
+ : {
30
+ longitude: Number.parseFloat(coordinates[0]),
31
+ latitude: Number.parseFloat(coordinates[1]),
32
+ }
33
+ ) as MockGeoPointValue<State>;
22
34
  };
@@ -10,25 +10,10 @@ import { MockValueConfig, 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,
30
15
  > = {
31
- pattern?: keyof typeof patterns;
16
+ itemsCount?: number;
32
17
  configs?: ValueForModelMapConfigs;
33
18
  } & MockValueConfig<Model>;
34
19
 
@@ -41,17 +26,12 @@ export const group = <
41
26
 
42
27
  const model = config.model || modelGen.group({ seed: config.seed });
43
28
 
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
- });
29
+ const itemsCount =
30
+ config.itemsCount ??
31
+ faker.datatype.number({
32
+ min: 1,
33
+ max: 6,
34
+ });
55
35
 
56
36
  return Array(itemsCount)
57
37
  .fill(undefined)
@@ -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.git.shortSha(),
39
+ title: changeCase.capitalCase(faker.lorem.words(3)),
40
+ description: faker.lorem.sentence(),
41
+ image_url: imageData.url,
42
+ last_update: faker.date.past(20, new Date("2021-03-07")).getTime(),
43
+ blob: config.data as Blob,
44
+ }
45
+ ) as MockIntegrationFieldsValue<Blob, State>;
34
46
  };
@@ -3,16 +3,28 @@ 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"
27
+ ? null
28
+ : changeCase.sentenceCase(faker.lorem.words(3))
29
+ ) as MockKeyTextValue<State>;
18
30
  };
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,47 +10,45 @@ 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
54
  faker.random.arrayElement([
@@ -59,24 +57,29 @@ export const link = <
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 {
@@ -87,12 +90,8 @@ export const link = <
87
90
  (model.config.allowTargetBlank && faker.datatype.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
  };