@stencil/angular-output-target
Version:
Angular output target for @stencil/core components.
61 lines (60 loc) • 3.48 kB
JavaScript
import { EOL } from 'os';
import path from 'path';
import { OutputTypes } from './utils';
export default async function generateValueAccessors(compilerCtx, components, outputTarget, config) {
if (!Array.isArray(outputTarget.valueAccessorConfigs) || outputTarget.valueAccessorConfigs.length === 0) {
return;
}
const targetDir = path.dirname(outputTarget.directivesProxyFile);
const normalizedValueAccessors = outputTarget.valueAccessorConfigs.reduce((allAccessors, va) => {
const elementSelectors = Array.isArray(va.elementSelectors) ? va.elementSelectors : [va.elementSelectors];
const type = va.type;
let allElementSelectors = [];
let allEventTargets = [];
if (allAccessors.hasOwnProperty(type)) {
allElementSelectors = allAccessors[type].elementSelectors;
allEventTargets = allAccessors[type].eventTargets;
}
return Object.assign(Object.assign({}, allAccessors), { [type]: {
elementSelectors: allElementSelectors.concat(elementSelectors),
eventTargets: allEventTargets.concat([[va.event, va.targetAttr]]),
} });
}, {});
await Promise.all(Object.keys(normalizedValueAccessors).map(async (type) => {
const valueAccessorType = type; // Object.keys converts to string
const targetFileName = `${type}-value-accessor.ts`;
const targetFilePath = path.join(targetDir, targetFileName);
const srcFilePath = path.join(__dirname, '../resources/control-value-accessors/', targetFileName);
const srcFileContents = await compilerCtx.fs.readFile(srcFilePath);
const finalText = createValueAccessor(srcFileContents, normalizedValueAccessors[valueAccessorType], outputTarget.outputType);
await compilerCtx.fs.writeFile(targetFilePath, finalText);
}));
await copyResources(config, ['value-accessor.ts'], targetDir);
}
export function createValueAccessor(srcFileContents, valueAccessor, outputType) {
const hostContents = valueAccessor.eventTargets.map((listItem) => VALUE_ACCESSOR_EVENTTARGETS.replace(VALUE_ACCESSOR_EVENT, listItem[0]).replace(VALUE_ACCESSOR_TARGETATTR, listItem[1]));
return srcFileContents
.replace(VALUE_ACCESSOR_SELECTORS, valueAccessor.elementSelectors.join(', '))
.replace(VALUE_ACCESSOR_EVENTTARGETS, hostContents.join(`,${EOL}`))
.replace(VALUE_ACCESSOR_STANDALONE, outputType && outputType === OutputTypes.Standalone ? ',standalone: true' : '');
}
function copyResources(config, resourcesFilesToCopy, directory) {
if (!config.sys || !config.sys.copy) {
throw new Error('stencil is not properly initialized at this step. Notify the developer');
}
const copyTasks = resourcesFilesToCopy.map((rf) => {
return {
src: path.join(__dirname, '../resources/control-value-accessors/', rf),
dest: path.join(directory, rf),
keepDirStructure: false,
warn: false,
ignore: [],
};
});
return config.sys.copy(copyTasks, path.join(directory));
}
const VALUE_ACCESSOR_SELECTORS = `<VALUE_ACCESSOR_SELECTORS>`;
const VALUE_ACCESSOR_EVENT = `<VALUE_ACCESSOR_EVENT>`;
const VALUE_ACCESSOR_TARGETATTR = '<VALUE_ACCESSOR_TARGETATTR>';
const VALUE_ACCESSOR_STANDALONE = '<VALUE_ACCESSOR_STANDALONE>';
const VALUE_ACCESSOR_EVENTTARGETS = ` '(<VALUE_ACCESSOR_EVENT>)': 'handleChangeEvent($event.target.<VALUE_ACCESSOR_TARGETATTR>)'`;