-
Notifications
You must be signed in to change notification settings - Fork 37
Expand file tree
/
Copy pathtransform.ts
More file actions
112 lines (100 loc) · 3.08 KB
/
transform.ts
File metadata and controls
112 lines (100 loc) · 3.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import type * as AST from './ast';
import type { TransformResult } from './eo-extend-expression';
import EOExtendExpression from './eo-extend-expression';
import {
createDecoratorImportDeclarations,
getDecoratorImportInfos as getExistingDecoratorImportInfos,
} from './import-helper';
import logger from './log-helper';
import type { Options, UserOptions } from './options';
import {
getEOExtendExpressionCollection,
mergeDecoratorImportSpecs,
} from './parse-helper';
import { getRuntimeData } from './runtime-data';
import type { DecoratorImportSpecs } from './util/index';
/** Main entry point for parsing and replacing ember objects */
export default function maybeTransformEmberObjects(
root: AST.Collection,
filePath: string,
userOptions: UserOptions
): boolean {
const { results, decoratorImportSpecs } = _maybeTransformEmberObjects(
root,
filePath,
userOptions
);
for (const result of results) {
if (!result.success) {
throw new ValidationError(
`Validation errors for class '${
result.className
}':\n\t\t${result.errors.join('\n\t\t')}`
);
}
}
const decoratorsToImport = Object.keys(decoratorImportSpecs).filter(
(key) => decoratorImportSpecs[key as keyof DecoratorImportSpecs]
);
createDecoratorImportDeclarations(root, decoratorsToImport, userOptions);
return results.length > 0 && results.every((r) => r.success);
}
function _maybeTransformEmberObjects(
root: AST.Collection,
filePath: string,
userOptions: UserOptions
): {
results: TransformResult[];
decoratorImportSpecs: DecoratorImportSpecs;
} {
// Parse the import statements
const existingDecoratorImportInfos = getExistingDecoratorImportInfos(root);
const results: TransformResult[] = [];
let decoratorImportSpecs: DecoratorImportSpecs = {
action: false,
classNames: false,
classNameBindings: false,
attributeBindings: false,
layout: false,
templateLayout: false,
off: false,
tagName: false,
unobserves: false,
};
const eoExtendExpressionPaths = getEOExtendExpressionCollection(root);
if (eoExtendExpressionPaths.length === 0) {
logger.info({
filePath,
info: "UNMODIFIED: Did not find any 'EmberObject.extend()' expressions",
});
} else {
const options: Options = {
...userOptions,
runtimeData: getRuntimeData(filePath, userOptions),
};
// eslint-disable-next-line unicorn/no-array-for-each
eoExtendExpressionPaths.forEach((eoExtendExpressionPath) => {
const extendExpression = new EOExtendExpression(
eoExtendExpressionPath,
filePath,
existingDecoratorImportInfos,
options
);
const result = extendExpression.transform();
results.push(result);
if (result.success) {
decoratorImportSpecs = mergeDecoratorImportSpecs(
extendExpression.decoratorImportSpecs,
decoratorImportSpecs
);
}
});
}
return { results, decoratorImportSpecs };
}
class ValidationError extends Error {
constructor(message: string) {
super(message);
this.name = 'ValidationError';
}
}