From d3fe797cdc2f3ff6864826e7dcd62810a5ad7d88 Mon Sep 17 00:00:00 2001 From: Omkar Phansopkar Date: Mon, 25 Dec 2023 13:30:08 +0530 Subject: [PATCH 1/8] Fixed #622 - Include meta data files in packaged application Signed-off-by: Omkar Phansopkar --- AUTHORS.rst | 20 ++++ CONTRIBUTING.rst | 93 ++++++++++++++++++ Release.md | 5 + SCANCODE_WORKBENCH_VERSION | 1 + archive_builder.py | 11 ++- attribution.html | 5 - forge.config.js | 29 ++++++ package-lock.json | 12 +-- package.json | 31 +----- packager.js | 36 ++++++- src/assets/images/AddFiles.png | Bin 195713 -> 0 bytes src/assets/images/Addfiles.png.ABOUT | 8 -- .../ImportFallback/ImportFallback.tsx | 27 +++-- .../ImportFallback/importFallback.css | 23 ++--- .../CustomCellRenderers/ListCellRenderer.tsx | 2 +- src/pages/TableView/columnDefs.ts | 6 +- webpack.rules.js | 1 - workbench.ABOUT | 11 ++- 18 files changed, 225 insertions(+), 96 deletions(-) create mode 100644 AUTHORS.rst create mode 100644 CONTRIBUTING.rst create mode 100644 SCANCODE_WORKBENCH_VERSION create mode 100644 forge.config.js delete mode 100644 src/assets/images/AddFiles.png delete mode 100644 src/assets/images/Addfiles.png.ABOUT diff --git a/AUTHORS.rst b/AUTHORS.rst new file mode 100644 index 00000000..9e4c2c63 --- /dev/null +++ b/AUTHORS.rst @@ -0,0 +1,20 @@ +The following organizations or individuals have contributed to ScanCode Workbench: + +- @Aayush-hub => Aayush Garg +- @AyanSinhaMahapatra => Ayan Sinha Mahapatra +- @camillem => camillem +- @chinyeungli => Chin Yeung +- @dependabot[bot] => null +- @dotarjun => Arjun +- @jdaguil => Jillian Daguil +- @johnmhoran => John M. Horan +- @kopal960 => Kopal Rustagi +- @lakshay-angrish => null +- @OmkarPh => Omkar Phansopkar +- @pombredanne => Philippe Ombredanne +- @pranav1698 => Pranav Kulshrestha +- @Pushpit07 => Pushpit +- @RituRajSingh878 => Ritu Raj Singh +- @steven-esser => Steven Esser +- @Vishal-raj-1 => Vishal Rajput +- @vsvipul => Vipul diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst new file mode 100644 index 00000000..bccf45cc --- /dev/null +++ b/CONTRIBUTING.rst @@ -0,0 +1,93 @@ +============ +Contributing +============ + +Contributions are welcome and appreciated! +Every little bit helps, and a credit will always be given. + +.. _issues : https://github.com/nexB/scancode-workbench/issues +__ issues_ + +If you are new to ScanCode Workbench and want to find easy tickets to work on, +check `easy issues `_ + +When contributing to ScanCode Workbench (such as code, bugs, documentation, etc.) you +agree to the Developer `Certificate of Origin `_ +and the ScanCode license (see the `NOTICE `_ file). +The same approach is used by Linux Kernel developers and several other projects. + +For commits, it is best to simply add a line like this to your commit message, +with your name and email:: + + Signed-off-by: Jane Doe + +Please try to write a good commit message, see `good commit message wiki +`_ for +details. In particular use the imperative for your commit subject: think that +you are giving an order to the codebase to update itself. + + +Feature requests and feedback +============================= + +To send feedback or ask a question, `file an issue `_ + +If you are proposing a feature: + +* Explain how it would work. +* Keep the scope as simple as possible to make it easier to implement. +* Remember that your contributions are welcomed to implement this feature! + + +Chat with other developers +========================== + +For other questions, discussions, and chats, we have: + +- an official Gitter channel at https://gitter.im/aboutcode-org/discuss + Gitter also has an IRC bridge at https://irc.gitter.im/ + This is the main place where we chat and meet. + +- a Gitter channel to discuss Documentation at https://gitter.im/aboutcode-org/gsod-season-of-docs + +Bug reports +=========== + +When `reporting a bug`__ please include: + +* Your operating system name, version, and architecture. +* Your ScanCode Workbench version. +* Any additional details about your local setup that might be helpful to + diagnose this bug. +* Detailed steps to reproduce the bug, such as the scan file you imported, filters you applied, etc. +* The error messages or failure trace if any. +* If helpful, you can add a screenshot as an issue attachment when relevant or + some extra file as a link to a `Gist `_. + + +Documentation improvements +========================== + +Documentation can come in the form of new documentation pages/sections, tutorials/how-to documents, +any other general upgrades, etc. Even a minor typo fix is welcomed. + +If something is missing in the documentation or if you found some part confusing, +please file an issue with your suggestions for improvement. Your help and contribution make ScanCode Workbench docs better, we love hearing from you! + +The ScanCode Workbench documentation is hosted at `scancode-workbench.readthedocs.io `_. + +If you want to contribute to Scancode Workbench Documentation, you'll find `this guide here `_ helpful. + + +Pull Request Guidelines +----------------------- + +If you need a code review or feedback while you are developing the code just +create a pull request. You can add new commits to your branch as needed. + +For merging, your request would need to: + +1. Include unit tests that are passing (run ``npm test``). +2. Update documentation as needed for new UI screen, functionality, etc. +3. Add a note to ``CHANGELOG.rst`` about the changes. +4. Add your name to ``AUTHORS.rst``. diff --git a/Release.md b/Release.md index f0d90daf..2cceba72 100644 --- a/Release.md +++ b/Release.md @@ -41,3 +41,8 @@ This v4.0.0 of ScanCode Workbench is compatible with scans from any [ScanCode To - Automatic height for tables https://github.com/nexB/scancode-workbench/pull/606 - Fixed Empty directory being shown with file icon https://github.com/nexB/scancode-workbench/pull/604 - Fix irregular scroll behavior for files in deeply nested FileTree https://github.com/nexB/scancode-workbench/pull/599 + +## Framework + +- Electorn [v28.1.0](https://releases.electronjs.org/release/v28.1.0) +- Chromium [v120.0.6099.109](https://source.chromium.org/chromium/chromium/src/+/refs/tags/120.0.6099.109:) diff --git a/SCANCODE_WORKBENCH_VERSION b/SCANCODE_WORKBENCH_VERSION new file mode 100644 index 00000000..cc868b62 --- /dev/null +++ b/SCANCODE_WORKBENCH_VERSION @@ -0,0 +1 @@ +4.0.1 \ No newline at end of file diff --git a/archive_builder.py b/archive_builder.py index f43dc952..0ef29193 100755 --- a/archive_builder.py +++ b/archive_builder.py @@ -20,7 +20,7 @@ APP_NAME = 'ScanCode-Workbench' APP_BUNDLE_ID = 'com.nexb.scancode-workbench' ARCHIVE_DIR = 'dist' -PACKAGE_DIR = 'out' # @NOTE - PACKAGE_DIR must be same as 'out' property in packager.js +OUT_DIR = 'out' # @NOTE - OUT_DIR must be same as 'out' property in packager.js # Get scancode workbench version from package.json with open('package.json') as json_file: @@ -51,24 +51,25 @@ raise Exception('Unsupported OS/platform %r' % SYSTEM_PLATFORM) # Prepare file name for archive using platform, architecture & app version -archive_file_name = '-'.join([APP_NAME, PLATFORM_NAME, ARCH, APP_VERSION]) +archive_file_name = '-'.join([APP_NAME, APP_VERSION, PLATFORM_NAME, ARCH]) +PACKAGE_DIR_NAME = '-'.join([APP_NAME, APP_VERSION, PLATFORM, ARCH]) print(f"Composed Archive file name: '{archive_file_name}'") # Ensure archive directory dist/ is created, before attempting to store archive inside it ensure_archive_directory = f"mkdir -p {ARCHIVE_DIR}" -print("Executing mkdir command:", ensure_archive_directory) +print("Ensure `dist/` directory exists using:", ensure_archive_directory) os.system(ensure_archive_directory) # Prepare .zip file for windows if on_windows: - zip_command = f"powershell Compress-Archive {PACKAGE_DIR}/* {ARCHIVE_DIR}/{archive_file_name}.zip" + zip_command = f"powershell Compress-Archive {OUT_DIR}/{PACKAGE_DIR_NAME} {ARCHIVE_DIR}/{archive_file_name}.zip" print("Executing zip command on powershell:", zip_command) os.system(zip_command) print(f"Zip file ready: {ARCHIVE_DIR}/{archive_file_name}.zip") # Prepare .tar.gz file for mac & linux else: - tar_command = f"tar -czf {ARCHIVE_DIR}/{archive_file_name}.tar.gz -C {PACKAGE_DIR} ." + tar_command = f"tar -czf {ARCHIVE_DIR}/{archive_file_name}.tar.gz -C {OUT_DIR} {PACKAGE_DIR_NAME}" print("Executing tar command:", tar_command) os.system(tar_command) print(f"Tar file ready: {ARCHIVE_DIR}/{archive_file_name}.tar.gz") diff --git a/attribution.html b/attribution.html index 52984f64..9220827b 100644 --- a/attribution.html +++ b/attribution.html @@ -97,11 +97,6 @@

About ScanCode Workbench 4.0.0:

- -

ScanCode Workbench contains the following image assets:

- Import file illustration - - Work illustrations by Storyset -

