UNPKG

3.19 kBJavaScriptView Raw
1import { EOL } from 'os';
2import path from 'path';
3export default async function generateValueAccessors(compilerCtx, components, outputTarget, config) {
4 if (!Array.isArray(outputTarget.valueAccessorConfigs) || outputTarget.valueAccessorConfigs.length === 0) {
5 return;
6 }
7 const targetDir = path.dirname(outputTarget.directivesProxyFile);
8 const normalizedValueAccessors = outputTarget.valueAccessorConfigs.reduce((allAccessors, va) => {
9 const elementSelectors = Array.isArray(va.elementSelectors) ? va.elementSelectors : [va.elementSelectors];
10 const type = va.type;
11 let allElementSelectors = [];
12 let allEventTargets = [];
13 if (allAccessors.hasOwnProperty(type)) {
14 allElementSelectors = allAccessors[type].elementSelectors;
15 allEventTargets = allAccessors[type].eventTargets;
16 }
17 return Object.assign(Object.assign({}, allAccessors), { [type]: {
18 elementSelectors: allElementSelectors.concat(elementSelectors),
19 eventTargets: allEventTargets.concat([[va.event, va.targetAttr]]),
20 } });
21 }, {});
22 await Promise.all(Object.keys(normalizedValueAccessors).map(async (type) => {
23 const valueAccessorType = type; // Object.keys converts to string
24 const targetFileName = `${type}-value-accessor.ts`;
25 const targetFilePath = path.join(targetDir, targetFileName);
26 const srcFilePath = path.join(__dirname, '../resources/control-value-accessors/', targetFileName);
27 const srcFileContents = await compilerCtx.fs.readFile(srcFilePath);
28 const finalText = createValueAccessor(srcFileContents, normalizedValueAccessors[valueAccessorType]);
29 await compilerCtx.fs.writeFile(targetFilePath, finalText);
30 }));
31 await copyResources(config, ['value-accessor.ts'], targetDir);
32}
33export function createValueAccessor(srcFileContents, valueAccessor) {
34 const hostContents = valueAccessor.eventTargets.map((listItem) => VALUE_ACCESSOR_EVENTTARGETS.replace(VALUE_ACCESSOR_EVENT, listItem[0]).replace(VALUE_ACCESSOR_TARGETATTR, listItem[1]));
35 return srcFileContents
36 .replace(VALUE_ACCESSOR_SELECTORS, valueAccessor.elementSelectors.join(', '))
37 .replace(VALUE_ACCESSOR_EVENTTARGETS, hostContents.join(`,${EOL}`));
38}
39function copyResources(config, resourcesFilesToCopy, directory) {
40 if (!config.sys || !config.sys.copy) {
41 throw new Error('stencil is not properly intialized at this step. Notify the developer');
42 }
43 const copyTasks = resourcesFilesToCopy.map((rf) => {
44 return {
45 src: path.join(__dirname, '../resources/control-value-accessors/', rf),
46 dest: path.join(directory, rf),
47 keepDirStructure: false,
48 warn: false,
49 };
50 });
51 return config.sys.copy(copyTasks, path.join(directory));
52}
53const VALUE_ACCESSOR_SELECTORS = `<VALUE_ACCESSOR_SELECTORS>`;
54const VALUE_ACCESSOR_EVENT = `<VALUE_ACCESSOR_EVENT>`;
55const VALUE_ACCESSOR_TARGETATTR = '<VALUE_ACCESSOR_TARGETATTR>';
56const VALUE_ACCESSOR_EVENTTARGETS = ` '(<VALUE_ACCESSOR_EVENT>)': 'handleChangeEvent($event.target.<VALUE_ACCESSOR_TARGETATTR>)'`;