1
+ const IS_COMPLEX_PATH = / \. { 2 , } | [ \[ \] ] / g
2
+
1
3
/**
2
4
* Parse a path string into an array of path segments.
3
5
*
14
16
**/
15
17
export function toPath ( path ) {
16
18
if ( Array . isArray ( path ) ) return path
19
+ if ( ! IS_COMPLEX_PATH . test ( path ) ) return path . split ( '.' )
20
+
21
+ return parsePath ( path )
22
+ }
23
+
24
+ function parsePath ( path ) {
25
+ // return parsePathFull(path)
17
26
18
27
let parts = [ ]
19
28
let inBrackets = false
@@ -100,9 +109,7 @@ export function toPath(path) {
100
109
}
101
110
102
111
// Herre for reference in case one is preferred over the other
103
- export function toPathFull ( path ) {
104
- if ( Array . isArray ( path ) ) return path
105
-
112
+ function parsePathFull ( path ) {
106
113
// The general outline/properties of a path string:
107
114
108
115
// Tokens:
@@ -136,9 +143,6 @@ export function toPathFull(path) {
136
143
let error = ( ) => {
137
144
throw new Error ( `Invalid path: ${ path } \n` + `${ ' ' . repeat ( 14 + i ) } ^` )
138
145
}
139
- let startNew = ( ) => ( partStart = i )
140
- let advance = ( ) => ( partEnd = i )
141
- let setInBrackets = ( v ) => ( inBrackets = v )
142
146
let capture = ( ) => parts . push ( path . slice ( partStart , partEnd ) )
143
147
144
148
if ( prev === undefined ) {
@@ -147,8 +151,8 @@ export function toPathFull(path) {
147
151
capture ( )
148
152
} else if ( curr === '[' ) {
149
153
// start -> lb
150
- startNew ( )
151
- setInBrackets ( true )
154
+ partStart = i
155
+ inBrackets = true
152
156
} else if ( curr === ']' ) {
153
157
// start -> rb
154
158
return error ( )
@@ -161,7 +165,7 @@ export function toPathFull(path) {
161
165
return error ( )
162
166
} else {
163
167
// dot -> ident
164
- startNew ( )
168
+ partStart = i
165
169
}
166
170
} else if ( prev === '[' ) {
167
171
if ( curr === '[' || curr === undefined ) {
@@ -170,49 +174,46 @@ export function toPathFull(path) {
170
174
} else if ( curr === ']' ) {
171
175
// lb -> rb
172
176
capture ( )
173
- setInBrackets ( false )
177
+ inBrackets = false
174
178
} else {
175
179
// lb -> ident
176
- startNew ( )
180
+ partStart = i
177
181
}
178
182
} else if ( prev === ']' ) {
179
183
if ( curr === '.' ) {
180
184
// rb -> dot
181
- startNew ( )
185
+ partStart = i
182
186
} else if ( curr === '[' ) {
183
187
// rb -> lb
184
- setInBrackets ( true )
188
+ inBrackets = true
185
189
} else if ( curr === undefined ) {
186
190
// rb -> end
187
191
} else {
188
192
// rb -> rb | ident
189
193
return error ( )
190
194
}
191
195
} else {
196
+ if ( curr === '[' && inBrackets ) {
197
+ // ident -> lb if in brackets
198
+ return error ( )
199
+ }
200
+
201
+ partEnd = i
202
+
192
203
if ( curr === '.' && ! inBrackets ) {
193
204
// ident -> dot
194
- advance ( )
195
205
capture ( )
196
206
} else if ( curr === ']' ) {
197
207
// ident -> rb
198
- advance ( )
199
208
capture ( )
200
- setInBrackets ( false )
201
- } else if ( curr === '[' && inBrackets ) {
202
- // ident -> lb if in brackets
203
- return error ( )
209
+ inBrackets = false
204
210
} else if ( curr === '[' && ! inBrackets ) {
205
211
// ident -> lb
206
- advance ( )
207
212
capture ( )
208
- setInBrackets ( true )
213
+ inBrackets = true
209
214
} else if ( curr === undefined ) {
210
215
// ident -> end
211
- advance ( )
212
216
capture ( )
213
- } else {
214
- // ident -> ident
215
- advance ( )
216
217
}
217
218
}
218
219
}
0 commit comments