apostrophe 3.62.0 → 3.63.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBar.vue +1 -1
  3. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextBar.vue +6 -4
  4. package/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue +9 -1
  5. package/modules/@apostrophecms/area/ui/apos/components/AposAreaWidget.vue +8 -0
  6. package/modules/@apostrophecms/area/ui/apos/components/AposWidgetControls.vue +6 -3
  7. package/modules/@apostrophecms/doc/index.js +254 -5
  8. package/modules/@apostrophecms/doc/ui/apos/mixins/AposFieldMetaUtilsMixin.js +93 -0
  9. package/modules/@apostrophecms/doc-type/index.js +70 -10
  10. package/modules/@apostrophecms/doc-type/ui/apos/components/AposDocEditor.vue +2 -0
  11. package/modules/@apostrophecms/doc-type/ui/apos/logic/AposDocContextMenu.js +12 -3
  12. package/modules/@apostrophecms/i18n/i18n/en.json +1 -0
  13. package/modules/@apostrophecms/login/index.js +25 -19
  14. package/modules/@apostrophecms/login/ui/apos/components/AposLoginForm.vue +11 -1
  15. package/modules/@apostrophecms/login/ui/apos/logic/AposLoginForm.js +46 -2
  16. package/modules/@apostrophecms/modal/ui/apos/components/AposModalShareDraft.vue +8 -3
  17. package/modules/@apostrophecms/modal/ui/apos/mixins/AposEditorMixin.js +3 -0
  18. package/modules/@apostrophecms/page/index.js +87 -20
  19. package/modules/@apostrophecms/page-type/index.js +67 -2
  20. package/modules/@apostrophecms/piece-type/index.js +1 -34
  21. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManager.vue +8 -0
  22. package/modules/@apostrophecms/piece-type/ui/apos/components/AposUtilityOperations.vue +16 -1
  23. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposRichTextWidgetEditor.vue +8 -0
  24. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapImage.vue +7 -7
  25. package/modules/@apostrophecms/schema/index.js +9 -0
  26. package/modules/@apostrophecms/schema/lib/addFieldTypes.js +3 -0
  27. package/modules/@apostrophecms/schema/ui/apos/components/AposArrayEditor.vue +1 -0
  28. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArea.vue +3 -0
  29. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArray.vue +4 -8
  30. package/modules/@apostrophecms/schema/ui/apos/components/AposInputObject.vue +2 -0
  31. package/modules/@apostrophecms/schema/ui/apos/components/AposInputSlug.vue +1 -0
  32. package/modules/@apostrophecms/schema/ui/apos/components/AposInputString.vue +1 -0
  33. package/modules/@apostrophecms/schema/ui/apos/components/AposInputWrapper.vue +74 -29
  34. package/modules/@apostrophecms/schema/ui/apos/components/AposSchema.vue +1 -0
  35. package/modules/@apostrophecms/schema/ui/apos/components/AposSearchList.vue +1 -1
  36. package/modules/@apostrophecms/schema/ui/apos/logic/AposArrayEditor.js +7 -0
  37. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArea.js +13 -1
  38. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArray.js +5 -1
  39. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputObject.js +21 -0
  40. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputWrapper.js +35 -0
  41. package/modules/@apostrophecms/schema/ui/apos/logic/AposSchema.js +6 -0
  42. package/modules/@apostrophecms/schema/ui/apos/mixins/AposInputMixin.js +41 -0
  43. package/modules/@apostrophecms/ui/ui/apos/mixins/AposPublishMixin.js +10 -4
  44. package/modules/@apostrophecms/widget-type/ui/apos/components/AposWidgetEditor.vue +7 -0
  45. package/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js +6 -0
  46. package/package.json +3 -3
  47. package/test/areas.js +1 -1
  48. package/test/assets.js +2 -2
  49. package/test/attachments.js +2 -2
  50. package/test/base-module.js +2 -1
  51. package/test/base-url-env-var.js +2 -2
  52. package/test/change-doc-ids.js +33 -31
  53. package/test/command-menu.js +2 -2
  54. package/test/content-i18n.js +47 -46
  55. package/test/db.js +2 -2
  56. package/test/docs.js +301 -126
  57. package/test/draft-published.js +2 -2
  58. package/test/email.js +2 -1
  59. package/test/express.js +3 -2
  60. package/test/external-front.js +4 -4
  61. package/test/field-meta.js +363 -0
  62. package/test/global.js +2 -1
  63. package/test/http.js +4 -2
  64. package/test/images.js +87 -88
  65. package/test/job.js +34 -34
  66. package/test/locks.js +2 -2
  67. package/test/login-requirements.js +3 -2
  68. package/test/middleware-and-route-order.js +2 -2
  69. package/test/page-type.js +2 -1
  70. package/test/pages-autocomplete.js +0 -11
  71. package/test/pages-public-api.js +2 -2
  72. package/test/pages-rest.js +4 -4
  73. package/test/pages.js +389 -57
  74. package/test/parked-pages.js +47 -47
  75. package/test/pieces-page-type.js +2 -1
  76. package/test/pieces-public-api.js +38 -38
  77. package/test/pieces.js +4 -4
  78. package/test/published-pages.js +16 -16
  79. package/test/schemaBuilders.js +4 -4
  80. package/test/schemas.js +220 -221
  81. package/test/search.js +2 -2
  82. package/test/soft-redirects.js +2 -1
  83. package/test/templates.js +2 -2
  84. package/test/users.js +2 -1
