@slicemachine/manager 0.24.14-alpha.jp-update-cr-links-remove-recursion.11 → 0.24.14-alpha.jp-update-cr-links-unit.11
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.
- package/dist/managers/customTypes/CustomTypesManager.cjs +132 -109
- package/dist/managers/customTypes/CustomTypesManager.cjs.map +1 -1
- package/dist/managers/customTypes/CustomTypesManager.d.ts +14 -12
- package/dist/managers/customTypes/CustomTypesManager.js +134 -111
- package/dist/managers/customTypes/CustomTypesManager.js.map +1 -1
- package/package.json +2 -2
- package/src/managers/customTypes/CustomTypesManager.ts +217 -173
@@ -80,83 +80,6 @@ class CustomTypesManager extends BaseManager.BaseManager {
|
|
80
80
|
errors: errors2
|
81
81
|
};
|
82
82
|
}
|
83
|
-
updateCRCustomType(args) {
|
84
|
-
const [previousCustomTypeId, previousFieldId] = args.previousPath;
|
85
|
-
const [newCustomTypeId, newFieldId] = args.newPath;
|
86
|
-
if (!previousCustomTypeId || !newCustomTypeId) {
|
87
|
-
throw new Error("Could not find a customtype id in previousPath and/or newPath, which should not be possible.");
|
88
|
-
}
|
89
|
-
if (!previousFieldId || !newFieldId) {
|
90
|
-
throw new Error("Could not find a field id in previousPath and/or newPath, which should not be possible.");
|
91
|
-
}
|
92
|
-
const customType = shallowCloneIfObject(args.customType);
|
93
|
-
if (typeof customType === "string" || !customType.fields) {
|
94
|
-
return customType;
|
95
|
-
}
|
96
|
-
const matchedCustomTypeId = customType.id === previousCustomTypeId;
|
97
|
-
const newFields = customType.fields.map((fieldArg) => {
|
98
|
-
const nestedField = shallowCloneIfObject(fieldArg);
|
99
|
-
if (typeof nestedField === "string") {
|
100
|
-
if (matchedCustomTypeId && nestedField === previousFieldId && nestedField !== newFieldId) {
|
101
|
-
return newFieldId;
|
102
|
-
}
|
103
|
-
return nestedField;
|
104
|
-
}
|
105
|
-
if (matchedCustomTypeId && nestedField.id === previousFieldId && nestedField.id !== newFieldId) {
|
106
|
-
nestedField.id = newFieldId;
|
107
|
-
}
|
108
|
-
return {
|
109
|
-
...nestedField,
|
110
|
-
customtypes: nestedField.customtypes.map((customTypeArg) => {
|
111
|
-
const customTypeField = shallowCloneIfObject(customTypeArg);
|
112
|
-
if (typeof customTypeField === "string" || !customTypeField.fields) {
|
113
|
-
return customTypeField;
|
114
|
-
}
|
115
|
-
const matchedNestedCustomTypeId = customTypeField.id === previousCustomTypeId;
|
116
|
-
return {
|
117
|
-
...customTypeField,
|
118
|
-
fields: customTypeField.fields.map((fieldArg2) => {
|
119
|
-
const nestedCustomTypeField = shallowCloneIfObject(fieldArg2);
|
120
|
-
if (matchedNestedCustomTypeId && nestedCustomTypeField === previousFieldId && nestedCustomTypeField !== newFieldId) {
|
121
|
-
return newFieldId;
|
122
|
-
}
|
123
|
-
return nestedCustomTypeField;
|
124
|
-
})
|
125
|
-
};
|
126
|
-
})
|
127
|
-
};
|
128
|
-
});
|
129
|
-
return { ...customType, fields: newFields };
|
130
|
-
}
|
131
|
-
/**
|
132
|
-
* Map over the custom types of a Content Relationship Link and update the API
|
133
|
-
* IDs that were changed during the custom type update.
|
134
|
-
*/
|
135
|
-
updateCRCustomTypes(args) {
|
136
|
-
const { customTypes, ...updateMeta } = args;
|
137
|
-
return customTypes.map((customType) => {
|
138
|
-
return this.updateCRCustomType({ customType, ...updateMeta });
|
139
|
-
});
|
140
|
-
}
|
141
|
-
/**
|
142
|
-
* Update the Content Relationship API IDs of a single field. The change is
|
143
|
-
* determined by the `previousPath` and `newPath` properties.
|
144
|
-
*/
|
145
|
-
updateFieldContentRelationships(args) {
|
146
|
-
var _a, _b;
|
147
|
-
const { field, ...updateMeta } = args;
|
148
|
-
if (field.type !== "Link" || ((_a = field.config) == null ? void 0 : _a.select) !== "document" || !((_b = field.config) == null ? void 0 : _b.customtypes)) {
|
149
|
-
return field;
|
150
|
-
}
|
151
|
-
const newCustomTypes = this.updateCRCustomTypes({
|
152
|
-
...updateMeta,
|
153
|
-
customTypes: field.config.customtypes
|
154
|
-
});
|
155
|
-
return {
|
156
|
-
...field,
|
157
|
-
config: { ...field.config, customtypes: newCustomTypes }
|
158
|
-
};
|
159
|
-
}
|
160
83
|
/**
|
161
84
|
* Update the Content Relationship API IDs for all existing custom types and
|
162
85
|
* slices. The change is determined by properties inside the `updateMeta`
|
@@ -172,43 +95,34 @@ class CustomTypesManager extends BaseManager.BaseManager {
|
|
172
95
|
newPath = [model.id, ...newPath];
|
173
96
|
const crUpdates = [];
|
174
97
|
const customTypes = await this.readAllCustomTypes();
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
crUpdates.push(this.sliceMachinePluginRunner.callHook("custom-type:update", {
|
187
|
-
model: updatedCustomTypeModel
|
188
|
-
}));
|
189
|
-
}
|
98
|
+
updateCustomTypeContentRelationships({
|
99
|
+
models: customTypes.models,
|
100
|
+
onUpdate: (model2) => {
|
101
|
+
var _a;
|
102
|
+
pushIfDefined(crUpdates, (_a = this.sliceMachinePluginRunner) == null ? void 0 : _a.callHook("custom-type:update", {
|
103
|
+
model: model2
|
104
|
+
}));
|
105
|
+
},
|
106
|
+
previousPath,
|
107
|
+
newPath
|
108
|
+
});
|
190
109
|
const { libraries } = await this.slices.readAllSliceLibraries();
|
191
110
|
for (const library of libraries) {
|
192
111
|
const slices = await this.slices.readAllSlicesForLibrary({
|
193
112
|
libraryID: library.libraryID
|
194
113
|
});
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
crUpdates.push(this.sliceMachinePluginRunner.callHook("slice:update", {
|
208
|
-
libraryID: library.libraryID,
|
209
|
-
model: updatedSliceModel
|
210
|
-
}));
|
211
|
-
}
|
114
|
+
updateSharedSliceContentRelationships({
|
115
|
+
models: slices.models,
|
116
|
+
onUpdate: (model2) => {
|
117
|
+
var _a;
|
118
|
+
pushIfDefined(crUpdates, (_a = this.sliceMachinePluginRunner) == null ? void 0 : _a.callHook("slice:update", {
|
119
|
+
libraryID: library.libraryID,
|
120
|
+
model: model2
|
121
|
+
}));
|
122
|
+
},
|
123
|
+
previousPath,
|
124
|
+
newPath
|
125
|
+
});
|
212
126
|
}
|
213
127
|
const crUpdatesResult = await Promise.all(crUpdates);
|
214
128
|
if (crUpdatesResult.some((result) => result.errors.length > 0)) {
|
@@ -373,11 +287,120 @@ const InferSliceResponse = index.default.object({
|
|
373
287
|
}),
|
374
288
|
langSmithUrl: index.default.string().url().optional()
|
375
289
|
});
|
290
|
+
function updateCRCustomType(args) {
|
291
|
+
const [previousCustomTypeId, previousFieldId] = args.previousPath;
|
292
|
+
const [newCustomTypeId, newFieldId] = args.newPath;
|
293
|
+
if (!previousCustomTypeId || !newCustomTypeId) {
|
294
|
+
throw new Error("Could not find a customtype id in previousPath and/or newPath, which should not be possible.");
|
295
|
+
}
|
296
|
+
if (!previousFieldId || !newFieldId) {
|
297
|
+
throw new Error("Could not find a field id in previousPath and/or newPath, which should not be possible.");
|
298
|
+
}
|
299
|
+
const customType = shallowCloneIfObject(args.customType);
|
300
|
+
if (typeof customType === "string" || !customType.fields) {
|
301
|
+
return customType;
|
302
|
+
}
|
303
|
+
const matchedCustomTypeId = customType.id === previousCustomTypeId;
|
304
|
+
const newFields = customType.fields.map((fieldArg) => {
|
305
|
+
const nestedField = shallowCloneIfObject(fieldArg);
|
306
|
+
if (typeof nestedField === "string") {
|
307
|
+
if (matchedCustomTypeId && nestedField === previousFieldId && nestedField !== newFieldId) {
|
308
|
+
return newFieldId;
|
309
|
+
}
|
310
|
+
return nestedField;
|
311
|
+
}
|
312
|
+
if (matchedCustomTypeId && nestedField.id === previousFieldId && nestedField.id !== newFieldId) {
|
313
|
+
nestedField.id = newFieldId;
|
314
|
+
}
|
315
|
+
return {
|
316
|
+
...nestedField,
|
317
|
+
customtypes: nestedField.customtypes.map((customTypeArg) => {
|
318
|
+
const customTypeField = shallowCloneIfObject(customTypeArg);
|
319
|
+
if (typeof customTypeField === "string" || !customTypeField.fields) {
|
320
|
+
return customTypeField;
|
321
|
+
}
|
322
|
+
const matchedNestedCustomTypeId = customTypeField.id === previousCustomTypeId;
|
323
|
+
return {
|
324
|
+
...customTypeField,
|
325
|
+
fields: customTypeField.fields.map((fieldArg2) => {
|
326
|
+
const nestedCustomTypeField = shallowCloneIfObject(fieldArg2);
|
327
|
+
if (matchedNestedCustomTypeId && nestedCustomTypeField === previousFieldId && nestedCustomTypeField !== newFieldId) {
|
328
|
+
return newFieldId;
|
329
|
+
}
|
330
|
+
return nestedCustomTypeField;
|
331
|
+
})
|
332
|
+
};
|
333
|
+
})
|
334
|
+
};
|
335
|
+
});
|
336
|
+
return { ...customType, fields: newFields };
|
337
|
+
}
|
338
|
+
function updateCRCustomTypes(args) {
|
339
|
+
const { customTypes, ...updateMeta } = args;
|
340
|
+
return customTypes.map((customType) => {
|
341
|
+
return updateCRCustomType({ customType, ...updateMeta });
|
342
|
+
});
|
343
|
+
}
|
344
|
+
function updateFieldContentRelationships(args) {
|
345
|
+
var _a, _b;
|
346
|
+
const { field, ...updateMeta } = args;
|
347
|
+
if (field.type !== "Link" || ((_a = field.config) == null ? void 0 : _a.select) !== "document" || !((_b = field.config) == null ? void 0 : _b.customtypes)) {
|
348
|
+
return field;
|
349
|
+
}
|
350
|
+
const newCustomTypes = updateCRCustomTypes({
|
351
|
+
...updateMeta,
|
352
|
+
customTypes: field.config.customtypes
|
353
|
+
});
|
354
|
+
return {
|
355
|
+
...field,
|
356
|
+
config: { ...field.config, customtypes: newCustomTypes }
|
357
|
+
};
|
358
|
+
}
|
359
|
+
function updateCustomTypeContentRelationships(args) {
|
360
|
+
const { models, previousPath, newPath, onUpdate } = args;
|
361
|
+
for (const customType of models) {
|
362
|
+
const updatedCustomTypeModel = customtypes.traverseCustomType({
|
363
|
+
customType: customType.model,
|
364
|
+
onField: ({ field }) => {
|
365
|
+
return updateFieldContentRelationships({
|
366
|
+
field,
|
367
|
+
previousPath,
|
368
|
+
newPath
|
369
|
+
});
|
370
|
+
}
|
371
|
+
});
|
372
|
+
onUpdate(updatedCustomTypeModel);
|
373
|
+
}
|
374
|
+
}
|
375
|
+
function updateSharedSliceContentRelationships(args) {
|
376
|
+
const { models, previousPath, newPath, onUpdate } = args;
|
377
|
+
for (const slice of models) {
|
378
|
+
const updatedSliceModel = customtypes.traverseSharedSlice({
|
379
|
+
path: ["."],
|
380
|
+
slice: slice.model,
|
381
|
+
onField: ({ field }) => {
|
382
|
+
return updateFieldContentRelationships({
|
383
|
+
field,
|
384
|
+
previousPath,
|
385
|
+
newPath
|
386
|
+
});
|
387
|
+
}
|
388
|
+
});
|
389
|
+
onUpdate(updatedSliceModel);
|
390
|
+
}
|
391
|
+
}
|
376
392
|
function shallowCloneIfObject(value) {
|
377
393
|
if (typeof value === "object") {
|
378
394
|
return { ...value };
|
379
395
|
}
|
380
396
|
return value;
|
381
397
|
}
|
398
|
+
function pushIfDefined(array, value) {
|
399
|
+
if (value) {
|
400
|
+
array.push(value);
|
401
|
+
}
|
402
|
+
}
|
382
403
|
exports.CustomTypesManager = CustomTypesManager;
|
404
|
+
exports.updateCustomTypeContentRelationships = updateCustomTypeContentRelationships;
|
405
|
+
exports.updateSharedSliceContentRelationships = updateSharedSliceContentRelationships;
|
383
406
|
//# sourceMappingURL=CustomTypesManager.cjs.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"CustomTypesManager.cjs","sources":["../../../../src/managers/customTypes/CustomTypesManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport * as prismicCustomTypesClient from \"@prismicio/custom-types-client\";\nimport {\n\tCustomType,\n\tGroup,\n\tNestableWidget,\n\tNestedGroup,\n\tSharedSlice,\n\tUID,\n\ttraverseCustomType,\n\ttraverseSharedSlice,\n} from \"@prismicio/types-internal/lib/customtypes\";\nimport {\n\tCallHookReturnType,\n\tCustomTypeCreateHook,\n\tCustomTypeCreateHookData,\n\tCustomTypeReadHookData,\n\tCustomTypeRenameHook,\n\tCustomTypeRenameHookData,\n\tCustomTypeUpdateHook,\n\tCustomTypeUpdateHookData,\n\tHookError,\n} from \"@slicemachine/plugin-kit\";\nimport { z } from \"zod\";\n\nimport { DecodeError } from \"../../lib/DecodeError\";\nimport { assertPluginsInitialized } from \"../../lib/assertPluginsInitialized\";\nimport { decodeHookResult } from \"../../lib/decodeHookResult\";\nimport fetch from \"../../lib/fetch\";\n\nimport { OnlyHookErrors } from \"../../types\";\nimport { API_ENDPOINTS } from \"../../constants/API_ENDPOINTS\";\nimport { SLICE_MACHINE_USER_AGENT } from \"../../constants/SLICE_MACHINE_USER_AGENT\";\nimport { UnauthorizedError } from \"../../errors\";\n\nimport { BaseManager } from \"../BaseManager\";\nimport { CustomTypeFormat } from \"./types\";\n\ntype SliceMachineManagerReadCustomTypeLibraryReturnType = {\n\tids: string[];\n\terrors: (DecodeError | HookError)[];\n};\n\ntype CustomTypesManagerReadAllCustomTypesArgs = {\n\tformat: CustomTypeFormat;\n};\n\ntype SliceMachineManagerReadAllCustomTypeReturnType = {\n\tmodels: { model: CustomType }[];\n\terrors: (DecodeError | HookError)[];\n};\n\ntype SliceMachineManagerReadCustomTypeReturnType = {\n\tmodel: CustomType | undefined;\n\terrors: (DecodeError | HookError)[];\n};\n\ntype SliceMachineManagerPushCustomTypeArgs = {\n\tid: string;\n\tuserAgent?: string;\n};\n\ntype SliceMachineManagerReadCustomTypeMocksConfigArgs = {\n\tcustomTypeID: string;\n};\n\ntype SliceMachineManagerReadCustomTypeMocksConfigArgsReturnType = {\n\t// TODO\n\tmocksConfig?: Record<string, unknown>;\n\terrors: HookError[];\n};\n\ntype SliceMachineManagerUpdateCustomTypeMocksConfigArgs = {\n\tcustomTypeID: string;\n\t// TODO\n\tmocksConfig: Record<string, unknown>;\n};\n\ntype SliceMachineManagerUpdateCustomTypeMocksConfigArgsReturnType = {\n\terrors: HookError[];\n};\n\ntype CustomTypesMachineManagerDeleteCustomTypeArgs = {\n\tid: string;\n};\n\ntype CustomTypesMachineManagerDeleteCustomTypeReturnType = {\n\terrors: (DecodeError | HookError)[];\n};\n\ntype CustomTypeFieldIdChangedMeta = NonNullable<\n\tNonNullable<CustomTypeUpdateHookData[\"updateMeta\"]>[\"fieldIdChanged\"]\n>;\n\ntype CrCustomTypes = readonly CrCustomType[];\ntype CrCustomType =\n\t| string\n\t| { id: string; fields?: readonly CrCustomTypeNestedCr[] };\ntype CrCustomTypeNestedCr =\n\t| string\n\t| { id: string; customtypes: readonly CrCustomTypeFieldLeaf[] };\ntype CrCustomTypeFieldLeaf =\n\t| string\n\t| { id: string; fields?: readonly string[] };\n\nexport class CustomTypesManager extends BaseManager {\n\tasync readCustomTypeLibrary(): Promise<SliceMachineManagerReadCustomTypeLibraryReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type-library:read\",\n\t\t\tundefined,\n\t\t);\n\t\tconst { data, errors } = decodeHookResult(\n\t\t\tt.type({\n\t\t\t\tids: t.array(t.string),\n\t\t\t}),\n\t\t\thookResult,\n\t\t);\n\n\t\treturn {\n\t\t\tids: data[0]?.ids || [],\n\t\t\terrors,\n\t\t};\n\t}\n\n\tasync readAllCustomTypes(\n\t\targs?: CustomTypesManagerReadAllCustomTypesArgs,\n\t): Promise<SliceMachineManagerReadAllCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst res: SliceMachineManagerReadAllCustomTypeReturnType = {\n\t\t\tmodels: [],\n\t\t\terrors: [],\n\t\t};\n\n\t\tconst { ids, errors } = await this.readCustomTypeLibrary();\n\t\tres.errors = [...res.errors, ...errors];\n\n\t\tif (ids) {\n\t\t\tfor (const id of ids) {\n\t\t\t\tconst { model, errors } = await this.readCustomType({ id });\n\t\t\t\tres.errors = [...res.errors, ...errors];\n\n\t\t\t\tif (model && (!args || args.format === model.format)) {\n\t\t\t\t\tres.models.push({ model });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn res;\n\t}\n\n\tasync createCustomType(\n\t\targs: CustomTypeCreateHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeCreateHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:create\",\n\t\t\targs,\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync readCustomType(\n\t\targs: CustomTypeReadHookData,\n\t): Promise<SliceMachineManagerReadCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:read\",\n\t\t\targs,\n\t\t);\n\t\tconst { data, errors } = decodeHookResult(\n\t\t\tt.type({\n\t\t\t\tmodel: CustomType,\n\t\t\t}),\n\t\t\thookResult,\n\t\t);\n\n\t\treturn {\n\t\t\tmodel: data[0]?.model,\n\t\t\terrors,\n\t\t};\n\t}\n\n\tprivate updateCRCustomType(\n\t\targs: { customType: CrCustomType } & CustomTypeFieldIdChangedMeta,\n\t): CrCustomType {\n\t\tconst [previousCustomTypeId, previousFieldId] = args.previousPath;\n\t\tconst [newCustomTypeId, newFieldId] = args.newPath;\n\n\t\tif (!previousCustomTypeId || !newCustomTypeId) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Could not find a customtype id in previousPath and/or newPath, which should not be possible.\",\n\t\t\t);\n\t\t}\n\n\t\tif (!previousFieldId || !newFieldId) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Could not find a field id in previousPath and/or newPath, which should not be possible.\",\n\t\t\t);\n\t\t}\n\n\t\tconst customType = shallowCloneIfObject(args.customType);\n\n\t\tif (typeof customType === \"string\" || !customType.fields) {\n\t\t\treturn customType;\n\t\t}\n\n\t\tconst matchedCustomTypeId = customType.id === previousCustomTypeId;\n\n\t\tconst newFields = customType.fields.map((fieldArg) => {\n\t\t\tconst nestedField = shallowCloneIfObject(fieldArg);\n\n\t\t\tif (typeof nestedField === \"string\") {\n\t\t\t\tif (\n\t\t\t\t\tmatchedCustomTypeId &&\n\t\t\t\t\tnestedField === previousFieldId &&\n\t\t\t\t\tnestedField !== newFieldId\n\t\t\t\t) {\n\t\t\t\t\t// We have reached a field id that matches the id that was renamed,\n\t\t\t\t\t// so we update it new one. The field is a string, so return the new\n\t\t\t\t\t// id.\n\t\t\t\t\treturn newFieldId;\n\t\t\t\t}\n\n\t\t\t\treturn nestedField;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tmatchedCustomTypeId &&\n\t\t\t\tnestedField.id === previousFieldId &&\n\t\t\t\tnestedField.id !== newFieldId\n\t\t\t) {\n\t\t\t\t// We have reached a field id that matches the id that was renamed,\n\t\t\t\t// so we update it new one.\n\t\t\t\t// Since field is not a string, we don't exit, as we might have\n\t\t\t\t// something to update further down in customtypes.\n\t\t\t\tnestedField.id = newFieldId;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...nestedField,\n\t\t\t\tcustomtypes: nestedField.customtypes.map((customTypeArg) => {\n\t\t\t\t\tconst customTypeField = shallowCloneIfObject(customTypeArg);\n\n\t\t\t\t\tif (typeof customTypeField === \"string\" || !customTypeField.fields) {\n\t\t\t\t\t\treturn customTypeField;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst matchedNestedCustomTypeId =\n\t\t\t\t\t\tcustomTypeField.id === previousCustomTypeId;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...customTypeField,\n\t\t\t\t\t\tfields: customTypeField.fields.map((fieldArg) => {\n\t\t\t\t\t\t\tconst nestedCustomTypeField = shallowCloneIfObject(fieldArg);\n\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tmatchedNestedCustomTypeId &&\n\t\t\t\t\t\t\t\tnestedCustomTypeField === previousFieldId &&\n\t\t\t\t\t\t\t\tnestedCustomTypeField !== newFieldId\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t// Matches the previous id, so we update it and return because\n\t\t\t\t\t\t\t\t// it's the last level.\n\t\t\t\t\t\t\t\treturn newFieldId;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn nestedCustomTypeField;\n\t\t\t\t\t\t}),\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t};\n\t\t});\n\n\t\treturn { ...customType, fields: newFields };\n\t}\n\n\t/**\n\t * Map over the custom types of a Content Relationship Link and update the API\n\t * IDs that were changed during the custom type update.\n\t */\n\tprivate updateCRCustomTypes(\n\t\targs: { customTypes: CrCustomTypes } & CustomTypeFieldIdChangedMeta,\n\t): CrCustomTypes {\n\t\tconst { customTypes, ...updateMeta } = args;\n\n\t\treturn customTypes.map((customType) => {\n\t\t\treturn this.updateCRCustomType({ customType, ...updateMeta });\n\t\t});\n\t}\n\n\t/**\n\t * Update the Content Relationship API IDs of a single field. The change is\n\t * determined by the `previousPath` and `newPath` properties.\n\t */\n\tprivate updateFieldContentRelationships<\n\t\tT extends UID | NestableWidget | Group | NestedGroup,\n\t>(args: { field: T } & CustomTypeFieldIdChangedMeta): T {\n\t\tconst { field, ...updateMeta } = args;\n\t\tif (\n\t\t\tfield.type !== \"Link\" ||\n\t\t\tfield.config?.select !== \"document\" ||\n\t\t\t!field.config?.customtypes\n\t\t) {\n\t\t\t// not a content relationship field\n\t\t\treturn field;\n\t\t}\n\n\t\tconst newCustomTypes = this.updateCRCustomTypes({\n\t\t\t...updateMeta,\n\t\t\tcustomTypes: field.config.customtypes,\n\t\t});\n\n\t\treturn {\n\t\t\t...field,\n\t\t\tconfig: { ...field.config, customtypes: newCustomTypes },\n\t\t};\n\t}\n\n\t/**\n\t * Update the Content Relationship API IDs for all existing custom types and\n\t * slices. The change is determined by properties inside the `updateMeta`\n\t * property.\n\t */\n\tprivate async updateContentRelationships(\n\t\targs: CustomTypeUpdateHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeUpdateHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst { model, updateMeta } = args;\n\n\t\tif (updateMeta?.fieldIdChanged) {\n\t\t\tlet { previousPath, newPath } = updateMeta.fieldIdChanged;\n\n\t\t\tif (previousPath.join(\".\") !== newPath.join(\".\")) {\n\t\t\t\tpreviousPath = [model.id, ...previousPath];\n\t\t\t\tnewPath = [model.id, ...newPath];\n\n\t\t\t\tconst crUpdates: Promise<{ errors: HookError[] }>[] = [];\n\n\t\t\t\t// Find existing content relationships that link to the renamed field id in\n\t\t\t\t// any custom type and update them to use the new one.\n\t\t\t\tconst customTypes = await this.readAllCustomTypes();\n\n\t\t\t\tfor (const customType of customTypes.models) {\n\t\t\t\t\tconst updatedCustomTypeModel = traverseCustomType({\n\t\t\t\t\t\tcustomType: customType.model,\n\t\t\t\t\t\tonField: ({ field }) => {\n\t\t\t\t\t\t\treturn this.updateFieldContentRelationships({\n\t\t\t\t\t\t\t\tfield,\n\t\t\t\t\t\t\t\tpreviousPath,\n\t\t\t\t\t\t\t\tnewPath,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\tcrUpdates.push(\n\t\t\t\t\t\tthis.sliceMachinePluginRunner.callHook(\"custom-type:update\", {\n\t\t\t\t\t\t\tmodel: updatedCustomTypeModel,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Find existing slice with content relationships that link to the renamed\n\t\t\t\t// field id in all libraries and update them to use the new one.\n\t\t\t\tconst { libraries } = await this.slices.readAllSliceLibraries();\n\n\t\t\t\tfor (const library of libraries) {\n\t\t\t\t\tconst slices = await this.slices.readAllSlicesForLibrary({\n\t\t\t\t\t\tlibraryID: library.libraryID,\n\t\t\t\t\t});\n\n\t\t\t\t\tfor (const slice of slices.models) {\n\t\t\t\t\t\tconst updatedSliceModel = traverseSharedSlice({\n\t\t\t\t\t\t\tpath: [\".\"],\n\t\t\t\t\t\t\tslice: slice.model,\n\t\t\t\t\t\t\tonField: ({ field }) => {\n\t\t\t\t\t\t\t\treturn this.updateFieldContentRelationships({\n\t\t\t\t\t\t\t\t\tfield,\n\t\t\t\t\t\t\t\t\tpreviousPath,\n\t\t\t\t\t\t\t\t\tnewPath,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tcrUpdates.push(\n\t\t\t\t\t\t\tthis.sliceMachinePluginRunner.callHook(\"slice:update\", {\n\t\t\t\t\t\t\t\tlibraryID: library.libraryID,\n\t\t\t\t\t\t\t\tmodel: updatedSliceModel,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Process all the Content Relationship updates at once.\n\t\t\t\tconst crUpdatesResult = await Promise.all(crUpdates);\n\n\t\t\t\tif (crUpdatesResult.some((result) => result.errors.length > 0)) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\terrors: crUpdatesResult.flatMap((result) => result.errors),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn { errors: [] };\n\t}\n\n\tasync updateCustomType(\n\t\targs: CustomTypeUpdateHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeUpdateHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:update\",\n\t\t\targs,\n\t\t);\n\n\t\tif (args.updateMeta?.fieldIdChanged) {\n\t\t\tawait this.updateContentRelationships(args);\n\t\t}\n\n\t\treturn { errors: hookResult.errors };\n\t}\n\n\tasync renameCustomType(\n\t\targs: CustomTypeRenameHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeRenameHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:rename\",\n\t\t\targs,\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync deleteCustomType(\n\t\targs: CustomTypesMachineManagerDeleteCustomTypeArgs,\n\t): Promise<CustomTypesMachineManagerDeleteCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst { model, errors: readCustomTypeErrors } = await this.readCustomType({\n\t\t\tid: args.id,\n\t\t});\n\n\t\tif (model) {\n\t\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\t\"custom-type:delete\",\n\t\t\t\t{ model },\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\terrors: readCustomTypeErrors,\n\t\t\t};\n\t\t}\n\t}\n\n\tasync pushCustomType(\n\t\targs: SliceMachineManagerPushCustomTypeArgs,\n\t): Promise<void> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\t\tconst repositoryName = await this.project.getResolvedRepositoryName();\n\n\t\t// TODO: Handle errors\n\t\tconst { model } = await this.readCustomType({ id: args.id });\n\n\t\tif (model) {\n\t\t\t// TODO: Create a single shared client.\n\t\t\tconst client = prismicCustomTypesClient.createClient({\n\t\t\t\tendpoint: API_ENDPOINTS.PrismicModels,\n\t\t\t\trepositoryName,\n\t\t\t\ttoken: authenticationToken,\n\t\t\t\tfetch,\n\t\t\t\tfetchOptions: {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"User-Agent\": args.userAgent || SLICE_MACHINE_USER_AGENT,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\t// Check if Custom Type already exists on the repository.\n\t\t\t\tawait client.getCustomTypeByID(args.id);\n\n\t\t\t\t// If it exists on the repository, update it.\n\t\t\t\tawait client.updateCustomType(model);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof prismicCustomTypesClient.NotFoundError) {\n\t\t\t\t\t// If it doesn't exist on the repository, insert it.\n\t\t\t\t\tawait client.insertCustomType(model);\n\t\t\t\t} else if (error instanceof prismicCustomTypesClient.ForbiddenError) {\n\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\t\"You do not have access to push types to this Prismic repository.\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcause: error,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// TODO: Remove\n\tasync readCustomTypeMocksConfig(\n\t\targs: SliceMachineManagerReadCustomTypeMocksConfigArgs,\n\t): Promise<SliceMachineManagerReadCustomTypeMocksConfigArgsReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:asset:read\",\n\t\t\t{\n\t\t\t\tcustomTypeID: args.customTypeID,\n\t\t\t\tassetID: \"mocks.config.json\",\n\t\t\t},\n\t\t);\n\t\tconst data = hookResult.data[0]?.data;\n\n\t\t// TODO: Validate the returned data.\n\n\t\tif (data) {\n\t\t\treturn {\n\t\t\t\tmocksConfig: JSON.parse(data.toString()),\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tmocksConfig: undefined,\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t}\n\t}\n\n\t// TODO: Remove\n\tasync updateCustomTypeMocksConfig(\n\t\targs: SliceMachineManagerUpdateCustomTypeMocksConfigArgs,\n\t): Promise<SliceMachineManagerUpdateCustomTypeMocksConfigArgsReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:asset:update\",\n\t\t\t{\n\t\t\t\tcustomTypeID: args.customTypeID,\n\t\t\t\tasset: {\n\t\t\t\t\tid: \"mocks.config.json\",\n\t\t\t\t\tdata: Buffer.from(JSON.stringify(args.mocksConfig, null, \"\\t\")),\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync fetchRemoteCustomTypes(): Promise<CustomType[]> {\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\t\tconst repositoryName = await this.project.getResolvedRepositoryName();\n\n\t\tconst client = prismicCustomTypesClient.createClient({\n\t\t\tendpoint: API_ENDPOINTS.PrismicModels,\n\t\t\trepositoryName,\n\t\t\ttoken: authenticationToken,\n\t\t\tfetch,\n\t\t\tfetchOptions: {\n\t\t\t\theaders: {\n\t\t\t\t\t\"User-Agent\": SLICE_MACHINE_USER_AGENT,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\treturn await client.getAllCustomTypes();\n\t}\n\n\tasync inferSlice({\n\t\timageUrl,\n\t}: {\n\t\timageUrl: string;\n\t}): Promise<InferSliceResponse> {\n\t\tconst authToken = await this.user.getAuthenticationToken();\n\t\tconst headers = {\n\t\t\tAuthorization: `Bearer ${authToken}`,\n\t\t};\n\n\t\tconst repository = await this.project.getResolvedRepositoryName();\n\t\tconst searchParams = new URLSearchParams({\n\t\t\trepository,\n\t\t});\n\n\t\tconst url = new URL(\"./slices/infer\", API_ENDPOINTS.CustomTypeService);\n\t\turl.search = searchParams.toString();\n\n\t\tconst response = await fetch(url.toString(), {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: headers,\n\t\t\tbody: JSON.stringify({ imageUrl }),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Failed to infer slice: ${response.statusText}`);\n\t\t}\n\n\t\tconst json = await response.json();\n\n\t\treturn InferSliceResponse.parse(json);\n\t}\n}\n\ntype InferSliceResponse = z.infer<typeof InferSliceResponse>;\n\nconst InferSliceResponse = z.object({\n\tslice: z.custom().transform((value, ctx) => {\n\t\tconst result = SharedSlice.decode(value);\n\t\tif (result._tag === \"Right\") {\n\t\t\treturn result.right;\n\t\t}\n\t\tctx.addIssue({\n\t\t\tcode: z.ZodIssueCode.custom,\n\t\t\tmessage: `Invalid shared slice: ${JSON.stringify(value, null, 2)}`,\n\t\t});\n\n\t\treturn z.NEVER;\n\t}),\n\tlangSmithUrl: z.string().url().optional(),\n});\n\nfunction shallowCloneIfObject<T>(value: T): T {\n\tif (typeof value === \"object\") {\n\t\treturn { ...value };\n\t}\n\n\treturn value;\n}\n"],"names":["BaseManager","assertPluginsInitialized","errors","decodeHookResult","t","CustomType","fieldArg","traverseCustomType","traverseSharedSlice","prismicCustomTypesClient","API_ENDPOINTS","fetch","SLICE_MACHINE_USER_AGENT","UnauthorizedError","z","SharedSlice"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"CustomTypesManager.cjs","sources":["../../../../src/managers/customTypes/CustomTypesManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport * as prismicCustomTypesClient from \"@prismicio/custom-types-client\";\nimport {\n\tCustomType,\n\tGroup,\n\tNestableWidget,\n\tNestedGroup,\n\tSharedSlice,\n\tUID,\n\ttraverseCustomType,\n\ttraverseSharedSlice,\n} from \"@prismicio/types-internal/lib/customtypes\";\nimport {\n\tCallHookReturnType,\n\tCustomTypeCreateHook,\n\tCustomTypeCreateHookData,\n\tCustomTypeReadHookData,\n\tCustomTypeRenameHook,\n\tCustomTypeRenameHookData,\n\tCustomTypeUpdateHook,\n\tCustomTypeUpdateHookData,\n\tHookError,\n} from \"@slicemachine/plugin-kit\";\nimport { z } from \"zod\";\n\nimport { DecodeError } from \"../../lib/DecodeError\";\nimport { assertPluginsInitialized } from \"../../lib/assertPluginsInitialized\";\nimport { decodeHookResult } from \"../../lib/decodeHookResult\";\nimport fetch from \"../../lib/fetch\";\n\nimport { OnlyHookErrors } from \"../../types\";\nimport { API_ENDPOINTS } from \"../../constants/API_ENDPOINTS\";\nimport { SLICE_MACHINE_USER_AGENT } from \"../../constants/SLICE_MACHINE_USER_AGENT\";\nimport { UnauthorizedError } from \"../../errors\";\n\nimport { BaseManager } from \"../BaseManager\";\nimport { CustomTypeFormat } from \"./types\";\n\ntype SliceMachineManagerReadCustomTypeLibraryReturnType = {\n\tids: string[];\n\terrors: (DecodeError | HookError)[];\n};\n\ntype CustomTypesManagerReadAllCustomTypesArgs = {\n\tformat: CustomTypeFormat;\n};\n\ntype SliceMachineManagerReadAllCustomTypeReturnType = {\n\tmodels: { model: CustomType }[];\n\terrors: (DecodeError | HookError)[];\n};\n\ntype SliceMachineManagerReadCustomTypeReturnType = {\n\tmodel: CustomType | undefined;\n\terrors: (DecodeError | HookError)[];\n};\n\ntype SliceMachineManagerPushCustomTypeArgs = {\n\tid: string;\n\tuserAgent?: string;\n};\n\ntype SliceMachineManagerReadCustomTypeMocksConfigArgs = {\n\tcustomTypeID: string;\n};\n\ntype SliceMachineManagerReadCustomTypeMocksConfigArgsReturnType = {\n\t// TODO\n\tmocksConfig?: Record<string, unknown>;\n\terrors: HookError[];\n};\n\ntype SliceMachineManagerUpdateCustomTypeMocksConfigArgs = {\n\tcustomTypeID: string;\n\t// TODO\n\tmocksConfig: Record<string, unknown>;\n};\n\ntype SliceMachineManagerUpdateCustomTypeMocksConfigArgsReturnType = {\n\terrors: HookError[];\n};\n\ntype CustomTypesMachineManagerDeleteCustomTypeArgs = {\n\tid: string;\n};\n\ntype CustomTypesMachineManagerDeleteCustomTypeReturnType = {\n\terrors: (DecodeError | HookError)[];\n};\n\ntype CustomTypeFieldIdChangedMeta = NonNullable<\n\tNonNullable<CustomTypeUpdateHookData[\"updateMeta\"]>[\"fieldIdChanged\"]\n>;\n\ntype CrCustomTypes = readonly CrCustomType[];\ntype CrCustomType =\n\t| string\n\t| { id: string; fields?: readonly CrCustomTypeNestedCr[] };\ntype CrCustomTypeNestedCr =\n\t| string\n\t| { id: string; customtypes: readonly CrCustomTypeFieldLeaf[] };\ntype CrCustomTypeFieldLeaf =\n\t| string\n\t| { id: string; fields?: readonly string[] };\n\nexport class CustomTypesManager extends BaseManager {\n\tasync readCustomTypeLibrary(): Promise<SliceMachineManagerReadCustomTypeLibraryReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type-library:read\",\n\t\t\tundefined,\n\t\t);\n\t\tconst { data, errors } = decodeHookResult(\n\t\t\tt.type({\n\t\t\t\tids: t.array(t.string),\n\t\t\t}),\n\t\t\thookResult,\n\t\t);\n\n\t\treturn {\n\t\t\tids: data[0]?.ids || [],\n\t\t\terrors,\n\t\t};\n\t}\n\n\tasync readAllCustomTypes(\n\t\targs?: CustomTypesManagerReadAllCustomTypesArgs,\n\t): Promise<SliceMachineManagerReadAllCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst res: SliceMachineManagerReadAllCustomTypeReturnType = {\n\t\t\tmodels: [],\n\t\t\terrors: [],\n\t\t};\n\n\t\tconst { ids, errors } = await this.readCustomTypeLibrary();\n\t\tres.errors = [...res.errors, ...errors];\n\n\t\tif (ids) {\n\t\t\tfor (const id of ids) {\n\t\t\t\tconst { model, errors } = await this.readCustomType({ id });\n\t\t\t\tres.errors = [...res.errors, ...errors];\n\n\t\t\t\tif (model && (!args || args.format === model.format)) {\n\t\t\t\t\tres.models.push({ model });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn res;\n\t}\n\n\tasync createCustomType(\n\t\targs: CustomTypeCreateHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeCreateHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:create\",\n\t\t\targs,\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync readCustomType(\n\t\targs: CustomTypeReadHookData,\n\t): Promise<SliceMachineManagerReadCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:read\",\n\t\t\targs,\n\t\t);\n\t\tconst { data, errors } = decodeHookResult(\n\t\t\tt.type({\n\t\t\t\tmodel: CustomType,\n\t\t\t}),\n\t\t\thookResult,\n\t\t);\n\n\t\treturn {\n\t\t\tmodel: data[0]?.model,\n\t\t\terrors,\n\t\t};\n\t}\n\n\t/**\n\t * Update the Content Relationship API IDs for all existing custom types and\n\t * slices. The change is determined by properties inside the `updateMeta`\n\t * property.\n\t */\n\tprivate async updateContentRelationships(\n\t\targs: CustomTypeUpdateHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeUpdateHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst { model, updateMeta } = args;\n\n\t\tif (updateMeta?.fieldIdChanged) {\n\t\t\tlet { previousPath, newPath } = updateMeta.fieldIdChanged;\n\n\t\t\tif (previousPath.join(\".\") !== newPath.join(\".\")) {\n\t\t\t\tpreviousPath = [model.id, ...previousPath];\n\t\t\t\tnewPath = [model.id, ...newPath];\n\n\t\t\t\tconst crUpdates: Promise<{ errors: HookError[] }>[] = [];\n\n\t\t\t\t// Find existing content relationships that link to the renamed field id in\n\t\t\t\t// any custom type and update them to use the new one.\n\t\t\t\tconst customTypes = await this.readAllCustomTypes();\n\n\t\t\t\tupdateCustomTypeContentRelationships({\n\t\t\t\t\tmodels: customTypes.models,\n\t\t\t\t\tonUpdate: (model) => {\n\t\t\t\t\t\tpushIfDefined(\n\t\t\t\t\t\t\tcrUpdates,\n\t\t\t\t\t\t\tthis.sliceMachinePluginRunner?.callHook(\"custom-type:update\", {\n\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t});\n\n\t\t\t\t// Find existing slice with content relationships that link to the renamed\n\t\t\t\t// field id in all libraries and update them to use the new one.\n\t\t\t\tconst { libraries } = await this.slices.readAllSliceLibraries();\n\n\t\t\t\tfor (const library of libraries) {\n\t\t\t\t\tconst slices = await this.slices.readAllSlicesForLibrary({\n\t\t\t\t\t\tlibraryID: library.libraryID,\n\t\t\t\t\t});\n\n\t\t\t\t\tupdateSharedSliceContentRelationships({\n\t\t\t\t\t\tmodels: slices.models,\n\t\t\t\t\t\tonUpdate: (model) => {\n\t\t\t\t\t\t\tpushIfDefined(\n\t\t\t\t\t\t\t\tcrUpdates,\n\t\t\t\t\t\t\t\tthis.sliceMachinePluginRunner?.callHook(\"slice:update\", {\n\t\t\t\t\t\t\t\t\tlibraryID: library.libraryID,\n\t\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tpreviousPath,\n\t\t\t\t\t\tnewPath,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Process all the Content Relationship updates at once.\n\t\t\t\tconst crUpdatesResult = await Promise.all(crUpdates);\n\n\t\t\t\tif (crUpdatesResult.some((result) => result.errors.length > 0)) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\terrors: crUpdatesResult.flatMap((result) => result.errors),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn { errors: [] };\n\t}\n\n\tasync updateCustomType(\n\t\targs: CustomTypeUpdateHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeUpdateHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:update\",\n\t\t\targs,\n\t\t);\n\n\t\tif (args.updateMeta?.fieldIdChanged) {\n\t\t\tawait this.updateContentRelationships(args);\n\t\t}\n\n\t\treturn { errors: hookResult.errors };\n\t}\n\n\tasync renameCustomType(\n\t\targs: CustomTypeRenameHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeRenameHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:rename\",\n\t\t\targs,\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync deleteCustomType(\n\t\targs: CustomTypesMachineManagerDeleteCustomTypeArgs,\n\t): Promise<CustomTypesMachineManagerDeleteCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst { model, errors: readCustomTypeErrors } = await this.readCustomType({\n\t\t\tid: args.id,\n\t\t});\n\n\t\tif (model) {\n\t\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\t\"custom-type:delete\",\n\t\t\t\t{ model },\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\terrors: readCustomTypeErrors,\n\t\t\t};\n\t\t}\n\t}\n\n\tasync pushCustomType(\n\t\targs: SliceMachineManagerPushCustomTypeArgs,\n\t): Promise<void> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\t\tconst repositoryName = await this.project.getResolvedRepositoryName();\n\n\t\t// TODO: Handle errors\n\t\tconst { model } = await this.readCustomType({ id: args.id });\n\n\t\tif (model) {\n\t\t\t// TODO: Create a single shared client.\n\t\t\tconst client = prismicCustomTypesClient.createClient({\n\t\t\t\tendpoint: API_ENDPOINTS.PrismicModels,\n\t\t\t\trepositoryName,\n\t\t\t\ttoken: authenticationToken,\n\t\t\t\tfetch,\n\t\t\t\tfetchOptions: {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"User-Agent\": args.userAgent || SLICE_MACHINE_USER_AGENT,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\t// Check if Custom Type already exists on the repository.\n\t\t\t\tawait client.getCustomTypeByID(args.id);\n\n\t\t\t\t// If it exists on the repository, update it.\n\t\t\t\tawait client.updateCustomType(model);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof prismicCustomTypesClient.NotFoundError) {\n\t\t\t\t\t// If it doesn't exist on the repository, insert it.\n\t\t\t\t\tawait client.insertCustomType(model);\n\t\t\t\t} else if (error instanceof prismicCustomTypesClient.ForbiddenError) {\n\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\t\"You do not have access to push types to this Prismic repository.\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcause: error,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// TODO: Remove\n\tasync readCustomTypeMocksConfig(\n\t\targs: SliceMachineManagerReadCustomTypeMocksConfigArgs,\n\t): Promise<SliceMachineManagerReadCustomTypeMocksConfigArgsReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:asset:read\",\n\t\t\t{\n\t\t\t\tcustomTypeID: args.customTypeID,\n\t\t\t\tassetID: \"mocks.config.json\",\n\t\t\t},\n\t\t);\n\t\tconst data = hookResult.data[0]?.data;\n\n\t\t// TODO: Validate the returned data.\n\n\t\tif (data) {\n\t\t\treturn {\n\t\t\t\tmocksConfig: JSON.parse(data.toString()),\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tmocksConfig: undefined,\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t}\n\t}\n\n\t// TODO: Remove\n\tasync updateCustomTypeMocksConfig(\n\t\targs: SliceMachineManagerUpdateCustomTypeMocksConfigArgs,\n\t): Promise<SliceMachineManagerUpdateCustomTypeMocksConfigArgsReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:asset:update\",\n\t\t\t{\n\t\t\t\tcustomTypeID: args.customTypeID,\n\t\t\t\tasset: {\n\t\t\t\t\tid: \"mocks.config.json\",\n\t\t\t\t\tdata: Buffer.from(JSON.stringify(args.mocksConfig, null, \"\\t\")),\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync fetchRemoteCustomTypes(): Promise<CustomType[]> {\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\t\tconst repositoryName = await this.project.getResolvedRepositoryName();\n\n\t\tconst client = prismicCustomTypesClient.createClient({\n\t\t\tendpoint: API_ENDPOINTS.PrismicModels,\n\t\t\trepositoryName,\n\t\t\ttoken: authenticationToken,\n\t\t\tfetch,\n\t\t\tfetchOptions: {\n\t\t\t\theaders: {\n\t\t\t\t\t\"User-Agent\": SLICE_MACHINE_USER_AGENT,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\treturn await client.getAllCustomTypes();\n\t}\n\n\tasync inferSlice({\n\t\timageUrl,\n\t}: {\n\t\timageUrl: string;\n\t}): Promise<InferSliceResponse> {\n\t\tconst authToken = await this.user.getAuthenticationToken();\n\t\tconst headers = {\n\t\t\tAuthorization: `Bearer ${authToken}`,\n\t\t};\n\n\t\tconst repository = await this.project.getResolvedRepositoryName();\n\t\tconst searchParams = new URLSearchParams({\n\t\t\trepository,\n\t\t});\n\n\t\tconst url = new URL(\"./slices/infer\", API_ENDPOINTS.CustomTypeService);\n\t\turl.search = searchParams.toString();\n\n\t\tconst response = await fetch(url.toString(), {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: headers,\n\t\t\tbody: JSON.stringify({ imageUrl }),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Failed to infer slice: ${response.statusText}`);\n\t\t}\n\n\t\tconst json = await response.json();\n\n\t\treturn InferSliceResponse.parse(json);\n\t}\n}\n\ntype InferSliceResponse = z.infer<typeof InferSliceResponse>;\n\nconst InferSliceResponse = z.object({\n\tslice: z.custom().transform((value, ctx) => {\n\t\tconst result = SharedSlice.decode(value);\n\t\tif (result._tag === \"Right\") {\n\t\t\treturn result.right;\n\t\t}\n\t\tctx.addIssue({\n\t\t\tcode: z.ZodIssueCode.custom,\n\t\t\tmessage: `Invalid shared slice: ${JSON.stringify(value, null, 2)}`,\n\t\t});\n\n\t\treturn z.NEVER;\n\t}),\n\tlangSmithUrl: z.string().url().optional(),\n});\n\nfunction updateCRCustomType(\n\targs: { customType: CrCustomType } & CustomTypeFieldIdChangedMeta,\n): CrCustomType {\n\tconst [previousCustomTypeId, previousFieldId] = args.previousPath;\n\tconst [newCustomTypeId, newFieldId] = args.newPath;\n\n\tif (!previousCustomTypeId || !newCustomTypeId) {\n\t\tthrow new Error(\n\t\t\t\"Could not find a customtype id in previousPath and/or newPath, which should not be possible.\",\n\t\t);\n\t}\n\n\tif (!previousFieldId || !newFieldId) {\n\t\tthrow new Error(\n\t\t\t\"Could not find a field id in previousPath and/or newPath, which should not be possible.\",\n\t\t);\n\t}\n\n\tconst customType = shallowCloneIfObject(args.customType);\n\n\tif (typeof customType === \"string\" || !customType.fields) {\n\t\treturn customType;\n\t}\n\n\tconst matchedCustomTypeId = customType.id === previousCustomTypeId;\n\n\tconst newFields = customType.fields.map((fieldArg) => {\n\t\tconst nestedField = shallowCloneIfObject(fieldArg);\n\n\t\tif (typeof nestedField === \"string\") {\n\t\t\tif (\n\t\t\t\tmatchedCustomTypeId &&\n\t\t\t\tnestedField === previousFieldId &&\n\t\t\t\tnestedField !== newFieldId\n\t\t\t) {\n\t\t\t\t// We have reached a field id that matches the id that was renamed,\n\t\t\t\t// so we update it new one. The field is a string, so return the new\n\t\t\t\t// id.\n\t\t\t\treturn newFieldId;\n\t\t\t}\n\n\t\t\treturn nestedField;\n\t\t}\n\n\t\tif (\n\t\t\tmatchedCustomTypeId &&\n\t\t\tnestedField.id === previousFieldId &&\n\t\t\tnestedField.id !== newFieldId\n\t\t) {\n\t\t\t// We have reached a field id that matches the id that was renamed,\n\t\t\t// so we update it new one.\n\t\t\t// Since field is not a string, we don't exit, as we might have\n\t\t\t// something to update further down in customtypes.\n\t\t\tnestedField.id = newFieldId;\n\t\t}\n\n\t\treturn {\n\t\t\t...nestedField,\n\t\t\tcustomtypes: nestedField.customtypes.map((customTypeArg) => {\n\t\t\t\tconst customTypeField = shallowCloneIfObject(customTypeArg);\n\n\t\t\t\tif (typeof customTypeField === \"string\" || !customTypeField.fields) {\n\t\t\t\t\treturn customTypeField;\n\t\t\t\t}\n\n\t\t\t\tconst matchedNestedCustomTypeId =\n\t\t\t\t\tcustomTypeField.id === previousCustomTypeId;\n\n\t\t\t\treturn {\n\t\t\t\t\t...customTypeField,\n\t\t\t\t\tfields: customTypeField.fields.map((fieldArg) => {\n\t\t\t\t\t\tconst nestedCustomTypeField = shallowCloneIfObject(fieldArg);\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tmatchedNestedCustomTypeId &&\n\t\t\t\t\t\t\tnestedCustomTypeField === previousFieldId &&\n\t\t\t\t\t\t\tnestedCustomTypeField !== newFieldId\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// Matches the previous id, so we update it and return because\n\t\t\t\t\t\t\t// it's the last level.\n\t\t\t\t\t\t\treturn newFieldId;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn nestedCustomTypeField;\n\t\t\t\t\t}),\n\t\t\t\t};\n\t\t\t}),\n\t\t};\n\t});\n\n\treturn { ...customType, fields: newFields };\n}\n\n/**\n * Map over the custom types of a Content Relationship Link and update the API\n * IDs that were changed during the custom type update.\n */\nfunction updateCRCustomTypes(\n\targs: { customTypes: CrCustomTypes } & CustomTypeFieldIdChangedMeta,\n): CrCustomTypes {\n\tconst { customTypes, ...updateMeta } = args;\n\n\treturn customTypes.map((customType) => {\n\t\treturn updateCRCustomType({ customType, ...updateMeta });\n\t});\n}\n\n/**\n * Update the Content Relationship API IDs of a single field. The change is\n * determined by the `previousPath` and `newPath` properties.\n */\nfunction updateFieldContentRelationships<\n\tT extends UID | NestableWidget | Group | NestedGroup,\n>(args: { field: T } & CustomTypeFieldIdChangedMeta): T {\n\tconst { field, ...updateMeta } = args;\n\tif (\n\t\tfield.type !== \"Link\" ||\n\t\tfield.config?.select !== \"document\" ||\n\t\t!field.config?.customtypes\n\t) {\n\t\t// not a content relationship field\n\t\treturn field;\n\t}\n\n\tconst newCustomTypes = updateCRCustomTypes({\n\t\t...updateMeta,\n\t\tcustomTypes: field.config.customtypes,\n\t});\n\n\treturn {\n\t\t...field,\n\t\tconfig: { ...field.config, customtypes: newCustomTypes },\n\t};\n}\n\nexport function updateCustomTypeContentRelationships(\n\targs: {\n\t\tmodels: { model: CustomType }[];\n\t\tonUpdate: (model: CustomType) => void;\n\t} & CustomTypeFieldIdChangedMeta,\n): void {\n\tconst { models, previousPath, newPath, onUpdate } = args;\n\n\tfor (const customType of models) {\n\t\tconst updatedCustomTypeModel = traverseCustomType({\n\t\t\tcustomType: customType.model,\n\t\t\tonField: ({ field }) => {\n\t\t\t\treturn updateFieldContentRelationships({\n\t\t\t\t\tfield,\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\n\t\tonUpdate(updatedCustomTypeModel);\n\t}\n}\n\nexport function updateSharedSliceContentRelationships(\n\targs: {\n\t\tmodels: { model: SharedSlice }[];\n\t\tonUpdate: (model: SharedSlice) => void;\n\t} & CustomTypeFieldIdChangedMeta,\n): void {\n\tconst { models, previousPath, newPath, onUpdate } = args;\n\n\tfor (const slice of models) {\n\t\tconst updatedSliceModel = traverseSharedSlice({\n\t\t\tpath: [\".\"],\n\t\t\tslice: slice.model,\n\t\t\tonField: ({ field }) => {\n\t\t\t\treturn updateFieldContentRelationships({\n\t\t\t\t\tfield,\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\n\t\tonUpdate(updatedSliceModel);\n\t}\n}\n\nfunction shallowCloneIfObject<T>(value: T): T {\n\tif (typeof value === \"object\") {\n\t\treturn { ...value };\n\t}\n\n\treturn value;\n}\n\nfunction pushIfDefined<T>(array: T[], value: T | undefined) {\n\tif (value) {\n\t\tarray.push(value);\n\t}\n}\n"],"names":["BaseManager","assertPluginsInitialized","errors","decodeHookResult","t","CustomType","model","prismicCustomTypesClient","API_ENDPOINTS","fetch","SLICE_MACHINE_USER_AGENT","UnauthorizedError","z","SharedSlice","fieldArg","traverseCustomType","traverseSharedSlice"],"mappings":"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"}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { CustomType } from "@prismicio/types-internal/lib/customtypes";
|
1
|
+
import { CustomType, SharedSlice } from "@prismicio/types-internal/lib/customtypes";
|
2
2
|
import { CallHookReturnType, CustomTypeCreateHook, CustomTypeCreateHookData, CustomTypeReadHookData, CustomTypeRenameHook, CustomTypeRenameHookData, CustomTypeUpdateHook, CustomTypeUpdateHookData, HookError } from "@slicemachine/plugin-kit";
|
3
3
|
import { z } from "zod";
|
4
4
|
import { DecodeError } from "../../lib/DecodeError";
|
@@ -46,22 +46,12 @@ type CustomTypesMachineManagerDeleteCustomTypeArgs = {
|
|
46
46
|
type CustomTypesMachineManagerDeleteCustomTypeReturnType = {
|
47
47
|
errors: (DecodeError | HookError)[];
|
48
48
|
};
|
49
|
+
type CustomTypeFieldIdChangedMeta = NonNullable<NonNullable<CustomTypeUpdateHookData["updateMeta"]>["fieldIdChanged"]>;
|
49
50
|
export declare class CustomTypesManager extends BaseManager {
|
50
51
|
readCustomTypeLibrary(): Promise<SliceMachineManagerReadCustomTypeLibraryReturnType>;
|
51
52
|
readAllCustomTypes(args?: CustomTypesManagerReadAllCustomTypesArgs): Promise<SliceMachineManagerReadAllCustomTypeReturnType>;
|
52
53
|
createCustomType(args: CustomTypeCreateHookData): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeCreateHook>>>;
|
53
54
|
readCustomType(args: CustomTypeReadHookData): Promise<SliceMachineManagerReadCustomTypeReturnType>;
|
54
|
-
private updateCRCustomType;
|
55
|
-
/**
|
56
|
-
* Map over the custom types of a Content Relationship Link and update the API
|
57
|
-
* IDs that were changed during the custom type update.
|
58
|
-
*/
|
59
|
-
private updateCRCustomTypes;
|
60
|
-
/**
|
61
|
-
* Update the Content Relationship API IDs of a single field. The change is
|
62
|
-
* determined by the `previousPath` and `newPath` properties.
|
63
|
-
*/
|
64
|
-
private updateFieldContentRelationships;
|
65
55
|
/**
|
66
56
|
* Update the Content Relationship API IDs for all existing custom types and
|
67
57
|
* slices. The change is determined by properties inside the `updateMeta`
|
@@ -1600,4 +1590,16 @@ declare const InferSliceResponse: z.ZodObject<{
|
|
1600
1590
|
slice?: unknown;
|
1601
1591
|
langSmithUrl?: string | undefined;
|
1602
1592
|
}>;
|
1593
|
+
export declare function updateCustomTypeContentRelationships(args: {
|
1594
|
+
models: {
|
1595
|
+
model: CustomType;
|
1596
|
+
}[];
|
1597
|
+
onUpdate: (model: CustomType) => void;
|
1598
|
+
} & CustomTypeFieldIdChangedMeta): void;
|
1599
|
+
export declare function updateSharedSliceContentRelationships(args: {
|
1600
|
+
models: {
|
1601
|
+
model: SharedSlice;
|
1602
|
+
}[];
|
1603
|
+
onUpdate: (model: SharedSlice) => void;
|
1604
|
+
} & CustomTypeFieldIdChangedMeta): void;
|
1603
1605
|
export {};
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import * as t from "io-ts";
|
2
2
|
import * as prismicCustomTypesClient from "@prismicio/custom-types-client";
|
3
|
-
import { CustomType, traverseCustomType, traverseSharedSlice
|
3
|
+
import { CustomType, SharedSlice, traverseCustomType, traverseSharedSlice } from "@prismicio/types-internal/lib/customtypes";
|
4
4
|
import z from './../../_node_modules/zod/lib/index.js';
|
5
5
|
import { assertPluginsInitialized } from "../../lib/assertPluginsInitialized.js";
|
6
6
|
import { decodeHookResult } from "../../lib/decodeHookResult.js";
|
@@ -60,83 +60,6 @@ class CustomTypesManager extends BaseManager {
|
|
60
60
|
errors
|
61
61
|
};
|
62
62
|
}
|
63
|
-
updateCRCustomType(args) {
|
64
|
-
const [previousCustomTypeId, previousFieldId] = args.previousPath;
|
65
|
-
const [newCustomTypeId, newFieldId] = args.newPath;
|
66
|
-
if (!previousCustomTypeId || !newCustomTypeId) {
|
67
|
-
throw new Error("Could not find a customtype id in previousPath and/or newPath, which should not be possible.");
|
68
|
-
}
|
69
|
-
if (!previousFieldId || !newFieldId) {
|
70
|
-
throw new Error("Could not find a field id in previousPath and/or newPath, which should not be possible.");
|
71
|
-
}
|
72
|
-
const customType = shallowCloneIfObject(args.customType);
|
73
|
-
if (typeof customType === "string" || !customType.fields) {
|
74
|
-
return customType;
|
75
|
-
}
|
76
|
-
const matchedCustomTypeId = customType.id === previousCustomTypeId;
|
77
|
-
const newFields = customType.fields.map((fieldArg) => {
|
78
|
-
const nestedField = shallowCloneIfObject(fieldArg);
|
79
|
-
if (typeof nestedField === "string") {
|
80
|
-
if (matchedCustomTypeId && nestedField === previousFieldId && nestedField !== newFieldId) {
|
81
|
-
return newFieldId;
|
82
|
-
}
|
83
|
-
return nestedField;
|
84
|
-
}
|
85
|
-
if (matchedCustomTypeId && nestedField.id === previousFieldId && nestedField.id !== newFieldId) {
|
86
|
-
nestedField.id = newFieldId;
|
87
|
-
}
|
88
|
-
return {
|
89
|
-
...nestedField,
|
90
|
-
customtypes: nestedField.customtypes.map((customTypeArg) => {
|
91
|
-
const customTypeField = shallowCloneIfObject(customTypeArg);
|
92
|
-
if (typeof customTypeField === "string" || !customTypeField.fields) {
|
93
|
-
return customTypeField;
|
94
|
-
}
|
95
|
-
const matchedNestedCustomTypeId = customTypeField.id === previousCustomTypeId;
|
96
|
-
return {
|
97
|
-
...customTypeField,
|
98
|
-
fields: customTypeField.fields.map((fieldArg2) => {
|
99
|
-
const nestedCustomTypeField = shallowCloneIfObject(fieldArg2);
|
100
|
-
if (matchedNestedCustomTypeId && nestedCustomTypeField === previousFieldId && nestedCustomTypeField !== newFieldId) {
|
101
|
-
return newFieldId;
|
102
|
-
}
|
103
|
-
return nestedCustomTypeField;
|
104
|
-
})
|
105
|
-
};
|
106
|
-
})
|
107
|
-
};
|
108
|
-
});
|
109
|
-
return { ...customType, fields: newFields };
|
110
|
-
}
|
111
|
-
/**
|
112
|
-
* Map over the custom types of a Content Relationship Link and update the API
|
113
|
-
* IDs that were changed during the custom type update.
|
114
|
-
*/
|
115
|
-
updateCRCustomTypes(args) {
|
116
|
-
const { customTypes, ...updateMeta } = args;
|
117
|
-
return customTypes.map((customType) => {
|
118
|
-
return this.updateCRCustomType({ customType, ...updateMeta });
|
119
|
-
});
|
120
|
-
}
|
121
|
-
/**
|
122
|
-
* Update the Content Relationship API IDs of a single field. The change is
|
123
|
-
* determined by the `previousPath` and `newPath` properties.
|
124
|
-
*/
|
125
|
-
updateFieldContentRelationships(args) {
|
126
|
-
var _a, _b;
|
127
|
-
const { field, ...updateMeta } = args;
|
128
|
-
if (field.type !== "Link" || ((_a = field.config) == null ? void 0 : _a.select) !== "document" || !((_b = field.config) == null ? void 0 : _b.customtypes)) {
|
129
|
-
return field;
|
130
|
-
}
|
131
|
-
const newCustomTypes = this.updateCRCustomTypes({
|
132
|
-
...updateMeta,
|
133
|
-
customTypes: field.config.customtypes
|
134
|
-
});
|
135
|
-
return {
|
136
|
-
...field,
|
137
|
-
config: { ...field.config, customtypes: newCustomTypes }
|
138
|
-
};
|
139
|
-
}
|
140
63
|
/**
|
141
64
|
* Update the Content Relationship API IDs for all existing custom types and
|
142
65
|
* slices. The change is determined by properties inside the `updateMeta`
|
@@ -152,43 +75,34 @@ class CustomTypesManager extends BaseManager {
|
|
152
75
|
newPath = [model.id, ...newPath];
|
153
76
|
const crUpdates = [];
|
154
77
|
const customTypes = await this.readAllCustomTypes();
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
crUpdates.push(this.sliceMachinePluginRunner.callHook("custom-type:update", {
|
167
|
-
model: updatedCustomTypeModel
|
168
|
-
}));
|
169
|
-
}
|
78
|
+
updateCustomTypeContentRelationships({
|
79
|
+
models: customTypes.models,
|
80
|
+
onUpdate: (model2) => {
|
81
|
+
var _a;
|
82
|
+
pushIfDefined(crUpdates, (_a = this.sliceMachinePluginRunner) == null ? void 0 : _a.callHook("custom-type:update", {
|
83
|
+
model: model2
|
84
|
+
}));
|
85
|
+
},
|
86
|
+
previousPath,
|
87
|
+
newPath
|
88
|
+
});
|
170
89
|
const { libraries } = await this.slices.readAllSliceLibraries();
|
171
90
|
for (const library of libraries) {
|
172
91
|
const slices = await this.slices.readAllSlicesForLibrary({
|
173
92
|
libraryID: library.libraryID
|
174
93
|
});
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
crUpdates.push(this.sliceMachinePluginRunner.callHook("slice:update", {
|
188
|
-
libraryID: library.libraryID,
|
189
|
-
model: updatedSliceModel
|
190
|
-
}));
|
191
|
-
}
|
94
|
+
updateSharedSliceContentRelationships({
|
95
|
+
models: slices.models,
|
96
|
+
onUpdate: (model2) => {
|
97
|
+
var _a;
|
98
|
+
pushIfDefined(crUpdates, (_a = this.sliceMachinePluginRunner) == null ? void 0 : _a.callHook("slice:update", {
|
99
|
+
libraryID: library.libraryID,
|
100
|
+
model: model2
|
101
|
+
}));
|
102
|
+
},
|
103
|
+
previousPath,
|
104
|
+
newPath
|
105
|
+
});
|
192
106
|
}
|
193
107
|
const crUpdatesResult = await Promise.all(crUpdates);
|
194
108
|
if (crUpdatesResult.some((result) => result.errors.length > 0)) {
|
@@ -353,13 +267,122 @@ const InferSliceResponse = z.object({
|
|
353
267
|
}),
|
354
268
|
langSmithUrl: z.string().url().optional()
|
355
269
|
});
|
270
|
+
function updateCRCustomType(args) {
|
271
|
+
const [previousCustomTypeId, previousFieldId] = args.previousPath;
|
272
|
+
const [newCustomTypeId, newFieldId] = args.newPath;
|
273
|
+
if (!previousCustomTypeId || !newCustomTypeId) {
|
274
|
+
throw new Error("Could not find a customtype id in previousPath and/or newPath, which should not be possible.");
|
275
|
+
}
|
276
|
+
if (!previousFieldId || !newFieldId) {
|
277
|
+
throw new Error("Could not find a field id in previousPath and/or newPath, which should not be possible.");
|
278
|
+
}
|
279
|
+
const customType = shallowCloneIfObject(args.customType);
|
280
|
+
if (typeof customType === "string" || !customType.fields) {
|
281
|
+
return customType;
|
282
|
+
}
|
283
|
+
const matchedCustomTypeId = customType.id === previousCustomTypeId;
|
284
|
+
const newFields = customType.fields.map((fieldArg) => {
|
285
|
+
const nestedField = shallowCloneIfObject(fieldArg);
|
286
|
+
if (typeof nestedField === "string") {
|
287
|
+
if (matchedCustomTypeId && nestedField === previousFieldId && nestedField !== newFieldId) {
|
288
|
+
return newFieldId;
|
289
|
+
}
|
290
|
+
return nestedField;
|
291
|
+
}
|
292
|
+
if (matchedCustomTypeId && nestedField.id === previousFieldId && nestedField.id !== newFieldId) {
|
293
|
+
nestedField.id = newFieldId;
|
294
|
+
}
|
295
|
+
return {
|
296
|
+
...nestedField,
|
297
|
+
customtypes: nestedField.customtypes.map((customTypeArg) => {
|
298
|
+
const customTypeField = shallowCloneIfObject(customTypeArg);
|
299
|
+
if (typeof customTypeField === "string" || !customTypeField.fields) {
|
300
|
+
return customTypeField;
|
301
|
+
}
|
302
|
+
const matchedNestedCustomTypeId = customTypeField.id === previousCustomTypeId;
|
303
|
+
return {
|
304
|
+
...customTypeField,
|
305
|
+
fields: customTypeField.fields.map((fieldArg2) => {
|
306
|
+
const nestedCustomTypeField = shallowCloneIfObject(fieldArg2);
|
307
|
+
if (matchedNestedCustomTypeId && nestedCustomTypeField === previousFieldId && nestedCustomTypeField !== newFieldId) {
|
308
|
+
return newFieldId;
|
309
|
+
}
|
310
|
+
return nestedCustomTypeField;
|
311
|
+
})
|
312
|
+
};
|
313
|
+
})
|
314
|
+
};
|
315
|
+
});
|
316
|
+
return { ...customType, fields: newFields };
|
317
|
+
}
|
318
|
+
function updateCRCustomTypes(args) {
|
319
|
+
const { customTypes, ...updateMeta } = args;
|
320
|
+
return customTypes.map((customType) => {
|
321
|
+
return updateCRCustomType({ customType, ...updateMeta });
|
322
|
+
});
|
323
|
+
}
|
324
|
+
function updateFieldContentRelationships(args) {
|
325
|
+
var _a, _b;
|
326
|
+
const { field, ...updateMeta } = args;
|
327
|
+
if (field.type !== "Link" || ((_a = field.config) == null ? void 0 : _a.select) !== "document" || !((_b = field.config) == null ? void 0 : _b.customtypes)) {
|
328
|
+
return field;
|
329
|
+
}
|
330
|
+
const newCustomTypes = updateCRCustomTypes({
|
331
|
+
...updateMeta,
|
332
|
+
customTypes: field.config.customtypes
|
333
|
+
});
|
334
|
+
return {
|
335
|
+
...field,
|
336
|
+
config: { ...field.config, customtypes: newCustomTypes }
|
337
|
+
};
|
338
|
+
}
|
339
|
+
function updateCustomTypeContentRelationships(args) {
|
340
|
+
const { models, previousPath, newPath, onUpdate } = args;
|
341
|
+
for (const customType of models) {
|
342
|
+
const updatedCustomTypeModel = traverseCustomType({
|
343
|
+
customType: customType.model,
|
344
|
+
onField: ({ field }) => {
|
345
|
+
return updateFieldContentRelationships({
|
346
|
+
field,
|
347
|
+
previousPath,
|
348
|
+
newPath
|
349
|
+
});
|
350
|
+
}
|
351
|
+
});
|
352
|
+
onUpdate(updatedCustomTypeModel);
|
353
|
+
}
|
354
|
+
}
|
355
|
+
function updateSharedSliceContentRelationships(args) {
|
356
|
+
const { models, previousPath, newPath, onUpdate } = args;
|
357
|
+
for (const slice of models) {
|
358
|
+
const updatedSliceModel = traverseSharedSlice({
|
359
|
+
path: ["."],
|
360
|
+
slice: slice.model,
|
361
|
+
onField: ({ field }) => {
|
362
|
+
return updateFieldContentRelationships({
|
363
|
+
field,
|
364
|
+
previousPath,
|
365
|
+
newPath
|
366
|
+
});
|
367
|
+
}
|
368
|
+
});
|
369
|
+
onUpdate(updatedSliceModel);
|
370
|
+
}
|
371
|
+
}
|
356
372
|
function shallowCloneIfObject(value) {
|
357
373
|
if (typeof value === "object") {
|
358
374
|
return { ...value };
|
359
375
|
}
|
360
376
|
return value;
|
361
377
|
}
|
378
|
+
function pushIfDefined(array, value) {
|
379
|
+
if (value) {
|
380
|
+
array.push(value);
|
381
|
+
}
|
382
|
+
}
|
362
383
|
export {
|
363
|
-
CustomTypesManager
|
384
|
+
CustomTypesManager,
|
385
|
+
updateCustomTypeContentRelationships,
|
386
|
+
updateSharedSliceContentRelationships
|
364
387
|
};
|
365
388
|
//# sourceMappingURL=CustomTypesManager.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"CustomTypesManager.js","sources":["../../../../src/managers/customTypes/CustomTypesManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport * as prismicCustomTypesClient from \"@prismicio/custom-types-client\";\nimport {\n\tCustomType,\n\tGroup,\n\tNestableWidget,\n\tNestedGroup,\n\tSharedSlice,\n\tUID,\n\ttraverseCustomType,\n\ttraverseSharedSlice,\n} from \"@prismicio/types-internal/lib/customtypes\";\nimport {\n\tCallHookReturnType,\n\tCustomTypeCreateHook,\n\tCustomTypeCreateHookData,\n\tCustomTypeReadHookData,\n\tCustomTypeRenameHook,\n\tCustomTypeRenameHookData,\n\tCustomTypeUpdateHook,\n\tCustomTypeUpdateHookData,\n\tHookError,\n} from \"@slicemachine/plugin-kit\";\nimport { z } from \"zod\";\n\nimport { DecodeError } from \"../../lib/DecodeError\";\nimport { assertPluginsInitialized } from \"../../lib/assertPluginsInitialized\";\nimport { decodeHookResult } from \"../../lib/decodeHookResult\";\nimport fetch from \"../../lib/fetch\";\n\nimport { OnlyHookErrors } from \"../../types\";\nimport { API_ENDPOINTS } from \"../../constants/API_ENDPOINTS\";\nimport { SLICE_MACHINE_USER_AGENT } from \"../../constants/SLICE_MACHINE_USER_AGENT\";\nimport { UnauthorizedError } from \"../../errors\";\n\nimport { BaseManager } from \"../BaseManager\";\nimport { CustomTypeFormat } from \"./types\";\n\ntype SliceMachineManagerReadCustomTypeLibraryReturnType = {\n\tids: string[];\n\terrors: (DecodeError | HookError)[];\n};\n\ntype CustomTypesManagerReadAllCustomTypesArgs = {\n\tformat: CustomTypeFormat;\n};\n\ntype SliceMachineManagerReadAllCustomTypeReturnType = {\n\tmodels: { model: CustomType }[];\n\terrors: (DecodeError | HookError)[];\n};\n\ntype SliceMachineManagerReadCustomTypeReturnType = {\n\tmodel: CustomType | undefined;\n\terrors: (DecodeError | HookError)[];\n};\n\ntype SliceMachineManagerPushCustomTypeArgs = {\n\tid: string;\n\tuserAgent?: string;\n};\n\ntype SliceMachineManagerReadCustomTypeMocksConfigArgs = {\n\tcustomTypeID: string;\n};\n\ntype SliceMachineManagerReadCustomTypeMocksConfigArgsReturnType = {\n\t// TODO\n\tmocksConfig?: Record<string, unknown>;\n\terrors: HookError[];\n};\n\ntype SliceMachineManagerUpdateCustomTypeMocksConfigArgs = {\n\tcustomTypeID: string;\n\t// TODO\n\tmocksConfig: Record<string, unknown>;\n};\n\ntype SliceMachineManagerUpdateCustomTypeMocksConfigArgsReturnType = {\n\terrors: HookError[];\n};\n\ntype CustomTypesMachineManagerDeleteCustomTypeArgs = {\n\tid: string;\n};\n\ntype CustomTypesMachineManagerDeleteCustomTypeReturnType = {\n\terrors: (DecodeError | HookError)[];\n};\n\ntype CustomTypeFieldIdChangedMeta = NonNullable<\n\tNonNullable<CustomTypeUpdateHookData[\"updateMeta\"]>[\"fieldIdChanged\"]\n>;\n\ntype CrCustomTypes = readonly CrCustomType[];\ntype CrCustomType =\n\t| string\n\t| { id: string; fields?: readonly CrCustomTypeNestedCr[] };\ntype CrCustomTypeNestedCr =\n\t| string\n\t| { id: string; customtypes: readonly CrCustomTypeFieldLeaf[] };\ntype CrCustomTypeFieldLeaf =\n\t| string\n\t| { id: string; fields?: readonly string[] };\n\nexport class CustomTypesManager extends BaseManager {\n\tasync readCustomTypeLibrary(): Promise<SliceMachineManagerReadCustomTypeLibraryReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type-library:read\",\n\t\t\tundefined,\n\t\t);\n\t\tconst { data, errors } = decodeHookResult(\n\t\t\tt.type({\n\t\t\t\tids: t.array(t.string),\n\t\t\t}),\n\t\t\thookResult,\n\t\t);\n\n\t\treturn {\n\t\t\tids: data[0]?.ids || [],\n\t\t\terrors,\n\t\t};\n\t}\n\n\tasync readAllCustomTypes(\n\t\targs?: CustomTypesManagerReadAllCustomTypesArgs,\n\t): Promise<SliceMachineManagerReadAllCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst res: SliceMachineManagerReadAllCustomTypeReturnType = {\n\t\t\tmodels: [],\n\t\t\terrors: [],\n\t\t};\n\n\t\tconst { ids, errors } = await this.readCustomTypeLibrary();\n\t\tres.errors = [...res.errors, ...errors];\n\n\t\tif (ids) {\n\t\t\tfor (const id of ids) {\n\t\t\t\tconst { model, errors } = await this.readCustomType({ id });\n\t\t\t\tres.errors = [...res.errors, ...errors];\n\n\t\t\t\tif (model && (!args || args.format === model.format)) {\n\t\t\t\t\tres.models.push({ model });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn res;\n\t}\n\n\tasync createCustomType(\n\t\targs: CustomTypeCreateHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeCreateHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:create\",\n\t\t\targs,\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync readCustomType(\n\t\targs: CustomTypeReadHookData,\n\t): Promise<SliceMachineManagerReadCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:read\",\n\t\t\targs,\n\t\t);\n\t\tconst { data, errors } = decodeHookResult(\n\t\t\tt.type({\n\t\t\t\tmodel: CustomType,\n\t\t\t}),\n\t\t\thookResult,\n\t\t);\n\n\t\treturn {\n\t\t\tmodel: data[0]?.model,\n\t\t\terrors,\n\t\t};\n\t}\n\n\tprivate updateCRCustomType(\n\t\targs: { customType: CrCustomType } & CustomTypeFieldIdChangedMeta,\n\t): CrCustomType {\n\t\tconst [previousCustomTypeId, previousFieldId] = args.previousPath;\n\t\tconst [newCustomTypeId, newFieldId] = args.newPath;\n\n\t\tif (!previousCustomTypeId || !newCustomTypeId) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Could not find a customtype id in previousPath and/or newPath, which should not be possible.\",\n\t\t\t);\n\t\t}\n\n\t\tif (!previousFieldId || !newFieldId) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Could not find a field id in previousPath and/or newPath, which should not be possible.\",\n\t\t\t);\n\t\t}\n\n\t\tconst customType = shallowCloneIfObject(args.customType);\n\n\t\tif (typeof customType === \"string\" || !customType.fields) {\n\t\t\treturn customType;\n\t\t}\n\n\t\tconst matchedCustomTypeId = customType.id === previousCustomTypeId;\n\n\t\tconst newFields = customType.fields.map((fieldArg) => {\n\t\t\tconst nestedField = shallowCloneIfObject(fieldArg);\n\n\t\t\tif (typeof nestedField === \"string\") {\n\t\t\t\tif (\n\t\t\t\t\tmatchedCustomTypeId &&\n\t\t\t\t\tnestedField === previousFieldId &&\n\t\t\t\t\tnestedField !== newFieldId\n\t\t\t\t) {\n\t\t\t\t\t// We have reached a field id that matches the id that was renamed,\n\t\t\t\t\t// so we update it new one. The field is a string, so return the new\n\t\t\t\t\t// id.\n\t\t\t\t\treturn newFieldId;\n\t\t\t\t}\n\n\t\t\t\treturn nestedField;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tmatchedCustomTypeId &&\n\t\t\t\tnestedField.id === previousFieldId &&\n\t\t\t\tnestedField.id !== newFieldId\n\t\t\t) {\n\t\t\t\t// We have reached a field id that matches the id that was renamed,\n\t\t\t\t// so we update it new one.\n\t\t\t\t// Since field is not a string, we don't exit, as we might have\n\t\t\t\t// something to update further down in customtypes.\n\t\t\t\tnestedField.id = newFieldId;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...nestedField,\n\t\t\t\tcustomtypes: nestedField.customtypes.map((customTypeArg) => {\n\t\t\t\t\tconst customTypeField = shallowCloneIfObject(customTypeArg);\n\n\t\t\t\t\tif (typeof customTypeField === \"string\" || !customTypeField.fields) {\n\t\t\t\t\t\treturn customTypeField;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst matchedNestedCustomTypeId =\n\t\t\t\t\t\tcustomTypeField.id === previousCustomTypeId;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...customTypeField,\n\t\t\t\t\t\tfields: customTypeField.fields.map((fieldArg) => {\n\t\t\t\t\t\t\tconst nestedCustomTypeField = shallowCloneIfObject(fieldArg);\n\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tmatchedNestedCustomTypeId &&\n\t\t\t\t\t\t\t\tnestedCustomTypeField === previousFieldId &&\n\t\t\t\t\t\t\t\tnestedCustomTypeField !== newFieldId\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t// Matches the previous id, so we update it and return because\n\t\t\t\t\t\t\t\t// it's the last level.\n\t\t\t\t\t\t\t\treturn newFieldId;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn nestedCustomTypeField;\n\t\t\t\t\t\t}),\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t};\n\t\t});\n\n\t\treturn { ...customType, fields: newFields };\n\t}\n\n\t/**\n\t * Map over the custom types of a Content Relationship Link and update the API\n\t * IDs that were changed during the custom type update.\n\t */\n\tprivate updateCRCustomTypes(\n\t\targs: { customTypes: CrCustomTypes } & CustomTypeFieldIdChangedMeta,\n\t): CrCustomTypes {\n\t\tconst { customTypes, ...updateMeta } = args;\n\n\t\treturn customTypes.map((customType) => {\n\t\t\treturn this.updateCRCustomType({ customType, ...updateMeta });\n\t\t});\n\t}\n\n\t/**\n\t * Update the Content Relationship API IDs of a single field. The change is\n\t * determined by the `previousPath` and `newPath` properties.\n\t */\n\tprivate updateFieldContentRelationships<\n\t\tT extends UID | NestableWidget | Group | NestedGroup,\n\t>(args: { field: T } & CustomTypeFieldIdChangedMeta): T {\n\t\tconst { field, ...updateMeta } = args;\n\t\tif (\n\t\t\tfield.type !== \"Link\" ||\n\t\t\tfield.config?.select !== \"document\" ||\n\t\t\t!field.config?.customtypes\n\t\t) {\n\t\t\t// not a content relationship field\n\t\t\treturn field;\n\t\t}\n\n\t\tconst newCustomTypes = this.updateCRCustomTypes({\n\t\t\t...updateMeta,\n\t\t\tcustomTypes: field.config.customtypes,\n\t\t});\n\n\t\treturn {\n\t\t\t...field,\n\t\t\tconfig: { ...field.config, customtypes: newCustomTypes },\n\t\t};\n\t}\n\n\t/**\n\t * Update the Content Relationship API IDs for all existing custom types and\n\t * slices. The change is determined by properties inside the `updateMeta`\n\t * property.\n\t */\n\tprivate async updateContentRelationships(\n\t\targs: CustomTypeUpdateHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeUpdateHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst { model, updateMeta } = args;\n\n\t\tif (updateMeta?.fieldIdChanged) {\n\t\t\tlet { previousPath, newPath } = updateMeta.fieldIdChanged;\n\n\t\t\tif (previousPath.join(\".\") !== newPath.join(\".\")) {\n\t\t\t\tpreviousPath = [model.id, ...previousPath];\n\t\t\t\tnewPath = [model.id, ...newPath];\n\n\t\t\t\tconst crUpdates: Promise<{ errors: HookError[] }>[] = [];\n\n\t\t\t\t// Find existing content relationships that link to the renamed field id in\n\t\t\t\t// any custom type and update them to use the new one.\n\t\t\t\tconst customTypes = await this.readAllCustomTypes();\n\n\t\t\t\tfor (const customType of customTypes.models) {\n\t\t\t\t\tconst updatedCustomTypeModel = traverseCustomType({\n\t\t\t\t\t\tcustomType: customType.model,\n\t\t\t\t\t\tonField: ({ field }) => {\n\t\t\t\t\t\t\treturn this.updateFieldContentRelationships({\n\t\t\t\t\t\t\t\tfield,\n\t\t\t\t\t\t\t\tpreviousPath,\n\t\t\t\t\t\t\t\tnewPath,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\tcrUpdates.push(\n\t\t\t\t\t\tthis.sliceMachinePluginRunner.callHook(\"custom-type:update\", {\n\t\t\t\t\t\t\tmodel: updatedCustomTypeModel,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Find existing slice with content relationships that link to the renamed\n\t\t\t\t// field id in all libraries and update them to use the new one.\n\t\t\t\tconst { libraries } = await this.slices.readAllSliceLibraries();\n\n\t\t\t\tfor (const library of libraries) {\n\t\t\t\t\tconst slices = await this.slices.readAllSlicesForLibrary({\n\t\t\t\t\t\tlibraryID: library.libraryID,\n\t\t\t\t\t});\n\n\t\t\t\t\tfor (const slice of slices.models) {\n\t\t\t\t\t\tconst updatedSliceModel = traverseSharedSlice({\n\t\t\t\t\t\t\tpath: [\".\"],\n\t\t\t\t\t\t\tslice: slice.model,\n\t\t\t\t\t\t\tonField: ({ field }) => {\n\t\t\t\t\t\t\t\treturn this.updateFieldContentRelationships({\n\t\t\t\t\t\t\t\t\tfield,\n\t\t\t\t\t\t\t\t\tpreviousPath,\n\t\t\t\t\t\t\t\t\tnewPath,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tcrUpdates.push(\n\t\t\t\t\t\t\tthis.sliceMachinePluginRunner.callHook(\"slice:update\", {\n\t\t\t\t\t\t\t\tlibraryID: library.libraryID,\n\t\t\t\t\t\t\t\tmodel: updatedSliceModel,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Process all the Content Relationship updates at once.\n\t\t\t\tconst crUpdatesResult = await Promise.all(crUpdates);\n\n\t\t\t\tif (crUpdatesResult.some((result) => result.errors.length > 0)) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\terrors: crUpdatesResult.flatMap((result) => result.errors),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn { errors: [] };\n\t}\n\n\tasync updateCustomType(\n\t\targs: CustomTypeUpdateHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeUpdateHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:update\",\n\t\t\targs,\n\t\t);\n\n\t\tif (args.updateMeta?.fieldIdChanged) {\n\t\t\tawait this.updateContentRelationships(args);\n\t\t}\n\n\t\treturn { errors: hookResult.errors };\n\t}\n\n\tasync renameCustomType(\n\t\targs: CustomTypeRenameHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeRenameHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:rename\",\n\t\t\targs,\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync deleteCustomType(\n\t\targs: CustomTypesMachineManagerDeleteCustomTypeArgs,\n\t): Promise<CustomTypesMachineManagerDeleteCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst { model, errors: readCustomTypeErrors } = await this.readCustomType({\n\t\t\tid: args.id,\n\t\t});\n\n\t\tif (model) {\n\t\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\t\"custom-type:delete\",\n\t\t\t\t{ model },\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\terrors: readCustomTypeErrors,\n\t\t\t};\n\t\t}\n\t}\n\n\tasync pushCustomType(\n\t\targs: SliceMachineManagerPushCustomTypeArgs,\n\t): Promise<void> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\t\tconst repositoryName = await this.project.getResolvedRepositoryName();\n\n\t\t// TODO: Handle errors\n\t\tconst { model } = await this.readCustomType({ id: args.id });\n\n\t\tif (model) {\n\t\t\t// TODO: Create a single shared client.\n\t\t\tconst client = prismicCustomTypesClient.createClient({\n\t\t\t\tendpoint: API_ENDPOINTS.PrismicModels,\n\t\t\t\trepositoryName,\n\t\t\t\ttoken: authenticationToken,\n\t\t\t\tfetch,\n\t\t\t\tfetchOptions: {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"User-Agent\": args.userAgent || SLICE_MACHINE_USER_AGENT,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\t// Check if Custom Type already exists on the repository.\n\t\t\t\tawait client.getCustomTypeByID(args.id);\n\n\t\t\t\t// If it exists on the repository, update it.\n\t\t\t\tawait client.updateCustomType(model);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof prismicCustomTypesClient.NotFoundError) {\n\t\t\t\t\t// If it doesn't exist on the repository, insert it.\n\t\t\t\t\tawait client.insertCustomType(model);\n\t\t\t\t} else if (error instanceof prismicCustomTypesClient.ForbiddenError) {\n\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\t\"You do not have access to push types to this Prismic repository.\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcause: error,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// TODO: Remove\n\tasync readCustomTypeMocksConfig(\n\t\targs: SliceMachineManagerReadCustomTypeMocksConfigArgs,\n\t): Promise<SliceMachineManagerReadCustomTypeMocksConfigArgsReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:asset:read\",\n\t\t\t{\n\t\t\t\tcustomTypeID: args.customTypeID,\n\t\t\t\tassetID: \"mocks.config.json\",\n\t\t\t},\n\t\t);\n\t\tconst data = hookResult.data[0]?.data;\n\n\t\t// TODO: Validate the returned data.\n\n\t\tif (data) {\n\t\t\treturn {\n\t\t\t\tmocksConfig: JSON.parse(data.toString()),\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tmocksConfig: undefined,\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t}\n\t}\n\n\t// TODO: Remove\n\tasync updateCustomTypeMocksConfig(\n\t\targs: SliceMachineManagerUpdateCustomTypeMocksConfigArgs,\n\t): Promise<SliceMachineManagerUpdateCustomTypeMocksConfigArgsReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:asset:update\",\n\t\t\t{\n\t\t\t\tcustomTypeID: args.customTypeID,\n\t\t\t\tasset: {\n\t\t\t\t\tid: \"mocks.config.json\",\n\t\t\t\t\tdata: Buffer.from(JSON.stringify(args.mocksConfig, null, \"\\t\")),\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync fetchRemoteCustomTypes(): Promise<CustomType[]> {\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\t\tconst repositoryName = await this.project.getResolvedRepositoryName();\n\n\t\tconst client = prismicCustomTypesClient.createClient({\n\t\t\tendpoint: API_ENDPOINTS.PrismicModels,\n\t\t\trepositoryName,\n\t\t\ttoken: authenticationToken,\n\t\t\tfetch,\n\t\t\tfetchOptions: {\n\t\t\t\theaders: {\n\t\t\t\t\t\"User-Agent\": SLICE_MACHINE_USER_AGENT,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\treturn await client.getAllCustomTypes();\n\t}\n\n\tasync inferSlice({\n\t\timageUrl,\n\t}: {\n\t\timageUrl: string;\n\t}): Promise<InferSliceResponse> {\n\t\tconst authToken = await this.user.getAuthenticationToken();\n\t\tconst headers = {\n\t\t\tAuthorization: `Bearer ${authToken}`,\n\t\t};\n\n\t\tconst repository = await this.project.getResolvedRepositoryName();\n\t\tconst searchParams = new URLSearchParams({\n\t\t\trepository,\n\t\t});\n\n\t\tconst url = new URL(\"./slices/infer\", API_ENDPOINTS.CustomTypeService);\n\t\turl.search = searchParams.toString();\n\n\t\tconst response = await fetch(url.toString(), {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: headers,\n\t\t\tbody: JSON.stringify({ imageUrl }),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Failed to infer slice: ${response.statusText}`);\n\t\t}\n\n\t\tconst json = await response.json();\n\n\t\treturn InferSliceResponse.parse(json);\n\t}\n}\n\ntype InferSliceResponse = z.infer<typeof InferSliceResponse>;\n\nconst InferSliceResponse = z.object({\n\tslice: z.custom().transform((value, ctx) => {\n\t\tconst result = SharedSlice.decode(value);\n\t\tif (result._tag === \"Right\") {\n\t\t\treturn result.right;\n\t\t}\n\t\tctx.addIssue({\n\t\t\tcode: z.ZodIssueCode.custom,\n\t\t\tmessage: `Invalid shared slice: ${JSON.stringify(value, null, 2)}`,\n\t\t});\n\n\t\treturn z.NEVER;\n\t}),\n\tlangSmithUrl: z.string().url().optional(),\n});\n\nfunction shallowCloneIfObject<T>(value: T): T {\n\tif (typeof value === \"object\") {\n\t\treturn { ...value };\n\t}\n\n\treturn value;\n}\n"],"names":["errors","fieldArg"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"CustomTypesManager.js","sources":["../../../../src/managers/customTypes/CustomTypesManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport * as prismicCustomTypesClient from \"@prismicio/custom-types-client\";\nimport {\n\tCustomType,\n\tGroup,\n\tNestableWidget,\n\tNestedGroup,\n\tSharedSlice,\n\tUID,\n\ttraverseCustomType,\n\ttraverseSharedSlice,\n} from \"@prismicio/types-internal/lib/customtypes\";\nimport {\n\tCallHookReturnType,\n\tCustomTypeCreateHook,\n\tCustomTypeCreateHookData,\n\tCustomTypeReadHookData,\n\tCustomTypeRenameHook,\n\tCustomTypeRenameHookData,\n\tCustomTypeUpdateHook,\n\tCustomTypeUpdateHookData,\n\tHookError,\n} from \"@slicemachine/plugin-kit\";\nimport { z } from \"zod\";\n\nimport { DecodeError } from \"../../lib/DecodeError\";\nimport { assertPluginsInitialized } from \"../../lib/assertPluginsInitialized\";\nimport { decodeHookResult } from \"../../lib/decodeHookResult\";\nimport fetch from \"../../lib/fetch\";\n\nimport { OnlyHookErrors } from \"../../types\";\nimport { API_ENDPOINTS } from \"../../constants/API_ENDPOINTS\";\nimport { SLICE_MACHINE_USER_AGENT } from \"../../constants/SLICE_MACHINE_USER_AGENT\";\nimport { UnauthorizedError } from \"../../errors\";\n\nimport { BaseManager } from \"../BaseManager\";\nimport { CustomTypeFormat } from \"./types\";\n\ntype SliceMachineManagerReadCustomTypeLibraryReturnType = {\n\tids: string[];\n\terrors: (DecodeError | HookError)[];\n};\n\ntype CustomTypesManagerReadAllCustomTypesArgs = {\n\tformat: CustomTypeFormat;\n};\n\ntype SliceMachineManagerReadAllCustomTypeReturnType = {\n\tmodels: { model: CustomType }[];\n\terrors: (DecodeError | HookError)[];\n};\n\ntype SliceMachineManagerReadCustomTypeReturnType = {\n\tmodel: CustomType | undefined;\n\terrors: (DecodeError | HookError)[];\n};\n\ntype SliceMachineManagerPushCustomTypeArgs = {\n\tid: string;\n\tuserAgent?: string;\n};\n\ntype SliceMachineManagerReadCustomTypeMocksConfigArgs = {\n\tcustomTypeID: string;\n};\n\ntype SliceMachineManagerReadCustomTypeMocksConfigArgsReturnType = {\n\t// TODO\n\tmocksConfig?: Record<string, unknown>;\n\terrors: HookError[];\n};\n\ntype SliceMachineManagerUpdateCustomTypeMocksConfigArgs = {\n\tcustomTypeID: string;\n\t// TODO\n\tmocksConfig: Record<string, unknown>;\n};\n\ntype SliceMachineManagerUpdateCustomTypeMocksConfigArgsReturnType = {\n\terrors: HookError[];\n};\n\ntype CustomTypesMachineManagerDeleteCustomTypeArgs = {\n\tid: string;\n};\n\ntype CustomTypesMachineManagerDeleteCustomTypeReturnType = {\n\terrors: (DecodeError | HookError)[];\n};\n\ntype CustomTypeFieldIdChangedMeta = NonNullable<\n\tNonNullable<CustomTypeUpdateHookData[\"updateMeta\"]>[\"fieldIdChanged\"]\n>;\n\ntype CrCustomTypes = readonly CrCustomType[];\ntype CrCustomType =\n\t| string\n\t| { id: string; fields?: readonly CrCustomTypeNestedCr[] };\ntype CrCustomTypeNestedCr =\n\t| string\n\t| { id: string; customtypes: readonly CrCustomTypeFieldLeaf[] };\ntype CrCustomTypeFieldLeaf =\n\t| string\n\t| { id: string; fields?: readonly string[] };\n\nexport class CustomTypesManager extends BaseManager {\n\tasync readCustomTypeLibrary(): Promise<SliceMachineManagerReadCustomTypeLibraryReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type-library:read\",\n\t\t\tundefined,\n\t\t);\n\t\tconst { data, errors } = decodeHookResult(\n\t\t\tt.type({\n\t\t\t\tids: t.array(t.string),\n\t\t\t}),\n\t\t\thookResult,\n\t\t);\n\n\t\treturn {\n\t\t\tids: data[0]?.ids || [],\n\t\t\terrors,\n\t\t};\n\t}\n\n\tasync readAllCustomTypes(\n\t\targs?: CustomTypesManagerReadAllCustomTypesArgs,\n\t): Promise<SliceMachineManagerReadAllCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst res: SliceMachineManagerReadAllCustomTypeReturnType = {\n\t\t\tmodels: [],\n\t\t\terrors: [],\n\t\t};\n\n\t\tconst { ids, errors } = await this.readCustomTypeLibrary();\n\t\tres.errors = [...res.errors, ...errors];\n\n\t\tif (ids) {\n\t\t\tfor (const id of ids) {\n\t\t\t\tconst { model, errors } = await this.readCustomType({ id });\n\t\t\t\tres.errors = [...res.errors, ...errors];\n\n\t\t\t\tif (model && (!args || args.format === model.format)) {\n\t\t\t\t\tres.models.push({ model });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn res;\n\t}\n\n\tasync createCustomType(\n\t\targs: CustomTypeCreateHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeCreateHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:create\",\n\t\t\targs,\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync readCustomType(\n\t\targs: CustomTypeReadHookData,\n\t): Promise<SliceMachineManagerReadCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:read\",\n\t\t\targs,\n\t\t);\n\t\tconst { data, errors } = decodeHookResult(\n\t\t\tt.type({\n\t\t\t\tmodel: CustomType,\n\t\t\t}),\n\t\t\thookResult,\n\t\t);\n\n\t\treturn {\n\t\t\tmodel: data[0]?.model,\n\t\t\terrors,\n\t\t};\n\t}\n\n\t/**\n\t * Update the Content Relationship API IDs for all existing custom types and\n\t * slices. The change is determined by properties inside the `updateMeta`\n\t * property.\n\t */\n\tprivate async updateContentRelationships(\n\t\targs: CustomTypeUpdateHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeUpdateHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst { model, updateMeta } = args;\n\n\t\tif (updateMeta?.fieldIdChanged) {\n\t\t\tlet { previousPath, newPath } = updateMeta.fieldIdChanged;\n\n\t\t\tif (previousPath.join(\".\") !== newPath.join(\".\")) {\n\t\t\t\tpreviousPath = [model.id, ...previousPath];\n\t\t\t\tnewPath = [model.id, ...newPath];\n\n\t\t\t\tconst crUpdates: Promise<{ errors: HookError[] }>[] = [];\n\n\t\t\t\t// Find existing content relationships that link to the renamed field id in\n\t\t\t\t// any custom type and update them to use the new one.\n\t\t\t\tconst customTypes = await this.readAllCustomTypes();\n\n\t\t\t\tupdateCustomTypeContentRelationships({\n\t\t\t\t\tmodels: customTypes.models,\n\t\t\t\t\tonUpdate: (model) => {\n\t\t\t\t\t\tpushIfDefined(\n\t\t\t\t\t\t\tcrUpdates,\n\t\t\t\t\t\t\tthis.sliceMachinePluginRunner?.callHook(\"custom-type:update\", {\n\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t});\n\n\t\t\t\t// Find existing slice with content relationships that link to the renamed\n\t\t\t\t// field id in all libraries and update them to use the new one.\n\t\t\t\tconst { libraries } = await this.slices.readAllSliceLibraries();\n\n\t\t\t\tfor (const library of libraries) {\n\t\t\t\t\tconst slices = await this.slices.readAllSlicesForLibrary({\n\t\t\t\t\t\tlibraryID: library.libraryID,\n\t\t\t\t\t});\n\n\t\t\t\t\tupdateSharedSliceContentRelationships({\n\t\t\t\t\t\tmodels: slices.models,\n\t\t\t\t\t\tonUpdate: (model) => {\n\t\t\t\t\t\t\tpushIfDefined(\n\t\t\t\t\t\t\t\tcrUpdates,\n\t\t\t\t\t\t\t\tthis.sliceMachinePluginRunner?.callHook(\"slice:update\", {\n\t\t\t\t\t\t\t\t\tlibraryID: library.libraryID,\n\t\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tpreviousPath,\n\t\t\t\t\t\tnewPath,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Process all the Content Relationship updates at once.\n\t\t\t\tconst crUpdatesResult = await Promise.all(crUpdates);\n\n\t\t\t\tif (crUpdatesResult.some((result) => result.errors.length > 0)) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\terrors: crUpdatesResult.flatMap((result) => result.errors),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn { errors: [] };\n\t}\n\n\tasync updateCustomType(\n\t\targs: CustomTypeUpdateHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeUpdateHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:update\",\n\t\t\targs,\n\t\t);\n\n\t\tif (args.updateMeta?.fieldIdChanged) {\n\t\t\tawait this.updateContentRelationships(args);\n\t\t}\n\n\t\treturn { errors: hookResult.errors };\n\t}\n\n\tasync renameCustomType(\n\t\targs: CustomTypeRenameHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeRenameHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:rename\",\n\t\t\targs,\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync deleteCustomType(\n\t\targs: CustomTypesMachineManagerDeleteCustomTypeArgs,\n\t): Promise<CustomTypesMachineManagerDeleteCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst { model, errors: readCustomTypeErrors } = await this.readCustomType({\n\t\t\tid: args.id,\n\t\t});\n\n\t\tif (model) {\n\t\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\t\"custom-type:delete\",\n\t\t\t\t{ model },\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\terrors: readCustomTypeErrors,\n\t\t\t};\n\t\t}\n\t}\n\n\tasync pushCustomType(\n\t\targs: SliceMachineManagerPushCustomTypeArgs,\n\t): Promise<void> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\t\tconst repositoryName = await this.project.getResolvedRepositoryName();\n\n\t\t// TODO: Handle errors\n\t\tconst { model } = await this.readCustomType({ id: args.id });\n\n\t\tif (model) {\n\t\t\t// TODO: Create a single shared client.\n\t\t\tconst client = prismicCustomTypesClient.createClient({\n\t\t\t\tendpoint: API_ENDPOINTS.PrismicModels,\n\t\t\t\trepositoryName,\n\t\t\t\ttoken: authenticationToken,\n\t\t\t\tfetch,\n\t\t\t\tfetchOptions: {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"User-Agent\": args.userAgent || SLICE_MACHINE_USER_AGENT,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\t// Check if Custom Type already exists on the repository.\n\t\t\t\tawait client.getCustomTypeByID(args.id);\n\n\t\t\t\t// If it exists on the repository, update it.\n\t\t\t\tawait client.updateCustomType(model);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof prismicCustomTypesClient.NotFoundError) {\n\t\t\t\t\t// If it doesn't exist on the repository, insert it.\n\t\t\t\t\tawait client.insertCustomType(model);\n\t\t\t\t} else if (error instanceof prismicCustomTypesClient.ForbiddenError) {\n\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\t\"You do not have access to push types to this Prismic repository.\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcause: error,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// TODO: Remove\n\tasync readCustomTypeMocksConfig(\n\t\targs: SliceMachineManagerReadCustomTypeMocksConfigArgs,\n\t): Promise<SliceMachineManagerReadCustomTypeMocksConfigArgsReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:asset:read\",\n\t\t\t{\n\t\t\t\tcustomTypeID: args.customTypeID,\n\t\t\t\tassetID: \"mocks.config.json\",\n\t\t\t},\n\t\t);\n\t\tconst data = hookResult.data[0]?.data;\n\n\t\t// TODO: Validate the returned data.\n\n\t\tif (data) {\n\t\t\treturn {\n\t\t\t\tmocksConfig: JSON.parse(data.toString()),\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tmocksConfig: undefined,\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t}\n\t}\n\n\t// TODO: Remove\n\tasync updateCustomTypeMocksConfig(\n\t\targs: SliceMachineManagerUpdateCustomTypeMocksConfigArgs,\n\t): Promise<SliceMachineManagerUpdateCustomTypeMocksConfigArgsReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:asset:update\",\n\t\t\t{\n\t\t\t\tcustomTypeID: args.customTypeID,\n\t\t\t\tasset: {\n\t\t\t\t\tid: \"mocks.config.json\",\n\t\t\t\t\tdata: Buffer.from(JSON.stringify(args.mocksConfig, null, \"\\t\")),\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync fetchRemoteCustomTypes(): Promise<CustomType[]> {\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\t\tconst repositoryName = await this.project.getResolvedRepositoryName();\n\n\t\tconst client = prismicCustomTypesClient.createClient({\n\t\t\tendpoint: API_ENDPOINTS.PrismicModels,\n\t\t\trepositoryName,\n\t\t\ttoken: authenticationToken,\n\t\t\tfetch,\n\t\t\tfetchOptions: {\n\t\t\t\theaders: {\n\t\t\t\t\t\"User-Agent\": SLICE_MACHINE_USER_AGENT,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\treturn await client.getAllCustomTypes();\n\t}\n\n\tasync inferSlice({\n\t\timageUrl,\n\t}: {\n\t\timageUrl: string;\n\t}): Promise<InferSliceResponse> {\n\t\tconst authToken = await this.user.getAuthenticationToken();\n\t\tconst headers = {\n\t\t\tAuthorization: `Bearer ${authToken}`,\n\t\t};\n\n\t\tconst repository = await this.project.getResolvedRepositoryName();\n\t\tconst searchParams = new URLSearchParams({\n\t\t\trepository,\n\t\t});\n\n\t\tconst url = new URL(\"./slices/infer\", API_ENDPOINTS.CustomTypeService);\n\t\turl.search = searchParams.toString();\n\n\t\tconst response = await fetch(url.toString(), {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: headers,\n\t\t\tbody: JSON.stringify({ imageUrl }),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Failed to infer slice: ${response.statusText}`);\n\t\t}\n\n\t\tconst json = await response.json();\n\n\t\treturn InferSliceResponse.parse(json);\n\t}\n}\n\ntype InferSliceResponse = z.infer<typeof InferSliceResponse>;\n\nconst InferSliceResponse = z.object({\n\tslice: z.custom().transform((value, ctx) => {\n\t\tconst result = SharedSlice.decode(value);\n\t\tif (result._tag === \"Right\") {\n\t\t\treturn result.right;\n\t\t}\n\t\tctx.addIssue({\n\t\t\tcode: z.ZodIssueCode.custom,\n\t\t\tmessage: `Invalid shared slice: ${JSON.stringify(value, null, 2)}`,\n\t\t});\n\n\t\treturn z.NEVER;\n\t}),\n\tlangSmithUrl: z.string().url().optional(),\n});\n\nfunction updateCRCustomType(\n\targs: { customType: CrCustomType } & CustomTypeFieldIdChangedMeta,\n): CrCustomType {\n\tconst [previousCustomTypeId, previousFieldId] = args.previousPath;\n\tconst [newCustomTypeId, newFieldId] = args.newPath;\n\n\tif (!previousCustomTypeId || !newCustomTypeId) {\n\t\tthrow new Error(\n\t\t\t\"Could not find a customtype id in previousPath and/or newPath, which should not be possible.\",\n\t\t);\n\t}\n\n\tif (!previousFieldId || !newFieldId) {\n\t\tthrow new Error(\n\t\t\t\"Could not find a field id in previousPath and/or newPath, which should not be possible.\",\n\t\t);\n\t}\n\n\tconst customType = shallowCloneIfObject(args.customType);\n\n\tif (typeof customType === \"string\" || !customType.fields) {\n\t\treturn customType;\n\t}\n\n\tconst matchedCustomTypeId = customType.id === previousCustomTypeId;\n\n\tconst newFields = customType.fields.map((fieldArg) => {\n\t\tconst nestedField = shallowCloneIfObject(fieldArg);\n\n\t\tif (typeof nestedField === \"string\") {\n\t\t\tif (\n\t\t\t\tmatchedCustomTypeId &&\n\t\t\t\tnestedField === previousFieldId &&\n\t\t\t\tnestedField !== newFieldId\n\t\t\t) {\n\t\t\t\t// We have reached a field id that matches the id that was renamed,\n\t\t\t\t// so we update it new one. The field is a string, so return the new\n\t\t\t\t// id.\n\t\t\t\treturn newFieldId;\n\t\t\t}\n\n\t\t\treturn nestedField;\n\t\t}\n\n\t\tif (\n\t\t\tmatchedCustomTypeId &&\n\t\t\tnestedField.id === previousFieldId &&\n\t\t\tnestedField.id !== newFieldId\n\t\t) {\n\t\t\t// We have reached a field id that matches the id that was renamed,\n\t\t\t// so we update it new one.\n\t\t\t// Since field is not a string, we don't exit, as we might have\n\t\t\t// something to update further down in customtypes.\n\t\t\tnestedField.id = newFieldId;\n\t\t}\n\n\t\treturn {\n\t\t\t...nestedField,\n\t\t\tcustomtypes: nestedField.customtypes.map((customTypeArg) => {\n\t\t\t\tconst customTypeField = shallowCloneIfObject(customTypeArg);\n\n\t\t\t\tif (typeof customTypeField === \"string\" || !customTypeField.fields) {\n\t\t\t\t\treturn customTypeField;\n\t\t\t\t}\n\n\t\t\t\tconst matchedNestedCustomTypeId =\n\t\t\t\t\tcustomTypeField.id === previousCustomTypeId;\n\n\t\t\t\treturn {\n\t\t\t\t\t...customTypeField,\n\t\t\t\t\tfields: customTypeField.fields.map((fieldArg) => {\n\t\t\t\t\t\tconst nestedCustomTypeField = shallowCloneIfObject(fieldArg);\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tmatchedNestedCustomTypeId &&\n\t\t\t\t\t\t\tnestedCustomTypeField === previousFieldId &&\n\t\t\t\t\t\t\tnestedCustomTypeField !== newFieldId\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// Matches the previous id, so we update it and return because\n\t\t\t\t\t\t\t// it's the last level.\n\t\t\t\t\t\t\treturn newFieldId;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn nestedCustomTypeField;\n\t\t\t\t\t}),\n\t\t\t\t};\n\t\t\t}),\n\t\t};\n\t});\n\n\treturn { ...customType, fields: newFields };\n}\n\n/**\n * Map over the custom types of a Content Relationship Link and update the API\n * IDs that were changed during the custom type update.\n */\nfunction updateCRCustomTypes(\n\targs: { customTypes: CrCustomTypes } & CustomTypeFieldIdChangedMeta,\n): CrCustomTypes {\n\tconst { customTypes, ...updateMeta } = args;\n\n\treturn customTypes.map((customType) => {\n\t\treturn updateCRCustomType({ customType, ...updateMeta });\n\t});\n}\n\n/**\n * Update the Content Relationship API IDs of a single field. The change is\n * determined by the `previousPath` and `newPath` properties.\n */\nfunction updateFieldContentRelationships<\n\tT extends UID | NestableWidget | Group | NestedGroup,\n>(args: { field: T } & CustomTypeFieldIdChangedMeta): T {\n\tconst { field, ...updateMeta } = args;\n\tif (\n\t\tfield.type !== \"Link\" ||\n\t\tfield.config?.select !== \"document\" ||\n\t\t!field.config?.customtypes\n\t) {\n\t\t// not a content relationship field\n\t\treturn field;\n\t}\n\n\tconst newCustomTypes = updateCRCustomTypes({\n\t\t...updateMeta,\n\t\tcustomTypes: field.config.customtypes,\n\t});\n\n\treturn {\n\t\t...field,\n\t\tconfig: { ...field.config, customtypes: newCustomTypes },\n\t};\n}\n\nexport function updateCustomTypeContentRelationships(\n\targs: {\n\t\tmodels: { model: CustomType }[];\n\t\tonUpdate: (model: CustomType) => void;\n\t} & CustomTypeFieldIdChangedMeta,\n): void {\n\tconst { models, previousPath, newPath, onUpdate } = args;\n\n\tfor (const customType of models) {\n\t\tconst updatedCustomTypeModel = traverseCustomType({\n\t\t\tcustomType: customType.model,\n\t\t\tonField: ({ field }) => {\n\t\t\t\treturn updateFieldContentRelationships({\n\t\t\t\t\tfield,\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\n\t\tonUpdate(updatedCustomTypeModel);\n\t}\n}\n\nexport function updateSharedSliceContentRelationships(\n\targs: {\n\t\tmodels: { model: SharedSlice }[];\n\t\tonUpdate: (model: SharedSlice) => void;\n\t} & CustomTypeFieldIdChangedMeta,\n): void {\n\tconst { models, previousPath, newPath, onUpdate } = args;\n\n\tfor (const slice of models) {\n\t\tconst updatedSliceModel = traverseSharedSlice({\n\t\t\tpath: [\".\"],\n\t\t\tslice: slice.model,\n\t\t\tonField: ({ field }) => {\n\t\t\t\treturn updateFieldContentRelationships({\n\t\t\t\t\tfield,\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\n\t\tonUpdate(updatedSliceModel);\n\t}\n}\n\nfunction shallowCloneIfObject<T>(value: T): T {\n\tif (typeof value === \"object\") {\n\t\treturn { ...value };\n\t}\n\n\treturn value;\n}\n\nfunction pushIfDefined<T>(array: T[], value: T | undefined) {\n\tif (value) {\n\t\tarray.push(value);\n\t}\n}\n"],"names":["errors","model","fieldArg"],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@slicemachine/manager",
|
3
|
-
"version": "0.24.14-alpha.jp-update-cr-links-
|
3
|
+
"version": "0.24.14-alpha.jp-update-cr-links-unit.11",
|
4
4
|
"description": "Manage all aspects of a Slice Machine project.",
|
5
5
|
"repository": {
|
6
6
|
"type": "git",
|
@@ -70,7 +70,7 @@
|
|
70
70
|
"@prismicio/mocks": "2.13.0",
|
71
71
|
"@prismicio/types-internal": "3.10.0-alpha.0",
|
72
72
|
"@segment/analytics-node": "^2.1.2",
|
73
|
-
"@slicemachine/plugin-kit": "0.4.76-alpha.jp-update-cr-links-
|
73
|
+
"@slicemachine/plugin-kit": "0.4.76-alpha.jp-update-cr-links-unit.11",
|
74
74
|
"cookie": "^1.0.1",
|
75
75
|
"cors": "^2.8.5",
|
76
76
|
"execa": "^7.1.1",
|
@@ -188,141 +188,6 @@ export class CustomTypesManager extends BaseManager {
|
|
188
188
|
};
|
189
189
|
}
|
190
190
|
|
191
|
-
private updateCRCustomType(
|
192
|
-
args: { customType: CrCustomType } & CustomTypeFieldIdChangedMeta,
|
193
|
-
): CrCustomType {
|
194
|
-
const [previousCustomTypeId, previousFieldId] = args.previousPath;
|
195
|
-
const [newCustomTypeId, newFieldId] = args.newPath;
|
196
|
-
|
197
|
-
if (!previousCustomTypeId || !newCustomTypeId) {
|
198
|
-
throw new Error(
|
199
|
-
"Could not find a customtype id in previousPath and/or newPath, which should not be possible.",
|
200
|
-
);
|
201
|
-
}
|
202
|
-
|
203
|
-
if (!previousFieldId || !newFieldId) {
|
204
|
-
throw new Error(
|
205
|
-
"Could not find a field id in previousPath and/or newPath, which should not be possible.",
|
206
|
-
);
|
207
|
-
}
|
208
|
-
|
209
|
-
const customType = shallowCloneIfObject(args.customType);
|
210
|
-
|
211
|
-
if (typeof customType === "string" || !customType.fields) {
|
212
|
-
return customType;
|
213
|
-
}
|
214
|
-
|
215
|
-
const matchedCustomTypeId = customType.id === previousCustomTypeId;
|
216
|
-
|
217
|
-
const newFields = customType.fields.map((fieldArg) => {
|
218
|
-
const nestedField = shallowCloneIfObject(fieldArg);
|
219
|
-
|
220
|
-
if (typeof nestedField === "string") {
|
221
|
-
if (
|
222
|
-
matchedCustomTypeId &&
|
223
|
-
nestedField === previousFieldId &&
|
224
|
-
nestedField !== newFieldId
|
225
|
-
) {
|
226
|
-
// We have reached a field id that matches the id that was renamed,
|
227
|
-
// so we update it new one. The field is a string, so return the new
|
228
|
-
// id.
|
229
|
-
return newFieldId;
|
230
|
-
}
|
231
|
-
|
232
|
-
return nestedField;
|
233
|
-
}
|
234
|
-
|
235
|
-
if (
|
236
|
-
matchedCustomTypeId &&
|
237
|
-
nestedField.id === previousFieldId &&
|
238
|
-
nestedField.id !== newFieldId
|
239
|
-
) {
|
240
|
-
// We have reached a field id that matches the id that was renamed,
|
241
|
-
// so we update it new one.
|
242
|
-
// Since field is not a string, we don't exit, as we might have
|
243
|
-
// something to update further down in customtypes.
|
244
|
-
nestedField.id = newFieldId;
|
245
|
-
}
|
246
|
-
|
247
|
-
return {
|
248
|
-
...nestedField,
|
249
|
-
customtypes: nestedField.customtypes.map((customTypeArg) => {
|
250
|
-
const customTypeField = shallowCloneIfObject(customTypeArg);
|
251
|
-
|
252
|
-
if (typeof customTypeField === "string" || !customTypeField.fields) {
|
253
|
-
return customTypeField;
|
254
|
-
}
|
255
|
-
|
256
|
-
const matchedNestedCustomTypeId =
|
257
|
-
customTypeField.id === previousCustomTypeId;
|
258
|
-
|
259
|
-
return {
|
260
|
-
...customTypeField,
|
261
|
-
fields: customTypeField.fields.map((fieldArg) => {
|
262
|
-
const nestedCustomTypeField = shallowCloneIfObject(fieldArg);
|
263
|
-
|
264
|
-
if (
|
265
|
-
matchedNestedCustomTypeId &&
|
266
|
-
nestedCustomTypeField === previousFieldId &&
|
267
|
-
nestedCustomTypeField !== newFieldId
|
268
|
-
) {
|
269
|
-
// Matches the previous id, so we update it and return because
|
270
|
-
// it's the last level.
|
271
|
-
return newFieldId;
|
272
|
-
}
|
273
|
-
|
274
|
-
return nestedCustomTypeField;
|
275
|
-
}),
|
276
|
-
};
|
277
|
-
}),
|
278
|
-
};
|
279
|
-
});
|
280
|
-
|
281
|
-
return { ...customType, fields: newFields };
|
282
|
-
}
|
283
|
-
|
284
|
-
/**
|
285
|
-
* Map over the custom types of a Content Relationship Link and update the API
|
286
|
-
* IDs that were changed during the custom type update.
|
287
|
-
*/
|
288
|
-
private updateCRCustomTypes(
|
289
|
-
args: { customTypes: CrCustomTypes } & CustomTypeFieldIdChangedMeta,
|
290
|
-
): CrCustomTypes {
|
291
|
-
const { customTypes, ...updateMeta } = args;
|
292
|
-
|
293
|
-
return customTypes.map((customType) => {
|
294
|
-
return this.updateCRCustomType({ customType, ...updateMeta });
|
295
|
-
});
|
296
|
-
}
|
297
|
-
|
298
|
-
/**
|
299
|
-
* Update the Content Relationship API IDs of a single field. The change is
|
300
|
-
* determined by the `previousPath` and `newPath` properties.
|
301
|
-
*/
|
302
|
-
private updateFieldContentRelationships<
|
303
|
-
T extends UID | NestableWidget | Group | NestedGroup,
|
304
|
-
>(args: { field: T } & CustomTypeFieldIdChangedMeta): T {
|
305
|
-
const { field, ...updateMeta } = args;
|
306
|
-
if (
|
307
|
-
field.type !== "Link" ||
|
308
|
-
field.config?.select !== "document" ||
|
309
|
-
!field.config?.customtypes
|
310
|
-
) {
|
311
|
-
// not a content relationship field
|
312
|
-
return field;
|
313
|
-
}
|
314
|
-
|
315
|
-
const newCustomTypes = this.updateCRCustomTypes({
|
316
|
-
...updateMeta,
|
317
|
-
customTypes: field.config.customtypes,
|
318
|
-
});
|
319
|
-
|
320
|
-
return {
|
321
|
-
...field,
|
322
|
-
config: { ...field.config, customtypes: newCustomTypes },
|
323
|
-
};
|
324
|
-
}
|
325
|
-
|
326
191
|
/**
|
327
192
|
* Update the Content Relationship API IDs for all existing custom types and
|
328
193
|
* slices. The change is determined by properties inside the `updateMeta`
|
@@ -348,24 +213,19 @@ export class CustomTypesManager extends BaseManager {
|
|
348
213
|
// any custom type and update them to use the new one.
|
349
214
|
const customTypes = await this.readAllCustomTypes();
|
350
215
|
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
this.sliceMachinePluginRunner.callHook("custom-type:update", {
|
365
|
-
model: updatedCustomTypeModel,
|
366
|
-
}),
|
367
|
-
);
|
368
|
-
}
|
216
|
+
updateCustomTypeContentRelationships({
|
217
|
+
models: customTypes.models,
|
218
|
+
onUpdate: (model) => {
|
219
|
+
pushIfDefined(
|
220
|
+
crUpdates,
|
221
|
+
this.sliceMachinePluginRunner?.callHook("custom-type:update", {
|
222
|
+
model,
|
223
|
+
}),
|
224
|
+
);
|
225
|
+
},
|
226
|
+
previousPath,
|
227
|
+
newPath,
|
228
|
+
});
|
369
229
|
|
370
230
|
// Find existing slice with content relationships that link to the renamed
|
371
231
|
// field id in all libraries and update them to use the new one.
|
@@ -376,26 +236,20 @@ export class CustomTypesManager extends BaseManager {
|
|
376
236
|
libraryID: library.libraryID,
|
377
237
|
});
|
378
238
|
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
this.sliceMachinePluginRunner.callHook("slice:update", {
|
394
|
-
libraryID: library.libraryID,
|
395
|
-
model: updatedSliceModel,
|
396
|
-
}),
|
397
|
-
);
|
398
|
-
}
|
239
|
+
updateSharedSliceContentRelationships({
|
240
|
+
models: slices.models,
|
241
|
+
onUpdate: (model) => {
|
242
|
+
pushIfDefined(
|
243
|
+
crUpdates,
|
244
|
+
this.sliceMachinePluginRunner?.callHook("slice:update", {
|
245
|
+
libraryID: library.libraryID,
|
246
|
+
model,
|
247
|
+
}),
|
248
|
+
);
|
249
|
+
},
|
250
|
+
previousPath,
|
251
|
+
newPath,
|
252
|
+
});
|
399
253
|
}
|
400
254
|
|
401
255
|
// Process all the Content Relationship updates at once.
|
@@ -641,6 +495,190 @@ const InferSliceResponse = z.object({
|
|
641
495
|
langSmithUrl: z.string().url().optional(),
|
642
496
|
});
|
643
497
|
|
498
|
+
function updateCRCustomType(
|
499
|
+
args: { customType: CrCustomType } & CustomTypeFieldIdChangedMeta,
|
500
|
+
): CrCustomType {
|
501
|
+
const [previousCustomTypeId, previousFieldId] = args.previousPath;
|
502
|
+
const [newCustomTypeId, newFieldId] = args.newPath;
|
503
|
+
|
504
|
+
if (!previousCustomTypeId || !newCustomTypeId) {
|
505
|
+
throw new Error(
|
506
|
+
"Could not find a customtype id in previousPath and/or newPath, which should not be possible.",
|
507
|
+
);
|
508
|
+
}
|
509
|
+
|
510
|
+
if (!previousFieldId || !newFieldId) {
|
511
|
+
throw new Error(
|
512
|
+
"Could not find a field id in previousPath and/or newPath, which should not be possible.",
|
513
|
+
);
|
514
|
+
}
|
515
|
+
|
516
|
+
const customType = shallowCloneIfObject(args.customType);
|
517
|
+
|
518
|
+
if (typeof customType === "string" || !customType.fields) {
|
519
|
+
return customType;
|
520
|
+
}
|
521
|
+
|
522
|
+
const matchedCustomTypeId = customType.id === previousCustomTypeId;
|
523
|
+
|
524
|
+
const newFields = customType.fields.map((fieldArg) => {
|
525
|
+
const nestedField = shallowCloneIfObject(fieldArg);
|
526
|
+
|
527
|
+
if (typeof nestedField === "string") {
|
528
|
+
if (
|
529
|
+
matchedCustomTypeId &&
|
530
|
+
nestedField === previousFieldId &&
|
531
|
+
nestedField !== newFieldId
|
532
|
+
) {
|
533
|
+
// We have reached a field id that matches the id that was renamed,
|
534
|
+
// so we update it new one. The field is a string, so return the new
|
535
|
+
// id.
|
536
|
+
return newFieldId;
|
537
|
+
}
|
538
|
+
|
539
|
+
return nestedField;
|
540
|
+
}
|
541
|
+
|
542
|
+
if (
|
543
|
+
matchedCustomTypeId &&
|
544
|
+
nestedField.id === previousFieldId &&
|
545
|
+
nestedField.id !== newFieldId
|
546
|
+
) {
|
547
|
+
// We have reached a field id that matches the id that was renamed,
|
548
|
+
// so we update it new one.
|
549
|
+
// Since field is not a string, we don't exit, as we might have
|
550
|
+
// something to update further down in customtypes.
|
551
|
+
nestedField.id = newFieldId;
|
552
|
+
}
|
553
|
+
|
554
|
+
return {
|
555
|
+
...nestedField,
|
556
|
+
customtypes: nestedField.customtypes.map((customTypeArg) => {
|
557
|
+
const customTypeField = shallowCloneIfObject(customTypeArg);
|
558
|
+
|
559
|
+
if (typeof customTypeField === "string" || !customTypeField.fields) {
|
560
|
+
return customTypeField;
|
561
|
+
}
|
562
|
+
|
563
|
+
const matchedNestedCustomTypeId =
|
564
|
+
customTypeField.id === previousCustomTypeId;
|
565
|
+
|
566
|
+
return {
|
567
|
+
...customTypeField,
|
568
|
+
fields: customTypeField.fields.map((fieldArg) => {
|
569
|
+
const nestedCustomTypeField = shallowCloneIfObject(fieldArg);
|
570
|
+
|
571
|
+
if (
|
572
|
+
matchedNestedCustomTypeId &&
|
573
|
+
nestedCustomTypeField === previousFieldId &&
|
574
|
+
nestedCustomTypeField !== newFieldId
|
575
|
+
) {
|
576
|
+
// Matches the previous id, so we update it and return because
|
577
|
+
// it's the last level.
|
578
|
+
return newFieldId;
|
579
|
+
}
|
580
|
+
|
581
|
+
return nestedCustomTypeField;
|
582
|
+
}),
|
583
|
+
};
|
584
|
+
}),
|
585
|
+
};
|
586
|
+
});
|
587
|
+
|
588
|
+
return { ...customType, fields: newFields };
|
589
|
+
}
|
590
|
+
|
591
|
+
/**
|
592
|
+
* Map over the custom types of a Content Relationship Link and update the API
|
593
|
+
* IDs that were changed during the custom type update.
|
594
|
+
*/
|
595
|
+
function updateCRCustomTypes(
|
596
|
+
args: { customTypes: CrCustomTypes } & CustomTypeFieldIdChangedMeta,
|
597
|
+
): CrCustomTypes {
|
598
|
+
const { customTypes, ...updateMeta } = args;
|
599
|
+
|
600
|
+
return customTypes.map((customType) => {
|
601
|
+
return updateCRCustomType({ customType, ...updateMeta });
|
602
|
+
});
|
603
|
+
}
|
604
|
+
|
605
|
+
/**
|
606
|
+
* Update the Content Relationship API IDs of a single field. The change is
|
607
|
+
* determined by the `previousPath` and `newPath` properties.
|
608
|
+
*/
|
609
|
+
function updateFieldContentRelationships<
|
610
|
+
T extends UID | NestableWidget | Group | NestedGroup,
|
611
|
+
>(args: { field: T } & CustomTypeFieldIdChangedMeta): T {
|
612
|
+
const { field, ...updateMeta } = args;
|
613
|
+
if (
|
614
|
+
field.type !== "Link" ||
|
615
|
+
field.config?.select !== "document" ||
|
616
|
+
!field.config?.customtypes
|
617
|
+
) {
|
618
|
+
// not a content relationship field
|
619
|
+
return field;
|
620
|
+
}
|
621
|
+
|
622
|
+
const newCustomTypes = updateCRCustomTypes({
|
623
|
+
...updateMeta,
|
624
|
+
customTypes: field.config.customtypes,
|
625
|
+
});
|
626
|
+
|
627
|
+
return {
|
628
|
+
...field,
|
629
|
+
config: { ...field.config, customtypes: newCustomTypes },
|
630
|
+
};
|
631
|
+
}
|
632
|
+
|
633
|
+
export function updateCustomTypeContentRelationships(
|
634
|
+
args: {
|
635
|
+
models: { model: CustomType }[];
|
636
|
+
onUpdate: (model: CustomType) => void;
|
637
|
+
} & CustomTypeFieldIdChangedMeta,
|
638
|
+
): void {
|
639
|
+
const { models, previousPath, newPath, onUpdate } = args;
|
640
|
+
|
641
|
+
for (const customType of models) {
|
642
|
+
const updatedCustomTypeModel = traverseCustomType({
|
643
|
+
customType: customType.model,
|
644
|
+
onField: ({ field }) => {
|
645
|
+
return updateFieldContentRelationships({
|
646
|
+
field,
|
647
|
+
previousPath,
|
648
|
+
newPath,
|
649
|
+
});
|
650
|
+
},
|
651
|
+
});
|
652
|
+
|
653
|
+
onUpdate(updatedCustomTypeModel);
|
654
|
+
}
|
655
|
+
}
|
656
|
+
|
657
|
+
export function updateSharedSliceContentRelationships(
|
658
|
+
args: {
|
659
|
+
models: { model: SharedSlice }[];
|
660
|
+
onUpdate: (model: SharedSlice) => void;
|
661
|
+
} & CustomTypeFieldIdChangedMeta,
|
662
|
+
): void {
|
663
|
+
const { models, previousPath, newPath, onUpdate } = args;
|
664
|
+
|
665
|
+
for (const slice of models) {
|
666
|
+
const updatedSliceModel = traverseSharedSlice({
|
667
|
+
path: ["."],
|
668
|
+
slice: slice.model,
|
669
|
+
onField: ({ field }) => {
|
670
|
+
return updateFieldContentRelationships({
|
671
|
+
field,
|
672
|
+
previousPath,
|
673
|
+
newPath,
|
674
|
+
});
|
675
|
+
},
|
676
|
+
});
|
677
|
+
|
678
|
+
onUpdate(updatedSliceModel);
|
679
|
+
}
|
680
|
+
}
|
681
|
+
|
644
682
|
function shallowCloneIfObject<T>(value: T): T {
|
645
683
|
if (typeof value === "object") {
|
646
684
|
return { ...value };
|
@@ -648,3 +686,9 @@ function shallowCloneIfObject<T>(value: T): T {
|
|
648
686
|
|
649
687
|
return value;
|
650
688
|
}
|
689
|
+
|
690
|
+
function pushIfDefined<T>(array: T[], value: T | undefined) {
|
691
|
+
if (value) {
|
692
|
+
array.push(value);
|
693
|
+
}
|
694
|
+
}
|