@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.
Files changed (72) hide show
  1. package/CHANGELOG.md +159 -0
  2. package/README.md +1 -1
  3. package/assets-meta.js +16 -1
  4. package/components-package/nps.js +41 -28
  5. package/components-package/postcss.themes.js +6 -3
  6. package/components-package/rollup-plugins/empty-module.js +15 -0
  7. package/components-package/rollup.js +81 -78
  8. package/components-package/wdio.js +51 -26
  9. package/components-package/wdio.sync.js +360 -0
  10. package/icons-collection/nps.js +46 -8
  11. package/lib/copy-and-watch/index.js +30 -4
  12. package/lib/copy-list/index.js +28 -0
  13. package/lib/create-icons/index.js +76 -56
  14. package/lib/create-illustrations/index.js +161 -0
  15. package/lib/create-new-component/index.js +12 -4
  16. package/lib/documentation/index.js +120 -107
  17. package/lib/documentation/templates/api-properties-section.js +3 -1
  18. package/lib/documentation/templates/template.js +2 -1
  19. package/lib/esm-abs-to-rel/index.js +58 -0
  20. package/lib/generate-json-imports/i18n.js +75 -30
  21. package/lib/generate-json-imports/themes.js +61 -23
  22. package/lib/hbs2lit/src/compiler.js +12 -3
  23. package/lib/hbs2lit/src/includesReplacer.js +5 -5
  24. package/lib/hbs2lit/src/litVisitor2.js +31 -6
  25. package/lib/hbs2lit/src/svgProcessor.js +3 -3
  26. package/lib/hbs2ui5/RenderTemplates/LitRenderer.js +4 -11
  27. package/lib/hbs2ui5/index.js +37 -21
  28. package/lib/i18n/defaults.js +49 -57
  29. package/lib/i18n/toJSON.js +13 -12
  30. package/lib/jsdoc/plugin.js +30 -1
  31. package/lib/jsdoc/template/publish.js +22 -2
  32. package/lib/postcss-combine-duplicated-selectors/index.js +178 -0
  33. package/lib/postcss-css-to-esm/index.js +19 -16
  34. package/lib/postcss-css-to-json/index.js +20 -11
  35. package/lib/postcss-new-files/index.js +36 -0
  36. package/lib/postcss-p/postcss-p.mjs +11 -0
  37. package/lib/replace-global-core/index.js +25 -0
  38. package/lib/scoping/lint-src.js +1 -1
  39. package/lib/scoping/missing-dependencies.js +65 -0
  40. package/lib/scoping/report-tags-usage.js +28 -0
  41. package/lib/serve/index.js +46 -0
  42. package/{components-package → lib/serve}/serve.json +0 -0
  43. package/package.json +44 -52
  44. package/bin/init-ui5-package.js +0 -3
  45. package/lib/init-package/index.js +0 -123
  46. package/lib/init-package/resources/.eslintignore +0 -3
  47. package/lib/init-package/resources/bundle.es5.js +0 -25
  48. package/lib/init-package/resources/bundle.esm.js +0 -31
  49. package/lib/init-package/resources/config/.eslintrc.js +0 -1
  50. package/lib/init-package/resources/config/postcss.components/postcss.config.js +0 -1
  51. package/lib/init-package/resources/config/postcss.themes/postcss.config.js +0 -1
  52. package/lib/init-package/resources/config/rollup.config.js +0 -1
  53. package/lib/init-package/resources/config/wdio.conf.js +0 -1
  54. package/lib/init-package/resources/package-scripts.js +0 -11
  55. package/lib/init-package/resources/src/Assets.js +0 -5
  56. package/lib/init-package/resources/src/MyFirstComponent.hbs +0 -1
  57. package/lib/init-package/resources/src/MyFirstComponent.js +0 -56
  58. package/lib/init-package/resources/src/i18n/messagebundle.properties +0 -2
  59. package/lib/init-package/resources/src/i18n/messagebundle_de.properties +0 -1
  60. package/lib/init-package/resources/src/i18n/messagebundle_en.properties +0 -1
  61. package/lib/init-package/resources/src/i18n/messagebundle_es.properties +0 -1
  62. package/lib/init-package/resources/src/i18n/messagebundle_fr.properties +0 -1
  63. package/lib/init-package/resources/src/themes/MyFirstComponent.css +0 -11
  64. package/lib/init-package/resources/src/themes/sap_belize/parameters-bundle.css +0 -3
  65. package/lib/init-package/resources/src/themes/sap_belize_hcb/parameters-bundle.css +0 -3
  66. package/lib/init-package/resources/src/themes/sap_belize_hcw/parameters-bundle.css +0 -3
  67. package/lib/init-package/resources/src/themes/sap_fiori_3/parameters-bundle.css +0 -3
  68. package/lib/init-package/resources/src/themes/sap_fiori_3_dark/parameters-bundle.css +0 -3
  69. package/lib/init-package/resources/src/themes/sap_fiori_3_hcb/parameters-bundle.css +0 -3
  70. package/lib/init-package/resources/src/themes/sap_fiori_3_hcw/parameters-bundle.css +0 -3
  71. package/lib/init-package/resources/test/pages/index.html +0 -56
  72. 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
