import { __assign, __rest } from "tslib";
import { objectKeys } from './utils/native';
/**
* 加载 js 文件。
*
* <em style="font-weight: bold;">注意:该方法仅适用于浏览器端。</em>
*
* @static
* @alias module:Other.loadScript
* @since 4.19.0
* @param {string} src js 地址。
* @param {Object} [options] script 标签属性。比如 `defer` `onload` `onerror` `id` 等,下面列举部分带有默认值或额外扩展的配置。
* @param {boolean} [options.destroyOnError=true] 如果加载失败或错误,自动删除 dom 中的 script 标签。
* @param {Object} [options.attrs] 自定义 script 属性,通过 script.setAttribute 设置。
* @param {boolean} [options.async=true] 异步加载。
* @param {string} [options.type='text/javascript'] 类型。
* @return {Promise<HTMLScriptElement>} 异步返回 script 元素。
* @example
*
* loadScript('some.js').then(script=>{
* // do something
* })
*
* loadScript('some.js', { id: 'xxx', async: false, attrs: { foo: 'bar' } }).then(script=>{
* // do something
* })
*
*/
function loadScript(src, options) {
return new Promise(function (resolve, reject) {
var head = document.head;
var script = document.createElement('script');
var _a = options || {}, attrs = _a.attrs, _b = _a.destroyOnError, destroyOnError = _b === void 0 ? true : _b, restOptions = __rest(_a, ["attrs", "destroyOnError"]);
var props = __assign(__assign({ async: true, type: 'text/javascript' }, restOptions), { src: src });
for (var key in props) {
if (key === 'onload' || key === 'onerror') {
continue;
}
// @ts-ignore
script[key] = props[key];
}
if (typeof attrs === 'object') {
objectKeys(attrs).forEach(function (key) {
script.setAttribute(key, attrs[key]);
});
}
script.onload = function (ev) {
var _a;
this.onerror = this.onload = null;
(_a = props.onload) === null || _a === void 0 ? void 0 : _a.call(this, ev);
resolve(script);
};
script.onerror = function (ev) {
var _a;
this.onerror = this.onload = null;
(_a = props.onerror) === null || _a === void 0 ? void 0 : _a.call(this, ev);
if (destroyOnError) {
head.removeChild(script);
}
reject(new URIError('Failed to load ' + this.src));
};
head.appendChild(script);
});
}
export default loadScript;