@jaredmcateer/uncouth
v3.3.3
Published
## Remove the class from your Vue components.
Readme
Uncouth
Remove the class from your Vue components.
Converts class based components to Composition API.
Forked from the great work of yoyo930021: https://github.com/yoyo930021/vc2c
Introduction

ASTConvertPlugins is the most important part of this project, it can convert AST to composition APIs.
Custom decorator in ASTConvertPlugins are supported, such as @Subscription.
See Writing a custom ASTConvert for more details.
Supports
The files to be converted must meet the criteria below:
- Scripts must be written in Typescript. (JavaScript may be supported in the future.)
- All syntax must be valid.
- Node.js >= 8.16
Supported features
- vue-class-component
- Object
- [x]
name - [x]
props- [x]
PropType<...>
- [x]
- [x]
data - [ ]
computed - [ ]
methods - [ ]
watch - [x] intervalHook (ex:
mounted) - [ ]
provide / inject - [ ]
mixins - [ ]
extends - [x]
render
- [x]
- Class
- [x]
className - [x]
computed - [x]
data - [x] intervalHook (ex:
mounted) - [x]
render - [x]
methods - [ ]
Mixins - [x]
$refs
- [x]
- Object
- vue-property-decorator
- [x]
@Prop - [ ]
@PropSync - [x]
@Model - [x]
@Watch - [x]
@Provide / @Inject - [ ]
@ProvideReactive / @InjectReactive - [x]
@Emit - [x]
@Ref
- [x]
- vuex-class
- [x]
@Action - [x]
@Getter - [x]
@Mutation - [x]
@State @<namespace>- [ ]
.Action - [ ]
.Getter - [ ]
.Mutation - [ ]
.State
- [ ]
- [x]
- [x] replace
thistoprops,variable, orcontext. - [x] sort by dependency.
Usage
The uncouth project has both CLI and API interface.
CLI
# npm
npx uncouth single [cliOptions] <VueOrTSfilePath>
# yarn
yarn add uncouth
yarn uncouth single [cliOptions] <VueOrTSfilePath>
# volta
sudo volta install uncouth
uncouth single [cliOptions] <VueOrTSfilePath>Options
-v, --view Output file content on stdout, and no write file.
-o, --output Output result file path.
-r, --root <root> Set root path for calc file absolute path. Default:`process.cwd()`.
-c, --config <config> Set uncouth config file path. Default: `'.uncouth.js'`.
-h, --help Output usage information.API
const { convert, convertFile } = require("uncouth");
// Get convert result script
const resultScript = convert(
/* scriptContent */ fileContent, // can't include vue file content, if vue file, only input script element content
/* {UncouthConfig} */ options
);
// Get FileInfo and scriptResult
const { file, result } = convertFile(
/* VueOrTSfilePath */ filePath,
/* rootPath */ cmdOptions.root,
/* UncouthConfigFilePath */ cmdOptions.config
);Uncouth Config
{
// root path for calc file absolute path, if in CLI, --root value will replace.
root?: string, // Default:`process.cwd()`
// show debug message.
debug?: boolean, // Default: `false`
// if true, use @vue/composition-api.
compatible?: boolean, // Default: `false`
// first setup function parameter name.
setupPropsKey?: string, // Default: `props`
// second setup function parameter name.
setupContextKey?: string, // Default: `context`
// Use custom version typescript.
typescript?: typeof ts, // Default: Typescript 3.7.3
// Use custom version vue-template-compiler, please match your project vue versions.
vueTemplateCompiler?: typeof vueTemplateCompiler, // Default: vue-template-compiler 2.6.11
// Use custom prettier config file path. if file does not exist, use default uncouth prettier config.
prettierConfig?: string // Default: `.prettierrc`
// Use custom ASTConvertPlugins for ASTConvert and ASTTransform
plugins?: ASTConvertPlugins,
// if using vuex-class the variable name to use for the store
vuexKey?: string, // Default: `store`
}Plugins
ASTConvertPlugins
import * as ts from "typescript";
// import { ASTConvertPlugins, ASTConverter, ASTTransform } from 'uncouth'
export interface ASTConvertPlugins {
[ts.SyntaxKind.Decorator]: {
// @Component decorator argument ASTConvert
[ts.SyntaxKind.PropertyAssignment]: Array<ASTConverter<ts.PropertyAssignment>>;
[ts.SyntaxKind.MethodDeclaration]: Array<ASTConverter<ts.MethodDeclaration>>;
};
// Class child AST will forEach ASTConverter until return ASTResult by AST SyntaxKind
[ts.SyntaxKind.Identifier]: Array<ASTConverter<ts.Identifier>>;
[ts.SyntaxKind.HeritageClause]: Array<ASTConverter<ts.HeritageClause>>;
[ts.SyntaxKind.PropertyDeclaration]: Array<ASTConverter<ts.PropertyDeclaration>>;
[ts.SyntaxKind.GetAccessor]: Array<ASTConverter<ts.GetAccessorDeclaration>>;
[ts.SyntaxKind.SetAccessor]: Array<ASTConverter<ts.SetAccessorDeclaration>>;
[ts.SyntaxKind.MethodDeclaration]: Array<ASTConverter<ts.MethodDeclaration>>;
// When all ASTConvert finished, run ASTTransform.
after: Array<ASTTransform>;
}ASTConvertPlugins process
Vue Class
@Componentdecorator Object:- Uncouth will parse object properties of
@Componentargument by runningASTConvertfunctions inplugins[ts.SyntaxKind.Decorator][property.kind as ts.SyntaxKind]array. - When
ASTConvertreturns aASTResult, uncouth will record theASTResultand proceed to the next object property. - If
ASTConvertreturnsfalse, uncouth will run the nextASTConvertfunction in the array.
- Uncouth will parse object properties of
Vue Class:
- Uncouth will parse
ClassAST childs by runningASTConvertfunctions inplugins[AST.kind as ts.SyntaxKind]array. - When
ASTConvertreturns aASTResult, uncouth will record theASTResultand proceed to the next object property. - If
ASTConvertreturnsfalse, uncouth will run the nextASTConvertfunction in the array.
- Uncouth will parse
Transform:
- Uncouth will run all
ASTTransformfunctions inplugins.afterarray after finishing the two steps above. - You can use it to merge or sort AST. ex:
computed,removeThis.
- Uncouth will run all
Tips
- You can use https://ts-ast-viewer.com/ to get Typescript ast.
- You can use built-in
ASTConvertorASTTransforminASTConvertPlugins.import { BuiltInPlugins } from "uncouth"; const astConvert: ASTConvert = BuiltInPlugins.convertProp; - You cas use built-in typescript AST utils.
import { getDecoratorNames, isInternalHook } from "uncouth"; ASTConvertfunctions must be placed in order by it's strictness inASTConvertPlugins. Stricter function should be placed up front.- If you want to use Vue any property, you can see link.
ASTConvert Example
Roadmap
- Add more TODO: comments on needed.
- Support more features.
- Convert project.
