react-render-props-script-loader
Version:
an easier to use dynamic script loader
111 lines (110 loc) • 4.33 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
exports.getState = getState;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _excluded = ["scriptsRegistry", "onLoad", "onError", "children", "act"];
/* eslint-env browser */
var nonce;
function getNonce() {
var _nonce;
if (nonce === undefined) {
var _node$getAttribute;
var node = document.querySelector('meta[property="csp-nonce"], meta[name="csp-nonce"]');
nonce = node ? (_node$getAttribute = node.getAttribute('content')) !== null && _node$getAttribute !== void 0 ? _node$getAttribute : null : null;
}
return (_nonce = nonce) !== null && _nonce !== void 0 ? _nonce : null;
}
var loadScript = /*#__PURE__*/function () {
var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(_ref) {
var scriptsRegistry, onLoad, onError, children, act, props, src;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
scriptsRegistry = _ref.scriptsRegistry, onLoad = _ref.onLoad, onError = _ref.onError, children = _ref.children, act = _ref.act, props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
src = props.src;
if (!scriptsRegistry) {
_context.next = 6;
break;
}
scriptsRegistry.results[src] = {
error: undefined
};
scriptsRegistry.scripts.push(props);
return _context.abrupt("return");
case 6:
if (!(typeof document === 'undefined')) {
_context.next = 8;
break;
}
throw new Error('you must pass a scriptsRegistry if calling on the server side');
case 8:
if (!(typeof document.querySelector === 'function')) {
_context.next = 12;
break;
}
if (!document.querySelector("script[src=\"".concat(src, "\"]"))) {
_context.next = 12;
break;
}
results[src] = {
error: undefined
};
return _context.abrupt("return");
case 12:
return _context.abrupt("return", new Promise(function (resolve, reject) {
var script = document.createElement('script');
script.src = src;
script.nonce = getNonce();
Object.keys(props).forEach(function (key) {
return script.setAttribute(key, props[key]);
});
script.onload = resolve;
script.onerror = reject;
if (document.body) document.body.appendChild(script);
}));
case 13:
case "end":
return _context.stop();
}
}, _callee);
}));
return function loadScript(_x) {
return _ref2.apply(this, arguments);
};
}();
var results = {};
var promises = {};
var _default = exports["default"] = function _default(props) {
var scriptsRegistry = props.scriptsRegistry;
var _promises = scriptsRegistry ? scriptsRegistry.promises : promises;
var _results = scriptsRegistry ? scriptsRegistry.results : results;
return _promises[props.src] || (_promises[props.src] = loadScript(props).then(function () {
return _results[props.src] = {
error: null
};
}, function () {
var error = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Error("failed to load ".concat(props.src));
_results[props.src] = {
error: error
};
throw error;
}));
};
function getState(_ref3) {
var src = _ref3.src,
scriptsRegistry = _ref3.scriptsRegistry;
var result = scriptsRegistry ? scriptsRegistry.results[src] : results[src];
var promise = scriptsRegistry ? scriptsRegistry.promises[src] : promises[src];
return {
loading: result == null,
loaded: result ? !result.error : false,
error: result && result.error,
promise: promise
};
}