@plone/volto 18.0.0-alpha.2 → 18.0.0-alpha.4
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/.eslintrc +3 -3
- package/.prettierignore +8 -0
- package/.prettierrc +12 -0
- package/{packages/registry/.release-it.json → .release-it.json} +11 -6
- package/CHANGELOG.md +44 -4
- package/locales/ca/LC_MESSAGES/volto.po +1 -0
- package/locales/de/LC_MESSAGES/volto.po +1 -0
- package/locales/en/LC_MESSAGES/volto.po +1 -0
- package/locales/es/LC_MESSAGES/volto.po +1 -0
- package/locales/eu/LC_MESSAGES/volto.po +1 -0
- package/locales/fi/LC_MESSAGES/volto.po +1 -0
- package/locales/fr/LC_MESSAGES/volto.po +1 -0
- package/locales/it/LC_MESSAGES/volto.po +1 -0
- package/locales/ja/LC_MESSAGES/volto.po +1 -0
- package/locales/nl/LC_MESSAGES/volto.po +1 -0
- package/locales/pt/LC_MESSAGES/volto.po +1 -0
- package/locales/pt_BR/LC_MESSAGES/volto.po +1 -0
- package/locales/ro/LC_MESSAGES/volto.po +1 -0
- package/locales/volto.pot +2 -1
- package/locales/zh_CN/LC_MESSAGES/volto.po +1 -0
- package/package.json +57 -127
- package/razzle.config.js +4 -7
- package/src/components/manage/Blocks/Video/Body.jsx +52 -22
- package/src/components/manage/Blocks/Video/Body.test.jsx +167 -0
- package/src/components/manage/Controlpanels/Users/UserGroupMembershipControlPanel.jsx +2 -2
- package/src/components/manage/Form/Form.jsx +5 -2
- package/src/components/theme/Breadcrumbs/Breadcrumbs.jsx +19 -2
- package/src/components/theme/ContentMetadataTags/ContentMetadataTags.jsx +46 -39
- package/src/config/index.js +0 -4
- package/src/icons/divide-horizontal.svg +0 -0
- package/src/icons/divide-vertical.svg +0 -0
- package/src/icons/hero.svg +0 -0
- package/src/icons/slider.svg +0 -0
- package/src/icons/summary.svg +0 -0
- package/src/middleware/api.js +1 -1
- package/theme/themes/default/elements/icon.overrides +0 -0
- package/theme/themes/default/globals/reset.overrides +0 -0
- package/theme/themes/default/globals/site.variables +0 -0
- package/theme/themes/default/modules/dropdown.overrides +0 -0
- package/theme/themes/default/modules/dropdown.variables +0 -0
- package/theme/themes/default/modules/modal.variables +0 -0
- package/theme/themes/default/modules/video.overrides +0 -0
- package/theme/themes/default/modules/video.variables +0 -0
- package/theme/themes/pastanaga/assets/fonts/icons.eot +0 -0
- package/theme/themes/pastanaga/assets/fonts/icons.svg +0 -0
- package/theme/themes/pastanaga/assets/fonts/icons.ttf +0 -0
- package/theme/themes/pastanaga/assets/fonts/icons.woff +0 -0
- package/theme/themes/pastanaga/globals/reset.overrides +0 -0
- package/theme/themes/pastanaga/globals/site.variables +0 -0
- package/theme/themes/pastanaga/modules/dropdown.variables +0 -0
- package/theme/themes/pastanaga/modules/modal.variables +0 -0
- package/theme/themes/pastanaga/modules/video.overrides +0 -0
- package/theme/themes/pastanaga/modules/video.variables +0 -0
- package/tsconfig.json +1 -4
- package/types/components/manage/Blocks/Video/Body.d.ts +5 -0
- package/types/config/RichTextEditor/index.d.ts +5 -8
- package/types/helpers/AsyncConnect/index.d.ts +2 -2
- package/types/helpers/Url/Url.d.ts +3 -3
- package/types/icons/load-icons.d.ts +1 -1
- package/webpack-plugins/webpack-less-plugin.js +1 -0
- package/CODE_OF_CONDUCT.md +0 -13
- package/CONTRIBUTING.md +0 -7
- package/README.md +0 -154
- package/RELEASING.md +0 -73
- package/ROADMAP.md +0 -30
- package/SECURITY.md +0 -14
- package/logos/Logo.png +0 -0
- package/logos/VoltoLogoEra2-dark-mode.png +0 -0
- package/logos/VoltoLogoEra2.png +0 -0
- package/logos/volto-colorful.png +0 -0
- package/logos/volto-colorful.svg +0 -35
- package/logos/volto-guide.png +0 -0
- package/logos/volto-h-transparent.svg +0 -6
- package/logos/volto-transparent.png +0 -0
- package/logos/volto-transparent.svg +0 -19
- package/logos/volto-transparent2.svg +0 -5
- package/logos/volto-yellow.svg +0 -29
- package/logos/volto.sketch +0 -0
- package/packages/README.md +0 -7
- package/packages/registry/.towncrier/towncrier_template.jinja +0 -10
- package/packages/registry/CHANGELOG.md +0 -16
- package/packages/registry/README.md +0 -207
- package/packages/registry/addon-registry.js +0 -603
- package/packages/registry/create-addons-loader.js +0 -116
- package/packages/registry/create-theme-addons-loader.js +0 -78
- package/packages/registry/news/.gitkeep +0 -0
- package/packages/registry/package.json +0 -76
- package/packages/registry/src/index.ts +0 -174
- package/packages/registry/src/registry.test.js +0 -111
- package/packages/registry/tsconfig.json +0 -32
- package/packages/scripts/CHANGELOG.md +0 -173
- package/packages/scripts/README.md +0 -128
- package/packages/scripts/addon/consolidate.js +0 -28
- package/packages/scripts/addon/generators.js +0 -213
- package/packages/scripts/addon/getAddonInfo.js +0 -65
- package/packages/scripts/addon/index.js +0 -88
- package/packages/scripts/addon/utils.js +0 -44
- package/packages/scripts/backportpr.js +0 -75
- package/packages/scripts/changelogupdater.cjs +0 -94
- package/packages/scripts/corepackagebump.js +0 -20
- package/packages/scripts/i18n.cjs +0 -310
- package/packages/scripts/package.json +0 -76
- package/packages/scripts/templates/towncrier_template.jinja +0 -10
- package/packages/types/Blocks/View.ts +0 -11
- package/packages/types/actions.ts +0 -15
- package/packages/types/breadcrumbs.ts +0 -10
- package/packages/types/config/Blocks.ts +0 -153
- package/packages/types/config/Content.ts +0 -62
- package/packages/types/config/Settings.ts +0 -86
- package/packages/types/config/Views.ts +0 -15
- package/packages/types/config/Widgets.ts +0 -7
- package/packages/types/config/index.ts +0 -21
- package/packages/types/content/common.ts +0 -60
- package/packages/types/content/get.ts +0 -66
- package/packages/types/index.ts +0 -0
- package/packages/types/navigation.ts +0 -12
- package/packages/types/package.json +0 -64
- package/packages/types/types.ts +0 -61
- package/packages/volto-slate/.i18n.babel.config.js +0 -1
- package/packages/volto-slate/README.md +0 -4
- package/packages/volto-slate/build/messages/src/blocks/Table/TableBlockEdit.json +0 -90
- package/packages/volto-slate/build/messages/src/blocks/Text/DefaultTextBlockEditor.json +0 -6
- package/packages/volto-slate/build/messages/src/blocks/Text/DetachedTextBlockEditor.json +0 -6
- package/packages/volto-slate/build/messages/src/blocks/Text/SlashMenu.json +0 -6
- package/packages/volto-slate/build/messages/src/editor/plugins/AdvancedLink/index.json +0 -10
- package/packages/volto-slate/build/messages/src/editor/plugins/Link/index.json +0 -10
- package/packages/volto-slate/build/messages/src/editor/plugins/Table/index.json +0 -30
- package/packages/volto-slate/build/messages/src/elementEditor/messages.json +0 -10
- package/packages/volto-slate/build/messages/src/widgets/HtmlSlateWidget.json +0 -6
- package/packages/volto-slate/build/messages/src/widgets/RichTextWidgetView.json +0 -6
- package/packages/volto-slate/locales/de/LC_MESSAGES/volto.po +0 -148
- package/packages/volto-slate/locales/en/LC_MESSAGES/volto.po +0 -148
- package/packages/volto-slate/locales/volto.pot +0 -182
- package/packages/volto-slate/package.json +0 -43
- package/packages/volto-slate/src/actions/content.js +0 -30
- package/packages/volto-slate/src/actions/index.js +0 -3
- package/packages/volto-slate/src/actions/plugins.js +0 -9
- package/packages/volto-slate/src/actions/selection.js +0 -22
- package/packages/volto-slate/src/blocks/Table/Cell.jsx +0 -87
- package/packages/volto-slate/src/blocks/Table/Cell.test.js +0 -54
- package/packages/volto-slate/src/blocks/Table/TableBlockEdit.jsx +0 -694
- package/packages/volto-slate/src/blocks/Table/TableBlockEdit.test.js +0 -40
- package/packages/volto-slate/src/blocks/Table/TableBlockView.jsx +0 -150
- package/packages/volto-slate/src/blocks/Table/TableBlockView.test.js +0 -49
- package/packages/volto-slate/src/blocks/Table/deconstruct.js +0 -113
- package/packages/volto-slate/src/blocks/Table/extensions/normalizeTable.js +0 -5
- package/packages/volto-slate/src/blocks/Table/index.js +0 -60
- package/packages/volto-slate/src/blocks/Table/schema.js +0 -122
- package/packages/volto-slate/src/blocks/Text/DefaultTextBlockEditor.jsx +0 -304
- package/packages/volto-slate/src/blocks/Text/DetachedTextBlockEditor.jsx +0 -77
- package/packages/volto-slate/src/blocks/Text/MarkdownIntroduction.jsx +0 -59
- package/packages/volto-slate/src/blocks/Text/PluginSidebar.jsx +0 -18
- package/packages/volto-slate/src/blocks/Text/ShortcutListing.jsx +0 -28
- package/packages/volto-slate/src/blocks/Text/SlashMenu.jsx +0 -203
- package/packages/volto-slate/src/blocks/Text/TextBlockEdit.jsx +0 -38
- package/packages/volto-slate/src/blocks/Text/TextBlockEdit.test.js +0 -107
- package/packages/volto-slate/src/blocks/Text/TextBlockSchema.js +0 -54
- package/packages/volto-slate/src/blocks/Text/TextBlockView.jsx +0 -31
- package/packages/volto-slate/src/blocks/Text/css/editor.css +0 -18
- package/packages/volto-slate/src/blocks/Text/extensions/Readme.md +0 -49
- package/packages/volto-slate/src/blocks/Text/extensions/breakList.js +0 -100
- package/packages/volto-slate/src/blocks/Text/extensions/index.js +0 -6
- package/packages/volto-slate/src/blocks/Text/extensions/insertBreak.js +0 -57
- package/packages/volto-slate/src/blocks/Text/extensions/isSelected.js +0 -7
- package/packages/volto-slate/src/blocks/Text/extensions/normalizeExternalData.js +0 -7
- package/packages/volto-slate/src/blocks/Text/extensions/withDeserializers.js +0 -87
- package/packages/volto-slate/src/blocks/Text/extensions/withLists.js +0 -5
- package/packages/volto-slate/src/blocks/Text/index.js +0 -171
- package/packages/volto-slate/src/blocks/Text/keyboard/backspaceInList.js +0 -58
- package/packages/volto-slate/src/blocks/Text/keyboard/breakBlocks.js +0 -3
- package/packages/volto-slate/src/blocks/Text/keyboard/cancelEsc.js +0 -7
- package/packages/volto-slate/src/blocks/Text/keyboard/indentListItems.js +0 -240
- package/packages/volto-slate/src/blocks/Text/keyboard/index.js +0 -52
- package/packages/volto-slate/src/blocks/Text/keyboard/joinBlocks.js +0 -180
- package/packages/volto-slate/src/blocks/Text/keyboard/moveListItems.js +0 -124
- package/packages/volto-slate/src/blocks/Text/keyboard/slashMenu.js +0 -19
- package/packages/volto-slate/src/blocks/Text/keyboard/softBreak.js +0 -7
- package/packages/volto-slate/src/blocks/Text/keyboard/traverseBlocks.js +0 -81
- package/packages/volto-slate/src/blocks/Text/keyboard/unwrapEmptyString.js +0 -26
- package/packages/volto-slate/src/blocks/Text/schema.js +0 -39
- package/packages/volto-slate/src/constants.js +0 -123
- package/packages/volto-slate/src/editor/EditorContext.jsx +0 -5
- package/packages/volto-slate/src/editor/EditorReference.jsx +0 -22
- package/packages/volto-slate/src/editor/SlateEditor.jsx +0 -375
- package/packages/volto-slate/src/editor/config.jsx +0 -344
- package/packages/volto-slate/src/editor/decorate.js +0 -68
- package/packages/volto-slate/src/editor/deserialize.js +0 -185
- package/packages/volto-slate/src/editor/extensions/index.js +0 -6
- package/packages/volto-slate/src/editor/extensions/insertBreak.js +0 -15
- package/packages/volto-slate/src/editor/extensions/insertData.js +0 -159
- package/packages/volto-slate/src/editor/extensions/isInline.js +0 -14
- package/packages/volto-slate/src/editor/extensions/normalizeExternalData.js +0 -8
- package/packages/volto-slate/src/editor/extensions/normalizeNode.js +0 -48
- package/packages/volto-slate/src/editor/extensions/withDeserializers.js +0 -15
- package/packages/volto-slate/src/editor/extensions/withTestingFeatures.jsx +0 -84
- package/packages/volto-slate/src/editor/index.js +0 -14
- package/packages/volto-slate/src/editor/less/editor.less +0 -173
- package/packages/volto-slate/src/editor/less/globals.less +0 -18
- package/packages/volto-slate/src/editor/less/slate.less +0 -28
- package/packages/volto-slate/src/editor/plugins/AdvancedLink/deserialize.js +0 -90
- package/packages/volto-slate/src/editor/plugins/AdvancedLink/extensions.js +0 -32
- package/packages/volto-slate/src/editor/plugins/AdvancedLink/index.js +0 -50
- package/packages/volto-slate/src/editor/plugins/AdvancedLink/render.jsx +0 -37
- package/packages/volto-slate/src/editor/plugins/AdvancedLink/schema.js +0 -114
- package/packages/volto-slate/src/editor/plugins/AdvancedLink/styles.less +0 -8
- package/packages/volto-slate/src/editor/plugins/Blockquote/index.js +0 -30
- package/packages/volto-slate/src/editor/plugins/Callout/index.js +0 -34
- package/packages/volto-slate/src/editor/plugins/Image/deconstruct.js +0 -30
- package/packages/volto-slate/src/editor/plugins/Image/extensions.js +0 -51
- package/packages/volto-slate/src/editor/plugins/Image/index.js +0 -11
- package/packages/volto-slate/src/editor/plugins/Image/render.jsx +0 -22
- package/packages/volto-slate/src/editor/plugins/Link/extensions.js +0 -58
- package/packages/volto-slate/src/editor/plugins/Link/index.js +0 -164
- package/packages/volto-slate/src/editor/plugins/Link/render.jsx +0 -54
- package/packages/volto-slate/src/editor/plugins/Markdown/constants.js +0 -81
- package/packages/volto-slate/src/editor/plugins/Markdown/extensions.js +0 -334
- package/packages/volto-slate/src/editor/plugins/Markdown/index.js +0 -28
- package/packages/volto-slate/src/editor/plugins/Markdown/utils.js +0 -198
- package/packages/volto-slate/src/editor/plugins/StyleMenu/StyleMenu.jsx +0 -153
- package/packages/volto-slate/src/editor/plugins/StyleMenu/index.js +0 -19
- package/packages/volto-slate/src/editor/plugins/StyleMenu/style.less +0 -29
- package/packages/volto-slate/src/editor/plugins/StyleMenu/utils.js +0 -168
- package/packages/volto-slate/src/editor/plugins/Table/TableButton.jsx +0 -142
- package/packages/volto-slate/src/editor/plugins/Table/TableCell.jsx +0 -44
- package/packages/volto-slate/src/editor/plugins/Table/TableContainer.jsx +0 -37
- package/packages/volto-slate/src/editor/plugins/Table/TableSizePicker.jsx +0 -83
- package/packages/volto-slate/src/editor/plugins/Table/extensions.js +0 -87
- package/packages/volto-slate/src/editor/plugins/Table/index.js +0 -390
- package/packages/volto-slate/src/editor/plugins/Table/less/public.less +0 -29
- package/packages/volto-slate/src/editor/plugins/Table/less/table.less +0 -28
- package/packages/volto-slate/src/editor/plugins/Table/render.jsx +0 -30
- package/packages/volto-slate/src/editor/plugins/index.js +0 -19
- package/packages/volto-slate/src/editor/render.jsx +0 -224
- package/packages/volto-slate/src/editor/ui/BasicToolbar.jsx +0 -11
- package/packages/volto-slate/src/editor/ui/BlockButton.jsx +0 -31
- package/packages/volto-slate/src/editor/ui/ClearFormattingButton.jsx +0 -21
- package/packages/volto-slate/src/editor/ui/ExpandedToolbar.jsx +0 -18
- package/packages/volto-slate/src/editor/ui/Expando.jsx +0 -5
- package/packages/volto-slate/src/editor/ui/InlineToolbar.jsx +0 -73
- package/packages/volto-slate/src/editor/ui/MarkButton.jsx +0 -23
- package/packages/volto-slate/src/editor/ui/MarkElementButton.jsx +0 -30
- package/packages/volto-slate/src/editor/ui/Menu.jsx +0 -13
- package/packages/volto-slate/src/editor/ui/PositionedToolbar.jsx +0 -32
- package/packages/volto-slate/src/editor/ui/Separator.jsx +0 -7
- package/packages/volto-slate/src/editor/ui/SlateContextToolbar.jsx +0 -13
- package/packages/volto-slate/src/editor/ui/SlateToolbar.jsx +0 -96
- package/packages/volto-slate/src/editor/ui/Toolbar.jsx +0 -103
- package/packages/volto-slate/src/editor/ui/ToolbarButton.jsx +0 -33
- package/packages/volto-slate/src/editor/ui/ToolbarButton.test.js +0 -25
- package/packages/volto-slate/src/editor/ui/index.js +0 -15
- package/packages/volto-slate/src/editor/utils.js +0 -248
- package/packages/volto-slate/src/elementEditor/ContextButtons.jsx +0 -56
- package/packages/volto-slate/src/elementEditor/PluginEditor.jsx +0 -124
- package/packages/volto-slate/src/elementEditor/Readme.md +0 -6
- package/packages/volto-slate/src/elementEditor/SchemaProvider.jsx +0 -3
- package/packages/volto-slate/src/elementEditor/SidebarEditor.jsx +0 -46
- package/packages/volto-slate/src/elementEditor/ToolbarButton.jsx +0 -44
- package/packages/volto-slate/src/elementEditor/index.js +0 -5
- package/packages/volto-slate/src/elementEditor/makeInlineElementPlugin.js +0 -100
- package/packages/volto-slate/src/elementEditor/messages.js +0 -14
- package/packages/volto-slate/src/elementEditor/utils.js +0 -226
- package/packages/volto-slate/src/hooks/index.js +0 -3
- package/packages/volto-slate/src/hooks/useEditorContext.js +0 -6
- package/packages/volto-slate/src/hooks/useIsomorphicLayoutEffect.js +0 -7
- package/packages/volto-slate/src/hooks/useSelectionPosition.js +0 -25
- package/packages/volto-slate/src/i18n.js +0 -180
- package/packages/volto-slate/src/icons/hashlink.svg +0 -57
- package/packages/volto-slate/src/index.js +0 -61
- package/packages/volto-slate/src/reducers/content.js +0 -74
- package/packages/volto-slate/src/reducers/index.js +0 -3
- package/packages/volto-slate/src/reducers/plugins.js +0 -17
- package/packages/volto-slate/src/reducers/selection.js +0 -16
- package/packages/volto-slate/src/utils/blocks.js +0 -375
- package/packages/volto-slate/src/utils/blocks.test.js +0 -138
- package/packages/volto-slate/src/utils/editor.js +0 -31
- package/packages/volto-slate/src/utils/image.js +0 -25
- package/packages/volto-slate/src/utils/index.js +0 -11
- package/packages/volto-slate/src/utils/internals.js +0 -46
- package/packages/volto-slate/src/utils/lists.js +0 -92
- package/packages/volto-slate/src/utils/marks.js +0 -104
- package/packages/volto-slate/src/utils/mime-types.js +0 -24
- package/packages/volto-slate/src/utils/nodes.js +0 -4
- package/packages/volto-slate/src/utils/ops.js +0 -20
- package/packages/volto-slate/src/utils/random.js +0 -17
- package/packages/volto-slate/src/utils/selection.js +0 -236
- package/packages/volto-slate/src/utils/slate-string-utils.js +0 -408
- package/packages/volto-slate/src/utils/volto-blocks.js +0 -314
- package/packages/volto-slate/src/widgets/ErrorBoundary.jsx +0 -27
- package/packages/volto-slate/src/widgets/HtmlSlateWidget.jsx +0 -139
- package/packages/volto-slate/src/widgets/ObjectByTypeWidget.jsx +0 -49
- package/packages/volto-slate/src/widgets/RichTextWidget.jsx +0 -72
- package/packages/volto-slate/src/widgets/RichTextWidgetView.jsx +0 -37
- package/packages/volto-slate/src/widgets/style.css +0 -21
|
@@ -1,603 +0,0 @@
|
|
|
1
|
-
/* eslint no-console: 0 */
|
|
2
|
-
const glob = require('glob').sync;
|
|
3
|
-
const path = require('path');
|
|
4
|
-
const fs = require('fs');
|
|
5
|
-
const debug = require('debug')('shadowing');
|
|
6
|
-
const { map } = require('lodash');
|
|
7
|
-
const { DepGraph } = require('dependency-graph');
|
|
8
|
-
|
|
9
|
-
const excludedCompilerOptionsPaths = [
|
|
10
|
-
'@plone/volto/*',
|
|
11
|
-
'@plone/volto-slate/*',
|
|
12
|
-
'@plone/registry/*',
|
|
13
|
-
'@plone/registry',
|
|
14
|
-
'@plone/types/*',
|
|
15
|
-
'@root/*',
|
|
16
|
-
];
|
|
17
|
-
|
|
18
|
-
function getPackageBasePath(base) {
|
|
19
|
-
while (!fs.existsSync(`${base}/package.json`)) {
|
|
20
|
-
base = path.join(base, '../');
|
|
21
|
-
}
|
|
22
|
-
return path.resolve(base);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function fromEntries(pairs) {
|
|
26
|
-
const res = {};
|
|
27
|
-
pairs.forEach((p) => {
|
|
28
|
-
res[p[0]] = p[1];
|
|
29
|
-
});
|
|
30
|
-
return res;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function buildDependencyGraph(addons, extractDependency) {
|
|
34
|
-
// getAddonsLoaderChain
|
|
35
|
-
const graph = new DepGraph({ circular: true });
|
|
36
|
-
graph.addNode('@root');
|
|
37
|
-
|
|
38
|
-
const seen = ['@root'];
|
|
39
|
-
const stack = [['@root', addons]];
|
|
40
|
-
|
|
41
|
-
while (stack.length > 0) {
|
|
42
|
-
const [pkgName, addons] = stack.shift();
|
|
43
|
-
if (!graph.hasNode(pkgName)) {
|
|
44
|
-
graph.addNode(pkgName, []);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
if (!seen.includes(pkgName)) {
|
|
48
|
-
stack.push([pkgName, extractDependency(pkgName)]);
|
|
49
|
-
seen.push(pkgName);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
addons.forEach((loaderString) => {
|
|
53
|
-
const [name, extra] = loaderString.split(':');
|
|
54
|
-
if (!graph.hasNode(name)) {
|
|
55
|
-
graph.addNode(name, []);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const data = graph.getNodeData(name) || [];
|
|
59
|
-
if (extra) {
|
|
60
|
-
extra.split(',').forEach((funcName) => {
|
|
61
|
-
if (!data.includes(funcName)) data.push(funcName);
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
graph.setNodeData(name, data);
|
|
65
|
-
|
|
66
|
-
graph.addDependency(pkgName, name);
|
|
67
|
-
|
|
68
|
-
if (!seen.includes(name)) {
|
|
69
|
-
stack.push([name, extractDependency(name)]);
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return graph;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Given an addons loader string, it generates an addons loader string with
|
|
79
|
-
* a resolved chain of dependencies
|
|
80
|
-
*/
|
|
81
|
-
function getAddonsLoaderChain(graph) {
|
|
82
|
-
return graph.dependenciesOf('@root').map((name) => {
|
|
83
|
-
const extras = graph.getNodeData(name) || [].join(',');
|
|
84
|
-
return extras.length ? `${name}:${extras}` : name;
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* A registry to discover and publish information about the structure of Volto
|
|
90
|
-
* projects and their addons.
|
|
91
|
-
*
|
|
92
|
-
* The registry builds information about both addons and other development
|
|
93
|
-
* packages, structured as an object with the following information:
|
|
94
|
-
*
|
|
95
|
-
* - name
|
|
96
|
-
* - isPublishedPackage (just for info, to distinguish addons from other Javascript development packages)
|
|
97
|
-
* - modulePath (the path that would be resolved from Javascript package name)
|
|
98
|
-
* - packageJson (the path to the addon's package.json file)
|
|
99
|
-
* - extraConfigLoaders (names for extra functions to be loaded from the addon
|
|
100
|
-
* for configuration purposes)
|
|
101
|
-
* - razzleExtender (the path to the addon's razzle.extend.js path, to allow
|
|
102
|
-
* addons to customize the webpack configuration)
|
|
103
|
-
*
|
|
104
|
-
*/
|
|
105
|
-
class AddonConfigurationRegistry {
|
|
106
|
-
constructor(projectRootPath) {
|
|
107
|
-
const packageJson = (this.packageJson = require(
|
|
108
|
-
path.join(projectRootPath, 'package.json'),
|
|
109
|
-
));
|
|
110
|
-
// Loads the dynamic config, if any
|
|
111
|
-
if (fs.existsSync(path.join(projectRootPath, 'volto.config.js'))) {
|
|
112
|
-
this.voltoConfigJS = require(
|
|
113
|
-
path.join(projectRootPath, 'volto.config.js'),
|
|
114
|
-
);
|
|
115
|
-
} else {
|
|
116
|
-
this.voltoConfigJS = [];
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
this.projectRootPath = projectRootPath;
|
|
120
|
-
this.voltoPath =
|
|
121
|
-
packageJson.name === '@plone/volto'
|
|
122
|
-
? `${projectRootPath}`
|
|
123
|
-
: `${projectRootPath}/node_modules/@plone/volto`;
|
|
124
|
-
|
|
125
|
-
this.packagesFolderAddons =
|
|
126
|
-
packageJson.name === '@plone/volto'
|
|
127
|
-
? packageJson.packagesFolderAddons || {}
|
|
128
|
-
: require(`${getPackageBasePath(this.voltoPath)}/package.json`)
|
|
129
|
-
.packagesFolderAddons || {};
|
|
130
|
-
|
|
131
|
-
this.resultantMergedAddons = [
|
|
132
|
-
...(packageJson.addons || []),
|
|
133
|
-
...(this.voltoConfigJS.addons || []),
|
|
134
|
-
];
|
|
135
|
-
|
|
136
|
-
this.addonNames = this.resultantMergedAddons.map((s) => s.split(':')[0]);
|
|
137
|
-
this.packages = {};
|
|
138
|
-
this.customizations = new Map();
|
|
139
|
-
|
|
140
|
-
// Theme from a package.json key, from volto.config.js or from an ENV VAR
|
|
141
|
-
// Programatically via volto.config.js wins or the ENV VAR if present
|
|
142
|
-
this.theme =
|
|
143
|
-
packageJson.theme || this.voltoConfigJS.theme || process.env.THEME;
|
|
144
|
-
|
|
145
|
-
this.initDevelopmentPackages();
|
|
146
|
-
this.initPublishedPackages();
|
|
147
|
-
this.initAddonsFromEnvVar();
|
|
148
|
-
|
|
149
|
-
this.dependencyGraph = buildDependencyGraph(
|
|
150
|
-
[
|
|
151
|
-
...(Object.keys(this.packagesFolderAddons).map(
|
|
152
|
-
(key) => this.packagesFolderAddons[key].package,
|
|
153
|
-
) || []),
|
|
154
|
-
...this.resultantMergedAddons,
|
|
155
|
-
...(process.env.ADDONS ? process.env.ADDONS.split(';') : []),
|
|
156
|
-
],
|
|
157
|
-
(name) => {
|
|
158
|
-
this.initPublishedPackage(name);
|
|
159
|
-
return this.packages[name].addons || [];
|
|
160
|
-
},
|
|
161
|
-
);
|
|
162
|
-
|
|
163
|
-
this.initAddonExtenders();
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Use tsconfig.json or jsconfig.json to get paths for "development" packages/addons
|
|
168
|
-
* (coming from mrs.developer.json)
|
|
169
|
-
* Not all of these packages have to be Volto addons.
|
|
170
|
-
*/
|
|
171
|
-
initDevelopmentPackages() {
|
|
172
|
-
let configFile;
|
|
173
|
-
if (fs.existsSync(`${this.projectRootPath}/tsconfig.json`))
|
|
174
|
-
configFile = `${this.projectRootPath}/tsconfig.json`;
|
|
175
|
-
else if (fs.existsSync(`${this.projectRootPath}/jsconfig.json`))
|
|
176
|
-
configFile = `${this.projectRootPath}/jsconfig.json`;
|
|
177
|
-
|
|
178
|
-
if (configFile) {
|
|
179
|
-
const jsConfig = require(configFile).compilerOptions;
|
|
180
|
-
const pathsConfig = jsConfig.paths;
|
|
181
|
-
|
|
182
|
-
Object.keys(pathsConfig).forEach((name) => {
|
|
183
|
-
const packagePath = `${this.projectRootPath}/${jsConfig.baseUrl}/${pathsConfig[name][0]}`;
|
|
184
|
-
const packageJsonPath = `${getPackageBasePath(
|
|
185
|
-
packagePath,
|
|
186
|
-
)}/package.json`;
|
|
187
|
-
const innerAddons = require(packageJsonPath).addons || [];
|
|
188
|
-
const innerAddonsNormalized = innerAddons.map((s) => s.split(':')[0]);
|
|
189
|
-
if (
|
|
190
|
-
this.addonNames.includes(name) &&
|
|
191
|
-
innerAddonsNormalized.length > 0
|
|
192
|
-
) {
|
|
193
|
-
innerAddonsNormalized.forEach((name) => {
|
|
194
|
-
if (!this.addonNames.includes(name)) this.addonNames.push(name);
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
const pkg = {
|
|
198
|
-
modulePath: packagePath,
|
|
199
|
-
packageJson: packageJsonPath,
|
|
200
|
-
version: require(packageJsonPath).version,
|
|
201
|
-
isPublishedPackage: false,
|
|
202
|
-
isRegisteredAddon: this.addonNames.includes(name),
|
|
203
|
-
name,
|
|
204
|
-
addons: require(packageJsonPath).addons || [],
|
|
205
|
-
};
|
|
206
|
-
|
|
207
|
-
// Removed excluded paths from CompilerOptions
|
|
208
|
-
if (!excludedCompilerOptionsPaths.includes(name)) {
|
|
209
|
-
this.packages[name] = Object.assign(this.packages[name] || {}, pkg);
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
this.initPackagesFolder();
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
initPackagesFolder() {
|
|
217
|
-
const registerPackageFolder = (packageFolderName, packageInfo) => {
|
|
218
|
-
const packageName = packageInfo.package;
|
|
219
|
-
if (this.packages[packageName]) return;
|
|
220
|
-
|
|
221
|
-
const packagePath = path.normalize(
|
|
222
|
-
`${this.voltoPath}/packages/${packageFolderName}/src`,
|
|
223
|
-
);
|
|
224
|
-
const packageJsonPath = path.normalize(
|
|
225
|
-
`${this.voltoPath}/packages/${packageFolderName}/package.json`,
|
|
226
|
-
);
|
|
227
|
-
|
|
228
|
-
// some tests set the root in a location that doesn't have the packages
|
|
229
|
-
if (!fs.existsSync(packagePath)) return;
|
|
230
|
-
|
|
231
|
-
this.packages[packageName] = {
|
|
232
|
-
modulePath: packagePath,
|
|
233
|
-
packageJson: packageJsonPath,
|
|
234
|
-
version: require(packageJsonPath).version,
|
|
235
|
-
isPublishedPackage: false,
|
|
236
|
-
isRegisteredAddon: false,
|
|
237
|
-
name: packageName,
|
|
238
|
-
addons: [],
|
|
239
|
-
};
|
|
240
|
-
this.addonNames.push(packageName);
|
|
241
|
-
};
|
|
242
|
-
|
|
243
|
-
Object.keys(this.packagesFolderAddons).forEach((packageFolderName) => {
|
|
244
|
-
registerPackageFolder(
|
|
245
|
-
packageFolderName,
|
|
246
|
-
this.packagesFolderAddons[packageFolderName],
|
|
247
|
-
);
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* Add path to the "src" of npm-released packages. These packages can
|
|
253
|
-
* release their source code in src, or transpile. The "main" of their
|
|
254
|
-
* package.json needs to point to the module that exports `applyConfig` as
|
|
255
|
-
* default.
|
|
256
|
-
*/
|
|
257
|
-
initPublishedPackages() {
|
|
258
|
-
this.addonNames.forEach(this.initPublishedPackage.bind(this));
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
initPublishedPackage(name) {
|
|
262
|
-
if (!Object.keys(this.packages).includes(name)) {
|
|
263
|
-
const resolved = require.resolve(name, { paths: [this.projectRootPath] });
|
|
264
|
-
const basePath = getPackageBasePath(resolved);
|
|
265
|
-
const packageJson = path.join(basePath, 'package.json');
|
|
266
|
-
const pkg = require(packageJson);
|
|
267
|
-
const main = pkg.main || 'src/index.js';
|
|
268
|
-
const modulePath = path.dirname(require.resolve(`${basePath}/${main}`));
|
|
269
|
-
const innerAddons = pkg.addons || [];
|
|
270
|
-
const innerAddonsNormalized = innerAddons.map((s) => s.split(':')[0]);
|
|
271
|
-
if (this.addonNames.includes(name) && innerAddonsNormalized.length > 0) {
|
|
272
|
-
innerAddonsNormalized.forEach((name) => {
|
|
273
|
-
if (!this.addonNames.includes(name)) this.addonNames.push(name);
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
this.packages[name] = {
|
|
277
|
-
name,
|
|
278
|
-
version: pkg.version,
|
|
279
|
-
isPublishedPackage: true,
|
|
280
|
-
isRegisteredAddon: this.addonNames.includes(name),
|
|
281
|
-
modulePath,
|
|
282
|
-
packageJson,
|
|
283
|
-
addons: pkg.addons || [],
|
|
284
|
-
};
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
initAddonsFromEnvVar() {
|
|
289
|
-
if (process.env.ADDONS) {
|
|
290
|
-
process.env.ADDONS.split(';').forEach(
|
|
291
|
-
this.initAddonFromEnvVar.bind(this),
|
|
292
|
-
);
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
initAddonFromEnvVar(name) {
|
|
297
|
-
// First lookup in the packages folder, local to the root (either vanilla Volto or project)
|
|
298
|
-
const normalizedAddonName = name.split(':')[0];
|
|
299
|
-
const testingPackagePath = `${this.projectRootPath}/packages/${normalizedAddonName}/src`;
|
|
300
|
-
if (fs.existsSync(testingPackagePath)) {
|
|
301
|
-
const basePath = getPackageBasePath(testingPackagePath);
|
|
302
|
-
const packageJson = path.join(basePath, 'package.json');
|
|
303
|
-
|
|
304
|
-
if (!this.addonNames.includes(normalizedAddonName))
|
|
305
|
-
this.addonNames.push(normalizedAddonName);
|
|
306
|
-
const pkg = {
|
|
307
|
-
modulePath: testingPackagePath,
|
|
308
|
-
version: require(packageJson).version,
|
|
309
|
-
packageJson: packageJson,
|
|
310
|
-
isPublishedPackage: false,
|
|
311
|
-
isRegisteredAddon: this.addonNames.includes(name),
|
|
312
|
-
name: normalizedAddonName,
|
|
313
|
-
addons: require(packageJson).addons || [],
|
|
314
|
-
};
|
|
315
|
-
|
|
316
|
-
this.packages[normalizedAddonName] = Object.assign(
|
|
317
|
-
this.packages[normalizedAddonName] || {},
|
|
318
|
-
pkg,
|
|
319
|
-
);
|
|
320
|
-
} else {
|
|
321
|
-
// Fallback in case the addon is released (not in packages folder nor in development, but in node_modules)
|
|
322
|
-
const normalizedAddonName = name.split(':')[0];
|
|
323
|
-
this.initPublishedPackage(normalizedAddonName);
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
/**
|
|
328
|
-
* Allow addons to provide various extenders.
|
|
329
|
-
*
|
|
330
|
-
* The razzle.extend.js modules (named razzle.extend.js) needs to provide
|
|
331
|
-
* two functions:
|
|
332
|
-
* `plugins(defaultPlugins) => plugins` and
|
|
333
|
-
* `modify(...) => config`
|
|
334
|
-
*
|
|
335
|
-
* The eslint.extend.js
|
|
336
|
-
*/
|
|
337
|
-
initAddonExtenders() {
|
|
338
|
-
this.getAddons().forEach((addon) => {
|
|
339
|
-
const base = path.dirname(addon.packageJson);
|
|
340
|
-
const razzlePath = path.resolve(`${base}/razzle.extend.js`);
|
|
341
|
-
if (fs.existsSync(razzlePath)) {
|
|
342
|
-
addon.razzleExtender = razzlePath;
|
|
343
|
-
}
|
|
344
|
-
const eslintPath = path.resolve(`${base}/eslint.extend.js`);
|
|
345
|
-
if (fs.existsSync(eslintPath)) {
|
|
346
|
-
addon.eslintExtender = eslintPath;
|
|
347
|
-
}
|
|
348
|
-
});
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
/**
|
|
352
|
-
* Returns the addon records, respects order from package.json:addons
|
|
353
|
-
*/
|
|
354
|
-
getAddons() {
|
|
355
|
-
return this.dependencyGraph
|
|
356
|
-
.dependenciesOf('@root')
|
|
357
|
-
.map((name) => this.packages[name]);
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
getAddonExtenders() {
|
|
361
|
-
return this.getAddons()
|
|
362
|
-
.map((o) => o.razzleExtender)
|
|
363
|
-
.filter((e) => e);
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
getEslintExtenders() {
|
|
367
|
-
return this.getAddons()
|
|
368
|
-
.map((o) => o.eslintExtender)
|
|
369
|
-
.filter((e) => e);
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
getCustomThemeAddons() {
|
|
373
|
-
const customThemeAddonsInfo = {
|
|
374
|
-
variables: [],
|
|
375
|
-
main: [],
|
|
376
|
-
};
|
|
377
|
-
|
|
378
|
-
this.getAddonDependencies().forEach((addon) => {
|
|
379
|
-
const normalizedAddonName = addon.split(':')[0];
|
|
380
|
-
// We have two possible insertion points, variables and main
|
|
381
|
-
|
|
382
|
-
const customThemeVariables = `${this.packages[normalizedAddonName].modulePath}/theme/_variables.scss`;
|
|
383
|
-
const customThemeMain = `${this.packages[normalizedAddonName].modulePath}/theme/_main.scss`;
|
|
384
|
-
if (
|
|
385
|
-
fs.existsSync(customThemeVariables) &&
|
|
386
|
-
normalizedAddonName !== this.theme
|
|
387
|
-
) {
|
|
388
|
-
customThemeAddonsInfo.variables.push(normalizedAddonName);
|
|
389
|
-
}
|
|
390
|
-
if (
|
|
391
|
-
fs.existsSync(customThemeMain) &&
|
|
392
|
-
normalizedAddonName !== this.theme
|
|
393
|
-
) {
|
|
394
|
-
customThemeAddonsInfo.main.push(normalizedAddonName);
|
|
395
|
-
}
|
|
396
|
-
});
|
|
397
|
-
|
|
398
|
-
return customThemeAddonsInfo;
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
/**
|
|
402
|
-
* Returns a mapping name:diskpath to be uses in webpack's resolve aliases
|
|
403
|
-
*/
|
|
404
|
-
getResolveAliases() {
|
|
405
|
-
const pairs = [
|
|
406
|
-
...Object.keys(this.packages).map((o) => [
|
|
407
|
-
o,
|
|
408
|
-
this.packages[o].modulePath,
|
|
409
|
-
]),
|
|
410
|
-
];
|
|
411
|
-
|
|
412
|
-
return fromEntries(pairs);
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
/**
|
|
416
|
-
* Retrieves a mapping (to be used in resolve aliases) of module name to
|
|
417
|
-
* filestype paths, to be used as customization paths.
|
|
418
|
-
*
|
|
419
|
-
* There are two styles of customizations: "classic style" and "addons style"
|
|
420
|
-
*
|
|
421
|
-
* In the classic style, the customization folders are only used to customize
|
|
422
|
-
* Volto itself, so inside it we'll find a mirror of the Volto project
|
|
423
|
-
* structure.
|
|
424
|
-
*
|
|
425
|
-
* In the "addons style" customization folder, we allow customization of
|
|
426
|
-
* addons along with Volto customization, so we need separate folders. By
|
|
427
|
-
* convention, we use a folder called "volto" inside customizations folder
|
|
428
|
-
* and separate folder for each addon, identified by its addon (package) name.
|
|
429
|
-
*/
|
|
430
|
-
getCustomizationPaths(packageJson, rootPath) {
|
|
431
|
-
const aliases = {};
|
|
432
|
-
let { customizationPaths } = packageJson;
|
|
433
|
-
if (!customizationPaths) {
|
|
434
|
-
customizationPaths = ['src/customizations'];
|
|
435
|
-
}
|
|
436
|
-
customizationPaths.forEach((customizationPath) => {
|
|
437
|
-
customizationPath = customizationPath.endsWith('/')
|
|
438
|
-
? customizationPath.slice(0, customizationPath.length - 1)
|
|
439
|
-
: customizationPath;
|
|
440
|
-
const base = path.join(rootPath, customizationPath);
|
|
441
|
-
const reg = [];
|
|
442
|
-
|
|
443
|
-
// All registered addon packages (in tsconfig.json/jsconfig.json and package.json:addons)
|
|
444
|
-
// can be customized
|
|
445
|
-
Object.values(this.packages).forEach((addon) => {
|
|
446
|
-
const { name, modulePath } = addon;
|
|
447
|
-
if (fs.existsSync(path.join(base, name))) {
|
|
448
|
-
reg.push({
|
|
449
|
-
customPath: path.join(base, name),
|
|
450
|
-
sourcePath: modulePath,
|
|
451
|
-
name,
|
|
452
|
-
});
|
|
453
|
-
}
|
|
454
|
-
});
|
|
455
|
-
|
|
456
|
-
// allow customization of modules in the `@root` namespace from addons,
|
|
457
|
-
// by creating a folder called `@root`.
|
|
458
|
-
const rootBase = path.join(base, '@root');
|
|
459
|
-
if (fs.existsSync(rootBase))
|
|
460
|
-
reg.push({
|
|
461
|
-
customPath: rootBase,
|
|
462
|
-
sourcePath: `${this.projectRootPath}/src`,
|
|
463
|
-
name: '@root',
|
|
464
|
-
});
|
|
465
|
-
|
|
466
|
-
reg.push(
|
|
467
|
-
fs.existsSync(path.join(base, 'volto'))
|
|
468
|
-
? {
|
|
469
|
-
// new style (addons) customizations
|
|
470
|
-
customPath: path.join(base, 'volto'),
|
|
471
|
-
sourcePath: `${this.voltoPath}/src/`,
|
|
472
|
-
name: '@plone/volto',
|
|
473
|
-
}
|
|
474
|
-
: {
|
|
475
|
-
// old style, customizations directly in folder
|
|
476
|
-
customPath: base,
|
|
477
|
-
sourcePath: `${this.voltoPath}/src/`,
|
|
478
|
-
name: '@plone/volto',
|
|
479
|
-
},
|
|
480
|
-
);
|
|
481
|
-
|
|
482
|
-
reg.forEach(({ customPath, name, sourcePath }) => {
|
|
483
|
-
map(
|
|
484
|
-
glob(
|
|
485
|
-
`${customPath}/**/*.*(svg|png|jpg|jpeg|gif|ico|less|js|jsx|ts|tsx)`,
|
|
486
|
-
),
|
|
487
|
-
(filename) => {
|
|
488
|
-
const targetPath = filename.replace(customPath, sourcePath);
|
|
489
|
-
if (fs.existsSync(targetPath)) {
|
|
490
|
-
aliases[
|
|
491
|
-
filename
|
|
492
|
-
.replace(customPath, name)
|
|
493
|
-
.replace(/\.(js|jsx|ts|tsx)$/, '')
|
|
494
|
-
] = path.resolve(filename);
|
|
495
|
-
} else {
|
|
496
|
-
debug(
|
|
497
|
-
`The file ${filename} doesn't exist in the ${name} (${targetPath}), unable to customize.`,
|
|
498
|
-
);
|
|
499
|
-
}
|
|
500
|
-
},
|
|
501
|
-
);
|
|
502
|
-
});
|
|
503
|
-
});
|
|
504
|
-
|
|
505
|
-
return aliases;
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
getProjectCustomizationPaths() {
|
|
509
|
-
return this.getCustomizationPaths(this.packageJson, this.projectRootPath);
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
/**
|
|
513
|
-
* Allow addons to customize Volto and other addons.
|
|
514
|
-
*
|
|
515
|
-
* We follow the same logic for overriding as the main `package.json:addons`.
|
|
516
|
-
* First declared addon gets overridden by subsequent declared addons. That
|
|
517
|
-
* means: customization in volto-addonA will potentially be rewritten by
|
|
518
|
-
* customizations in volto-addonB if the declaration in package.json is like:
|
|
519
|
-
* `addons:volto-addonA,volto-addonB`
|
|
520
|
-
*/
|
|
521
|
-
getAddonCustomizationPaths() {
|
|
522
|
-
let aliases = {};
|
|
523
|
-
this.getAddons().forEach((addon) => {
|
|
524
|
-
aliases = {
|
|
525
|
-
...aliases,
|
|
526
|
-
...this.getCustomizationPaths(
|
|
527
|
-
require(addon.packageJson),
|
|
528
|
-
getPackageBasePath(addon.modulePath),
|
|
529
|
-
),
|
|
530
|
-
};
|
|
531
|
-
});
|
|
532
|
-
return aliases;
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
/**
|
|
536
|
-
* Allow packages from addons set in env vars to customize Volto and other addons.
|
|
537
|
-
*
|
|
538
|
-
* Same as the above one, but specific for Volto addons coming from env vars
|
|
539
|
-
*/
|
|
540
|
-
getAddonsFromEnvVarCustomizationPaths() {
|
|
541
|
-
let aliases = {};
|
|
542
|
-
if (process.env.ADDONS) {
|
|
543
|
-
process.env.ADDONS.split(';').forEach((addon) => {
|
|
544
|
-
const normalizedAddonName = addon.split(':')[0];
|
|
545
|
-
const testingPackagePath = `${this.projectRootPath}/packages/${normalizedAddonName}/src`;
|
|
546
|
-
if (fs.existsSync(testingPackagePath)) {
|
|
547
|
-
const basePath = getPackageBasePath(testingPackagePath);
|
|
548
|
-
const packageJson = path.join(basePath, 'package.json');
|
|
549
|
-
aliases = {
|
|
550
|
-
...aliases,
|
|
551
|
-
...this.getCustomizationPaths(require(packageJson), basePath),
|
|
552
|
-
};
|
|
553
|
-
}
|
|
554
|
-
});
|
|
555
|
-
|
|
556
|
-
return aliases;
|
|
557
|
-
} else {
|
|
558
|
-
return [];
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
/**
|
|
563
|
-
* Returns an agregated, dependency-resolved list of addon loader strings
|
|
564
|
-
*/
|
|
565
|
-
getAddonDependencies() {
|
|
566
|
-
return getAddonsLoaderChain(this.dependencyGraph);
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
getDotDependencyGraph() {
|
|
570
|
-
const seen = new Set();
|
|
571
|
-
let out = `digraph {
|
|
572
|
-
layout="fdp"
|
|
573
|
-
beautify=true
|
|
574
|
-
sep="+10"
|
|
575
|
-
splines=curved
|
|
576
|
-
|
|
577
|
-
"@root" [color = red fillcolor=yellow style=filled]
|
|
578
|
-
`;
|
|
579
|
-
let queue = ['@root'];
|
|
580
|
-
let name;
|
|
581
|
-
|
|
582
|
-
while (queue.length > 0) {
|
|
583
|
-
name = queue.pop();
|
|
584
|
-
|
|
585
|
-
const deps = this.dependencyGraph.directDependenciesOf(name);
|
|
586
|
-
for (let i = 0; i < deps.length; i++) {
|
|
587
|
-
const dep = deps[i];
|
|
588
|
-
|
|
589
|
-
if (!seen.has(dep)) {
|
|
590
|
-
seen.add(dep);
|
|
591
|
-
queue.push(dep);
|
|
592
|
-
}
|
|
593
|
-
out += ` "${name}" -> "${dep}"\n`;
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
out += '}';
|
|
597
|
-
return out;
|
|
598
|
-
}
|
|
599
|
-
}
|
|
600
|
-
|
|
601
|
-
module.exports = AddonConfigurationRegistry;
|
|
602
|
-
module.exports.getAddonsLoaderChain = getAddonsLoaderChain;
|
|
603
|
-
module.exports.buildDependencyGraph = buildDependencyGraph;
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
const tmp = require('tmp');
|
|
3
|
-
const cryptoRandomString = require('crypto-random-string');
|
|
4
|
-
|
|
5
|
-
const titleCase = (w) => w.slice(0, 1).toUpperCase() + w.slice(1, w.length);
|
|
6
|
-
|
|
7
|
-
/*
|
|
8
|
-
* Transforms a package name to javascript variable name
|
|
9
|
-
*/
|
|
10
|
-
function nameFromPackage(name) {
|
|
11
|
-
name =
|
|
12
|
-
name.replace(/[@~./\\:\s]/gi, '') ||
|
|
13
|
-
cryptoRandomString({ length: 10, characters: 'abcdefghijk' });
|
|
14
|
-
return name
|
|
15
|
-
.split('-')
|
|
16
|
-
.map((w, i) => (i > 0 ? titleCase(w) : w))
|
|
17
|
-
.join('');
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/*
|
|
21
|
-
* Creates a static file with code necessary to load the addons configuration
|
|
22
|
-
*
|
|
23
|
-
*/
|
|
24
|
-
function getAddonsLoaderCode(addons = [], addonsInfo) {
|
|
25
|
-
let buf = `/*
|
|
26
|
-
This file is autogenerated. Don't change it directly.
|
|
27
|
-
Instead, change the "addons" setting in your package.json file.
|
|
28
|
-
*/
|
|
29
|
-
|
|
30
|
-
const projectConfigLoader = require('@root/config');
|
|
31
|
-
`;
|
|
32
|
-
let configsToLoad = [],
|
|
33
|
-
counter = 0;
|
|
34
|
-
|
|
35
|
-
addons.forEach((addonConfigString) => {
|
|
36
|
-
let extras = [];
|
|
37
|
-
const addonConfigLoadInfo = addonConfigString.split(':');
|
|
38
|
-
const pkgName = addonConfigLoadInfo[0];
|
|
39
|
-
const defaultImport = nameFromPackage(pkgName);
|
|
40
|
-
if (addonConfigLoadInfo.length > 1) {
|
|
41
|
-
extras = addonConfigLoadInfo[1].split(',');
|
|
42
|
-
}
|
|
43
|
-
extras = extras.map((name) => [name, `${name}${counter++}`]);
|
|
44
|
-
|
|
45
|
-
const line = `import ${defaultImport}${
|
|
46
|
-
extras.length
|
|
47
|
-
? `, { ${extras
|
|
48
|
-
.map((ex) => {
|
|
49
|
-
return `${ex[0]} as ${ex[1]}`;
|
|
50
|
-
})
|
|
51
|
-
.join(', ')} }`
|
|
52
|
-
: ''
|
|
53
|
-
} from '${pkgName}';\n`;
|
|
54
|
-
buf += line;
|
|
55
|
-
configsToLoad = [
|
|
56
|
-
...configsToLoad,
|
|
57
|
-
defaultImport,
|
|
58
|
-
...extras.map((ex) => ex[1]),
|
|
59
|
-
];
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
buf += `
|
|
63
|
-
${
|
|
64
|
-
addonsInfo
|
|
65
|
-
? `const addonsInfo = ${JSON.stringify(addonsInfo)}`
|
|
66
|
-
: 'const addonsInfo = {}'
|
|
67
|
-
};
|
|
68
|
-
export { addonsInfo };
|
|
69
|
-
`;
|
|
70
|
-
|
|
71
|
-
buf += `
|
|
72
|
-
const safeWrapper = (func) => (config) => {
|
|
73
|
-
const res = func(config);
|
|
74
|
-
if (typeof res === 'undefined') {
|
|
75
|
-
throw new Error("Configuration function doesn't return config");
|
|
76
|
-
}
|
|
77
|
-
return res;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const projectConfig = (config) => {
|
|
81
|
-
return typeof projectConfigLoader.default === "function" ? projectConfigLoader.default(config) : config;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const load = (config) => {
|
|
85
|
-
const addonLoaders = [${configsToLoad.join(', ')}];
|
|
86
|
-
if(!addonLoaders.every((el) => typeof el === "function")) {
|
|
87
|
-
throw new TypeError(
|
|
88
|
-
'Each addon has to provide a function applying its configuration to the projects configuration.',
|
|
89
|
-
);
|
|
90
|
-
}
|
|
91
|
-
return projectConfig(addonLoaders.reduce((acc, apply) => safeWrapper(apply)(acc), config));
|
|
92
|
-
};
|
|
93
|
-
export default load;
|
|
94
|
-
`;
|
|
95
|
-
|
|
96
|
-
return buf;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
module.exports = (addons, addonsInfo, { tempInProject } = {}) => {
|
|
100
|
-
// Some frameworks do not allow to load code from outside the project.
|
|
101
|
-
// the `tempInProject` allows to place it inside
|
|
102
|
-
let addonsLoaderPath;
|
|
103
|
-
if (tempInProject) {
|
|
104
|
-
const path = require('path');
|
|
105
|
-
addonsLoaderPath = path.join(process.cwd(), 'src', '.addons-loader.js');
|
|
106
|
-
} else {
|
|
107
|
-
addonsLoaderPath = tmp.tmpNameSync({ postfix: '.js' });
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const code = getAddonsLoaderCode(addons, addonsInfo);
|
|
111
|
-
fs.writeFileSync(addonsLoaderPath, Buffer.from(code));
|
|
112
|
-
return addonsLoaderPath;
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
module.exports.getAddonsLoaderCode = getAddonsLoaderCode;
|
|
116
|
-
module.exports.nameFromPackage = nameFromPackage;
|