Bug 1472821 - Support array of String for lazyRequireGetter r=nchevobbe,rcaliman

Differential Revision: https://phabricator.services.mozilla.com/D85268
This commit is contained in:
Julian Descottes 2020-08-03 05:43:59 +00:00
parent 419e9ccc2c
commit 3af62a1e27
9 changed files with 161 additions and 72 deletions

View File

@ -16,9 +16,17 @@ global.loader = {
const module = fn();
global[name] = module;
},
lazyRequireGetter: (context, name, module, destructure) => {
const value = destructure ? require(module)[name] : require(module || name);
global[name] = value;
lazyRequireGetter: (context, names, module, destructure) => {
if (!Array.isArray(names)) {
names = [names];
}
for (const name of names) {
const value = destructure
? require(module)[name]
: require(module || name);
global[name] = value;
}
},
};

View File

@ -16,28 +16,34 @@ global.loader = {
const module = fn();
global[name] = module;
},
lazyRequireGetter: (obj, property, module, destructure) => {
Object.defineProperty(obj, property, {
get: () => {
// Redefine this accessor property as a data property.
// Delete it first, to rule out "too much recursion" in case obj is
// a proxy whose defineProperty handler might unwittingly trigger this
// getter again.
delete obj[property];
const value = destructure
? require(module)[property]
: require(module || property);
Object.defineProperty(obj, property, {
value,
writable: true,
configurable: true,
enumerable: true,
});
return value;
},
configurable: true,
enumerable: true,
});
lazyRequireGetter: (obj, properties, module, destructure) => {
if (!Array.isArray(properties)) {
properties = [properties];
}
for (const property of properties) {
Object.defineProperty(obj, property, {
get: () => {
// Redefine this accessor property as a data property.
// Delete it first, to rule out "too much recursion" in case obj is
// a proxy whose defineProperty handler might unwittingly trigger this
// getter again.
delete obj[property];
const value = destructure
? require(module)[property]
: require(module || property);
Object.defineProperty(obj, property, {
value,
writable: true,
configurable: true,
enumerable: true,
});
return value;
},
configurable: true,
enumerable: true,
});
}
},
lazyImporter: () => {},
};

View File

