|
1 | 1 | // @flow |
2 | 2 | const xss = require('xss'); |
3 | 3 |
|
| 4 | +class PropClass { |
| 5 | + type: any; |
| 6 | + required: boolean; |
| 7 | + default: any; |
| 8 | + constructor(prop: any) { |
| 9 | + prop.required ? this.required = prop.required : null; |
| 10 | + prop.default ? this.default = prop.default : null; |
| 11 | + } |
| 12 | +} |
4 | 13 |
|
5 | 14 | function routesToString(routes: Object[]): string { |
6 | | - let string = ''; |
7 | | - routes.forEach(script => string += scriptToString(script) + ','); |
8 | | - return `[${string}]`; |
| 15 | + let routeString = ''; |
| 16 | + routes.forEach(script => routeString += scriptToString(script) + ','); |
| 17 | + return `[${routeString}]`.replace(new RegExp(/,}/, 'g'), '}').replace(new RegExp(/,]/, 'g'), ']'); |
9 | 18 | } |
10 | 19 |
|
11 | 20 | function routeComponentsToString(script: Object): string { |
12 | | - let string = ''; |
| 21 | + let componentString = ''; |
13 | 22 | for (let member in script) { |
14 | | - string += member + ': __' + script[member] + ','; |
| 23 | + componentString += member + ': __' + script[member] + ','; |
15 | 24 | } |
16 | | - return `{${string}}`; |
| 25 | + return `{${componentString}}`; |
17 | 26 | } |
18 | 27 |
|
19 | 28 | function mixinsToString(mixins: Array < Object > ): string { |
20 | | - var string = ''; |
| 29 | + var mixinString = ''; |
21 | 30 | for (var mixin of mixins) { |
22 | | - string += `${scriptToString(mixin)},`; |
| 31 | + mixinString += `${scriptToString(mixin)},`; |
23 | 32 | } |
24 | | - return string; |
| 33 | + return mixinString; |
25 | 34 | } |
26 | 35 |
|
27 | | -function scriptToString(script: Object): string { |
28 | | - let string = ''; |
| 36 | +function propsToString(props: Object): string { |
| 37 | + let propString = ''; |
| 38 | + if (props[Object.keys(props)[0]].type === null) { |
| 39 | + var propsArray = Object.keys(props); |
| 40 | + propString = xss(JSON.stringify(propsArray)); |
| 41 | + } else { |
| 42 | + let tempProp = {}; |
| 43 | + for (var prop in props) { |
| 44 | + if (props.hasOwnProperty(prop)) { |
| 45 | + var element = new PropClass(props[prop]); |
| 46 | + tempProp[prop] = element; |
| 47 | + } |
| 48 | + } |
| 49 | + propString = scriptToString(tempProp); |
| 50 | + } |
| 51 | + return propString; |
| 52 | +} |
| 53 | + |
| 54 | +function scriptToString(script: Object | any): string { |
| 55 | + let scriptString = ''; |
29 | 56 | for (let member in script) { |
30 | 57 | switch (typeof script[member]) { |
31 | 58 | case 'function': |
32 | 59 | if (member === 'data') { |
33 | 60 | const dataObj = xss(JSON.stringify(script[member]())); |
34 | | - string += `${member}: function(){return ${dataObj}},`; |
| 61 | + scriptString += `${member}: function(){return ${dataObj}},`; |
35 | 62 | } else { |
36 | | - string += member + ': ' + String(script[member]) + ','; |
| 63 | + scriptString += member + ': ' + String(script[member]) + ','; |
37 | 64 | } |
38 | 65 | break; |
39 | 66 | case 'object': |
40 | 67 | if (member === 'data') { |
41 | | - string += member + ': ' + xss(JSON.stringify(script[member])) + ','; |
| 68 | + scriptString += member + ': ' + xss(JSON.stringify(script[member])) + ','; |
42 | 69 | } else if (member === 'routes' || member === 'children') { |
43 | | - string += member + ': ' + routesToString(script[member]) + ','; |
| 70 | + scriptString += member + ': ' + routesToString(script[member]) + ','; |
44 | 71 | } else if (member === 'components' && script['path'] !== undefined) { // Checks if 'components' is in a route object |
45 | | - string += member + ': ' + routeComponentsToString(script[member]) + ','; |
| 72 | + scriptString += member + ': ' + routeComponentsToString(script[member]) + ','; |
46 | 73 | } else if (member === 'mixins') { |
47 | | - string += member + ': [' + mixinsToString(script[member]) + '],'; |
| 74 | + scriptString += member + ': [' + mixinsToString(script[member]) + '],'; |
48 | 75 | } else if (script[member].constructor === Array) { |
49 | | - string += member + ': ' + xss(JSON.stringify(script[member])) + ','; |
| 76 | + scriptString += member + ': ' + xss(JSON.stringify(script[member])) + ','; |
50 | 77 | } else if (member === 'props') { |
51 | | - const propsArray = Object.keys(script[member]); |
52 | | - string += member + ': ' + xss(JSON.stringify(propsArray)) + ','; |
| 78 | + if (script[member][Object.keys(script[member])[0]].type === null) { |
| 79 | + var propsArray = Object.keys(script[member]); |
| 80 | + scriptString += member + ': ' + xss(JSON.stringify(propsArray)) + ','; |
| 81 | + } else { |
| 82 | + // scriptString += member + ': ' + scriptToString(script[member]) + ','; |
| 83 | + const propsString = propsToString(script[member]); |
| 84 | + scriptString += `${member}: ${propsString},`; |
| 85 | + } |
| 86 | + |
53 | 87 | } else { |
54 | | - string += member + ': ' + scriptToString(script[member]) + ','; |
| 88 | + scriptString += member + ': ' + scriptToString(script[member]) + ','; |
55 | 89 | } |
56 | 90 | break; |
57 | 91 | default: |
58 | 92 | if (member === 'component' && script['path'] !== undefined) { // Checks if 'component' is in a route object |
59 | | - string += member + ': __' + script[member] + ','; |
| 93 | + scriptString += member + ': __' + script[member] + ','; |
60 | 94 | } else { |
61 | | - string += member + ': ' + JSON.stringify(script[member]) + ','; |
| 95 | + scriptString += member + ': ' + JSON.stringify(script[member]) + ','; |
62 | 96 | } |
63 | 97 | break; |
64 | 98 | } |
65 | 99 | } |
66 | | - return `{${string}}`; |
| 100 | + let finalScriptString = `{${scriptString}}`.replace(new RegExp(/,}/, 'g'), '}').replace(new RegExp(/,]/, 'g'), ']'); |
| 101 | + return finalScriptString; |
67 | 102 | } |
68 | 103 |
|
69 | 104 | module.exports.scriptToString = scriptToString; |
|
0 commit comments