1 | import { EOL } from 'os';
|
2 | import path from 'path';
|
3 | export 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;
|
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 | }
|
33 | export 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 | }
|
39 | function 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 | }
|
53 | const VALUE_ACCESSOR_SELECTORS = `<VALUE_ACCESSOR_SELECTORS>`;
|
54 | const VALUE_ACCESSOR_EVENT = `<VALUE_ACCESSOR_EVENT>`;
|
55 | const VALUE_ACCESSOR_TARGETATTR = '<VALUE_ACCESSOR_TARGETATTR>';
|
56 | const VALUE_ACCESSOR_EVENTTARGETS = ` '(<VALUE_ACCESSOR_EVENT>)': 'handleChangeEvent($event.target.<VALUE_ACCESSOR_TARGETATTR>)'`;
|