@ui5/builder 3.0.0-alpha.9 → 3.0.0-beta.2

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 (83) hide show
  1. package/.reuse/dep5 +2 -2
  2. package/CHANGELOG.md +59 -1
  3. package/CONTRIBUTING.md +1 -1
  4. package/README.md +4 -4
  5. package/jsdoc.json +2 -2
  6. package/lib/lbt/UI5ClientConstants.js +7 -8
  7. package/lib/lbt/analyzer/ComponentAnalyzer.js +60 -22
  8. package/lib/lbt/analyzer/FioriElementsAnalyzer.js +31 -20
  9. package/lib/lbt/analyzer/JSModuleAnalyzer.js +119 -77
  10. package/lib/lbt/analyzer/SmartTemplateAnalyzer.js +31 -20
  11. package/lib/lbt/analyzer/XMLCompositeAnalyzer.js +35 -25
  12. package/lib/lbt/analyzer/XMLTemplateAnalyzer.js +71 -18
  13. package/lib/lbt/analyzer/analyzeLibraryJS.js +22 -6
  14. package/lib/lbt/bundle/AutoSplitter.js +10 -11
  15. package/lib/lbt/bundle/Builder.js +33 -36
  16. package/lib/lbt/bundle/BundleDefinition.js +1 -5
  17. package/lib/lbt/bundle/BundleWriter.js +1 -2
  18. package/lib/lbt/bundle/ResolvedBundleDefinition.js +6 -7
  19. package/lib/lbt/bundle/Resolver.js +11 -12
  20. package/lib/lbt/calls/SapUiDefine.js +16 -11
  21. package/lib/lbt/graph/dependencyGraph.js +3 -4
  22. package/lib/lbt/graph/dominatorTree.js +3 -3
  23. package/lib/lbt/graph/topologicalSort.js +3 -3
  24. package/lib/lbt/resources/LibraryFileAnalyzer.js +6 -9
  25. package/lib/lbt/resources/LocatorResource.js +2 -2
  26. package/lib/lbt/resources/LocatorResourcePool.js +3 -3
  27. package/lib/lbt/resources/ModuleInfo.js +2 -3
  28. package/lib/lbt/resources/Resource.js +3 -4
  29. package/lib/lbt/resources/ResourceCollector.js +8 -9
  30. package/lib/lbt/resources/ResourceFilterList.js +38 -40
  31. package/lib/lbt/resources/ResourceInfo.js +1 -1
  32. package/lib/lbt/resources/ResourceInfoList.js +5 -3
  33. package/lib/lbt/resources/ResourcePool.js +15 -21
  34. package/lib/lbt/utils/ASTUtils.js +60 -44
  35. package/lib/lbt/utils/JSTokenizer.js +4 -4
  36. package/lib/lbt/utils/ModuleName.js +10 -20
  37. package/lib/lbt/utils/escapePropertiesFile.js +4 -4
  38. package/lib/lbt/utils/parseUtils.js +5 -11
  39. package/lib/processors/bootstrapHtmlTransformer.js +15 -7
  40. package/lib/processors/bundlers/flexChangesBundler.js +16 -8
  41. package/lib/processors/bundlers/moduleBundler.js +26 -15
  42. package/lib/processors/jsdoc/apiIndexGenerator.js +16 -9
  43. package/lib/processors/jsdoc/jsdocGenerator.js +37 -25
  44. package/lib/processors/jsdoc/lib/{createIndexFiles.js → createIndexFiles.cjs} +0 -0
  45. package/lib/processors/jsdoc/lib/{transformApiJson.js → transformApiJson.cjs} +59 -2
  46. package/lib/processors/jsdoc/lib/ui5/{plugin.js → plugin.cjs} +310 -119
  47. package/lib/processors/jsdoc/lib/ui5/template/{publish.js → publish.cjs} +6 -2
  48. package/lib/processors/jsdoc/lib/ui5/template/utils/{versionUtil.js → versionUtil.cjs} +0 -0
  49. package/lib/processors/jsdoc/sdkTransformer.js +18 -11
  50. package/lib/processors/libraryLessGenerator.js +28 -16
  51. package/lib/processors/manifestCreator.js +15 -14
  52. package/lib/processors/minifier.js +22 -16
  53. package/lib/processors/nonAsciiEscaper.js +17 -7
  54. package/lib/processors/resourceListCreator.js +13 -13
  55. package/lib/processors/stringReplacer.js +13 -6
  56. package/lib/processors/themeBuilder.js +33 -24
  57. package/lib/processors/versionInfoGenerator.js +40 -30
  58. package/lib/tasks/buildThemes.js +18 -11
  59. package/lib/tasks/bundlers/generateBundle.js +23 -12
  60. package/lib/tasks/bundlers/generateComponentPreload.js +23 -12
  61. package/lib/tasks/bundlers/generateFlexChangesBundle.js +16 -8
  62. package/lib/tasks/bundlers/generateLibraryPreload.js +33 -17
  63. package/lib/tasks/bundlers/generateStandaloneAppBundle.js +21 -13
  64. package/lib/tasks/bundlers/utils/createModuleNameMapping.js +7 -7
  65. package/lib/tasks/escapeNonAsciiCharacters.js +12 -5
  66. package/lib/tasks/generateCachebusterInfo.js +17 -9
  67. package/lib/tasks/generateLibraryManifest.js +14 -8
  68. package/lib/tasks/generateResourcesJson.js +15 -9
  69. package/lib/tasks/generateThemeDesignerResources.js +19 -9
  70. package/lib/tasks/generateVersionInfo.js +12 -5
  71. package/lib/tasks/jsdoc/executeJsdocSdkTransformation.js +17 -9
  72. package/lib/tasks/jsdoc/generateApiIndex.js +16 -10
  73. package/lib/tasks/jsdoc/generateJsdoc.js +131 -119
  74. package/lib/tasks/minify.js +13 -6
  75. package/lib/tasks/replaceBuildtime.js +12 -5
  76. package/lib/tasks/replaceCopyright.js +12 -5
  77. package/lib/tasks/replaceVersion.js +12 -5
  78. package/lib/tasks/taskRepository.js +24 -30
  79. package/lib/tasks/transformBootstrapHtml.js +6 -5
  80. package/package.json +44 -31
  81. package/index.js +0 -173
  82. package/lib/processors/bundlers/manifestBundler.js +0 -172
  83. package/lib/tasks/bundlers/generateManifestBundle.js +0 -49
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ui5/builder",
3
- "version": "3.0.0-alpha.9",
3
+ "version": "3.0.0-beta.2",
4
4
  "description": "UI5 Tooling - Builder",
