nodejs / node

Node.js JavaScript runtime ✨🐢🚀✨
https://nodejs.org
Other
105.7k stars 28.68k forks source link

discuss: proposed standardization of `global` by tc-39 #8810

Closed jasnell closed 5 years ago

jasnell commented 7 years ago

@nodejs/ctc ... there is a proposal on the table in TC-39 to add more standardization around global. See https://github.com/tc39/proposal-global/blob/master/spec.md for details.

currently, the spec defines the data property as configurable but non-enumerable/non-writable. The committee is considering going ahead and making it writable. The key question for us is whether the global data property has to enumerable. It's extremely unlikely that it would be an issue but just to make sure.

@ChALkeR ... would you be able to run some analysis about how existing modules are interacting with global?

/cc @ljharb

Fishrock123 commented 7 years ago

Uh, why does TC39 want it un-enumerable?

I think we interact with enumeration on it somewhere, probably at least the autocomplete in the REPL?

jasnell commented 7 years ago

To be clear, I believe it's the global data property itself that would be non-enumerable... that is:

Object.getOwnPropertyDescriptor(global, 'global');

As far as I understand it, and @ljharb could likely go into it in more detail than I, but non-enumerable is a default choice for anything new that the committee adds. There's no technical reason that is has to be non-enumerable so if Node.js needs it that way, then we just need to let the committee know.

That said, the data property is configurable so even if the committee leaves it as non-enumerable, Node.js is perfectly within it's rights to switch that to enumerable.

ljharb commented 7 years ago

The idea is that when new things are added, they don't newly appear in enumerations. This applies to browsers, because node already has it enumerable.

If node uses Object.getOwnPropertyNames, or Reflect.ownKeys, or Object.getOwnPropertyDescriptor(s) to reflect, then enumerability won't matter - it's only be a problem if you're using Object.keys/for, or Object.assign.

trevnorris commented 7 years ago

Would they happen to also want to make it something like a Proxy, or could our current implementation essentially stay the same?

jasnell commented 7 years ago

Current impl should be able to stay the same.

On Wednesday, September 28, 2016, Trevor Norris notifications@github.com wrote:

Would they happen to also want to make it something like a Proxy, or could our current implementation essentially stay the same?

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/nodejs/node/issues/8810#issuecomment-250205002, or mute the thread https://github.com/notifications/unsubscribe-auth/AAa2eR1U_kRszauRWxmoVPSnBnosQ8eJks5quomzgaJpZM4KINsh .

ChALkeR commented 7 years ago

@jasnell, not sure what I should look at concerning the global usage. Do you mean iterating over global or something else?

ljharb commented 7 years ago

@ChALkeR anything that relies on enumerability: iterating over it, calling Object.keys or Object.assign on it, etc.

ChALkeR commented 7 years ago

Upd: the first search contained a mistype, I deleted it entirely. A revised version will follow in a few minutes.

ChALkeR commented 7 years ago

@ljharb, @jasnell

Done, based on the 2016-10-22 dataset.

Note that some of the global variables might be defined locally.

These are not sorted based on the downloads count yet.

Overall, there are 413 matches in 247 packages for the listed usecases.

Iterating over it

