Skip to content

Commit

Permalink
Removing const / let in favor of var, for Chrome 45. See #2098. (#2162)
Browse files Browse the repository at this point in the history
* Removing const / let in favor of var, for Chrome 45. See #2098.

* Review feedback

* Fix issue with iteration scope

* Self review
  • Loading branch information
joeldenning committed Apr 7, 2020
1 parent dd5fce8 commit db96b64
Show file tree
Hide file tree
Showing 13 changed files with 167 additions and 163 deletions.
62 changes: 31 additions & 31 deletions src/common.js
Original file line number Diff line number Diff line change
@@ -1,37 +1,37 @@
import { errMsg } from './err-msg.js';

export const hasSymbol = typeof Symbol !== 'undefined';
export const hasSelf = typeof self !== 'undefined';
export const hasDocument = typeof document !== 'undefined';
export var hasSymbol = typeof Symbol !== 'undefined';
export var hasSelf = typeof self !== 'undefined';
export var hasDocument = typeof document !== 'undefined';

const envGlobal = hasSelf ? self : global;
var envGlobal = hasSelf ? self : global;
export { envGlobal as global };

// Loader-scoped baseUrl supported in Node.js only
export const BASE_URL = hasSymbol ? Symbol() : '_';
export var BASE_URL = hasSymbol ? Symbol() : '_';

export let baseUrl;
export var baseUrl;

if (hasDocument) {
const baseEl = document.querySelector('base[href]');
var baseEl = document.querySelector('base[href]');
if (baseEl)
baseUrl = baseEl.href;
}

if (!baseUrl && typeof location !== 'undefined') {
baseUrl = location.href.split('#')[0].split('?')[0];
const lastSepIndex = baseUrl.lastIndexOf('/');
var lastSepIndex = baseUrl.lastIndexOf('/');
if (lastSepIndex !== -1)
baseUrl = baseUrl.slice(0, lastSepIndex + 1);
}

if (!process.env.SYSTEM_BROWSER && !baseUrl && typeof process !== 'undefined') {
const cwd = process.cwd();
var cwd = process.cwd();
// TODO: encoding edge cases
baseUrl = 'file://' + (cwd[0] === '/' ? '' : '/') + cwd.replace(/\\/g, '/') + '/';
}

