@ui5/webcomponents-tools 0.0.0-b4cbc43ba → 0.0.0-b6f02e4b3
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/CHANGELOG.md +159 -0
- package/README.md +1 -1
- package/assets-meta.js +16 -1
- package/components-package/nps.js +41 -28
- package/components-package/postcss.themes.js +6 -3
- package/components-package/rollup-plugins/empty-module.js +15 -0
- package/components-package/rollup.js +81 -78
- package/components-package/wdio.js +51 -26
- package/components-package/wdio.sync.js +360 -0
- package/icons-collection/nps.js +46 -8
- package/lib/copy-and-watch/index.js +30 -4
- package/lib/copy-list/index.js +28 -0
- package/lib/create-icons/index.js +76 -56
- package/lib/create-illustrations/index.js +161 -0
- package/lib/create-new-component/index.js +12 -4
- package/lib/documentation/index.js +120 -107
- package/lib/documentation/templates/api-properties-section.js +3 -1
- package/lib/documentation/templates/template.js +2 -1
- package/lib/esm-abs-to-rel/index.js +58 -0
- package/lib/generate-json-imports/i18n.js +75 -30
- package/lib/generate-json-imports/themes.js +61 -23
- package/lib/hbs2lit/src/compiler.js +12 -3
- package/lib/hbs2lit/src/includesReplacer.js +5 -5
- package/lib/hbs2lit/src/litVisitor2.js +31 -6
- package/lib/hbs2lit/src/svgProcessor.js +3 -3
- package/lib/hbs2ui5/RenderTemplates/LitRenderer.js +4 -11
- package/lib/hbs2ui5/index.js +37 -21
- package/lib/i18n/defaults.js +49 -57
- package/lib/i18n/toJSON.js +13 -12
- package/lib/jsdoc/plugin.js +30 -1
- package/lib/jsdoc/template/publish.js +22 -2
- package/lib/postcss-combine-duplicated-selectors/index.js +178 -0
- package/lib/postcss-css-to-esm/index.js +19 -16
- package/lib/postcss-css-to-json/index.js +20 -11
- package/lib/postcss-new-files/index.js +36 -0
- package/lib/postcss-p/postcss-p.mjs +11 -0
- package/lib/replace-global-core/index.js +25 -0
- package/lib/scoping/lint-src.js +1 -1
- package/lib/scoping/missing-dependencies.js +65 -0
- package/lib/scoping/report-tags-usage.js +28 -0
- package/lib/serve/index.js +46 -0
- package/{components-package → lib/serve}/serve.json +0 -0
- package/package.json +44 -52
- package/bin/init-ui5-package.js +0 -3
- package/lib/init-package/index.js +0 -123
- package/lib/init-package/resources/.eslintignore +0 -3
- package/lib/init-package/resources/bundle.es5.js +0 -25
- package/lib/init-package/resources/bundle.esm.js +0 -31
- package/lib/init-package/resources/config/.eslintrc.js +0 -1
- package/lib/init-package/resources/config/postcss.components/postcss.config.js +0 -1
- package/lib/init-package/resources/config/postcss.themes/postcss.config.js +0 -1
- package/lib/init-package/resources/config/rollup.config.js +0 -1
- package/lib/init-package/resources/config/wdio.conf.js +0 -1
- package/lib/init-package/resources/package-scripts.js +0 -11
- package/lib/init-package/resources/src/Assets.js +0 -5
- package/lib/init-package/resources/src/MyFirstComponent.hbs +0 -1
- package/lib/init-package/resources/src/MyFirstComponent.js +0 -56
- package/lib/init-package/resources/src/i18n/messagebundle.properties +0 -2
- package/lib/init-package/resources/src/i18n/messagebundle_de.properties +0 -1
- package/lib/init-package/resources/src/i18n/messagebundle_en.properties +0 -1
- package/lib/init-package/resources/src/i18n/messagebundle_es.properties +0 -1
- package/lib/init-package/resources/src/i18n/messagebundle_fr.properties +0 -1
- package/lib/init-package/resources/src/themes/MyFirstComponent.css +0 -11
- package/lib/init-package/resources/src/themes/sap_belize/parameters-bundle.css +0 -3
- package/lib/init-package/resources/src/themes/sap_belize_hcb/parameters-bundle.css +0 -3
- package/lib/init-package/resources/src/themes/sap_belize_hcw/parameters-bundle.css +0 -3
- package/lib/init-package/resources/src/themes/sap_fiori_3/parameters-bundle.css +0 -3
- package/lib/init-package/resources/src/themes/sap_fiori_3_dark/parameters-bundle.css +0 -3
- package/lib/init-package/resources/src/themes/sap_fiori_3_hcb/parameters-bundle.css +0 -3
- package/lib/init-package/resources/src/themes/sap_fiori_3_hcw/parameters-bundle.css +0 -3
- package/lib/init-package/resources/test/pages/index.html +0 -56
- package/lib/init-package/resources/test/specs/Demo.spec.js +0 -12
@@ -1,56 +1,76 @@
|
|
1
|
-
const fs = require("fs");
|
2
|
-
const path = require("path");
|
3
|
-
|
4
|
-
|
5
|
-
const
|
6
|
-
const srcFile = path.normalize(`src/${collectionName}.json`);
|
7
|
-
const destDir = path.normalize("dist/");
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
const
|
12
|
-
|
13
|
-
const
|
14
|
-
const
|
15
|
-
const
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
const
|
27
|
-
const
|
28
|
-
const
|
29
|
-
const
|
30
|
-
const
|
31
|
-
|
32
|
-
registerIcon(name, { pathData, ltr, accData, collection });
|
33
|
-
|
34
|
-
export default { pathData, accData };`;
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
1
|
+
const fs = require("fs").promises;
|
2
|
+
const path = require("path");
|
3
|
+
|
4
|
+
const collectionName = process.argv[2] || "SAP-icons";
|
5
|
+
const collectionVersion = process.argv[3];
|
6
|
+
const srcFile = collectionVersion ? path.normalize(`src/${collectionVersion}/${collectionName}.json`) : path.normalize(`src/${collectionName}.json`);
|
7
|
+
const destDir = collectionVersion ? path.normalize(`dist/${collectionVersion}/`) : path.normalize("dist/");
|
8
|
+
|
9
|
+
const iconTemplate = (name, pathData, ltr, collection, packageName) => `import { registerIcon } from "@ui5/webcomponents-base/dist/asset-registries/Icons.js";
|
10
|
+
|
11
|
+
const name = "${name}";
|
12
|
+
const pathData = "${pathData}";
|
13
|
+
const ltr = ${ltr};
|
14
|
+
const collection = "${collection}";
|
15
|
+
const packageName = "${packageName}";
|
16
|
+
|
17
|
+
registerIcon(name, { pathData, ltr, collection, packageName });
|
18
|
+
|
19
|
+
export default { pathData };`;
|
20
|
+
|
21
|
+
|
22
|
+
const iconAccTemplate = (name, pathData, ltr, accData, collection, packageName) => `import { registerIcon } from "@ui5/webcomponents-base/dist/asset-registries/Icons.js";
|
23
|
+
import { ${accData.key} } from "../generated/i18n/i18n-defaults.js";
|
24
|
+
|
25
|
+
const name = "${name}";
|
26
|
+
const pathData = "${pathData}";
|
27
|
+
const ltr = ${ltr};
|
28
|
+
const accData = ${accData.key};
|
29
|
+
const collection = "${collection}";
|
30
|
+
const packageName = "${packageName}";
|
31
|
+
|
32
|
+
registerIcon(name, { pathData, ltr, accData, collection, packageName });
|
33
|
+
|
34
|
+
export default { pathData, accData };`;
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
const collectionTemplate = (name) => `import { isThemeFamily } from "@ui5/webcomponents-base/dist/config/Theme.js";
|
39
|
+
import pathDataV4 from "./v5/${name}.js";
|
40
|
+
import pathDataV5 from "./v4/${name}.js";
|
41
|
+
const pathData = isThemeFamily("sap_horizon") ? pathDataV5 : pathDataV4;
|
42
|
+
export default { pathData };`;
|
43
|
+
|
44
|
+
|
45
|
+
const svgTemplate = (pathData) => `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
46
|
+
<path d="${pathData}"/>
|
47
|
+
</svg>`;
|
48
|
+
|
49
|
+
const createIcons = async (file) => {
|
50
|
+
await fs.mkdir(destDir, { recursive: true });
|
51
|
+
|
52
|
+
const json = JSON.parse(await fs.readFile(file));
|
53
|
+
|
54
|
+
const promises = [];
|
55
|
+
for (let name in json.data) {
|
56
|
+
const iconData = json.data[name];
|
57
|
+
const pathData = iconData.path;
|
58
|
+
const ltr = !!iconData.ltr;
|
59
|
+
const acc = iconData.acc;
|
60
|
+
|
61
|
+
const content = acc ? iconAccTemplate(name, pathData, ltr, acc, json.collection, json.packageName) : iconTemplate(name, pathData, ltr, json.collection, json.packageName);
|
62
|
+
|
63
|
+
promises.push(fs.writeFile(path.join(destDir, `${name}.js`), content));
|
64
|
+
promises.push(fs.writeFile(path.join(destDir, `${name}.svg`), svgTemplate(pathData)));
|
65
|
+
|
66
|
+
if (json.version) {
|
67
|
+
promises.push(fs.writeFile(path.join(path.normalize("dist/"), `${name}.js`), collectionTemplate(name)));
|
68
|
+
}
|
69
|
+
}
|
70
|
+
|
71
|
+
return Promise.all(promises);
|
72
|
+
};
|
73
|
+
|
74
|
+
createIcons(srcFile).then(() => {
|
75
|
+
console.log("Icons created.");
|
76
|
+
});
|
@@ -0,0 +1,161 @@
|
|
1
|
+
const fs = require("fs").promises;
|
2
|
+
const path = require("path");
|
3
|
+
|
4
|
+
if (process.argv.length < 7) {
|
5
|
+
throw new Error("Not enough arguments");
|
6
|
+
}
|
7
|
+
|
8
|
+
const generate = async () => {
|
9
|
+
|
10
|
+
const ORIGINAL_TEXTS = {
|
11
|
+
UnableToLoad: "UnableToLoad",
|
12
|
+
UnableToUpload: "UnableToUpload",
|
13
|
+
NoActivities: "NoActivities",
|
14
|
+
BeforeSearch: "BeforeSearch",
|
15
|
+
NoSearchResults: "NoSearchResults",
|
16
|
+
NoEntries: "NoEntries",
|
17
|
+
NoData: "NoData",
|
18
|
+
NoNotifications: "NoNotifications",
|
19
|
+
BalloonSky: "BalloonSky",
|
20
|
+
SuccessScreen: "SuccessScreen",
|
21
|
+
NoMail: "NoMail",
|
22
|
+
NoSavedItems: "NoSavedItems",
|
23
|
+
NoTasks: "NoTasks"
|
24
|
+
};
|
25
|
+
|
26
|
+
const FALLBACK_TEXTS = {
|
27
|
+
ReloadScreen: ORIGINAL_TEXTS.UnableToLoad,
|
28
|
+
Connection: ORIGINAL_TEXTS.UnableToLoad,
|
29
|
+
ErrorScreen: ORIGINAL_TEXTS.UnableToUpload,
|
30
|
+
EmptyCalendar: ORIGINAL_TEXTS.NoActivities,
|
31
|
+
SearchEarth: ORIGINAL_TEXTS.BeforeSearch,
|
32
|
+
SearchFolder: ORIGINAL_TEXTS.NoSearchResults,
|
33
|
+
EmptyList: ORIGINAL_TEXTS.NoEntries,
|
34
|
+
Tent: ORIGINAL_TEXTS.NoData,
|
35
|
+
SleepingBell: ORIGINAL_TEXTS.NoNotifications,
|
36
|
+
SimpleBalloon: ORIGINAL_TEXTS.BalloonSky,
|
37
|
+
SimpleBell: ORIGINAL_TEXTS.NoNotifications,
|
38
|
+
SimpleCalendar: ORIGINAL_TEXTS.NoActivities,
|
39
|
+
SimpleCheckMark: ORIGINAL_TEXTS.SuccessScreen,
|
40
|
+
SimpleConnection: ORIGINAL_TEXTS.UnableToLoad,
|
41
|
+
SimpleEmptyDoc: ORIGINAL_TEXTS.NoData,
|
42
|
+
SimpleEmptyList: ORIGINAL_TEXTS.NoEntries,
|
43
|
+
SimpleError: ORIGINAL_TEXTS.UnableToUpload,
|
44
|
+
SimpleMagnifier: ORIGINAL_TEXTS.BeforeSearch,
|
45
|
+
SimpleMail: ORIGINAL_TEXTS.NoMail,
|
46
|
+
SimpleNoSavedItems: ORIGINAL_TEXTS.NoSavedItems,
|
47
|
+
SimpleNotFoundMagnifier: ORIGINAL_TEXTS.NoSearchResults,
|
48
|
+
SimpleReload: ORIGINAL_TEXTS.UnableToLoad,
|
49
|
+
SimpleTask: ORIGINAL_TEXTS.NoTasks,
|
50
|
+
SuccessBalloon: ORIGINAL_TEXTS.BalloonSky,
|
51
|
+
SuccessCheckMark: ORIGINAL_TEXTS.SuccessScreen,
|
52
|
+
SuccessHighFive: ORIGINAL_TEXTS.BalloonSky
|
53
|
+
};
|
54
|
+
|
55
|
+
const srcPath = process.argv[2];
|
56
|
+
const defaultText = process.argv[3] === "true";
|
57
|
+
const illustrationsPrefix = process.argv[4];
|
58
|
+
const illustrationSet = process.argv[5];
|
59
|
+
const destPath = process.argv[6];
|
60
|
+
const fileNamePattern = new RegExp(`${illustrationsPrefix}-.+-(.+).svg`);
|
61
|
+
// collect each illustration name because each one should have Sample.js file
|
62
|
+
const fileNames = new Set();
|
63
|
+
|
64
|
+
const svgImportTemplate = svgContent => {
|
65
|
+
return `export default \`${svgContent}\`;`
|
66
|
+
};
|
67
|
+
const svgToJs = async fileName => {
|
68
|
+
const svg = await fs.readFile(path.join(srcPath, fileName), {encoding: "utf-8"});
|
69
|
+
const fileContent = svgImportTemplate(svg);
|
70
|
+
fileName = fileName.replace(/\.svg$/, ".js");
|
71
|
+
|
72
|
+
return fs.writeFile(path.join(destPath, fileName), fileContent);
|
73
|
+
};
|
74
|
+
const illustrationImportTemplate = illustrationName => {
|
75
|
+
let illustrationNameForTranslation = illustrationName;
|
76
|
+
|
77
|
+
if (defaultText) {
|
78
|
+
if (FALLBACK_TEXTS[illustrationNameForTranslation]) {
|
79
|
+
illustrationNameForTranslation = FALLBACK_TEXTS[illustrationNameForTranslation];
|
80
|
+
} else if (illustrationName.indexOf("_v") !== -1) {
|
81
|
+
illustrationNameForTranslation = illustrationNameForTranslation.substr(0, illustrationNameForTranslation.indexOf('_v'));
|
82
|
+
}
|
83
|
+
}
|
84
|
+
|
85
|
+
const illustrationNameUpperCase = illustrationNameForTranslation.toUpperCase();
|
86
|
+
|
87
|
+
return defaultText ? `import { registerIllustration } from "@ui5/webcomponents-base/dist/asset-registries/Illustrations.js";
|
88
|
+
import dialogSvg from "./${illustrationsPrefix}-Dialog-${illustrationName}.js";
|
89
|
+
import sceneSvg from "./${illustrationsPrefix}-Scene-${illustrationName}.js";
|
90
|
+
import spotSvg from "./${illustrationsPrefix}-Spot-${illustrationName}.js";
|
91
|
+
import {
|
92
|
+
IM_TITLE_${illustrationNameUpperCase},
|
93
|
+
IM_SUBTITLE_${illustrationNameUpperCase},
|
94
|
+
} from "../generated/i18n/i18n-defaults.js";
|
95
|
+
|
96
|
+
const name = "${illustrationName}";
|
97
|
+
const set = "${illustrationSet}";
|
98
|
+
const title = IM_TITLE_${illustrationNameUpperCase};
|
99
|
+
const subtitle = IM_SUBTITLE_${illustrationNameUpperCase};
|
100
|
+
|
101
|
+
registerIllustration(name, {
|
102
|
+
dialogSvg,
|
103
|
+
sceneSvg,
|
104
|
+
spotSvg,
|
105
|
+
title,
|
106
|
+
subtitle,
|
107
|
+
set,
|
108
|
+
});
|
109
|
+
|
110
|
+
export {
|
111
|
+
dialogSvg,
|
112
|
+
sceneSvg,
|
113
|
+
spotSvg,
|
114
|
+
};` :
|
115
|
+
`import { registerIllustration } from "@ui5/webcomponents-base/dist/asset-registries/Illustrations.js";
|
116
|
+
import dialogSvg from "./${illustrationsPrefix}-Dialog-${illustrationName}.js";
|
117
|
+
import sceneSvg from "./${illustrationsPrefix}-Scene-${illustrationName}.js";
|
118
|
+
import spotSvg from "./${illustrationsPrefix}-Spot-${illustrationName}.js";
|
119
|
+
|
120
|
+
const name = "${illustrationName}";
|
121
|
+
const set = "${illustrationSet}";
|
122
|
+
|
123
|
+
registerIllustration(name, {
|
124
|
+
dialogSvg,
|
125
|
+
sceneSvg,
|
126
|
+
spotSvg,
|
127
|
+
set,
|
128
|
+
});
|
129
|
+
|
130
|
+
export {
|
131
|
+
dialogSvg,
|
132
|
+
sceneSvg,
|
133
|
+
spotSvg,
|
134
|
+
};`
|
135
|
+
};
|
136
|
+
|
137
|
+
await fs.mkdir(destPath, { recursive: true });
|
138
|
+
|
139
|
+
const illustrationFileNames = await fs.readdir(path.normalize(srcPath));
|
140
|
+
|
141
|
+
// convert SVG to JS imports
|
142
|
+
const promises = [];
|
143
|
+
illustrationFileNames.forEach(illustration => {
|
144
|
+
if (fileNamePattern.test(illustration)) {
|
145
|
+
let [fileName, illustrationName] = illustration.match(fileNamePattern);
|
146
|
+
|
147
|
+
promises.push(svgToJs(fileName));
|
148
|
+
fileNames.add(illustrationName);
|
149
|
+
}
|
150
|
+
});
|
151
|
+
|
152
|
+
for (let illustrationName of fileNames) {
|
153
|
+
promises.push(fs.writeFile(path.join(destPath, `${illustrationName}.js`), illustrationImportTemplate(illustrationName)));
|
154
|
+
}
|
155
|
+
|
156
|
+
return Promise.all(promises);
|
157
|
+
};
|
158
|
+
|
159
|
+
generate().then(() => {
|
160
|
+
console.log("Illustrations generated.");
|
161
|
+
});
|
@@ -139,8 +139,16 @@ console.log(`Successfully generated ${componentName}.js`);
|
|
139
139
|
console.log(`Successfully generated ${componentName}.css`);
|
140
140
|
console.log(`Successfully generated ${componentName}.hbs`);
|
141
141
|
|
142
|
+
const bundleLogger = fs.createWriteStream("./bundle.common.js", {
|
143
|
+
flags: "a" // appending
|
144
|
+
});
|
145
|
+
|
146
|
+
bundleLogger.write(`
|
147
|
+
// TODO: Move this line in order to keep the file sorted alphabetically
|
148
|
+
import ${componentName} from "./dist/${componentName}.js";`);
|
149
|
+
|
142
150
|
// Change the color of the output
|
143
|
-
console.warn('\x1b[33m%s\x1b[0m', `
|
144
|
-
|
145
|
-
|
146
|
-
`);
|
151
|
+
console.warn('\x1b[33m%s\x1b[0m', `
|
152
|
+
Component is imported in bundle.common.js.
|
153
|
+
Do NOT forget to sort the file in alphabeticall order.
|
154
|
+
`);
|
@@ -7,149 +7,162 @@ const eventsTemplate = require('./templates/api-events-section').template;
|
|
7
7
|
const methodsTemplate = require('./templates/api-methods-section').template;
|
8
8
|
const cssVariablesTemplate = require('./templates/api-css-variables-section').template;
|
9
9
|
const Handlebars = require('handlebars/dist/handlebars.min.js');
|
10
|
-
const fs = require('fs');
|
10
|
+
const fs = require('fs').promises;
|
11
11
|
const path = require('path');
|
12
|
-
const
|
12
|
+
const beautify = require("json-beautify");
|
13
13
|
|
14
|
-
const
|
14
|
+
const generate = async () => {
|
15
15
|
|
16
|
-
const
|
17
|
-
const
|
18
|
-
const compiledSinceTemplate = Handlebars.compile(sinceTemplate);
|
19
|
-
const linkMatcher = /{@link(\s)(\w+)\s*}/gi;
|
20
|
-
const sinceMarker = "<!--since_tag_marker-->";
|
16
|
+
const apiJSONPath = path.normalize(process.argv[2]);
|
17
|
+
const api = JSON.parse(await fs.readFile(apiJSONPath));
|
21
18
|
|
22
|
-
|
23
|
-
return entries.find(element => {
|
24
|
-
return element.basename === name;
|
25
|
-
})
|
26
|
-
};
|
19
|
+
await fs.writeFile(apiJSONPath, beautify(api, null, 2, 100));
|
27
20
|
|
28
|
-
const
|
29
|
-
|
30
|
-
|
21
|
+
const entries = api['symbols'];
|
22
|
+
const compiledHandlebars = Handlebars.compile(template);
|
23
|
+
const compiledSinceTemplate = Handlebars.compile(sinceTemplate);
|
24
|
+
const linkMatcher = /{@link(\s)(\w+)\s*}/gi;
|
25
|
+
const sinceMarker = "<!--since_tag_marker-->";
|
31
26
|
|
32
|
-
const
|
33
|
-
|
34
|
-
|
27
|
+
const getComponentByName = name => {
|
28
|
+
return entries.find(element => {
|
29
|
+
return element.basename === name;
|
30
|
+
})
|
31
|
+
};
|
35
32
|
|
36
|
-
|
37
|
-
|
38
|
-
}
|
33
|
+
const getCSSVarsByName = name => {
|
34
|
+
return cssVariables[name] || [];
|
35
|
+
};
|
39
36
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
});
|
37
|
+
const capitalize = str => {
|
38
|
+
return str.replace(/^./, str => str.toUpperCase());
|
39
|
+
};
|
44
40
|
|
45
|
-
Handlebars.registerHelper('
|
46
|
-
|
47
|
-
});
|
41
|
+
Handlebars.registerHelper('toLowerCase', function (str) {
|
42
|
+
return str ? str.toLowerCase() : "";
|
43
|
+
});
|
48
44
|
|
49
|
-
Handlebars.
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
Handlebars.registerPartial('cssVariables', cssVariablesTemplate);
|
45
|
+
Handlebars.registerHelper('toKebabCase', function (str) {
|
46
|
+
const kebab = str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
|
47
|
+
return kebab !== str ? kebab : undefined;
|
48
|
+
});
|
54
49
|
|
55
|
-
|
50
|
+
Handlebars.registerHelper('checkEven', function (iIndex) {
|
51
|
+
return (iIndex % 2 === 0) ? "api-table-roll-even" : "api-table-roll-odd";
|
52
|
+
});
|
56
53
|
|
57
|
-
|
54
|
+
Handlebars.registerPartial('properties', propertiesTemplate);
|
55
|
+
Handlebars.registerPartial('slots', slotsTemplate);
|
56
|
+
Handlebars.registerPartial('events', eventsTemplate);
|
57
|
+
Handlebars.registerPartial('methods', methodsTemplate);
|
58
|
+
Handlebars.registerPartial('cssVariables', cssVariablesTemplate);
|
58
59
|
|
59
|
-
|
60
|
-
entry.cssVariables = getCSSVarsByName(entry.basename);
|
61
|
-
return entry;
|
62
|
-
}
|
60
|
+
await fs.mkdir(`dist/test-resources/api`, { recursive: true });
|
63
61
|
|
64
|
-
|
65
|
-
return component[entity].some(x => x && x.name === name);
|
66
|
-
};
|
67
|
-
const removeEmpty = arr => arr.filter(x => x);
|
62
|
+
let entriesAPI = [];
|
68
63
|
|
69
|
-
const
|
70
|
-
|
71
|
-
return
|
64
|
+
const appendCSSVarsAPI = entry => {
|
65
|
+
entry.cssVariables = getCSSVarsByName(entry.basename);
|
66
|
+
return entry;
|
72
67
|
}
|
73
|
-
const entities = ["properties", "slots", "events", "methods", "cssVariables"];
|
74
68
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
69
|
+
const componentHasEntityItem = (component, entity, name) => {
|
70
|
+
return component[entity].some(x => x && x.name === name);
|
71
|
+
};
|
72
|
+
const removeEmpty = arr => arr.filter(x => x);
|
79
73
|
|
80
|
-
|
74
|
+
const calculateAPI = component => {
|
75
|
+
if (entriesAPI.indexOf(component.basename) !== -1) {
|
76
|
+
return component;
|
77
|
+
}
|
78
|
+
const entities = ["properties", "slots", "events", "methods", "cssVariables"];
|
81
79
|
|
82
|
-
|
83
|
-
if (parent) {
|
84
|
-
let parentComponent = calculateAPI(parent);
|
80
|
+
// Initialize all entities with [] if necessary, and remove undefined things, and only leave public things
|
85
81
|
entities.forEach(entity => {
|
86
|
-
|
87
|
-
if (!componentHasEntityItem(component, entity, x.name)) {
|
88
|
-
component[entity].push(x);
|
89
|
-
}
|
90
|
-
});
|
82
|
+
component[entity] = removeEmpty(component[entity] || []).filter(x => x.visibility === "public");
|
91
83
|
});
|
92
|
-
}
|
93
84
|
|
94
|
-
|
85
|
+
component = appendCSSVarsAPI(component);
|
86
|
+
|
87
|
+
let parent = getComponentByName(component.extends);
|
88
|
+
if (parent) {
|
89
|
+
let parentComponent = calculateAPI(parent);
|
90
|
+
entities.forEach(entity => {
|
91
|
+
parentComponent[entity].forEach(x => {
|
92
|
+
if (!componentHasEntityItem(component, entity, x.name)) {
|
93
|
+
component[entity].push(x);
|
94
|
+
}
|
95
|
+
});
|
96
|
+
});
|
97
|
+
}
|
98
|
+
|
99
|
+
entriesAPI.push(component.basename);
|
95
100
|
|
96
|
-
|
97
|
-
};
|
101
|
+
return component;
|
102
|
+
};
|
98
103
|
|
99
|
-
const appendAdditionalEntriesAPI = entry => {
|
100
|
-
|
101
|
-
|
102
|
-
|
104
|
+
const appendAdditionalEntriesAPI = entry => {
|
105
|
+
if (entry.appenddocs) {
|
106
|
+
const additionalEntries = entry.appenddocs.split(" ");
|
107
|
+
entry.additionalDocs = [];
|
103
108
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
109
|
+
additionalEntries.forEach(entryName => {
|
110
|
+
let additionalEntry = getComponentByName(entryName);
|
111
|
+
additionalEntry = calculateAPI(additionalEntry);
|
112
|
+
entry.additionalDocs.push(additionalEntry);
|
113
|
+
});
|
114
|
+
}
|
110
115
|
|
111
|
-
|
112
|
-
}
|
116
|
+
return entry;
|
117
|
+
}
|
113
118
|
|
114
|
-
const generateSamplePage = entry => {
|
115
|
-
|
119
|
+
const generateSamplePage = async entry => {
|
120
|
+
let content = "";
|
116
121
|
|
117
|
-
|
118
|
-
|
119
|
-
|
122
|
+
try {
|
123
|
+
content = await fs.readFile(`dist/test-resources/samples/${capitalize(entry.basename)}.sample.html`, 'utf8');
|
124
|
+
} catch (err) {
|
125
|
+
}
|
120
126
|
|
121
|
-
|
122
|
-
|
123
|
-
|
127
|
+
if (content) {
|
128
|
+
entry.slots.forEach(slotData => {
|
129
|
+
if (!slotData.type.startsWith("Node") && !slotData.type.startsWith("HTMLElement")) { // interface -> don't show in documentation
|
130
|
+
slotData.type = "HTMLElement" + (slotData.type.endsWith("[]") ? "[]" : "");
|
131
|
+
}
|
132
|
+
});
|
133
|
+
const APIReference = compiledHandlebars(entry).replace(/\[\]/g, " [0..n]");
|
134
|
+
const EntitySince = compiledSinceTemplate(entry).replace(/\[\]/g, " [0..n]");
|
124
135
|
|
125
|
-
|
126
|
-
|
136
|
+
content = content.replace('<!-- JSDoc marker -->', APIReference);
|
137
|
+
content = content.replace(sinceMarker, EntitySince);
|
127
138
|
|
128
|
-
|
129
|
-
|
139
|
+
content = content.replace(linkMatcher, match => {
|
140
|
+
const component = linkMatcher.exec(match)[2];
|
130
141
|
|
131
|
-
|
132
|
-
|
142
|
+
// reset the regex
|
143
|
+
linkMatcher.lastIndex = 0;
|
133
144
|
|
134
|
-
|
135
|
-
|
145
|
+
return `<a href="#" onclick="redirect(event, '${component}')">${component}</a>`;
|
146
|
+
});
|
136
147
|
|
137
|
-
|
138
|
-
|
139
|
-
});
|
148
|
+
return fs.writeFile(`dist/test-resources/api/${entry.basename}.sample.html`, content);
|
149
|
+
}
|
140
150
|
}
|
141
|
-
}
|
142
151
|
|
143
|
-
const generateComponentAPI = entry => {
|
144
|
-
|
145
|
-
|
152
|
+
const generateComponentAPI = entry => {
|
153
|
+
// (1) calculate the API
|
154
|
+
entry = calculateAPI(entry);
|
146
155
|
|
147
|
-
|
148
|
-
|
156
|
+
// (2) append additional API for composition components - List -> ListIems, TabContainer -> Tabs, Table -> TableRow/Column/Cell
|
157
|
+
entry = appendAdditionalEntriesAPI(entry);
|
149
158
|
|
150
|
-
|
151
|
-
|
152
|
-
}
|
159
|
+
// (3) generate sample page
|
160
|
+
return generateSamplePage(entry);
|
161
|
+
}
|
162
|
+
|
163
|
+
return Promise.all(entries.map(generateComponentAPI));
|
164
|
+
};
|
153
165
|
|
154
|
-
|
155
|
-
|
166
|
+
generate().then(() => {
|
167
|
+
console.log("Documentation generated.");
|
168
|
+
});
|
@@ -21,7 +21,9 @@ module.exports = {
|
|
21
21
|
{{/if}}
|
22
22
|
<br>
|
23
23
|
{{#if (toKebabCase this.name)}}
|
24
|
-
|
24
|
+
{{#unless this.noattribute}}
|
25
|
+
<code>{{toKebabCase this.name}}</code>
|
26
|
+
{{/unless}}
|
25
27
|
{{/if}}
|
26
28
|
</div>
|
27
29
|
<div class="cell api-table-content-cell">{{this.type}}</div>
|
@@ -23,6 +23,7 @@ module.exports = {
|
|
23
23
|
{{> properties this}}
|
24
24
|
{{> slots this}}
|
25
25
|
{{> events this}}
|
26
|
+
{{> methods this}}
|
26
27
|
{{> cssVariables this}}
|
27
28
|
</section>
|
28
29
|
</section>
|
@@ -33,6 +34,6 @@ module.exports = {
|
|
33
34
|
<a class="separator" href="https://www.sap.com/about/legal/privacy.html" target="_blank">Privacy Policy</a>
|
34
35
|
<a href="https://www.sap.com/about/legal/impressum.html" target="_blank">Legal</a>
|
35
36
|
</div>
|
36
|
-
<img src="
|
37
|
+
<img src="../../../assets/images/sap-logo-svg.svg" alt="Sap Logo" />
|
37
38
|
</footer>`
|
38
39
|
};
|