5
5
  "author": {
6
6
  "name": "SAP SE",
@@ -16,9 +16,19 @@
16
16
  "development",
17
17
  "tool"
18
18
  ],
19
- "main": "index.js",
19
+ "type": "module",
20
+ "exports": {
21
+ "./processors/*": "./lib/processors/*.js",
22
+ "./processors/jsdoc/lib/*": null,
23
+ "./tasks/*": "./lib/tasks/*.js",
24
+ "./tasks/taskRepository": null,
25
+ "./tasks/bundlers/utils/*": null,
26
+ "./package.json": "./package.json",
27
+ "./internal/taskRepository": "./lib/tasks/taskRepository.js",
28
+ "./internal/jsdoc/template/publish": "./lib/processors/jsdoc/lib/ui5/template/publish.cjs"
29
+ },
20
30
  "engines": {
21
- "node": ">= 16.13.2",
31
+ "node": "^16.18.0 || >=18.0.0",
22
32
  "npm": ">= 8"
23
33
  },
24
34
  "scripts": {
@@ -29,9 +39,9 @@
29
39
  "unit-verbose": "rimraf test/tmp && cross-env UI5_LOG_LVL=verbose ava --verbose --serial",
30
40
  "unit-watch": "rimraf test/tmp && ava --watch",
31
41
  "unit-nyan": "rimraf test/tmp && ava --tap | tnyan",
32
- "unit-xunit": "rimraf test/tmp && ava --tap --timeout=1m | tap-xunit --dontUseCommentsAsTestNames=true > test-results.xml",
42
+ "unit-xunit": "rimraf test/tmp && ava --node-arguments=\"--experimental-loader=@istanbuljs/esm-loader-hook\" --tap --timeout=1m | tap-xunit --dontUseCommentsAsTestNames=true > test-results.xml",
33
43
  "unit-inspect": "cross-env UI5_LOG_LVL=verbose ava debug --break",
34
- "coverage": "nyc npm run unit",
44
+ "coverage": "rimraf test/tmp && nyc ava --node-arguments=\"--experimental-loader=@istanbuljs/esm-loader-hook\"",
35
45
  "coverage-xunit": "nyc --reporter=text --reporter=text-summary --reporter=cobertura npm run unit-xunit",
36
46
  "jsdoc": "npm run jsdoc-generate && open-cli jsdocs/index.html",
37
47
  "jsdoc-generate": "jsdoc -c ./jsdoc.json -t $(node -p 'path.dirname(require.resolve(\"docdash\"))') ./lib/ || (echo 'Error during JSDoc generation! Check log.' && exit 1)",
@@ -40,10 +50,9 @@
40
50
  "version": "git-chglog --sort semver --next-tag v$npm_package_version -o CHANGELOG.md && git add CHANGELOG.md",
41
51
  "postversion": "git push --follow-tags",
42
52
  "release-note": "git-chglog --sort semver -c .chglog/release-config.yml v$npm_package_version",
43
- "depcheck": "depcheck --ignores docdash --ignore-patterns lib/processors/jsdoc/lib/ui5"
53
+ "depcheck": "depcheck --ignores @ui5/builder,docdash,@istanbuljs/esm-loader-hook,catharsis --parsers='**/*.js:es6,**/*.cjs:es6'"
44
54
  },
