You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.4 KiB
76 lines
2.4 KiB
/** |
|
* 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; |
|
}); |
|
}; |
|
}
|
|
|