@@ -44,29 +44,41 @@ export default {
44
44
* createExport(this.componentMap['App'].children)
45
45
* */
46
46
createRouter (location ) {
47
- fs .writeFileSync (
48
- path .join (location, " src" , " router.js" ),
49
- this .createRouterImports (this .componentMap [" App" ].children ) +
50
- this .createExport (this .componentMap [" App" ].children )
51
- );
47
+ if (this .exportAsTypescript === " on" ) {
48
+ fs .writeFileSync (
49
+ path .join (location, " src" , " router.ts" ),
50
+ this .createRouterImports (this .componentMap [" App" ].children ) +
51
+ this .createExport (this .componentMap [" App" ].children )
52
+ );
53
+ } else {
54
+ fs .writeFileSync (
55
+ path .join (location, " src" , " router.js" ),
56
+ this .createRouterImports (this .componentMap [" App" ].children ) +
57
+ this .createExport (this .componentMap [" App" ].children )
58
+ );
59
+ }
52
60
},
53
61
/**
54
62
* @description import routed components from the /views/ dir
55
63
* @argument : this.componentMap['App'].children
56
64
*/
57
65
createRouterImports (appChildren ) {
58
- let str = " import { createRouter, createWebHistory } from 'vue-router'\n " ;
66
+ let str = " import { createRouter, createWebHistory } from 'vue-router'; \n " ;
59
67
appChildren .forEach ((child ) => {
60
- str += ` import ${ child} from './views/${ child} .vue'\n ` ;
68
+ str += ` import ${ child} from './views/${ child} .vue'; \n ` ;
61
69
});
62
70
return str;
63
71
},
64
72
/**
65
73
* @description creates the `export default` code in <script>
66
74
*/
67
75
createExport (appChildren ) {
68
- let str =
69
- " export default createRouter({\n\t history: createWebHistory(),\n\t base: process.env.BASE_URL,\n\t routes: [\n " ;
76
+ let str;
77
+ if (this .exportAsTypescript === ' on' ) {
78
+ str = " export default createRouter({\n\t history: createWebHistory(process.env.BASE_URL),\n\t routes: [\n " ;
79
+ } else {
80
+ str = " export default createRouter({\n\t history: createWebHistory(),\n\t base: process.env.BASE_URL,\n\t routes: [\n " ;
81
+ }
70
82
appChildren .forEach ((child ) => {
71
83
if (child === " HomeView" ) {
72
84
str += ` \t\t {\n\t\t\t path: '/',\n\t\t\t name:'${ child} ',\n\t\t\t component:${ child} \n\t\t },\n ` ;
@@ -211,7 +223,11 @@ export default {
211
223
imports += " mapState, mapActions" ;
212
224
} else if (currentComponent .state .length ) imports += " mapState" ;
213
225
else imports += " mapActions" ;
214
- imports += ' } from "vuex"\n ' ;
226
+ imports += ' } from "vuex";\n ' ;
227
+ }
228
+ // if in Typescript mode, import defineComponent
229
+ if (this .exportAsTypescript === " on" ) {
230
+ imports += ' import { defineComponent } from "vue";\n ' ;
215
231
}
216
232
// add imports for children
217
233
children .forEach ((name ) => {
@@ -258,16 +274,25 @@ export default {
258
274
methods += " },\n " ;
259
275
}
260
276
// concat all code within script tags
261
- let output = " \n\n <script>\n " ;
262
- output +=
263
- imports + " \n export default {\n name: '" + componentName + " '" ;
277
+ let output;
278
+ if (this .exportAsTypescript === ' on' ) {
279
+ output = " \n\n <script lang='ts'>\n " ;
280
+ output += imports + " \n export default defineComponent ({\n name: '" + componentName + " '" ;
281
+ } else {
282
+ output = " \n\n <script>\n " ;
283
+ output += imports + " \n export default {\n name: '" + componentName + " '" ;
284
+ }
264
285
output += " ,\n components: {\n " ;
265
286
output += childrenComponentNames + " },\n " ;
266
287
output += data;
267
288
output += computed;
268
289
output += methods;
269
290
// eslint-disable-next-line no-useless-escape
270
- output += " };\n <\/ script>" ;
291
+ if (this .exportAsTypescript === ' on' ) {
292
+ output += " });\n <\/ script>" ;
293
+ } else {
294
+ output += " };\n <\/ script>" ;
295
+ }
271
296
return output;
272
297
} else {
273
298
let str = " " ;
@@ -279,6 +304,9 @@ export default {
279
304
childrenComponentNames += ` ${ name} ,\n ` ;
280
305
});
281
306
// eslint-disable-next-line no-useless-escape
307
+ if (this .exportAsTypescript === " on" ) {
308
+ return ` \n\n <script lang="ts">\n import { defineComponent } from "vue";\n ${ str} \n export default defineComponent ({\n name: '${ componentName} ',\n components: {\n ${ childrenComponentNames} }\n });\n <\/ script>` ;
309
+ }
282
310
return ` \n\n <script>\n ${ str} \n export default {\n name: '${ componentName} ',\n components: {\n ${ childrenComponentNames} }\n };\n <\/ script>` ;
283
311
}
284
312
},
@@ -315,15 +343,20 @@ export default {
315
343
},
316
344
// creates main.js boilerplate
317
345
createMainFile (location ) {
318
- let str = ` import { createApp } from 'vue'` ;
319
- str += ` \n import App from './App.vue'` ;
320
- str += ` \n import router from './router'` ;
346
+ let str = ` import { createApp } from 'vue'; ` ;
347
+ str += ` \n import App from './App.vue'; ` ;
348
+ str += ` \n import router from './router'; ` ;
321
349
// str += `\n\n import './index.css'`
322
- str += ` \n\n const app = createApp(App)` ;
350
+ str += ` \n\n const app = createApp(App); ` ;
323
351
// str += `\n\trouter,
324
352
str += ` \n app.use(router);` ;
325
353
str += ` \n app.mount('#app');` ;
326
- fs .writeFileSync (path .join (location, " src" , " main.js" ), str);
354
+ // if using typescript, export with .ts extension
355
+ if (this .exportAsTypescript === " on" ) {
356
+ fs .writeFileSync (path .join (location, " src" , " main.ts" ), str);
357
+ } else {
358
+ fs .writeFileSync (path .join (location, " src" , " main.js" ), str);
359
+ }
327
360
},
328
361
// create babel file
329
362
createBabel (location ) {
@@ -332,7 +365,20 @@ export default {
332
365
str += ` \n\t\t '@vue/app'` ;
333
366
str += ` \n\t ]` ;
334
367
str += ` \n }` ;
335
- fs .writeFileSync (path .join (location, " babel.config.js" ), str);
368
+ // if using typescript, export with .ts extension
369
+ if (this .exportAsTypescript === " on" ) {
370
+ fs .writeFileSync (path .join (location, " src" , " babel.config.ts" ), str);
371
+ } else {
372
+ fs .writeFileSync (path .join (location, " babel.config.js" ), str);
373
+ }
374
+ },
375
+ createTSConfig (location ) {
376
+ if (this .exportAsTypescript === " on" ) {
377
+ let str = ` {\n\t "extends": "@vue/tsconfig/tsconfig.web.json",\n\t "include": ["src/**/*", "src/**/*.vue"],\n\t "compilerOptions": {\n\t\t "baseUrl": ".",\n\t\t "paths": {\n\t\t\t "@/*": ["./src/*"]\n\t\t }\n\t }\n }` ;
378
+ fs .writeFileSync (path .join (location, " tsconfig.json" ), str);
379
+ } else {
380
+ return ;
381
+ }
336
382
},
337
383
// create package.json file
338
384
createPackage (location ) {
@@ -358,6 +404,12 @@ export default {
358
404
str += ` \n\t\t "eslint": "^6.7.2",` ;
359
405
str += ` \n\t\t "eslint-plugin-vue": "^7.0.0-0",` ;
360
406
str += ` \n\t\t "@vue/compiler-sfc": "^3.0.0-0"` ;
407
+ if (this .exportAsTypescript === " on" ) {
408
+ str += ` ,\n\t\t "@vue/tsconfig": "^0.1.3",` ;
409
+ str += ` \n\t\t "typescript": "~4.5.5",` ;
410
+ str += ` \n\t\t "vue-tsc": "^0.31.4",` ;
411
+ str += ` \n\t\t "@babel/preset-typescript": "^7.16.7"` ; // not sure we need this?
412
+ }
361
413
str += ` \n\t },` ;
362
414
str += ` \n\t "eslintConfig": {` ;
363
415
str += ` \n\t\t "root": true,` ;
@@ -401,6 +453,7 @@ export default {
401
453
this .createIndexFile (data);
402
454
this .createMainFile (data);
403
455
this .createBabel (data);
456
+ this .createTSConfig (data);
404
457
this .createPackage (data);
405
458
// exports images to the /assets folder
406
459
// eslint-disable-next-line no-unused-vars
@@ -444,7 +497,7 @@ export default {
444
497
},
445
498
},
446
499
computed: {
447
- ... mapState ([" componentMap" , " imagePath" , " routes" ]),
500
+ ... mapState ([" componentMap" , " imagePath" , " routes" , " exportAsTypescript " ]),
448
501
},
449
502
};
450
503
</script >
0 commit comments