@prismicio/mock 0.0.3 → 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 (78) hide show
  1. package/README.md +4 -1
  2. package/dist/api/index.cjs +561 -0
  3. package/dist/api/index.cjs.map +1 -0
  4. package/dist/api/index.d.ts +36 -0
  5. package/dist/api/index.d.ts.map +1 -0
  6. package/dist/api/index.js +561 -0
  7. package/dist/api/index.js.map +1 -0
  8. package/dist/index.cjs +672 -644
  9. package/dist/index.cjs.map +1 -0
  10. package/dist/index.d.ts +228 -262
  11. package/dist/{index.mjs → index.js} +663 -634
  12. package/dist/index.js.map +1 -0
  13. package/dist/model/index.cjs +163 -203
  14. package/dist/model/index.cjs.map +1 -0
  15. package/dist/model/index.d.ts +70 -96
  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 +284 -499
  20. package/dist/value/index.cjs.map +1 -0
  21. package/dist/value/index.d.ts +60 -120
  22. package/dist/value/index.d.ts.map +1 -0
  23. package/dist/value/{index.mjs → index.js} +447 -608
  24. package/dist/value/index.js.map +1 -0
  25. package/package.json +25 -20
  26. package/src/api/index.ts +11 -0
  27. package/src/api/query.ts +38 -0
  28. package/src/api/ref.ts +41 -0
  29. package/src/api/repository.ts +54 -0
  30. package/src/api/tags.ts +15 -0
  31. package/src/constants.ts +3 -1
  32. package/src/index.ts +1 -0
  33. package/src/lib/buildAlternativeLanguage.ts +18 -0
  34. package/src/lib/buildContentRelationshipField.ts +12 -5
  35. package/src/lib/buildEmbedField.ts +1 -1
  36. package/src/lib/buildImageFieldImage.ts +48 -0
  37. package/src/lib/createFaker.ts +19 -10
  38. package/src/lib/generateTags.ts +10 -2
  39. package/src/lib/valueForModelMap.ts +2 -2
  40. package/src/model/buildMockGroupFieldMap.ts +65 -0
  41. package/src/model/contentRelationship.ts +14 -21
  42. package/src/model/customType.ts +49 -48
  43. package/src/model/group.ts +8 -15
  44. package/src/model/image.ts +13 -13
  45. package/src/model/index.ts +2 -0
  46. package/src/model/select.ts +11 -16
  47. package/src/model/sharedSlice.ts +23 -30
  48. package/src/model/sharedSliceVariation.ts +33 -21
  49. package/src/model/slice.ts +15 -19
  50. package/src/model/sliceZone.ts +25 -42
  51. package/src/types.ts +50 -15
  52. package/src/value/color.ts +16 -6
  53. package/src/value/contentRelationship.ts +52 -36
  54. package/src/value/customType.ts +27 -4
  55. package/src/value/date.ts +25 -9
  56. package/src/value/embed.ts +18 -6
  57. package/src/value/geoPoint.ts +21 -9
  58. package/src/value/group.ts +7 -27
  59. package/src/value/image.ts +22 -9
  60. package/src/value/integrationFields.ts +26 -14
  61. package/src/value/keyText.ts +18 -6
  62. package/src/value/link.ts +33 -34
  63. package/src/value/linkToMedia.ts +15 -20
  64. package/src/value/number.ts +16 -6
  65. package/src/value/richText/heading.ts +7 -7
  66. package/src/value/richText/image.ts +6 -2
  67. package/src/value/richText/index.ts +1 -1
  68. package/src/value/select.ts +23 -8
  69. package/src/value/sharedSlice.ts +2 -2
  70. package/src/value/sharedSliceVariation.ts +6 -34
  71. package/src/value/slice.ts +5 -30
  72. package/src/value/sliceZone.ts +44 -60
  73. package/src/value/timestamp.ts +19 -6
  74. package/src/value/title.ts +1 -1
  75. package/src/value/uid.ts +1 -1
  76. package/dist/model/index.mjs +0 -448
  77. package/src/lib/buildImageField.ts +0 -34
  78. package/src/lib/buildMockGroupFieldMap.ts +0 -84
