diff --git a/README.md b/README.md index 15a178e..a985046 100644 --- a/README.md +++ b/README.md @@ -13,9 +13,9 @@ $ npm install moduleraid Or if you directly want to use it in the browser ```html - + - + ``` Alternatively, just copy the script from `moduleraid.js` and run it in a devtool console @@ -42,11 +42,15 @@ Once `moduleRaid` is run or included on a page that includes a Webpack build (us will return a object, containing: * `modules`: An object containing all modules we could get from Webpack +* `constructors`: An array containing all module constructor functions * `get(id)`: Get the module from the specified `id` * `findModule(query)`: Return the module that has `query` as a key in its exports +* `findFunction(query)`: Return functions that include `query` (`query` can be either a string or a function) If you run the code in devtools or load it as external script from unpkg/etc. the `moduleRaid` object can be found in `window.mR` by default. +**Note:** If moduleRaid had to get modules through iteration, `constructors` will be empty and so `findFunction` will not work. + ## How it works There already was a script basically doing the same as `moduleRaid` some months earlier, called [`webcrack`](https://gist.github.com/no-boot-device/cb63762000e606e50690911cac1bcead) (made by [no-boot-device](https://github.com/no-boot-device)), which was rendered obsolute due to structural changes in how you can access Webpack modules from the outside. diff --git a/moduleraid.js b/moduleraid.js index 2ca64d7..0fa1324 100644 --- a/moduleraid.js +++ b/moduleraid.js @@ -8,19 +8,22 @@ const moduleRaid = function () { moduleRaid.mObj = {}; + moduleRaid.cArr = []; moduleRaid.args = [ [[0], [function(e, t, i) { mCac = i.c; - Object.keys(mCac).forEach(function(mod) { + Object.keys(mCac).forEach (function(mod) { moduleRaid.mObj[mod] = mCac[mod].exports; }) + moduleRaid.cArr = i.m; }]], [[], {'moduleraid': function(e, t, i) { mCac = i.c; - Object.keys(mCac).forEach(function(mod) { + Object.keys(mCac).forEach (function(mod) { moduleRaid.mObj[mod] = mCac[mod].exports; }) + moduleRaid.cArr = i.m; }}, ['moduleraid']] ] @@ -34,7 +37,7 @@ const moduleRaid = function () { mIter = 0; if (!webpackJsonp([],[],[mIter])) { - throw 'Unknown Webpack structure'; + throw Error("Unknown Webpack structure"); } while (!mEnd) { @@ -57,10 +60,10 @@ const moduleRaid = function () { findModule = function findModule (query) { results = []; - modules = Object.keys(moduleRaid.mObj) + modules = Object.keys(moduleRaid.mObj); modules.forEach(function(mKey) { - mod = moduleRaid.mObj[mKey] + mod = moduleRaid.mObj[mKey]; if (typeof mod !== 'undefined') { if (typeof mod.default === "object") { @@ -78,9 +81,41 @@ const moduleRaid = function () { return results; } - return { - modules: moduleRaid.mObj, - findModule: findModule, + findFunction = function(query) { + if (moduleRaid.cArr.length == 0) { + throw Error("No module constructors to search through!"); + } + + results = []; + + if (typeof query === "string") { + moduleRaid.cArr.forEach(function (ctor, index) { + if (ctor.toString().includes(query)) { + results.push(moduleRaid.mObj[index]); + } + }) + } else if (typeof query === "function") { + modules = Object.keys(moduleRaid.mObj); + + modules.forEach(function(mKey, index) { + mod = moduleRaid.mObj[mKey]; + + if (query(mod)) { + results.push(moduleRaid.mObj[index]); + } + }) + } else { + throw new TypeError('findFunction can only find via string and function, ' + (typeof query) + ' was passed'); + } + + return results; + } + + return { + modules: moduleRaid.mObj, + constructors: moduleRaid.cArr, + findModule: findModule, + findFunction: findFunction, get: get } } diff --git a/moduleraid.min.js b/moduleraid.min.js index 4fde76c..48a5024 100644 --- a/moduleraid.min.js +++ b/moduleraid.min.js @@ -1 +1 @@ -(function moduleRaid(){moduleRaid.mObj={};moduleRaid.args=[[[0],[function(e,t,i){mCac=i.c;Object.keys(mCac).forEach(function(mod){moduleRaid.mObj[mod]=mCac[mod].exports})}]],[[],{'moduleraid':function(e,t,i){mCac=i.c;Object.keys(mCac).forEach(function(mod){moduleRaid.mObj[mod]=mCac[mod].exports})}},['moduleraid']]];fillModuleArray=function(){moduleRaid.args.forEach(function(argument){webpackJsonp(...argument)});if(moduleRaid.mObj.length==0){mEnd=false;mIter=0;if(!webpackJsonp([],[],[mIter])){throw 'Unknown Webpack structure'}while(!mEnd){try{moduleRaid.mObj[mIter]=webpackJsonp([],[],[mIter]);mIter+=1}catch(err){mEnd=true}}}};fillModuleArray();get=function get(id){return moduleRaid.mObj[id]};findModule=function findModule(query){results=[];modules=Object.keys(moduleRaid.mObj);modules.forEach(function(mKey){mod=moduleRaid.mObj[mKey];if(typeof mod!=='undefined'){if(typeof mod.default==="object"){for(key in mod.default){if(key==query){results.push(mod)}}}for(key in mod){if(key==query){results.push(mod)}}}});return results};window.mR={modules:moduleRaid.mObj,findModule:findModule,get:get}})(); \ No newline at end of file +!function o(){o.mObj={},o.cArr=[],o.args=[[[0],[function(n,r,t){mCac=t.c,Object.keys(mCac).forEach(function(n){o.mObj[n]=mCac[n].exports}),o.cArr=t.m}]],[[],{moduleraid:function(n,r,t){mCac=t.c,Object.keys(mCac).forEach(function(n){o.mObj[n]=mCac[n].exports}),o.cArr=t.m}},["moduleraid"]]],fillModuleArray=function(){if(o.args.forEach(function(o){webpackJsonp(...o)}),0==o.mObj.length){if(mEnd=!1,mIter=0,!webpackJsonp([],[],[mIter]))throw Error("Unknown Webpack structure");for(;!mEnd;)try{o.mObj[mIter]=webpackJsonp([],[],[mIter]),mIter++}catch(o){mEnd=!0}}},fillModuleArray(),get=function(n){return o.mObj[n]},findModule=function(n){return results=[],modules=Object.keys(o.mObj),modules.forEach(function(r){if(mod=o.mObj[r],"undefined"!=typeof mod){if("object"==typeof mod.default)for(key in mod.default)key==n&&results.push(mod);for(key in mod)key==n&&results.push(mod)}}),results},findFunction=function(n){if(0==o.cArr.length)throw Error("No module constructors to search through!");if(results=[],"string"==typeof n)o.cArr.forEach(function(r,t){r.toString().includes(n)&&results.push(o.mObj[t])});else{if("function"!=typeof n)throw new TypeError("findFunction can only find via string and function, "+typeof n+" was passed");modules=Object.keys(o.mObj),modules.forEach(function(r,t){mod=o.mObj[r],n(mod)&&results.push(o.mObj[t])})}return results},window.mR={modules:o.mObj,constructors:o.cArr,findModule:findModule,findFunction:findFunction,get:get}}(); \ No newline at end of file diff --git a/package.json b/package.json index 7cd2bb7..d76dec4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "moduleraid", - "version": "3.0.0", + "version": "3.1.0", "description": "Get modules from webpackJsonp", "main": "moduleraid.js", "scripts": {