- const mkdirp = require("mkdirp");
4
-
5
- const collectionName = process.argv[2] || "SAP-icons";
6
- const srcFile = path.normalize(`src/${collectionName}.json`);
7
- const destDir = path.normalize("dist/");
8
-
9
- mkdirp.sync(destDir);
10
-
11
- const template = (name, pathData, ltr, collection) => `import { registerIcon } from "@ui5/webcomponents-base/dist/SVGIconRegistry.js";
12
-
13
- const name = "${name}";
14
- const pathData = "${pathData}";
15
- const ltr = ${ltr};
16
- const collection = "${collection}";
17
-
18
- registerIcon(name, { pathData, ltr, collection});
19
-
20
- export default { pathData };`;
21
-
22
-
23
- const accTemplate = (name, pathData, ltr, accData, collection) => `import { registerIcon } from "@ui5/webcomponents-base/dist/SVGIconRegistry.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
-
32
- registerIcon(name, { pathData, ltr, accData, collection });
33
-
34
- export default { pathData, accData };`;
35
-
36
- const svgTemplate = (pathData) => `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
37
- <path d="${pathData}"/>
38
- </svg>`;
39
-
40
- const createIcons = (file) => {
41
- const json = JSON.parse(fs.readFileSync(file));
42
-
43
- for (let name in json.data) {
44
- const iconData = json.data[name];
45
- const pathData = iconData.path;
46
- const ltr = !!iconData.ltr;
47
- const acc = iconData.acc;
48
-
49
- const content = acc ? accTemplate(name, pathData, ltr, acc, json.collection) : template(name, pathData, ltr, json.collection);
50
-
51
- fs.writeFileSync(path.join(destDir, `${name}.js`), content);
52
- fs.writeFileSync(path.join(destDir, `${name}.svg`), svgTemplate(pathData));
53
- }
54
- };
55
-
56
- createIcons(srcFile);
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
- Please import the generated component in bundle.esm.js:
145
- import ${componentName} from "./dist/${componentName}.js";
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 mkdirp = require('mkdirp');
12
+ const beautify = require("json-beautify");
13
13
 
