apostrophe 3.61.1 → 3.63.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.
Files changed (104) hide show
  1. package/CHANGELOG.md +49 -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 +256 -7
  8. package/modules/@apostrophecms/doc/ui/apos/mixins/AposFieldMetaUtilsMixin.js +93 -0
  9. package/modules/@apostrophecms/doc-type/index.js +78 -12
  10. package/modules/@apostrophecms/doc-type/ui/apos/components/AposDocEditor.vue +9 -1
  11. package/modules/@apostrophecms/doc-type/ui/apos/logic/AposDocContextMenu.js +24 -6
  12. package/modules/@apostrophecms/i18n/i18n/en.json +1 -0
  13. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManager.vue +8 -7
  14. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerDisplay.vue +1 -5
  15. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerEditor.vue +5 -2
  16. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerSelections.vue +1 -5
  17. package/modules/@apostrophecms/image/ui/apos/components/AposMediaUploader.vue +4 -2
  18. package/modules/@apostrophecms/login/index.js +25 -19
  19. package/modules/@apostrophecms/login/ui/apos/components/AposLoginForm.vue +11 -1
  20. package/modules/@apostrophecms/login/ui/apos/logic/AposLoginForm.js +46 -2
  21. package/modules/@apostrophecms/modal/ui/apos/components/AposModalShareDraft.vue +8 -3
  22. package/modules/@apostrophecms/modal/ui/apos/mixins/AposEditorMixin.js +3 -0
  23. package/modules/@apostrophecms/page/index.js +118 -27
  24. package/modules/@apostrophecms/page/ui/apos/components/AposPagesManager.vue +3 -1
  25. package/modules/@apostrophecms/page/ui/apos/logic/AposPagesManager.js +7 -0
  26. package/modules/@apostrophecms/page-type/index.js +81 -4
  27. package/modules/@apostrophecms/permission/index.js +60 -31
  28. package/modules/@apostrophecms/piece-type/index.js +19 -41
  29. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManager.vue +9 -1
  30. package/modules/@apostrophecms/piece-type/ui/apos/components/AposUtilityOperations.vue +16 -1
  31. package/modules/@apostrophecms/rich-text-widget/index.js +141 -1
  32. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposRichTextWidgetEditor.vue +8 -0
  33. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapImage.vue +7 -7
  34. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapLink.vue +38 -79
  35. package/modules/@apostrophecms/rich-text-widget/ui/apos/tiptap-extensions/Link.js +11 -0
  36. package/modules/@apostrophecms/schema/index.js +9 -0
  37. package/modules/@apostrophecms/schema/lib/addFieldTypes.js +22 -2
  38. package/modules/@apostrophecms/schema/ui/apos/components/AposArrayEditor.vue +1 -0
  39. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArea.vue +4 -1
  40. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArray.vue +7 -8
  41. package/modules/@apostrophecms/schema/ui/apos/components/AposInputObject.vue +2 -0
  42. package/modules/@apostrophecms/schema/ui/apos/components/AposInputSlug.vue +1 -0
  43. package/modules/@apostrophecms/schema/ui/apos/components/AposInputString.vue +1 -0
  44. package/modules/@apostrophecms/schema/ui/apos/components/AposInputWrapper.vue +76 -30
  45. package/modules/@apostrophecms/schema/ui/apos/components/AposSchema.vue +2 -4
  46. package/modules/@apostrophecms/schema/ui/apos/components/AposSearchList.vue +1 -1
  47. package/modules/@apostrophecms/schema/ui/apos/logic/AposArrayEditor.js +7 -0
  48. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArea.js +13 -1
  49. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArray.js +5 -1
  50. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputObject.js +21 -0
  51. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputRelationship.js +12 -8
  52. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputWrapper.js +35 -0
  53. package/modules/@apostrophecms/schema/ui/apos/logic/AposSchema.js +6 -0
  54. package/modules/@apostrophecms/schema/ui/apos/mixins/AposInputMixin.js +41 -0
  55. package/modules/@apostrophecms/ui/ui/apos/components/AposCellContextMenu.vue +1 -0
  56. package/modules/@apostrophecms/ui/ui/apos/components/AposCheckbox.vue +1 -0
  57. package/modules/@apostrophecms/ui/ui/apos/components/AposTree.vue +7 -0
  58. package/modules/@apostrophecms/ui/ui/apos/components/AposTreeRows.vue +8 -0
  59. package/modules/@apostrophecms/ui/ui/apos/mixins/AposPublishMixin.js +10 -4
  60. package/modules/@apostrophecms/ui/ui/apos/scss/global/_inputs.scss +2 -2
  61. package/modules/@apostrophecms/widget-type/ui/apos/components/AposWidgetEditor.vue +7 -0
  62. package/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js +6 -0
  63. package/package.json +2 -2
  64. package/test/areas.js +1 -1
  65. package/test/assets.js +2 -2
  66. package/test/attachments.js +2 -2
  67. package/test/base-module.js +2 -1
  68. package/test/base-url-env-var.js +2 -2
  69. package/test/change-doc-ids.js +33 -31
  70. package/test/command-menu.js +2 -2
  71. package/test/content-i18n.js +47 -46
  72. package/test/db.js +2 -2
  73. package/test/docs.js +301 -126
  74. package/test/draft-published.js +2 -2
  75. package/test/email.js +2 -1
  76. package/test/express.js +3 -2
  77. package/test/external-front.js +4 -4
  78. package/test/field-meta.js +363 -0
  79. package/test/global.js +2 -1
  80. package/test/http.js +4 -2
  81. package/test/images.js +87 -88
  82. package/test/job.js +34 -34
  83. package/test/locks.js +2 -2
  84. package/test/login-requirements.js +3 -2
  85. package/test/middleware-and-route-order.js +2 -2
  86. package/test/page-type.js +2 -1
  87. package/test/pages-autocomplete.js +192 -0
  88. package/test/pages-public-api.js +2 -2
  89. package/test/pages-rest.js +4 -4
  90. package/test/pages.js +389 -57
  91. package/test/parked-pages.js +47 -47
  92. package/test/permissions.js +76 -0
  93. package/test/pieces-page-type.js +2 -1
  94. package/test/pieces-public-api.js +38 -38
  95. package/test/pieces.js +4 -4
  96. package/test/published-pages.js +16 -16
  97. package/test/rich-text-widget.js +164 -0
  98. package/test/schema-queryBuilders.js +180 -0
  99. package/test/schemaBuilders.js +4 -4
  100. package/test/schemas.js +220 -221
  101. package/test/search.js +2 -2
  102. package/test/soft-redirects.js +2 -1
  103. package/test/templates.js +2 -2
  104. package/test/users.js +2 -1