45
55
  "files": [
46
- "index.js",
47
56
  "CHANGELOG.md",
48
57
  "CONTRIBUTING.md",
49
58
  "jsdoc.json",
@@ -57,6 +66,10 @@
57
66
  ],
58
67
  "ignoredByWatcher": [
59
68
  "test/tmp/**"
69
+ ],
70
+ "nodeArguments": [
71
+ "--loader=esmock",
72
+ "--no-warnings"
60
73
  ]
61
74
  },
62
75
  "nyc": {
@@ -71,8 +84,8 @@
71
84
  "jsdocs/**",
72
85
  "coverage/**",
73
86
  "test/**",
74
- ".eslintrc.js",
75
- "jsdoc-plugin.js"
87
+ ".eslintrc.cjs",
88
+ "jsdoc-plugin.cjs"
76
89
  ],
77
90
  "check-coverage": true,
78
91
  "statements": 85,
@@ -106,42 +119,42 @@
106
119
  },
107
120
  "dependencies": {
108
121
  "@jridgewell/sourcemap-codec": "^1.4.14",
109
- "@ui5/fs": "^3.0.0-alpha.5",
110
- "@ui5/logger": "^3.0.1-alpha.1",
111
- "cheerio": "1.0.0-rc.9",
122
+ "@ui5/fs": "^3.0.0-beta.3",
123
+ "@ui5/logger": "^3.0.1-beta.1",
124
+ "cheerio": "1.0.0-rc.12",
112
125
  "escape-unicode": "^0.2.0",
113
- "escope": "^3.6.0",
114
- "espree": "^9.3.1",
115
- "graceful-fs": "^4.2.9",
116
- "jsdoc": "^3.6.7",
126
+ "escope": "^4.0.0",
127
+ "espree": "^9.4.1",
128
+ "graceful-fs": "^4.2.10",
129
+ "jsdoc": "^3.6.11",
117
130
  "less-openui5": "^0.11.2",
118
131
  "make-dir": "^3.1.0",
119
132
  "pretty-data": "^0.40.0",
120
133
  "replacestream": "^4.0.3",
121
134
  "rimraf": "^3.0.2",
122
- "semver": "^7.3.5",
123
- "terser": "^5.14.2",
124
- "xml2js": "^0.4.23",
125
- "yazl": "^2.5.1"
135
+ "semver": "^7.3.8",
136
+ "terser": "^5.16.0",
137
+ "xml2js": "^0.4.23"
126
138
  },
127
139
  "devDependencies": {
128
- "@ui5/project": "^3.0.0-alpha.6",
129
- "ava": "^3.15.0",
130
- "chai": "^4.3.4",
140
+ "@istanbuljs/esm-loader-hook": "^0.2.0",
141
+ "@ui5/project": "^3.0.0-beta.3",
142
+ "ava": "^5.1.0",
143
+ "chai": "^4.3.7",
131
144
  "chai-fs": "^2.0.0",
132
145
  "chokidar-cli": "^3.0.0",
133
146
  "cross-env": "^7.0.3",
134
147
  "depcheck": "^1.4.3",
135
- "docdash": "^1.2.0",
136
- "eslint": "^8.7.0",
148
+ "docdash": "^2.0.0",
149
+ "eslint": "^8.28.0",
137
150
  "eslint-config-google": "^0.14.0",
138
- "eslint-plugin-jsdoc": "^37.6.3",
139
- "extract-zip": "^2.0.1",
140
- "mock-require": "^3.0.3",
151
+ "eslint-plugin-ava": "^13.2.0",
152
+ "eslint-plugin-jsdoc": "^39.6.4",
153
+ "esmock": "^2.0.9",
141
154
  "nyc": "^15.1.0",
142
- "open-cli": "^6.0.1",
143
- "recursive-readdir": "^2.1.1",
144
- "sinon": "^11.1.2",
155
+ "open-cli": "^7.1.0",
156
+ "recursive-readdir": "^2.2.3",
157
+ "sinon": "^14.0.2",
145
158
  "tap-nyan": "^1.1.0",
146
159
  "tap-xunit": "^2.4.1"
147
160
  }
