prismic-ts-codegen 0.1.10 → 0.1.12

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 (198) hide show
  1. package/dist/constants.cjs +19 -21
  2. package/dist/constants.cjs.map +1 -1
  3. package/dist/constants.d.ts +2 -3
  4. package/dist/constants.js +19 -21
  5. package/dist/constants.js.map +1 -1
  6. package/dist/generateTypes.cjs +71 -90
  7. package/dist/generateTypes.cjs.map +1 -1
  8. package/dist/generateTypes.d.ts +2 -1
  9. package/dist/generateTypes.js +71 -90
  10. package/dist/generateTypes.js.map +1 -1
  11. package/dist/lib/addBlankLine.cjs +12 -0
  12. package/dist/lib/addBlankLine.cjs.map +1 -0
  13. package/dist/lib/addBlankLine.d.ts +5 -0
  14. package/dist/lib/addBlankLine.js +12 -0
  15. package/dist/lib/addBlankLine.js.map +1 -0
  16. package/dist/lib/addLine.cjs +8 -0
  17. package/dist/lib/addLine.cjs.map +1 -0
  18. package/dist/lib/addLine.d.ts +1 -0
  19. package/dist/lib/addLine.js +8 -0
  20. package/dist/lib/addLine.js.map +1 -0
  21. package/dist/lib/addSection.cjs +8 -0
  22. package/dist/lib/addSection.cjs.map +1 -0
  23. package/dist/lib/addSection.d.ts +1 -0
  24. package/dist/lib/addSection.js +8 -0
  25. package/dist/lib/addSection.js.map +1 -0
  26. package/dist/lib/addTrailingNewLine.cjs +11 -0
  27. package/dist/lib/addTrailingNewLine.cjs.map +1 -0
  28. package/dist/lib/addTrailingNewLine.d.ts +5 -0
  29. package/dist/lib/addTrailingNewLine.js +11 -0
  30. package/dist/lib/addTrailingNewLine.js.map +1 -0
  31. package/dist/lib/buildCustomTypeDataType.cjs +51 -0
  32. package/dist/lib/buildCustomTypeDataType.cjs.map +1 -0
  33. package/dist/lib/buildCustomTypeDataType.d.ts +13 -0
  34. package/dist/lib/buildCustomTypeDataType.js +51 -0
  35. package/dist/lib/buildCustomTypeDataType.js.map +1 -0
  36. package/dist/lib/buildCustomTypeType.cjs +60 -0
  37. package/dist/lib/buildCustomTypeType.cjs.map +1 -0
  38. package/dist/lib/buildCustomTypeType.d.ts +17 -0
  39. package/dist/lib/buildCustomTypeType.js +60 -0
  40. package/dist/lib/buildCustomTypeType.js.map +1 -0
  41. package/dist/lib/buildFieldDocs.cjs +67 -35
  42. package/dist/lib/buildFieldDocs.cjs.map +1 -1
  43. package/dist/lib/buildFieldDocs.d.ts +7 -11
  44. package/dist/lib/buildFieldDocs.js +67 -35
  45. package/dist/lib/buildFieldDocs.js.map +1 -1
  46. package/dist/lib/buildFieldProperties.cjs +300 -0
  47. package/dist/lib/buildFieldProperties.cjs.map +1 -0
  48. package/dist/lib/buildFieldProperties.d.ts +14 -0
  49. package/dist/lib/buildFieldProperties.js +300 -0
  50. package/dist/lib/buildFieldProperties.js.map +1 -0
  51. package/dist/lib/buildSharedSliceType.cjs +140 -0
  52. package/dist/lib/buildSharedSliceType.cjs.map +1 -0
  53. package/dist/lib/buildSharedSliceType.d.ts +16 -0
  54. package/dist/lib/buildSharedSliceType.js +140 -0
  55. package/dist/lib/buildSharedSliceType.js.map +1 -0
  56. package/dist/lib/buildTypeName.cjs +4 -2
  57. package/dist/lib/buildTypeName.cjs.map +1 -1
  58. package/dist/lib/buildTypeName.js +4 -2
  59. package/dist/lib/buildTypeName.js.map +1 -1
  60. package/dist/lib/buildUnion.cjs +7 -0
  61. package/dist/lib/buildUnion.cjs.map +1 -0
  62. package/dist/lib/buildUnion.d.ts +1 -0
  63. package/dist/lib/buildUnion.js +7 -0
  64. package/dist/lib/buildUnion.js.map +1 -0
  65. package/dist/lib/checkHasUIDFIeld.cjs +7 -0
  66. package/dist/lib/checkHasUIDFIeld.cjs.map +1 -0
  67. package/dist/lib/checkHasUIDFIeld.d.ts +2 -0
  68. package/dist/lib/checkHasUIDFIeld.js +7 -0
  69. package/dist/lib/checkHasUIDFIeld.js.map +1 -0
  70. package/dist/lib/getAPIIDPath.cjs +18 -14
  71. package/dist/lib/getAPIIDPath.cjs.map +1 -1
  72. package/dist/lib/getAPIIDPath.d.ts +4 -8
  73. package/dist/lib/getAPIIDPath.js +18 -14
  74. package/dist/lib/getAPIIDPath.js.map +1 -1
  75. package/dist/lib/getCacheKey.cjs +25 -0
  76. package/dist/lib/getCacheKey.cjs.map +1 -0
  77. package/dist/lib/getCacheKey.d.ts +9 -0
  78. package/dist/lib/getCacheKey.js +8 -0
  79. package/dist/lib/getCacheKey.js.map +1 -0
  80. package/dist/lib/getHumanReadableModelName.cjs +13 -17
  81. package/dist/lib/getHumanReadableModelName.cjs.map +1 -1
  82. package/dist/lib/getHumanReadableModelName.d.ts +3 -3
  83. package/dist/lib/getHumanReadableModelName.js +13 -17
  84. package/dist/lib/getHumanReadableModelName.js.map +1 -1
  85. package/dist/lib/{getHumanReadableFieldPath.cjs → getHumanReadablePath.cjs} +8 -8
  86. package/dist/lib/getHumanReadablePath.cjs.map +1 -0
  87. package/dist/lib/getHumanReadablePath.d.ts +6 -0
  88. package/dist/lib/{getHumanReadableFieldPath.js → getHumanReadablePath.js} +8 -8
  89. package/dist/lib/getHumanReadablePath.js.map +1 -0
  90. package/dist/types.d.ts +9 -1
  91. package/package.json +19 -18
  92. package/src/constants.ts +19 -22
  93. package/src/generateTypes.ts +109 -108
  94. package/src/lib/addBlankLine.ts +13 -0
  95. package/src/lib/addLine.ts +5 -0
  96. package/src/lib/addSection.ts +5 -0
  97. package/src/lib/addTrailingNewLine.ts +14 -0
  98. package/src/lib/buildCustomTypeDataType.ts +74 -0
  99. package/src/lib/buildCustomTypeType.ts +101 -0
  100. package/src/lib/buildFieldDocs.ts +128 -68
  101. package/src/lib/buildFieldProperties.ts +513 -0
  102. package/src/lib/buildSharedSliceType.ts +213 -0
  103. package/src/lib/buildTypeName.ts +4 -2
  104. package/src/lib/buildUnion.ts +3 -0
  105. package/src/lib/checkHasUIDFIeld.ts +5 -0
  106. package/src/lib/getAPIIDPath.ts +40 -41
  107. package/src/lib/getCacheKey.ts +13 -0
  108. package/src/lib/getHumanReadableModelName.ts +23 -20
  109. package/src/lib/getHumanReadablePath.ts +24 -0
  110. package/src/types.ts +11 -1
  111. package/dist/lib/addInterfacePropertiesForFields.cjs +0 -489
  112. package/dist/lib/addInterfacePropertiesForFields.cjs.map +0 -1
  113. package/dist/lib/addInterfacePropertiesForFields.d.ts +0 -21
  114. package/dist/lib/addInterfacePropertiesForFields.js +0 -489
  115. package/dist/lib/addInterfacePropertiesForFields.js.map +0 -1
  116. package/dist/lib/addTypeAliasForCustomType.cjs +0 -81
  117. package/dist/lib/addTypeAliasForCustomType.cjs.map +0 -1
  118. package/dist/lib/addTypeAliasForCustomType.d.ts +0 -11
  119. package/dist/lib/addTypeAliasForCustomType.js +0 -81
  120. package/dist/lib/addTypeAliasForCustomType.js.map +0 -1
  121. package/dist/lib/addTypeAliasForSharedSlice.cjs +0 -149
  122. package/dist/lib/addTypeAliasForSharedSlice.cjs.map +0 -1
  123. package/dist/lib/addTypeAliasForSharedSlice.d.ts +0 -10
  124. package/dist/lib/addTypeAliasForSharedSlice.js +0 -149
  125. package/dist/lib/addTypeAliasForSharedSlice.js.map +0 -1
  126. package/dist/lib/buildSharedSliceInterfaceNamePart.cjs +0 -8
  127. package/dist/lib/buildSharedSliceInterfaceNamePart.cjs.map +0 -1
  128. package/dist/lib/buildSharedSliceInterfaceNamePart.d.ts +0 -5
  129. package/dist/lib/buildSharedSliceInterfaceNamePart.js +0 -8
  130. package/dist/lib/buildSharedSliceInterfaceNamePart.js.map +0 -1
  131. package/dist/lib/getFieldDocumentationURL.cjs +0 -8
  132. package/dist/lib/getFieldDocumentationURL.cjs.map +0 -1
  133. package/dist/lib/getFieldDocumentationURL.d.ts +0 -6
  134. package/dist/lib/getFieldDocumentationURL.js +0 -8
  135. package/dist/lib/getFieldDocumentationURL.js.map +0 -1
  136. package/dist/lib/getHumanReadableFieldPath.cjs.map +0 -1
  137. package/dist/lib/getHumanReadableFieldPath.d.ts +0 -10
  138. package/dist/lib/getHumanReadableFieldPath.js.map +0 -1
  139. package/dist/lib/getHumanReadableFieldType.cjs +0 -36
  140. package/dist/lib/getHumanReadableFieldType.cjs.map +0 -1
  141. package/dist/lib/getHumanReadableFieldType.d.ts +0 -6
  142. package/dist/lib/getHumanReadableFieldType.js +0 -36
  143. package/dist/lib/getHumanReadableFieldType.js.map +0 -1
  144. package/dist/lib/getSourceFileText.cjs +0 -9
  145. package/dist/lib/getSourceFileText.cjs.map +0 -1
  146. package/dist/lib/getSourceFileText.d.ts +0 -2
  147. package/dist/lib/getSourceFileText.js +0 -9
  148. package/dist/lib/getSourceFileText.js.map +0 -1
  149. package/dist/lib/hasOwnProperty.cjs +0 -7
  150. package/dist/lib/hasOwnProperty.cjs.map +0 -1
  151. package/dist/lib/hasOwnProperty.d.ts +0 -10
  152. package/dist/lib/hasOwnProperty.js +0 -7
  153. package/dist/lib/hasOwnProperty.js.map +0 -1
  154. package/dist/lib/isCustomTypeModel.cjs +0 -7
  155. package/dist/lib/isCustomTypeModel.cjs.map +0 -1
  156. package/dist/lib/isCustomTypeModel.d.ts +0 -2
  157. package/dist/lib/isCustomTypeModel.js +0 -7
  158. package/dist/lib/isCustomTypeModel.js.map +0 -1
  159. package/dist/lib/isCustomTypeModelField.cjs +0 -7
  160. package/dist/lib/isCustomTypeModelField.cjs.map +0 -1
  161. package/dist/lib/isCustomTypeModelField.d.ts +0 -2
  162. package/dist/lib/isCustomTypeModelField.js +0 -7
  163. package/dist/lib/isCustomTypeModelField.js.map +0 -1
  164. package/dist/lib/isCustomTypeModelSlice.cjs +0 -8
  165. package/dist/lib/isCustomTypeModelSlice.cjs.map +0 -1
  166. package/dist/lib/isCustomTypeModelSlice.d.ts +0 -2
  167. package/dist/lib/isCustomTypeModelSlice.js +0 -8
  168. package/dist/lib/isCustomTypeModelSlice.js.map +0 -1
  169. package/dist/lib/isSharedSliceModel.cjs +0 -8
  170. package/dist/lib/isSharedSliceModel.cjs.map +0 -1
  171. package/dist/lib/isSharedSliceModel.d.ts +0 -2
  172. package/dist/lib/isSharedSliceModel.js +0 -8
  173. package/dist/lib/isSharedSliceModel.js.map +0 -1
  174. package/dist/lib/pascalCase.cjs +0 -8
  175. package/dist/lib/pascalCase.cjs.map +0 -1
  176. package/dist/lib/pascalCase.d.ts +0 -1
  177. package/dist/lib/pascalCase.js +0 -8
  178. package/dist/lib/pascalCase.js.map +0 -1
  179. package/dist/lib/writeFieldDocsDescription.cjs +0 -29
  180. package/dist/lib/writeFieldDocsDescription.cjs.map +0 -1
  181. package/dist/lib/writeFieldDocsDescription.d.ts +0 -13
  182. package/dist/lib/writeFieldDocsDescription.js +0 -29
  183. package/dist/lib/writeFieldDocsDescription.js.map +0 -1
  184. package/src/lib/addInterfacePropertiesForFields.ts +0 -665
  185. package/src/lib/addTypeAliasForCustomType.ts +0 -120
  186. package/src/lib/addTypeAliasForSharedSlice.ts +0 -201
  187. package/src/lib/buildSharedSliceInterfaceNamePart.ts +0 -11
  188. package/src/lib/getFieldDocumentationURL.ts +0 -15
  189. package/src/lib/getHumanReadableFieldPath.ts +0 -36
  190. package/src/lib/getHumanReadableFieldType.ts +0 -55
  191. package/src/lib/getSourceFileText.ts +0 -14
  192. package/src/lib/hasOwnProperty.ts +0 -15
  193. package/src/lib/isCustomTypeModel.ts +0 -5
  194. package/src/lib/isCustomTypeModelField.ts +0 -7
  195. package/src/lib/isCustomTypeModelSlice.ts +0 -14
  196. package/src/lib/isSharedSliceModel.ts +0 -14
  197. package/src/lib/pascalCase.ts +0 -9
  198. package/src/lib/writeFieldDocsDescription.ts +0 -51