@@ -7,6 +7,12 @@ export default {
7
7
  type: String,
8
8
  areaFieldId: String,
9
9
  value: Object,
10
+ meta: {
11
+ type: Object,
12
+ default() {
13
+ return {};
14
+ }
15
+ },
10
16
  // Ignored for server side rendering
11
17
  areaField: Object,
12
18
  followingValues: Object,
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "apostrophe",
3
- "version": "3.61.1",
3
+ "version": "3.63.0",
4
4
  "description": "The Apostrophe Content Management System.",
5
5
  "main": "index.js",
6
6
  "scripts": {
7
7
  "pretest": "npm run lint",
8
- "test": "nyc --reporter=html mocha -t 10000",
8
+ "test": "nyc --reporter=html mocha -t 10000 --ignore=test/assets.js && nyc --reporter=html mocha -t 10000 test/assets.js",
9
9
  "eslint": "eslint --ext .js,.vue .",
10
10
  "eslint-fix": "npm run eslint -- --fix",
11
11
  "i18n": "node scripts/lint-i18n",
package/test/areas.js CHANGED
@@ -1,8 +1,8 @@
1
1
  const t = require('../test-lib/test.js');
2
2
  const assert = require('assert');
3
- let apos;
4
3
 
5
4
  describe('Areas', function() {
5
+ let apos;
6
6
 
7
7
  this.timeout(t.timeout);
8
8
 
package/test/assets.js CHANGED
@@ -12,8 +12,6 @@ const {
12
12
  fillExtraBundles
13
13
  } = require('../modules/@apostrophecms/asset/lib/webpack/utils');
14
14
 
15
- let apos;
16
-
17
15
  const badModules = {
18
16
  badModuleConfig: {
19
17
  options: {
@@ -85,6 +83,8 @@ const modules = {
85
83
  };
86
84
 
87
85
  describe('Assets', function() {
86
+ let apos;
87
+
88
88
  const {
89
89
  publicFolderPath,
90
90
  cacheFolderPath,
@@ -3,10 +3,10 @@ const assert = require('assert');
3
3
  const fs = require('fs-extra');
4
4
  const path = require('path');
5
5
 
6
- let apos;
7
-
8
6
  describe('Attachment', function() {
9
7
 
8
+ let apos;
9
+
10
10
  after(async function() {
11
11
  await wipeIt();
12
12
 
@@ -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('Base Module', function() {
6
5
 
6
+ let apos;
7
+
7
8
  this.timeout(t.timeout);
8
9
 
9
10
  after(async function() {
@@ -1,7 +1,5 @@
1
1
  const t = require('../test-lib/test.js');
2
2
  const assert = require('assert');
3
- let apos;
4
- let savedBaseUrl;
5
3
 
6
4
  const config = {
7
5
  root: module,
@@ -11,6 +9,8 @@ const config = {
11
9
 
12
10
  describe('Locales', function() {
13
11
  this.timeout(t.timeout);
12
+ let apos;
13
+ let savedBaseUrl;
14
14
 
15
15
  before(async function() {
16
16
  savedBaseUrl = process.env.APOS_BASE_URL;
@@ -1,10 +1,12 @@
1
1
  const t = require('../test-lib/test.js');
2
2
  const assert = require('assert');
3
- let apos;
4
- const articles = []; const categories = [];
5
3
 
6
4
  describe('change-doc-ids', function() {
7
5
 
6
+ let apos;
7
+ const articles = [];
8
+ const categories = [];
9
+
8
10
  this.timeout(t.timeout);
9
11
 
10
12
  after(function() {
@@ -102,33 +104,33 @@ describe('change-doc-ids', function() {
102
104
  await sanityCheck(newPageId, newCategoryId);
103
105
  });
104
106
 
105
- });
106
-
107
- async function sanityCheck(newPageId, newCategoryId) {
108
- const pages = await apos.page.find(apos.task.getReq(), {}).children(true).toArray();
109
- const test = pages.find(page => page.slug === '/test');
110
- assert(test);
111
- assert(test._children[0]);
112
- assert(!test._children[1]);
113
- assert.strictEqual(test._children[0].slug, '/test/child');
114
- if (newPageId) {
115
- assert.strictEqual(test._id, newPageId);
116
- const newPageDocId = newPageId.replace(/:.+$/, '');
117
- assert.strictEqual(test.aposDocId, newPageDocId);
118
- assert(test.path.includes(newPageDocId));
119
- assert(test._children[0].path.includes(newPageDocId));
120
- }
121
- const articles = await apos.article.find(apos.task.getReq(), {}).sort({ slug: 1 }).toArray();
122
- assert.strictEqual(articles[0].title, 'Article 0');
123
- assert(articles[0]._categories);
124
- assert.strictEqual(articles[0]._categories.length, 2);
125
- assert(articles[0]._categories.find(category => category.slug === 'category-0'));
126
- assert(articles[0]._categories.find(category => category.slug === 'category-1'));
127
- if (newCategoryId) {
128
- assert.strictEqual(articles[0]._categories[0]._id, newCategoryId);
129
- const newCategory = articles[0]._categories.find(category => category._id === newCategoryId);
130
- assert(newCategory);
131
- assert.strictEqual(newCategory._id, newCategoryId);
132
- assert.strictEqual(newCategory.aposDocId, newCategoryId.replace(/:.+$/, ''));
107
+ async function sanityCheck(newPageId, newCategoryId) {
108
+ const pages = await apos.page.find(apos.task.getReq(), {}).children(true).toArray();
109
+ const test = pages.find(page => page.slug === '/test');
110
+ assert(test);
111
+ assert(test._children[0]);
112
+ assert(!test._children[1]);
113
+ assert.strictEqual(test._children[0].slug, '/test/child');
114
+ if (newPageId) {
115
+ assert.strictEqual(test._id, newPageId);
116
+ const newPageDocId = newPageId.replace(/:.+$/, '');
117
+ assert.strictEqual(test.aposDocId, newPageDocId);
118
+ assert(test.path.includes(newPageDocId));
119
+ assert(test._children[0].path.includes(newPageDocId));
120
+ }
121
+ const articles = await apos.article.find(apos.task.getReq(), {}).sort({ slug: 1 }).toArray();
122
+ assert.strictEqual(articles[0].title, 'Article 0');
123
+ assert(articles[0]._categories);
124
+ assert.strictEqual(articles[0]._categories.length, 2);
125
+ assert(articles[0]._categories.find(category => category.slug === 'category-0'));
126
+ assert(articles[0]._categories.find(category => category.slug === 'category-1'));
127
+ if (newCategoryId) {
128
+ assert.strictEqual(articles[0]._categories[0]._id, newCategoryId);
129
+ const newCategory = articles[0]._categories.find(category => category._id === newCategoryId);
130
+ assert(newCategory);
131
+ assert.strictEqual(newCategory._id, newCategoryId);
132
+ assert.strictEqual(newCategory.aposDocId, newCategoryId.replace(/:.+$/, ''));
133
+ }
133
134
  }
134
- }
135
+
136
+ });
@@ -684,7 +684,7 @@ describe('Command-Menu', function() {
684
684
  action: {},
685
685
  shortcut: 'c',
686
686
  permission: {
687
- action: 'edit',
687
+ action: 'create',
688
688
  type: '@apostrophecms/page',
689
689
  mode: 'draft'
690
690
  }
@@ -704,7 +704,7 @@ describe('Command-Menu', function() {
704
704
  action: {},
705
705
  shortcut: 'c',
706
706
  permission: {
707
- action: 'edit',
707
+ action: 'create',
708
708
  type: '@apostrophecms/page',
709
709
  mode: 'published'
710
710
  }
@@ -1,56 +1,57 @@
1
1
  const t = require('../test-lib/test.js');
2
2
  const assert = require('assert');
3
- let apos;
4
3
 
5
- const config = {
6
- root: module,
7
- // Wrong port, but that is OK for this test
8
- baseUrl: 'http://localhost:3000',
9
- modules: {
10
- '@apostrophecms/i18n': {
11
- options: {
12
- locales: {
13
- en: {
14
- label: 'English'
15
- },
16
- 'en-CA': {
17
- label: 'Canadian English',
18
- prefix: '/ca-en'
19
- },
20
- 'fr-CA': {
21
- label: 'Canadian French',
22
- prefix: '/ca-fr'
23
- },
24
- 'es-MX': {
25
- label: 'Mexico',
26
- hostname: 'example.mx'
4
+ describe('content-i18n', function() {
5
+
6
+ let apos;
7
+
8
+ const config = {
9
+ root: module,
10
+ // Wrong port, but that is OK for this test
11
+ baseUrl: 'http://localhost:3000',
12
+ modules: {
13
+ '@apostrophecms/i18n': {
14
+ options: {
15
+ locales: {
16
+ en: {
17
+ label: 'English'
18
+ },
19
+ 'en-CA': {
20
+ label: 'Canadian English',
21
+ prefix: '/ca-en'
22
+ },
23
+ 'fr-CA': {
24
+ label: 'Canadian French',
25
+ prefix: '/ca-fr'
26
+ },
27
+ 'es-MX': {
28
+ label: 'Mexico',
29
+ hostname: 'example.mx'
30
+ }
27
31
  }
28
32
  }
29
- }
30
- },
31
- '@apostrophecms/express': {
32
- options: {
33
- // Allows us to inject an X-Forwarded-Host header for test purposes
34
- trustProxy: true
35
- }
36
- },
37
- 'default-page': {},
38
- '@apostrophecms/page': {
39
- options: {
40
- park: [
41
- {
42
- parkedId: 'people',
43
- type: 'default-page',
44
- slug: '/people',
45
- title: 'People'
46
- }
47
- ]
33
+ },
34
+ '@apostrophecms/express': {
35
+ options: {
36
+ // Allows us to inject an X-Forwarded-Host header for test purposes
37
+ trustProxy: true
38
+ }
39
+ },
40
+ 'default-page': {},
41
+ '@apostrophecms/page': {
42
+ options: {
43
+ park: [
44
+ {
45
+ parkedId: 'people',
46
+ type: 'default-page',
47
+ slug: '/people',
48
+ title: 'People'
49
+ }
50
+ ]
51
+ }
48
52
  }
49
53
  }
50
- }
51
- };
52
-
53
- describe('Locales', function() {
54
+ };
54
55
 
55
56
  this.timeout(t.timeout);
56
57
 
package/test/db.js CHANGED
@@ -1,10 +1,10 @@
1
1
  const t = require('../test-lib/test.js');
2
2
  const assert = require('assert');
3
3
 
4
- let apos, apos2;
5
-
6
4
  describe('Db', function() {
7
5
 
6
+ let apos, apos2;
7
+
8
8
  after(async function () {
9
9
  await t.destroy(apos);
10
10
  await t.destroy(apos2);