@ui5/webcomponents-tools 0.0.0-dff5837d7 → 0.0.0-ec448881d
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 +208 -0
- package/README.md +1 -1
- package/assets-meta.js +18 -1
- package/bin/dev.js +10 -5
- package/components-package/nps.js +53 -26
- package/components-package/postcss.themes.js +6 -3
- package/components-package/rollup-plugins/empty-module.js +15 -0
- package/components-package/rollup.js +93 -77
- package/components-package/wdio.js +54 -29
- package/components-package/wdio.sync.js +360 -0
- package/icons-collection/nps.js +47 -9
- package/lib/copy-and-watch/index.js +30 -5
- package/lib/copy-list/index.js +28 -0
- package/lib/create-icons/index.js +82 -54
- package/lib/create-illustrations/index.js +161 -0
- package/lib/create-new-component/index.js +16 -4
- package/lib/documentation/index.js +124 -99
- 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 +74 -32
- package/lib/generate-json-imports/themes.js +64 -17
- package/lib/hbs2lit/src/compiler.js +12 -3
- package/lib/hbs2lit/src/includesReplacer.js +5 -5
- package/lib/hbs2lit/src/litVisitor2.js +43 -7
- package/lib/hbs2lit/src/svgProcessor.js +3 -3
- package/lib/hbs2ui5/RenderTemplates/LitRenderer.js +5 -5
- package/lib/hbs2ui5/index.js +50 -18
- package/lib/i18n/defaults.js +49 -57
- package/lib/i18n/toJSON.js +13 -12
- package/lib/jsdoc/config.json +1 -1
- package/lib/jsdoc/plugin.js +33 -4
- package/lib/jsdoc/template/publish.js +24 -4
- 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/get-all-tags.js +44 -0
- package/lib/scoping/lint-src.js +31 -0
- package/lib/scoping/missing-dependencies.js +65 -0
- package/lib/scoping/report-tags-usage.js +28 -0
- package/lib/scoping/scope-test-pages.js +40 -0
- package/lib/serve/index.js +46 -0
- package/{components-package → lib/serve}/serve.json +0 -0
- package/package-lock.json +48 -0
- package/package.json +47 -53
- package/bin/init-ui5-package.js +0 -3
- package/lib/init-package/index.js +0 -112
- 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 -34
- 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/Demo.hbs +0 -1
- package/lib/init-package/resources/src/Demo.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/Demo.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/test/pages/index.html +0 -51
- package/lib/init-package/resources/test/specs/Demo.spec.js +0 -12
@@ -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
|
+
});
|
@@ -61,6 +61,10 @@ class ${componentName} extends UI5Element {
|
|
61
61
|
return ${componentName}Template;
|
62
62
|
}
|
63
63
|
|
64
|
+
static get dependencies() {
|
65
|
+
return [];
|
66
|
+
}
|
67
|
+
|
64
68
|
static async onDefine() {
|
65
69
|
|
66
70
|
}
|
@@ -135,8 +139,16 @@ console.log(`Successfully generated ${componentName}.js`);
|
|
135
139
|
console.log(`Successfully generated ${componentName}.css`);
|
136
140
|
console.log(`Successfully generated ${componentName}.hbs`);
|
137
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
|
+
|
138
150
|
// Change the color of the output
|
139
|
-
console.warn('\x1b[33m%s\x1b[0m', `
|
140
|
-
|
141
|
-
|
142
|
-
`);
|
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,137 +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
|
+
});
|
44
|
+
|
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
|
+
});
|
48
49
|
|
49
|
-
Handlebars.
|
50
|
-
|
51
|
-
|
52
|
-
Handlebars.registerPartial('methods', methodsTemplate);
|
53
|
-
Handlebars.registerPartial('cssVariables', cssVariablesTemplate);
|
50
|
+
Handlebars.registerHelper('checkEven', function (iIndex) {
|
51
|
+
return (iIndex % 2 === 0) ? "api-table-roll-even" : "api-table-roll-odd";
|
52
|
+
});
|
54
53
|
|
55
|
-
|
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);
|
56
59
|
|
57
|
-
|
60
|
+
await fs.mkdir(`dist/test-resources/api`, { recursive: true });
|
58
61
|
|
59
|
-
|
60
|
-
entry.cssVariables = getCSSVarsByName(entry.basename);
|
61
|
-
return entry;
|
62
|
-
}
|
62
|
+
let entriesAPI = [];
|
63
63
|
|
64
|
-
const
|
65
|
-
|
64
|
+
const appendCSSVarsAPI = entry => {
|
65
|
+
entry.cssVariables = getCSSVarsByName(entry.basename);
|
66
66
|
return entry;
|
67
67
|
}
|
68
68
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
parent = { ...{ properties: [], events: [], slots: [], cssVariables: [] }, ...parent };
|
75
|
-
|
76
|
-
// extend component documentation
|
77
|
-
entry.properties = [...(entry.properties || []), ...(parent.properties || [])];
|
78
|
-
entry.events = [...(entry.events || []), ...(parent.events || [])];
|
79
|
-
entry.slots = [...(entry.slots || []), ...(parent.slots || [])];
|
80
|
-
entry.cssVariables = [...(entry.cssVariables || []), ...(parent.cssVariables || [])];
|
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);
|
81
73
|
|
82
|
-
|
74
|
+
const calculateAPI = component => {
|
75
|
+
if (entriesAPI.indexOf(component.basename) !== -1) {
|
76
|
+
return component;
|
77
|
+
}
|
78
|
+
const entities = ["properties", "slots", "events", "methods", "cssVariables"];
|
83
79
|
|
84
|
-
|
85
|
-
|
80
|
+
// Initialize all entities with [] if necessary, and remove undefined things, and only leave public things
|
81
|
+
entities.forEach(entity => {
|
82
|
+
component[entity] = removeEmpty(component[entity] || []).filter(x => x.visibility === "public");
|
83
|
+
});
|
86
84
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
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);
|
100
|
+
|
101
|
+
return component;
|
102
|
+
};
|
103
|
+
|
104
|
+
const appendAdditionalEntriesAPI = entry => {
|
105
|
+
if (entry.appenddocs) {
|
106
|
+
const additionalEntries = entry.appenddocs.split(" ");
|
107
|
+
entry.additionalDocs = [];
|
108
|
+
|
109
|
+
additionalEntries.forEach(entryName => {
|
110
|
+
let additionalEntry = getComponentByName(entryName);
|
111
|
+
additionalEntry = calculateAPI(additionalEntry);
|
112
|
+
entry.additionalDocs.push(additionalEntry);
|
113
|
+
});
|
114
|
+
}
|
91
115
|
|
92
|
-
|
93
|
-
let additionalEntry = getComponentByName(entryName);
|
94
|
-
additionalEntry = calculateAPI(additionalEntry);
|
95
|
-
entry.additionalDocs.push(additionalEntry);
|
96
|
-
});
|
116
|
+
return entry;
|
97
117
|
}
|
98
118
|
|
99
|
-
|
100
|
-
|
119
|
+
const generateSamplePage = async entry => {
|
120
|
+
let content = "";
|
101
121
|
|
102
|
-
|
103
|
-
|
122
|
+
try {
|
123
|
+
content = await fs.readFile(`dist/test-resources/samples/${capitalize(entry.basename)}.sample.html`, 'utf8');
|
124
|
+
} catch (err) {
|
125
|
+
}
|
104
126
|
|
105
|
-
|
106
|
-
|
107
|
-
|
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]");
|
108
135
|
|
109
|
-
|
110
|
-
|
111
|
-
const EntitySince = compiledSinceTemplate(entry).replace(/\[\]/g, " [0..n]");
|
136
|
+
content = content.replace('<!-- JSDoc marker -->', APIReference);
|
137
|
+
content = content.replace(sinceMarker, EntitySince);
|
112
138
|
|
113
|
-
|
114
|
-
|
139
|
+
content = content.replace(linkMatcher, match => {
|
140
|
+
const component = linkMatcher.exec(match)[2];
|
115
141
|
|
116
|
-
|
117
|
-
|
142
|
+
// reset the regex
|
143
|
+
linkMatcher.lastIndex = 0;
|
118
144
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
return `<a href="#" onclick="redirect(event, '${component}')">${component}</a>`;
|
123
|
-
});
|
145
|
+
return `<a href="#" onclick="redirect(event, '${component}')">${component}</a>`;
|
146
|
+
});
|
124
147
|
|
125
|
-
|
126
|
-
|
127
|
-
});
|
148
|
+
return fs.writeFile(`dist/test-resources/api/${entry.basename}.sample.html`, content);
|
149
|
+
}
|
128
150
|
}
|
129
|
-
}
|
130
151
|
|
131
|
-
const generateComponentAPI = entry => {
|
132
|
-
|
133
|
-
|
152
|
+
const generateComponentAPI = entry => {
|
153
|
+
// (1) calculate the API
|
154
|
+
entry = calculateAPI(entry);
|
134
155
|
|
135
|
-
|
136
|
-
|
156
|
+
// (2) append additional API for composition components - List -> ListIems, TabContainer -> Tabs, Table -> TableRow/Column/Cell
|
157
|
+
entry = appendAdditionalEntriesAPI(entry);
|
137
158
|
|
138
|
-
|
139
|
-
|
140
|
-
}
|
159
|
+
// (3) generate sample page
|
160
|
+
return generateSamplePage(entry);
|
161
|
+
}
|
141
162
|
|
142
|
-
entries.
|
143
|
-
|
163
|
+
return Promise.all(entries.map(generateComponentAPI));
|
164
|
+
};
|
165
|
+
|
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
|
};
|
@@ -0,0 +1,58 @@
|
|
1
|
+
const esprima = require("esprima");
|
2
|
+
const escodegen = require("escodegen");
|
3
|
+
|
4
|
+
const fs = require("fs").promises;
|
5
|
+
const path = require("path");
|
6
|
+
const basePath = process.argv[2];
|
7
|
+
|
8
|
+
const convertImports = async (srcPath) => {
|
9
|
+
let changed = false;
|
10
|
+
// console.log("scanning imports of", srcPath);
|
11
|
+
let code = (await fs.readFile(srcPath)).toString();
|
12
|
+
const tree = esprima.parseModule(code);
|
13
|
+
const importer = srcPath.replace(basePath, "");
|
14
|
+
const importerDir = path.dirname(importer);
|
15
|
+
// console.log("-> ", importer);
|
16
|
+
tree.body.forEach(node => {
|
17
|
+
if (node.type === "ImportDeclaration") {
|
18
|
+
let importee = node.source.value;
|
19
|
+
if (importee.startsWith(".")) {
|
20
|
+
// add .js extension if missing
|
21
|
+
if (!importee.endsWith(".js")) {
|
22
|
+
node.source.value += ".js"
|
23
|
+
changed = true;
|
24
|
+
}
|
25
|
+
return;
|
26
|
+
}
|
27
|
+
let importeeDir = path.dirname(importee);
|
28
|
+
let importeeFile = path.basename(importee);
|
29
|
+
let relativePath = path.relative(importerDir, importeeDir);
|
30
|
+
if (relativePath.length === 0) {
|
31
|
+
relativePath = "."
|
32
|
+
}
|
33
|
+
if (!relativePath.startsWith(".")) {
|
34
|
+
relativePath = "./" + relativePath;
|
35
|
+
}
|
36
|
+
|
37
|
+
relativePath = relativePath.replace(/\\/g, "/"); // the browser expects unix paths
|
38
|
+
let relativeImport = `${relativePath}/${importeeFile}.js`;
|
39
|
+
// console.log(importee + " --> " + relativeImport);
|
40
|
+
node.source.value = relativeImport;
|
41
|
+
changed = true;
|
42
|
+
}
|
43
|
+
});
|
44
|
+
|
45
|
+
if (changed) {
|
46
|
+
return fs.writeFile(srcPath, escodegen.generate(tree));
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
const generate = async () => {
|
51
|
+
const { globby } = await import("globby");
|
52
|
+
const fileNames = await globby(basePath + "**/*.js");
|
53
|
+
return Promise.all(fileNames.map(convertImports).filter(x => !!x));
|
54
|
+
};
|
55
|
+
|
56
|
+
generate().then(() => {
|
57
|
+
console.log("Success: Converted absolute imports to relative for files in:", basePath);
|
58
|
+
});
|