// ==UserScript==
// @name Webpack Hacks
// @namespace [email protected]
// @description __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED
// @author xymopen
// @version 1.0.0
// @grant none
// @license BSD-3-Clause
// ==/UserScript==
const WebpackHacks = {
RequireProperties: Object.freeze({
/** the bundle public path */
publicPath: "p",
/** the module id of the entry point */
entryModuleId: "s",
/** the module cache */
moduleCache: "c",
/** the module functions */
moduleFactories: "m",
/** the chunk ensure function */
ensureChunk: "e",
/** an object with handlers to ensure a chunk */
ensureChunkHandlers: "f",
/** the chunk prefetch function */
prefetchChunk: "E",
/** an object with handlers to prefetch a chunk */
prefetchChunkHandlers: "F",
/** the chunk preload function */
preloadChunk: "G",
/** an object with handlers to preload a chunk */
preloadChunkHandlers: "H",
/** the exported property define getters function */
definePropertyGetters: "d",
/** define compatibility on export */
makeNamespaceObject: "r",
/** create a fake namespace object */
createFakeNamespaceObject: "t",
/** compatibility get default export */
compatGetDefaultExport: "n",
/** harmony module decorator */
harmonyModuleDecorator: "hmd",
/** node.js module decorator */
nodeModuleDecorator: "nmd",
/** the webpack hash */
getFullHash: "h",
/** an object containing all installed WebAssembly.Instance export objects keyed by module id */
wasmInstances: "w",
/** instantiate a wasm instance from module exports object, id, hash and importsObject */
instantiateWasm: "v",
/** the uncaught error handler for the webpack runtime */
uncaughtErrorHandler: "oe",
/** the script nonce */
scriptNonce: "nc",
/**
* function to load a script tag.
* Arguments: (url: string, done: (event) => void), key?: string | number, chunkId?: string | number) => void
* done function is called when loading has finished or timeout occurred.
* It will attach to existing script tags with data-webpack == uniqueName + ":" + key or src == url.
*/
loadScript: "l",
/**
* function to promote a string to a TrustedScript using webpack's Trusted
* Types policy
* Arguments: (script: string) => TrustedScript
*/
createScript: "ts",
/**
* function to promote a string to a TrustedScriptURL using webpack's Trusted
* Types policy
* Arguments: (url: string) => TrustedScriptURL
*/
createScriptUrl: "tu",
/**
* function to return webpack's Trusted Types policy
* Arguments: () => TrustedTypePolicy
*/
getTrustedTypesPolicy: "tt",
/** the chunk name of the chunk with the runtime */
chunkName: "cn",
/** the runtime id of the current runtime */
runtimeId: "j",
/** the filename of the script part of the chunk */
getChunkScriptFilename: "u",
/** the filename of the css part of the chunk */
getChunkCssFilename: "k",
/** the filename of the script part of the hot update chunk */
getChunkUpdateScriptFilename: "hu",
/** the filename of the css part of the hot update chunk */
getChunkUpdateCssFilename: "hk",
/**
* startup signal from runtime
* This will be called when the runtime chunk has been loaded.
*/
startup: "x",
/**
* method to startup an entrypoint with needed chunks.
* Signature: (moduleId: Id, chunkIds: Id[]) => any.
* Returns the exports of the module or a Promise
*/
startupEntrypoint: "X",
/**
* register deferred code, which will run when certain
* chunks are loaded.
* Signature: (chunkIds: Id[], fn: () => any, priority: int >= 0 = 0) => any
* Returned value will be returned directly when all chunks are already loaded
* When (priority & 1) it will wait for all other handlers with lower priority to
* be executed before itself is executed
*/
onChunksLoaded: "O",
/**
* method to install a chunk that was loaded somehow
* Signature: ({ id, ids, modules, runtime }) => void
*/
externalInstallChunk: "C",
/** interceptor for module executions */
interceptModuleExecution: "i",
/** the global object */
global: "g",
/** an object with all share scopes */
shareScopeMap: "S",
/**
* The sharing init sequence function (only runs once per share scope).
* Has one argument, the name of the share scope.
* Creates a share scope if not existing
*/
initializeSharing: "I",
/** The current scope when getting a module from a remote */
currentRemoteGetScope: "R",
/** the filename of the HMR manifest */
getUpdateManifestFilename: "hmrF",
/** function downloading the update manifest */
hmrDownloadManifest: "hmrM",
/** array with handler functions to download chunk updates */
hmrDownloadUpdateHandlers: "hmrC",
/** object with all hmr module data for all modules */
hmrModuleData: "hmrD",
/** array with handler functions when a module should be invalidated */
hmrInvalidateModuleHandlers: "hmrI",
/** the prefix for storing state of runtime modules when hmr is enabled */
hmrRuntimeStatePrefix: "hmrS",
/** the AMD define function */
amdDefine: "amdD",
/** the AMD options */
amdOptions: "amdO",
/** the System polyfill object */
system: "System",
/**
* the shorthand for Object.prototype.hasOwnProperty
* using of it decreases the compiled bundle size
*/
hasOwnProperty: "o",
/** the System.register context object */
systemContext: "y",
/** the baseURI of current document */
baseURI: "b",
/** a RelativeURL class when relative URLs are used */
relativeUrl: "U",
/**
* Creates an async module. The body function must be a async function.
* "module.exports" will be decorated with an AsyncModulePromise.
* The body function will be called.
* To handle async dependencies correctly do this: "([a, b, c] = await handleDependencies([a, b, c]));".
* If "hasAwaitAfterDependencies" is truthy, "handleDependencies()" must be called at the end of the body function.
* Signature: function(
* module: Module,
* body: (handleDependencies: (deps: AsyncModulePromise[]) => Promise<any[]> & () => void,
* hasAwaitAfterDependencies?: boolean
* ) => void
*/
asyncModule: "a",
}),
/**
* @param {string} chunkLoadingGlobal
*/
interceptChunkLoading: (unsafeWindow, chunkLoadingGlobal, callback) => {
/** @type {WebpackChunk[]} */
const webpackChunk = unsafeWindow[chunkLoadingGlobal];
let webpackChunkLoading = null;
let proto = null;
function onChunksLoaded(...args) {
callback(...args);
return webpackChunkLoading.apply(this, args);
};
if (Object.hasOwn(webpackChunk, "push")) {
// We are called after runtime initializing
webpackChunkLoading = webpackChunk.push;
webpackChunk.push = onChunksLoaded;
} else {
// We are called before runtime initializing
proto = Object.getPrototypeOf(webpackChunk);
Object.setPrototypeOf(webpackChunk, Object.create(proto, Object.getOwnPropertyDescriptors({
get push() {
return proto.push;
},
set push(value) {
Object.setPrototypeOf(webpackChunk, proto);
proto = null;
webpackChunkLoading = value;
webpackChunk.push = onChunksLoaded;
}
})));
}
return () => {
if (webpackChunkLoading !== null) {
webpackChunk.push = webpackChunkLoading;
} else if (proto !== null) {
Object.setPrototypeOf(webpackChunk, proto);
}
};
},
/**
* @param {string} chunkLoadingGlobal
* @param {PropertyKey} chunkId
* @param {WebpackRuntimeChunkCallback} callback
*/
loadFakeChink: (unsafeWindow, chunkLoadingGlobal, chunkId, callback) => {
/** @type {WebpackChunk[]} */
let webpackChunk;
if (Object.hasOwn(unsafeWindow, chunkLoadingGlobal)) {
webpackChunk = unsafeWindow[chunkLoadingGlobal];
} else {
webpackChunk = unsafeWindow[chunkLoadingGlobal] = [];
}
const fakeChunk = [[chunkId], [], (__webpack_require__) => {
// Based on `APIPlugin` and `RuntimeGlobals`
const {
p: __webpack_public_path__,
b: __webpack_base_uri__,
m: __webpack_modules__,
e: __webpack_chunk_load__,
nc: __webpack_nonce__,
cn: __webpack_chunkname__,
u: __webpack_get_script_filename__,
j: __webpack_runtime_id__,
y: __system_context__,
S: __webpack_share_scopes__,
I: __webpack_init_sharing__,
} = __webpack_require__;
const __webpack_hash__ = __webpack_require__.h?.();
callback({
__webpack_require__,
__webpack_public_path__,
__webpack_base_uri__,
__webpack_modules__,
__webpack_chunk_load__,
__webpack_nonce__,
__webpack_chunkname__,
__webpack_get_script_filename__,
__webpack_runtime_id__,
__system_context__,
__webpack_share_scopes__,
__webpack_init_sharing__,
__webpack_hash__,
});
Promise.resolve().then(() => {
const i = webpackChunk.indexOf(fakeChunk);
if (i >= 0) {
webpackChunk.splice(i, 1);
}
});
}];
webpackChunk.push(fakeChunk);
},
};
/**
* @typedef WebpackRuntimeContext
* @property {string} __webpack_require__ - the internal require function
* @property {string} __webpack_public_path__ - the bundle public path
* @property {string} __webpack_base_uri__ - the baseURI of current document
* @property {() => any[]} __webpack_modules__ - the module functions
* @property {string} __webpack_chunk_load__ - the chunk ensure function
* @property {string} __webpack_nonce__ - the script nonce
* @property {string} __webpack_chunkname__ - the chunk name of the chunk with the runtime
* @property {string} __webpack_get_script_filename__ - the filename of the script part of the chunk
* @property {string} __webpack_runtime_id__ - the runtime id of the current runtime
* @property {string} __system_context__ - the System.register context object
* @property {string} __webpack_share_scopes__ - an object with all share scopes
* @property {string} __webpack_init_sharing__ - The sharing init sequence function (only runs once per share scope).
* Has one argument, the name of the share scope.
* Creates a share scope if not existing
* @property {string} [__webpack_hash__] - the webpack hash
*/
/**
* @callback WebpackRuntimeChunkCallback
* @param {WebpackRuntimeContext} context
*/
/**
* @typedef {[chunkIds: string[], moreModules: Record<string, () => void>, runtime?: () => void]} WebpackChunk
*/