@ -60,7 +60,7 @@ global.loader = {
global[name] = fn();
} catch (_) {}
},
lazyRequireGetter: (context, name, _path, destruct) => {
lazyRequireGetter: (context, names, _path, destruct) => {
if (
!_path ||
_path.startsWith("resource://") ||
@ -81,9 +81,15 @@ global.loader = {
"devtools/client/shared/focus",
];
if (!excluded.includes(_path)) {
// $FlowIgnore
const module = require(_path);
global[name] = destruct ? module[name] : module;
if (!Array.isArray(names)) {
names = [names];
}
for (const name of names) {
// $FlowIgnore
const module = require(_path);
global[name] = destruct ? module[name] : module;
}
}
},
};

View File

@ -11,9 +11,17 @@ global.loader = {
const module = fn();
global[name] = module;
},
lazyRequireGetter: (context, name, module, destructure) => {
const value = destructure ? require(module)[name] : require(module || name);
global[name] = value;
lazyRequireGetter: (context, names, module, destructure) => {
if (!Array.isArray(names)) {
names = [names];
}
for (const name of names) {
const value = destructure
? require(module)[name]
: require(module || name);
global[name] = value;
}
},
};

View File

@ -16,8 +16,16 @@ global.loader = {
const module = fn();
global[name] = module;
},
lazyRequireGetter: (context, name, module, destructure) => {
const value = destructure ? require(module)[name] : require(module || name);
global[name] = value;
lazyRequireGetter: (context, names, module, destructure) => {
if (!Array.isArray(names)) {
names = [names];
}
for (const name of names) {
const value = destructure
? require(module)[name]
: require(module || name);
global[name] = value;
}
},
};

View File

@ -213,21 +213,38 @@ BrowserLoaderBuilder.prototype = {
* module. This enables delaying importing modules until the module is
* actually used.
*
* @param Object obj
* Several getters can be defined at once by providing an array of
* properties and enabling destructuring.
*
* @param { Object } obj
* The object to define the property on.
* @param String property
* The property name.
* @param String module
* @param { String | Array<String> } properties
* String: Name of the property for the getter.
* Array<String>: When destructure is true, properties can be an array of
* strings to create several getters at once.
* @param { String } module
* The module path.
* @param Boolean destructure
* @param { Boolean } destructure
* Pass true if the property name is a member of the module's exports.
*/
lazyRequireGetter: function(obj, property, module, destructure) {
loader.lazyGetter(obj, property, () => {
return destructure
? this.require(module)[property]
: this.require(module || property);
});
lazyRequireGetter: function(obj, properties, module, destructure) {
if (Array.isArray(properties) && !destructure) {
throw new Error(
"Pass destructure=true to call lazyRequireGetter with an array of properties"
);
}
if (!Array.isArray(properties)) {
properties = [properties];
}
for (const property of properties) {
loader.lazyGetter(obj, property, () => {
return destructure
? this.require(module)[property]
: this.require(module || property);
});
}
},
};

View File

@ -46,12 +46,7 @@ global.loader = {
global[name] = fn();
} catch (_) {}
},
lazyRequireGetter: (context, name, path, destruct) => {
if (path === "devtools/shared/async-storage") {
global[
name
] = require("devtools/client/webconsole/test/node/fixtures/async-storage");
}
lazyRequireGetter: (context, names, path, destruct) => {
const excluded = [
"Debugger",
"devtools/shared/event-emitter",
@ -64,8 +59,20 @@ global.loader = {
"devtools/client/shared/focus",
];
if (!excluded.includes(path)) {
const module = require(path);
global[name] = destruct ? module[name] : module;
if (!Array.isArray(names)) {
names = [names];
}
for (const name of names) {
if (path === "devtools/shared/async-storage") {
global[
name
] = require("devtools/client/webconsole/test/node/fixtures/async-storage");
} else {
const module = require(path);
global[name] = destruct ? module[name] : module;
}
}
}
},
};

View File

@ -165,21 +165,38 @@ function defineLazyModuleGetter(object, name, resource) {
* module. This enables delaying importing modules until the module is
* actually used.
*
* @param Object obj
* Several getters can be defined at once by providing an array of
* properties and enabling destructuring.
*
* @param { Object } obj
* The object to define the property on.
* @param String property
* The property name.
* @param String module
* @param { String | Array<String> } properties
* String: Name of the property for the getter.
* Array<String>: When destructure is true, properties can be an array of
* strings to create several getters at once.
* @param { String } module
* The module path.
* @param Boolean destructure
* @param { Boolean } destructure
* Pass true if the property name is a member of the module's exports.
*/
function lazyRequireGetter(obj, property, module, destructure) {
defineLazyGetter(obj, property, () => {
return destructure
? require(module)[property]
: require(module || property);
});
function lazyRequireGetter(obj, properties, module, destructure) {
if (Array.isArray(properties) && !destructure) {
throw new Error(
"Pass destructure=true to call lazyRequireGetter with an array of properties"
);
}
if (!Array.isArray(properties)) {
properties = [properties];
}
for (const property of properties) {
defineLazyGetter(obj, property, () => {
return destructure
? require(module)[property]
: require(module || property);
});
}
}
// List of pseudo modules exposed to all devtools modules.

View File

@ -354,13 +354,25 @@ var loader = {
lazyServiceGetter: function() {
throw new Error("Can't import XPCOM service from worker thread!");
},
lazyRequireGetter: function(obj, property, module, destructure) {
Object.defineProperty(obj, property, {
get: () =>
destructure
? worker.require(module)[property]
: worker.require(module || property),
});
lazyRequireGetter: function(obj, properties, module, destructure) {
if (Array.isArray(properties) && !destructure) {
throw new Error(
"Pass destructure=true to call lazyRequireGetter with an array of properties"
);
}
if (!Array.isArray(properties)) {
properties = [properties];
}
for (const property of properties) {
Object.defineProperty(obj, property, {
get: () =>
destructure
? worker.require(module)[property]
: worker.require(module || property),
});
}
},
};