package/index.js DELETED
@@ -1,173 +0,0 @@
1
- /**
2
- * @module @ui5/builder
3
- * @public
4
- */
5
- module.exports = {
6
- /**
7
- * @public
8
- * @alias module:@ui5/builder.processors
9
- * @namespace
10
- */
11
- processors: {
12
- /**
13
- * @type {import('./lib/processors/bundlers/flexChangesBundler')}
14
- */
15
- flexChangesBundler: "./lib/processors/bundlers/flexChangesBundler",
16
- /**
17
- * @type {import('./lib/processors/bundlers/manifestBundler')}
18
- */
19
- manifestBundler: "./lib/processors/bundlers/manifestBundler",
20
- /**
21
- * @type {import('./lib/processors/bundlers/moduleBundler')}
22
- */
23
- moduleBundler: "./lib/processors/bundlers/moduleBundler",
24
- /**
25
- * @type {import('./lib/processors/jsdoc/apiIndexGenerator')}
26
- */
27
- apiIndexGenerator: "./lib/processors/jsdoc/apiIndexGenerator",
28
- /**
29
- * @type {import('./lib/processors/jsdoc/jsdocGenerator')}
30
- */
31
- jsdocGenerator: "./lib/processors/jsdoc/jsdocGenerator",
32
- /**
33
- * @type {import('./lib/processors/jsdoc/sdkTransformer')}
34
- */
35
- sdkTransformer: "./lib/processors/jsdoc/sdkTransformer",
36
- /**
37
- * @type {import('./lib/processors/bootstrapHtmlTransformer')}
38
- */
39
- bootstrapHtmlTransformer: "./lib/processors/bootstrapHtmlTransformer",
40
- /**
41
- * @type {import('./lib/processors/minifier')}
42
- */
43
- minifier: "./lib/processors/minifier",
44
- /**
45
- * @type {import('./lib/processors/libraryLessGenerator')}
46
- */
47
- libraryLessGenerator: "./lib/processors/libraryLessGenerator",
48
- /**
49
- * @type {import('./lib/processors/manifestCreator')}
50
- */
51
- manifestCreator: "./lib/processors/manifestCreator",
52
- /**
53
- * @type {import('./lib/processors/nonAsciiEscaper')}
54
- */
55
- nonAsciiEscaper: "./lib/processors/nonAsciiEscaper",
56
- /**
57
- * @type {import('./lib/processors/stringReplacer')}
58
- */
59
- stringReplacer: "./lib/processors/stringReplacer",
60
- /**
61
- * @type {import('./lib/processors/themeBuilder')}
62
- */
63
- themeBuilder: "./lib/processors/themeBuilder",
64
- /**
65
- * @type {import('./lib/processors/versionInfoGenerator')}
66
- */
67
- versionInfoGenerator: "./lib/processors/versionInfoGenerator"
68
- },
69
- /**
70
- * @public
71
- * @alias module:@ui5/builder.tasks
72
- * @namespace
73
- */
74
- tasks: {
75
- /**
76
- * @type {import('./lib/tasks/bundlers/generateComponentPreload')}
77
- */
78
- generateComponentPreload: "./lib/tasks/bundlers/generateComponentPreload",
79
- /**
80
- * @type {import('./lib/tasks/bundlers/generateFlexChangesBundle')}
81
- */
82
- generateFlexChangesBundle: "./lib/tasks/bundlers/generateFlexChangesBundle",
83
- /**
84
- * @type {import('./lib/tasks/bundlers/generateLibraryPreload')}
85
- */
86
- generateLibraryPreload: "./lib/tasks/bundlers/generateLibraryPreload",
87
- /**
88
- * @type {import('./lib/tasks/bundlers/generateManifestBundle')}
89
- */
90
- generateManifestBundle: "./lib/tasks/bundlers/generateManifestBundle",
91
- /**
92
- * @type {import('./lib/tasks/bundlers/generateStandaloneAppBundle')}
93
- */
94
- generateStandaloneAppBundle: "./lib/tasks/bundlers/generateStandaloneAppBundle",
95
- /**
96
- * @type {import('./lib/tasks/generateThemeDesignerResources')}
97
- */
98
- generateThemeDesignerResources: "./lib/tasks/generateThemeDesignerResources",
99
- /**
100
- * @type {import('./lib/tasks/bundlers/generateBundle')}
101
- */
102
- generateBundle: "./lib/tasks/bundlers/generateBundle",
103
- /**
104
- * @type {import('./lib/tasks/generateCachebusterInfo')}
105
- */
106
- generateCachebusterInfo: "./lib/tasks/generateCachebusterInfo",
107
- /**
108
- * @type {import('./lib/tasks/buildThemes')}
109
- */
110
- buildThemes: "./lib/tasks/buildThemes",
111
- /**
112
- * @type {import('./lib/tasks/minify')}
113
- */
114
- minify: "./lib/tasks/minify",
115
- /**
116
- * @type {import('./lib/tasks/jsdoc/executeJsdocSdkTransformation')}
117
- */
118
- executeJsdocSdkTransformation: "./lib/tasks/jsdoc/executeJsdocSdkTransformation",
119
- /**
120
- * @type {import('./lib/tasks/jsdoc/generateApiIndex')}
121
- */
122
- generateApiIndex: "./lib/tasks/jsdoc/generateApiIndex",
123
- /**
124
- * @type {import('./lib/tasks/jsdoc/generateJsdoc')}
125
- */
126
- generateJsdoc: "./lib/tasks/jsdoc/generateJsdoc",
127
- /**
128
- * @type {import('./lib/tasks/generateVersionInfo')}
129
- */
130
- generateVersionInfo: "./lib/tasks/generateVersionInfo",
131
- /**
132
- * @type {import('./lib/tasks/escapeNonAsciiCharacters')}
133
- */
134
- escapeNonAsciiCharacters: "./lib/tasks/escapeNonAsciiCharacters",
135
- /**
136
- * @type {import('./lib/tasks/replaceCopyright')}
137
- */
138
- replaceCopyright: "./lib/tasks/replaceCopyright",
139
- /**
140
- * @type {import('./lib/tasks/replaceVersion')}
141
- */
142
- replaceVersion: "./lib/tasks/replaceVersion",
143
- /**
144
- * @type {import('./lib/tasks/replaceBuildtime')}
145
- */
146
- replaceBuildtime: "./lib/tasks/replaceBuildtime",
147
- /**
148
- * @type {import('./lib/tasks/transformBootstrapHtml')}
149
- */
150
- transformBootstrapHtml: "./lib/tasks/transformBootstrapHtml",
151
- /**
152
- * @type {import('./lib/tasks/taskRepository')}
153
- */
154
- taskRepository: "./lib/tasks/taskRepository",
155
- }
156
- };
157
-
158
- function exportModules(exportRoot, modulePaths) {
159
- for (const moduleName of Object.keys(modulePaths)) {
160
- if (typeof modulePaths[moduleName] === "object") {
161
- exportRoot[moduleName] = {};
162
- exportModules(exportRoot[moduleName], modulePaths[moduleName]);
163
- } else {
164
- Object.defineProperty(exportRoot, moduleName, {
165
- get() {
166
- return require(modulePaths[moduleName]);
167
- }
168
- });
169
- }
170
- }
171
- }
172
-
173
- exportModules(module.exports, JSON.parse(JSON.stringify(module.exports)));
@@ -1,172 +0,0 @@
1
- const posixPath = require("path").posix;
2
- const yazl = require("yazl");
3
- const resourceFactory = require("@ui5/fs").resourceFactory;
4
- const log = require("@ui5/logger").getLogger("builder:processors:bundlers:manifestBundler");
5
-
6
- /**
7
- * Repository to handle i18n resource files
8
- *
9
- * @private
10
- */
11
- class I18nResourceList {
12
- /**
13
- * Constructor
14
- */
15
- constructor() {
16
- this.propertyFiles = new Map();
17
- }
18
-
19
- /**
20
- * Adds a i18n resource to the repository
21
- *
22
- * @param {string} directory Path to the i18n resource
23
- * @param {module:@ui5/fs.Resource} resource i18n resource
24
- */
25
- add(directory, resource) {
26
- const normalizedDirectory = posixPath.normalize(directory);
27
- if (!this.propertyFiles.has(normalizedDirectory)) {
28
- this.propertyFiles.set(normalizedDirectory, [resource]);
29
- } else {
30
- this.propertyFiles.get(normalizedDirectory).push(resource);
31
- }
32
- }
33
-
34
- /**
35
- * Gets all registered i18n files within the provided path
36
- *
37
- * @param {string} directory Path to search for
38
- * @returns {Array} Array of resources files
39
- */
40
- get(directory) {
41
- return this.propertyFiles.get(posixPath.normalize(directory)) || [];
42
- }
43
- }
44
-
45
- /**
46
- * Creates a manifest bundle from the provided resources.
47
- *
48
- * @alias module:@ui5/builder.processors.manifestBundler
49
- * @public
50
- * @param {object} parameters Parameters
51
- * @param {module:@ui5/fs.Resource[]} parameters.resources List of resources to be processed
52
- * @param {object} parameters.options Options
53
- * @param {string} parameters.options.namespace Namespace of the project
54
- * @param {string} parameters.options.bundleName Name of the bundled zip file
55
- * @param {string} parameters.options.propertiesExtension Extension name of the properties files, e.g. ".properties"
56
- * @param {string} parameters.options.descriptor Descriptor name
57
- * @returns {Promise<module:@ui5/fs.Resource[]>} Promise resolving with manifest bundle resources
58
- */
59
- module.exports = ({resources, options: {namespace, bundleName, propertiesExtension, descriptor}}) => {
60
- function bundleNameToUrl(bundleName, appId) {
61
- if (!bundleName.startsWith(appId)) {
62
- return null;
63
- }
64
- const relativeBundleName = bundleName.substring(appId.length + 1);
65
- return relativeBundleName.replace(/\./g, "/") + propertiesExtension;
66
- }
67
-
68
- function addDescriptorI18nInfos(descriptorI18nInfos, manifest) {
69
- function addI18nInfo(i18nPath) {
70
- if (i18nPath.startsWith("ui5:")) {
71
- log.warn(`Using the ui5:// protocol for i18n bundles is currently not supported ('${i18nPath}' in ${manifest.path})`);
72
- return;
73
- }
74
- descriptorI18nInfos.set(
75
- posixPath.join(posixPath.dirname(manifest.path), posixPath.dirname(i18nPath)),
76
- posixPath.basename(i18nPath, propertiesExtension)
77
- );
78
- }
79
-
80
- const content = JSON.parse(manifest.content);
81
- const appI18n = content["sap.app"]["i18n"];
82
- let bundleUrl;
83
- // i18n section in sap.app can be either a string or an object with bundleUrl
84
- if (typeof appI18n === "object") {
85
- if (appI18n.bundleUrl) {
86
- bundleUrl = appI18n.bundleUrl;
87
- } else if (appI18n.bundleName) {
88
- bundleUrl = bundleNameToUrl(appI18n.bundleName, content["sap.app"]["id"]);
89
- }
90
- } else if (typeof appI18n === "string") {
91
- bundleUrl = appI18n;
92
- } else {
93
- bundleUrl = "i18n/i18n.properties";
94
- }
95
- if (bundleUrl) {
96
- addI18nInfo(bundleUrl);
97
- }
98
-
99
- if (typeof appI18n === "object" && Array.isArray(appI18n.enhanceWith)) {
100
- appI18n.enhanceWith.forEach((enhanceWithEntry) => {
101
- let bundleUrl;
102
- if (enhanceWithEntry.bundleUrl) {
103
- bundleUrl = enhanceWithEntry.bundleUrl;
104
- } else if (enhanceWithEntry.bundleName) {
105
- bundleUrl = bundleNameToUrl(enhanceWithEntry.bundleName, content["sap.app"]["id"]);
106
- }
107
- if (bundleUrl) {
108
- addI18nInfo(bundleUrl);
109
- }
110
- });
111
- }
112
- }
113
-
114
- return Promise.all(resources.map((resource) =>
115
- resource.getBuffer().then((content) => {
116
- const basename = posixPath.basename(resource.getPath());
117
- return {
118
- name: basename,
119
- isManifest: basename === descriptor,
120
- path: resource.getPath(),
121
- content: content
122
- };
123
- })
124
- )).then((resources) => {
125
- const archiveContent = new Map();
126
- const descriptorI18nInfos = new Map();
127
- const i18nResourceList = new I18nResourceList();
128
-
129
- resources.forEach((resource) => {
130
- if (resource.isManifest) {
131
- addDescriptorI18nInfos(descriptorI18nInfos, resource);
132
- archiveContent.set(resource.path, resource.content);
133
- } else {
134
- const directory = posixPath.dirname(resource.path);
135
- i18nResourceList.add(directory, resource);
136
- }
137
- });
138
-
139
- descriptorI18nInfos.forEach((rootName, directory) => {
140
- const i18nResources = i18nResourceList.get(directory)
141
- .filter((resource) => resource.name.startsWith(rootName));
142
-
143
- if (i18nResources.length) {
144
- i18nResources.forEach((resource) => archiveContent.set(resource.path, resource.content));
145
- } else {
146
- log.warn(`Could not find any resources for i18n bundle '${directory}'`);
147
- }
148
- });
149
-
150
- return archiveContent;
151
- }).then((archiveContent) => new Promise((resolve) => {
152
- const zip = new yazl.ZipFile();
153
- const basePath = `/resources/${namespace}/`;
154
- archiveContent.forEach((content, path) => {
155
- if (!path.startsWith(basePath)) {
156
- log.verbose(`Not bundling resource with path ${path} since it is not based on path ${basePath}`);
157
- return;
158
- }
159
- // Remove base path. Absolute paths are not allowed in ZIP files
160
- const normalizedPath = path.replace(basePath, "");
161
- zip.addBuffer(content, normalizedPath);
162
- });
163
- zip.end();
164
-
165
- const pathPrefix = "/resources/" + namespace + "/";
166
- const res = resourceFactory.createResource({
167
- path: pathPrefix + bundleName,
168
- stream: zip.outputStream
169
- });
170
- resolve([res]);
171
- }));
172
- };
@@ -1,49 +0,0 @@
1
- const log = require("@ui5/logger").getLogger("builder:tasks:bundlers:generateManifestBundle");
2
- const manifestBundler = require("../../processors/bundlers/manifestBundler");
3
- const DESCRIPTOR = "manifest.json";
4
- const PROPERTIES_EXT = ".properties";
5
- const BUNDLE_NAME = "manifest-bundle.zip";
6
-
7
- /* eslint "jsdoc/check-param-names": ["error", {"disableExtraPropertyReporting":true}] */
8
- /**
9
- * Task for manifestBundler.
10
- *
11
- * @public
12
- * @alias module:@ui5/builder.tasks.generateManifestBundle
13
- * @param {object} parameters Parameters
14
- * @param {module:@ui5/fs.DuplexCollection} parameters.workspace DuplexCollection to read and write files
15
- * @param {object} parameters.options Options
16
- * @param {string} parameters.options.projectName Project name
17
- * @param {string} parameters.options.projectNamespace Project namespace
18
- * @returns {Promise<undefined>} Promise resolving with <code>undefined</code> once data has been written
19
- */
20
- module.exports = async function({workspace, options = {}}) {
21
- const {projectName} = options;
22
- // Backward compatibility: "namespace" option got renamed to "projectNamespace"
23
- const namespace = options.projectNamespace || options.namespace;
24
-
25
- if (!projectName || !namespace) {
26
- throw new Error("[generateManifestBundle]: One or more mandatory options not provided");
27
- }
28
-
29
- const allResources = await workspace.byGlob(`/resources/${namespace}/**/{${DESCRIPTOR},*${PROPERTIES_EXT}}`);
30
- if (allResources.length === 0) {
31
- log.verbose(`Could not find a "${DESCRIPTOR}" file for project ${projectName}, ` +
32
- `creation of "${BUNDLE_NAME}" is skipped!`);
33
- return;
34
- }
35
-
36
- const processedResources = await manifestBundler({
37
- resources: allResources,
38
- options: {
39
- descriptor: DESCRIPTOR,
40
- propertiesExtension: PROPERTIES_EXT,
41
- bundleName: BUNDLE_NAME,
42
- namespace
43
- }
44
- });
45
-
46
- await Promise.all(processedResources.map((resource) => {
47
- return workspace.write(resource);
48
- }));
49
- };