forked from getyourguide/vue-class-migrator
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpropSync.ts
39 lines (35 loc) · 1.16 KB
/
propSync.ts
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
import { extractPropertiesWithDecorator, stringNodeToSTring } from '../utils';
import type MigrationManager from '../migratorManager';
// @PropSync
export default (migrationManager: MigrationManager) => {
const { clazz } = migrationManager;
const propSyncs = extractPropertiesWithDecorator(clazz, 'PropSync');
propSyncs.forEach((propSync) => {
const decoratorArgs = propSync.getDecoratorOrThrow('PropSync').getArguments();
if (!decoratorArgs.length) {
throw new Error('@PropSync without arguments not supported');
}
const propName = stringNodeToSTring(decoratorArgs[0]);
const propTsType = propSync.getTypeNode();
const propTsTypeText = propTsType?.getText();
migrationManager.addProp({
propName,
propNode: decoratorArgs[1],
tsType: propTsType,
});
migrationManager.addComputedProp({
name: propSync.getName(),
get: {
statements: `return this.${propName};`,
returnType: propTsTypeText,
},
set: {
parameters: [{
name: 'value',
type: propTsTypeText,
}],
statements: `this.$emit('update:${propName}', value);`,
},
});
});
};