@ui5/webcomponents-tools 0.0.0-6cb3eb0db → 0.0.0-701b14e36
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 +126 -0
- package/README.md +1 -1
- package/assets-meta.js +6 -1
- package/components-package/nps.js +12 -25
- package/components-package/postcss.themes.js +6 -3
- package/components-package/rollup-plugins/empty-module.js +15 -0
- package/components-package/rollup.js +25 -91
- package/components-package/wdio.js +16 -0
- package/components-package/wdio.sync.js +16 -0
- package/icons-collection/nps.js +41 -13
- package/lib/copy-and-watch/index.js +24 -0
- package/lib/copy-list/index.js +16 -16
- package/lib/create-icons/index.js +83 -58
- package/lib/create-illustrations/index.js +107 -41
- package/lib/documentation/index.js +119 -116
- 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 +13 -9
- package/lib/generate-json-imports/i18n.js +38 -31
- package/lib/generate-json-imports/themes.js +28 -21
- package/lib/hbs2lit/src/compiler.js +12 -3
- package/lib/hbs2lit/src/includesReplacer.js +5 -5
- package/lib/hbs2lit/src/litVisitor2.js +10 -2
- package/lib/hbs2ui5/index.js +37 -21
- package/lib/i18n/defaults.js +49 -57
- package/lib/i18n/toJSON.js +12 -11
- package/lib/jsdoc/plugin.js +9 -0
- package/lib/jsdoc/template/publish.js +13 -2
- package/lib/postcss-combine-duplicated-selectors/index.js +178 -0
- package/lib/postcss-css-to-esm/index.js +4 -4
- package/lib/postcss-css-to-json/index.js +7 -2
- package/lib/postcss-p/postcss-p.mjs +11 -0
- package/lib/replace-global-core/index.js +13 -8
- package/lib/scoping/missing-dependencies.js +65 -0
- package/lib/scoping/report-tags-usage.js +28 -0
- package/lib/serve/index.js +1 -1
- package/package.json +14 -22
- package/bin/init-ui5-package.js +0 -3
- package/lib/hash/config.js +0 -10
- package/lib/hash/generate.js +0 -19
- package/lib/hash/upToDate.js +0 -31
- package/lib/init-package/index.js +0 -134
- package/lib/init-package/resources/.eslintignore +0 -3
- package/lib/init-package/resources/bundle.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 -54
- package/lib/init-package/resources/test/specs/Demo.spec.js +0 -12
- package/lib/polyfill-placeholder/index.js +0 -5
package/lib/copy-list/index.js
CHANGED
@@ -1,28 +1,28 @@
|
|
1
|
-
const fs = require("fs");
|
1
|
+
const fs = require("fs").promises;
|
2
2
|
const path = require("path");
|
3
|
-
const mkdirp = require("mkdirp");
|
4
3
|
|
5
4
|
const fileList = process.argv[2];
|
6
5
|
const dest = process.argv[3];
|
7
6
|
const src = "../../node_modules/@openui5/sap.ui.core/src/";
|
8
7
|
|
9
|
-
const
|
10
|
-
|
8
|
+
const generate = async () => {
|
9
|
+
const filesToCopy = (await fs.readFile(fileList)).toString();
|
10
|
+
// console.log(filesToCopy);
|
11
11
|
|
12
|
-
// Support full-line comments starting with # in the used-modules.txt file
|
13
|
-
const shouldCopy = file => file.length && !file.startsWith("#");
|
12
|
+
// Support full-line comments starting with # in the used-modules.txt file
|
13
|
+
const shouldCopy = file => file.length && !file.startsWith("#");
|
14
14
|
|
15
|
-
const trimFile = file => file.trim();
|
15
|
+
const trimFile = file => file.trim();
|
16
16
|
|
17
|
-
filesToCopy.split("\n").map(trimFile).filter(shouldCopy).
|
18
|
-
|
19
|
-
|
17
|
+
return filesToCopy.split("\n").map(trimFile).filter(shouldCopy).map(async moduleName => {
|
18
|
+
const srcPath = path.join(src, moduleName);
|
19
|
+
const destPath = path.join(dest, moduleName);
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
if (err) {
|
24
|
-
throw err;
|
25
|
-
}
|
26
|
-
console.log(`${destPath} created.`);
|
21
|
+
await fs.mkdir(path.dirname(destPath), { recursive: true });
|
22
|
+
return fs.copyFile(srcPath, destPath);
|
27
23
|
});
|
24
|
+
};
|
25
|
+
|
26
|
+
generate().then(() => {
|
27
|
+
console.log("Files copied.");
|
28
28
|
});
|
@@ -1,58 +1,83 @@
|
|
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
|
-
|
27
|
-
const
|
28
|
-
const
|
29
|
-
const
|
30
|
-
const
|
31
|
-
const
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
export
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
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 "${name}";
|
20
|
+
export { pathData, ltr };`;
|
21
|
+
|
22
|
+
|
23
|
+
const iconAccTemplate = (name, pathData, ltr, accData, collection, packageName) => `import { registerIcon } from "@ui5/webcomponents-base/dist/asset-registries/Icons.js";
|
24
|
+
import { ${accData.key} } from "../generated/i18n/i18n-defaults.js";
|
25
|
+
|
26
|
+
const name = "${name}";
|
27
|
+
const pathData = "${pathData}";
|
28
|
+
const ltr = ${ltr};
|
29
|
+
const accData = ${accData.key};
|
30
|
+
const collection = "${collection}";
|
31
|
+
const packageName = "${packageName}";
|
32
|
+
|
33
|
+
registerIcon(name, { pathData, ltr, accData, collection, packageName });
|
34
|
+
|
35
|
+
export default "${name}";
|
36
|
+
export { pathData, ltr, accData };`;
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
const collectionTemplate = (name) => `import { isThemeFamily } from "@ui5/webcomponents-base/dist/config/Theme.js";
|
41
|
+
import {pathData as pathDataV5, ltr as ltrV5} from "./v5/${name}.js";
|
42
|
+
import {pathData as pathDataV4, ltr as ltrV4} from "./v4/${name}.js";
|
43
|
+
|
44
|
+
const isHorizon = isThemeFamily("sap_horizon");
|
45
|
+
const pathData = isHorizon ? pathDataV5 : pathDataV4;
|
46
|
+
const ltr = isHorizon ? ltrV5 : ltrV4;
|
47
|
+
|
48
|
+
export default "${name}";
|
49
|
+
export { pathData, ltr };`;
|
50
|
+
|
51
|
+
|
52
|
+
const svgTemplate = (pathData) => `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
53
|
+
<path d="${pathData}"/>
|
54
|
+
</svg>`;
|
55
|
+
|
56
|
+
const createIcons = async (file) => {
|
57
|
+
await fs.mkdir(destDir, { recursive: true });
|
58
|
+
|
59
|
+
const json = JSON.parse(await fs.readFile(file));
|
60
|
+
|
61
|
+
const promises = [];
|
62
|
+
for (let name in json.data) {
|
63
|
+
const iconData = json.data[name];
|
64
|
+
const pathData = iconData.path;
|
65
|
+
const ltr = !!iconData.ltr;
|
66
|
+
const acc = iconData.acc;
|
67
|
+
|
68
|
+
const content = acc ? iconAccTemplate(name, pathData, ltr, acc, json.collection, json.packageName) : iconTemplate(name, pathData, ltr, json.collection, json.packageName);
|
69
|
+
|
70
|
+
promises.push(fs.writeFile(path.join(destDir, `${name}.js`), content));
|
71
|
+
promises.push(fs.writeFile(path.join(destDir, `${name}.svg`), svgTemplate(pathData)));
|
72
|
+
|
73
|
+
if (json.version) {
|
74
|
+
promises.push(fs.writeFile(path.join(path.normalize("dist/"), `${name}.js`), collectionTemplate(name)));
|
75
|
+
}
|
76
|
+
}
|
77
|
+
|
78
|
+
return Promise.all(promises);
|
79
|
+
};
|
80
|
+
|
81
|
+
createIcons(srcFile).then(() => {
|
82
|
+
console.log("Icons created.");
|
83
|
+
});
|
@@ -1,44 +1,102 @@
|
|
1
|
-
const fs = require("fs");
|
1
|
+
const fs = require("fs").promises;
|
2
2
|
const path = require("path");
|
3
|
-
const mkdirp = require("mkdirp");
|
4
3
|
|
5
4
|
if (process.argv.length < 7) {
|
6
|
-
|
5
|
+
throw new Error("Not enough arguments");
|
7
6
|
}
|
8
7
|
|
9
|
-
const
|
10
|
-
|
11
|
-
const
|
12
|
-
|
13
|
-
|
14
|
-
|
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`);
|
15
61
|
// collect each illustration name because each one should have Sample.js file
|
16
|
-
const fileNames = new Set();
|
17
|
-
|
18
|
-
const svgImportTemplate = svgContent => {
|
19
|
-
|
20
|
-
|
21
|
-
const
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
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";
|
30
88
|
import dialogSvg from "./${illustrationsPrefix}-Dialog-${illustrationName}.js";
|
31
89
|
import sceneSvg from "./${illustrationsPrefix}-Scene-${illustrationName}.js";
|
32
90
|
import spotSvg from "./${illustrationsPrefix}-Spot-${illustrationName}.js";
|
33
91
|
import {
|
34
|
-
IM_TITLE_${
|
35
|
-
IM_SUBTITLE_${
|
92
|
+
IM_TITLE_${illustrationNameUpperCase},
|
93
|
+
IM_SUBTITLE_${illustrationNameUpperCase},
|
36
94
|
} from "../generated/i18n/i18n-defaults.js";
|
37
95
|
|
38
96
|
const name = "${illustrationName}";
|
39
97
|
const set = "${illustrationSet}";
|
40
|
-
const title = IM_TITLE_${
|
41
|
-
const subtitle = IM_SUBTITLE_${
|
98
|
+
const title = IM_TITLE_${illustrationNameUpperCase};
|
99
|
+
const subtitle = IM_SUBTITLE_${illustrationNameUpperCase};
|
42
100
|
|
43
101
|
registerIllustration(name, {
|
44
102
|
dialogSvg,
|
@@ -54,7 +112,7 @@ export {
|
|
54
112
|
sceneSvg,
|
55
113
|
spotSvg,
|
56
114
|
};` :
|
57
|
-
`import { registerIllustration } from "@ui5/webcomponents-base/dist/asset-registries/Illustrations.js";
|
115
|
+
`import { registerIllustration } from "@ui5/webcomponents-base/dist/asset-registries/Illustrations.js";
|
58
116
|
import dialogSvg from "./${illustrationsPrefix}-Dialog-${illustrationName}.js";
|
59
117
|
import sceneSvg from "./${illustrationsPrefix}-Scene-${illustrationName}.js";
|
60
118
|
import spotSvg from "./${illustrationsPrefix}-Spot-${illustrationName}.js";
|
@@ -74,22 +132,30 @@ export {
|
|
74
132
|
sceneSvg,
|
75
133
|
spotSvg,
|
76
134
|
};`
|
77
|
-
};
|
135
|
+
};
|
136
|
+
|
137
|
+
await fs.mkdir(destPath, { recursive: true });
|
78
138
|
|
79
|
-
|
139
|
+
const illustrationFileNames = await fs.readdir(path.normalize(srcPath));
|
80
140
|
|
81
|
-
|
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);
|
82
146
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
147
|
+
promises.push(svgToJs(fileName));
|
148
|
+
fileNames.add(illustrationName);
|
149
|
+
}
|
150
|
+
});
|
87
151
|
|
88
|
-
|
89
|
-
|
152
|
+
for (let illustrationName of fileNames) {
|
153
|
+
promises.push(fs.writeFile(path.join(destPath, `${illustrationName}.js`), illustrationImportTemplate(illustrationName)));
|
90
154
|
}
|
91
|
-
});
|
92
155
|
|
93
|
-
|
94
|
-
|
95
|
-
|
156
|
+
return Promise.all(promises);
|
157
|
+
};
|
158
|
+
|
159
|
+
generate().then(() => {
|
160
|
+
console.log("Illustrations generated.");
|
161
|
+
});
|
@@ -7,159 +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 mkdirp = require('mkdirp');
|
13
12
|
const beautify = require("json-beautify");
|
14
13
|
|
14
|
+
const generate = async () => {
|
15
15
|
|
16
|
-
const apiJSONPath = path.normalize(process.argv[2]);
|
17
|
-
const api = JSON.parse(fs.
|
16
|
+
const apiJSONPath = path.normalize(process.argv[2]);
|
17
|
+
const api = JSON.parse(await fs.readFile(apiJSONPath));
|
18
18
|
|
19
|
-
fs.
|
19
|
+
await fs.writeFile(apiJSONPath, beautify(api, null, 2, 100));
|
20
20
|
|
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-->";
|
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-->";
|
26
26
|
|
27
|
-
const getComponentByName = name => {
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
};
|
27
|
+
const getComponentByName = name => {
|
28
|
+
return entries.find(element => {
|
29
|
+
return element.basename === name;
|
30
|
+
})
|
31
|
+
};
|
32
32
|
|
33
|
-
const getCSSVarsByName = name => {
|
34
|
-
|
35
|
-
};
|
33
|
+
const getCSSVarsByName = name => {
|
34
|
+
return cssVariables[name] || [];
|
35
|
+
};
|
36
36
|
|
37
|
-
const capitalize = str => {
|
38
|
-
|
39
|
-
};
|
40
|
-
|
41
|
-
Handlebars.registerHelper('toLowerCase', function (str) {
|
42
|
-
return str ? str.toLowerCase() : "";
|
43
|
-
});
|
37
|
+
const capitalize = str => {
|
38
|
+
return str.replace(/^./, str => str.toUpperCase());
|
39
|
+
};
|
44
40
|
|
45
|
-
Handlebars.registerHelper('
|
46
|
-
|
47
|
-
|
48
|
-
});
|
49
|
-
|
50
|
-
Handlebars.registerHelper('checkEven', function (iIndex) {
|
51
|
-
return (iIndex % 2 === 0) ? "api-table-roll-even" : "api-table-roll-odd";
|
52
|
-
});
|
41
|
+
Handlebars.registerHelper('toLowerCase', function (str) {
|
42
|
+
return str ? str.toLowerCase() : "";
|
43
|
+
});
|
53
44
|
|
54
|
-
Handlebars.
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
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
|
+
});
|
59
49
|
|
60
|
-
|
50
|
+
Handlebars.registerHelper('checkEven', function (iIndex) {
|
51
|
+
return (iIndex % 2 === 0) ? "api-table-roll-even" : "api-table-roll-odd";
|
52
|
+
});
|
61
53
|
|
62
|
-
|
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);
|
63
59
|
|
64
|
-
|
65
|
-
entry.cssVariables = getCSSVarsByName(entry.basename);
|
66
|
-
return entry;
|
67
|
-
}
|
60
|
+
await fs.mkdir(`dist/test-resources/api`, { recursive: true });
|
68
61
|
|
69
|
-
|
70
|
-
return component[entity].some(x => x && x.name === name);
|
71
|
-
};
|
72
|
-
const removeEmpty = arr => arr.filter(x => x);
|
62
|
+
let entriesAPI = [];
|
73
63
|
|
74
|
-
const
|
75
|
-
|
76
|
-
return
|
64
|
+
const appendCSSVarsAPI = entry => {
|
65
|
+
entry.cssVariables = getCSSVarsByName(entry.basename);
|
66
|
+
return entry;
|
77
67
|
}
|
78
|
-
const entities = ["properties", "slots", "events", "methods", "cssVariables"];
|
79
68
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
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);
|
84
73
|
|
85
|
-
|
74
|
+
const calculateAPI = component => {
|
75
|
+
if (entriesAPI.indexOf(component.basename) !== -1) {
|
76
|
+
return component;
|
77
|
+
}
|
78
|
+
const entities = ["properties", "slots", "events", "methods", "cssVariables"];
|
86
79
|
|
87
|
-
|
88
|
-
if (parent) {
|
89
|
-
let parentComponent = calculateAPI(parent);
|
80
|
+
// Initialize all entities with [] if necessary, and remove undefined things, and only leave public things
|
90
81
|
entities.forEach(entity => {
|
91
|
-
|
92
|
-
if (!componentHasEntityItem(component, entity, x.name)) {
|
93
|
-
component[entity].push(x);
|
94
|
-
}
|
95
|
-
});
|
82
|
+
component[entity] = removeEmpty(component[entity] || []).filter(x => x.visibility === "public");
|
96
83
|
});
|
97
|
-
}
|
98
84
|
|
99
|
-
|
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
|
+
}
|
100
98
|
|
101
|
-
|
102
|
-
};
|
99
|
+
entriesAPI.push(component.basename);
|
103
100
|
|
104
|
-
|
105
|
-
|
106
|
-
const additionalEntries = entry.appenddocs.split(" ");
|
107
|
-
entry.additionalDocs = [];
|
101
|
+
return component;
|
102
|
+
};
|
108
103
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
entry.additionalDocs
|
113
|
-
});
|
114
|
-
}
|
104
|
+
const appendAdditionalEntriesAPI = entry => {
|
105
|
+
if (entry.appenddocs) {
|
106
|
+
const additionalEntries = entry.appenddocs.split(" ");
|
107
|
+
entry.additionalDocs = [];
|
115
108
|
|
116
|
-
|
117
|
-
|
109
|
+
additionalEntries.forEach(entryName => {
|
110
|
+
let additionalEntry = getComponentByName(entryName);
|
111
|
+
additionalEntry = calculateAPI(additionalEntry);
|
112
|
+
entry.additionalDocs.push(additionalEntry);
|
113
|
+
});
|
114
|
+
}
|
118
115
|
|
119
|
-
|
120
|
-
|
116
|
+
return entry;
|
117
|
+
}
|
121
118
|
|
122
|
-
|
123
|
-
content =
|
124
|
-
} catch (err) { }
|
119
|
+
const generateSamplePage = async entry => {
|
120
|
+
let content = "";
|
125
121
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
}
|
131
|
-
});
|
132
|
-
const APIReference = compiledHandlebars(entry).replace(/\[\]/g, " [0..n]");
|
133
|
-
const EntitySince = compiledSinceTemplate(entry).replace(/\[\]/g, " [0..n]");
|
122
|
+
try {
|
123
|
+
content = await fs.readFile(`dist/test-resources/samples/${capitalize(entry.basename)}.sample.html`, 'utf8');
|
124
|
+
} catch (err) {
|
125
|
+
}
|
134
126
|
|
135
|
-
|
136
|
-
|
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]");
|
137
135
|
|
138
|
-
|
139
|
-
|
136
|
+
content = content.replace('<!-- JSDoc marker -->', APIReference);
|
137
|
+
content = content.replace(sinceMarker, EntitySince);
|
140
138
|
|
141
|
-
|
142
|
-
|
139
|
+
content = content.replace(linkMatcher, match => {
|
140
|
+
const component = linkMatcher.exec(match)[2];
|
143
141
|
|
144
|
-
|
145
|
-
|
142
|
+
// reset the regex
|
143
|
+
linkMatcher.lastIndex = 0;
|
146
144
|
|
147
|
-
|
148
|
-
|
149
|
-
|
145
|
+
return `<a href="#" onclick="redirect(event, '${component}')">${component}</a>`;
|
146
|
+
});
|
147
|
+
|
148
|
+
return fs.writeFile(`dist/test-resources/api/${entry.basename}.sample.html`, content);
|
149
|
+
}
|
150
150
|
}
|
151
|
-
}
|
152
151
|
|
153
|
-
const generateComponentAPI = entry => {
|
154
|
-
|
155
|
-
|
152
|
+
const generateComponentAPI = entry => {
|
153
|
+
// (1) calculate the API
|
154
|
+
entry = calculateAPI(entry);
|
156
155
|
|
157
|
-
|
158
|
-
|
156
|
+
// (2) append additional API for composition components - List -> ListIems, TabContainer -> Tabs, Table -> TableRow/Column/Cell
|
157
|
+
entry = appendAdditionalEntriesAPI(entry);
|
159
158
|
|
160
|
-
|
161
|
-
|
162
|
-
}
|
159
|
+
// (3) generate sample page
|
160
|
+
return generateSamplePage(entry);
|
161
|
+
}
|
162
|
+
|
163
|
+
return Promise.all(entries.map(generateComponentAPI));
|
164
|
+
};
|
163
165
|
|
164
|
-
|
165
|
-
|
166
|
+
generate().then(() => {
|
167
|
+
console.log("Documentation generated.");
|
168
|
+
});
|