@payloadcms/plugin-nested-docs 1.0.0

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/README.md ADDED
@@ -0,0 +1,185 @@
1
+ # Payload Nested Docs Plugin
2
+
3
+ [![NPM](https://img.shields.io/npm/v/@payloadcms/plugin-nested-docs)](https://www.npmjs.com/package/@payloadcms/plugin-nested-docs)
4
+
5
+ A plugin for [Payload CMS](https://github.com/payloadcms/payload) to easily allow for documents to be nested inside one another.
6
+
7
+ Core features:
8
+ - Allows for [parent/child](#parent) relationships between documents
9
+ - Automatically populates [breadcrumbs](#breadcrumbs) data
10
+
11
+ ## Installation
12
+
13
+ ```bash
14
+ yarn add @payloadcms/plugin-nested-docs
15
+ # OR
16
+ npm i @payloadcms/plugin-nested-docs
17
+ ```
18
+
19
+ ## Basic Usage
20
+
21
+ In the `plugins` array of your [Payload config](https://payloadcms.com/docs/configuration/overview), call the plugin with [options](#options):
22
+
23
+ ```js
24
+ import { buildConfig } from 'payload/config';
25
+ import nestedDocs from '@payloadcms/plugin-nested-docs';
26
+
27
+ const config = buildConfig({
28
+ collections: [
29
+ {
30
+ slug: 'pages',
31
+ fields: [
32
+ {
33
+ name: 'title',
34
+ type: 'text'
35
+ },
36
+ {
37
+ name: 'slug',
38
+ type: 'text'
39
+ }
40
+ ]
41
+ }
42
+ ],
43
+ plugins: [
44
+ nestedDocs({
45
+ collections: ['pages'],
46
+ generateLabel: (_, doc) => doc.title,
47
+ generateURL: (docs) => docs.reduce((url, doc) => `${url}/${doc.slug}`, ''),
48
+ })
49
+ ]
50
+ });
51
+
52
+ export default config;
53
+ ```
54
+
55
+ ### Fields
56
+
57
+ #### Parent
58
+
59
+ The `parent` relationship field is automatically added to every document which allows editors to choose another document from the same collection to act as the direct parent.
60
+
61
+ #### Breadcrumbs
62
+
63
+ The `breadcrumbs` field is an array which dynamically populates all parent relationships of a document up to the top level. It does not store any data in the database, and instead, acts as a `virtual` field which is dynamically populated each time the document is loaded.
64
+
65
+ The `breadcrumbs` array stores the following fields:
66
+
67
+ - `label`
68
+
69
+ The label of the breadcrumb. This field is automatically set to either the `collection.admin.useAsTitle` (if defined) or is set to the `ID` of the document. You can also dynamically define the `label` by passing a function to the options property of [`generateLabel`](#generateLabel).
70
+
71
+ - `url`
72
+
73
+ The URL of the breadcrumb. By default, this field is undefined. You can manually define this field by passing a property called function to the plugin options property of [`generateURL`](#generateURL).
74
+
75
+ ### Options
76
+
77
+ #### `collections`
78
+
79
+ An array of collections slugs to enable nested docs.
80
+
81
+ #### `generateLabel`
82
+
83
+ Each `breadcrumb` has a required `label` field. By default, its value will be set to the collection's `admin.useAsTitle` or fallback the the `ID` of the document.
84
+
85
+ You can also pass a function to dynamically set the `label` of your breadcrumb.
86
+
87
+ ```js
88
+ {
89
+ plugins: [
90
+ ...
91
+ nestedDocs({
92
+ ...
93
+ generateLabel: (_, doc) => doc.title // NOTE: 'title' is a hypothetical field
94
+ })
95
+ ]
96
+ ```
97
+
98
+ The function takes two arguments and returns a string:
99
+
100
+ 1. `breadcrumbs` - an array of the breadcrumbs up to that point
101
+ 2. `currentDoc` - the current document being edited
102
+
103
+ #### `generateURL`
104
+
105
+ A function that allows you to dynamically generate each breadcrumb `url`. Each `breadcrumb` has an optional `url` field which is undefined by default. For example, you might want to format a full URL to contain all of the breadcrumbs up to that point, like `/about-us/company/our-team`.
106
+
107
+ ```js
108
+ plugins: [
109
+ ...
110
+ nestedDocs({
111
+ ...
112
+ generateURL: (docs) => docs.reduce((url, doc) => `${url}/${doc.slug}`, ''), // NOTE: 'slug' is a hypothetical field
113
+ })
114
+ ]
115
+ ```
116
+
117
+ This function takes two arguments and returns a string:
118
+
119
+ 1. `breadcrumbs` - an array of the breadcrumbs up to that point
120
+ 1. `currentDoc` - the current document being edited
121
+
122
+ #### `parentFieldSlug`
123
+
124
+ When defined, the `parent` field will not be provided for you automatically, and instead, expects you to add your own `parent` field to each collection manually. This gives you complete control over where you put the field in your admin dashboard, etc. Set this property to the `name` of your custom field.
125
+
126
+ #### `breadcrumbsFieldSlug`
127
+
128
+ When defined, the `breadcrumbs` field will not be provided for you, and instead, expects your to add your own `breadcrumbs` field to each collection manually. Set this property to the `name` of your custom field.
129
+
130
+ > Note - if you opt out of automatically being provided a `parent` or `breadcrumbs` field, you need to make sure that both fields are placed at the top-level of your document. They cannot exist within any nested data structures like a `group`, `array`, or `blocks`.
131
+
132
+ ## More
133
+
134
+ You can also extend the built-in `parent` and `breadcrumbs` fields on a page-by-page basis by importing helper methods as follows:
135
+
136
+ ```js
137
+ import { CollectionConfig } from 'payload/types';
138
+ import createParentField from '@payloadcms/plugin-nested-docs/fields/parent';
139
+ import createBreadcrumbsField from '@payloadcms/plugin-nested-docs/fields/breadcrumbs';
140
+
141
+ const examplePageConfig: CollectionConfig = {
142
+ slug: 'pages',
143
+ fields: [
144
+ createParentField(
145
+ // First argument is equal to the slug of the collection
146
+ // that the field references
147
+ 'pages',
148
+
149
+ // Second argument is equal to field overrides that you specify,
150
+ // which will be merged into the base parent field config
151
+ {
152
+ admin: {
153
+ position: 'sidebar',
154
+ },
155
+ },
156
+ ),
157
+ createBreadcrumbsField(
158
+ // First argument is equal to the slug of the collection
159
+ // that the field references
160
+ 'pages',
161
+
162
+ // Argument equal to field overrides that you specify,
163
+ // which will be merged into the base `breadcrumbs` field config
164
+ {
165
+ label: 'Page Breadcrumbs',
166
+ }
167
+ )
168
+ ]
169
+ }
170
+ ```
171
+
172
+ ## TypeScript
173
+
174
+ All types can be directly imported:
175
+ ```js
176
+ import {
177
+ nestedDocsConfig,
178
+ GenerateURL,
179
+ GenerateLabel
180
+ } from '@payloadcms/plugin-nested-docs/dist/types';
181
+ ```
182
+
183
+ ## Screenshots
184
+
185
+ <!-- ![screenshot 1](https://github.com/trouble/@payloadcms/plugin-nested-docs/blob/main/images/screenshot-1.jpg?raw=true) -->
@@ -0,0 +1,4 @@
1
+ import { ArrayField } from 'payload/dist/fields/config/types';
2
+ import { Field } from 'payload/types';
3
+ declare const createBreadcrumbsField: (relationTo: string, overrides?: Partial<ArrayField>) => Field;
4
+ export default createBreadcrumbsField;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
14
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
15
+ if (ar || !(i in from)) {
16
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
17
+ ar[i] = from[i];
18
+ }
19
+ }
20
+ return to.concat(ar || Array.prototype.slice.call(from));
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ var createBreadcrumbsField = function (relationTo, overrides) {
24
+ if (overrides === void 0) { overrides = {}; }
25
+ return (__assign({ name: 'breadcrumbs', type: 'array', fields: __spreadArray([
26
+ {
27
+ name: 'doc',
28
+ type: 'relationship',
29
+ relationTo: relationTo,
30
+ maxDepth: 0,
31
+ admin: {
32
+ disabled: true,
33
+ },
34
+ },
35
+ {
36
+ type: 'row',
37
+ fields: [
38
+ {
39
+ name: 'url',
40
+ label: 'URL',
41
+ type: 'text',
42
+ admin: {
43
+ width: '50%',
44
+ },
45
+ },
46
+ {
47
+ name: 'label',
48
+ type: 'text',
49
+ admin: {
50
+ width: '50%',
51
+ },
52
+ },
53
+ ],
54
+ }
55
+ ], (overrides === null || overrides === void 0 ? void 0 : overrides.fields) || [], true), admin: __assign({ readOnly: true }, (overrides === null || overrides === void 0 ? void 0 : overrides.admin) || {}) }, overrides || {}));
56
+ };
57
+ exports.default = createBreadcrumbsField;
58
+ //# sourceMappingURL=breadcrumbs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breadcrumbs.js","sourceRoot":"","sources":["../../src/fields/breadcrumbs.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAGA,IAAM,sBAAsB,GAAG,UAAC,UAAkB,EAAE,SAAmC;IAAnC,0BAAA,EAAA,cAAmC;IAAY,OAAA,YACjG,IAAI,EAAE,aAAa,EACnB,IAAI,EAAE,OAAO,EACb,MAAM;YACJ;gBACE,IAAI,EAAE,KAAK;gBACX,IAAI,EAAE,cAAc;gBACpB,UAAU,YAAA;gBACV,QAAQ,EAAE,CAAC;gBACX,KAAK,EAAE;oBACL,QAAQ,EAAE,IAAI;iBACf;aACF;YACD;gBACE,IAAI,EAAE,KAAK;gBACX,MAAM,EAAE;oBACN;wBACE,IAAI,EAAE,KAAK;wBACX,KAAK,EAAE,KAAK;wBACZ,IAAI,EAAE,MAAM;wBACZ,KAAK,EAAE;4BACL,KAAK,EAAE,KAAK;yBACb;qBACF;oBACD;wBACE,IAAI,EAAE,OAAO;wBACb,IAAI,EAAE,MAAM;wBACZ,KAAK,EAAE;4BACL,KAAK,EAAE,KAAK;yBACb;qBACF;iBACF;aACF;WACE,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,MAAM,KAAI,EAAE,SAE5B,KAAK,aACH,QAAQ,EAAE,IAAI,IACX,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,KAAI,EAAE,KAExB,SAAS,IAAI,EAAE,EAClB;AAxCiG,CAwCjG,CAAC;AAEH,kBAAe,sBAAsB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { RelationshipField } from 'payload/dist/fields/config/types';
2
+ import { Field } from 'payload/types';
3
+ declare const createParentField: (relationTo: string, overrides?: Partial<RelationshipField> | undefined) => Field;
4
+ export default createParentField;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ var createParentField = function (relationTo, overrides) { return (__assign({ name: 'parent', relationTo: relationTo, type: 'relationship', maxDepth: 1, admin: __assign({ position: 'sidebar' }, (overrides === null || overrides === void 0 ? void 0 : overrides.admin) || {}) }, overrides || {})); };
15
+ exports.default = createParentField;
16
+ //# sourceMappingURL=parent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parent.js","sourceRoot":"","sources":["../../src/fields/parent.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAGA,IAAM,iBAAiB,GAAG,UAAC,UAAkB,EAAE,SAAsC,IAAY,OAAA,YAC/F,IAAI,EAAE,QAAQ,EACd,UAAU,YAAA,EACV,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,CAAC,EACX,KAAK,aACH,QAAQ,EAAE,SAAS,IAChB,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,KAAI,EAAE,KAExB,SAAS,IAAI,EAAE,EAClB,EAV+F,CAU/F,CAAC;AAEH,kBAAe,iBAAiB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { CollectionConfig, CollectionAfterChangeHook } from 'payload/types';
2
+ import { Options } from '../types';
3
+ declare const resaveChildren: (options: Options, collection: CollectionConfig) => CollectionAfterChangeHook;
4
+ export default resaveChildren;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (_) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __importDefault = (this && this.__importDefault) || function (mod) {
50
+ return (mod && mod.__esModule) ? mod : { "default": mod };
51
+ };
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ var populateBreadcrumbs_1 = __importDefault(require("../utilities/populateBreadcrumbs"));
54
+ var resaveChildren = function (options, collection) { return function (_a) {
55
+ var payload = _a.req.payload, req = _a.req, doc = _a.doc;
56
+ var resaveChildrenAsync = function () { return __awaiter(void 0, void 0, void 0, function () {
57
+ var children;
58
+ return __generator(this, function (_a) {
59
+ switch (_a.label) {
60
+ case 0: return [4 /*yield*/, payload.find({
61
+ collection: collection.slug,
62
+ where: {
63
+ parent: {
64
+ equals: doc.id,
65
+ },
66
+ },
67
+ depth: 0,
68
+ })];
69
+ case 1:
70
+ children = _a.sent();
71
+ try {
72
+ children.docs.forEach(function (child) {
73
+ payload.update({
74
+ id: child.id,
75
+ collection: collection.slug,
76
+ data: __assign(__assign({}, child), { breadcrumbs: (0, populateBreadcrumbs_1.default)(req, options, collection, child) }),
77
+ depth: 0,
78
+ });
79
+ });
80
+ }
81
+ catch (err) {
82
+ console.error(err);
83
+ }
84
+ return [2 /*return*/];
85
+ }
86
+ });
87
+ }); };
88
+ // Non-blocking
89
+ resaveChildrenAsync();
90
+ return undefined;
91
+ }; };
92
+ exports.default = resaveChildren;
93
+ //# sourceMappingURL=resaveChildren.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resaveChildren.js","sourceRoot":"","sources":["../../src/hooks/resaveChildren.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,yFAAmE;AAGnE,IAAM,cAAc,GAAG,UAAC,OAAgB,EAAE,UAA4B,IAAgC,OAAA,UAAC,EAA8B;QAArB,OAAO,iBAAA,EAAI,GAAG,SAAA,EAAE,GAAG,SAAA;IACjI,IAAM,mBAAmB,GAAG;;;;wBACT,qBAAM,OAAO,CAAC,IAAI,CAAC;wBAClC,UAAU,EAAE,UAAU,CAAC,IAAI;wBAC3B,KAAK,EAAE;4BACL,MAAM,EAAE;gCACN,MAAM,EAAE,GAAG,CAAC,EAAE;6BACf;yBACF;wBACD,KAAK,EAAE,CAAC;qBACT,CAAC,EAAA;;oBARI,QAAQ,GAAG,SAQf;oBAEF,IAAI;wBACF,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,UAAC,KAAK;4BAC1B,OAAO,CAAC,MAAM,CAAC;gCACb,EAAE,EAAE,KAAK,CAAC,EAAE;gCACZ,UAAU,EAAE,UAAU,CAAC,IAAI;gCAC3B,IAAI,wBACC,KAAK,KACR,WAAW,EAAE,IAAA,6BAAmB,EAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,GAClE;gCACD,KAAK,EAAE,CAAC;6BACT,CAAC,CAAC;wBACL,CAAC,CAAC,CAAC;qBACJ;oBAAC,OAAO,GAAG,EAAE;wBACZ,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;qBACpB;;;;SACF,CAAC;IAEF,eAAe;IACf,mBAAmB,EAAE,CAAC;IAEtB,OAAO,SAAS,CAAC;AACnB,CAAC,EAjCqG,CAiCrG,CAAC;AAEF,kBAAe,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { CollectionConfig, CollectionAfterChangeHook } from 'payload/types';
2
+ declare const resaveSelfAfterCreate: (collection: CollectionConfig) => CollectionAfterChangeHook;
3
+ export default resaveSelfAfterCreate;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (_) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ var resaveSelfAfterCreate = function (collection) { return function (_a) {
51
+ var payload = _a.req.payload, req = _a.req, doc = _a.doc, operation = _a.operation;
52
+ return __awaiter(void 0, void 0, void 0, function () {
53
+ var _b, breadcrumbs, originalDocWithDepth0;
54
+ return __generator(this, function (_c) {
55
+ switch (_c.label) {
56
+ case 0:
57
+ _b = doc.breadcrumbs, breadcrumbs = _b === void 0 ? [] : _b;
58
+ if (!(operation === 'create')) return [3 /*break*/, 2];
59
+ return [4 /*yield*/, payload.findByID({
60
+ collection: collection.slug,
61
+ depth: 0,
62
+ id: doc.id,
63
+ })];
64
+ case 1:
65
+ originalDocWithDepth0 = _c.sent();
66
+ payload.update({
67
+ collection: collection.slug,
68
+ id: doc.id,
69
+ depth: 0,
70
+ data: __assign(__assign({}, originalDocWithDepth0), { breadcrumbs: breadcrumbs.map(function (crumb, i) { return (__assign(__assign({}, crumb), { doc: (breadcrumbs === null || breadcrumbs === void 0 ? void 0 : breadcrumbs.length) === i + 1 ? doc.id : crumb.doc })); }) }),
71
+ });
72
+ _c.label = 2;
73
+ case 2: return [2 /*return*/, undefined];
74
+ }
75
+ });
76
+ });
77
+ }; };
78
+ exports.default = resaveSelfAfterCreate;
79
+ //# sourceMappingURL=resaveSelfAfterCreate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resaveSelfAfterCreate.js","sourceRoot":"","sources":["../../src/hooks/resaveSelfAfterCreate.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,IAAM,qBAAqB,GAAG,UAAC,UAA4B,IAAgC,OAAA,UAAO,EAAyC;QAAhC,OAAO,iBAAA,EAAI,GAAG,SAAA,EAAE,GAAG,SAAA,EAAE,SAAS,eAAA;;;;;;oBAC/H,KAAqB,GAAyB,YAA9B,EAAhB,WAAW,mBAAG,EAAE,KAAA,CAA+B;yBAEnD,CAAA,SAAS,KAAK,QAAQ,CAAA,EAAtB,wBAAsB;oBACM,qBAAM,OAAO,CAAC,QAAQ,CAAC;4BACnD,UAAU,EAAE,UAAU,CAAC,IAAI;4BAC3B,KAAK,EAAE,CAAC;4BACR,EAAE,EAAE,GAAG,CAAC,EAAE;yBACX,CAAC,EAAA;;oBAJI,qBAAqB,GAAG,SAI5B;oBAEF,OAAO,CAAC,MAAM,CAAC;wBACb,UAAU,EAAE,UAAU,CAAC,IAAI;wBAC3B,EAAE,EAAE,GAAG,CAAC,EAAE;wBACV,KAAK,EAAE,CAAC;wBACR,IAAI,wBACC,qBAAqB,KACxB,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,UAAC,KAAK,EAAE,CAAC,IAAK,OAAA,uBACtC,KAAK,KACR,GAAG,EAAE,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,MAAM,MAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IACvD,EAHyC,CAGzC,CAAC,GACJ;qBACF,CAAC,CAAC;;wBAGL,sBAAO,SAAS,EAAC;;;;CAClB,EAzB0F,CAyB1F,CAAC;AAEF,kBAAe,qBAAqB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Config } from 'payload/config';
2
+ import { Options } from './types';
3
+ declare const nestedDocs: (options: Options) => (config: Config) => Config;
4
+ export default nestedDocs;
package/dist/index.js ADDED
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (_) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
50
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
51
+ if (ar || !(i in from)) {
52
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
53
+ ar[i] = from[i];
54
+ }
55
+ }
56
+ return to.concat(ar || Array.prototype.slice.call(from));
57
+ };
58
+ var __importDefault = (this && this.__importDefault) || function (mod) {
59
+ return (mod && mod.__esModule) ? mod : { "default": mod };
60
+ };
61
+ Object.defineProperty(exports, "__esModule", { value: true });
62
+ var breadcrumbs_1 = __importDefault(require("./fields/breadcrumbs"));
63
+ var parent_1 = __importDefault(require("./fields/parent"));
64
+ var populateBreadcrumbs_1 = __importDefault(require("./utilities/populateBreadcrumbs"));
65
+ var resaveChildren_1 = __importDefault(require("./hooks/resaveChildren"));
66
+ var resaveSelfAfterCreate_1 = __importDefault(require("./hooks/resaveSelfAfterCreate"));
67
+ var nestedDocs = function (options) { return function (config) { return (__assign(__assign({}, config), { collections: (config.collections || []).map(function (collection) {
68
+ var _a, _b;
69
+ if (options.collections.indexOf(collection.slug) > -1) {
70
+ var fields = __spreadArray([], (collection === null || collection === void 0 ? void 0 : collection.fields) || [], true);
71
+ if (!options.parentFieldSlug) {
72
+ fields.push((0, parent_1.default)(collection.slug));
73
+ }
74
+ if (!options.breadcrumbsFieldSlug) {
75
+ fields.push((0, breadcrumbs_1.default)(collection.slug));
76
+ }
77
+ return __assign(__assign({}, collection), { hooks: __assign(__assign({}, collection.hooks || {}), { beforeChange: __spreadArray([
78
+ function (_a) {
79
+ var req = _a.req, data = _a.data, originalDoc = _a.originalDoc;
80
+ return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_b) {
81
+ return [2 /*return*/, (0, populateBreadcrumbs_1.default)(req, options, collection, data, originalDoc)];
82
+ }); });
83
+ }
84
+ ], ((_a = collection === null || collection === void 0 ? void 0 : collection.hooks) === null || _a === void 0 ? void 0 : _a.beforeChange) || [], true), afterChange: __spreadArray([
85
+ (0, resaveChildren_1.default)(options, collection),
86
+ (0, resaveSelfAfterCreate_1.default)(collection)
87
+ ], ((_b = collection === null || collection === void 0 ? void 0 : collection.hooks) === null || _b === void 0 ? void 0 : _b.afterChange) || [], true) }), fields: fields });
88
+ }
89
+ return collection;
90
+ }) })); }; };
91
+ exports.default = nestedDocs;
92
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,qEAA0D;AAC1D,2DAAgD;AAChD,wFAAkE;AAClE,0EAAoD;AACpD,wFAAkE;AAElE,IAAM,UAAU,GAAG,UAAC,OAAgB,IAAK,OAAA,UAAC,MAAc,IAAa,OAAA,uBAChE,MAAM,KACT,WAAW,EAAE,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,UAAC,UAAU;;QACrD,IAAI,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;YACrD,IAAM,MAAM,qBAAO,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,KAAI,EAAE,OAAC,CAAC;YAE7C,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE;gBAC5B,MAAM,CAAC,IAAI,CAAC,IAAA,gBAAiB,EAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;aACjD;YAED,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE;gBACjC,MAAM,CAAC,IAAI,CAAC,IAAA,qBAAsB,EAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;aACtD;YAED,6BACK,UAAU,KACb,KAAK,wBACA,UAAU,CAAC,KAAK,IAAI,EAAE,KACzB,YAAY;wBACV,UAAO,EAA0B;gCAAxB,GAAG,SAAA,EAAE,IAAI,UAAA,EAAE,WAAW,iBAAA;;gCAAO,sBAAA,IAAA,6BAAmB,EAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,CAAC,EAAA;;yBAAA;uBACnG,CAAA,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,KAAK,0CAAE,YAAY,KAAI,EAAE,SAE1C,WAAW;wBACT,IAAA,wBAAc,EAAC,OAAO,EAAE,UAAU,CAAC;wBACnC,IAAA,+BAAqB,EAAC,UAAU,CAAC;uBAC9B,CAAA,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,KAAK,0CAAE,WAAW,KAAI,EAAE,YAG3C,MAAM,QAAA,IACN;SACH;QAED,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC,IACF,EAlCmE,CAkCnE,EAlCuC,CAkCvC,CAAC;AAEH,kBAAe,UAAU,CAAC"}
@@ -0,0 +1,14 @@
1
+ export declare type Breadcrumb = {
2
+ url?: string;
3
+ label: string;
4
+ doc: string;
5
+ };
6
+ export declare type GenerateURL = (docs: Record<string, unknown>[], currentDoc: Record<string, unknown>) => string;
7
+ export declare type GenerateLabel = (docs: Record<string, unknown>[], currentDoc: Record<string, unknown>) => string;
8
+ export declare type Options = {
9
+ collections: string[];
10
+ generateURL?: GenerateURL;
11
+ generateLabel?: GenerateLabel;
12
+ parentFieldSlug?: string;
13
+ breadcrumbsFieldSlug?: string;
14
+ };
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import { CollectionConfig } from 'payload/types';
2
+ import { Options, Breadcrumb } from '../types';
3
+ declare const formatBreadcrumb: (options: Options, collection: CollectionConfig, docs: Record<string, unknown>[]) => Breadcrumb;
4
+ export default formatBreadcrumb;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var formatBreadcrumb = function (options, collection, docs) {
4
+ var _a;
5
+ var url = undefined;
6
+ var label;
7
+ var lastDoc = docs[docs.length - 1];
8
+ if (typeof (options === null || options === void 0 ? void 0 : options.generateURL) === 'function') {
9
+ url = options.generateURL(docs, lastDoc);
10
+ }
11
+ if (typeof (options === null || options === void 0 ? void 0 : options.generateLabel) === 'function') {
12
+ label = options.generateLabel(docs, lastDoc);
13
+ }
14
+ else {
15
+ var useAsTitle = ((_a = collection === null || collection === void 0 ? void 0 : collection.admin) === null || _a === void 0 ? void 0 : _a.useAsTitle) || 'id';
16
+ label = lastDoc[useAsTitle];
17
+ }
18
+ return {
19
+ label: label,
20
+ url: url,
21
+ doc: lastDoc.id,
22
+ };
23
+ };
24
+ exports.default = formatBreadcrumb;
25
+ //# sourceMappingURL=formatBreadcrumb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatBreadcrumb.js","sourceRoot":"","sources":["../../src/utilities/formatBreadcrumb.ts"],"names":[],"mappings":";;AAGA,IAAM,gBAAgB,GAAG,UACvB,OAAgB,EAChB,UAA4B,EAC5B,IAA+B;;IAE/B,IAAI,GAAG,GAAuB,SAAS,CAAC;IACxC,IAAI,KAAa,CAAC;IAElB,IAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEtC,IAAI,OAAO,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,CAAA,KAAK,UAAU,EAAE;QAC9C,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;KAC1C;IAED,IAAI,OAAO,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,CAAA,KAAK,UAAU,EAAE;QAChD,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;KAC9C;SAAM;QACL,IAAM,UAAU,GAAG,CAAA,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,KAAK,0CAAE,UAAU,KAAI,IAAI,CAAC;QACzD,KAAK,GAAG,OAAO,CAAC,UAAU,CAAW,CAAC;KACvC;IAED,OAAO;QACL,KAAK,OAAA;QACL,GAAG,KAAA;QACH,GAAG,EAAE,OAAO,CAAC,EAAY;KAC1B,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,gBAAgB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { CollectionConfig } from 'payload/types';
2
+ import { Options } from '../types';
3
+ declare const getParents: (req: any, options: Options, collection: CollectionConfig, doc: Record<string, unknown>, docs?: Record<string, unknown>[]) => Promise<Record<string, unknown>[]>;
4
+ export default getParents;
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
39
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
40
+ if (ar || !(i in from)) {
41
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
42
+ ar[i] = from[i];
43
+ }
44
+ }
45
+ return to.concat(ar || Array.prototype.slice.call(from));
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ var getParents = function (req, options, collection, doc, docs) {
49
+ if (docs === void 0) { docs = []; }
50
+ return __awaiter(void 0, void 0, void 0, function () {
51
+ var parent, retrievedParent;
52
+ return __generator(this, function (_a) {
53
+ switch (_a.label) {
54
+ case 0:
55
+ parent = doc[(options === null || options === void 0 ? void 0 : options.parentFieldSlug) || 'parent'];
56
+ if (!parent) return [3 /*break*/, 3];
57
+ if (!(typeof parent === 'string')) return [3 /*break*/, 2];
58
+ return [4 /*yield*/, req.payload.findByID({
59
+ req: req,
60
+ id: parent,
61
+ collection: collection.slug,
62
+ depth: 0,
63
+ disableErrors: true,
64
+ })];
65
+ case 1:
66
+ retrievedParent = _a.sent();
67
+ _a.label = 2;
68
+ case 2:
69
+ // If auto-populated
70
+ if (typeof parent === 'object') {
71
+ retrievedParent = parent;
72
+ }
73
+ if (retrievedParent) {
74
+ if (retrievedParent.parent) {
75
+ return [2 /*return*/, getParents(req, options, collection, retrievedParent, __spreadArray([
76
+ retrievedParent
77
+ ], docs, true))];
78
+ }
79
+ return [2 /*return*/, __spreadArray([
80
+ retrievedParent
81
+ ], docs, true)];
82
+ }
83
+ _a.label = 3;
84
+ case 3: return [2 /*return*/, docs];
85
+ }
86
+ });
87
+ });
88
+ };
89
+ exports.default = getParents;
90
+ //# sourceMappingURL=getParents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getParents.js","sourceRoot":"","sources":["../../src/utilities/getParents.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,IAAM,UAAU,GAAG,UACjB,GAAQ,EACR,OAAgB,EAChB,UAA4B,EAC5B,GAA4B,EAC5B,IAAoC;IAApC,qBAAA,EAAA,SAAoC;;;;;;oBAE9B,MAAM,GAAG,GAAG,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe,KAAI,QAAQ,CAAC,CAAC;yBAGrD,MAAM,EAAN,wBAAM;yBAEJ,CAAA,OAAO,MAAM,KAAK,QAAQ,CAAA,EAA1B,wBAA0B;oBACV,qBAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;4BAC3C,GAAG,KAAA;4BACH,EAAE,EAAE,MAAM;4BACV,UAAU,EAAE,UAAU,CAAC,IAAI;4BAC3B,KAAK,EAAE,CAAC;4BACR,aAAa,EAAE,IAAI;yBACpB,CAAC,EAAA;;oBANF,eAAe,GAAG,SAMhB,CAAC;;;oBAGL,oBAAoB;oBACpB,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;wBAC9B,eAAe,GAAG,MAAM,CAAC;qBAC1B;oBAED,IAAI,eAAe,EAAE;wBACnB,IAAI,eAAe,CAAC,MAAM,EAAE;4BAC1B,sBAAO,UAAU,CACf,GAAG,EACH,OAAO,EACP,UAAU,EACV,eAAe;oCAEb,eAAe;mCACZ,IAAI,QAEV,EAAC;yBACH;wBAED;gCACE,eAAe;+BACZ,IAAI,SACP;qBACH;;wBAGH,sBAAO,IAAI,EAAC;;;;CACb,CAAC;AAEF,kBAAe,UAAU,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { CollectionConfig } from 'payload/types';
2
+ import { Options } from '../types';
3
+ declare const populateBreadcrumbs: (req: any, options: Options, collection: CollectionConfig, data: any, originalDoc?: any) => Promise<any>;
4
+ export default populateBreadcrumbs;
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (_) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
50
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
51
+ if (ar || !(i in from)) {
52
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
53
+ ar[i] = from[i];
54
+ }
55
+ }
56
+ return to.concat(ar || Array.prototype.slice.call(from));
57
+ };
58
+ var __importDefault = (this && this.__importDefault) || function (mod) {
59
+ return (mod && mod.__esModule) ? mod : { "default": mod };
60
+ };
61
+ Object.defineProperty(exports, "__esModule", { value: true });
62
+ var getParents_1 = __importDefault(require("./getParents"));
63
+ var formatBreadcrumb_1 = __importDefault(require("./formatBreadcrumb"));
64
+ var populateBreadcrumbs = function (req, options, collection, data, originalDoc) { return __awaiter(void 0, void 0, void 0, function () {
65
+ var newData, breadcrumbDocs, _a, breadcrumbs;
66
+ var _b;
67
+ return __generator(this, function (_c) {
68
+ switch (_c.label) {
69
+ case 0:
70
+ newData = data;
71
+ _a = [[]];
72
+ return [4 /*yield*/, (0, getParents_1.default)(req, options, collection, __assign(__assign({}, originalDoc), data))];
73
+ case 1:
74
+ breadcrumbDocs = __spreadArray.apply(void 0, [__spreadArray.apply(void 0, _a.concat([_c.sent(), true])), [
75
+ __assign(__assign(__assign({}, originalDoc), data), { id: originalDoc === null || originalDoc === void 0 ? void 0 : originalDoc.id }),
76
+ ], false]);
77
+ breadcrumbs = breadcrumbDocs.map(function (_, i) { return (0, formatBreadcrumb_1.default)(options, collection, breadcrumbDocs.slice(0, i + 1)); });
78
+ return [2 /*return*/, __assign(__assign({}, newData), (_b = {}, _b[(options === null || options === void 0 ? void 0 : options.breadcrumbsFieldSlug) || 'breadcrumbs'] = breadcrumbs, _b))];
79
+ }
80
+ });
81
+ }); };
82
+ exports.default = populateBreadcrumbs;
83
+ //# sourceMappingURL=populateBreadcrumbs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"populateBreadcrumbs.js","sourceRoot":"","sources":["../../src/utilities/populateBreadcrumbs.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,4DAAsC;AACtC,wEAAkD;AAElD,IAAM,mBAAmB,GAAG,UAAO,GAAQ,EAAE,OAAgB,EAAE,UAA4B,EAAE,IAAS,EAAE,WAAiB;;;;;;gBACjH,OAAO,GAAG,IAAI,CAAC;;gBAEhB,qBAAM,IAAA,oBAAU,EAAC,GAAG,EAAE,OAAO,EAAE,UAAU,wBACvC,WAAW,GACX,IAAI,EACP,EAAA;;gBAJE,cAAc,uEACf,SAGD;uDAEG,WAAW,GACX,IAAI,KACP,EAAE,EAAE,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,EAAE;8BAEtB;gBAEK,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,IAAA,0BAAgB,EAAC,OAAO,EAAE,UAAU,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAArE,CAAqE,CAAC,CAAC;gBAExH,4CACK,OAAO,gBACT,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,oBAAoB,KAAI,aAAa,IAAG,WAAW,QAC7D;;;KACH,CAAC;AAEF,kBAAe,mBAAmB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@payloadcms/plugin-nested-docs",
3
+ "version": "1.0.0",
4
+ "description": "Nested documents plugin for Payload CMS",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "test": "echo \"Error: no test specified\" && exit 1"
10
+ },
11
+ "keywords": [
12
+ "payload",
13
+ "cms",
14
+ "plugin",
15
+ "typescript",
16
+ "react",
17
+ "breadcrumbs",
18
+ "nested pages",
19
+ "parent pages"
20
+ ],
21
+ "author": "dev@payloadcms.com",
22
+ "license": "MIT",
23
+ "peerDependencies": {
24
+ "payload": "^0.15.6",
25
+ "react": "^17.0.2"
26
+ },
27
+ "devDependencies": {
28
+ "payload": "^0.15.6",
29
+ "react": "^17.0.2",
30
+ "typescript": "^4.5.5"
31
+ },
32
+ "files": [
33
+ "dist"
34
+ ]
35
+ }