Spaces:
Sleeping
Sleeping
/** | |
* Copyright 2018 Google Inc. All Rights Reserved. | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
// If the loader is already loaded, just stop. | |
if (!self.<%- amdFunctionName %>) { | |
let registry = {}; | |
// Used for `eval` and `importScripts` where we can't get script URL by other means. | |
// In both cases, it's safe to use a global var because those functions are synchronous. | |
let nextDefineUri; | |
const singleRequire = (uri, parentUri) => { | |
uri = new URL(uri + ".js", parentUri).href; | |
return registry[uri] || ( | |
<% if (useEval) { %> | |
fetch(uri) | |
.then(resp => resp.text()) | |
.then(code => { | |
nextDefineUri = uri; | |
eval(code); | |
}) | |
<% } else { %> | |
new Promise(resolve => { | |
if ("document" in self) { | |
const script = document.createElement("script"); | |
script.src = uri; | |
script.onload = resolve; | |
document.head.appendChild(script); | |
} else { | |
nextDefineUri = uri; | |
importScripts(uri); | |
resolve(); | |
} | |
}) | |
<% } %> | |
.then(() => { | |
let promise = registry[uri]; | |
if (!promise) { | |
throw new Error(`Module ${uri} didn’t register its module`); | |
} | |
return promise; | |
}) | |
); | |
}; | |
self.<%- amdFunctionName %> = (depsNames, factory) => { | |
const uri = nextDefineUri || ("document" in self ? document.currentScript.src : "") || location.href; | |
if (registry[uri]) { | |
// Module is already loading or loaded. | |
return; | |
} | |
let exports = {}; | |
const require = depUri => singleRequire(depUri, uri); | |
const specialDeps = { | |
module: { uri }, | |
exports, | |
require | |
}; | |
registry[uri] = Promise.all(depsNames.map( | |
depName => specialDeps[depName] || require(depName) | |
)).then(deps => { | |
factory(...deps); | |
return exports; | |
}); | |
}; | |
} | |