14
- const api = JSON.parse(fs.readFileSync(path.normalize(process.argv[2])));
14
+ const generate = async () => {
15
15
 
16
- const entries = api['symbols'];
17
- const compiledHandlebars = Handlebars.compile(template);
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
- const getComponentByName = name => {
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 getCSSVarsByName = name => {
29
- return cssVariables[name] || [];
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 capitalize = str => {
33
- return str.replace(/^./, str => str.toUpperCase());
34
- };
27
+ const getComponentByName = name => {
28
+ return entries.find(element => {
29
+ return element.basename === name;
30
+ })
31
+ };
35
32
 
36
- Handlebars.registerHelper('toLowerCase', function (str) {
37
- return str ? str.toLowerCase() : "";
38
- });
33
+ const getCSSVarsByName = name => {
34
+ return cssVariables[name] || [];
35
+ };
39
36
 
40
- Handlebars.registerHelper('toKebabCase', function (str) {
41
- const kebab = str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
42
- return kebab !== str ? kebab : undefined;
43
- });
37
+ const capitalize = str => {
38
+ return str.replace(/^./, str => str.toUpperCase());
39
+ };
44
40
 
45
- Handlebars.registerHelper('checkEven', function (iIndex) {
46
- return (iIndex % 2 === 0) ? "api-table-roll-even" : "api-table-roll-odd";
47
- });
41
+ Handlebars.registerHelper('toLowerCase', function (str) {
42
+ return str ? str.toLowerCase() : "";
43
+ });
48
44
 
49
- Handlebars.registerPartial('properties', propertiesTemplate);
50
- Handlebars.registerPartial('slots', slotsTemplate);
51
- Handlebars.registerPartial('events', eventsTemplate);
52
- Handlebars.registerPartial('methods', methodsTemplate);
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
- mkdirp.sync(`dist/test-resources/api`);
50
+ Handlebars.registerHelper('checkEven', function (iIndex) {
51
+ return (iIndex % 2 === 0) ? "api-table-roll-even" : "api-table-roll-odd";
52
+ });
56
53
 
57
- let entriesAPI = [];
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
- const appendCSSVarsAPI = entry => {
60
- entry.cssVariables = getCSSVarsByName(entry.basename);
61
- return entry;
62
- }
60
+ await fs.mkdir(`dist/test-resources/api`, { recursive: true });
63
61
 
64
- const componentHasEntityItem = (component, entity, name) => {
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 calculateAPI = component => {
70
- if (entriesAPI.indexOf(component.basename) !== -1) {
71
- return component;
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
- // Initialize all entities with [] if necessary, and remove undefined things, and only leave public things
76
- entities.forEach(entity => {
77
- component[entity] = removeEmpty(component[entity] || []).filter(x => x.visibility === "public");
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
- component = appendCSSVarsAPI(component);
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
- let parent = getComponentByName(component.extends);
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
- parentComponent[entity].forEach( x => {
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
- entriesAPI.push(component.basename);
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
- return component;
97
- };
101
+ return component;
102
+ };
98
103
 
99
- const appendAdditionalEntriesAPI = entry => {
100
- if (entry.appenddocs) {
101
- const additionalEntries = entry.appenddocs.split(" ");
102
- entry.additionalDocs = [];
104
+ const appendAdditionalEntriesAPI = entry => {
105
+ if (entry.appenddocs) {
106
+ const additionalEntries = entry.appenddocs.split(" ");
107
+ entry.additionalDocs = [];
103
108
 
104
- additionalEntries.forEach(entryName => {
105
- let additionalEntry = getComponentByName(entryName);
106
- additionalEntry = calculateAPI(additionalEntry);
107
- entry.additionalDocs.push(additionalEntry);
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
- return entry;
112
- }
116
+ return entry;
117
+ }
113
118
 
114
- const generateSamplePage = entry => {
115
- let content = "";
119
+ const generateSamplePage = async entry => {
120
+ let content = "";
116
121
 
117
- try {
118
- content = fs.readFileSync(`dist/test-resources/samples/${capitalize(entry.basename)}.sample.html`, 'utf8');
119
- } catch (err) { }
122
+ try {
123
+ content = await fs.readFile(`dist/test-resources/samples/${capitalize(entry.basename)}.sample.html`, 'utf8');
124
+ } catch (err) {
125
+ }
120
126
 
121
- if (content) {
122
- const APIReference = compiledHandlebars(entry).replace(/\[\]/g, " [0..n]");
123
- const EntitySince = compiledSinceTemplate(entry).replace(/\[\]/g, " [0..n]");
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
- content = content.replace('<!-- JSDoc marker -->', APIReference);
126
- content = content.replace(sinceMarker, EntitySince);
136
+ content = content.replace('<!-- JSDoc marker -->', APIReference);
137
+ content = content.replace(sinceMarker, EntitySince);
127
138
 
128
- content = content.replace(linkMatcher, match => {
129
- const component = linkMatcher.exec(match)[2];
139
+ content = content.replace(linkMatcher, match => {
140
+ const component = linkMatcher.exec(match)[2];
130
141
 
131
- // reset the regex
132
- linkMatcher.lastIndex = 0;
142
+ // reset the regex
143
+ linkMatcher.lastIndex = 0;
133
144
 
134
- return `<a href="#" onclick="redirect(event, '${component}')">${component}</a>`;
135
- });
145
+ return `<a href="#" onclick="redirect(event, '${component}')">${component}</a>`;
146
+ });
136
147
 
137
- fs.writeFile(`dist/test-resources/api/${entry.basename}.sample.html`, content, (err) => {
138
- // console.log(err);
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
- // (1) calculate the API
145
- entry = calculateAPI(entry);
152
+ const generateComponentAPI = entry => {
153
+ // (1) calculate the API
154
+ entry = calculateAPI(entry);
146
155
 
147
- // (2) append additional API for composition components - List -> ListIems, TabContainer -> Tabs, Table -> TableRow/Column/Cell
148
- entry = appendAdditionalEntriesAPI(entry);
156
+ // (2) append additional API for composition components - List -> ListIems, TabContainer -> Tabs, Table -> TableRow/Column/Cell
157
+ entry = appendAdditionalEntriesAPI(entry);
149
158
 
150
- // (3) generate sample page
151
- generateSamplePage(entry);
152
- }
159
+ // (3) generate sample page
160
+ return generateSamplePage(entry);
161
+ }
162
+
163
+ return Promise.all(entries.map(generateComponentAPI));
164
+ };
153
165
 
154
- entries.forEach(generateComponentAPI);
155
- entriesAPI = [];
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
- <code>{{toKebabCase this.name}}</code>
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="../../../../../../assets/images/sap-logo-svg.svg" alt="Sap Logo" />
37
+ <img src="../../../assets/images/sap-logo-svg.svg" alt="Sap Logo" />
37
38
  </footer>`
38
39
  };