|
1 | | -import Data from './modules/data' |
2 | | -import Methods from './modules/methods' |
3 | | -import Mounted from './modules/mounted' |
4 | | -import Imports from './modules/imports' |
| 1 | +import Vue from 'vue' |
| 2 | +import { extractAndUpdateData, setNestedObject, deletePropertyPath, extractAndUpdateMounted } from './modules/helpers' |
| 3 | +import { scriptSectionProcessing } from './modules/common' |
5 | 4 |
|
| 5 | +let dataRegex = /data\s*\(\s*\)\s*\{\s*return\s*{([^]*)}/g |
| 6 | +let mountedRegex = /mounted\s*\(\s*\)\s*{([^]*)}/g |
6 | 7 | class VueScriptParser { |
7 | 8 | constructor(vueScript = '') { |
8 | 9 |
|
9 | 10 | //set original script |
10 | 11 | this.script = vueScript |
11 | 12 |
|
12 | 13 | //load imports |
13 | | - let importsProcessor = new Imports(vueScript) |
14 | | - this.imports = importsProcessor.imports |
| 14 | + |
15 | 15 |
|
16 | 16 | //load data |
17 | | - let dataProcessor = new Data(vueScript) |
18 | | - this.data = dataProcessor.data |
| 17 | + this.data = this.dataReader() |
| 18 | + |
19 | 19 |
|
20 | 20 | //load mounted |
21 | | - let mountedProcessor = new Mounted(vueScript) |
22 | | - this.mounted = mountedProcessor.mounted |
| 21 | + this.mounted = this.mountedReader() |
| 22 | + |
23 | 23 |
|
24 | 24 | //load methods |
25 | | - let methodsProcessor = new Methods(vueScript) |
26 | | - this.methods = methodsProcessor.methods |
27 | | - |
| 25 | + |
28 | 26 | } |
29 | | - addVariable () { |
30 | | - |
| 27 | + |
| 28 | + dataReader () { |
| 29 | + let processedData = extractAndUpdateData(this.script, dataRegex) |
| 30 | + |
| 31 | + let dataFunc = new Function('return {' + processedData.oldData + '}') |
| 32 | + let vm = new Vue({ |
| 33 | + data: dataFunc |
| 34 | + }) |
| 35 | + |
| 36 | + |
| 37 | + let result = [] |
| 38 | + |
| 39 | + Object.keys(vm._data).forEach(key => { |
| 40 | + result.push({ |
| 41 | + key: key, |
| 42 | + value: vm._data[key] |
| 43 | + }) |
| 44 | + }) |
| 45 | + |
| 46 | + |
| 47 | + return result |
31 | 48 | } |
32 | | - removeVariable () { |
| 49 | + |
| 50 | + addData (key, value) { |
| 51 | + let processedData = extractAndUpdateData(this.script, dataRegex) |
| 52 | + |
| 53 | + let dataFunc = new Function('return {' + processedData.oldData + '}') |
| 54 | + let vm = new Vue({ |
| 55 | + data: dataFunc |
| 56 | + }) |
| 57 | + |
| 58 | + vm._data = setNestedObject( |
| 59 | + vm._data, |
| 60 | + key.split('.'), |
| 61 | + value |
| 62 | + ) |
| 63 | + |
| 64 | + let script = |
| 65 | + processedData.data.methodsString.substring( |
| 66 | + 0, |
| 67 | + processedData.data.firstIndex |
| 68 | + ) + |
| 69 | + JSON.stringify(vm._data) + |
| 70 | + processedData.data.methodsString.substring( |
| 71 | + processedData.data.lastIndex + 1, |
| 72 | + processedData.data.methodsString.length |
| 73 | + ) |
| 74 | + |
| 75 | + this.script = this.script.replace( |
| 76 | + /data\s*\(\s*\)\s*\{\s*return\s*{([^]*)}/g, |
| 77 | + script |
| 78 | + ) |
| 79 | + |
| 80 | + } |
| 81 | + |
| 82 | + removeData (key) { |
| 83 | + |
| 84 | + let processedData = extractAndUpdateData(this.script, dataRegex) |
| 85 | + |
| 86 | + let dataFunc = new Function('return {' + processedData.oldData + '}') |
| 87 | + let vm = new Vue({ |
| 88 | + data: dataFunc |
| 89 | + }) |
| 90 | + |
| 91 | + let obj = JSON.parse(JSON.stringify(vm._data)) |
| 92 | + |
| 93 | + deletePropertyPath(obj, key) |
33 | 94 |
|
| 95 | + vm._data = obj |
| 96 | + |
| 97 | + let script = |
| 98 | + processedData.data.methodsString.substring( |
| 99 | + 0, |
| 100 | + processedData.data.firstIndex |
| 101 | + ) + |
| 102 | + JSON.stringify(vm._data) + |
| 103 | + processedData.data.methodsString.substring( |
| 104 | + processedData.data.lastIndex + 1, |
| 105 | + processedData.data.methodsString.length |
| 106 | + ) |
| 107 | + |
| 108 | + this.script = this.script.replace( |
| 109 | + /data\s*\(\s*\)\s*\{\s*return\s*{([^]*)}/g, |
| 110 | + script |
| 111 | + ) |
| 112 | + |
| 113 | + |
| 114 | + } |
| 115 | + mountedReader () { |
| 116 | + |
| 117 | + let newScript = '' |
| 118 | + let matchMounted = this.script.match(mountedRegex) |
| 119 | + |
| 120 | + if (!matchMounted) { |
| 121 | + newScript = '\n mounted() { \n' + '\n}' |
| 122 | + } else { |
| 123 | + let data = scriptSectionProcessing(this.script, mountedRegex) |
| 124 | + newScript = data.methodsString.substring(data.firstIndex + 1, data.lastIndex) |
| 125 | + } |
| 126 | + |
| 127 | + return newScript |
| 128 | + } |
| 129 | + |
| 130 | + addMounted (body) { |
| 131 | + |
| 132 | + let updatedVueScript = extractAndUpdateMounted( |
| 133 | + mountedRegex, |
| 134 | + this.script, |
| 135 | + body |
| 136 | + ); |
| 137 | + |
| 138 | + if (updatedVueScript) { |
| 139 | + this.script = updatedVueScript |
| 140 | + } |
34 | 141 | } |
35 | 142 | } |
36 | 143 |
|
|
0 commit comments