noodl-loader
Version:
Loader for noodl applications
157 lines • 7.05 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createExtractor = void 0;
const tslib_1 = require("tslib");
const noodl_core_1 = require("noodl-core");
const yaml_1 = require("yaml");
const asset_1 = tslib_1.__importDefault(require("./asset"));
const extract_documents_1 = tslib_1.__importDefault(require("./presets/extract-documents"));
const extract_images_1 = tslib_1.__importDefault(require("./presets/extract-images"));
const extract_pages_1 = tslib_1.__importDefault(require("./presets/extract-pages"));
const extract_scripts_1 = tslib_1.__importDefault(require("./presets/extract-scripts"));
const extract_videos_1 = tslib_1.__importDefault(require("./presets/extract-videos"));
const yaml_2 = require("../internal/yaml");
const replace_1 = require("../utils/replace");
const c = tslib_1.__importStar(require("../constants"));
function createExtractor(loader) {
const { BREAK, REMOVE, SKIP } = yaml_2.visit;
function extract(value, { as, include, prepare, use: useProp = [] } = {}) {
var _a;
return tslib_1.__awaiter(this, void 0, void 0, function* () {
if ((0, yaml_2.isPair)(value)) {
if ((0, yaml_2.isNode)(value.value)) {
value = value.value;
}
else {
throw new Error(`The value ${value.value} is not a compatible node to visit`);
}
}
const use = [...noodl_core_1.fp.toArr(useProp)];
for (const preset of noodl_core_1.fp.toArr(include)) {
if (preset === 'any') {
use.length = 0;
use.push(extract_documents_1.default, extract_images_1.default, extract_pages_1.default, extract_scripts_1.default, extract_videos_1.default);
break;
}
else if (preset === 'documents') {
use.push(extract_documents_1.default);
}
else if (preset === 'images') {
use.push(extract_images_1.default);
}
else if (preset === 'pages') {
use.push({ extract: extract_pages_1.default, once: true });
}
else if (preset === 'scripts') {
use.push(extract_scripts_1.default);
}
else if (preset === 'videos') {
use.push(extract_videos_1.default);
}
}
let state = { assets: [], assetIds: [] };
let assets = [];
if (prepare) {
const updatedState = prepare(state);
if (updatedState)
state = Object.assign(Object.assign({}, state), updatedState);
}
const control = {
BREAK,
REMOVE,
SKIP,
};
const createAsset = (propsOrType, props) => {
const asset = propsOrType instanceof asset_1.default ? propsOrType : new asset_1.default();
if (noodl_core_1.is.str(propsOrType)) {
asset.type = propsOrType;
}
else if (propsOrType instanceof asset_1.default) {
//
}
else if (noodl_core_1.is.obj(propsOrType)) {
if (propsOrType.id)
asset.setId(propsOrType.id);
if (propsOrType.type)
asset.type = propsOrType.type;
if (noodl_core_1.is.obj(propsOrType.props))
asset.merge(propsOrType.props);
}
if (noodl_core_1.is.obj(props))
asset.merge(props);
const assetId = asset.getId();
if (assetId && !state.assetIds.includes(assetId)) {
state.assetIds.push(assetId);
}
if (!assets.includes(asset))
assets.push(asset);
return asset;
};
const extractFnOptions = {
assets,
config: loader.config,
cadlEndpoint: loader.cadlEndpoint,
control,
createAsset,
state,
};
if (loader.config) {
const baseUrl = loader.config.get('cadlBaseUrl') || '';
const assetsUrl = (0, replace_1.replacePlaceholders)(((_a = loader.cadlEndpoint) === null || _a === void 0 ? void 0 : _a.assetsUrl) || '', { cadlBaseUrl: baseUrl });
extractFnOptions.baseUrl = baseUrl;
extractFnOptions.assetsUrl = assetsUrl;
}
yield (0, yaml_1.visitAsync)(value, (key, node, path) => tslib_1.__awaiter(this, void 0, void 0, function* () {
for (const fnOrObject of use) {
let fn;
let obj;
if (noodl_core_1.is.fnc(fnOrObject)) {
fn = fnOrObject;
}
else if (noodl_core_1.is.obj(fnOrObject)) {
const { extract } = fnOrObject, opts = tslib_1.__rest(fnOrObject, ["extract"]);
fn = extract;
obj = Object.assign({}, opts);
}
let result = fn === null || fn === void 0 ? void 0 : fn(key, node, path, extractFnOptions);
if (noodl_core_1.is.promise(result))
result = (yield result);
if (obj === null || obj === void 0 ? void 0 : obj.once)
use.splice(use.indexOf(fnOrObject), 1);
if (result === BREAK) {
return BREAK;
}
else if (result === REMOVE) {
return REMOVE;
}
else if (result === SKIP) {
return SKIP;
}
else if ((0, yaml_2.isNode)(result)) {
return result;
}
else if ((0, yaml_2.isPair)(result)) {
return result;
}
}
}));
if (as !== 'array') {
const mapping = {};
for (const asset of assets)
mapping[asset.getId()] = asset;
return mapping;
}
return assets;
});
}
Object.defineProperty(extract, c.idKey, {
configurable: false,
enumerable: false,
writable: false,
value: c._id.extractor,
});
return extract;
}
exports.createExtractor = createExtractor;
exports.default = createExtractor;
//# sourceMappingURL=extractor.js.map