package/src/constants.ts CHANGED
@@ -1,12 +1,9 @@
1
1
  import type { CustomTypeModelFieldType } from "@prismicio/client";
2
2
 
3
- export const BLANK_LINE_IDENTIFIER = "// ___BLANK_LINE_TO_BE_REPLACED___";
4
-
5
3
  export const CUSTOM_TYPES_DOCUMENTATION_URL =
6
- "https://prismic.io/docs/core-concepts/custom-types";
4
+ "https://prismic.io/docs/custom-types";
7
5
 
8
- export const SHARED_SLICES_DOCUMENTATION_URL =
9
- "https://prismic.io/docs/core-concepts/reusing-slices";
6
+ export const SHARED_SLICES_DOCUMENTATION_URL = "https://prismic.io/docs/slice";
10
7
 
11
8
  export const FIELD_DOCUMENTATION_URLS: Record<
12
9
  Exclude<
@@ -15,21 +12,21 @@ export const FIELD_DOCUMENTATION_URLS: Record<
15
12
  >,
16
13
  string
17
14
  > = {
18
- UID: "https://prismic.io/docs/core-concepts/uid",
19
- Boolean: "https://prismic.io/docs/core-concepts/boolean",
20
- Color: "https://prismic.io/docs/core-concepts/color",
21
- Date: "https://prismic.io/docs/core-concepts/date",
22
- Timestamp: "https://prismic.io/docs/core-concepts/timestamp",
23
- Number: "https://prismic.io/docs/core-concepts/number",
24
- Text: "https://prismic.io/docs/core-concepts/key-text",
25
- Select: "https://prismic.io/docs/core-concepts/select",
26
- StructuredText: "https://prismic.io/docs/core-concepts/rich-text-title",
27
- Image: "https://prismic.io/docs/core-concepts/image",
28
- Link: "https://prismic.io/docs/core-concepts/link-content-relationship",
29
- Embed: "https://prismic.io/docs/core-concepts/embed",
30
- GeoPoint: "https://prismic.io/docs/core-concepts/geopoint",
31
- Group: "https://prismic.io/docs/core-concepts/group",
32
- IntegrationFields: "https://prismic.io/docs/core-concepts/integration-fields",
33
- Slices: "https://prismic.io/docs/core-concepts/slices",
34
- Choice: "https://prismic.io/docs/core-concepts/slices",
15
+ UID: "https://prismic.io/docs/field#uid",
16
+ Boolean: "https://prismic.io/docs/field#boolean",
17
+ Color: "https://prismic.io/docs/field#color",
18
+ Date: "https://prismic.io/docs/field#date",
19
+ Timestamp: "https://prismic.io/docs/field#timestamp",
20
+ Number: "https://prismic.io/docs/field#number",
21
+ Text: "https://prismic.io/docs/field#key-text",
22
+ Select: "https://prismic.io/docs/field#select",
23
+ StructuredText: "https://prismic.io/docs/field#rich-text-title",
24
+ Image: "https://prismic.io/docs/field#image",
25
+ Link: "https://prismic.io/docs/field#link-content-relationship",
26
+ Embed: "https://prismic.io/docs/field#embed",
27
+ GeoPoint: "https://prismic.io/docs/field#geopoint",
28
+ Group: "https://prismic.io/docs/field#group",
29
+ IntegrationFields: "https://prismic.io/docs/field#integration",
30
+ Slices: "https://prismic.io/docs/field#slices",
31
+ Choice: "https://prismic.io/docs/field#slices",
35
32
  };