Regex: for .*\(.* (in|of) global[^[_a-zA-Z.] + manual filtering to exclude false positives.

Notice that at least two matches are inside comments, I have not excluded those.

ark-0.5.2.tgz/src/module.coffee:409:      for (var k in global) {
require-ts-0.2.2.tgz/src/RequireTS.ts:33:    for (var k in global) {
tsi-0.3.0.tgz/src/tsi.ts:35:  for (var g in global) context[g] = global[g];
3vot-db-0.0.1.tgz/plv8-fill/index.js:88:  for (k in global) {
OperatorUI-0.0.1.tgz/html/files/js/dragula.js:894:for (eventname in global) {
Web_GUI_Core-0.0.1.tgz/html/files/js/dragula.js:894:for (eventname in global) {
allone-0.5.5.tgz/modules/spm/lib/core/plugin_config.js:263:  for (var k in global) {
alloynuclear-0.4.5.tgz/asset/qunit-1.23.1.js:1267:      for ( var key in global ) {
antiglobal-0.1.2.tgz/index.js:92:   for (var key in global) {
appex-0.6.9.tgz/index.js:5739:                for (var n in global) {
arcane-coffee-import-1.0.8.tgz/lib/import.js:72:        // for (var k in global) {
ark-0.5.2.tgz/src/api/module.js:392:      for (var k in global) {
automizy-email-editor-1.0.0.tgz/.bower/qunit/qunit/qunit.js:1168:       for ( var key in global ) {
automizy-email-editor-1.0.0.tgz/.bower/qunit/src/test.js:467:       for ( var key in global ) {
automizy-js-api-1.0.0.tgz/external/qunit/qunit/qunit.js:1168:       for ( var key in global ) {
automizy-js-api-1.0.0.tgz/external/qunit/src/test.js:467:       for ( var key in global ) {
autorequire-0.3.4.tgz/lib/loader_behavior/v0.4.0.js:35:      for (k in global) {
autorequire-0.3.4.tgz/lib/loader_behavior/v0.5.1.js:35:      for (k in global) {
autorequire-0.3.4.tgz/lib/loader_behavior/v0.5.2.js:40:      for (k in global) {
autorequire-0.3.4.tgz/lib/loader_behavior/v0.6.10.js:40:      for (k in global) {
backbone.ribs-1.0.2.tgz/unitTests/qunit-1.20.0.js:1284:         for ( var key in global ) {
bamreader-0.2.1.tgz/lib/bamreader.js:463:      for (k in global) {
barista-fiddle-0.0.3.tgz/fiddle/components/tern/typescript.js:14:for (var prop in global) box[prop] = global[prop];
bellhop-iframe-1.2.0.tgz/components/qunit/qunit/qunit.js:1284:      for ( var key in global ) {
bevy-0.4.9.tgz/node-http-proxy/test/core/common.js:133:  for (var x in global) {
biojs-vis-blast-0.1.5.tgz/node/lib/module.js:415:      for (var k in global) {
biojs-vis-blast-0.1.5.tgz/node/lib/repl.js:350:    for (var i in global) context[i] = global[i];
biojs-vis-blast-0.1.5.tgz/node/test/common.js:169:  for (var val in global)
bizubee-node-0.0.3.tgz/src/resolver.js:13:  for (var key in global) {
browsix-0.1.0.tgz/node/lib/repl.js:484:    for (var i in global) context[i] = global[i];
build-tools-5.0.0.tgz/src/test/qunit/qunit.js:1285:         for ( var key in global ) {
c4-1.0.1.tgz/lib/c4.js:59:    for ( var i in global ) {
capital-framework-3.6.1.tgz/test/lib/qunit/qunit.js:1284:       for ( var key in global ) {
catest-6.2.47.tgz/autocomplete/tern/lib/typescript.js:14:for (var prop in global) box[prop] = global[prop];
chained-emitter-0.1.4.tgz/test/common.js:101:  for (var x in global) {
client-management-0.1.26.tgz/plugins/angular-dragula.js:964:for (eventname in global) {
commonjs-everywhere-0.9.7.tgz/node/lib/module.js:411:      for (var k in global) {
commonjs-everywhere-0.9.7.tgz/node/lib/repl.js:324:    for (var i in global) context[i] = global[i];
crossvent-1.5.5.tgz/src/eventmap.js:7:for (eventname in global) {
cuckoo-0.0.5.tgz/cuckoo.js:44:  for (key in global) {
datawatcher-1.0.0.tgz/tests/qunit.js:1327:      for ( var key in global ) {
dune-0.2.1.tgz/lib/dune2.js:117:      for (var k in global) {
eartraining-0.0.1.tgz/dependencies/vexflow-master/tests/support/qunit.js:1168:      for ( var key in global ) {
epub.js-0.2.14.tgz/books/16a7f7fe0c76c96869b2e0d62cc49f8e/theme/html/epub.js:5894:  for (var attr in global) {
epub.js-0.2.14.tgz/src/renderer.js:246: for (var attr in global) {
epubjs-0.2.14.tgz/books/16a7f7fe0c76c96869b2e0d62cc49f8e/theme/html/epub.js:5894:  for (var attr in global) {
epubjs-0.2.14.tgz/src/renderer.js:246:  for (var attr in global) {
fg-ajax-include-1.0.0.tgz/libs/qunit.js:1267:       for ( var key in global ) {
flush-all-0.1.1.tgz/node-v0.13/lib/module.js:417:      for (var k in global) {
flush-all-0.1.1.tgz/node-v0.13/lib/repl.js:353:    for (var i in global) context[i] = global[i];
flush-all-0.1.1.tgz/node-v0.13/test/common.js:181:  for (var val in global)
fortress-0.0.1.tgz/index.js:63:  for (var key in global) {
generator-sowell-ed-0.4.4.tgz/generators/qunit/templates/qunit-1.23.1.js:1267:      for ( var key in global ) {
geolinks-0.0.15.tgz/Tests/qunit.js:1168:        for ( var key in global ) {
google-protobuf-alpha-3.0.0-alpha.8.tgz/commonjs/export_asserts.js:26:for (var key in global) {
haibu-carapace-other-0.0.2.tgz/lib/module.js:504:           for (var k in global) {
hot-repl-0.2.5.tgz/hot-repl.js:34:    for (var k in global) {
hot-repl-0.2.5.tgz/hot-repl2.js:13:for (var k in global) {
http-proxy-zz-0.10.5.tgz/test/core/common.js:133:  for (var x in global) {
httpp-proxy-0.10.3.tgz/test/core/common.js:133:  for (var x in global) {
ice-framework-1.0.0.tgz/Security/Sandbox.js:33:         for (var key in global)
impact-crater-0.0.3.tgz/templates/minimal/impact/lib/plugins/server.js:117:            for (var i in global)
impact-crater-0.0.3.tgz/templates/simple-game/impact/lib/plugins/server.js:117:            for (var i in global)
iobroker.mysensors-2-2.0.5.tgz/lib/mySensors-enums.js:203:    for (var v in global) {
jack-sanity-0.4.0.tgz/lib/Sandbox.js:111:       for (var key in global) {
jaff-0.0.4.tgz/lib/MacroTransform.js:84:        for (var method in global) {
js-appcache-1.0.1.tgz/appcache.js:35:    for (key in global)
jsg-0.0.3.tgz/testdata/node_core_modules/module.js:404:      for (var k in global) {
jsg-0.0.3.tgz/testdata/node_core_modules/repl.js:349:    for (var i in global) context[i] = global[i];
jssh-0.0.8.tgz/src/reader/prompt.js:237:                    for (var cmd in global) {
jssn-1.0.4.tgz/index.js:152:    for (var key in global) {
jstophp-0.2.7.tgz/test/core.js:74:    for (var key in global) {
jui-2.0.2.tgz/lib/core.js:1236:     for (var key in global) {
jui-2.0.2.tgz/lib/core.js:1557:         for (var key in global) {
jui-chart-2.0.4.tgz/lib/core.js:1236:       for (var key in global) {
jui-chart-2.0.4.tgz/lib/core.js:1557:           for (var key in global) {
jui-core-2.0.4.tgz/js/base.js:1236:     for (var key in global) {
jui-core-2.0.4.tgz/js/base.js:1557:         for (var key in global) {
jui-grid-2.0.2.tgz/lib/core.js:1236:        for (var key in global) {
jui-grid-2.0.2.tgz/lib/core.js:1557:            for (var key in global) {
k1ngdr3w-protractor-2.2.2.tgz/lib/protractor.js:818:  for (var key in global) {
karma-uiuxengineering-jspm-3.0.4.tgz/src/files/hookSystemJS.js:26:      for (var g in global) {
limits-0.0.7.tgz/lib/index.js:17:    for (i in global) {
localeval-15.2.3.tgz/localeval.js:107:      for (var sym in global) {
localeval-15.2.3.tgz/worker.js:58:    for (var sym in global) {
localeval-browseronly-1.0.0.tgz/localeval.js:44:    for (var sym in global) {
localeval-browseronly-1.0.0.tgz/worker.js:58:    for (var sym in global) {
lucy-live-0.1.3.tgz/index.js:188:      for ( var k in global )
metafunction-0.0.10.tgz/metafunction.js:234:    for (k in global) {
metafunction-0.0.10.tgz/metafunction.js:240:    for (k in global) {
nae-sandbox-0.0.2-alpha.tgz/_source/module.js:406:      for (var k in global) {
nae-sandbox-0.0.2-alpha.tgz/lib/module.js:240:  for (var k in global) {
narwhal-0.0.2.tgz/lib/narwhal/sandbox.js:49:                for (var name in global)
narwhal-0.0.2.tgz/lib/narwhal/sandbox.js:123:                for (var name in global)
narwhal-lib-0.0.2.tgz/lib/narwhal/sandbox.js:49:                for (var name in global)
narwhal-lib-0.0.2.tgz/lib/narwhal/sandbox.js:123:                for (var name in global)
node-core-lib-0.11.11.tgz/module.js:404:      for (var k in global) {
node-core-lib-0.11.11.tgz/repl.js:349:    for (var i in global) context[i] = global[i];
node-enumjs-1.0.2.tgz/src/lib/qunit/qunit-1.19.0.js:1168:       for ( var key in global ) {
node-natives-0.10.25.tgz/module.js:411:      for (var k in global) {
node-natives-0.10.25.tgz/repl.js:324:    for (var i in global) context[i] = global[i];
node-sc-setup-1.0.0.tgz/require.js:379:      for (var k in global) {
nodefs-0.0.2.tgz/module.js:385:            for (var k in global) {
nominatim-client-1.0.1.tgz/index.js:15:    for (let i in global) {
notrace-0.2.6.tgz/lib/consumer.js:461:        for (globalProp in global) {
nova-0.2.0.tgz/lib/nova/nova.js:156:          for (var k in global) {
novacreator-bootstrap-data-grid-1.0.0.tgz/test/qunit/qunit-1.23.1.js:1267:      for ( var key in global ) {
npk-0.0.4.tgz/lib/linker.js:50:     for (var k in global) {
opabsl.opp-1.0.6.tgz/opabslNodeJsPackage.js:1006:global.set_distant = function (str,b){var l =str.split(",");var i =l.length;for (; i--; ){l[i] in global && (global[l[i]].distant = b);}};
ozero-1.0.10.tgz/ozero.js:648:                        for (var k in global) {
pathseg-1.0.2.tgz/tests/qunit/qunit-1.20.0.js:1284:     for ( var key in global ) {
persha-0.2.0.tgz/node-lib/module.js:415:      for (var k in global) {
persha-0.2.0.tgz/node-lib/repl.js:350:    for (var i in global) context[i] = global[i];
perturb-0.0.1.tgz/examples/node-events/common.js:351:  for (var val in global)
pezhu-0.0.0.tgz/Downloads/node-v0.9.11/lib/module.js:411:      for (var k in global) {
pezhu-0.0.0.tgz/Downloads/node-v0.9.11/lib/repl.js:318:    for (var i in global) context[i] = global[i];
pezhu-0.0.0.tgz/Downloads/node-v0.9.11/test/common.js:141:  for (var x in global) {
pkgdev-0.0.19.tgz/_template/test/qunit/qunit.js:1154:            for (var key in global) {
plv8-mantle-0.0.1.tgz/plv8-fill/index.js:27:  for (var k in global) {
plv8-mantle-0.0.1.tgz/util/index.js:16:  for (var k in global) {
poly-ebook-server-1.0.5.tgz/client/futurepress/js/epub.js:6255: for (var attr in global) {
portable-js-0.0.3.tgz/misc/io/repl.js:392:    for (var i in global) context[i] = global[i];
portable-js-0.0.3.tgz/misc/node/module.js:417:      for (var k in global) {
portable-js-0.0.3.tgz/misc/node/repl.js:352:    for (var i in global) context[i] = global[i];
pouchdb-http-proxy-0.10.4.tgz/test/core/common.js:133:  for (var x in global) {
protractor-4.0.9.tgz/built/browser.js:755:        for (var key in global) {
protractor-elementor-2.0.0.tgz/lib/protractor.js:688:  for (var key in global) {
protractor-redbox-2.5.1.tgz/lib/protractor.js:862:  for (var key in global) {
pry-0.6.5.tgz/lib/pry/completion.js:61:          for (key in global) {
ptimer-0.3.1.tgz/spec/browser/src/qunit.js:1284:        for ( var key in global ) {
purecalendar.js-1.0.0.tgz/tests/qunit-1.23.1.js:1267:       for ( var key in global ) {
qunitjs-2.0.1.tgz/qunit/qunit.js:1151:      for ( var key in global ) {
react-dragula-1.1.17.tgz/example/example.js:915:for (eventname in global) {
remap-0.0.2.tgz/module.js:63:        for (var k in global) {
remodal-1.1.0.tgz/libs/qunit/qunit/qunit.js:1168:       for ( var key in global ) {
remodal-1.1.0.tgz/libs/qunit/src/test.js:467:       for ( var key in global ) {
repl.js-2.3.6.tgz/repl.js:547:    for (var i in global) context[i] = global[i];
replica-js-0.1.0.tgz/mock-repl.js:321:    for (var i in global) context[i] = global[i];
replique-0.1.1.tgz/src/replique.js:47:  for (e in global) context[e] = global[e]; 
requests-0.1.7.tgz/test/large.js:1137:  for (var key in global) {
requests-0.1.7.tgz/test/large.js:5570:  for (var key in global) {
requests-0.1.7.tgz/test/large.js:10003:  for (var key in global) {
requests-0.1.7.tgz/test/large.js:14436:  for (var key in global) {
requests-0.1.7.tgz/test/large.js:18869:  for (var key in global) {
requests-0.1.7.tgz/test/large.js:23302:  for (var key in global) {
requests-0.1.7.tgz/test/large.js:27735:  for (var key in global) {
requests-0.1.7.tgz/test/large.js:32168:  for (var key in global) {
requests-0.1.7.tgz/test/large.js:36601:  for (var key in global) {
requests-0.1.7.tgz/test/large.js:41034:  for (var key in global) {
requests-0.1.7.tgz/test/large.js:45467:  for (var key in global) {
requests-0.1.7.tgz/test/large.js:49900:  for (var key in global) {
requests-0.1.7.tgz/test/large.js:54333:  for (var key in global) {
requests-0.1.7.tgz/test/large.js:58766:  for (var key in global) {
requests-0.1.7.tgz/test/large.js:63199:  for (var key in global) {
requests-0.1.7.tgz/test/large.js:67632:  for (var key in global) {
requests-0.1.7.tgz/test/large.js:72065:  for (var key in global) {
requests-0.1.7.tgz/test/large.js:76498:  for (var key in global) {
require-args-1.0.0.tgz/index.js:48:  for (var k in global) {
requireincontext-0.0.2.tgz/index.js:21:  for (var k in global) {
rhm-http-proxy-0.10.4.tgz/test/core/common.js:133:  for (var x in global) {
rtcninja-0.7.0.tgz/html-adapter/antiglobal.js:94:   for (var key in global) {
sandboxed-module-2.0.3.tgz/lib/sandboxed_module.js:109:  for (var globalKey in global) {
sandboxed-module-strict-mode-0.1.4.tgz/lib/sandboxed_module.js:90:  for (var key in global) {
sandboxed-module-strict-mode-0.1.4.tgz/test/fixture/global.js:1:for (var key in global) {
sandboxed-module-strict-mode-0.1.4.tgz/test/integration/test-global.js:14:  for (var key in global) {
scoff-0.0.1.tgz/index.js:98:  for (var key in global) {
seafish-http-proxy-meteor-0.1.4.tgz/test/core/common.js:133:  for (var x in global) {
simpli.js-1.2.4.tgz/unitTest/1.2.1/js/qunit-1.20.0.js:1284:        for ( var key in global ) {
simpli.js-1.2.4.tgz/unitTest/1.2.3/js/qunit-1.20.0.js:1284:        for ( var key in global ) {
simpli.js-1.2.4.tgz/unitTest/1.2.4/js/qunit-1.20.0.js:1284:        for ( var key in global ) {
sock-plex-1.0.2.tgz/test/common.js:174:  for (var val in global)
sole-0.2.10.tgz/examples/external/qunit-2.0.1.js:1151:      for ( var key in global ) {
spider-script-0.1.5.tgz/cli.js:88:        for (var key in global) {
springroll-0.4.25.tgz/components/qunit/qunit/qunit.js:1288:     for ( var key in global ) {
stacker-sandboxed-0.2.0.tgz/lib/sandboxed_module.js:110:  for (var globalKey in global) {
swank-js-0.0.5.tgz/swank-handler.js:291:  for (var i in global) this.context[i] = global[i];
syncrepl-0.8.26.tgz/oldrepl.js:66:  for (var i in global) context[i] = global[i];
syncrepl-0.8.26.tgz/syncrepl.js:354:    for (var i in global) context[i] = global[i];
systemjs-istanbul-hook-0.1.1.tgz/index.js:34:    for (var g in global) {
tangler-0.1.0.tgz/src/node-resolver.js:17:  for (var key in global) {
tasty-sandbox-2.0.5.tgz/lib/sandboxed_module.js:110:  for (var globalKey in global) {
tasty-treewalker-0.3.4.tgz/libs/qunitjs/qunit.js:1168:      for ( var key in global ) {
tea-js-0.2.0.tgz/bin/tea.0.1.12.js:166:         for (var name in global){
tea-js-0.2.0.tgz/bin/tea.0.1.13.js:184:         for (var name in global){
tea-js-0.2.0.tgz/bin/tea.js:256:            for (var name in global){
tea-js-0.2.0.tgz/lib/utils/index.js:22: for (var name in global){
tea-js-0.2.0.tgz/utils/index.js:22: for (var name in global){
tern-yui3-0.1.0.tgz/demos/ternjs/tern/lib/typescript.js:14:for (var prop in global) box[prop] = global[prop];
timbles-1.1.4.tgz/tests/qunit-1.20.0.js:1284:       for ( var key in global ) {
traceurified-module-0.0.1.tgz/runtime/index.js:57:  for (var k in global) {
traceurified-module-runtime-0.0.2.tgz/index.js:58:  for (var k in global) {
trepanjs-0.2.6.tgz/lib/repl.js:364:    for (var i in global) context[i] = global[i];
trepanjs-0.2.6.tgz/test/common.js:176://   for (var val in global)
trial-0.0.9.tgz/lib/trial/trial.js:98:                  for (var k in global) sandbox[k] = global[k];
tsi-0.3.0.tgz/bin/tsi.js:25:    for (var g in global)
typescript-require-0.2.9-1.tgz/index.js:95:  for (var k in global) {
typescript.api-0.7.7.tgz/index.js:2963:    for (var n in global) {
unit-testling-0.0.1.tgz/bin/testling.js:35:    for (k in global) {
venttiseiska-0.1.0.tgz/tests/qunit-1.2.0.js:1284:    for ( var key in global ) {
verbal-expressions-0.2.1.tgz/test/lib/qunit.js:1284:        for ( var key in global ) {
veritaseum-proof-of-concept-0.1.3.tgz/test/qunit-1.19.0.js:1168:        for ( var key in global ) {
vexflow-1.2.83.tgz/tests/support/qunit.js:1168:     for ( var key in global ) {
vide-0.5.0.tgz/libs/qunit/qunit/qunit.js:1168:      for ( var key in global ) {
vide-0.5.0.tgz/libs/qunit/src/test.js:467:      for ( var key in global ) {
vippy-0.0.11.tgz/vippyd.js:92:    for (var k in global) sandbox[k] = global[k];
visionr-core-1.0.31.tgz/src/bin/misc/repl.js:521:    for (var i in global) context[i] = global[i];
vm-shim-0.0.6.tgz/vm-shim.js:104:    for (var k in global) {
vm-shim-0.0.6.tgz/vm-shim.js:110:    for (var k in global) {
voltrazord-4.1.0.tgz/test/lib/qunit/qunit.js:1284:      for ( var key in global ) {
wbc-1.1.3.tgz/lib/core/plugin_config.js:280:  for (var k in global) {
weo-http-proxy-0.8.2.tgz/test/core/common.js:123:  for (var x in global) {
wnserver-0.0.97.tgz/src/wnInit.js:47:   for (g in global)
zpt-0.2.0.tgz/test/js/lib/qunit-1.19.0.js:1168:     for ( var key in global ) {

Object.keys / Object.values

Regex: Object\.(keys|values)\(global\).

Notice that at least two matches are inside comments, I have not excluded those.

bokehjs-0.12.3.tgz/test/index.coffee:27:blacklist = Object.keys(global)
arts-1.1.15.tgz/index.ts:70:        Object.keys(global).forEach(k=>this.g[k] = global[k])
3vot-db-0.0.1.tgz/microspec/suite.js:17:  Object.keys(global).forEach(function(p) {
acnsy-2.0.1.tgz/test/util/sandboxed-module-fix.js:7:    Object.keys(global).forEach(function (name) {
ahr.utils-2.1.0.tgz/ahr.utils.js:26:    Object.keys(global).forEach(function (key) {
ahr2-2.3.2.tgz/utils.js:26:    Object.keys(global).forEach(function (key) {
babel-istanbul-harmony-0.3.14.tgz/test/cli/sample-project/test/global-leak.js:10:    Object.keys(global).forEach(function (k) {
backendjs-0.25.1.tgz/lib/db_dynamodb.js:261:    if (!Object.keys(global).length) return callback(null, []);
bluedraft-0.0.1-d.tgz/test/leak_test.js:1:var keys = Object.keys(global)
bluedraft-0.0.1-d.tgz/test/leak_test.js:3:var newKeys = Object.keys(global)
calor-0.0.1-f.tgz/test/leak_test.js:1:var keys = Object.keys(global)
calor-0.0.1-f.tgz/test/leak_test.js:3:var newKeys = Object.keys(global)
clarinet-0.11.0.tgz/test/lib/mocha.js:1942:  this.globals(Object.keys(global).concat(['errno']));
clarinet-0.11.0.tgz/test/lib/mocha.js:1992:  var leaks = Object.keys(global).filter(function(key){
clay-nock-0.52.0.tgz/tests/test_intercept.js:21:  globalCount = Object.keys(global).length;
clay-nock-0.52.0.tgz/tests/test_intercept.js:3458:  var leaks = Object.keys(global)
clay-nock-0.52.0.tgz/tests/test_recorder.js:15:  globalCount = Object.keys(global).length;
clay-nock-0.52.0.tgz/tests/test_recorder.js:510:  var leaks = Object.keys(global)
coffee-coverage-1.0.1.tgz/lib/instrumentors/Istanbul.js:77:        coverageVars = Object.keys(global).filter(function(key) {
contextify-0.1.15.tgz/test/contextify.js:318:        var globalProps = Object.keys(global);
contextify-0.1.15.tgz/test/contextify.js:335:        test.equal(Object.keys(global).length, 5);
contextify-0.1.15.tgz/test/contextify.js:338:        test.equal(Object.keys(global).length, 4);
contextify-0.1.15.tgz/test/contextify.js:341:        test.equal(Object.keys(global).length, 3);
contextify-0.1.15.tgz/test/contextify.js:344:        test.equal(Object.keys(global).length, 2);
contextify-0.1.15.tgz/test/contextify.js:347:        test.equal(Object.keys(global).length, 1);
contextify-0.1.15.tgz/test/contextify.js:350:        test.equal(Object.keys(global).length, 0);
contextify_win32-0.1.12.tgz/test/contextify.js:318:        var globalProps = Object.keys(global);
contextify_win32-0.1.12.tgz/test/contextify.js:335:        test.equal(Object.keys(global).length, 5);
contextify_win32-0.1.12.tgz/test/contextify.js:338:        test.equal(Object.keys(global).length, 4);
contextify_win32-0.1.12.tgz/test/contextify.js:341:        test.equal(Object.keys(global).length, 3);
contextify_win32-0.1.12.tgz/test/contextify.js:344:        test.equal(Object.keys(global).length, 2);
contextify_win32-0.1.12.tgz/test/contextify.js:347:        test.equal(Object.keys(global).length, 1);
contextify_win32-0.1.12.tgz/test/contextify.js:350:        test.equal(Object.keys(global).length, 0);
couch-login-1.0.1.tgz/test/reset-then-signup.js:16:var okGlobal = Object.keys(global)
couch-login-1.0.1.tgz/test/reset-then-signup.js:28:  t.deepEqual(Object.keys(global), okGlobal)
couch-login-1.0.1.tgz/test/reset-then-signup.js:40:  t.deepEqual(Object.keys(global), okGlobal)
couch-login-1.0.1.tgz/test/reset-then-signup.js:53:  t.deepEqual(Object.keys(global), okGlobal)
couch-login-1.0.1.tgz/test/reset-then-signup.js:65:  t.deepEqual(Object.keys(global), okGlobal)
couch-login-1.0.1.tgz/test/reset-then-signup.js:90:  t.deepEqual(Object.keys(global), okGlobal)
couch-login-1.0.1.tgz/test/reset-then-signup.js:103:  t.deepEqual(Object.keys(global), okGlobal)
covers-1.9.1.tgz/index.js:4:  return Object.keys(global).filter(function (k) {
covers-1.9.1.tgz/test/myTest.js:23:  var cover = global[Object.keys(global).filter(function (k) {
eggnog-1.3.0.tgz/src/context.js:258:            throw new Error(buildMissingDepMsg(msg, globalId, Object.keys(global)));
empath-0.0.1.tgz/lib/detect_globals.js:11:  var globals = Object.keys(global)
empath-0.0.1.tgz/lib/detect_globals.js:13:  var globals2 = Object.keys(global)
finboxio-nock-8.0.1-fork.tgz/tests/test_intercept.js:24:globalCount = Object.keys(global).length;
finboxio-nock-8.0.1-fork.tgz/tests/test_intercept.js:4853:  var leaks = Object.keys(global)
finboxio-nock-8.0.1-fork.tgz/tests/test_recorder.js:16:  globalCount = Object.keys(global).length;
finboxio-nock-8.0.1-fork.tgz/tests/test_recorder.js:893:  var leaks = Object.keys(global)
glad-0.7.3.tgz/globalReport.js:1:var nativeGlobals = Object.keys(global);
glad-0.7.3.tgz/globalReport.js:6:    Object.keys(global).forEach(function (key) {
gleak-0.5.0.tgz/index.js:170:  Object.keys(global).forEach(function (key) {
grunt-closure-coffee-stack-0.0.6.tgz/tasks/unittests.js:47:      var globalKeys = Object.keys(global);
grunt-closure-coffee-stack-0.0.6.tgz/tasks/unittests.js:82:      previousGlobalKeys = Object.keys(global).filter(function(key) {
grunt-este-2.5.0.tgz/tasks/unittests.js:47:      var globalKeys = Object.keys(global);
grunt-este-2.5.0.tgz/tasks/unittests.js:87:      previousGlobalKeys = Object.keys(global).filter(function(key) {
gulp-este-1.2.8.tgz/tasks/unittest.js:9:globals = Object.keys(global);
gulp-este-1.2.8.tgz/tasks/unittest.js:40:  Object.keys(global).forEach((function(_this) {
iced-coffee-coverage-1.0.3.tgz/lib/instrumentors/Istanbul.js:78:        coverageVars = Object.keys(global).filter(function(key) {
injectables-0.1.2.tgz/lib/injectables.js:187:       Object.keys(global).forEach(function(k){
ish-0.3.0.tgz/test/test.js:7:var originalGlobals = Object.keys(global).reduce(function (dict, key) {
ish-0.3.0.tgz/test/test.js:16:    Object.keys(global).forEach(function (key) {
istanbul-systemjs-0.1.2.tgz/src/main.js:18:     var coverageVar = Object.keys(global)
jsh-0.1.42.tgz/lib/vm.js:46:    Object.keys(global).forEach(function (v) {
json-validate-0.0.1.tgz/test/mocha.js:1635:  this.globals = Object.keys(global).concat(['errno']);
json-validate-0.0.1.tgz/test/mocha.js:1669:  var leaks = Object.keys(global).filter(function(key){
jstestr-0.4.2.tgz/istanbul/test/cli/sample-project/test/global-leak.js:10:    Object.keys(global).forEach(function (k) {
jstophp-0.2.7.tgz/test/core.js:83:    var b = Object.keys(global);
jsx-test-2.0.1.tgz/lib/helper.js:159:    var coverageVariable = Object.keys(global).filter(function (key) {
leaky-1.0.0.tgz/leaky.js:56:  var globals = Object.keys(global).concat(['errno', 'exports', 'module']);
less-2.7.1.tgz/test/less-test.js:12:    var globals = Object.keys(global);
less-2.7.1.tgz/test/less-test.js:144:        return Object.keys(global).filter(function(v) {
less-aristos-3.6.2.tgz/test/less-test.js:12:    var globals = Object.keys(global);
less-aristos-3.6.2.tgz/test/less-test.js:144:        return Object.keys(global).filter(function(v) {
less-edp-0.3.0.tgz/test/less-test.js:11:    var globals = Object.keys(global);
less-edp-0.3.0.tgz/test/less-test.js:84:        return Object.keys(global).filter(function(v) {
less-papandreou-1.5.0-patch1.tgz/test/less-test.js:9:var globals = Object.keys(global);
less-papandreou-1.5.0-patch1.tgz/test/less-test.js:113:    return Object.keys(global).filter(function(v) {
less-templated-0.0.2.tgz/test/less-test.js:11:    var globals = Object.keys(global);
less-templated-0.0.2.tgz/test/less-test.js:84:        return Object.keys(global).filter(function(v) {
less-test-0.1.1.tgz/test/less-test.js:11:    var globals = Object.keys(global);
less-test-0.1.1.tgz/test/less-test.js:84:        return Object.keys(global).filter(function(v) {
less-vars-2.5.1.tgz/test/less-test.js:12:    var globals = Object.keys(global);
less-vars-2.5.1.tgz/test/less-test.js:144:        return Object.keys(global).filter(function(v) {
lisplate-0.6.0.tgz/spec/umd.spec.js:21:var covKey = Object.keys(global).find(function(k) {
load-1.0.2.tgz/index.js:91:var missing = Object.keys(global).filter(function filter(prop) {
mailman-client-0.0.2.tgz/test/transformer/index.js:8:    Object.keys(global).forEach(function(name) {
marky-markdown-8.1.0.tgz/test/marky.js:2:var oldkeys = Object.keys(global)
marky-markdown-8.1.0.tgz/test/marky.js:87:      assert.deepStrictEqual(Object.keys(global), oldkeys)
marky-markdown-8.1.0.tgz/test/marky.js:91:      var currentkeys = Object.keys(global).sort()
minimatch-mocha-1.0.1.tgz/test/basic.js:7:  , globalBefore = Object.keys(global)
minimatch-mocha-1.0.1.tgz/test/basic.js:392:  var globalAfter = Object.keys(global)
minimatch-mocha-1.0.1.tgz/test/defaults.js:7:  , globalBefore = Object.keys(global)
minimatch-mocha-1.0.1.tgz/test/defaults.js:267:  var globalAfter = Object.keys(global)
minimatchify-0.2.15.tgz/test/basic.js:7:  , globalBefore = Object.keys(global)
minimatchify-0.2.15.tgz/test/basic.js:392:  var globalAfter = Object.keys(global)
minimatchify-0.2.15.tgz/test/defaults.js:7:  , globalBefore = Object.keys(global)
minimatchify-0.2.15.tgz/test/defaults.js:267:  var globalAfter = Object.keys(global)
mmjd-gulp-este-1.0.2.tgz/tasks/unittest.js:11:  globals = Object.keys(global);
mmjd-gulp-este-1.0.2.tgz/tasks/unittest.js:42:    Object.keys(global).forEach((function(_this) {
mocha-jsdom-1.1.0.tgz/index.js:8:var blacklist = Object.keys(global)
mockuire-0.1.0.tgz/lib/index.js:60:    Object.keys(global)
modulify-0.1.0-1.tgz/src/modulify.js:93:    var original = Object.keys(global);
modulify-0.1.0-1.tgz/src/modulify.js:95:    var fin = Object.keys(global);
moduloteste-1.0.0.tgz/normalize-package-data/test/normalize.js:5:var globals = Object.keys(global)
moduloteste-1.0.0.tgz/normalize-package-data/test/normalize.js:251:  t.same(Object.keys(global), globals)
nimbleservice-0.3.4.tgz/globalReport.js:1:var nativeGlobals = Object.keys(global);
nimbleservice-0.3.4.tgz/globalReport.js:6:    Object.keys(global).forEach(function (key) {
nmock-0.10.1.tgz/tests/test_intercept.js:24:globalCount = Object.keys(global).length;
nmock-0.10.1.tgz/tests/test_intercept.js:4853:  var leaks = Object.keys(global)
nmock-0.10.1.tgz/tests/test_recorder.js:16:  globalCount = Object.keys(global).length;
nmock-0.10.1.tgz/tests/test_recorder.js:891:  var leaks = Object.keys(global)
nock-8.1.0.tgz/tests/test_intercept.js:24:globalCount = Object.keys(global).length;
nock-8.1.0.tgz/tests/test_intercept.js:4853:  var leaks = Object.keys(global)
nock-8.1.0.tgz/tests/test_recorder.js:16:  globalCount = Object.keys(global).length;
nock-8.1.0.tgz/tests/test_recorder.js:891:  var leaks = Object.keys(global)
nock-hotfixed-8.1.0.tgz/tests/test_intercept.js:24:globalCount = Object.keys(global).length;
nock-hotfixed-8.1.0.tgz/tests/test_intercept.js:4871:  var leaks = Object.keys(global)
nock-hotfixed-8.1.0.tgz/tests/test_recorder.js:16:  globalCount = Object.keys(global).length;
nock-hotfixed-8.1.0.tgz/tests/test_recorder.js:891:  var leaks = Object.keys(global)
node-leaky-recursive-0.1.3.tgz/leaky.js:56:  var globals = Object.keys(global).concat(['errno', 'exports', 'module']);
node2bat-0.0.4-rc2.tgz/test/test.js:21: console.log('    ' + Object.keys(global).join(', '));
nodebot-0.1.71.tgz/sax-js/test/index.js:1:var globalsBefore = JSON.stringify(Object.keys(global))
nodebot-0.1.71.tgz/sax-js/test/index.js:69:        var globalsAfter = JSON.stringify(Object.keys(global))
npp-0.0.3.tgz/lib/npp.js:69:            Object.keys(global).forEach(function(item){
paraffin-0.9.2.tgz/src/mocha/globalLeaks.js:56:     var props = Object.keys(global);
plv8-mantle-0.0.1.tgz/microspec/index.js:27:  Object.keys(global).forEach(function(p) {
prever-0.4.5.tgz/browser_runner/runner.js:5321:     var keys = Object.keys(global).reduce(function (p, k) {
prever-0.4.5.tgz/browser_runner/runner.js:5354:         Object.keys(global).filter(function (k) {
prever-0.4.5.tgz/lib/interfaces/bdd.js:18:    var keys = Object.keys(global).reduce(function (p, k) {
prever-0.4.5.tgz/lib/interfaces/bdd.js:51:        Object.keys(global).filter(function (k) {
primus-6.0.3.tgz/index.js:177:    const sandbox = Object.keys(global).reduce((acc, key) => {
proof-1.2.0.tgz/index.js:1:var globals = Object.keys(global).concat([ 'errno' ])
proof-1.2.0.tgz/redux/index.js:2:var globals = Object.keys(global).concat([ 'errno' ])
proof-1.2.0.tgz/redux/scaffold.js:85:                var leaked = Object.keys(global).filter(function (global) {
proof-1.2.0.tgz/scaffold.js:103:            var leaked = Object.keys(global).filter(function (global) {
proof-1.2.0.tgz/t/proof/scaffold.t.js:1:var globals = Object.keys(global).concat([ 'errno' ])
proof-1.2.0.tgz/t/scaffold/assert.t.js:1:var globals = Object.keys(global).concat([ 'errno' ])
proof-1.2.0.tgz/t/scaffold/export.t.js:1:var globals = Object.keys(global).concat([ 'errno' ])
proof-1.2.0.tgz/t/scaffold/leaked.t.js:1:var globals = Object.keys(global).concat([ 'errno' ])
proof-1.2.0.tgz/t/scaffold/say.t.js:1:var globals = Object.keys(global).concat([ 'errno' ])
proxy-lite-2014.8.27-10.tgz/utility2.js:1548:      Object.keys(global).forEach(function (key) {
qcnode-1.5.1.tgz/tests/testers/leakTests.js:13:    keys = Object.keys(global),
qcnode-1.5.1.tgz/tests/testers/leakTests.js:16:    child.exec("node -e 'console.log(JSON.stringify(Object.keys(global)))'",
qless-1.5.5.tgz/test/less-test.js:11:    var globals = Object.keys(global);
qless-1.5.5.tgz/test/less-test.js:83:        return Object.keys(global).filter(function(v) {
react-keys-2.0.0-alpha10.tgz/test/dom-config.js:7:const blacklist = Object.keys(global);
react-tvml-1.0.4.tgz/src/globals.js:2:  global.window = Object.keys(global).map(function(name) {
redux-action-router-0.2.0.tgz/test/testSetup.js:4:const globalKeys = Object.keys(global);
requirejs-react-jsx-1.0.2.tgz/jsx.js:35:        var coverageVariable = Object.keys(global).filter(function (key) { return key.indexOf('$$cov_') === 0 })[0];
righto-2.1.1.tgz/test/index.js:21:var globalkeys = Object.keys(global);
sails-hook-lint-1.1.1.tgz/index.js:165:        let globals = _.concat(Object.keys(global), getGlobalsOfSails(sails));
sandboxed-module-2.0.3.tgz/lib/sandboxed_module.js:318:    Object.keys(global).forEach(function(name) {
sax-pausable-0.1.0.tgz/test/index.js:1:var globalsBefore = JSON.stringify(Object.keys(global))
sax-pausable-0.1.0.tgz/test/index.js:69:        var globalsAfter = JSON.stringify(Object.keys(global))
sibilant-0.5.5.tgz/lib/repl.js:21:  Object.keys(global).forEach((function(key) {
siteboot-0.5.0.tgz/src/siteboot.js:922: Object.keys(global).map(function(key){context[key] = global[key];}); 
sourcejs-react-styleguidist-0.5.0.tgz/test/utils.utils.spec.js:25:          sourceGlobalLength = Object.keys(global).length;
sourcejs-react-styleguidist-0.5.0.tgz/test/utils.utils.spec.js:42:          expect(Object.keys(global).length).to.eql(sourceGlobalLength + 2);
specify-1.3.0.tgz/specify.js:12:  , GLOBALS       = Object.keys(global)
specify-1.3.0.tgz/specify.js:73:    var end_globals = Object.keys(global)
spell-1.0.0.tgz/test/lib/mocha-0.3.6.js:1942:  this.globals(Object.keys(global).concat(['errno']));
spell-1.0.0.tgz/test/lib/mocha-0.3.6.js:1992:  var leaks = Object.keys(global).filter(function(key){
stacker-sandboxed-0.2.0.tgz/lib/sandboxed_module.js:319:    Object.keys(global).forEach(function(name) {
strict-eval-1.0.1.tgz/lib/strict-eval.js:6:    var keys = Object.keys(global);
tape-it-0.3.1.tgz/index.js:20:  harness.globalCount = Object.keys(global).length;
tape-it-0.3.1.tgz/index.js:61:            assert.deepEqual(Object.keys(global)
tasty-sandbox-2.0.5.tgz/lib/sandboxed_module.js:321:    Object.keys(global).forEach(function(name) {
teamnora.nake-0.0.2.tgz/lib/nake.js:187:    Object.keys(global).forEach(function(key){
testfirst-1.0.0.tgz/normalize-package-data/test/normalize.js:5:var globals = Object.keys(global)
testfirst-1.0.0.tgz/normalize-package-data/test/normalize.js:224:  t.same(Object.keys(global), globals)
testke-1.0.0.tgz/normalize-package-data/test/normalize.js:5:var globals = Object.keys(global)
testke-1.0.0.tgz/normalize-package-data/test/normalize.js:224:  t.same(Object.keys(global), globals)
tome-editor-0.0.2.tgz/wocha.js:122:    var blacklist = Object.keys(global);
tpstylesheet-0.0.6.tgz/test/browser.js:29:const blacklist = Object.keys(global);
transactional-1.0.0-0.tgz/tests/tests.js:14789:   , globalBefore = Object.keys(global)
transactional-1.0.0-0.tgz/tests/tests.js:15174:   var globalAfter = Object.keys(global)
transactional-1.0.0-0.tgz/tests/tests.js:15254:   , globalBefore = Object.keys(global)
transactional-1.0.0-0.tgz/tests/tests.js:15514:   var globalAfter = Object.keys(global)
typhonjs-istanbul-instrument-jspm-0.1.0.tgz/src/instrumentIstanbulSystem.js:34:   const coverageVariable = Object.keys(global).filter((key) => { return key.startsWith('$$cov_'); })[0];
uless-1.0.11.tgz/test/less-test.js:10:    var globals = Object.keys(global);
uless-1.0.11.tgz/test/less-test.js:83:        return Object.keys(global).filter(function(v) {
unexpected-markdown-1.7.1.tgz/lib/evaluateSnippets.js:119:        Object.keys(global).forEach(function (key) {
weex-lint-0.1.10.tgz/lib/framework/lifecircle.js:17:        //   const originalGlobalKeys = Object.keys(global)
weex-lint-0.1.10.tgz/lib/framework/lifecircle.js:27:        //   const remainedGlobalKeys = Object.keys(global)
whatmd-0.0.3.tgz/src/whatmd.js:30:        globalPropsBefore = Object.keys(global),
whatmd-0.0.3.tgz/src/whatmd.js:32:        globalPropsAfter = Object.keys(global);
whatmd-0.0.3.tgz/src/whatmd.js:80:        globalPropsBefore = Object.keys(global),
whatmd-0.0.3.tgz/src/whatmd.js:82:        globalPropsAfter = Object.keys(global);
whatmd-0.0.3.tgz/src/whatmd.js:164:        globalPropsBefore = Object.keys(global),
whatmd-0.0.3.tgz/src/whatmd.js:166:        globalPropsAfter = Object.keys(global);
yacoot-0.12.5.tgz/libs/yacoot.js:33:  Object.keys(global).forEach(function(key) {

Object.assign

Regex: Object\.assign.*,\s*global[^[_a-zA-Z.] + manual filtering to exclude one false positive.

angular-cli-with-use-yarn-1.0.0-beta.17.2.tgz/packages/webpack/src/resource_loader.ts:93:      const vmContext = vm.createContext(Object.assign({require: require}, global));
ng-cli-2-0.0.11.tgz/packages/webpack/src/resource_loader.ts:93:      const vmContext = vm.createContext(Object.assign({require: require}, global));
quang-cli-1.0.12.tgz/packages/webpack/src/resource_loader.ts:93:      const vmContext = vm.createContext(Object.assign({require: require}, global));
sample-cli-cli-1.0.10.tgz/packages/webpack/src/resource_loader.ts:93:      const vmContext = vm.createContext(Object.assign({require: require}, global));
patternplate-transform-react-1.1.2.tgz/distribution/injection-template.js:15:   var global = Object.assign({}, global, IDENTIFIER);
wae-cli-0.6.0.tgz/lib/runner/runInRenderingAudioContext.js:22:  sandbox.global  = Object.assign({}, global);
wae-cli-0.6.0.tgz/lib/runner/runInStreamAudioContext.js:28:  sandbox.global  = Object.assign({}, global);

_.assign

Regex: (_|lodash|object)\.assign.*,\s*global[^[_a-zA-Z.].

parse-cloudcode-runner-0.0.5.tgz/index.js:66:    functionBody.apply(_.assign({Parse: Parse}, global), functionArguments);
ljharb commented 7 years ago

Thanks! The assign uses should be evangelized regardless to use Object.defineProperties({}, Object.getOwnPropertyDescriptors(global)), for example, but that doesn't really impact anything.

ChALkeR commented 7 years ago

assign/extend

Note: this includes Object.assign and _.assign that were already listed above.

Regex: (assign|extend).*,\s*global[^[_a-zA-Z.] plus manual filtering.

cts-0.5.0.tgz/src-old/CTS/Rules.coffee:94:      $.extend(rules, global)
fekit-0.2.148.tgz/src/util.coffee:533:    context = _.extend( {} , global , ctx )
fekit-0.2.148.tgz/src/util.coffee:678:        context = _.extend( {} , global , ctx )
ft-1.0.44.tgz/src/util.coffee:526:    context = _.extend( {} , global , ctx )
ft-1.0.44.tgz/src/util.coffee:671:        context = _.extend( {} , global , ctx )
hkit-1.0.1.tgz/src/util.coffee:533:    context = _.extend( {} , global , ctx )
hkit-1.0.1.tgz/src/util.coffee:678:        context = _.extend( {} , global , ctx )
angular-cli-with-use-yarn-1.0.0-beta.17.2.tgz/packages/webpack/src/resource_loader.ts:93:      const vmContext = vm.createContext(Object.assign({require: require}, global));
micro-build-1.2.7.tgz/src/library/shim-require-file.ts:16:  const newContenxt = extend({iswrapped: true}, global);
ng-cli-2-0.0.11.tgz/packages/webpack/src/resource_loader.ts:93:      const vmContext = vm.createContext(Object.assign({require: require}, global));
quang-cli-1.0.12.tgz/packages/webpack/src/resource_loader.ts:93:      const vmContext = vm.createContext(Object.assign({require: require}, global));
sample-cli-cli-1.0.10.tgz/packages/webpack/src/resource_loader.ts:93:      const vmContext = vm.createContext(Object.assign({require: require}, global));
angular2-logger-0.5.0.tgz/app/core/logger.js:41:        var _a = Object.assign({}, DEFAULT_OPTIONS, options), level = _a.level, global = _a.global, globalAs = _a.globalAs, store = _a.store, storeAs = _a.storeAs;
async-require-1.2.2.tgz/index.js:50:                    vm.runInNewContext(script, extend({require:require}, global, sandbox));
destoroyah-0.2.7.tgz/lib/runner/default.js:22:    setup.extend('rampage', global);
destoroyah-0.2.7.tgz/lib/runner/default.js:23:    setup.extend('monster', global);
destoroyah-0.2.7.tgz/lib/runner/default.js:24:    setup.extend('struggle', global);
fekit-0.2.148.tgz/lib/util.js:727:    context = _.extend({}, global, ctx);
fekit-0.2.148.tgz/lib/util.js:904:      context = _.extend({}, global, ctx);
ft-1.0.44.tgz/lib/util.js:718:    context = _.extend({}, global, ctx);
ft-1.0.44.tgz/lib/util.js:895:      context = _.extend({}, global, ctx);
gextend-0.3.0.tgz/test/helpers/sinon.js:3920:(function (sinon, global) {
glagol-2.0.0-rc9.tgz/formats/javascript.js:38:  var context = process.browser ? {} : extend({}, global);
hkit-1.0.1.tgz/lib/util.js:734:    context = _.extend({}, global, ctx);
hkit-1.0.1.tgz/lib/util.js:914:      context = _.extend({}, global, ctx);
html-webpack-plugin-2.24.0.tgz/index.js:225:  var vmContext = vm.createContext(_.extend({HTML_WEBPACK_PLUGIN: true, require: require}, global));
html-webpack-plugin-hokkoo-2.25.2.tgz/index.js:220:  var vmContext = vm.createContext(_.extend({HTML_WEBPACK_PLUGIN: true, require: require}, global));
html-webpack-plugin-smadey-2.23.1.tgz/index.js:221:  var vmContext = vm.createContext(_.extend({HTML_WEBPACK_PLUGIN: true, require: require}, global));
mockrequire-0.0.5.tgz/index.js:65:  extend(sandbox, global);
monoclass-0.3.1.tgz/lib/monoclass.js:943:       context = _.extend({}, global, defaultEnv.ctx, {
muti-html-webpack-plugin-1.0.5.tgz/index.js:261:        var vmContext = vm.createContext(_.extend({ HTML_WEBPACK_PLUGIN: true, require: require }, global));
node-go-require-1.0.11.tgz/lib/go-loader.js:105:    var context = extend({}, global, {
node-spider-script-1.0.9.tgz/lib/spider-loader.js:87:    var context = extend({}, global, {
node-tsc-0.0.14.tgz/loadtsc.js:70:  var sandbox = _.extend({}, global);
nodei-0.2.4.tgz/index.js:40:  var sandbox = assign({}, global, {
packing-html-webpack-plugin-1.0.0.tgz/index.js:221:  var vmContext = vm.createContext(_.extend({HTML_WEBPACK_PLUGIN: true, require: require}, global));
parse-cloudcode-runner-0.0.5.tgz/index.js:66:    functionBody.apply(_.assign({Parse: Parse}, global), functionArguments);
patternplate-transform-react-1.1.2.tgz/distribution/injection-template.js:15:   var global = Object.assign({}, global, IDENTIFIER);
qmb-0.3.7.tgz/src/module/fekit/fekit/util.js:714:    context = _.extend({}, global, ctx);
qmb-0.3.7.tgz/src/module/fekit/fekit/util.js:891:      context = _.extend({}, global, ctx);
tsun-0.3.1.tgz/bin/src/repl.js:82:    util_1.assign(context, global);
unexpected-markdown-1.7.1.tgz/lib/evaluateSnippets.js:53:    var oldGlobal = extend({}, global);
wae-cli-0.6.0.tgz/lib/runner/runInRenderingAudioContext.js:22:  sandbox.global  = Object.assign({}, global);
wae-cli-0.6.0.tgz/lib/runner/runInStreamAudioContext.js:28:  sandbox.global  = Object.assign({}, global);
wbg-html-webpack-plugin-1.0.1.tgz/index.js:220:  var vmContext = vm.createContext(_.extend({HTML_WEBPACK_PLUGIN: true, require: require}, global));
webpack-docs-plugin-1.0.12-alpha.tgz/lib/modules/TemplateCompiler/index.js:154:  var vmContext = vm.createContext(extend(true, {WEBPACK_DOCS_PLUGIN: true, require: require}, global));
ljharb commented 7 years ago

Naturally the hard part is that while it's clear that making global non-enumerable will alter these code paths, it's not clear that it will actually break any of them - ie, it won't break a path unless it relies on "global" being present in the list.

Object.defineProperty(global, 'global', { enumerable: false }) should be sufficient in citgm to do a quick check?

ChALkeR commented 7 years ago

citgm: https://ci.nodejs.org/view/Node.js-citgm/job/citgm-smoker/429/ Commit: https://github.com/ChALkeR/io.js/commit/4cf9e7b41e2e687d33981b94e7ffd48ff7f0dc9c.

ChALkeR commented 7 years ago

New citgm, rebased on 6.x to avoid Buffer without new warnings breaking tests: https://ci.nodejs.org/view/Node.js-citgm/job/citgm-smoker/430/.

Trott commented 7 years ago

@jasnell @ChALkeR @ljharb Should this remain open? If so, is there anyone we should be pinging? Any labels we might add to help the right people find it?

ljharb commented 7 years ago

Yes, it should remain open.

The current blocker is finding a global name that's acceptable. Once browsers agree on that, the proposal will be updated, and I'll update my PR to node to add it.

Trott commented 7 years ago

I'll add the blocked label here in the meantime (even though this is a discuss issue, I think it still makes sense if conversation is unlikely to meaningfully happen until the name is resolved).

Trott commented 6 years ago

@ljharb Based on https://github.com/tc39/proposal-global/issues/20, does it seem very likely that the global object will not be named global, thus reducing compatibility concerns for Node.js around enumerability of global?

ljharb commented 6 years ago

It's an absolute certainty that it will not be named global at this point, unfortunately.

(If node wants to leave global enumerable, they're thus welcome to do so, but either way I think non-enumerable is a far better choice)

Trott commented 6 years ago

It's an absolute certainty that it will not be named global at this point, unfortunately.

OK, in that case, I'll remove the blocked label.

(If node wants to leave global enumerable, they're thus welcome to do so, but either way I think non-enumerable is a far better choice)

We should probably change the title of this issue to reflect the above concern rather than the TC-39 standard thing since non-enumerability of a new thing would be a non-issue.

Trott commented 6 years ago

@jasnell Any objection to changing the title of this issue to something like "make global.global non-enumerable?"

jasnell commented 5 years ago

@ljharb ... any progress on the tc39 discussion?

devsnek commented 5 years ago

https://github.com/rwaldron/tc39-notes/blob/master/es9/2018-07/july-24.md#new-name-for-global https://github.com/rwaldron/tc39-notes/blob/master/es9/2018-07/july-25.md#revisit-global-name

ljharb commented 5 years ago

Once it ships in a browser and is proven to be web compatible, I’ll update my PR to core (altho v8 may provide it anyways). Until then, it’s best if node does nothing (due to the risk of more web incompatibility)

jasnell commented 5 years ago

Nothing further to do here for now