@ui5/webcomponents-tools 0.0.0-9e104af01 → 0.0.0-a289c53b5

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.
@@ -41,15 +41,17 @@ const copyIconAssetsCommand = (options) => {
41
41
  const getScripts = (options) => {
42
42
  const createJSImportsCmd = createIconImportsCommand(options);
43
43
  const copyAssetsCmd = copyIconAssetsCommand(options);
44
+ const tsCommand = options.typescript ? "tsc" : "";
45
+ const tsCrossEnv = options.typescript ? "cross-env UI5_TS=true" : "";
44
46
 
45
47
  const scripts = {
46
- clean: "rimraf dist",
48
+ clean: "rimraf dist && rimraf src/generated",
47
49
  copy: copyAssetsCmd,
48
50
  build: {
49
- default: `nps clean typescript copy build.i18n build.icons build.jsonImports`,
51
+ default: `${tsCrossEnv} nps clean copy build.i18n typescript build.icons build.jsonImports`,
50
52
  i18n: {
51
53
  default: "nps build.i18n.defaultsjs build.i18n.json",
52
- defaultsjs: `mkdirp dist/generated/i18n && node "${LIB}/i18n/defaults.js" src/i18n dist/generated/i18n`,
54
+ defaultsjs: `mkdirp dist/generated/i18n && node "${LIB}/i18n/defaults.js" src/i18n src/generated/i18n`,
53
55
  json: `mkdirp dist/generated/assets/i18n && node "${LIB}/i18n/toJSON.js" src/i18n dist/generated/assets/i18n`,
54
56
  },
55
57
  jsonImports: {
@@ -58,7 +60,7 @@ const getScripts = (options) => {
58
60
  },
59
61
  icons: createJSImportsCmd,
60
62
  },
61
- typescript: "tsc",
63
+ typescript: tsCommand,
62
64
  };
63
65
 
64
66
  return scripts;
@@ -1,7 +1,7 @@
1
1
  const fs = require("fs").promises;
2
2
  const path = require("path");
3
3
 
4
- const collectionName = process.argv[2] || "SAP-icons";
4
+ const collectionName = process.argv[2] || "SAP-icons-v4";
5
5
  const collectionVersion = process.argv[3];
6
6
  const srcFile = collectionVersion ? path.normalize(`src/${collectionVersion}/${collectionName}.json`) : path.normalize(`src/${collectionName}.json`);
7
7
  const destDir = collectionVersion ? path.normalize(`dist/${collectionVersion}/`) : path.normalize("dist/");
@@ -38,13 +38,13 @@ export { pathData, ltr, accData };`;
38
38
 
39
39
 
40
40
 
41
- const collectionTemplate = (name) => `import { isThemeFamily } from "@ui5/webcomponents-base/dist/config/Theme.js";
42
- import {pathData as pathDataV5, ltr, accData} from "./v5/${name}.js";
43
- import {pathData as pathDataV4} from "./v4/${name}.js";
41
+ const collectionTemplate = (name, versions, fullName) => `import { isLegacyThemeFamily } from "@ui5/webcomponents-base/dist/config/Theme.js";
42
+ import { pathData as pathData${versions[0]}, ltr, accData } from "./${versions[0]}/${name}.js";
43
+ import { pathData as pathData${versions[1]} } from "./${versions[1]}/${name}.js";
44
44
 
45
- const pathData = isThemeFamily("sap_horizon") ? pathDataV5 : pathDataV4;
45
+ const pathData = isLegacyThemeFamily() ? pathData${versions[0]} : pathData${versions[1]};
46
46
 
47
- export default "${name}";
47
+ export default "${fullName}";
48
48
  export { pathData, ltr, accData };`;
49
49
 
50
50
 
@@ -80,22 +80,45 @@ const createIcons = async (file) => {
80
80
  const pathData = iconData.path;
81
81
  const ltr = !!iconData.ltr;
82
82
  const acc = iconData.acc;
83
+ const packageName = json.packageName;
84
+ const collection = json.collection;
83
85
 
84
- const content = acc ? iconAccTemplate(name, pathData, ltr, acc, json.collection, json.packageName) : iconTemplate(name, pathData, ltr, json.collection, json.packageName);
86
+ const content = acc ? iconAccTemplate(name, pathData, ltr, acc, collection, packageName) : iconTemplate(name, pathData, ltr, collection, packageName);
85
87
 
86
88
  promises.push(fs.writeFile(path.join(destDir, `${name}.js`), content));
87
89
  promises.push(fs.writeFile(path.join(destDir, `${name}.svg`), svgTemplate(pathData)));
88
- promises.push(fs.writeFile(path.join(destDir, `${name}.d.ts`), typeDefinitionTemplate(name, acc, json.collection)));
90
+ promises.push(fs.writeFile(path.join(destDir, `${name}.d.ts`), typeDefinitionTemplate(name, acc, collection)));
91
+
92
+ // For versioned icons collections, the script creates top level (unversioned) module that internally imports the versioned ones.
93
+ // For example, the top level "@ui5/ui5-webcomponents-icons/dist/accept.js" imports:
94
+ // - "@ui5/ui5-webcomponents-icons/dist/v5/accept.js"
95
+ // - "@ui5/ui5-webcomponents-icons/dist/v4/accept.js"
89
96
 
90
97
  if (json.version) {
91
- promises.push(fs.writeFile(path.join(path.normalize("dist/"), `${name}.js`), collectionTemplate(name)));
92
- promises.push(fs.writeFile(path.join(path.normalize("dist/"), `${name}.d.ts`), collectionTypeDefinitionTemplate(name, acc)));
98
+ // The exported value from the top level (unversioned) icon module depends on whether the collection is the default,
99
+ // to add or not the collection name to the exported value:
100
+ // For the default collection (SAPIcons) we export just the icon name - "export default { 'accept' }"
101
+ // For non-default collections (SAPTNTIcons and SAPBSIcons) we export the full name - "export default { 'tnt/actor' }"
102
+ const effectiveName = isDefaultCollection(collection) ? name : getUnversionedFullIconName(name, collection);
103
+ promises.push(fs.writeFile(path.join(path.normalize("dist/"), `${name}.js`), collectionTemplate(name, json.versions, effectiveName)));
104
+ promises.push(fs.writeFile(path.join(path.normalize("dist/"), `${name}.d.ts`), collectionTypeDefinitionTemplate(effectiveName, acc)));
93
105
  }
94
106
  }
95
107
 
96
108
  return Promise.all(promises);
97
109
  };
98
110
 
111
+ const isDefaultCollection = collectionName => collectionName === "SAP-icons-v4" || collectionName === "SAP-icons-v5";
112
+ const getUnversionedFullIconName = (name, collection) => `${getUnversionedCollectionName(collection)}/${name}`;
113
+ const getUnversionedCollectionName = collectionName => CollectionVersionedToUnversionedMap[collectionName] || collectionName;
114
+
115
+ const CollectionVersionedToUnversionedMap = {
116
+ "tnt-v2": "tnt",
117
+ "tnt-v3": "tnt",
118
+ "business-suite-v1": "business-suite",
119
+ "business-suite-v2": "business-suite",
120
+ };
121
+
99
122
  createIcons(srcFile).then(() => {
100
123
  console.log("Icons created.");
101
124
  });
@@ -1,80 +1,9 @@
1
- const fs = require("fs");
2
-
3
- const jsFileContentTemplate = componentName => {
4
- return `import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
5
- import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
6
- import ${componentName}Template from "./generated/templates/${componentName}Template.lit.js";
7
-
8
- // Styles
9
- import ${componentName}Css from "./generated/themes/${componentName}.css.js";
10
-
11
- /**
12
- * @public
13
- */
14
- const metadata = {
15
- tag: "${tagName}",
16
- properties: /** @lends sap.ui.webc.${library}.${componentName}.prototype */ {
17
- //
18
- },
19
- slots: /** @lends sap.ui.webc.${library}.${componentName}.prototype */ {
20
- //
21
- },
22
- events: /** @lends sap.ui.webc.${library}.${componentName}.prototype */ {
23
- //
24
- },
25
- };
26
-
27
- /**
28
- * @class
29
- *
30
- * <h3 class="comment-api-title">Overview</h3>
31
- *
32
- *
33
- * <h3>Usage</h3>
34
- *
35
- * For the <code>${tagName}</code>
36
- * <h3>ES6 Module Import</h3>
37
- *
38
- * <code>import ${packageName}/dist/${componentName}.js";</code>
39
- *
40
- * @constructor
41
- * @author SAP SE
42
- * @alias sap.ui.webc.${library}.${componentName}
43
- * @extends sap.ui.webc.base.UI5Element
44
- * @tagname ${tagName}
45
- * @public
46
- */
47
- class ${componentName} extends UI5Element {
48
- static get metadata() {
49
- return metadata;
50
- }
51
-
52
- static get render() {
53
- return litRender;
54
- }
55
-
56
- static get styles() {
57
- return ${componentName}Css;
58
- }
59
-
60
- static get template() {
61
- return ${componentName}Template;
62
- }
63
-
64
- static get dependencies() {
65
- return [];
66
- }
67
-
68
- static async onDefine() {
69
-
70
- }
71
- }
1
+ console.log("Creating new web component...")
72
2
 
73
- ${componentName}.define();
74
-
75
- export default ${componentName};
76
- `;
77
- };
3
+ const fs = require("fs");
4
+ const prompts = require("prompts");
5
+ const jsFileContentTemplate = require("./jsFileContentTemplate.js");
6
+ const tsFileContentTemplate = require("./tsFileContentTemplate.js");
78
7
 
79
8
  const getPackageName = () => {
80
9
  if (!fs.existsSync("./package.json")) {
@@ -108,47 +37,91 @@ const getLibraryName = packageName => {
108
37
  return packageName.substr("webcomponents-".length);
109
38
  };
110
39
 
111
- const camelToKebabCase = string => string.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
40
+ // String manipulation
41
+ const capitalizeFirstLetter = string => string.charAt(0).toUpperCase() + string.slice(1);
42
+
43
+ // Validation of user input
44
+ const isNameValid = name => typeof name === "string" && name.match(/^[a-zA-Z][a-zA-Z0-9_-]*$/);
45
+ const isTagNameValid = tagName => tagName.match(/^([a-z][a-z0-9]*-)([a-z0-9]+(-[a-z0-9]+)*)$/);
112
46
 
113
- const packageName = getPackageName();
114
- const library = getLibraryName(packageName);
47
+ const generateFiles = (componentName, tagName, library, packageName, isTypeScript) => {
48
+ componentName = capitalizeFirstLetter(componentName);
49
+ const filePaths = {
50
+ "main": isTypeScript
51
+ ? `./src/${componentName}.ts`
52
+ : `./src/${componentName}.js`,
53
+ "css": `./src/themes/${componentName}.css`,
54
+ "template": `./src/${componentName}.hbs`,
55
+ };
115
56
 
116
- const consoleArguments = process.argv.slice(2);
117
- const componentName = consoleArguments[0];
57
+ const FileContentTemplate = isTypeScript
58
+ ? tsFileContentTemplate(componentName, tagName, library, packageName)
59
+ : jsFileContentTemplate(componentName, tagName, library, packageName);
118
60
 
119
- if (!componentName){
120
- console.error("Please enter component name.");
121
- return;
61
+ fs.writeFileSync(filePaths.main, FileContentTemplate, { flag: "wx+" });
62
+ fs.writeFileSync(filePaths.css, "", { flag: "wx+" });
63
+ fs.writeFileSync(filePaths.template, "<div>Hello World</div>", { flag: "wx+" });
64
+
65
+ console.log(`Successfully generated ${filePaths.main}`);
66
+ console.log(`Successfully generated ${filePaths.css}`);
67
+ console.log(`Successfully generated ${filePaths.template}`);
68
+
69
+ // Change the color of the output
70
+ console.warn('\x1b[33m%s\x1b[0m', `
71
+ Make sure to import the component in your bundle by using:
72
+ import ${componentName} from "./dist/${componentName}.js";`);
122
73
  }
123
74
 
124
- const tagName = `ui5-${camelToKebabCase(componentName)}`;
75
+ // Main function
76
+ const createWebComponent = async () => {
77
+ const packageName = getPackageName();
78
+ const library = getLibraryName(packageName);
125
79
 
126
- const filePaths = {
127
- "js": `./src/${componentName}.js`,
128
- "css": `./src/themes/${componentName}.css`,
129
- "hbs": `./src/${componentName}.hbs`,
130
- };
131
- const sJsFileContentTemplate = jsFileContentTemplate(componentName);
80
+ const consoleArguments = process.argv.slice(2);
81
+ let componentName = consoleArguments[0];
82
+ let tagName = consoleArguments[1];
132
83
 
133
- fs.writeFileSync(filePaths.js, sJsFileContentTemplate, { flag: "wx+" });
134
- fs.writeFileSync(filePaths.css, "", { flag: "wx+" });
135
- fs.writeFileSync(filePaths.hbs, "<div>Hello World</div>", { flag: "wx+" });
84
+ if (componentName && !isNameValid(componentName)) {
85
+ throw new Error("Invalid component name. Please use only letters, numbers, dashes and underscores. The first character must be a letter.");
86
+ }
87
+
88
+ if (tagName && !isTagNameValid(tagName)) {
89
+ throw new Error("Invalid tag name. The tag name should only contain lowercase letters, numbers, dashes, and underscores. The first character must be a letter, and it should follow the pattern 'tag-name'.");
90
+ }
91
+
92
+ if (!componentName) {
93
+ const response = await prompts({
94
+ type: "text",
95
+ name: "componentName",
96
+ message: "Please enter a component name:",
97
+ validate: (value) => isNameValid(value),
98
+ });
99
+ componentName = response.componentName;
100
+
101
+ if (!componentName) {
102
+ process.exit();
103
+ }
104
+ }
136
105
 
106
+ if (!tagName) {
107
+ const response = await prompts({
108
+ type: "text",
109
+ name: "tagName",
110
+ message: "Please enter a tag name:",
111
+ validate: (value) => isTagNameValid(value),
112
+ });
113
+ tagName = response.tagName;
114
+
115
+ if (!tagName) {
116
+ process.exit();
117
+ }
118
+ }
137
119
 
138
- console.log(`Successfully generated ${componentName}.js`);
139
- console.log(`Successfully generated ${componentName}.css`);
140
- console.log(`Successfully generated ${componentName}.hbs`);
120
+ const isTypeScript = fs.existsSync(path.join(process.cwd(), "tsconfig.json"));
121
+ console.log({ isTypeScript })
141
122
 
142
- const bundleLogger = fs.createWriteStream("./bundle.common.js", {
143
- flags: "a" // appending
144
- });
145
123
 
146
- bundleLogger.write(`
147
- // TODO: Move this line in order to keep the file sorted alphabetically
148
- import ${componentName} from "./dist/${componentName}.js";`);
124
+ generateFiles(componentName, tagName, library, packageName, isTypeScript);
125
+ };
149
126
 
150
- // Change the color of the output
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
- `);
127
+ createWebComponent();
@@ -0,0 +1,77 @@
1
+ const jsFileContentTemplate = (componentName, tagName, library, packageName) => {
2
+ return `import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
3
+ import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
4
+ import ${componentName}Template from "./generated/templates/${componentName}Template.lit.js";
5
+
6
+ // Styles
7
+ import ${componentName}Css from "./generated/themes/${componentName}.css.js";
8
+
9
+ /**
10
+ * @public
11
+ */
12
+ const metadata = {
13
+ tag: "${tagName}",
14
+ properties: /** @lends sap.ui.webc.${library}.${componentName}.prototype */ {
15
+ //
16
+ },
17
+ slots: /** @lends sap.ui.webc.${library}.${componentName}.prototype */ {
18
+ //
19
+ },
20
+ events: /** @lends sap.ui.webc.${library}.${componentName}.prototype */ {
21
+ //
22
+ },
23
+ };
24
+
25
+ /**
26
+ * @class
27
+ *
28
+ * <h3 class="comment-api-title">Overview</h3>
29
+ *
30
+ *
31
+ * <h3>Usage</h3>
32
+ *
33
+ * For the <code>${tagName}</code>
34
+ * <h3>ES6 Module Import</h3>
35
+ *
36
+ * <code>import ${packageName}/dist/${componentName}.js";</code>
37
+ *
38
+ * @constructor
39
+ * @author SAP SE
40
+ * @alias sap.ui.webc.${library}.${componentName}
41
+ * @extends sap.ui.webc.base.UI5Element
42
+ * @tagname ${tagName}
43
+ * @public
44
+ */
45
+ class ${componentName} extends UI5Element {
46
+ static get metadata() {
47
+ return metadata;
48
+ }
49
+
50
+ static get render() {
51
+ return litRender;
52
+ }
53
+
54
+ static get styles() {
55
+ return ${componentName}Css;
56
+ }
57
+
58
+ static get template() {
59
+ return ${componentName}Template;
60
+ }
61
+
62
+ static get dependencies() {
63
+ return [];
64
+ }
65
+
66
+ static async onDefine() {
67
+
68
+ }
69
+ }
70
+
71
+ ${componentName}.define();
72
+
73
+ export default ${componentName};
74
+ `;
75
+ };
76
+
77
+ module.exports = jsFileContentTemplate;
@@ -0,0 +1,84 @@
1
+ const tsFileContentTemplate = (componentName, tagName, library, packageName) => {
2
+ return `import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
3
+ import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
4
+ import property from "@ui5/webcomponents-base/dist/decorators/property.js";
5
+ import slot from "@ui5/webcomponents-base/dist/decorators/slot.js";
6
+ import event from "@ui5/webcomponents-base/dist/decorators/event.js";
7
+ import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
8
+
9
+ import ${componentName}Template from "./generated/templates/${componentName}Template.lit.js";
10
+
11
+ // Styles
12
+ import ${componentName}Css from "./generated/themes/${componentName}.css.js";
13
+
14
+ /**
15
+ * @class
16
+ *
17
+ * <h3 class="comment-api-title">Overview</h3>
18
+ *
19
+ *
20
+ * <h3>Usage</h3>
21
+ *
22
+ * For the <code>${tagName}</code>
23
+ * <h3>ES6 Module Import</h3>
24
+ *
25
+ * <code>import ${packageName}/dist/${componentName}.js";</code>
26
+ *
27
+ * @constructor
28
+ * @author SAP SE
29
+ * @alias sap.ui.webc.${library}.${componentName}
30
+ * @extends sap.ui.webc.base.UI5Element
31
+ * @tagname ${tagName}
32
+ * @public
33
+ */
34
+ @customElement({
35
+ tag: "${tagName}",
36
+ renderer: litRender,
37
+ styles: ${componentName}Css,
38
+ template: ${componentName}Template,
39
+ dependencies: [],
40
+ })
41
+
42
+ /**
43
+ * Example custom event.
44
+ * Please keep in mind that all public events should be documented in the API Reference as shown below.
45
+ *
46
+ * @event sap.ui.webc.${library}.${componentName}#interact
47
+ * @public
48
+ */
49
+ @event("interact", { detail: { /* event payload ( optional ) */ } })
50
+ class ${componentName} extends UI5Element {
51
+ /**
52
+ * Defines the value of the component.
53
+ *
54
+ * @type {string}
55
+ * @name sap.ui.webc.${library}.${componentName}.prototype.value
56
+ * @defaultvalue ""
57
+ * @public
58
+ */
59
+ @property()
60
+ value!: string;
61
+
62
+ /**
63
+ * Defines the text of the component.
64
+ *
65
+ * @type {Node[]}
66
+ * @name sap.ui.webc.${library}.${componentName}.prototype.default
67
+ * @slot
68
+ * @public
69
+ */
70
+ @slot({ type: Node, "default": true })
71
+ text!: Array<Node>;
72
+
73
+ static async onDefine() {
74
+
75
+ }
76
+ }
77
+
78
+ ${componentName}.define();
79
+
80
+ export default ${componentName};
81
+ `;
82
+ };
83
+
84
+ module.exports = tsFileContentTemplate;
@@ -1,6 +1,5 @@
1
- let path = require("path");
2
-
3
1
  const virtualIndexPlugin = async () => {
2
+ const path = await import("path");
4
3
  const { globby } = await import("globby");
5
4
  const files = await globby(["test/pages/**/*.html", "packages/*/test/pages/**/*.html"]);
6
5
 
@@ -49,7 +49,7 @@ const convertImports = async (srcPath) => {
49
49
 
50
50
  const generate = async () => {
51
51
  const { globby } = await import("globby");
52
- const fileNames = await globby(basePath + "**/*.js");
52
+ const fileNames = await globby(basePath.replace(/\\/g, "/") + "**/*.js");
53
53
  return Promise.all(fileNames.map(convertImports).filter(x => !!x));
54
54
  };
55
55
 
@@ -1,9 +1,12 @@
1
1
  const fs = require("fs").promises;
2
+ const path = require("path");
2
3
  // https://github.com/webcomponents/custom-elements-manifest/blob/main/schema.json
3
4
 
5
+ const inputDir = process.argv[2];
6
+ const outputDir = process.argv[3];
7
+
4
8
  const camelToKebabMap = new Map();
5
9
  const apiIndex = new Map();
6
- const processedApiIndex = new Set();
7
10
  const forbiddenAttributeTypes = ["object", "array"];
8
11
 
9
12
  const camelToKebabCase = string => {
@@ -16,7 +19,7 @@ const camelToKebabCase = string => {
16
19
 
17
20
  const generateJavaScriptExport = entity => {
18
21
  return {
19
- declaration: generateRefenrece(entity),
22
+ declaration: generateRefenrece(entity.name),
20
23
  deprecated: !!entity.deprecated,
21
24
  kind: "js",
22
25
  name: "default",
@@ -226,8 +229,6 @@ const generateSlots = slots => {
226
229
  };
227
230
 
228
231
  const generateCustomElementDeclaration = entity => {
229
- entity = generateFullComponentApi(entity);
230
-
231
232
  let generatedCustomElementDeclaration = {
232
233
  deprecated: !!entity.deprecated,
233
234
  customElement: true,
@@ -265,107 +266,60 @@ const generateCustomElementDeclaration = entity => {
265
266
  }
266
267
 
267
268
  if (entity.extends && entity.extends !== "HTMLElement") {
268
- generatedCustomElementDeclaration.superclass = generateRefenrece(apiIndex.get(entity.extends));
269
+ generatedCustomElementDeclaration.superclass = generateRefenrece(entity.extends);
269
270
  }
270
271
 
271
272
  return generatedCustomElementDeclaration;
272
273
  };
273
274
 
274
- const generateRefenrece = (entity) => {
275
+ const generateRefenrece = (entityName) => {
275
276
  let packageName;
277
+ let basename;
276
278
 
277
- if (!entity.name) {
279
+ if (!entityName) {
278
280
  throw new Error("JSDoc error: entity not found in api.json.");
279
281
  }
280
282
 
281
- if (entity.name.includes("sap.ui.webc.main")) {
283
+ if (entityName.includes(".")) {
284
+ basename = entityName.split(".").pop();
285
+ } else {
286
+ basename = entityName
287
+ }
288
+
289
+ if (entityName.includes("sap.ui.webc.main")) {
282
290
  packageName = "@ui5/webcomponents";
283
- } else if (entity.name.includes("sap.ui.webc.fiori")) {
291
+ } else if (entityName.includes("sap.ui.webc.fiori")) {
284
292
  packageName = "@ui5/webcomponents-fiori";
285
- } else if (entity.name.includes("sap.ui.webc.base")) {
293
+ } else if (entityName.includes("sap.ui.webc.base")) {
286
294
  packageName = "@ui5/webcomponents-base";
287
295
  }
288
296
 
289
297
  return {
290
- module: `${entity.module}.js`,
291
- name: `${entity.basename}`,
298
+ module: `${basename}.js`,
299
+ name: `${basename}`,
292
300
  package: packageName,
293
301
  };
294
302
  };
295
303
 
296
- const generateFullComponentApi = entity => {
297
- const componentProps = ["properties", "slots", "events", "methods"];
298
- let parent = apiIndex.get(entity.extends);
299
-
300
- if (!parent) {
301
- processedApiIndex.add(entity.name);
302
-
303
- return entity;
304
- }
305
-
306
- parent = processedApiIndex.has(entity.extends) ? apiIndex.get(entity.extends) : generateFullComponentApi(parent);
307
-
308
- componentProps.forEach(prop => {
309
- if (parent[prop] && parent[prop].length) {
310
- if (entity[prop] && entity[prop].length) {
311
- const uniqueParentState = parent[prop].filter(pSlot => {
312
- return !entity[prop].some(eSlot => eSlot.name === pSlot.name);
313
- });
314
-
315
- entity[prop] = entity[prop].concat(uniqueParentState);
316
- } else {
317
- entity[prop] = [...parent[prop]];
318
- }
319
- }
320
- });
321
-
322
- processedApiIndex.add(entity.name);
323
-
324
- return entity;
325
- };
326
-
327
304
  const filterPublicApi = array => {
328
305
  return (array || []).filter(el => el.visibility === "public");
329
306
  };
330
307
 
331
308
  const generate = async () => {
332
- const apiFilesPaths = [
333
- require.resolve("@ui5/webcomponents-base/dist/api.json"),
334
- require.resolve("@ui5/webcomponents/dist/api.json"),
335
- require.resolve("@ui5/webcomponents-fiori/dist/api.json"),
336
- ];
337
-
338
- let apiFiles = new Map();
339
-
340
- await Promise.all(apiFilesPaths.map(async (apiFilePath) => {
341
- const file = JSON.parse(await fs.readFile(apiFilePath));
342
-
343
- apiFiles.set(apiFilePath, file);
344
-
345
- file.symbols.forEach(symbol => {
346
- apiIndex.set(symbol.name, symbol);
347
- });
348
- }));
309
+ const file = JSON.parse(await fs.readFile(path.join(inputDir, "api.json")));
310
+ let customElementsManifest = {
311
+ schemaVersion: "1.0.0",
312
+ readme: "",
313
+ modules: [],
314
+ };
349
315
 
350
- await Promise.all(apiFilesPaths.map(async (apiFilePath) => {
351
- if (apiFilePath.includes("base")) {
352
- return;
316
+ file.symbols.forEach(entity => {
317
+ if (entity.tagname) {
318
+ customElementsManifest.modules.push(generateJavaScriptModule(entity));
353
319
  }
320
+ });
354
321
 
355
- let customElementsManifest = {
356
- schemaVersion: "1.0.0",
357
- readme: "",
358
- modules: [],
359
- };
360
-
361
- apiFiles.get(apiFilePath).symbols.forEach(entity => {
362
- if (entity.tagname) {
363
- customElementsManifest.modules.push(generateJavaScriptModule(entity));
364
- }
365
- });
366
-
367
- await fs.writeFile(apiFilePath.replace("api.json", "custom-elements.json"), JSON.stringify(customElementsManifest));
368
- }));
322
+ await fs.writeFile(path.join(outputDir, "custom-elements.json"), JSON.stringify(customElementsManifest));
369
323
  };
370
324
 
371
325
  generate().then(() => {