@@ -1,17 +1,19 @@
1
1
  import type { CustomTypeModel, SharedSliceModel } from "@prismicio/client";
2
- import { ModuleDeclarationKind, Project } from "ts-morph";
2
+ import { source } from "common-tags";
3
+ import QuickLRU from "quick-lru";
3
4
 
4
- import { addTypeAliasForCustomType } from "./lib/addTypeAliasForCustomType";
5
- import { addTypeAliasForSharedSlice } from "./lib/addTypeAliasForSharedSlice";
6
- import { buildTypeName } from "./lib/buildTypeName";
7
- import { getSourceFileText } from "./lib/getSourceFileText";
5
+ import { addLine } from "./lib/addLine";
6
+ import { addSection } from "./lib/addSection";
7
+ import { buildCustomTypeType } from "./lib/buildCustomTypeType";
8
+ import { buildSharedSliceType } from "./lib/buildSharedSliceType";
9
+ import { buildUnion } from "./lib/buildUnion";
8
10
 
9
11
  import { FieldConfigs } from "./types";
10
12
 
11
- import { BLANK_LINE_IDENTIFIER } from "./constants";
12
-
13
13
  export type TypesProvider = "@prismicio/client" | "@prismicio/types";
14
14
 
15
+ const cache = new QuickLRU<string, unknown>({ maxSize: 1000 });
16
+
15
17
  export type GenerateTypesConfig = {
16
18
  customTypeModels?: CustomTypeModel[];
17
19
  sharedSliceModels?: SharedSliceModel[];
@@ -22,65 +24,92 @@ export type GenerateTypesConfig = {
22
24
  includeCreateClientInterface?: boolean;
23
25
  includeContentNamespace?: boolean;
24
26
  };
27
+ cache?: boolean;
25
28
  };
