From 97f80fc80d33b39e83506b3ee0423573c2287dd7 Mon Sep 17 00:00:00 2001 From: d023269 Date: Tue, 15 Oct 2024 14:27:38 +0200 Subject: [PATCH 1/2] feat(ui-task-zipper): new option additionalDirectories --- packages/ui5-task-zipper/lib/zipper.js | 15 +++++++++---- .../ui5-app/ui5.additionalDirectories.yaml | 21 +++++++++++++++++++ packages/ui5-task-zipper/test/zipper.test.js | 19 ++++++++++++++++- showcases/ui5-app/webapp/testDir/README.md | 19 +++++++++++++++++ .../webapp/testDir/subFolder/testFile.js | 0 5 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 packages/ui5-task-zipper/test/__assets__/ui5-app/ui5.additionalDirectories.yaml create mode 100644 showcases/ui5-app/webapp/testDir/README.md create mode 100644 showcases/ui5-app/webapp/testDir/subFolder/testFile.js diff --git a/packages/ui5-task-zipper/lib/zipper.js b/packages/ui5-task-zipper/lib/zipper.js index 1acb3aa4e..dc1713a39 100644 --- a/packages/ui5-task-zipper/lib/zipper.js +++ b/packages/ui5-task-zipper/lib/zipper.js @@ -53,6 +53,7 @@ const absoluteToRelativePaths = (buffer, zip) => { * @param {object} [parameters.options.configuration] Task configuration if given in ui5.yaml * @param {string} [parameters.options.configuration.archiveName] ZIP archive name (defaults to project namespace) * @param {string} [parameters.options.configuration.additionalFiles] List of additional files to be included + * @param {string} [parameters.options.configuration.additionalDirectories] List of additional directories to be included * @param {object} parameters.taskUtil the task utilities * @returns {Promise} Promise resolving with undefined once data has been written */ @@ -81,9 +82,9 @@ module.exports = async function ({ log, workspace, dependencies, options, taskUt : dependencies._readers.filter((reader) => { const projectName = determineProjectName(reader); return includeDependencies.indexOf(projectName) !== -1; - }), + }), name: "Filtered reader collection of ui5-task-zipper", - }); + }); // retrieve the resource path prefix (to get all application resources) const prefixPath = `/resources/${options.projectNamespace}/`; @@ -93,7 +94,12 @@ module.exports = async function ({ log, workspace, dependencies, options, taskUt try { const wsResources = await workspace.byGlob(`/resources/**`); const depResources = await deps.byGlob(`**`); - allResources = [...wsResources, ...depResources]; + let additionalDirResources = []; + const additionalDirectories = options?.configuration?.additionalDirectories ?? []; + for (let dir of additionalDirectories) { + additionalDirResources = [...additionalDirResources, ...(await deps.byGlob(`${dir}/**`, { nodir: false }))]; + } + allResources = [...wsResources, ...depResources, ...additionalDirResources]; } catch (e) { log.error(`Couldn't read resources: ${e}`); } @@ -126,7 +132,7 @@ module.exports = async function ({ log, workspace, dependencies, options, taskUt } else { log.warn(`Duplicate resource path found: ${resourcePath}! Skipping...`); } - }) + }), ); // include the additional files from the project const additionalFiles = options?.configuration?.additionalFiles; @@ -139,6 +145,7 @@ module.exports = async function ({ log, workspace, dependencies, options, taskUt for (const [filePathSource, filePathTarget] of Object.entries(additionalFiles)) { isDebug && log.info(`Adding ${filePathSource} to archive at path ${filePathTarget}.`); zip.addFile(path.join(process.cwd(), filePathSource), filePathTarget || filePathSource); + zip.ad; } } } catch (e) { diff --git a/packages/ui5-task-zipper/test/__assets__/ui5-app/ui5.additionalDirectories.yaml b/packages/ui5-task-zipper/test/__assets__/ui5-app/ui5.additionalDirectories.yaml new file mode 100644 index 000000000..784ffd324 --- /dev/null +++ b/packages/ui5-task-zipper/test/__assets__/ui5-app/ui5.additionalDirectories.yaml @@ -0,0 +1,21 @@ +specVersion: "3.0" +metadata: + name: ui5-app +type: application +framework: + name: OpenUI5 + version: "1.129.0" + libraries: + - name: sap.m + - name: sap.ui.core + - name: sap.ui.layout + - name: themelib_sap_horizon +builder: + customTasks: + - name: ui5-task-zipper + afterTask: generateVersionInfo + configuration: + debug: true + archiveName: "customZipName" + additionalDirectories: + - testDir diff --git a/packages/ui5-task-zipper/test/zipper.test.js b/packages/ui5-task-zipper/test/zipper.test.js index d029faf16..07d54bff5 100644 --- a/packages/ui5-task-zipper/test/zipper.test.js +++ b/packages/ui5-task-zipper/test/zipper.test.js @@ -1,7 +1,7 @@ const path = require("path"); const { rmSync, existsSync, readdirSync } = require("fs"); const { spawnSync } = require("child_process"); -const crypto = require("crypto"); +// const crypto = require("crypto"); const yauzl = require("yauzl"); const test = require("ava"); @@ -68,6 +68,23 @@ test.afterEach.always(async (t) => { rmSync(t.context.tmpDir, { recursive: true, force: true }); }); +test("archive creation w/ additional directories", async (t) => { + const ui5 = { yaml: path.resolve("./test/__assets__/ui5-app/ui5.additionalDirectories.yaml") }; + spawnSync(`ui5 build --config ${ui5.yaml} --dest ${t.context.tmpDir}/dist`, { + stdio: "inherit", // > don't include stdout in test output, + shell: true, + cwd: path.resolve(__dirname, "../../../showcases/ui5-app"), + }); + // default options packs to $app-id.zip + const targetZip = path.resolve(t.context.tmpDir, "dist", "customZipName.zip"); + t.true(existsSync(targetZip)); + const allDepsFound = await Promise.all([ + promisifiedNeedleInHaystack(targetZip, "testDir/README.md"), + promisifiedNeedleInHaystack(targetZip, "testDir/subFolder/testFile.js") + ]); + t.true(allDepsFound.every((dep) => dep === true)); +}); + test("archive creation w/ additional files", async (t) => { const ui5 = { yaml: path.resolve("./test/__assets__/ui5-app/ui5.additionalFiles.yaml") }; spawnSync(`ui5 build --config ${ui5.yaml} --dest ${t.context.tmpDir}/dist`, { diff --git a/showcases/ui5-app/webapp/testDir/README.md b/showcases/ui5-app/webapp/testDir/README.md new file mode 100644 index 000000000..afaf3ce8b --- /dev/null +++ b/showcases/ui5-app/webapp/testDir/README.md @@ -0,0 +1,19 @@ +# Additional Directories in Zip File + +This is a sample folder that should be copied with all content into the zip +file using builder task `ui5-task-zipper` using the configuration property +`additionalDirectories` + +Below is an example configuration: + +```yaml +builder: + customTasks: + - name: ui5-task-zipper + afterTask: generateVersionInfo + configuration: + debug: true + archiveName: "customZipName" + additionalDirectories: + - testDir +``` \ No newline at end of file diff --git a/showcases/ui5-app/webapp/testDir/subFolder/testFile.js b/showcases/ui5-app/webapp/testDir/subFolder/testFile.js new file mode 100644 index 000000000..e69de29bb From 16054e604ca1a2db80931539b800a2efe4e82e7c Mon Sep 17 00:00:00 2001 From: d023269 Date: Tue, 15 Oct 2024 18:10:29 +0200 Subject: [PATCH 2/2] fix(ui5-task-zipper): the folder must not be part of webapp --- showcases/ui5-app/{webapp => }/testDir/README.md | 0 showcases/ui5-app/{webapp => }/testDir/subFolder/testFile.js | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename showcases/ui5-app/{webapp => }/testDir/README.md (100%) rename showcases/ui5-app/{webapp => }/testDir/subFolder/testFile.js (100%) diff --git a/showcases/ui5-app/webapp/testDir/README.md b/showcases/ui5-app/testDir/README.md similarity index 100% rename from showcases/ui5-app/webapp/testDir/README.md rename to showcases/ui5-app/testDir/README.md diff --git a/showcases/ui5-app/webapp/testDir/subFolder/testFile.js b/showcases/ui5-app/testDir/subFolder/testFile.js similarity index 100% rename from showcases/ui5-app/webapp/testDir/subFolder/testFile.js rename to showcases/ui5-app/testDir/subFolder/testFile.js