package/test/schemas.js CHANGED
@@ -2,242 +2,242 @@ const assert = require('assert').strict;
2
2
  const _ = require('lodash');
3
3
  const t = require('../test-lib/test.js');
4
4
 
5
- let apos;
6
-
7
- const simpleFields = [
8
- {
9
- name: 'name',
10
- label: 'Name',
11
- type: 'string'
12
- },
13
- {
14
- name: 'address',
15
- label: 'Address',
16
- type: 'string',
17
- textarea: true
18
- },
19
- {
20
- name: 'variety',
21
- label: 'Variety',
22
- type: 'select',
23
- choices: [
24
- {
25
- value: 'candy',
26
- label: 'Candy'
27
- },
28
- {
29
- value: 'cheese',
30
- label: 'Cheese'
31
- }
32
- ],
33
- def: 'candy'
34
- },
35
- {
36
- name: 'slug',
37
- label: 'Slug',
38
- type: 'slug'
39
- }
40
- ];
5
+ describe('Schemas', function() {
41
6
 
42
- const realWorldCase = {
43
- addFields: [
44
- {
45
- type: 'string',
46
- name: 'title',
47
- label: 'Title',
48
- required: true,
49
- sortify: true
50
- },
51
- {
52
- type: 'slug',
53
- name: 'slug',
54
- label: 'Slug',
55
- required: true
56
- },
7
+ let apos;
8
+
9
+ const simpleFields = [
57
10
  {
58
- type: 'boolean',
59
- name: 'archive',
60
- label: 'apostrophe:archived',
61
- contextual: true,
62
- def: false
11
+ name: 'name',
12
+ label: 'Name',
13
+ type: 'string'
63
14
  },
64
15
  {
65
- type: 'slug',
66
- name: 'slug',
67
- label: 'Old URL',
68
- required: true,
69
- page: true
70
- },
71
- {
72
- name: 'title',
73
- label: 'Description',
16
+ name: 'address',
17
+ label: 'Address',
74
18
  type: 'string',
75
- required: true
19
+ textarea: true
76
20
  },
77
21
  {
78
- name: 'urlType',
79
- label: 'Link To',
22
+ name: 'variety',
23
+ label: 'Variety',
80
24
  type: 'select',
81
25
  choices: [
82
26
  {
83
- label: 'Internal Page',
84
- value: 'internal'
27
+ value: 'candy',
28
+ label: 'Candy'
85
29
  },
86
30
  {
87
- label: 'External URL',
88
- value: 'external'
31
+ value: 'cheese',
32
+ label: 'Cheese'
89
33
  }
90
- ]
91
- },
92
- {
93
- name: 'externalUrl',
94
- label: 'URL',
95
- type: 'url',
96
- if: {
97
- urlType: 'external'
98
- }
99
- },
100
- {
101
- name: '_newPage',
102
- type: 'relationship',
103
- limit: 1,
104
- withType: '@apostrophecms/any-page-type',
105
- label: 'Page Title',
106
- idsStorage: 'pageId',
107
- if: {
108
- urlType: 'internal'
109
- }
110
- }
111
- ],
112
- arrangeFields: [
113
- {
114
- name: 'basics',
115
- label: 'Basics',
116
- fields: [
117
- 'title',
118
- 'slug'
119
- ]
120
- },
121
- {
122
- name: 'permissions',
123
- label: 'Permissions',
124
- fields: [
125
- 'visibility'
126
34
  ],
127
- last: true
35
+ def: 'candy'
128
36
  },
129
37
  {
130
- name: 'otherFields',
131
- label: 'Other fields',
132
- fields: [
133
- 'slug',
134
- 'urlType',
135
- '_newPage',
136
- 'title',
137
- 'externalUrl'
138
- ]
38
+ name: 'slug',
39
+ label: 'Slug',
40
+ type: 'slug'
139
41
  }
140
- ]
141
- };
142
-
143
- const pageSlug = [
144
- {
145
- type: 'slug',
146
- name: 'slug',
147
- page: true
148
- }
149
- ];
42
+ ];
150
43
 
151
- const regularSlug = [
152
- {
153
- type: 'slug',
154
- name: 'slug'
155
- }
156
- ];
157
-
158
- const hasArea = {
159
- addFields: [
160
- {
161
- type: 'area',
162
- name: 'body',
163
- label: 'Body',
164
- options: {
165
- widgets: {
166
- '@apostrophecms/rich-text': {
167
- toolbar: [ 'styles', 'bold' ],
168
- styles: [
169
- {
170
- tag: 'p',
171
- label: 'Paragraph'
172
- },
173
- {
174
- tag: 'h4',
175
- label: 'Header 4'
176
- }
177
- ]
44
+ const realWorldCase = {
45
+ addFields: [
46
+ {
47
+ type: 'string',
48
+ name: 'title',
49
+ label: 'Title',
50
+ required: true,
51
+ sortify: true
52
+ },
53
+ {
54
+ type: 'slug',
55
+ name: 'slug',
56
+ label: 'Slug',
57
+ required: true
58
+ },
59
+ {
60
+ type: 'boolean',
61
+ name: 'archive',
62
+ label: 'apostrophe:archived',
63
+ contextual: true,
64
+ def: false
65
+ },
66
+ {
67
+ type: 'slug',
68
+ name: 'slug',
69
+ label: 'Old URL',
70
+ required: true,
71
+ page: true
72
+ },
73
+ {
74
+ name: 'title',
75
+ label: 'Description',
76
+ type: 'string',
77
+ required: true
78
+ },
79
+ {
80
+ name: 'urlType',
81
+ label: 'Link To',
82
+ type: 'select',
83
+ choices: [
84
+ {
85
+ label: 'Internal Page',
86
+ value: 'internal'
87
+ },
88
+ {
89
+ label: 'External URL',
90
+ value: 'external'
178
91
  }
92
+ ]
93
+ },
94
+ {
95
+ name: 'externalUrl',
96
+ label: 'URL',
97
+ type: 'url',
98
+ if: {
99
+ urlType: 'external'
100
+ }
101
+ },
102
+ {
103
+ name: '_newPage',
104
+ type: 'relationship',
105
+ limit: 1,
106
+ withType: '@apostrophecms/any-page-type',
107
+ label: 'Page Title',
108
+ idsStorage: 'pageId',
109
+ if: {
110
+ urlType: 'internal'
179
111
  }
180
112
  }
113
+ ],
114
+ arrangeFields: [
115
+ {
116
+ name: 'basics',
117
+ label: 'Basics',
118
+ fields: [
119
+ 'title',
120
+ 'slug'
121
+ ]
122
+ },
123
+ {
124
+ name: 'permissions',
125
+ label: 'Permissions',
126
+ fields: [
127
+ 'visibility'
128
+ ],
129
+ last: true
130
+ },
131
+ {
132
+ name: 'otherFields',
133
+ label: 'Other fields',
134
+ fields: [
135
+ 'slug',
136
+ 'urlType',
137
+ '_newPage',
138
+ 'title',
139
+ 'externalUrl'
140
+ ]
141
+ }
142
+ ]
143
+ };
144
+
145
+ const pageSlug = [
146
+ {
147
+ type: 'slug',
148
+ name: 'slug',
149
+ page: true
181
150
  }
182
- ]
183
- };
151
+ ];
184
152
 
185
- const hasGroupedArea = {
186
- addFields: [
153
+ const regularSlug = [
187
154
  {
188
- type: 'area',
189
- name: 'body',
190
- label: 'Body',
191
- options: {
192
- expanded: true,
193
- groups: {
194
- content: {
195
- label: 'Content Widgets',
196
- columns: 2,
197
- widgets: {
198
- '@apostrophecms/rich-text': {
199
- toolbar: [ 'bold' ]
200
- },
201
- '@apostrophecms/form': {}
202
- }
203
- },
204
- media: {
205
- label: 'Media',
206
- columns: 3,
207
- widgets: {
208
- '@apostrophecms/image': {},
209
- '@apostrophecms/video': {}
210
- }
211
- },
212
- layout: {
213
- label: 'Layout Widgets',
214
- columns: 4,
215
- widgets: {
216
- 'two-column': {}
155
+ type: 'slug',
156
+ name: 'slug'
157
+ }
158
+ ];
159
+
160
+ const hasArea = {
161
+ addFields: [
162
+ {
163
+ type: 'area',
164
+ name: 'body',
165
+ label: 'Body',
166
+ options: {
167
+ widgets: {
168
+ '@apostrophecms/rich-text': {
169
+ toolbar: [ 'styles', 'bold' ],
170
+ styles: [
171
+ {
172
+ tag: 'p',
173
+ label: 'Paragraph'
174
+ },
175
+ {
176
+ tag: 'h4',
177
+ label: 'Header 4'
178
+ }
179
+ ]
217
180
  }
218
181
  }
219
182
  }
220
183
  }
221
- }
222
- ]
223
- };
184
+ ]
185
+ };
224
186
 
225
- const hasAreaWithoutWidgets = {
226
- addFields: [
227
- {
228
- type: 'area',
229
- name: 'body',
230
- label: 'Body',
231
- options: {
232
- widgets: {}
187
+ const hasGroupedArea = {
188
+ addFields: [
189
+ {
190
+ type: 'area',
191
+ name: 'body',
192
+ label: 'Body',
193
+ options: {
194
+ expanded: true,
195
+ groups: {
196
+ content: {
197
+ label: 'Content Widgets',
198
+ columns: 2,
199
+ widgets: {
200
+ '@apostrophecms/rich-text': {
201
+ toolbar: [ 'bold' ]
202
+ },
203
+ '@apostrophecms/form': {}
204
+ }
205
+ },
206
+ media: {
207
+ label: 'Media',
208
+ columns: 3,
209
+ widgets: {
210
+ '@apostrophecms/image': {},
211
+ '@apostrophecms/video': {}
212
+ }
213
+ },
214
+ layout: {
215
+ label: 'Layout Widgets',
216
+ columns: 4,
217
+ widgets: {
218
+ 'two-column': {}
219
+ }
220
+ }
221
+ }
222
+ }
233
223
  }
234
- }
235
- ]
236
- };
224
+ ]
225
+ };
237
226
 
238
- const warnMessages = [];
227
+ const hasAreaWithoutWidgets = {
228
+ addFields: [
229
+ {
230
+ type: 'area',
231
+ name: 'body',
232
+ label: 'Body',
233
+ options: {
234
+ widgets: {}
235
+ }
236
+ }
237
+ ]
238
+ };
239
239
 
240
- describe('Schemas', function() {
240
+ const warnMessages = [];
241
241
 
242
242
  this.timeout(t.timeout);
243
243
 
@@ -4292,22 +4292,21 @@ describe('Schemas', function() {
4292
4292
  await testSchemaError(schema, {}, 'age', 'required');
4293
4293
  });
4294
4294
  });
4295
- });
4296
-
4297
- async function testSchemaError(schema, input, path, name) {
4298
- const req = apos.task.getReq();
4299
- const result = {};
4300
- let tooFar = false;
4301
- try {
4302
- await apos.schema.convert(req, schema, input, result);
4303
- tooFar = true;
4304
- assert(false);
4305
- } catch (e) {
4306
- if (tooFar) {
4307
- throw e;
4295
+ async function testSchemaError(schema, input, path, name) {
4296
+ const req = apos.task.getReq();
4297
+ const result = {};
4298
+ let tooFar = false;
4299
+ try {
4300
+ await apos.schema.convert(req, schema, input, result);
4301
+ tooFar = true;
4302
+ assert(false);
4303
+ } catch (e) {
4304
+ if (tooFar) {
4305
+ throw e;
4306
+ }
4307
+ assert(e.length === 1);
4308
+ assert(e[0].path === path);
4309
+ assert(e[0].name === name);
4308
4310
  }
4309
- assert(e.length === 1);
4310
- assert(e[0].path === path);
4311
- assert(e[0].name === name);
4312
4311
  }
4313
- }
4312
+ });
package/test/search.js CHANGED
@@ -2,10 +2,10 @@ const t = require('../test-lib/test.js');
2
2
  const assert = require('assert');
3
3
  const _ = require('lodash');
4
4
 
5
- let apos;
6
-
7
5
  describe('Search', function() {
8
6
 
7
+ let apos;
8
+
9
9
  this.timeout(t.timeout);
10
10
 
11
11
  after(async function() {
@@ -1,9 +1,10 @@
1
1
  const t = require('../test-lib/test.js');
2
2
  const assert = require('assert');
3
- let apos;
4
3
 
5
4
  describe('Soft Redirects', function() {
6
5
 
6
+ let apos;
7
+
7
8
  this.timeout(t.timeout);
8
9
 
9
10
  after(async function() {
package/test/templates.js CHANGED
@@ -3,10 +3,10 @@ const assert = require('assert');
3
3
  const cheerio = require('cheerio');
4
4
  const Promise = require('bluebird');
5
5
 
6
- let apos;
7
-
8
6
  describe('Templates', function() {
9
7
 
8
+ let apos;
9
+
10
10
  this.timeout(t.timeout);
11
11
 
12
12
  after(async function() {
package/test/users.js CHANGED
@@ -1,9 +1,10 @@
1
1
  const t = require('../test-lib/test.js');
2
2
  const assert = require('assert');
3
- let apos;
4
3
 
5
4
  describe('Users', function() {
6
5
 
6
+ let apos;
7
+
7
8
  // Password hashing can be slow
8
9
  this.timeout(20000);
9
10