26
29
 
27
- export const generateTypes = (config: GenerateTypesConfig = {}) => {
28
- const project = new Project({
29
- useInMemoryFileSystem: true,
30
- });
30
+ export function generateTypes(config: GenerateTypesConfig = {}): string {
31
+ const fieldConfigs = config.fieldConfigs || {};
32
+ const shouldUseCache = config.cache ?? true;
31
33
 
32
- const sourceFile = project.createSourceFile("types.d.ts");
34
+ let code = "";
33
35
 
34
36
  const typesProvider = config.typesProvider || "@prismicio/types";
37
+ let clientImportName = "prismic";
35
38
 
36
- sourceFile.addImportDeclaration({
37
- moduleSpecifier: typesProvider,
38
- namespaceImport: "prismic",
39
- isTypeOnly: true,
40
- });
39
+ code = addLine(`import type * as prismic from "${typesProvider}";`, code);
41
40
 
42
- sourceFile.addStatements(BLANK_LINE_IDENTIFIER);
41
+ if (
42
+ config.clientIntegration?.includeCreateClientInterface ||
43
+ config.clientIntegration?.includeContentNamespace
44
+ ) {
45
+ if (typesProvider !== "@prismicio/client") {
46
+ clientImportName = "prismicClient";
43
47
 
44
- const simplifyTypeAlias = sourceFile.addTypeAlias({
45
- name: "Simplify",
46
- typeParameters: [
47
- {
48
- name: "T",
49
- },
50
- ],
51
- type: `{ [KeyType in keyof T]: T[KeyType] }`,
52
- });
48
+ // This import declaration would be a duplicate if the types
49
+ // provider is @prismicio/client.
50
+ code = addLine(
51
+ `import type * as ${clientImportName} from "@prismicio/client";`,
52
+ code,
53
+ );
54
+ }
55
+ }
56
+
57
+ code = addSection(
58
+ `type Simplify<T> = { [KeyType in keyof T]: T[KeyType] };`,
59
+ code,
60
+ );
61
+
62
+ const contentTypeNames: string[] = [];
53
63
 
54
64
  if (config.customTypeModels) {
65
+ const allDocumentTypesTypeNames: string[] = [];
66
+
55
67
  for (const model of config.customTypeModels) {
56
- addTypeAliasForCustomType({
68
+ const customTypeType = buildCustomTypeType({
57
69
  model,
58
- sourceFile,
59
- localeIDs: config.localeIDs || [],
60
- fieldConfigs: config.fieldConfigs || {},
70
+ localeIDs: config.localeIDs,
71
+ fieldConfigs,
72
+ cache: shouldUseCache ? cache : undefined,
61
73
  });
74
+
75
+ for (const auxiliaryType of customTypeType.auxiliaryTypes) {
76
+ code = addSection(auxiliaryType.code, code);
77
+ }
78
+
79
+ code = addSection(customTypeType.code, code);
80
+
81
+ allDocumentTypesTypeNames.push(customTypeType.name);
82
+
83
+ contentTypeNames.push(customTypeType.name);
84
+ contentTypeNames.push(customTypeType.dataName);
62
85
  }
63
86
 
64
87
  if (config.customTypeModels.length > 0) {
65
- sourceFile.addTypeAlias({
66
- name: "AllDocumentTypes",
67
- type: config.customTypeModels
68
- .map((customTypeModel) =>
69
- buildTypeName(customTypeModel.id, "Document"),
70
- )
71
- .join(" | "),
72
- isExported: true,
73
- });
88
+ const allDocumentTypesUnionName = "AllDocumentTypes";
89
+ const allDocumentTypesUnion = buildUnion(allDocumentTypesTypeNames);
90
+
91
+ code = addSection(
92
+ `export type ${allDocumentTypesUnionName} = ${allDocumentTypesUnion};`,
93
+ code,
94
+ );
95
+
96
+ contentTypeNames.push(allDocumentTypesUnionName);
74
97
  }
75
98
  }
76
99
 
77
100
  if (config.sharedSliceModels) {
78
101
  for (const model of config.sharedSliceModels) {
79
- addTypeAliasForSharedSlice({
102
+ const sharedSliceType = buildSharedSliceType({
80
103
  model,
81
- sourceFile,
82
- fieldConfigs: config.fieldConfigs || {},
104
+ fieldConfigs,
105
+ cache: shouldUseCache ? cache : undefined,
83
106
  });
107
+
108
+ code = addSection(sharedSliceType.code, code);
109
+
110
+ contentTypeNames.push(sharedSliceType.name);
111
+ contentTypeNames.push(sharedSliceType.variationUnionName);
112
+ contentTypeNames.push(...sharedSliceType.variationNames);
84
113
  }
85
114
  }
86
115
 
@@ -88,76 +117,48 @@ export const generateTypes = (config: GenerateTypesConfig = {}) => {
88
117
  config.clientIntegration?.includeCreateClientInterface ||
89
118
  config.clientIntegration?.includeContentNamespace
90
119
  ) {
91
- let clientNamespaceImportName = "prismic";
92
-
93
- if (typesProvider !== "@prismicio/client") {
94
- clientNamespaceImportName = "prismicClient";
95
-
96
- // This import declaration would be a duplicate if the types
97
- // provider is @prismicio/client.
98
- sourceFile.addImportDeclaration({
99
- moduleSpecifier: "@prismicio/client",
100
- namespaceImport: clientNamespaceImportName,
101
- isTypeOnly: true,
102
- });
103
- }
104
-
105
- const clientModuleDeclaration = sourceFile.addModule({
106
- name: '"@prismicio/client"',
107
- hasDeclareKeyword: true,
108
- declarationKind: ModuleDeclarationKind.Module,
109
- });
120
+ let clientModuleCode = "";
110
121
 
111
122
  if (config.clientIntegration.includeCreateClientInterface) {
112
- clientModuleDeclaration.addInterface({
113
- name: "CreateClient",
114
- callSignatures: [
115
- {
116
- parameters: [
117
- {
118
- name: "repositoryNameOrEndpoint",
119
- type: "string",
120
- },
121
- {
122
- name: "options",
123
- type: `${clientNamespaceImportName}.ClientConfig`,
124
- hasQuestionToken: true,
125
- },
126
- ],
127
- returnType:
128
- (config.customTypeModels?.length || 0) > 0
129
- ? `${clientNamespaceImportName}.Client<AllDocumentTypes>`
130
- : `${clientNamespaceImportName}.Client`,
131
- },
132
- ],
133
- });
123
+ if ((config.customTypeModels?.length || 0) > 0) {
124
+ clientModuleCode = addSection(
125
+ `interface CreateClient {
126
+ (repositoryNameOrEndpoint: string, options?: ${clientImportName}.ClientConfig): ${clientImportName}.Client<AllDocumentTypes>;
127
+ }`,
128
+ clientModuleCode,
129
+ );
130
+ } else {
131
+ clientModuleCode = addSection(
132
+ `interface CreateClient {
133
+ (repositoryNameOrEndpoint: string, options?: ${clientImportName}.ClientConfig): ${clientImportName}.Client;
134
+ }`,
135
+ clientModuleCode,
136
+ );
137
+ }
134
138
  }
135
139
 
136
140
  if (config.clientIntegration.includeContentNamespace) {
137
- const contentNamespaceDeclaration = clientModuleDeclaration.addModule({
138
- name: "Content",
139
- declarationKind: ModuleDeclarationKind.Namespace,
140
- });
141
-
142
- const exportSymbols = sourceFile
143
- .getExportSymbols()
144
- .filter((exportSymbol) => {
145
- // The Simplify utility type should not
146
- // be exported, but it is included in
147
- // `getExportSymbols()`'s result.
148
- return exportSymbol.getName() !== simplifyTypeAlias.getName();
149
- });
150
-
151
- contentNamespaceDeclaration.addExportDeclaration({
152
- isTypeOnly: true,
153
- namedExports: exportSymbols.map((exportSymbol) => {
154
- return {
155
- name: exportSymbol.getName(),
156
- };
157
- }),
158
- });
141
+ clientModuleCode = addSection(
142
+ source`
143
+ namespace Content {
144
+ export type {
145
+ ${contentTypeNames.join(",\n")}
146
+ }
147
+ }
148
+ `,
149
+ clientModuleCode,
150
+ );
159
151
  }
152
+
153
+ code = addSection(
154
+ source`
155
+ declare module "@prismicio/client" {
156
+ ${clientModuleCode}
157
+ }
158
+ `,
159
+ code,
160
+ );
160
161
  }
161
162
 
162
- return getSourceFileText(sourceFile);
163
- };
163
+ return code;
164
+ }
@@ -0,0 +1,13 @@
1
+ import { addTrailingNewLine } from "./addTrailingNewLine";
2
+
3
+ type AddBlankLineConfig = {
4
+ force?: boolean;
5
+ };
6
+
7
+ export function addBlankLine(state: string, config?: AddBlankLineConfig) {
8
+ if ((!state || state.endsWith("\n\n")) && !config?.force) {
9
+ return state;
10
+ } else {
11
+ return addTrailingNewLine(state) + "\n";
12
+ }
13
+ }
@@ -0,0 +1,5 @@
1
+ import { addTrailingNewLine } from "./addTrailingNewLine";
2
+
3
+ export function addLine(line: string, state: string) {
4
+ return addTrailingNewLine(state) + line;
5
+ }
@@ -0,0 +1,5 @@
1
+ import { addBlankLine } from "./addBlankLine";
2
+
3
+ export function addSection(section: string, state: string) {
4
+ return addBlankLine(state) + section;
5
+ }
@@ -0,0 +1,14 @@
1
+ type AddTrailingNewLineConfig = {
2
+ force?: boolean;
3
+ };
4
+
5
+ export function addTrailingNewLine(
6
+ state: string,
7
+ config?: AddTrailingNewLineConfig,
8
+ ) {
9
+ if ((!state || state.endsWith("\n")) && !config?.force) {
10
+ return state;
11
+ } else {
12
+ return state + "\n";
13
+ }
14
+ }
@@ -0,0 +1,74 @@
1
+ import { CustomTypeModel } from "@prismicio/client";
2
+ import { source } from "common-tags";
3
+
4
+ import { buildTypeName } from "../lib/buildTypeName";
5
+
6
+ import { AuxiliaryType, FieldConfigs } from "../types";
7
+
8
+ import { buildFieldProperties } from "./buildFieldProperties";
9
+ import { getHumanReadableModelName } from "./getHumanReadableModelName";
10
+
11
+ type BuildCustomTypeDataTypeArgs = {
12
+ model: CustomTypeModel;
13
+ fieldConfigs: FieldConfigs;
14
+ };
15
+
16
+ type BuildCustomTypeDataTypeReturnValue = {
17
+ name: string;
18
+ code: string;
19
+ auxiliaryTypes: AuxiliaryType[];
20
+ };
21
+
22
+ export function buildCustomTypeDataType(
23
+ args: BuildCustomTypeDataTypeArgs,
24
+ ): BuildCustomTypeDataTypeReturnValue {
25
+ let code = "";
26
+ const auxiliaryTypes: AuxiliaryType[] = [];
27
+
28
+ const name = buildTypeName(args.model.id, "Document", "Data");
29
+ const humanReadableName = getHumanReadableModelName({
30
+ name: args.model.id,
31
+ model: args.model,
32
+ });
33
+
34
+ let fieldProperties = "";
35
+
36
+ for (const tabName in args.model.json) {
37
+ const { uid: _uid, ...fields } = args.model.json[tabName];
38
+
39
+ const tabFieldProperties = buildFieldProperties({
40
+ fields,
41
+ fieldConfigs: args.fieldConfigs,
42
+ path: [
43
+ {
44
+ name: args.model.id,
45
+ model: args.model,
46
+ },
47
+ ],
48
+ tabName,
49
+ });
50
+
51
+ fieldProperties += tabFieldProperties.code;
52
+
53
+ auxiliaryTypes.push(...tabFieldProperties.auxiliaryTypes);
54
+ }
55
+
56
+ if (fieldProperties) {
57
+ code = source`
58
+ /**
59
+ * Content for ${humanReadableName} documents
60
+ */
61
+ interface ${name} {
62
+ ${fieldProperties}
63
+ }
64
+ `;
65
+ } else {
66
+ code = `interface ${name} {}`;
67
+ }
68
+
69
+ return {
70
+ name,
71
+ code,
72
+ auxiliaryTypes,
73
+ };
74
+ }
@@ -0,0 +1,101 @@
1
+ import { CustomTypeModel } from "@prismicio/client";
2
+ import { source } from "common-tags";
3
+ import QuickLRU from "quick-lru";
4
+
5
+ import { AuxiliaryType, FieldConfigs } from "../types";
6
+
7
+ import { CUSTOM_TYPES_DOCUMENTATION_URL } from "../constants";
8
+
9
+ import { addSection } from "./addSection";
10
+ import { buildCustomTypeDataType } from "./buildCustomTypeDataType";
11
+ import { buildTypeName } from "./buildTypeName";
12
+ import { buildUnion } from "./buildUnion";
13
+ import { checkHasUIDField } from "./checkHasUIDFIeld";
14
+ import { getCacheKey } from "./getCacheKey";
15
+ import { getHumanReadableModelName } from "./getHumanReadableModelName";
16
+
17
+ type BuildCustomTypeTypesArgs = {
18
+ model: CustomTypeModel;
19
+ localeIDs?: string[];
20
+ fieldConfigs: FieldConfigs;
21
+ cache?: QuickLRU<string, unknown>;
22
+ };
23
+
24
+ type BuildCustomTypeTypeReturnValue = {
25
+ name: string;
26
+ dataName: string;
27
+ code: string;
28
+ auxiliaryTypes: AuxiliaryType[];
29
+ };
30
+
31
+ export function buildCustomTypeType(
32
+ args: BuildCustomTypeTypesArgs,
33
+ ): BuildCustomTypeTypeReturnValue {
34
+ if (args.cache) {
35
+ const key = getCacheKey(args.model);
36
+ const cached = args.cache.get(key);
37
+
38
+ if (cached) {
39
+ return cached as BuildCustomTypeTypeReturnValue;
40
+ }
41
+ }
42
+
43
+ let code = "";
44
+
45
+ const auxiliaryTypes: AuxiliaryType[] = [];
46
+
47
+ const name = buildTypeName(args.model.id, "Document");
48
+ const langDefault =
49
+ args.localeIDs && args.localeIDs.length > 0
50
+ ? buildUnion(args.localeIDs.map((localeID) => `"${localeID}"`))
51
+ : "string";
52
+ const baseDocumentType = checkHasUIDField(args.model)
53
+ ? "PrismicDocumentWithUID"
54
+ : "PrismicDocumentWithoutUID";
55
+ const humanReadableName = getHumanReadableModelName({
56
+ name: args.model.id,
57
+ model: args.model,
58
+ });
59
+
60
+ const dataType = buildCustomTypeDataType({
61
+ model: args.model,
62
+ fieldConfigs: args.fieldConfigs,
63
+ });
64
+
65
+ auxiliaryTypes.push(...dataType.auxiliaryTypes);
66
+
67
+ code = addSection(dataType.code, code);
68
+
69
+ code = addSection(
70
+ source`
71
+ /**
72
+ * ${humanReadableName} document from Prismic
73
+ *
74
+ * - **API ID**: \`${args.model.id}\`
75
+ * - **Repeatable**: \`${args.model.repeatable.toString()}\`
76
+ * - **Documentation**: ${CUSTOM_TYPES_DOCUMENTATION_URL}
77
+ *
78
+ * @typeParam Lang - Language API ID of the document.
79
+ */
80
+ export type ${name}<Lang extends string = ${langDefault}> = prismic.${baseDocumentType}<Simplify<${
81
+ dataType.name
82
+ }>, "${args.model.id}", Lang>;
83
+ `,
84
+ code,
85
+ );
86
+
87
+ const result = {
88
+ name,
89
+ dataName: dataType.name,
90
+ code,
91
+ auxiliaryTypes,
92
+ };
93
+
94
+ if (args.cache) {
95
+ const key = getCacheKey(args.model);
96
+
97
+ args.cache.set(key, result);
98
+ }
99
+
100
+ return result;
101
+ }