3.3.3 • Published 3 years ago
@jaredmcateer/uncouth v3.3.3
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
namepropsPropType<...>
datacomputedmethodswatch- intervalHook (ex:
mounted) provide / injectmixinsextendsrender
- Class
classNamecomputeddata- intervalHook (ex:
mounted) rendermethodsMixins$refs
- Object
- vue-property-decorator
@Prop@PropSync@Model@Watch@Provide / @Inject@ProvideReactive / @InjectReactive@Emit@Ref
- vuex-class
@Action@Getter@Mutation@State@<namespace>.Action.Getter.Mutation.State
- replace
thistoprops,variable, orcontext. - 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.