@@ -0,0 +1,48 @@
1
+ import * as prismicT from "@prismicio/types";
2
+
3
+ import { createFaker } from "../lib/createFaker";
4
+
5
+ import { MockValueStateConfig, MockImageData, MockValueConfig } from "../types";
6
+
7
+ type BuildImageFieldConfig<
8
+ State extends prismicT.FieldState = prismicT.FieldState,
9
+ > = {
10
+ imageData: MockImageData;
11
+ constraint?: prismicT.CustomTypeModelImageField["config"]["constraint"];
12
+ } & Pick<MockValueConfig, "seed"> &
13
+ Pick<MockValueStateConfig<State>, "state">;
14
+
15
+ export const buildImageFieldImage = <
16
+ State extends prismicT.FieldState = prismicT.FieldState,
17
+ >(
18
+ config: BuildImageFieldConfig<State>,
19
+ ): prismicT.ImageFieldImage<State> => {
20
+ if (config.state === "empty") {
21
+ return {
22
+ url: null,
23
+ dimensions: null,
24
+ alt: null,
25
+ copyright: null,
26
+ } as prismicT.ImageFieldImage<State>;
27
+ } else {
28
+ const faker = createFaker(config.seed);
29
+
30
+ const url = new URL(config.imageData.url);
31
+
32
+ const dimensions = {
33
+ width: config.constraint?.width ?? config.imageData.width,
34
+ height: config.constraint?.height ?? config.imageData.height,
35
+ };
36
+
37
+ url.searchParams.set("w", dimensions.width.toString());
38
+ url.searchParams.set("h", dimensions.height.toString());
39
+ url.searchParams.set("fit", "crop");
40
+
41
+ return {
42
+ url: url.toString(),
43
+ dimensions,
44
+ alt: faker.lorem.sentence(),
45
+ copyright: faker.lorem.sentence(),
46
+ } as prismicT.ImageFieldImage<State>;
47
+ }
48
+ };
@@ -1,22 +1,31 @@
1
1
  import * as fakerStatic from "faker";
2
2
  // @ts-expect-error - Missing .d.ts
3
- import * as fakerLocaleEN from "faker/lib/locales/en";
3
+ import * as fakerLocaleEN from "faker/lib/locales/en/index.js";
4
4
  // @ts-expect-error - Missing .d.ts
5
- import Faker from "faker/lib";
5
+ import Faker from "faker/lib/index.js";
6
6
 
7
7
  import { FAKER_SEED } from "../constants";
8
8
 
