diff --git a/DOCUMENTATION.md b/DOCUMENTATION.md index 910c506..5c5100d 100644 --- a/DOCUMENTATION.md +++ b/DOCUMENTATION.md @@ -6,8 +6,6 @@ for support, contact me on discord `dragonwocky#8449` or open an issue here in t want to contribute? check the the [contribution guidelines](CONTRIBUTING.md). ---- - ## module creation _to understand best how notion's app works, check out [the electron docs](https://www.electronjs.org/docs/)_ @@ -23,8 +21,6 @@ each directory in the `mods` folder is considered a module, with the entry point | `mod.js` | **required:** describes the module and contains functional javascript | | `styles.css` | **optional:** css file automatically inserted into each app window via the `enhancement://` protocol | ---- - ### mod.js ```js @@ -86,7 +82,7 @@ access to the module settings/options defined in `mod.js` (those set in the menu or used internally by the module). each module store is saved to + automatically syncs with `~/.notion-enhancer/id.json`. it can be initialised with `const data = store({ defaults })`, then used as if it were a normal object. -this hack is applied to whichever file is set as the function key. these can be found within the `app` folder. +this hack is applied to whichever file (`.js`-only) is set as the function key. these can be found within the `app` folder. files under the `main` folder are executed on app launch in a process shared between all app windows (consider it a backend). files under the `renderer` folder are @@ -118,8 +114,6 @@ module.exports.hacks = { to be documented ---- - ## styling to be documented diff --git a/loader/hack.js b/loader/hack.js deleted file mode 100644 index e986e53..0000000 --- a/loader/hack.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = function () { - document.addEventListener('readystatechange', (ev) => { - console.log(ev); - }); -}; diff --git a/loader/main.js b/loader/main.js deleted file mode 100644 index e69de29..0000000 diff --git a/loader/renderer.js b/loader/renderer.js deleted file mode 100644 index e69de29..0000000 diff --git a/mods/core/meta.js b/mods/core/mod.js similarity index 94% rename from mods/core/meta.js rename to mods/core/mod.js index 135c53e..61f9573 100644 --- a/mods/core/meta.js +++ b/mods/core/mod.js @@ -7,7 +7,7 @@ module.exports = { id: '0f0bf8b6-eae6-4273-b307-8fc43f2ee082', type: 'core', - name: 'notion-enhancer', + name: 'notion-enhancer core', version: require('../../package.json').version, author: 'dragonwocky', thumb: diff --git a/package.json b/package.json index 24757be..832ec92 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "dependencies": { "asar": "^3.0.3", "cac": "^6.5.12", - "fs-extra": "^9.0.1" + "fs-extra": "^9.0.1", + "readdir-enhanced": "^6.0.3" } } diff --git a/pkg/apply.js b/pkg/apply.js index 85a5daa..f8b1464 100644 --- a/pkg/apply.js +++ b/pkg/apply.js @@ -7,6 +7,7 @@ 'use strict'; const fs = require('fs-extra'), path = require('path'), + { readdirIterator } = require('readdir-enhanced'), helpers = require('./helpers.js'), { version } = require('../package.json'); @@ -40,7 +41,7 @@ module.exports = async function ({ overwrite_version } = {}) { !['y', 'n'].includes(overwrite_version.toLowerCase()) ); overwrite_version = - !overwrite_version || overwrite_version.toLowerCase() == 'y'; + !overwrite_version || overwrite_version.toLowerCase() === 'y'; if (!overwrite_version) { console.info(' ~~ keeping previous version: exiting.'); return false; @@ -54,8 +55,8 @@ module.exports = async function ({ overwrite_version } = {}) { }); } console.info(' ...unpacking app.asar'); - const asar_app = path.join(__notion, 'app.asar'), - asar_exec = path.join( + const asar_app = path.resolve(__notion, 'app.asar'), + asar_exec = path.resolve( __dirname, '..', 'node_modules', @@ -64,9 +65,9 @@ module.exports = async function ({ overwrite_version } = {}) { 'asar.js' ); await helpers.exec( - `"${asar_exec}" extract "${asar_app}" "${path.join(__notion, 'app')}"` + `"${asar_exec}" extract "${asar_app}" "${path.resolve(__notion, 'app')}"` ); - fs.move(asar_app, path.join(__notion, 'app.asar.bak')); + fs.move(asar_app, path.resolve(__notion, 'app.asar.bak')); // patching launch script target of custom wrappers if ( @@ -92,39 +93,29 @@ module.exports = async function ({ overwrite_version } = {}) { } } - const mods = await fs.readdir(path.join(__dirname, '..', 'mods')), - invalid_mods = [], - loaded_mods = []; - for (let dir of mods) { - try { - const mod = require(`../mods/${dir}/mod.js`); - if ( - !mod.id || - !mod.name || - !mod.version || - !mod.author || - !['extension', 'theme', 'core'].includes(mod.type) - ) - throw Error; - loaded_mods.push(mod.name); - console.log(mod.renderer.toString()); - } catch (err) { - invalid_mods.push(dir); + for await (let insertion_target of readdirIterator( + path.resolve(__notion, 'app'), + { + deep: (stats) => stats.path.indexOf('node_modules') === -1, + filter: (stats) => stats.isFile() && stats.path.endsWith('.js'), } + )) { + insertion_target = path.resolve(__notion, 'app', insertion_target); + fs.appendFile( + insertion_target, + `\n\n//notion-enhancer\nrequire('${helpers.realpath( + __dirname + )}/loader.js')(__filename);` + ); } - if (loaded_mods.length) - console.info( - ` enhancements loaded: ${loaded_mods.join(', ')}.` - ); - if (invalid_mods.length) - console.error( - ` invalid mods found: ${invalid_mods.join(', ')}.` - ); // not resolved, nothing depends on it so it's just a "let it do its thing" console.info(' ...recording enhancement version.'); - fs.outputFile(path.join(__notion, 'app', 'ENHANCER_VERSION.txt'), version); - fs.outputFile(path.join(helpers.data_folder, 'version.txt'), version); + fs.outputFile( + path.resolve(__notion, 'app', 'ENHANCER_VERSION.txt'), + version + ); + fs.outputFile(path.resolve(helpers.data_folder, 'version.txt'), version); console.info(' ~~ success.'); return true; diff --git a/pkg/check.js b/pkg/check.js index 3f6985e..f104b21 100644 --- a/pkg/check.js +++ b/pkg/check.js @@ -16,17 +16,17 @@ let __notion = helpers.getNotion(); module.exports = async function () { __notion = await __notion; - const version_path = path.join(__notion, 'app', 'ENHANCER_VERSION.txt'), + const version_path = path.resolve(__notion, 'app', 'ENHANCER_VERSION.txt'), installed_version = (await fs.pathExists(version_path)) ? await fs.readFile(version_path, 'utf8') : '?.?.?'; - if (await fs.pathExists(path.join(__notion, 'app.asar'))) { + if (await fs.pathExists(path.resolve(__notion, 'app.asar'))) { return { msg: `notion-enhancer has not been applied.`, code: 0, }; } - return installed_version == version + return installed_version === version ? { msg: `notion-enhancer v${version} applied.`, code: 1, diff --git a/pkg/helpers.js b/pkg/helpers.js index 16b0032..f1262e8 100644 --- a/pkg/helpers.js +++ b/pkg/helpers.js @@ -21,10 +21,10 @@ class EnhancerError extends Error { // checks if being run on the windows subsystem for linux: // used to modify windows notion app. const is_wsl = - process.platform == 'linux' && + process.platform === 'linux' && os.release().toLowerCase().includes('microsoft'), // ~/.notion-enhancer absolute path. - data_folder = path.join(os.homedir(), '.notion-enhancer'); + data_folder = path.resolve(os.homedir(), '.notion-enhancer'); // transform a wsl filepath to its relative windows filepath if necessary. // every file path inserted by hack.js should be put through this. @@ -72,15 +72,15 @@ async function getNotion() { ); // check if actual app files are present. // if app/app.asar are missing but app.asar.bak present it will be moved to app.asar - const app_asar = path.join(folder, 'app.asar'); + const app_asar = path.resolve(folder, 'app.asar'); if ( !( (await fs.pathExists(folder)) && ((await fs.pathExists(app_asar)) || - (await fs.pathExists(path.join(folder, 'app')))) + (await fs.pathExists(path.resolve(folder, 'app')))) ) ) { - const asar_bak = path.join(folder, 'app.asar.bak'); + const asar_bak = path.resolve(folder, 'app.asar.bak'); if (await fs.pathExists(asar_bak)) { await fs.move(asar_bak, app_asar); } else diff --git a/pkg/helpers.md b/pkg/helpers.md index 4f8bf69..a48dfa7 100644 --- a/pkg/helpers.md +++ b/pkg/helpers.md @@ -101,7 +101,7 @@ do { // ask for a Y/n until a valid answer is received. // pressing enter without input is assumed to be a "yes". } while (overwrite && !['y', 'n'].includes(overwrite.toLowerCase())); -overwrite = !overwrite || overwrite.toLowerCase() == 'y'; +overwrite = !overwrite || overwrite.toLowerCase() === 'y'; if (overwrite) { console.info(' -- overwriting file.'); // do stuff diff --git a/pkg/loader.js b/pkg/loader.js new file mode 100644 index 0000000..9605e3e --- /dev/null +++ b/pkg/loader.js @@ -0,0 +1,49 @@ +/* + * notion-enhancer + * (c) 2020 dragonwocky (https://dragonwocky.me/) + * under the MIT license + */ + +'use strict'; +const fs = require('fs-extra'), + path = require('path'), + helpers = require('./helpers.js'); + +let __notion = helpers.getNotion(); +module.exports = async function (__file) { + __notion = await __notion; + __file = __file + .slice(path.resolve(__notion, 'app').length + 1) + .replace(/\\/g, '/'); + + const mods = await fs.readdir(path.resolve(__dirname, '..', 'mods')), + invalid_mods = [], + loaded_mods = []; + for (let dir of mods) { + try { + const mod = require(`../mods/${dir}/mod.js`); + if ( + !mod.id || + !mod.name || + !mod.version || + !mod.author || + !['extension', 'theme', 'core'].includes(mod.type) + ) + throw Error; + loaded_mods.push(mod.name); + } catch (err) { + invalid_mods.push(dir); + } + } + + if (__file === 'renderer/preload.js') { + if (loaded_mods.length) + console.info( + ` enhancements loaded: ${loaded_mods.join(', ')}.` + ); + if (invalid_mods.length) + console.error( + ` invalid mods found: ${invalid_mods.join(', ')}.` + ); + } +}; diff --git a/pkg/remove.js b/pkg/remove.js index 69b71da..a437caf 100644 --- a/pkg/remove.js +++ b/pkg/remove.js @@ -24,18 +24,18 @@ module.exports = async function ({ overwrite_asar, delete_data } = {}) { __notion = await __notion; // extracted asar: modded - const app_folder = path.join(__notion, 'app'); + const app_folder = path.resolve(__notion, 'app'); if (await fs.pathExists(app_folder)) { console.info(` ...removing folder ${app_folder}`); file_operations.push(fs.remove(app_folder)); } else console.warn(` * ${app_folder} not found: step skipped.`); // restoring original asar - const asar_bak = path.join(__notion, 'app.asar.bak'); + const asar_bak = path.resolve(__notion, 'app.asar.bak'); if (await fs.pathExists(asar_bak)) { console.info(' ...moving asar.app.bak to app.asar'); - if (await fs.pathExists(path.join(__notion, 'app.asar'))) { + if (await fs.pathExists(path.resolve(__notion, 'app.asar'))) { console.warn(' * app.asar already exists!'); if (overwrite_asar === undefined) { do { @@ -46,7 +46,7 @@ module.exports = async function ({ overwrite_asar, delete_data } = {}) { !['y', 'n'].includes(overwrite_asar.toLowerCase()) ); overwrite_asar = - !overwrite_asar || overwrite_asar.toLowerCase() == 'y'; + !overwrite_asar || overwrite_asar.toLowerCase() === 'y'; } console.info( overwrite_asar @@ -57,7 +57,7 @@ module.exports = async function ({ overwrite_asar, delete_data } = {}) { file_operations.push( overwrite_asar || overwrite_asar === undefined - ? fs.move(asar_bak, path.join(__notion, 'app.asar'), { + ? fs.move(asar_bak, path.resolve(__notion, 'app.asar'), { overwrite: true, }) : fs.remove(asar_bak) @@ -75,7 +75,7 @@ module.exports = async function ({ overwrite_asar, delete_data } = {}) { delete_data && !['y', 'n'].includes(delete_data.toLowerCase()) ); - delete_data = !delete_data || delete_data.toLowerCase() == 'y'; + delete_data = !delete_data || delete_data.toLowerCase() === 'y'; } console.info( delete_data @@ -84,7 +84,7 @@ module.exports = async function ({ overwrite_asar, delete_data } = {}) { ); if (delete_data) { file_operations.push(fs.remove(helpers.data_folder)); - } else fs.remove(path.join(helpers.data_folder, 'version.txt')); + } else fs.remove(path.resolve(helpers.data_folder, 'version.txt')); } else console.warn(` * ${helpers.data_folder} not found: step skipped.`); await Promise.all(file_operations); diff --git a/pkg/store.js b/pkg/store.js index a1cb81b..898a96b 100644 --- a/pkg/store.js +++ b/pkg/store.js @@ -11,7 +11,7 @@ const path = require('path'), // a wrapper for accessing data stored in a JSON file. module.exports = (namespace, defaults = {}) => { - namespace = path.join(data_folder, namespace + '.json'); + namespace = path.resolve(data_folder, namespace + '.json'); fs.ensureDirSync(data_folder); const getData = () => ({ ...defaults, ...getJSON(namespace) }); diff --git a/yarn.lock b/yarn.lock index 4c61620..c2f36d9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,20 @@ # yarn lockfile v1 +"@jsdevtools/file-path-filter@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@jsdevtools/file-path-filter/-/file-path-filter-3.0.1.tgz#7fa96b4c0d41a2ec6231584a9f90f4e9442d24eb" + integrity sha512-7kOhYFyidfB9fZf2LLkMD/AntpFnxzWW614H4hLvWe3ENE9NN32cZQeF0Ychjg6h91XaUYbqQx2D/GtXJ05/Ew== + dependencies: + glob-to-regexp "^0.4.1" + +"@jsdevtools/readdir-enhanced@6.0.3": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@jsdevtools/readdir-enhanced/-/readdir-enhanced-6.0.3.tgz#0916be64d6677dd98b8bf6fd38e6e1057d31ada2" + integrity sha512-fDg/Qk6+vaMDGW3P4DN+i3Kx/t1Hk2FgKcxynA/N9a7hZZp3oBG55ia8lZP9CPWvIUDmOwIyDOo2/k9lTB2ciQ== + dependencies: + "@jsdevtools/file-path-filter" "^3.0.0" + "@types/glob@^7.1.1": version "7.1.3" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" @@ -85,6 +99,11 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" @@ -143,6 +162,13 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= +readdir-enhanced@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/readdir-enhanced/-/readdir-enhanced-6.0.3.tgz#68996e119d62852ca48ea1148a8bab066df61bea" + integrity sha512-il2lsGAN3AzufAKnuqFdEz6TVdCCuQEpSQ96ntgUlCCRZwbz9A2VFLph0BqXQ/Sw1/Rb1wTrkbtsJpNEjP7wuA== + dependencies: + "@jsdevtools/readdir-enhanced" "6.0.3" + universalify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d"