diff --git a/forge.config.js b/forge.config.js new file mode 100644 index 00000000..a648c237 --- /dev/null +++ b/forge.config.js @@ -0,0 +1,29 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +const { version } = require("./package.json"); + +const APP_NAME_WITH_VERSION = `ScanCode-Workbench-${version}`; + +module.exports = { + packagerConfig: { + name: APP_NAME_WITH_VERSION, + icon: "src/assets/app-icon/icon", + }, + plugins: [ + { + name: "@electron-forge/plugin-webpack", + config: { + mainConfig: "./webpack.main.config.js", + renderer: { + config: "./webpack.renderer.config.js", + entryPoints: [ + { + html: "./src/index.html", + js: "./src/renderer.ts", + name: "main_window", + }, + ], + }, + }, + }, + ], +}; diff --git a/package-lock.json b/package-lock.json index bd1e63b5..3c60a82f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "scancode-workbench", - "version": "4.0.0", + "version": "4.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "scancode-workbench", - "version": "4.0.0", + "version": "4.0.1", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -69,7 +69,7 @@ "@typescript-eslint/parser": "^6.9.1", "@vercel/webpack-asset-relocator-loader": "^1.7.3", "css-loader": "^6.8.1", - "electron": "^27.0.3", + "electron": "^28.1.0", "electron-builder": "^24.6.4", "electron-packager": "^17.1.2", "eslint": "^8.53.0", @@ -8564,9 +8564,9 @@ } }, "node_modules/electron": { - "version": "27.0.3", - "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.3.tgz", - "integrity": "sha512-VaB9cI1se+mUtz366NP+zxFVnkHLbCBNO4wwouw3FuGyX/m7/Bv1I89JhWOBv78tC+n11ZYMrVD23Jf6EZgVcg==", + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-28.1.0.tgz", + "integrity": "sha512-82Y7o4PSWPn1o/aVwYPsgmBw6Gyf2lVHpaBu3Ef8LrLWXxytg7ZRZr/RtDqEMOzQp3+mcuy3huH84MyjdmP50Q==", "dev": true, "hasInstallScript": true, "dependencies": { diff --git a/package.json b/package.json index 93b69267..dab8c40b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "scancode-workbench", "productName": "scancode-workbench", - "version": "4.0.0", + "version": "4.0.1", "description": "An application for viewing ScanCode results and concluding component origin and license", "repository": { "type": "git", @@ -48,7 +48,7 @@ "@typescript-eslint/parser": "^6.9.1", "@vercel/webpack-asset-relocator-loader": "^1.7.3", "css-loader": "^6.8.1", - "electron": "^27.0.3", + "electron": "^28.1.0", "electron-builder": "^24.6.4", "electron-packager": "^17.1.2", "eslint": "^8.53.0", @@ -57,8 +57,8 @@ "fork-ts-checker-webpack-plugin": "^9.0.2", "husky": "^8.0.3", "jest": "^29.7.0", - "node-loader": "^2.0.0", "jest-environment-jsdom": "^29.7.0", + "node-loader": "^2.0.0", "style-loader": "^3.3.3", "ts-jest": "^29.1.1", "ts-loader": "^9.5.0", @@ -109,29 +109,6 @@ "d3-color": "3.1.0" }, "config": { - "forge": { - "packagerConfig": { - "name": "ScanCode Workbench", - "icon": "src/assets/app-icon/icon" - }, - "plugins": [ - { - "name": "@electron-forge/plugin-webpack", - "config": { - "mainConfig": "./webpack.main.config.js", - "renderer": { - "config": "./webpack.renderer.config.js", - "entryPoints": [ - { - "html": "./src/index.html", - "js": "./src/renderer.ts", - "name": "main_window" - } - ] - } - } - } - ] - } + "forge": "./forge.config.js" } } diff --git a/packager.js b/packager.js index 8a13534c..1ec8a289 100644 --- a/packager.js +++ b/packager.js @@ -1,5 +1,20 @@ /* eslint-disable @typescript-eslint/no-var-requires */ +const fs = require("fs"); const packager = require("electron-packager"); +const { packagerConfig } = require("./forge.config.js"); + +const MetaDataFiles = [ + "apache-2.0.LICENSE", + "AUTHORS.rst", + "CHANGELOG.rst", + "CODE_OF_CONDUCT.rst", + "CONTRIBUTING.rst", + "NOTICE", + "package-lock.json", + "README.md", + "SCANCODE_WORKBENCH_VERSION", + "workbench.ABOUT", +]; const ignoreDir = [ "src", @@ -9,8 +24,12 @@ const ignoreDir = [ ".github", "docs", "test-db", + ".husky", + "coverage", + "tests", "", // Required as the last element !! ].join("*|"); + const ignoreFilesOrExtensions = [ "rst", "py", @@ -18,14 +37,19 @@ const ignoreFilesOrExtensions = [ "txt", "enc", ".test.ts", - "ABOUT", + ".config.js", + ".plugins.js", + ".rules.js", + ".toml", + "workbench.ABOUT", "LICENSE", "NOTICE", ".gitignore", ".eslintrc.json", - "package-lock.json", + "packager.js", "electron-builder.json", "tsconfig.json", + ...MetaDataFiles, ].join("|"); packager({ @@ -34,7 +58,7 @@ packager({ overwrite: true, icon: "src/assets/app-icon/icon", prune: true, - name: "ScanCode-Workbench", + name: packagerConfig.name, ignore: new RegExp(`(${ignoreDir}^.*.(${ignoreFilesOrExtensions})$)`), // osxSign: true, // osxSign: { @@ -48,4 +72,10 @@ packager({ // appleId: 'felix@felix.fun', // appleIdPassword: 'my-apple-id-password' // }, +}).then((packagePath) => { + // Copy the metadata files to package directory + MetaDataFiles.forEach((file) => + fs.copyFileSync(file, `${packagePath}/${file}`) + ); + console.log(`Packaged app at ${packagePath}`); }); diff --git a/src/assets/images/AddFiles.png b/src/assets/images/AddFiles.png deleted file mode 100644 index dac68c1f199895f8569ff985acda35e4d89948b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195713 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

@(V4y6G>Y6?4Y)poRq`fGmcjWfGW3|=5kD? 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 1F`^$ZJwEd5BV~nJRgeo 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%0DguypuEuJ9*1s?yTZa`s*4 zpeEc9XdZLP>c^Qd$d}1PJ5{+Q#JRv{N{@uGn9{-G?io>qifoIF5sow@W$0XKcvJ^A zmEOQ%_hFX)h^d-8H}Om)a-cLTvJ+aUgJmkwr5lN!5MipDvAAK3J9>TYx0Ihm$TKJ( z-`g&E7ZK~J^Ra+O@{jR)v!Ol)u3W^dk4RjcBexdooIpmIUJ|vaHs92)JuE$FQJI@k z^g~RZa|(}zf$zDd(C(#A5ScPptY_7({$liPOC6a4w<0+F84FXtfv#=_!X42z`)N05 zDSF2>DVB^T(mx2_TZi+y4+yO_`fxeXv-M}6Yud+)c(n1p>Oj(*(08~f!nHwR0=nG2JZOlE<%^Pg)8fYywWVJ`EGG|oj@VScTxf<}o6LmhM(Hm&* zJ{*^*sG0#3V~Zj;xbsuY8GrDnFUg2_Boa6aIf;QMnhrQ+p>AW>S8Map!e50Y$HZoe zy<1;Iy>d{fXe~_`VIgkeg>^(e`7n%3MRh1_TP7o6cEW=!fh{=?ChA3 zy>|TWp~s(55~!KAi91|BfmAWZE7?|I4)x%EE&GfLA(|v#!%rf3?3i#p^!5!6GXg!R zu5O%CX;j1MG!tk(_{IU#=X$LI{J?xdxi}Whk>$e(7-;cf+-!{&9xCgm>5s4W?)O$c zNu~Fx`&&mix|~f@(x|i8Zl20QSY#VwcWm8R?NP2!jk--J9jvsq*LQoD+6akt)rCby zw)wRRqx(LoO9;6&5;ZGr5B72-v6M{~m{}-`SC%P>CllmGnhnSO2r-i|LceBC_8PHR zT{jAUMuMdewHtVqSgAX_i%rT~{KB`$HQDj*Kzr-@i$lX9U=Zi|%jPRQG)_mo@Jhzi zxP_GEr)1;<2lY9k;<;0u3Q})RtChs5F+;CfaG+8jMHSN-#fT)BmU@qu^5$ApC^NjW z+l*9z^GL`3qIdw6D#^PwWKjkwJyMYf6+wB5!g-URFu}k9w!1NH^?7Kz(uCn2h3)b| zCg(H=yC@{EkIApMha<4@OombY>!J*cvu~9MdgR6(d?leZPn~Q{@?~Gu;TI-(*@uhq z`+C_9_)i&SzvA->#e49lkPyZ>Xw(fk56`#y6kf?|6$rFM5ZV;gWctPhouxr9srwkPHz2Mrnn7zkj0)Pq$RB}&x*E>ETUZv_{ut`B08+8*|nE5c|Tyjn&lrWOpj z8ziyKh}N&GIiLjdTr0X7D|_MP5jk0(KX-XRQo9xjn5UvHYOA&O^&E5zc=kj{(8p6C zF_k)Tm8d)s%zov}tk0jEdk6s)-X7ENwzw4XgJcq$@4iIG3`Pf)hxW|yleJv@)YWNo z>tm(B+q)3E>-lwBRH^VcSD8M32nrIZ655@lw6jL}a_w|u5tA{5*ePxJ=jEhpoZlg? zpA{+=^DPh1%kmplzU`&zz9&lVjEDKihO*?iFOHNIZDC+}DkrNxXW6j4Xrq=OV?H!; z8Qt;gm)56pPFo+=SypS}qhEd8e;kMI>FIIW=IV9wFp`TilpoI$V^U3{bjwRI@HS}W ziE(x{X%+quBhpAcu;g_IzOBnm^p8!d{3xkis7ST;OP+!pbA^a-6j$u`GLW{uq0yXa zBg$O6e>-7vOnW)zL_mYXWn@*d!iMa4P43Wn4Wm7uz|yH(FzcRLQ|ttxr#Rq&I zMIU!+>#|$AEUrD$)K{rFkM$p#;EYK8!6(gy{FonXH+fr%!uH)I*$|D$$Vd&j{G6LI zNX>P~0w+XOo2ee7#x|AUO8j1bxw9bBwFe^+$7NFQvfb+e+MM72=jFY64WG2?tlFlS zL6+}ME?ui-b?q640R|Ntx8q&?1~&>_BG%f;)0zk8$T8#3-uC8?^gr{C><)?9PTsQOQEH#ax< zne&1vnoZA0hHv2iILsB?G?@`U;$t{6o79r>75-i&pw%#8!s+^5iEVk3Iz@h48p^hk zFbP}8j5G>M0K^Ox_EEB}SXN^|#bL_kew8`6C66<$tiK5>-CLa`uBo-g$bGq5hHu?i z_tsN}p6_GYyC}HGAoC>>bAmC@ThE35>JFCrWfz0le&^}MR#VwchU;%DA9V6qZzFOc zS~DMAw<|P;umz%BaRtf>LiT$(vaqvVfw$QL(~+)%0`MR@BoHEyvwG{LyZZ~xXsq)q zCBbv1cp(N70#)cV9xDt$!ct? zW^O%GG12lI+AIZ1lbZ8@xkBsVn93)*RRfQHORKAv!V^EKA}Od5itbF_Q;TzPatsWj z>1wPk42N{7=S>pjO62Mp_{|6-fDx*x5L@G-Thpi&(F4d2)HXx)CFmUiaS?sk*ctKm|n<8dM1B=Qo_kwzEbo_x|+Zehpd{_!juLz=LldIox@$wHN(20cBoVp zVdBbKA2lU5tczgi?^|NSPugBqn}G#1($k8N1^8}`I#8d>l+Gp8)KHVxG>4y*<-S^b zH&;t+H!wiSy?a&E@8PRb<0avom%>rTQ-)I90kaTN^D95hrH1)Rc0fb=g+Ov99M~Tb)=l7$i}O|F`f>3g27VU7x9a3O0^( zSz^O$q6=dCmtk+#<-RhA-_3HncwNM#{Y=qEq5b`7myi6F3(tq$3vpGO=H3ZUPpK@K z&)znPP&(V>8Id@ZC>=4(RzM#-Yg@m8N*x?%pNco@GEsMTcULzzPnBrf`zoJWfTJ#d z4q(M7mQd7!q_>>2VWgkmO;1n1Ni;JI_IB)UEWZFtk08wvfodnmd@nH^$eSp&ZF?~M zbfziy*rUJd)PLyha!^sdGbigWfmV|%bi1o`)3K=`{kwBMG-hOkMkSk0e$LF;_M~)Z zddLQAx2svOwT_pwZ4q0vI-9Z@>E4E+^7^+GC6}fON*KFsmqLjNTlhTu3eW%`@P()d;|OMv)DW(4zDx(vU**jRGwR z{`r)|0$v9831D5VCu>dDnm^6(xrFQ0aA?5%bdU*>w+G(X3y~6cavbnQK*{RnGcxlg zl235S+p*o#Q8nQzvx_gCY0dp8w6PdUg_%Uh$sS}qJJV5gJoXf|Wz^OMbNd%OQ-+~R z6xU{T_vJ(@=?C~4Yma-JR=AaX2ROE@E|>c~!SyIj0fjpJJiI5t_{R+VGWTU(S`in^ zZ1332C{l;K6hrQJGu&PjKCPwex7hZ^QTYb8)*~QC^fz!j3GK_)sOR1NyxZ6L3n)g4 zDtDw^yCn@?N0p}6>ICoxHbXBq?LlBFLAh*@vtEl4l7bFllAI3Ly|)~{ZmmuX1TUTs z04(P~c(Za*m<|{_mjLr=NzvB`YdoUmytMJGVMAq`e~R0DNVn-kF4InNvu9kfA*Xp% zWW*3>WhCTX0jxN8*|YrEpO)_rC4Z>t^Q+M@Mydy{DAI0}*NEKq#Ug5bxHk)^(ln|K zm_YhnH)Pw4oi~xDToz)xy$17>c0Ore6$pif|VcL}E2t z)np(d^;6_&JH2`FI!?^s8ps%?h$lmIUp=A}6tKnkd$)7g+1Su>GB_p>Bzg18-&qpI zrUVrPv23ryvykf_U!498f4DUJ(b0Fe=ATPeD2QX4on^j7g&Ke41I-O#+~E6ymXnYI@OBu@Zzn(m5e@*how3L(%zwSt2w8!608dcBul3y+um4 zQsKXQj1)Salaroqd0SgM#<#WPGJ7cHCw+| zA$DWIKQc3>KBfmDxM0Dz6XHLI6OvUoYoAMnO5M8kHSGI$wHfm|^ev$cwF!~!8??$h z(2ic;Jwu6qnp8ie45MiPU71_v!T#cMH>L8P_=HHg_xN}ky?QvosuT4bE&d$Q?B@CT z+I!y7Ua_sE!wm6LuD3DZCcQ%!2qbiv1+MDa!tu?mx4Hhi#@ta1Pm)W^%488n-9h1t zs-R~yf>go6U?Vh|XY;Me8MSKjcVnv$JYuSCA3 zYU>MSC%@Y|J7z1%H_7@z69~L-5SFGii3|3cgc`E8=J^PIS7AU-#R6*mX^^%jRlmL@ zYds~rVmhUoI5GKLhI>p%sj0pP<8<3^rhwsJ>_o<|Ioge(?RxCzqalu2xXF@id*^iL zRxv$xV!5k0&on4B;u!f#UNzpFmr4GLYX#3AVjB(YUy-j~y>k8Xsit1SWk?oZOt4Fq zIzDIPT$sa7bkIsXqZeC4vKU*FkgtV-!)7z(*D=S`g=HURy?^kFKNrDzndg>I9aYRr zM)HOTe_x@|%dZSI+9VDh_2=2RC*H-lT|RhdRpL2Pmb>o8Hb;lQbgummk#%nw6QOl+ zqms=`3lBjn1aIFkN4@);?h@^CI8s!2K=6wSgXj)^ZS6@N*=o>I^Zw|US27J5Bwa|P zc28H=oiK+5$|-KxtTTllT2UO{h5g+a$C0t}N!$K>P4Vqbi|zyQy{vxiwo5k(d|uBO zdA}=NoIYrBE9?TA^%;?zU^|p-{>eLF|6otKH+r3R2NiQL;MOafpP#>bia3g&j79}? zi}AmG*731_xtUve5IUZ7Bq&X;TzxWr?d&$|Viw|BD8}WhG(_fK4Ak(lI#FmNqpC4k zDrtA1(|QfQsGAWXA5Ib(6P5AJ&r59k#s=tIha_B|kSl7en6-1_^Ncr)c`|nGyg{+1 zq4YO?+gu|b>W$DRZ%O#x7~L8!b9eC2)QnQv5Dt`tt#qQs$rbjgw!5GC{);*M{Rr1Z zk7;M!%|6HH1>H04b1HN$@|8ZPUP-XD*GFgFI#+=1zPJc1xo!NRJjlDjufv>U_7QBo zb17pzz?QT7VSrST+@6)j8)lmQmN_3FQCL)@98K&kE#f3?VRW=X>jsj8OldLK!%T@}g%TtMP z$|pe=T%ysQnaC+CcUtoU);OW2)?g=FQ(fKjUrXqi_9GPV@;OSnQkU=u&oD^nU*fwD zGN}@k*atk9ip~T~gUCQRxV=VD*CzvwdA*5d_{=Q=HxH4L)O6 zh}X1sw-0=DG_^ISvc)d|&!`d6?2Ke?6m~XuJ~fexle4F3_Uj8iPi3|OT=F6+MT3U2 zJ#;VfwV%kgkOJF*Cxw4nZAigUNdnh7S9XSly7H;Gx}Pb=n-9M?G^oP6KutWjv*?gs zRBn~{ikVddWD8|f+k}&KL2C+~mVL4Zy^IhOG6tS3BxKi?$+(Y|YR5+sj6$G0FrJYY zt*;$!dwRgv3-3l7E((GnRR5Af$9WtPi;}9OyHl@kAa4;qrPRsyCM2%;vf3$#?@MuA zdZ`Ary;s`lv|Irlh8Ew9=9*00b%LJF2_qOgBN@<+{4*y9OZ55k=b&&0evvtMrM4`j z>^ess>!Bz9AEHM}5`ScGY;hj6h+UpxFB@W35i%+EoaZAgX3-x9NLfC4F)SxLOt;F? ztpsvLTSH50Y0Vypn4b~QtnbOkF1>C@4JRtsxV|n%2nL`2uKA7ytP|eV8|Y$js8S1E zkvlMJhnIb zvh^A;g2*p1O(!&9rxIen2cA6wZ)CID#x12tx#Js|6P17Lvb{3 zAQM2`H=uKIc)BHCp)Q0D%PYKWfL6T0m)V*982yi<_!)lugG579>x}*jiX3vC@^uzu zt^8XMEOEf|crvR&UTheBz!_L0YrfYZ?zJH%;_gU`Pnm@WSP`qy{EN=WJ1Y8}!l9z4p8P>ME@4{t ztdOqp+({6GLt~i0$l6&WshQ(0AyP9ZU0UBBgkOB{vwIA8ow!Nui?&9|bq0l~wEKB? zKOS|$G*YAD%R6a!@{YZV_y;=hLB%l&Ts~;K_NWGot6lhU<%wRmDgf`M(bpT8w}pk6 zCMm|1xf_~a8jr&BdE)XJgJqRV&qxuo`bvVz#%n!x^DD29ui;-}28Ygg8V`24z2xx~ zrFZEh;FeoD$~<+w)|q8OQlj2Y1=ke!Z(H~9l@!H~?qw~x-b{_;ZY7$=2)Ld7X;?8X zF+=t(n}s9q#bFRqpUpUm5^9D2y~Z*8KJwz(@{;*W%YF`SoXOFTNB|$76FdIH z-ImWNwZusBf>raz&GwW`)mWYACd5r4>JL`9d8fY-D#!*jT+)xmy6vUqsxuVteB?&T zyFMk074$G+dXuV%+o27VPZz;P$lT*!#EUzpV*+ zF1`1k`ld9MuI#j?=`*#Kq&c$FM6C&hLPPGp>(?h~PLNPke8bO#Y*E2gB8Dm8!ML`d z%1ewfiz@DkAV*{R{9x@g=!D|O`oMr~O@Xye_8%_XLqvkoq#VzBs(HVqy{DxsVunML zbvFBn?v+Eq_b4xeWyvT3aiTn(j_3Jsi!)aB8OCrkQ^-l$H3eTP*>|!-4{EvrsOnmRq zlkcR&o3Qn)1FU^;n2x^;5x6cZf^ALQ<{oiL2sx@&?2sZy4FaOR7wRytm@m6UB(fYj zF2ysXoSmHw_-V>-@2icfaX1Dx7et&hV>^P3fftJUQ|gJqYp#3dDSzPD%Q$#J2a=4R z6ndNa6=-ETk3DBRFo3^nwzh$3@mvP20iKOye6Gw_-_$x!TliNnUqN?2BgG?AwxfoEW*A^dqN_5OD< zyhB)p&yMD%I=@ip{vG3|WQ<>(n$+c`$_i8U=K_ZogSf_*Ko^w$yp@G%_T4Mp*_?~Q zPAOV4q#^)RRuJU=5co6%Ot}1)!upeyR^C=C&2^qUpH*;^&;0D@OI+`Xho6#MI7k4r z1^#kWjf59yX`dg*572dTiRM=BRM@V&q7eR6v$4(isPe#{0-k7{D$EPj;^g3yybJwOD(l|I~g>LW~P>EMvWK9ZF{@a~juPvZ?XRrb^9!r05Mod5Lt z{i1KdR2W~Q`nyp4O3vH`CklVT+52`N;z>{5@I*=mA97C+G*7ZUdFATWmM{nF%Tw|3 zmk~RsDtPUJn(vDqU5)kwV$fq4Yd+d6b6%$N`z&`v zmfdfazo5AI;jFb!AxP{hgrEBSnFQp8FpmXnin-R)K0Ysy#$ToT&GcWl~3 zIQzv*BmQi1p==E+s6cTPCC05ytXA^E`u|9n#od$xE~(wuZYx(0_bHncND{@s4P$CY zhR@EwCBm=6^%tI2Ba>qyn51>rR8THRV97MZ&3I-X5HFb4M)R(A)W^z2NWf-gQAtGp$q75%)dosz_v6W(wbDBrt z`CT{sWfU*!+}N+{N}VHEr-S%rwBkcFe~O%IcoGD~<1e9t%93zr<@}PeGB0KJvz{Al?fr07Ni5C&vkqm-)Q#8Wo6c|G`z%Zi!Mb}QOE6=*J zD1CQ2U`pf4ON}B5=STC>0Ih`%=GryuqBMeVjopYqV>j}gGJpM1&50??biWNse~u(XGlRE^)`Q5)s1&0SSBnu+-<8KcP6t=tV0u6eODK?@>$6W& z^_D2Ys`N9K78WkDAXL#WzIUKwxbh$--W+Xt^c-zDJ@td#!tejBgb(#+$jRDpuU56C z=NosM8Y+c=pJt;`yq&cgoO&6)*|~fa)Q)IU<84VviP8nfX=DEDH**oBEnAhn0=o02 zR|S7$JRJqQFl87vLNUBLGv>Hwi>DEULO86r>f=ZGn0p{OA0Jo5b4)~$85E;zGwFZF zIUPyNhoBeb<6Q-t9G?UUW<@a6<@w~XgmSfDq~C#-X-5dcK~T9ikP+dobW?drfIiIY z6~@UyAaOLpE9ivF_uQEn(%gmD%%jR660={vw0hF7xrIbz3A zm|x$wnDkXPf^_YkXOaZHUd-b6hlE-GLn_SS(@~59&uXK%M1>gp=E0e{)Zu6^zg5=~ zp@*M7f7Vz=LT>;c-`}kQq$&v}AK#Q##_s^J{K&-418x#GROB5mp?1^hm*hst zt_$|TAsc5big}>T#OHqm)Z}nJJ^4G}h7;g@vf%_nW=V;M<%0(gxIx~{ z8A^&5w{~(+i;1<&%eR_mzP;x;>S3``@k*0(DT#^Tu$M3fF<(UT+;6jO0?`iVi;zeO6#R9au1^U>)WK4Hgu|V&H@B-;;MPOjfEt4(fG|23DmAaj&_& z?28|hK5$*N(rZ9l3DAgLqMfSf^XKbvGvMMRzwh@Bd6?I=U=h`{7^k)mNHvon2ZT7?OffGmqY=~8BoCXtlwr~I4FXcX z8^BGbCQDU~96VKb6!f*figuc|hO%n8ySeo=Ja4rYN1SN8uuYZ`(=Dz5)5%gwpxn^j z=?km;;Sbt9*jTcIzBD2Ega5fO=_P^y!!ejdfP}w93HTQ<+!#f1yxD{14EDg;eS^2| z){8vi<6E5XnJ;VK*V6VII;B}yT1rgDDCK_)51)XDjFBv0LZ54H=;8B>D)_aY%B<%F zi7CVPkc*3pY0!DP#H1vK;VQoa4k+%A9~yvh^sb~l;B`4=z{T2OPxNG?+(mnP`w+pZ zcMrq<=r5e{E+h)a{B3t%?X zvbwS(%yI6qsPoUaPge+RpwUk2BW3QnQ;5*>-<{c{{Hq7Z!pOX7KfTM(8)u?fsp{gL%Cv<2TNvEKgRKLBH1ZU>5E#%ZqKrJE7>rsYn(6-0e>Q%6$TS zuTHD>OjL0?E50KxOCIz=if+n?BdJ3onr#*=O-(1*8_OrW+qY-e+9a2kmvsTAq((2C z1f%1>Qh(zm2X91(CP#gN_sbGO?HuOEW>g{&9(cK=m~;7aLSAzmMs?cb%2=_!Q0`af z0#Y2J|JpmaJ5m)l`wDp!8OA3dJhoT4)t84JqBb}sOoXc>TTeUrCpfXGysqjJQM7Rpih_!fFA|eu=C$f6DhmX{XmUwO2 z&lImMnfh3G3eE_BuPu~5pv+5Ik z07o@dwTX;47SMMO@P*AkK0)f{95Z1rq1#U|Ztq+00K%ZR{D!h$b-HBN%BQ2MQ^2{k z`yn>p-n{T1bfZY%Su`M5mnzm)A`{_iYA25J7;tW0a41`a>m{v58^os!^z{K}!r(pk z=rU9*y`-=Aw2eTrIn$5L9LVAk*Bo5>pa`fJ@DPeOjB-h@uO611oIEs$DUMKXUYeZr zW=jgAGgqpMzcUCG?$72MfW_Md>C6u-+IZC!R4hu`@J-9f97o*zi=jr1PKqJ&Tqzw) zTOMGgQGHs-SA9sg2|J@;q3DT?4&+WgY!Nnd>!pRTHq9#BImgl0(XrjkuxMNGPgFl7 zB?NT+mAZu&5IF#BQ%;zE3s32PN321S)sjv+FK;wgD>7F(3iYbqfC_XeMdPX?9vLVkU!YOxu z)sR;1=caXt!Au&ipNlg@N%4MJ-?Bh$j`)qV5=LjU(mSh~b2TL>Kc`+RmDGml(E ze2ZNSvY~j;MQbBIU>%<4EK`ONUbZeb74#L)*+Ufic+X-%m8b=(qX0xoi4Q0z%l z#VDtqfyz=iU%fnPD@!P`khr9y=tZc`fN;+R3}jTMA}vF zea#P_aQmvhN@?k|;L$_9J+Lq4S0-DL*F))*_fov=-~?)C0hO@p*Zu$|)MGv}*t%d- z@}@JT-?KG8aWNZvK{?;H&pzDFHhERkXWiYlM^#yHQ4lLS@8#tcvn{#lvENp)yFHVX z z*I#Pvtu^6o4)Me~KcA6fWbN6SwJFC$7bM=Ey>n%_ReA)uGhM9DU3nEdz1!D1G2HZY z0#n{>l@D)h9$1W@5Ok=uILOzxa}KHyw72!5iVy8vbm>gC^}%eRHmnDd#b;V|>h|yH zo1RCmMRf?(PcqrJdSWfaC#HKfcnF3wq#^|N?$*S3ysB*WaxrMDs&K8?GZ+|oP#})T z%sYks8vCu6wNl29-c+1-fM&H7hUqS5Z7`f3>0C%!J5b4?-;}O*8^~PbuD|;F+D`tW zK#uveYqRBy!`)4*&lcVrEf4oUTphbwcjX$2L)IJa{Jc+YzHq2=;X94jOe<_=n|7Dk z@3HIw;KhUS0f#EPp}z%{zZ6iP6{mmIH;e?~7h|C{uG_O6$$F#=61LdsiTY3n@rNtM zU0}4c2t`PeH@dL};u!C8N68ez7&B$F8loE#zc{!jGLEPmtcjQoj$e!)P-LEv3IBqy z3lgA1%16g<8)U|BpU%v?d~kX%H+QkGYN3pR)^tb5Syy~I*gVSzCRD#`5Vz;CC{&PN zAs{xOS5K=Kf`G>?3M{pm^tI0-Y&NYsB#Q=|hDJOYoH1K4G-s>norE&wOYk=ZOYw_t ztvgP(Ulg^nXIdXX`76Z4#4fIa1fmcD57LSzFUzjAVb7?|o^*@-(q@$ShOod-_CMtL zU-plaw!hhB|NZ1Y{QO4}|8c>8T<{+k{Kp0ValwCF@E;fa#|8i7g5nMQ13VT`Uj2fX Sx&IjWf=Vmh&bev)=>GuNzQO+h diff --git a/src/assets/images/Addfiles.png.ABOUT b/src/assets/images/Addfiles.png.ABOUT deleted file mode 100644 index acdef8bb..00000000 --- a/src/assets/images/Addfiles.png.ABOUT +++ /dev/null @@ -1,8 +0,0 @@ -about_resource: AddFiles.png -copyright: Copyright (c) Freepik Company, S.L. -description: Add files Flat Illustrations -download_url: https://storyset.com/illustration/add-files/rafiki -homepage_url: https://storyset.com/ -license: https://storyset.com/terms -name: Storyset work illustration -type: image \ No newline at end of file diff --git a/src/components/ImportFallback/ImportFallback.tsx b/src/components/ImportFallback/ImportFallback.tsx index a1340836..da1b12f2 100644 --- a/src/components/ImportFallback/ImportFallback.tsx +++ b/src/components/ImportFallback/ImportFallback.tsx @@ -1,29 +1,24 @@ import React from "react"; import { Link } from "react-router-dom"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faFileCirclePlus } from "@fortawesome/free-solid-svg-icons"; -import CoreLink from "../CoreLink/CoreLink"; import { ROUTES } from "../../constants/routes"; -import AddFileImage from "../../assets/images/AddFiles.png"; import "./importFallback.css"; const ImportFallback = () => { return (

- - false} /> - -
-

- Please {" "} - import a file {" "} - to view this page -

- -
- - Work illustrations by Storyset - +
+ + + +

+ Please {" "} + import a scan {" "} + to view this page +

); diff --git a/src/components/ImportFallback/importFallback.css b/src/components/ImportFallback/importFallback.css index 52577706..31d9e1d4 100644 --- a/src/components/ImportFallback/importFallback.css +++ b/src/components/ImportFallback/importFallback.css @@ -1,24 +1,17 @@ .import-fallback { text-align: center; + display: flex; + justify-content: center; + align-items: center; + height: 100%; } .import-fallback a { text-decoration: none; } -.import-fallback img { - width: 90%; - max-width: 700px; - user-select: none; - -moz-user-select: none; - -webkit-user-drag: none; - -webkit-user-select: none; - -ms-user-select: none; -} - -.import-fallback .credits { - position: absolute; - right: 0; - bottom: 0; - margin: 15px; +.import-fallback .fallback-icon { + font-size: 250px; + line-height: normal; + margin: 0; } \ No newline at end of file diff --git a/src/pages/TableView/CustomCellRenderers/ListCellRenderer.tsx b/src/pages/TableView/CustomCellRenderers/ListCellRenderer.tsx index 0a23f684..1afffada 100644 --- a/src/pages/TableView/CustomCellRenderers/ListCellRenderer.tsx +++ b/src/pages/TableView/CustomCellRenderers/ListCellRenderer.tsx @@ -32,7 +32,7 @@ const ListCellRenderer = (props: ListCellRendererProps) => { {Array.isArray(subValues) ? subValues.map((value, j) => ( - {value}
+ {value}
)) : subValues} diff --git a/src/pages/TableView/columnDefs.ts b/src/pages/TableView/columnDefs.ts index 1f713ed2..3a313b61 100644 --- a/src/pages/TableView/columnDefs.ts +++ b/src/pages/TableView/columnDefs.ts @@ -129,7 +129,7 @@ export const ALL_COLUMNS: COLUMNS_LIST = { size: { field: "size", colId: "size", - headerName: "File Size", + headerName: "Size", initialWidth: 110, }, mime_type: { @@ -210,9 +210,7 @@ export const ALL_COLUMNS: COLUMNS_LIST = { initialWidth: 320, cellRenderer: CustomComponentKeys.ListCellRenderer, filterParams: { - filterOptions: { - ...FILTER_OPTIONS.LIST_FILTERS, - }, + filterOptions: FILTER_OPTIONS.LIST_FILTERS, }, }, copyright_authors: { diff --git a/webpack.rules.js b/webpack.rules.js index d8789fb5..93cb4589 100644 --- a/webpack.rules.js +++ b/webpack.rules.js @@ -32,7 +32,6 @@ module.exports = [ }, }, }, - { test: /\.tsx?$/, exclude: /(node_modules|\.webpack)/, diff --git a/workbench.ABOUT b/workbench.ABOUT index 2cc72ea3..fd2c9370 100644 --- a/workbench.ABOUT +++ b/workbench.ABOUT @@ -1,10 +1,11 @@ -about_resource: scancode-workbench +about_resource: . name: ScanCode Workbench -version: 4.0.0 +license_expression: apache-2.0 +copyright: Copyright (c) nexB Inc. and others. +homepage_url: https://www.aboutcode.org/ license: apache-2.0 owner: nexB Inc. -copyright: Copyright (c) nexB Inc. and others. All rights reserved. - notice_file: NOTICE -license_file: LICENSE +vcs_url: git+https://github.com/nexB/scancode-workbench +bug_tracking_url: https://github.com/nexB/scancode-workbench/issues notes: ScanCode Workbench is licensed under Apache 2.0. Some example code from electron-quickstart is used and is licensed under CC0-1.0. From f62d96a2d66f03befbbd4f6c0c96bc2fa2a494dd Mon Sep 17 00:00:00 2001 From: Omkar Phansopkar Date: Mon, 25 Dec 2023 15:35:42 +0530 Subject: [PATCH 2/8] Fixed inconsistent package & archive names Signed-off-by: Omkar Phansopkar --- archive_builder.py | 77 --------------- package-lock.json | 236 +++++++++++++++++++++++++++++++++++++++++++-- package.json | 4 +- packager.js | 40 +++++++- 4 files changed, 269 insertions(+), 88 deletions(-) delete mode 100755 archive_builder.py diff --git a/archive_builder.py b/archive_builder.py deleted file mode 100755 index 0ef29193..00000000 --- a/archive_builder.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/python - -# Copyright (c) nexB Inc. and others. All rights reserved. - -""" -Run this script to build ScanCode Workbench. The script detects which OS -it is running on and produces a build archive only for this platform. -It is meant to run primarily on Github actions -""" - -import os -import sys -import json -import platform - -# Expected output file name: ScanCode-Workbench-{platform}-{arch}-{version}.tar.gz -# Example: ScanCode-Workbench-linux-x64-4.0.0.tar.gz - -# Archive properties -APP_NAME = 'ScanCode-Workbench' -APP_BUNDLE_ID = 'com.nexb.scancode-workbench' -ARCHIVE_DIR = 'dist' -OUT_DIR = 'out' # @NOTE - OUT_DIR must be same as 'out' property in packager.js - -# Get scancode workbench version from package.json -with open('package.json') as json_file: - package_json_object = json.load(json_file) - APP_VERSION = package_json_object['version'] - -# platform-specific properties -ARCH = str(platform.machine()) -SYSTEM_PLATFORM = str(sys.platform).lower() -on_linux = on_windows = on_mac = False - -if 'linux' in SYSTEM_PLATFORM: - PLATFORM_NAME = 'linux' - PLATFORM = 'linux' - on_linux = True - -elif 'win32' in SYSTEM_PLATFORM: - PLATFORM_NAME = 'windows' - PLATFORM = 'win32' - on_windows = True - -elif 'darwin' in SYSTEM_PLATFORM: - PLATFORM_NAME = 'macos' - PLATFORM = 'darwin' - on_mac = True - -else: - raise Exception('Unsupported OS/platform %r' % SYSTEM_PLATFORM) - -# Prepare file name for archive using platform, architecture & app version -archive_file_name = '-'.join([APP_NAME, APP_VERSION, PLATFORM_NAME, ARCH]) -PACKAGE_DIR_NAME = '-'.join([APP_NAME, APP_VERSION, PLATFORM, ARCH]) -print(f"Composed Archive file name: '{archive_file_name}'") - -# Ensure archive directory dist/ is created, before attempting to store archive inside it -ensure_archive_directory = f"mkdir -p {ARCHIVE_DIR}" -print("Ensure `dist/` directory exists using:", ensure_archive_directory) -os.system(ensure_archive_directory) - -# Prepare .zip file for windows -if on_windows: - zip_command = f"powershell Compress-Archive {OUT_DIR}/{PACKAGE_DIR_NAME} {ARCHIVE_DIR}/{archive_file_name}.zip" - print("Executing zip command on powershell:", zip_command) - os.system(zip_command) - print(f"Zip file ready: {ARCHIVE_DIR}/{archive_file_name}.zip") - -# Prepare .tar.gz file for mac & linux -else: - tar_command = f"tar -czf {ARCHIVE_DIR}/{archive_file_name}.tar.gz -C {OUT_DIR} {PACKAGE_DIR_NAME}" - print("Executing tar command:", tar_command) - os.system(tar_command) - print(f"Tar file ready: {ARCHIVE_DIR}/{archive_file_name}.tar.gz") - -print("Build succeeded !!!") diff --git a/package-lock.json b/package-lock.json index 3c60a82f..04033b26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "ag-grid-community": "^30.2.1", "ag-grid-react": "^30.2.1", "allotment": "^1.19.3", + "archiver": "^6.0.1", "aws-sdk": "^2.1488.0", "bootstrap": "^5.3.2", "c3": "^0.7.20", @@ -5997,6 +5998,76 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, + "node_modules/archiver": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-6.0.1.tgz", + "integrity": "sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ==", + "dependencies": { + "archiver-utils": "^4.0.1", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^5.0.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/archiver-utils": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-4.0.1.tgz", + "integrity": "sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==", + "dependencies": { + "glob": "^8.0.0", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/archiver-utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/archiver-utils/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/are-we-there-yet": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", @@ -6166,8 +6237,7 @@ "node_modules/async": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/async-exit-hook": { "version": "2.0.1", @@ -6269,6 +6339,11 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" + }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -6708,7 +6783,6 @@ "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, "engines": { "node": "*" } @@ -7284,6 +7358,20 @@ "node": ">=0.10.0" } }, + "node_modules/compress-commons": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-5.0.1.tgz", + "integrity": "sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag==", + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^5.0.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -7448,8 +7536,7 @@ "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "node_modules/cosmiconfig": { "version": "7.1.0", @@ -7476,6 +7563,29 @@ "buffer": "^5.1.0" } }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-5.0.0.tgz", + "integrity": "sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw==", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -9508,6 +9618,11 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, "node_modules/fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -12456,6 +12571,49 @@ "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", "dev": true }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -13421,7 +13579,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -14219,8 +14376,7 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/progress": { "version": "2.0.3", @@ -14401,6 +14557,11 @@ } ] }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" + }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", @@ -14919,6 +15080,33 @@ "node": ">= 6" } }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -16348,6 +16536,15 @@ "node": ">= 0.8" } }, + "node_modules/streamx": { + "version": "2.15.6", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.6.tgz", + "integrity": "sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==", + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -16746,6 +16943,16 @@ "node": ">=10" } }, + "node_modules/tar-stream": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", + "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, "node_modules/tar/node_modules/minipass": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.4.tgz", @@ -18526,6 +18733,19 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zip-stream": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-5.0.1.tgz", + "integrity": "sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA==", + "dependencies": { + "archiver-utils": "^4.0.1", + "compress-commons": "^5.0.1", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } } } } diff --git a/package.json b/package.json index dab8c40b..6a7c8018 100644 --- a/package.json +++ b/package.json @@ -21,8 +21,7 @@ "scripts": { "start": "electron-forge start", "postinstall": "electron-builder install-app-deps", - "publish": "electron-forge package && node packager.js && npm run create-archive", - "create-archive": "python archive_builder.py", + "publish": "electron-forge package && node packager.js", "lint": "eslint --ext .ts,.tsx .", "test": "jest", "test:watch": "jest --watch", @@ -75,6 +74,7 @@ "ag-grid-community": "^30.2.1", "ag-grid-react": "^30.2.1", "allotment": "^1.19.3", + "archiver": "^6.0.1", "aws-sdk": "^2.1488.0", "bootstrap": "^5.3.2", "c3": "^0.7.20", diff --git a/packager.js b/packager.js index 1ec8a289..6dd78b50 100644 --- a/packager.js +++ b/packager.js @@ -1,8 +1,12 @@ /* eslint-disable @typescript-eslint/no-var-requires */ const fs = require("fs"); +const path = require("path"); const packager = require("electron-packager"); +const archiver = require("archiver"); const { packagerConfig } = require("./forge.config.js"); +const ARCHIVE_DIR = "dist"; + const MetaDataFiles = [ "apache-2.0.LICENSE", "AUTHORS.rst", @@ -54,7 +58,7 @@ const ignoreFilesOrExtensions = [ packager({ dir: ".", - out: "out", // @NOTE - If 'out' dir is changed here, change PACKAGE_DIR in archive_builder too, + out: "out", overwrite: true, icon: "src/assets/app-icon/icon", prune: true, @@ -78,4 +82,38 @@ packager({ fs.copyFileSync(file, `${packagePath}/${file}`) ); console.log(`Packaged app at ${packagePath}`); + + buildPackageArchive(packagePath[0]); }); + +/** @param {string} packagePath */ +function buildPackageArchive(packagePath) { + // Get the base name of the package directory + const packageName = path.basename(packagePath); + + // Determine the packaging format based on the OS + const isWindows = process.platform === "win32"; + const archiveFormat = isWindows ? "zip" : "tar"; + const archiveExtension = isWindows ? "zip" : "tar.gz"; + + console.log("Building release archive ..."); + + // Ensure that the archive destination directory exists + if (!fs.existsSync(ARCHIVE_DIR)) { + fs.mkdirSync(ARCHIVE_DIR); + } + + // Create the archive file with the same name as the package directory + const archiveFileName = `${packageName}.${archiveExtension}`; + const archiveFilePath = path.join(ARCHIVE_DIR, archiveFileName); + const output = fs.createWriteStream(archiveFilePath); + const archive = archiver(archiveFormat, { gzip: true }); + + output.on("close", () => { + console.log(`Created release archive at ${archiveFilePath}`); + }); + + archive.pipe(output); + archive.directory(packagePath, false); + archive.finalize(); +} From 5e932110ad3496eda0610e5859dd6dfe5da886c0 Mon Sep 17 00:00:00 2001 From: Omkar Phansopkar Date: Mon, 25 Dec 2023 18:11:53 +0530 Subject: [PATCH 3/8] Updated build docs Signed-off-by: Omkar Phansopkar --- README.md | 4 +--- docs/source/contribute/building.rst | 21 +++++++++++++-------- docs/source/contribute/testing.rst | 2 +- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 4d44592b..42e30762 100644 --- a/README.md +++ b/README.md @@ -72,9 +72,7 @@ Note: Due to usage of native modules, a build must be done on target platform on $ npm run publish ``` -After building is done, you can find `ScanCode-Workbench` under -`dist/ScanCode-Workbench--x64-`. Archives (tar.gz and .zip) are -also built. +You can find the executible `ScanCode-Workbench-` inside `out/ScanCode-Workbench---` and distributable archive (.tar.gz or .zip) in `dist/` ## Testing diff --git a/docs/source/contribute/building.rst b/docs/source/contribute/building.rst index ed9c0b89..8be1cf0d 100644 --- a/docs/source/contribute/building.rst +++ b/docs/source/contribute/building.rst @@ -66,29 +66,34 @@ Windows Release Instructions ==================== -You can build a ``dist`` directory and a ``tar/zip`` file containing executable for your platform -by running: +ScanCode Workbench is built using `electron-forge `__ and +`electron-packager `__ + +You can build the application for your platform using following command: .. code-block:: bash npm run publish -After building is done, you can find ScanCode-Workbench under -``dist/ScanCode-Workbench---``. +You can find the executible ``ScanCode-Workbench-`` inside +``out/ScanCode-Workbench---`` and +a distributable archive in ``dist/`` directory. -Archives are also built as: +Archives are built as: - ``tar.gz`` - Linux / MacOS - ``.zip`` - Windows -.. Note:: A build for any of the three target platforms must be executed on the targeted platform. +.. Note:: + Due to usage of native modules, a build must be done on target platform only. + For example, a linux build must be done on linux machine only. + Building Documentation ====================== Create python environment, make docs - -.. code-block:: none +.. code-block:: bash # Clone this repository git clone https://github.com/nexB/scancode-workbench.git diff --git a/docs/source/contribute/testing.rst b/docs/source/contribute/testing.rst index 0086286f..20c34e2f 100644 --- a/docs/source/contribute/testing.rst +++ b/docs/source/contribute/testing.rst @@ -4,7 +4,7 @@ Test ABCM functionality using: -.. code-block:: none +.. code-block:: bash $ npm test From 3b5224a1fe154bae9a7f423e0765250304467833 Mon Sep 17 00:00:00 2001 From: Omkar Phansopkar Date: Mon, 25 Dec 2023 22:44:33 +0530 Subject: [PATCH 4/8] Fixes #621 - Removed unnecessary bundling of entire node_modules for handling native modules Signed-off-by: Omkar Phansopkar --- docs/source/contribute/building.rst | 4 +- forge.config.js | 38 +++ package-lock.json | 479 ++++++++++++++++++++++++---- package-utils.js | 55 ++++ package.json | 6 +- packager.js | 119 ------- 6 files changed, 515 insertions(+), 186 deletions(-) create mode 100644 package-utils.js delete mode 100644 packager.js diff --git a/docs/source/contribute/building.rst b/docs/source/contribute/building.rst index 8be1cf0d..7986593f 100644 --- a/docs/source/contribute/building.rst +++ b/docs/source/contribute/building.rst @@ -66,9 +66,7 @@ Windows Release Instructions ==================== -ScanCode Workbench is built using `electron-forge `__ and -`electron-packager `__ - +ScanCode Workbench release is built using `electron-forge `__. You can build the application for your platform using following command: .. code-block:: bash diff --git a/forge.config.js b/forge.config.js index a648c237..bf4d5827 100644 --- a/forge.config.js +++ b/forge.config.js @@ -1,12 +1,34 @@ /* eslint-disable @typescript-eslint/no-var-requires */ const { version } = require("./package.json"); +const { + addMetaDataFilesToPackage, + buildPackageArchive, +} = require("./package-utils"); const APP_NAME_WITH_VERSION = `ScanCode-Workbench-${version}`; +const ARCHIVE_DIR = "dist"; + +const MetaDataFiles = [ + "apache-2.0.LICENSE", + "AUTHORS.rst", + "CHANGELOG.rst", + "CODE_OF_CONDUCT.rst", + "CONTRIBUTING.rst", + "NOTICE", + "package-lock.json", + "README.md", + "SCANCODE_WORKBENCH_VERSION", + "workbench.ABOUT", +]; module.exports = { packagerConfig: { name: APP_NAME_WITH_VERSION, icon: "src/assets/app-icon/icon", + dir: ".", + out: "out", + overwrite: true, + prune: true, }, plugins: [ { @@ -25,5 +47,21 @@ module.exports = { }, }, }, + { + name: "@timfish/forge-externals-plugin", + config: { + externals: ["sqlite3"], + includeDeps: true, + }, + }, ], + hooks: { + postPackage: async (_, options) => { + // Add metadata files like Readme, License, etc to the packaged app + addMetaDataFilesToPackage(options.outputPaths[0], MetaDataFiles); + + // Build zip/tar.gz archive of the packaged app + buildPackageArchive(options.outputPaths[0], ARCHIVE_DIR); + }, + }, }; diff --git a/package-lock.json b/package-lock.json index 04033b26..daaf06dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,6 +56,7 @@ "@electron-forge/plugin-webpack": "^6.4.2", "@fortawesome/fontawesome-free": "^6.4.2", "@svgr/webpack": "^8.1.0", + "@timfish/forge-externals-plugin": "^0.2.1", "@types/c3": "^0.7.10", "@types/d3": "^7.4.2", "@types/diff-match-patch": "^1.0.35", @@ -71,8 +72,7 @@ "@vercel/webpack-asset-relocator-loader": "^1.7.3", "css-loader": "^6.8.1", "electron": "^28.1.0", - "electron-builder": "^24.6.4", - "electron-packager": "^17.1.2", + "electron-builder": "^24.9.1", "eslint": "^8.53.0", "eslint-plugin-css-import-order": "^1.1.0", "eslint-plugin-import": "^2.29.0", @@ -2939,6 +2939,102 @@ "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -3689,6 +3785,16 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -4124,6 +4230,60 @@ "node": ">=10" } }, + "node_modules/@timfish/forge-externals-plugin": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@timfish/forge-externals-plugin/-/forge-externals-plugin-0.2.1.tgz", + "integrity": "sha512-80TVZM4n/8x2zxT+SowyHJEzzQR0KLfmZpHg5UX2JnwR1WRa1h03Y7TUvV7PYD4P9/h3r+LcBZy6a7EsDwMtPg==", + "dev": true, + "dependencies": { + "flora-colossus": "1.0.1" + } + }, + "node_modules/@timfish/forge-externals-plugin/node_modules/flora-colossus": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-1.0.1.tgz", + "integrity": "sha512-d+9na7t9FyH8gBJoNDSi28mE4NgQVGGvxQ4aHtFRetjyh5SXjuus+V5EZaxFmFdXVemSOrx0lsgEl/ZMjnOWJA==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^7.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@timfish/forge-externals-plugin/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@timfish/forge-externals-plugin/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@timfish/forge-externals-plugin/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -4998,9 +5158,9 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "node_modules/@types/plist": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.4.tgz", - "integrity": "sha512-pTa9xUFQFM9WJGSWHajYNljD+DbVylE1q9IweK1LBhUYJdJ28YNU8j3KZ4Q1Qw+cSl4+QLLLOVmqNjhhvVO8fA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", "dev": true, "optional": true, "dependencies": { @@ -5154,9 +5314,9 @@ "integrity": "sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==" }, "node_modules/@types/verror": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.8.tgz", - "integrity": "sha512-YhUhnxRYs/NiVUbIs3F/EzviDP/NZCEAE2Mx5DUqLdldUmphOhFCVh7Kc+7zlYEExM0P8dzfbJi0yRlNb2Bw5g==", + "version": "1.10.9", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.9.tgz", + "integrity": "sha512-MLx9Z+9lGzwEuW16ubGeNkpBDE84RpB/NyGgg6z2BTpWzKkGU451cAY3UkUzZEp72RHF585oJ3V8JVNqIplcAQ==", "dev": true, "optional": true }, @@ -5534,6 +5694,15 @@ "@xtuc/long": "4.2.2" } }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -5545,9 +5714,9 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "node_modules/7zip-bin": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.1.1.tgz", - "integrity": "sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", "dev": true }, "node_modules/abab": { @@ -5826,9 +5995,9 @@ "dev": true }, "node_modules/app-builder-lib": { - "version": "24.6.4", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.6.4.tgz", - "integrity": "sha512-m9931WXb83teb32N0rKg+ulbn6+Hl8NV5SUpVDOVz9MWOXfhV6AQtTdftf51zJJvCQnQugGtSqoLvgw6mdF/Rg==", + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.9.1.tgz", + "integrity": "sha512-Q1nYxZcio4r+W72cnIRVYofEAyjBd3mG47o+zms8HlD51zWtA/YxJb01Jei5F+jkWhge/PTQK+uldsPh6d0/4g==", "dev": true, "dependencies": { "@develar/schema-utils": "~2.6.5", @@ -5837,15 +6006,15 @@ "@electron/universal": "1.4.1", "@malept/flatpak-bundler": "^0.4.0", "@types/fs-extra": "9.0.13", - "7zip-bin": "~5.1.1", + "7zip-bin": "~5.2.0", "async-exit-hook": "^2.0.1", "bluebird-lst": "^1.0.9", - "builder-util": "24.5.0", - "builder-util-runtime": "9.2.1", + "builder-util": "24.8.1", + "builder-util-runtime": "9.2.3", "chromium-pickle-js": "^0.2.0", "debug": "^4.3.4", "ejs": "^3.1.8", - "electron-publish": "24.5.0", + "electron-publish": "24.8.1", "form-data": "^4.0.0", "fs-extra": "^10.1.0", "hosted-git-info": "^4.1.0", @@ -6805,16 +6974,16 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/builder-util": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.5.0.tgz", - "integrity": "sha512-STnBmZN/M5vGcv01u/K8l+H+kplTaq4PAIn3yeuufUKSpcdro0DhJWxPI81k5XcNfC//bjM3+n9nr8F9uV4uAQ==", + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.8.1.tgz", + "integrity": "sha512-ibmQ4BnnqCnJTNrdmdNlnhF48kfqhNzSeqFMXHLIl+o9/yhn6QfOaVrloZ9YUu3m0k3rexvlT5wcki6LWpjTZw==", "dev": true, "dependencies": { "@types/debug": "^4.1.6", - "7zip-bin": "~5.1.1", + "7zip-bin": "~5.2.0", "app-builder-bin": "4.0.0", "bluebird-lst": "^1.0.9", - "builder-util-runtime": "9.2.1", + "builder-util-runtime": "9.2.3", "chalk": "^4.1.2", "cross-spawn": "^7.0.3", "debug": "^4.3.4", @@ -6829,9 +6998,9 @@ } }, "node_modules/builder-util-runtime": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz", - "integrity": "sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA==", + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz", + "integrity": "sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw==", "dev": true, "dependencies": { "debug": "^4.3.4", @@ -7443,26 +7612,81 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/config-file-ts": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.4.tgz", - "integrity": "sha512-cKSW0BfrSaAUnxpgvpXPLaaW/umg4bqg4k3GO1JqlRfpx+d5W0GDXznCMkWotJQek5Mmz1MJVChQnz3IVaeMZQ==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz", + "integrity": "sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==", "dev": true, "dependencies": { - "glob": "^7.1.6", - "typescript": "^4.0.2" + "glob": "^10.3.10", + "typescript": "^5.3.3" + } + }, + "node_modules/config-file-ts/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/config-file-ts/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/config-file-ts/node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/connect-history-api-fallback": { @@ -8444,14 +8668,14 @@ } }, "node_modules/dmg-builder": { - "version": "24.6.4", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.6.4.tgz", - "integrity": "sha512-BNcHRc9CWEuI9qt0E655bUBU/j/3wUCYBVKGu1kVpbN5lcUdEJJJeiO0NHK3dgKmra6LUUZlo+mWqc+OCbi0zw==", + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.9.1.tgz", + "integrity": "sha512-huC+O6hvHd24Ubj3cy2GMiGLe2xGFKN3klqVMLAdcbB6SWMd1yPSdZvV8W1O01ICzCCRlZDHiv4VrNUgnPUfbQ==", "dev": true, "dependencies": { - "app-builder-lib": "24.6.4", - "builder-util": "24.5.0", - "builder-util-runtime": "9.2.1", + "app-builder-lib": "24.9.1", + "builder-util": "24.8.1", + "builder-util-runtime": "9.2.3", "fs-extra": "^10.1.0", "iconv-lite": "^0.6.2", "js-yaml": "^4.1.0" @@ -8652,6 +8876,12 @@ "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -8692,16 +8922,16 @@ } }, "node_modules/electron-builder": { - "version": "24.6.4", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.6.4.tgz", - "integrity": "sha512-uNWQoU7pE7qOaIQ6CJHpBi44RJFVG8OHRBIadUxrsDJVwLLo8Nma3K/EEtx5/UyWAQYdcK4nVPYKoRqBb20hbA==", + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.9.1.tgz", + "integrity": "sha512-v7BuakDuY6sKMUYM8mfQGrwyjBpZ/ObaqnenU0H+igEL10nc6ht049rsCw2HghRBdEwJxGIBuzs3jbEhNaMDmg==", "dev": true, "dependencies": { - "app-builder-lib": "24.6.4", - "builder-util": "24.5.0", - "builder-util-runtime": "9.2.1", + "app-builder-lib": "24.9.1", + "builder-util": "24.8.1", + "builder-util-runtime": "9.2.3", "chalk": "^4.1.2", - "dmg-builder": "24.6.4", + "dmg-builder": "24.9.1", "fs-extra": "^10.1.0", "is-ci": "^3.0.0", "lazy-val": "^1.0.5", @@ -8768,14 +8998,14 @@ } }, "node_modules/electron-publish": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.5.0.tgz", - "integrity": "sha512-zwo70suH15L15B4ZWNDoEg27HIYoPsGJUF7xevLJLSI7JUPC8l2yLBdLGwqueJ5XkDL7ucYyRZzxJVR8ElV9BA==", + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.8.1.tgz", + "integrity": "sha512-IFNXkdxMVzUdweoLJNXSupXkqnvgbrn3J4vognuOY06LaS/m0xvfFYIf+o1CM8if6DuWYWoQFKPcWZt/FUjZPw==", "dev": true, "dependencies": { "@types/fs-extra": "^9.0.11", - "builder-util": "24.5.0", - "builder-util-runtime": "9.2.1", + "builder-util": "24.8.1", + "builder-util-runtime": "9.2.3", "chalk": "^4.1.2", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", @@ -8829,6 +9059,11 @@ "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, "node_modules/emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", @@ -9974,6 +10209,34 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.0.2.tgz", @@ -11674,6 +11937,24 @@ "node": ">=8" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -14070,6 +14351,40 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -14205,16 +14520,17 @@ } }, "node_modules/plist": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.6.tgz", - "integrity": "sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, "dependencies": { + "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" }, "engines": { - "node": ">=6" + "node": ">=10.4.0" } }, "node_modules/postcss": { @@ -16579,10 +16895,20 @@ "node": ">=8" } }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } }, "node_modules/string.prototype.trim": { "version": "1.2.8", @@ -16640,6 +16966,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", @@ -18460,6 +18799,24 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package-utils.js b/package-utils.js new file mode 100644 index 00000000..037da675 --- /dev/null +++ b/package-utils.js @@ -0,0 +1,55 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +const fs = require("fs"); +const path = require("path"); +const archiver = require("archiver"); + +/** + * @param {string[]} metaDataFiles + * @param {string} packagePath +*/ +function addMetaDataFilesToPackage(packagePath, metaDataFiles) { + metaDataFiles.forEach((file) => + fs.copyFileSync(file, `${packagePath}/${file}`) + ); + console.log(`Added ${metaDataFiles.length} metadata files to Packaged app at ${packagePath}`); +} + +/** + * @param {string} packagePath + * @param {string} archiveDirectory +*/ +function buildPackageArchive(packagePath, archiveDirectory) { + // Get the base name of the package directory + const packageName = path.basename(packagePath); + + // Determine the packaging format based on the OS + const isWindows = process.platform === "win32"; + const archiveFormat = isWindows ? "zip" : "tar"; + const archiveExtension = isWindows ? "zip" : "tar.gz"; + + console.log("Building release archive ..."); + + // Ensure that the archive destination directory exists + if (!fs.existsSync(archiveDirectory)) { + fs.mkdirSync(archiveDirectory); + } + + // Create the archive file with the same name as the package directory + const archiveFileName = `${packageName}.${archiveExtension}`; + const archiveFilePath = path.join(archiveDirectory, archiveFileName); + const output = fs.createWriteStream(archiveFilePath); + const archive = archiver(archiveFormat, { gzip: true }); + + output.on("close", () => { + console.log(`Created release archive at ${archiveFilePath}`); + }); + + archive.pipe(output); + archive.directory(packagePath, false); + archive.finalize(); +} + +module.exports = { + addMetaDataFilesToPackage, + buildPackageArchive, +}; diff --git a/package.json b/package.json index 6a7c8018..2f968538 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "scripts": { "start": "electron-forge start", "postinstall": "electron-builder install-app-deps", - "publish": "electron-forge package && node packager.js", + "publish": "electron-forge package", "lint": "eslint --ext .ts,.tsx .", "test": "jest", "test:watch": "jest --watch", @@ -33,6 +33,7 @@ "@electron-forge/plugin-webpack": "^6.4.2", "@fortawesome/fontawesome-free": "^6.4.2", "@svgr/webpack": "^8.1.0", + "@timfish/forge-externals-plugin": "^0.2.1", "@types/c3": "^0.7.10", "@types/d3": "^7.4.2", "@types/diff-match-patch": "^1.0.35", @@ -48,8 +49,7 @@ "@vercel/webpack-asset-relocator-loader": "^1.7.3", "css-loader": "^6.8.1", "electron": "^28.1.0", - "electron-builder": "^24.6.4", - "electron-packager": "^17.1.2", + "electron-builder": "^24.9.1", "eslint": "^8.53.0", "eslint-plugin-css-import-order": "^1.1.0", "eslint-plugin-import": "^2.29.0", diff --git a/packager.js b/packager.js deleted file mode 100644 index 6dd78b50..00000000 --- a/packager.js +++ /dev/null @@ -1,119 +0,0 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -const fs = require("fs"); -const path = require("path"); -const packager = require("electron-packager"); -const archiver = require("archiver"); -const { packagerConfig } = require("./forge.config.js"); - -const ARCHIVE_DIR = "dist"; - -const MetaDataFiles = [ - "apache-2.0.LICENSE", - "AUTHORS.rst", - "CHANGELOG.rst", - "CODE_OF_CONDUCT.rst", - "CONTRIBUTING.rst", - "NOTICE", - "package-lock.json", - "README.md", - "SCANCODE_WORKBENCH_VERSION", - "workbench.ABOUT", -]; - -const ignoreDir = [ - "src", - "dist", - "samples", - "test-old", - ".github", - "docs", - "test-db", - ".husky", - "coverage", - "tests", - "", // Required as the last element !! -].join("*|"); - -const ignoreFilesOrExtensions = [ - "rst", - "py", - "md", - "txt", - "enc", - ".test.ts", - ".config.js", - ".plugins.js", - ".rules.js", - ".toml", - "workbench.ABOUT", - "LICENSE", - "NOTICE", - ".gitignore", - ".eslintrc.json", - "packager.js", - "electron-builder.json", - "tsconfig.json", - ...MetaDataFiles, -].join("|"); - -packager({ - dir: ".", - out: "out", - overwrite: true, - icon: "src/assets/app-icon/icon", - prune: true, - name: packagerConfig.name, - ignore: new RegExp(`(${ignoreDir}^.*.(${ignoreFilesOrExtensions})$)`), - // osxSign: true, - // osxSign: { - // identity: 'Developer ID Application: Felix Rieseberg (LT94ZKYDCJ)', - // 'hardened-runtime': true, - // entitlements: 'entitlements.plist', - // 'entitlements-inherit': 'entitlements.plist', - // 'signature-flags': 'library' - // }, - // osxNotarize: { - // appleId: 'felix@felix.fun', - // appleIdPassword: 'my-apple-id-password' - // }, -}).then((packagePath) => { - // Copy the metadata files to package directory - MetaDataFiles.forEach((file) => - fs.copyFileSync(file, `${packagePath}/${file}`) - ); - console.log(`Packaged app at ${packagePath}`); - - buildPackageArchive(packagePath[0]); -}); - -/** @param {string} packagePath */ -function buildPackageArchive(packagePath) { - // Get the base name of the package directory - const packageName = path.basename(packagePath); - - // Determine the packaging format based on the OS - const isWindows = process.platform === "win32"; - const archiveFormat = isWindows ? "zip" : "tar"; - const archiveExtension = isWindows ? "zip" : "tar.gz"; - - console.log("Building release archive ..."); - - // Ensure that the archive destination directory exists - if (!fs.existsSync(ARCHIVE_DIR)) { - fs.mkdirSync(ARCHIVE_DIR); - } - - // Create the archive file with the same name as the package directory - const archiveFileName = `${packageName}.${archiveExtension}`; - const archiveFilePath = path.join(ARCHIVE_DIR, archiveFileName); - const output = fs.createWriteStream(archiveFilePath); - const archive = archiver(archiveFormat, { gzip: true }); - - output.on("close", () => { - console.log(`Created release archive at ${archiveFilePath}`); - }); - - archive.pipe(output); - archive.directory(packagePath, false); - archive.finalize(); -} From 707efcbbf6f5a59d0dba4996a6037b7b34ad62ae Mon Sep 17 00:00:00 2001 From: Omkar Phansopkar Date: Wed, 27 Dec 2023 00:33:17 +0530 Subject: [PATCH 5/8] Updated jest ignore paths, fixed a file name inconsistency Signed-off-by: Omkar Phansopkar --- jest.config.js | 4 ++-- ...tionOriginRenderer.tsx.tsx => DetectionOriginRenderer.tsx} | 0 src/pages/TableView/CustomCellRenderers/index.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename src/pages/TableView/CustomCellRenderers/Licenses/{DetectionOriginRenderer.tsx.tsx => DetectionOriginRenderer.tsx} (100%) diff --git a/jest.config.js b/jest.config.js index 3ebbe745..217f02a6 100644 --- a/jest.config.js +++ b/jest.config.js @@ -2,6 +2,6 @@ module.exports = { preset: "ts-jest", testEnvironment: "node", - modulePathIgnorePatterns: ["test-old", "dist"], - testPathIgnorePatterns: ["node_modules", "dist", "test-old"], + modulePathIgnorePatterns: ["node_modules/", "out/", "dist/"], + testPathIgnorePatterns: ["node_modules/", "out/", "dist/"], }; diff --git a/src/pages/TableView/CustomCellRenderers/Licenses/DetectionOriginRenderer.tsx.tsx b/src/pages/TableView/CustomCellRenderers/Licenses/DetectionOriginRenderer.tsx similarity index 100% rename from src/pages/TableView/CustomCellRenderers/Licenses/DetectionOriginRenderer.tsx.tsx rename to src/pages/TableView/CustomCellRenderers/Licenses/DetectionOriginRenderer.tsx diff --git a/src/pages/TableView/CustomCellRenderers/index.tsx b/src/pages/TableView/CustomCellRenderers/index.tsx index 5b9bcd08..0f669194 100644 --- a/src/pages/TableView/CustomCellRenderers/index.tsx +++ b/src/pages/TableView/CustomCellRenderers/index.tsx @@ -1,7 +1,7 @@ import FileLicenseDetectionsRenderer from "./Licenses/FileLicenseDetectionsRenderer"; import FileLicenseCluesRenderer from "./Licenses/FileLicenseCluesRenderer"; import FilePathRenderer from "./Licenses/FilePathRenderer"; -import DetectionOriginRenderer from "./Licenses/DetectionOriginRenderer.tsx"; +import DetectionOriginRenderer from "./Licenses/DetectionOriginRenderer"; import RegionLinesRenderer from "./Licenses/RegionLinesRenderer"; import ListCellRenderer from "./ListCellRenderer"; import UrlListCellRenderer from "./UrlListCellRenderer"; From 8b0703b6f490dc247b7d8a3e7d5f0877999b89ca Mon Sep 17 00:00:00 2001 From: Omkar Phansopkar Date: Mon, 1 Jan 2024 12:12:57 +0530 Subject: [PATCH 6/8] Updated changelog & release.md, forge config modifications Signed-off-by: Omkar Phansopkar --- CHANGELOG.rst | 24 ++- Release.md | 45 ++--- electron-builder.json | 59 ------ forge.config.js | 19 +- package-lock.json | 421 +++++++++++++++++++++++++++++++++++++++++- package.json | 1 + 6 files changed, 473 insertions(+), 96 deletions(-) delete mode 100644 electron-builder.json diff --git a/CHANGELOG.rst b/CHANGELOG.rst index f8cf1a7b..d29b3f61 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -5,6 +5,29 @@ All notable changes to this project will be documented in this file. The format is based on `Keep a Changelog `__ +[Unreleased (v4.0.1)] +-------------------------- + +**This ScanCode-Workbench release contains schema changes: scans will have to be re-imported** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +-------------------- +New Features +~~~~~~~~~~~~ + +- Support for To-do items by @OmkarPh in #593 +- Track & filter reviewed licenses by @OmkarPh in #571 + +Bug Fixes +~~~~~~~~~ + +- Fixed Irregular auto-scroll to target path by @OmkarPh in #610 +- Fixed all vulnerabilities & updated packages by @OmkarPh in #611 +- Restore old app name by @dotarjun in #615 +- Fixed compund SPDX expression resolution in detection & clue matches by @OmkarPh in #619 +- Reduce release build size by removing redundant `node_modules` dependencies by @OmkarPh in #623 + + [v4.0.0] - 2023-10-26 -------------------------- @@ -52,7 +75,6 @@ New Features - Working indicator for queries - Diff modal for Matched text & Rule text in Matches table - Bug Fixes ~~~~~~~~~ diff --git a/Release.md b/Release.md index 2cceba72..2fd1303d 100644 --- a/Release.md +++ b/Release.md @@ -1,27 +1,7 @@ ## Major changes -- Ported to React + Typescript variant !! - Under GSoC by @OmkarPh -- Support for scancode-toolkit v32.x output format v3.0.0 -- Updated Tableview library & columns -- New sections: License Detections explorer, Packages explorer, ScanInfo, About -- Support for multiple windows -- Maintain history of imports -- Updated dependencies -- Created UI to support top level packages-deps obtained in latest scans -- Support for Drag & drop JSON/SQLite files -- Github actions to create automated releases - Exception: macos arm64 is not yet support by Github actions yet, needs manual build & upload -- Retain column order & states https://github.com/nexB/scancode-workbench/pull/568 -- License clues section in Licenses explorer https://github.com/nexB/scancode-workbench/pull/570 -- Go to specific file from licenses & packages explorer https://github.com/nexB/scancode-workbench/pull/572 -- Diff modal for Matched text & Rule text in Matches table https://github.com/nexB/scancode-workbench/pull/577 -- Working indicator for queries https://github.com/nexB/scancode-workbench/pull/583 -- Dashboard updates https://github.com/nexB/scancode-workbench/pull/585 -- Close file & cleanup https://github.com/nexB/scancode-workbench/pull/600 -- Unit tests https://github.com/nexB/scancode-workbench/pull/591 -- Dependency Info dashboard updates https://github.com/nexB/scancode-workbench/pull/594 -- Updated documentation https://github.com/nexB/scancode-workbench/pull/602 +- Support for To-do items by @OmkarPh in #593 +- Track & filter reviewed licenses by @OmkarPh in #571 ## ScanCode Toolkit Compatibility @@ -29,20 +9,17 @@ This v4.0.0 of ScanCode Workbench is compatible with scans from any [ScanCode To ## Bug fixes -- Prevent crashes on unsupported scans -- Provision for header-less scans (Test scans) -- Table column fixes -- Fixed UI anomalies -- Invalid path query fix (Data for files with similar prefix were colliding) -- window title update & occasional sqlite error for packages https://github.com/nexB/scancode-workbench/pull/560 -- license detection parser issues, trimmed filter options, hide empty 'other dependencies' https://github.com/nexB/scancode-workbench/pull/569 -- Refined UX including consistent scrollbars, tooltips, Search in licenses, filters for dependencies https://github.com/nexB/scancode-workbench/pull/587 -- Updated piechart tooltip https://github.com/nexB/scancode-workbench/pull/582 -- Automatic height for tables https://github.com/nexB/scancode-workbench/pull/606 -- Fixed Empty directory being shown with file icon https://github.com/nexB/scancode-workbench/pull/604 -- Fix irregular scroll behavior for files in deeply nested FileTree https://github.com/nexB/scancode-workbench/pull/599 +- Fixed Irregular auto-scroll to target path by @OmkarPh in #610 +- Fixed all vulnerabilities & updated packages by @OmkarPh in #611 +- Restore old app name by @dotarjun in #615 +- Fixed compund SPDX expression resolution in detection & clue matches by @OmkarPh in #619 +- Reduce release build size by removing redundant `node_modules` dependencies by @OmkarPh in #623 ## Framework - Electorn [v28.1.0](https://releases.electronjs.org/release/v28.1.0) - Chromium [v120.0.6099.109](https://source.chromium.org/chromium/chromium/src/+/refs/tags/120.0.6099.109:) + +# New Contributors + +- @dotarjun made his first contribution in #615 \ No newline at end of file diff --git a/electron-builder.json b/electron-builder.json deleted file mode 100644 index 2f21a52b..00000000 --- a/electron-builder.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "appId": "com.electron.scancode-workbench", - "productName": "ScanCode Workbench", - "directories": { - "output": "out", - "buildResources": "build-res" - }, - "files": [ - "package.json", - "src/**/*", - "app/**/*", - "node_modules", - "./main.tsx" - ], - "extraMetadata": { - "main": "./src/main.ts" - }, - "mac": { - "target": { - "target": "dmg", - "arch": "universal" - } - }, - "dmg": { - "background": null, - "backgroundColor": "#ffffff", - "window": { - "width": "400", - "height": "300" - }, - "contents": [ - { - "x": 100, - "y": 100 - }, - { - "x": 300, - "y": 100, - "type": "link", - "path": "/Applications" - } - ] - }, - "win": { - "target": { - "target": "nsis", - "arch": ["x64", "ia32"] - } - }, - "nsis": { - "oneClick": false, - "allowToChangeInstallationDirectory": true - }, - "linux": { - "target": "AppImage", - "category": "Utility" - }, - "buildVersion": "1" -} diff --git a/forge.config.js b/forge.config.js index bf4d5827..2d923923 100644 --- a/forge.config.js +++ b/forge.config.js @@ -21,14 +21,29 @@ const MetaDataFiles = [ "workbench.ABOUT", ]; -module.exports = { +/** @type {import('@electron-forge/shared-types').ForgeConfig} */ +const forgeConfig = { + /** @type {import('@electron/packager').Options} */ packagerConfig: { name: APP_NAME_WITH_VERSION, + appBundleId: "com.nexb.scancode-workbench", icon: "src/assets/app-icon/icon", dir: ".", out: "out", overwrite: true, prune: true, + protocols: [ + { + name: "JSON File", + schemes: ["file"], + extensions: ["json"], + }, + { + name: "SQLite Database", + schemes: ["file"], + extensions: ["sqlite", "db"], + }, + ], }, plugins: [ { @@ -65,3 +80,5 @@ module.exports = { }, }, }; + +module.exports = forgeConfig; diff --git a/package-lock.json b/package-lock.json index daaf06dd..71e436f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,6 +54,7 @@ "devDependencies": { "@electron-forge/cli": "^6.4.2", "@electron-forge/plugin-webpack": "^6.4.2", + "@electron-forge/shared-types": "^7.2.0", "@fortawesome/fontawesome-free": "^6.4.2", "@svgr/webpack": "^8.1.0", "@timfish/forge-externals-plugin": "^0.2.1", @@ -2139,6 +2140,20 @@ "node": ">= 14.17.5" } }, + "node_modules/@electron-forge/cli/node_modules/@electron-forge/shared-types": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.4.2.tgz", + "integrity": "sha512-DKOUMsdTXZIq8XiqY0Hi3C+dam/JKUnvfBjwcUeyZqPdgEE1qry8xZmmjorXuLrRf1Jq8rhxYGQInSK4af0QYw==", + "dev": true, + "dependencies": { + "@electron/rebuild": "^3.2.10", + "electron-packager": "^17.1.2", + "listr2": "^5.0.3" + }, + "engines": { + "node": ">= 14.17.5" + } + }, "node_modules/@electron-forge/core": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-6.4.2.tgz", @@ -2215,6 +2230,34 @@ "node": ">= 14.17.5" } }, + "node_modules/@electron-forge/core-utils/node_modules/@electron-forge/shared-types": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.4.2.tgz", + "integrity": "sha512-DKOUMsdTXZIq8XiqY0Hi3C+dam/JKUnvfBjwcUeyZqPdgEE1qry8xZmmjorXuLrRf1Jq8rhxYGQInSK4af0QYw==", + "dev": true, + "dependencies": { + "@electron/rebuild": "^3.2.10", + "electron-packager": "^17.1.2", + "listr2": "^5.0.3" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/core/node_modules/@electron-forge/shared-types": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.4.2.tgz", + "integrity": "sha512-DKOUMsdTXZIq8XiqY0Hi3C+dam/JKUnvfBjwcUeyZqPdgEE1qry8xZmmjorXuLrRf1Jq8rhxYGQInSK4af0QYw==", + "dev": true, + "dependencies": { + "@electron/rebuild": "^3.2.10", + "electron-packager": "^17.1.2", + "listr2": "^5.0.3" + }, + "engines": { + "node": ">= 14.17.5" + } + }, "node_modules/@electron-forge/maker-base": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-6.4.2.tgz", @@ -2229,6 +2272,20 @@ "node": ">= 14.17.5" } }, + "node_modules/@electron-forge/maker-base/node_modules/@electron-forge/shared-types": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.4.2.tgz", + "integrity": "sha512-DKOUMsdTXZIq8XiqY0Hi3C+dam/JKUnvfBjwcUeyZqPdgEE1qry8xZmmjorXuLrRf1Jq8rhxYGQInSK4af0QYw==", + "dev": true, + "dependencies": { + "@electron/rebuild": "^3.2.10", + "electron-packager": "^17.1.2", + "listr2": "^5.0.3" + }, + "engines": { + "node": ">= 14.17.5" + } + }, "node_modules/@electron-forge/plugin-base": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-6.4.2.tgz", @@ -2241,6 +2298,20 @@ "node": ">= 14.17.5" } }, + "node_modules/@electron-forge/plugin-base/node_modules/@electron-forge/shared-types": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.4.2.tgz", + "integrity": "sha512-DKOUMsdTXZIq8XiqY0Hi3C+dam/JKUnvfBjwcUeyZqPdgEE1qry8xZmmjorXuLrRf1Jq8rhxYGQInSK4af0QYw==", + "dev": true, + "dependencies": { + "@electron/rebuild": "^3.2.10", + "electron-packager": "^17.1.2", + "listr2": "^5.0.3" + }, + "engines": { + "node": ">= 14.17.5" + } + }, "node_modules/@electron-forge/plugin-webpack": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/@electron-forge/plugin-webpack/-/plugin-webpack-6.4.2.tgz", @@ -2263,6 +2334,20 @@ "node": ">= 14.17.5" } }, + "node_modules/@electron-forge/plugin-webpack/node_modules/@electron-forge/shared-types": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.4.2.tgz", + "integrity": "sha512-DKOUMsdTXZIq8XiqY0Hi3C+dam/JKUnvfBjwcUeyZqPdgEE1qry8xZmmjorXuLrRf1Jq8rhxYGQInSK4af0QYw==", + "dev": true, + "dependencies": { + "@electron/rebuild": "^3.2.10", + "electron-packager": "^17.1.2", + "listr2": "^5.0.3" + }, + "engines": { + "node": ">= 14.17.5" + } + }, "node_modules/@electron-forge/publisher-base": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-6.4.2.tgz", @@ -2275,7 +2360,7 @@ "node": ">= 14.17.5" } }, - "node_modules/@electron-forge/shared-types": { + "node_modules/@electron-forge/publisher-base/node_modules/@electron-forge/shared-types": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.4.2.tgz", "integrity": "sha512-DKOUMsdTXZIq8XiqY0Hi3C+dam/JKUnvfBjwcUeyZqPdgEE1qry8xZmmjorXuLrRf1Jq8rhxYGQInSK4af0QYw==", @@ -2289,6 +2374,21 @@ "node": ">= 14.17.5" } }, + "node_modules/@electron-forge/shared-types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-7.2.0.tgz", + "integrity": "sha512-d8i+pwPwBnlmFTRkq7QfaoRS9LywfyjDdHqQZuArFbL6NLAEbZ52irFiAE3NSLf4STew/BA6IK9sTPz3KRmvQw==", + "dev": true, + "dependencies": { + "@electron-forge/tracer": "7.2.0", + "@electron/packager": "^18.0.0", + "@electron/rebuild": "^3.2.10", + "listr2": "^5.0.3" + }, + "engines": { + "node": ">= 16.4.0" + } + }, "node_modules/@electron-forge/template-base": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-6.4.2.tgz", @@ -2305,6 +2405,20 @@ "node": ">= 14.17.5" } }, + "node_modules/@electron-forge/template-base/node_modules/@electron-forge/shared-types": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.4.2.tgz", + "integrity": "sha512-DKOUMsdTXZIq8XiqY0Hi3C+dam/JKUnvfBjwcUeyZqPdgEE1qry8xZmmjorXuLrRf1Jq8rhxYGQInSK4af0QYw==", + "dev": true, + "dependencies": { + "@electron/rebuild": "^3.2.10", + "electron-packager": "^17.1.2", + "listr2": "^5.0.3" + }, + "engines": { + "node": ">= 14.17.5" + } + }, "node_modules/@electron-forge/template-vite": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/@electron-forge/template-vite/-/template-vite-6.4.2.tgz", @@ -2333,6 +2447,34 @@ "node": "^14.18.0 || >=16.0.0" } }, + "node_modules/@electron-forge/template-vite-typescript/node_modules/@electron-forge/shared-types": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.4.2.tgz", + "integrity": "sha512-DKOUMsdTXZIq8XiqY0Hi3C+dam/JKUnvfBjwcUeyZqPdgEE1qry8xZmmjorXuLrRf1Jq8rhxYGQInSK4af0QYw==", + "dev": true, + "dependencies": { + "@electron/rebuild": "^3.2.10", + "electron-packager": "^17.1.2", + "listr2": "^5.0.3" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/template-vite/node_modules/@electron-forge/shared-types": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.4.2.tgz", + "integrity": "sha512-DKOUMsdTXZIq8XiqY0Hi3C+dam/JKUnvfBjwcUeyZqPdgEE1qry8xZmmjorXuLrRf1Jq8rhxYGQInSK4af0QYw==", + "dev": true, + "dependencies": { + "@electron/rebuild": "^3.2.10", + "electron-packager": "^17.1.2", + "listr2": "^5.0.3" + }, + "engines": { + "node": ">= 14.17.5" + } + }, "node_modules/@electron-forge/template-webpack": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-6.4.2.tgz", @@ -2361,6 +2503,46 @@ "node": ">= 14.17.5" } }, + "node_modules/@electron-forge/template-webpack-typescript/node_modules/@electron-forge/shared-types": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.4.2.tgz", + "integrity": "sha512-DKOUMsdTXZIq8XiqY0Hi3C+dam/JKUnvfBjwcUeyZqPdgEE1qry8xZmmjorXuLrRf1Jq8rhxYGQInSK4af0QYw==", + "dev": true, + "dependencies": { + "@electron/rebuild": "^3.2.10", + "electron-packager": "^17.1.2", + "listr2": "^5.0.3" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/template-webpack/node_modules/@electron-forge/shared-types": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.4.2.tgz", + "integrity": "sha512-DKOUMsdTXZIq8XiqY0Hi3C+dam/JKUnvfBjwcUeyZqPdgEE1qry8xZmmjorXuLrRf1Jq8rhxYGQInSK4af0QYw==", + "dev": true, + "dependencies": { + "@electron/rebuild": "^3.2.10", + "electron-packager": "^17.1.2", + "listr2": "^5.0.3" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/tracer": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/tracer/-/tracer-7.2.0.tgz", + "integrity": "sha512-EoJ07nptEuuY2fcs/bUWzIf11RQRx6Ch/dZ6A9WIRcFYe9cFrslQwvyUf0siY3jcqVvxETCz69JGuBxKGwak7A==", + "dev": true, + "dependencies": { + "chrome-trace-event": "^1.0.3" + }, + "engines": { + "node": ">= 14.17.5" + } + }, "node_modules/@electron-forge/web-multi-logger": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/@electron-forge/web-multi-logger/-/web-multi-logger-6.4.2.tgz", @@ -2514,6 +2696,212 @@ "node": ">=12.0.0" } }, + "node_modules/@electron/packager": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@electron/packager/-/packager-18.1.3.tgz", + "integrity": "sha512-21T5MxUf7DwV07IIes3jO/571mXCjOGVPdmYJFPCVDTimFiHQSW0Oy+OIGQaKBiNIXfnP29KylsCQbmds6O6Iw==", + "dev": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "@electron/get": "^3.0.0", + "@electron/notarize": "^2.1.0", + "@electron/osx-sign": "^1.0.5", + "@electron/universal": "^2.0.1", + "@electron/windows-sign": "^1.0.0", + "cross-spawn-windows-exe": "^1.2.0", + "debug": "^4.0.1", + "extract-zip": "^2.0.0", + "filenamify": "^4.1.0", + "fs-extra": "^11.1.0", + "galactus": "^1.0.0", + "get-package-info": "^1.0.0", + "junk": "^3.1.0", + "parse-author": "^2.0.0", + "plist": "^3.0.0", + "rcedit": "^4.0.0", + "resolve": "^1.1.6", + "semver": "^7.1.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "electron-packager": "bin/electron-packager.js" + }, + "engines": { + "node": ">= 16.13.0" + }, + "funding": { + "url": "https://github.com/electron/packager?sponsor=1" + } + }, + "node_modules/@electron/packager/node_modules/@electron/get": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.0.0.tgz", + "integrity": "sha512-hLv4BYFiyrNRI+U0Mm2X7RxCCdJLkDUn8GCEp9QJzbLpZRko+UaLlCjOMkj6TEtirNLPyBA7y1SeGfnpOB21aQ==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron/packager/node_modules/@electron/get/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@electron/packager/node_modules/@electron/get/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/packager/node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@electron/packager/node_modules/@electron/get/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@electron/packager/node_modules/@electron/notarize": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.2.0.tgz", + "integrity": "sha512-Sf7RG47rafeGuUm+kLEbTXMN8XZeYXN70dMBstrcgiykxCq3SLl1uqxFWndxSI1LfMqv4Eq9PTDHLPwiya31Kg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/packager/node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/packager/node_modules/@electron/universal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz", + "integrity": "sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==", + "dev": true, + "dependencies": { + "@electron/asar": "^3.2.7", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" + }, + "engines": { + "node": ">=16.4" + } + }, + "node_modules/@electron/packager/node_modules/@electron/universal/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/packager/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@electron/packager/node_modules/dir-compare": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " + } + }, + "node_modules/@electron/packager/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/packager/node_modules/rcedit": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-4.0.1.tgz", + "integrity": "sha512-bZdaQi34krFWhrDn+O53ccBDw0MkAT2Vhu75SqhtvhQu4OPyFM4RoVheyYiVQYdjhUi6EJMVWQ0tR6bCIYVkUg==", + "dev": true, + "dependencies": { + "cross-spawn-windows-exe": "^1.1.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@electron/rebuild": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.3.0.tgz", @@ -2596,6 +2984,37 @@ "node": ">=10" } }, + "node_modules/@electron/windows-sign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.0.0.tgz", + "integrity": "sha512-sdkQYAR/TQCEyYgz2jMbusL/ljdj6qA7vyIm/S9HICMAitXhXROFHUOLLgiORj1uiaf2EOB2U33DatGubUuZaQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@electron/windows-sign/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/@emotion/babel-plugin": { "version": "11.11.0", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", diff --git a/package.json b/package.json index 2f968538..19d98edb 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "devDependencies": { "@electron-forge/cli": "^6.4.2", "@electron-forge/plugin-webpack": "^6.4.2", + "@electron-forge/shared-types": "^7.2.0", "@fortawesome/fontawesome-free": "^6.4.2", "@svgr/webpack": "^8.1.0", "@timfish/forge-externals-plugin": "^0.2.1", From d61fc87473667a67146a146a0e794e1da48da9a5 Mon Sep 17 00:00:00 2001 From: Omkar Phansopkar Date: Mon, 8 Jan 2024 23:46:03 +0530 Subject: [PATCH 7/8] Publish source code in release assets Signed-off-by: Omkar Phansopkar --- .github/workflows/Release.yml | 12 ++++-- buildSourceArchive.js | 42 +++++++++++++++++++ package-utils.js | 11 +++-- package.json | 1 + .../ImportFallback/ImportFallback.tsx | 3 +- 5 files changed, 59 insertions(+), 10 deletions(-) create mode 100644 buildSourceArchive.js diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml index a0f69ecd..361940ad 100644 --- a/.github/workflows/Release.yml +++ b/.github/workflows/Release.yml @@ -26,7 +26,7 @@ jobs: uses: softprops/action-gh-release@v1 with: tag_name: ${{steps.tag.outputs.tag}} - name: Release ${{steps.tag.outputs.tag}} + name: ${{steps.tag.outputs.tag}} body_path: ./Release.md draft: false prerelease: false @@ -50,12 +50,16 @@ jobs: node-version: 16.13.0 - name: Install dependencies run: npm install - - name: Build Workbench & create archive for ${{ matrix.os }} + - name: Create release assets directory + run: mkdir -p dist + - name: Build Workbench & create release archive for ${{ matrix.os }} run: npm run publish - - name: Verify Generated archive in dist/ + - name: Create source code archive (including node_modules) + run: npm run srcarchive + - name: Verify Generated archives in dist/ run: ls ./dist - name: Upload release assets uses: softprops/action-gh-release@v1 with: tag_name: ${{ github.ref_name }} - files: dist/* \ No newline at end of file + files: dist/* diff --git a/buildSourceArchive.js b/buildSourceArchive.js new file mode 100644 index 00000000..beccfcdd --- /dev/null +++ b/buildSourceArchive.js @@ -0,0 +1,42 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +const os = require("os"); +const fs = require("fs"); +const path = require("path"); +const archiver = require("archiver"); +const version = require("./package.json").version; + +const archiveDirectory = "dist"; +const platform = os.platform(); +const arch = os.arch(); + +// Determine the packaging format based on the OS +const isWindows = platform === "win32"; +const archiveFormat = isWindows ? "zip" : "tar"; +const archiveExtension = isWindows ? "zip" : "tar.gz"; + +console.log("Building source archive ..."); + +// Ensure that the archive destination directory exists +if (!fs.existsSync(archiveDirectory)) { + fs.mkdirSync(archiveDirectory); +} + +// Create the archive file with the same name as the package directory +const archiveFileName = `ScanCode-Workbench-${version}-${platform}-${arch}-src.${archiveExtension}`; +const archiveFilePath = path.join(archiveDirectory, archiveFileName); +const output = fs.createWriteStream(archiveFilePath); +const archive = archiver(archiveFormat, { gzip: true }); + +output.on("close", () => { + console.log(`Created source archive at ${archiveFilePath}`); +}); + +archive.pipe(output); + +archive.glob("**/*", { + dot: true, + cwd: process.cwd(), + ignore: ["dist/**", "out/**", ".git/**"], +}); + +archive.finalize(); diff --git a/package-utils.js b/package-utils.js index 037da675..9f591c87 100644 --- a/package-utils.js +++ b/package-utils.js @@ -6,18 +6,20 @@ const archiver = require("archiver"); /** * @param {string[]} metaDataFiles * @param {string} packagePath -*/ + */ function addMetaDataFilesToPackage(packagePath, metaDataFiles) { metaDataFiles.forEach((file) => fs.copyFileSync(file, `${packagePath}/${file}`) ); - console.log(`Added ${metaDataFiles.length} metadata files to Packaged app at ${packagePath}`); + console.log( + `Added ${metaDataFiles.length} metadata files to Packaged app at ${packagePath}` + ); } -/** +/** * @param {string} packagePath * @param {string} archiveDirectory -*/ + */ function buildPackageArchive(packagePath, archiveDirectory) { // Get the base name of the package directory const packageName = path.basename(packagePath); @@ -49,6 +51,7 @@ function buildPackageArchive(packagePath, archiveDirectory) { archive.finalize(); } + module.exports = { addMetaDataFilesToPackage, buildPackageArchive, diff --git a/package.json b/package.json index 19d98edb..e2cb0b88 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "start": "electron-forge start", "postinstall": "electron-builder install-app-deps", "publish": "electron-forge package", + "srcarchive": "node buildSourceArchive.js", "lint": "eslint --ext .ts,.tsx .", "test": "jest", "test:watch": "jest --watch", diff --git a/src/components/ImportFallback/ImportFallback.tsx b/src/components/ImportFallback/ImportFallback.tsx index da1b12f2..16cb0aff 100644 --- a/src/components/ImportFallback/ImportFallback.tsx +++ b/src/components/ImportFallback/ImportFallback.tsx @@ -16,8 +16,7 @@ const ImportFallback = () => {

Please {" "} - import a scan {" "} - to view this page + import a scan

From c1edf7472f6977c31732017a7106359009ac9d52 Mon Sep 17 00:00:00 2001 From: Omkar Phansopkar Date: Sun, 21 Jan 2024 00:42:16 +0530 Subject: [PATCH 8/8] Fixed community channel links Signed-off-by: Omkar Phansopkar --- CONTRIBUTING.rst | 8 +++----- workbench.ABOUT | 1 - 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index bccf45cc..ff7acfd9 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -42,13 +42,11 @@ If you are proposing a feature: Chat with other developers ========================== -For other questions, discussions, and chats, we have: +For other questions, discussions, and chats, we have official Matrix rooms: -- an official Gitter channel at https://gitter.im/aboutcode-org/discuss - Gitter also has an IRC bridge at https://irc.gitter.im/ - This is the main place where we chat and meet. +- `discuss room `_ (for all projects) +- `scancode-workbench room `_ -- a Gitter channel to discuss Documentation at https://gitter.im/aboutcode-org/gsod-season-of-docs Bug reports =========== diff --git a/workbench.ABOUT b/workbench.ABOUT index fd2c9370..500fd53a 100644 --- a/workbench.ABOUT +++ b/workbench.ABOUT @@ -8,4 +8,3 @@ owner: nexB Inc. notice_file: NOTICE vcs_url: git+https://github.com/nexB/scancode-workbench bug_tracking_url: https://github.com/nexB/scancode-workbench/issues -notes: ScanCode Workbench is licensed under Apache 2.0. Some example code from electron-quickstart is used and is licensed under CC0-1.0.