9
9
  export const createFaker = (seed = FAKER_SEED): typeof fakerStatic => {
10
- if (createFaker.cache[seed]) {
11
- return createFaker.cache[seed];
10
+ let normalizedSeed: number | number[];
11
+ if (typeof seed === "string") {
12
+ normalizedSeed = seed.split("").map((char) => char.charCodeAt(0));
13
+ } else {
14
+ normalizedSeed = seed;
12
15
  }
13
16
 
14
- const seededFaker = new Faker();
15
- seededFaker.seed(seed);
16
- seededFaker.locales["en"] = fakerLocaleEN;
17
+ const cacheKey = JSON.stringify(normalizedSeed);
17
18
 
18
- createFaker.cache[seed] = seededFaker;
19
+ if (createFaker.cache[cacheKey]) {
20
+ return createFaker.cache[cacheKey];
21
+ }
22
+
23
+ const fakerInstance = new Faker();
24
+ fakerInstance.locales["en"] = fakerLocaleEN;
25
+ fakerInstance.seed(normalizedSeed);
26
+
27
+ createFaker.cache[cacheKey] = fakerInstance;
19
28
 
20
- return seededFaker;
29
+ return fakerInstance;
21
30
  };
22
- createFaker.cache = {} as Record<number, typeof fakerStatic>;
31
+ createFaker.cache = {} as Record<string, typeof fakerStatic>;
@@ -4,12 +4,20 @@ import { createFaker } from "../lib/createFaker";
4
4
 
5
5
  import { MockValueConfig } from "../types";
6
6
 
7
- type GenerateTagsConfig = Pick<MockValueConfig, "seed">;
7
+ type GenerateTagsConfig = {
8
+ min?: number;
9
+ max?: number;
10
+ } & Pick<MockValueConfig, "seed">;
8
11
 
9
12
  export const generateTags = (config: GenerateTagsConfig): string[] => {
10
13
  const faker = createFaker(config.seed);
11
14
 
12
- return Array(faker.datatype.number(2))
15
+ return Array(
16
+ faker.datatype.number({
17
+ min: config.min ?? 0,
18
+ max: config.max ?? 2,
19
+ }),
20
+ )
13
21
  .fill(undefined)
14
22
  .map(() =>
15
23
  changeCase.capitalCase(
@@ -93,7 +93,7 @@ const getValueConfigType = <Model extends prismicT.CustomTypeModelField>(
93
93
  return "integrationFields";
94
94
 
95
95
  case prismicT.CustomTypeModelFieldType.Slices:
96
- return "slices";
96
+ return "sliceZone";
97
97
  }
98
98
  };
99
99
 
@@ -113,7 +113,7 @@ export type ValueForModelMapConfigs = {
113
113
  number?: MockNumberValueConfig;
114
114
  richText?: MockRichTextValueConfig;
115
115
  select?: MockSelectValueConfig;
116
- slices?: MockSliceZoneValueConfig;
116
+ sliceZone?: MockSliceZoneValueConfig;
117
117
  timestamp?: MockTimestampValueConfig;
118
118
  title?: MockTitleValueConfig;
119
119
  uid?: MockUIDValueConfig;
@@ -0,0 +1,65 @@
1
+ import { GroupFieldModelMap, MockModelConfig, ValueOf } from "../types";
2
+
3
+ import { boolean } from "../model/boolean";
4
+ import { color } from "../model/color";
5
+ import { contentRelationship } from "../model/contentRelationship";
6
+ import { date } from "../model/date";
7
+ import { embed } from "../model/embed";
8
+ import { geoPoint } from "../model/geoPoint";
9
+ import { image } from "../model/image";
10
+ import { integrationFields } from "../model/integrationFields";
11
+ import { keyText } from "../model/keyText";
12
+ import { link } from "../model/link";
13
+ import { linkToMedia } from "../model/linkToMedia";
14
+ import { number } from "../model/number";
15
+ import { richText } from "../model/richText";
16
+ import { select } from "../model/select";
17
+ import { timestamp } from "../model/timestamp";
18
+ import { title } from "../model/title";
19
+
20
+ import { createFaker } from "../lib/createFaker";
21
+ import { generateFieldId } from "../lib/generateFieldId";
22
+
23
+ const mockModelFns = {
24
+ boolean,
25
+ color,
26
+ contentRelationship,
27
+ date,
28
+ embed,
29
+ geoPoint,
30
+ image,
31
+ integrationFields,
32
+ keyText,
33
+ link,
34
+ linkToMedia,
35
+ number,
36
+ richText,
37
+ select,
38
+ timestamp,
39
+ title,
40
+ };
41
+
42
+ export type BuildMockGroupFieldMapConfig = MockModelConfig;
43
+
44
+ export const buildMockGroupFieldMap = (
45
+ config: BuildMockGroupFieldMapConfig = {},
46
+ ): GroupFieldModelMap => {
47
+ const faker = createFaker(config.seed);
48
+
49
+ const fields: GroupFieldModelMap = {};
50
+
51
+ const fieldTypes = faker.random.arrayElements(
52
+ Object.keys(mockModelFns) as (keyof typeof mockModelFns)[],
53
+ );
54
+
55
+ for (const fieldType of fieldTypes) {
56
+ const fieldId = generateFieldId({ seed: config.seed });
57
+ const mockModelFn = mockModelFns[fieldType] as (
58
+ config: MockModelConfig,
59
+ ) => ValueOf<GroupFieldModelMap>;
60
+
61
+ fields[fieldId] = mockModelFn({ seed: config.seed });
62
+ }
63
+
64
+ return fields;
65
+ };
@@ -2,18 +2,23 @@ import * as prismicT from "@prismicio/types";
2
2
  import * as changeCase from "change-case";
3
3
 
4
4
  import { createFaker } from "../lib/createFaker";
5
- import { generateCustomTypeId } from "../lib/generateCustomTypeId";
6
5
 
7
6
  import { MockModelConfig } from "../types";
8
7
 
9
- export type MockContentRelationshipModelConfig = {
10
- constrainCustomTypes?: boolean;
11
- constrainTags?: boolean;
8
+ export type MockContentRelationshipModelConfig<
9
+ CustomTypeIDs extends string = string,
10
+ Tags extends string = string,
11
+ > = {
12
+ customTypeIDs?: readonly CustomTypeIDs[];
13
+ tags?: readonly Tags[];
12
14
  } & MockModelConfig;
13
15
 
14
- export const contentRelationship = (
15
- config: MockContentRelationshipModelConfig = {},
16
- ): prismicT.CustomTypeModelContentRelationshipField => {
16
+ export const contentRelationship = <
17
+ CustomTypeIDs extends string,
18
+ Tags extends string,
19
+ >(
20
+ config: MockContentRelationshipModelConfig<CustomTypeIDs, Tags> = {},
21
+ ): prismicT.CustomTypeModelContentRelationshipField<CustomTypeIDs, Tags> => {
17
22
  const faker = createFaker(config.seed);
18
23
 
19
24
  return {
@@ -22,20 +27,8 @@ export const contentRelationship = (
22
27
  label: changeCase.capitalCase(faker.company.bsNoun()),
23
28
  placeholder: changeCase.sentenceCase(faker.lorem.words(3)),
24
29
  select: prismicT.CustomTypeModelLinkSelectType.Document,
25
- customtypes: config.constrainCustomTypes
26
- ? Array(faker.datatype.number({ min: 1, max: 3 }))
27
- .fill(undefined)
28
- .map(() => generateCustomTypeId({ seed: config.seed }))
29
- : undefined,
30
- tags: config.constrainTags
31
- ? Array(faker.datatype.number({ min: 1, max: 3 }))
32
- .fill(undefined)
33
- .map(() =>
34
- changeCase.capitalCase(
35
- faker.lorem.words(faker.datatype.number({ min: 1, max: 3 })),
36
- ),
37
- )
38
- : undefined,
30
+ customtypes: config.customTypeIDs,
31
+ tags: config.tags,
39
32
  },
40
33
  };
41
34
  };
@@ -1,74 +1,75 @@
1
1
  import * as prismicT from "@prismicio/types";
2
2
  import * as changeCase from "change-case";
3
3
 
4
- import {
5
- buildMockGroupFieldMap,
6
- BuildMockGroupFieldMapConfig,
7
- } from "../lib/buildMockGroupFieldMap";
8
4
  import { createFaker } from "../lib/createFaker";
9
- import { generateCustomTypeId } from "../lib/generateCustomTypeId";
10
- import { generateFieldId } from "../lib/generateFieldId";
11
5
 
12
6
  import { MockModelConfig } from "../types";
13
7
 
14
- import { uid } from "./uid";
15
- import { sliceZone } from "./sliceZone";
16
-
17
- type MockCustomTypeModelConfig = {
18
- tabsCount?: number;
19
- withUID?: boolean;
20
- configs?: BuildMockGroupFieldMapConfig["configs"];
8
+ type MockCustomTypeModelConfig<
9
+ Definition extends
10
+ | prismicT.CustomTypeModelTab
11
+ | prismicT.CustomTypeModelDefinition =
12
+ | prismicT.CustomTypeModelTab
13
+ | prismicT.CustomTypeModelDefinition,
14
+ > = {
15
+ id?: string;
16
+ label?: string;
17
+ status?: boolean;
18
+ repeatable?: boolean;
21
19
  } & (
22
20
  | {
23
- withSliceZones?: false;
21
+ fields?: Definition;
22
+ tabs?: never;
24
23
  }
25
24
  | {
26
- withSliceZones: true;
27
- withSharedSlices?: boolean;
25
+ tabs?: Definition;
26
+ fields?: never;
28
27
  }
29
28
  ) &
30
29
  MockModelConfig;
31
30
 
32
- export const customType = (
33
- config: MockCustomTypeModelConfig = {},
34
- ): prismicT.CustomTypeModel => {
35
- const faker = createFaker(config.seed);
36
-
37
- const tabsCount =
38
- config.tabsCount ?? faker.datatype.number({ min: 1, max: 3 });
39
-
40
- const json: prismicT.CustomTypeModelDefinition = {};
41
- for (let i = 0; i < tabsCount; i++) {
42
- const tabName = changeCase.capitalCase(faker.company.bsNoun());
43
- const tabFields: prismicT.CustomTypeModelTab = buildMockGroupFieldMap({
44
- seed: config.seed,
45
- configs: config.configs,
46
- });
31
+ type MockCustomTypeModel<
32
+ Definition extends
33
+ | prismicT.CustomTypeModelTab
34
+ | prismicT.CustomTypeModelDefinition,
35
+ > = Definition extends prismicT.CustomTypeModelTab
36
+ ? prismicT.CustomTypeModel<string, Record<"Main", Definition>>
37
+ : Definition extends prismicT.CustomTypeModelDefinition
38
+ ? prismicT.CustomTypeModel<string, Definition>
39
+ : never;
47
40
 
48
- if (i === 0 && config.withUID) {
49
- const fieldId = generateFieldId({ seed: config.seed });
41
+ export const customType = <
42
+ Definition extends
43
+ | prismicT.CustomTypeModelTab
44
+ | prismicT.CustomTypeModelDefinition,
45
+ >(
46
+ config: MockCustomTypeModelConfig<Definition> = {},
47
+ ): MockCustomTypeModel<Definition> => {
48
+ const faker = createFaker(config.seed);
50
49
 
51
- tabFields[fieldId] = uid();
52
- }
50
+ let label: string =
51
+ config.label || changeCase.capitalCase(faker.company.bsNoun());
52
+ let id: string = config.id || changeCase.snakeCase(label);
53
53
 
54
- if (config.withSliceZones) {
55
- const sliceZoneId = generateFieldId({ seed: config.seed });
54
+ if (config.id && !config.label) {
55
+ label = changeCase.capitalCase(config.id);
56
+ } else if (config.label && !config.label) {
57
+ id = changeCase.snakeCase(config.label);
58
+ }
56
59
 
57
- tabFields[sliceZoneId] = sliceZone({
58
- withSharedSlices: config.withSharedSlices,
59
- });
60
- }
60
+ let json = {} as MockCustomTypeModel<Definition>["json"];
61
61
 
62
- json[tabName] = tabFields;
62
+ if ("fields" in config && config.fields) {
63
+ json = { Main: config.fields } as typeof json;
64
+ } else if ("tabs" in config && config.tabs) {
65
+ json = config.tabs as typeof json;
63
66
  }
64
67
 
65
- const id = generateCustomTypeId({ seed: config.seed });
66
-
67
68
  return {
68
69
  id,
69
- label: changeCase.capitalCase(id),
70
- status: faker.datatype.boolean(),
71
- repeatable: faker.datatype.boolean(),
70
+ label,
71
+ status: config.status ?? faker.datatype.boolean(),
72
+ repeatable: config.repeatable ?? faker.datatype.boolean(),
72
73
  json,
73
- };
74
+ } as MockCustomTypeModel<Definition>;
74
75
  };
@@ -1,31 +1,24 @@
1
1
  import * as prismicT from "@prismicio/types";
2
2
  import * as changeCase from "change-case";
3
3
 
4
- import {
5
- buildMockGroupFieldMap,
6
- BuildMockGroupFieldMapConfig,
7
- } from "../lib/buildMockGroupFieldMap";
8
4
  import { createFaker } from "../lib/createFaker";
9
5
 
10
- import { MockModelConfig } from "../types";
6
+ import { GroupFieldModelMap, MockModelConfig } from "../types";
11
7
 
12
- type MockGroupModelConfig = BuildMockGroupFieldMapConfig & MockModelConfig;
8
+ type MockGroupModelConfig<Fields extends GroupFieldModelMap> = {
9
+ fields?: Fields;
10
+ } & MockModelConfig;
13
11
 
14
- export const group = (
15
- config: MockGroupModelConfig = {},
16
- ): prismicT.CustomTypeModelGroupField => {
12
+ export const group = <Fields extends GroupFieldModelMap>(
13
+ config: MockGroupModelConfig<Fields> = {},
14
+ ): prismicT.CustomTypeModelGroupField<Fields> => {
17
15
  const faker = createFaker(config.seed);
18
16
 
19
- const fields = buildMockGroupFieldMap({
20
- seed: config.seed,
21
- configs: config.configs,
22
- });
23
-
24
17
  return {
25
18
  type: prismicT.CustomTypeModelFieldType.Group,
26
19
  config: {
27
20
  label: changeCase.capitalCase(faker.company.bsNoun()),
28
- fields,
21
+ fields: config.fields || ({} as Fields),
29
22
  },
30
23
  };
31
24
  };
@@ -5,17 +5,23 @@ import { createFaker } from "../lib/createFaker";
5
5
 
6
6
  import { MockModelConfig } from "../types";
7
7
 
8
- type MockImageModelConfig = {
8
+ type MockImageModelConfig<ThumbnailNames extends string = string> = {
9
9
  withConstraint?: boolean;
10
- thumbnailsCount?: number;
10
+ thumbnailNames?: readonly ThumbnailNames[];
11
11
  } & MockModelConfig;
12
12
 
13
- export const image = (
14
- config: MockImageModelConfig = {},
15
- ): prismicT.CustomTypeModelImageField => {
13
+ export const image = <ThumbnailNames extends string = string>(
14
+ config: MockImageModelConfig<ThumbnailNames> = {},
15
+ ): prismicT.CustomTypeModelImageField<ThumbnailNames> => {
16
16
  const faker = createFaker(config.seed);
17
17
 
18
- const thumbnailsCount = config.thumbnailsCount ?? faker.datatype.number(3);
18
+ const thumbnails = (config.thumbnailNames || []).map((name) => {
19
+ return {
20
+ name,
21
+ width: faker.datatype.number({ min: 500, max: 2000 }),
22
+ height: faker.datatype.number({ min: 500, max: 2000 }),
23
+ };
24
+ });
19
25
 
20
26
  return {
21
27
  type: prismicT.CustomTypeModelFieldType.Image,
@@ -29,13 +35,7 @@ export const image = (
29
35
  ? faker.datatype.number({ min: 500, max: 2000 })
30
36
  : null,
31
37
  },
32
- thumbnails: Array(thumbnailsCount)
33
- .fill(undefined)
34
- .map(() => ({
35
- name: changeCase.capitalCase(faker.company.bsNoun()),
36
- width: faker.datatype.number({ min: 500, max: 2000 }),
37
- height: faker.datatype.number({ min: 500, max: 2000 }),
38
- })),
38
+ thumbnails,
39
39
  },
40
40
  };
41
41
  };
@@ -22,3 +22,5 @@ export { sliceZone } from "./sliceZone";
22
22
  export { timestamp } from "./timestamp";
23
23
  export { title } from "./title";
24
24
  export { uid } from "./uid";
25
+
26
+ export { buildMockGroupFieldMap } from "./buildMockGroupFieldMap";
@@ -5,31 +5,26 @@ import { createFaker } from "../lib/createFaker";
5
5
 
6
6
  import { MockModelConfig } from "../types";
7
7
 
8
- type MockSelectModelConfig = {
9
- optionsCount?: number;
10
- withDefaultValue?: boolean;
8
+ type MockSelectModelConfig<
9
+ Option extends string = string,
10
+ DefaultOption extends Option = Option,
11
+ > = {
12
+ options?: Option[];
13
+ defaultValue?: DefaultOption;
11
14
  } & MockModelConfig;
12
15
 
13
- export const select = (
14
- config: MockSelectModelConfig = {},
15
- ): prismicT.CustomTypeModelSelectField => {
16
+ export const select = <Option extends string, DefaultOption extends Option>(
17
+ config: MockSelectModelConfig<Option, DefaultOption> = {},
18
+ ): prismicT.CustomTypeModelSelectField<Option, DefaultOption> => {
16
19
  const faker = createFaker(config.seed);
17
20
 
18
- const optionsCount =
19
- config.optionsCount ?? faker.datatype.number({ min: 1, max: 5 });
20
- const options = Array(optionsCount)
21
- .fill(undefined)
22
- .map(() => changeCase.capitalCase(faker.company.bsBuzz()));
23
-
24
21
  return {
25
22
  type: prismicT.CustomTypeModelFieldType.Select,
26
23
  config: {
27
24
  label: changeCase.capitalCase(faker.company.bsNoun()),
28
25
  placeholder: changeCase.sentenceCase(faker.lorem.words(3)),
29
- options,
30
- default_value: config.withDefaultValue
31
- ? faker.random.arrayElement(options)
32
- : undefined,
26
+ options: config.options || [],
27
+ default_value: config.defaultValue || undefined,
33
28
  },
34
29
  };
35
30
  };
@@ -5,43 +5,36 @@ import { createFaker } from "../lib/createFaker";
5
5
 
6
6
  import { MockModelConfig } from "../types";
7
7
 
8
- import {
9
- MockSharedSliceVariationModelConfig,
10
- sharedSliceVariation,
11
- } from "./sharedSliceVariation";
12
-
13
- type MockSharedSliceModelConfig = {
14
- variationsCount?: number;
15
- } & Pick<
16
- MockSharedSliceVariationModelConfig,
17
- "itemsFieldConfig" | "primaryFieldConfig"
18
- > &
19
- MockModelConfig;
20
-
21
- export const sharedSlice = (
22
- config: MockSharedSliceModelConfig = {},
23
- ): prismicT.SharedSliceModel => {
8
+ type MockSharedSliceModelConfig<
9
+ Variation extends prismicT.SharedSliceModelVariation,
10
+ > = {
11
+ id?: string;
12
+ name?: string;
13
+ variations?: Variation[];
14
+ } & MockModelConfig;
15
+
16
+ export const sharedSlice = <
17
+ Variation extends prismicT.SharedSliceModelVariation,
18
+ >(
19
+ config: MockSharedSliceModelConfig<Variation> = {},
20
+ ): prismicT.SharedSliceModel<string, Variation> => {
24
21
  const faker = createFaker(config.seed);
25
22
 
26
- const variationsCount =
27
- config.variationsCount ?? faker.datatype.number({ min: 1, max: 3 });
23
+ let name: string =
24
+ config.name || changeCase.capitalCase(faker.company.bsNoun());
25
+ let id: string = config.id || changeCase.snakeCase(name);
28
26
 
29
- const name = changeCase.capitalCase(faker.company.bsNoun());
30
- const variations = Array(variationsCount)
31
- .fill(undefined)
32
- .map(() =>
33
- sharedSliceVariation({
34
- seed: config.seed,
35
- itemsFieldConfig: config.itemsFieldConfig,
36
- primaryFieldConfig: config.primaryFieldConfig,
37
- }),
38
- );
27
+ if (config.id && !config.name) {
28
+ name = changeCase.pascalCase(config.id);
29
+ } else if (config.name && !config.name) {
30
+ id = changeCase.snakeCase(config.name);
31
+ }
39
32
 
40
33
  return {
41
34
  type: prismicT.CustomTypeModelSliceType.SharedSlice,
42
- id: changeCase.snakeCase(name),
35
+ id,
43
36
  name,
44
37
  description: faker.lorem.sentence(),
45
- variations,
38
+ variations: config.variations || ([] as Variation[]),
46
39
  };
47
40
  };
@@ -2,38 +2,50 @@ import * as prismicT from "@prismicio/types";
2
2
  import * as changeCase from "change-case";
3
3
 
4
4
  import { createFaker } from "../lib/createFaker";
5
- import {
6
- buildMockGroupFieldMap,
7
- BuildMockGroupFieldMapConfig,
8
- } from "../lib/buildMockGroupFieldMap";
9
5
 
10
- import { MockModelConfig } from "../types";
6
+ import { GroupFieldModelMap, MockModelConfig } from "../types";
11
7
 
12
- export type MockSharedSliceVariationModelConfig = {
13
- primaryFieldConfig?: BuildMockGroupFieldMapConfig;
14
- itemsFieldConfig?: BuildMockGroupFieldMapConfig;
8
+ export type MockSharedSliceVariationModelConfig<
9
+ ID extends string = string,
10
+ PrimaryFields extends GroupFieldModelMap = GroupFieldModelMap,
11
+ ItemsFields extends GroupFieldModelMap = GroupFieldModelMap,
12
+ > = {
13
+ id?: ID;
14
+ name?: string;
15
+ primaryFields?: PrimaryFields;
16
+ itemsFields?: ItemsFields;
15
17
  } & MockModelConfig;
16
18
 
17
- export const sharedSliceVariation = (
18
- config: MockSharedSliceVariationModelConfig = {},
19
- ): prismicT.SharedSliceModelVariation => {
19
+ export const sharedSliceVariation = <
20
+ ID extends string,
21
+ PrimaryFields extends GroupFieldModelMap,
22
+ ItemsFields extends GroupFieldModelMap,
23
+ >(
24
+ config: MockSharedSliceVariationModelConfig<
25
+ ID,
26
+ PrimaryFields,
27
+ ItemsFields
28
+ > = {},
29
+ ): prismicT.SharedSliceModelVariation<ID, PrimaryFields, ItemsFields> => {
20
30
  const faker = createFaker(config.seed);
21
31
 
22
- const name = changeCase.capitalCase(faker.company.bsNoun());
32
+ let name: string =
33
+ config.name || changeCase.capitalCase(faker.company.bsNoun());
34
+ let id: ID = config.id || (changeCase.snakeCase(name) as ID);
35
+
36
+ if (config.id && !config.name) {
37
+ name = changeCase.pascalCase(config.id);
38
+ } else if (config.name && !config.name) {
39
+ id = changeCase.snakeCase(config.name) as ID;
40
+ }
23
41
 
24
42
  return {
25
- id: changeCase.snakeCase(name),
43
+ id,
26
44
  name,
27
45
  description: faker.lorem.sentence(),
28
46
  docURL: faker.internet.url(),
29
47
  version: faker.git.shortSha(),
30
- primary: buildMockGroupFieldMap({
31
- seed: config.primaryFieldConfig?.seed ?? config.seed,
32
- configs: config.primaryFieldConfig?.configs,
33
- }),
34
- items: buildMockGroupFieldMap({
35
- seed: config.itemsFieldConfig?.seed ?? config.seed,
36
- configs: config.itemsFieldConfig?.configs,
37
- }),
48
+ primary: config.primaryFields || ({} as PrimaryFields),
49
+ items: config.itemsFields || ({} as ItemsFields),
38
50
  };
39
51
  };