const backslashRegEx = /\\/g;
var backslashRegEx = /\\/g;
export function resolveIfNotPlainOrUrl (relUrl, parentUrl) {
if (relUrl.indexOf('\\') !== -1)
relUrl = relUrl.replace(backslashRegEx, '/');
Expand All @@ -43,13 +43,13 @@ export function resolveIfNotPlainOrUrl (relUrl, parentUrl) {
else if (relUrl[0] === '.' && (relUrl[1] === '/' || relUrl[1] === '.' && (relUrl[2] === '/' || relUrl.length === 2 && (relUrl += '/')) ||
relUrl.length === 1 && (relUrl += '/')) ||
relUrl[0] === '/') {
const parentProtocol = parentUrl.slice(0, parentUrl.indexOf(':') + 1);
var parentProtocol = parentUrl.slice(0, parentUrl.indexOf(':') + 1);
// Disabled, but these cases will give inconsistent results for deep backtracking
//if (parentUrl[parentProtocol.length] !== '/')
// throw Error('Cannot resolve');
// read pathname from parent URL
// pathname taken to be part after leading "/"
let pathname;
var pathname;
if (parentUrl[parentProtocol.length + 1] === '/') {
// resolving to a :// so we need to read out the auth and host
if (parentProtocol !== 'file:') {
Expand All @@ -71,11 +71,11 @@ export function resolveIfNotPlainOrUrl (relUrl, parentUrl) {
// join together and split for removal of .. and . segments
// looping the string instead of anything fancy for perf reasons
// '../../../../../z' resolved to 'x/y' is just 'z'
const segmented = pathname.slice(0, pathname.lastIndexOf('/') + 1) + relUrl;
var segmented = pathname.slice(0, pathname.lastIndexOf('/') + 1) + relUrl;

const output = [];
let segmentIndex = -1;
for (let i = 0; i < segmented.length; i++) {
var output = [];
var segmentIndex = -1;
for (var i = 0; i < segmented.length; i++) {
// busy reading a segment - only terminate on '/'
if (segmentIndex !== -1) {
if (segmented[i] === '/') {
Expand Down Expand Up @@ -125,19 +125,19 @@ export function resolveUrl (relUrl, parentUrl) {
}

function objectAssign (to, from) {
for (let p in from)
for (var p in from)
to[p] = from[p];
return to;
}

function resolveAndComposePackages (packages, outPackages, baseUrl, parentMap, parentUrl) {
for (let p in packages) {
const resolvedLhs = resolveIfNotPlainOrUrl(p, baseUrl) || p;
const rhs = packages[p];
for (var p in packages) {
var resolvedLhs = resolveIfNotPlainOrUrl(p, baseUrl) || p;
var rhs = packages[p];
// package fallbacks not currently supported
if (typeof rhs !== 'string')
continue;
const mapped = resolveImportMap(parentMap, resolveIfNotPlainOrUrl(rhs, baseUrl) || rhs, parentUrl);
var mapped = resolveImportMap(parentMap, resolveIfNotPlainOrUrl(rhs, baseUrl) || rhs, parentUrl);
if (!mapped) {
if (process.env.SYSTEM_PRODUCTION)
targetWarning(2, p, rhs);
Expand All @@ -150,14 +150,14 @@ function resolveAndComposePackages (packages, outPackages, baseUrl, parentMap, p
}

export function resolveAndComposeImportMap (json, baseUrl, parentMap) {
const outMap = { imports: objectAssign({}, parentMap.imports), scopes: objectAssign({}, parentMap.scopes) };
var outMap = { imports: objectAssign({}, parentMap.imports), scopes: objectAssign({}, parentMap.scopes) };

if (json.imports)
resolveAndComposePackages(json.imports, outMap.imports, baseUrl, parentMap, null);

if (json.scopes)
for (let s in json.scopes) {
const resolvedScope = resolveUrl(s, baseUrl);
for (var s in json.scopes) {
var resolvedScope = resolveUrl(s, baseUrl);
resolveAndComposePackages(json.scopes[s], outMap.scopes[resolvedScope] || (outMap.scopes[resolvedScope] = {}), baseUrl, parentMap, resolvedScope);
}

Expand All @@ -167,18 +167,18 @@ export function resolveAndComposeImportMap (json, baseUrl, parentMap) {
function getMatch (path, matchObj) {
if (matchObj[path])
return path;
let sepIndex = path.length;
var sepIndex = path.length;
do {
const segment = path.slice(0, sepIndex + 1);
var segment = path.slice(0, sepIndex + 1);
if (segment in matchObj)
return segment;
} while ((sepIndex = path.lastIndexOf('/', sepIndex - 1)) !== -1)
}

function applyPackages (id, packages) {
const pkgName = getMatch(id, packages);
var pkgName = getMatch(id, packages);
if (pkgName) {
const pkg = packages[pkgName];
var pkg = packages[pkgName];
if (pkg === null) return;
if (id.length > pkgName.length && pkg[pkg.length - 1] !== '/') {
if (process.env.SYSTEM_PRODUCTION)
Expand All @@ -196,10 +196,10 @@ function targetWarning (code, match, target, msg) {
}

export function resolveImportMap (importMap, resolvedOrPlain, parentUrl) {
const scopes = importMap.scopes;
let scopeUrl = parentUrl && getMatch(parentUrl, scopes);
var scopes = importMap.scopes;
var scopeUrl = parentUrl && getMatch(parentUrl, scopes);
while (scopeUrl) {
const packageResolution = applyPackages(resolvedOrPlain, scopes[scopeUrl]);
var packageResolution = applyPackages(resolvedOrPlain, scopes[scopeUrl]);
if (packageResolution)
return packageResolution;
scopeUrl = getMatch(scopeUrl.slice(0, scopeUrl.lastIndexOf('/')), scopes);
Expand Down
62 changes: 33 additions & 29 deletions src/extras/amd.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,29 @@ import { errMsg } from '../err-msg.js';
* Support for AMD loading
*/
(function (global) {
const systemPrototype = global.System.constructor.prototype;
var systemPrototype = global.System.constructor.prototype;

const emptyInstantiation = [[], function () { return {} }];
var emptyInstantiation = [[], function () { return {} }];

function unsupportedRequire () {
throw Error(process.env.SYSTEM_PRODUCTION ? errMsg(7) : errMsg(7, 'AMD require not supported.'));
}

let tmpRegister, firstNamedDefine;
var tmpRegister, firstNamedDefine;

function emptyFn () {}

const requireExportsModule = ['require', 'exports', 'module'];
var requireExportsModule = ['require', 'exports', 'module'];

function createAMDRegister (amdDefineDeps, amdDefineExec) {
const exports = {};
const module = { exports: exports };
const depModules = [];
const setters = [];
let splice = 0;
for (let i = 0; i < amdDefineDeps.length; i++) {
const id = amdDefineDeps[i];
const index = setters.length;
var exports = {};
var module = { exports: exports };
var depModules = [];
var setters = [];
var splice = 0;
for (var i = 0; i < amdDefineDeps.length; i++) {
var id = amdDefineDeps[i];
var index = setters.length;
if (id === 'require') {
depModules[i] = unsupportedRequire;
splice++;
Expand All @@ -40,62 +40,65 @@ import { errMsg } from '../err-msg.js';
splice++;
}
else {
// needed for ie11 lack of iteration scope
const idx = i;
setters.push(function (ns) {
depModules[idx] = ns.__useDefault ? ns.default : ns;
});
createSetter(i);
}
if (splice)
amdDefineDeps[index] = id;
}
if (splice)
amdDefineDeps.length -= splice;
const amdExec = amdDefineExec;
var amdExec = amdDefineExec;
return [amdDefineDeps, function (_export) {
_export({ default: exports, __useDefault: true });
return {
setters: setters,
execute: function () {
const amdResult = amdExec.apply(exports, depModules);
var amdResult = amdExec.apply(exports, depModules);
if (amdResult !== undefined)
module.exports = amdResult;
if (exports !== module.exports)
_export('default', module.exports);
}
};
}];

// needed to avoid iteration scope issues
function createSetter(idx) {
setters.push(function (ns) {
depModules[idx] = ns.__useDefault ? ns.default : ns;
});
}
}

// hook System.register to know the last declaration binding
let lastRegisterDeclare;
const systemRegister = systemPrototype.register;
var lastRegisterDeclare;
var systemRegister = systemPrototype.register;
systemPrototype.register = function (name, deps, declare) {
lastRegisterDeclare = typeof name === 'string' ? declare : deps;
systemRegister.apply(this, arguments);
};

const instantiate = systemPrototype.instantiate;
var instantiate = systemPrototype.instantiate;
systemPrototype.instantiate = function() {
// Reset "currently executing script"
amdDefineDeps = null;
return instantiate.apply(this, arguments);
};

const getRegister = systemPrototype.getRegister;
var getRegister = systemPrototype.getRegister;
systemPrototype.getRegister = function () {
if (tmpRegister)
return tmpRegister;

const _firstNamedDefine = firstNamedDefine;
var _firstNamedDefine = firstNamedDefine;
firstNamedDefine = null;

const register = getRegister.call(this);
var register = getRegister.call(this);
// if its an actual System.register leave it
if (register && register[1] === lastRegisterDeclare)
return register;

const _amdDefineDeps = amdDefineDeps;
var _amdDefineDeps = amdDefineDeps;
amdDefineDeps = null;

// If the script registered a named module, return that module instead of re-instantiating it.
Expand All @@ -109,11 +112,12 @@ import { errMsg } from '../err-msg.js';

return createAMDRegister(_amdDefineDeps, amdDefineExec);
};
let amdDefineDeps, amdDefineExec;
var amdDefineDeps, amdDefineExec;
global.define = function (name, deps, execute) {
var depsAndExec;
// define('', [], function () {})
if (typeof name === 'string') {
const depsAndExec = getDepsAndExec(deps, execute);
depsAndExec = getDepsAndExec(deps, execute);
if (amdDefineDeps) {
if (!System.registerRegistry) {
throw Error(process.env.SYSTEM_PRODUCTION ? errMsg(8) : errMsg(8, 'Include the named register extension for SystemJS named AMD support.'));
Expand All @@ -130,7 +134,7 @@ import { errMsg } from '../err-msg.js';
deps = execute;
}
}
const depsAndExec = getDepsAndExec(name, deps);
depsAndExec = getDepsAndExec(name, deps);
amdDefineDeps = depsAndExec[0];
amdDefineExec = depsAndExec[1];
};
Expand Down
26 changes: 13 additions & 13 deletions src/extras/global.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@
* (Included by default in system.js build)
*/
(function (global) {
const systemJSPrototype = System.constructor.prototype;
var systemJSPrototype = System.constructor.prototype;

// safari unpredictably lists some new globals first or second in object order
let firstGlobalProp, secondGlobalProp, lastGlobalProp;
var firstGlobalProp, secondGlobalProp, lastGlobalProp;
function getGlobalProp () {
let cnt = 0;
let lastProp;
for (let p in global) {
var cnt = 0;
var lastProp;
for (var p in global) {
// do not check frames cause it could be removed during import
if (shouldSkipProperty(p))
continue;
Expand All @@ -28,7 +28,7 @@
// alternatively Object.keys(global).pop()
// but this may be faster (pending benchmarks)
firstGlobalProp = secondGlobalProp = undefined;
for (let p in global) {
for (var p in global) {
// do not check frames cause it could be removed during import
if (shouldSkipProperty(p))
continue;
Expand All @@ -41,29 +41,29 @@
return lastGlobalProp;
}

const impt = systemJSPrototype.import;
var impt = systemJSPrototype.import;
systemJSPrototype.import = function (id, parentUrl) {
noteGlobalProps();
return impt.call(this, id, parentUrl);
};

const emptyInstantiation = [[], function () { return {} }];
var emptyInstantiation = [[], function () { return {} }];

const getRegister = systemJSPrototype.getRegister;
var getRegister = systemJSPrototype.getRegister;
systemJSPrototype.getRegister = function () {
const lastRegister = getRegister.call(this);
var lastRegister = getRegister.call(this);
if (lastRegister)
return lastRegister;

// no registration -> attempt a global detection as difference from snapshot
// when multiple globals, we take the global value to be the last defined new global object property
// for performance, this will not support multi-version / global collisions as previous SystemJS versions did
// note in Edge, deleting and re-adding a global does not change its ordering
const globalProp = getGlobalProp();
var globalProp = getGlobalProp();
if (!globalProp)
return emptyInstantiation;

let globalExport;
var globalExport;
try {
globalExport = global[globalProp];
}
Expand All @@ -80,7 +80,7 @@
}];
};

const isIE11 = typeof navigator !== 'undefined' && navigator.userAgent.indexOf('Trident') !== -1;
var isIE11 = typeof navigator !== 'undefined' && navigator.userAgent.indexOf('Trident') !== -1;

function shouldSkipProperty(p) {
return !global.hasOwnProperty(p)
Expand Down

0 comments on commit db96b64

Please sign in to comment.