{"ScriptPreparationCode":"const PERIOD = \u0027.\u0027;\r\nconst SINGLE_QUOTE = \u0022\u0027\u0022;\r\nconst DOUBLE_QUOTE = \u0027\u0022\u0027;\r\nconst BACK_TICK = \u0027\u0060\u0027;\r\n\r\nfunction getPartsWithStringIndex(text) {\r\n const parts = [];\r\n let path;\r\n let partStart = 0;\r\n let partEnd = -1;\r\n let quotedWith = null;\r\n let previous;\r\n let current;\r\n for (let index = 0; index \u003C= text.length; index\u002B\u002B) {\r\n previous = current;\r\n current = text[index];\r\n\r\n if (index === partStart) {\r\n if (current === DOUBLE_QUOTE || current === SINGLE_QUOTE || current === BACK_TICK) {\r\n quotedWith = current;\r\n continue;\r\n }\r\n }\r\n if (typeof current === \u0027undefined\u0027 ||\r\n (current === PERIOD \u0026\u0026 (!quotedWith || previous === quotedWith))) {\r\n partEnd = index;\r\n }\r\n if (partStart \u003C partEnd) {\r\n if (quotedWith) {\r\n path = text.substring(partStart \u002B 1, index - 1);\r\n quotedWith = null;\r\n } else {\r\n path = text.substring(partStart, index);\r\n }\r\n parts.push({\r\n path\r\n });\r\n partStart = index \u002B 1;\r\n }\r\n }\r\n\r\n return parts;\r\n}\r\n\r\nfunction getPartsWithCharAt(text) {\r\n const parts = [];\r\n let path;\r\n let partStart = 0;\r\n let partEnd = -1;\r\n let quotedWith = null;\r\n let previous;\r\n let current;\r\n for (let index = 0; index \u003C= text.length; index\u002B\u002B) {\r\n previous = current;\r\n current = text.charAt(index);\r\n\r\n if (index === partStart) {\r\n if (current === DOUBLE_QUOTE || current === SINGLE_QUOTE || current === BACK_TICK) {\r\n quotedWith = current;\r\n continue;\r\n }\r\n }\r\n if (current === \u0027\u0027 ||\r\n (current === PERIOD \u0026\u0026 (!quotedWith || previous === quotedWith))) {\r\n partEnd = index;\r\n }\r\n if (partStart \u003C partEnd) {\r\n if (quotedWith) {\r\n path = text.substring(partStart \u002B 1, index - 1);\r\n quotedWith = null;\r\n } else {\r\n path = text.substring(partStart, index);\r\n }\r\n parts.push({\r\n path\r\n });\r\n partStart = index \u002B 1;\r\n }\r\n }\r\n\r\n return parts;\r\n}\r\nconst PERIOD_CODE = \u0027.\u0027.charCodeAt(0);\r\nconst SINGLE_QUOTE_CODE = \u0022\u0027\u0022.charCodeAt(0);\r\nconst DOUBLE_QUOTE_CODE = \u0027\u0022\u0027.charCodeAt(0);\r\nconst BACK_TICK_CODE = \u0027\u0060\u0027.charCodeAt(0);\r\n\r\nfunction getPartsWithCharCodeAt(text) {\r\n const parts = [];\r\n let path;\r\n let partStart = 0;\r\n let partEnd = -1;\r\n let quotedWith = null;\r\n let previous;\r\n let current;\r\n for (let index = 0; index \u003C= text.length; index\u002B\u002B) {\r\n previous = current;\r\n current = text.charCodeAt(index);\r\n\r\n if (index === partStart) {\r\n if (current === DOUBLE_QUOTE_CODE ||\r\n current === SINGLE_QUOTE_CODE ||\r\n current === BACK_TICK_CODE) {\r\n quotedWith = current;\r\n continue;\r\n }\r\n }\r\n if (isNaN(current) || (current === PERIOD_CODE \u0026\u0026 (!quotedWith || previous === quotedWith))) {\r\n partEnd = index;\r\n }\r\n if (partStart \u003C partEnd) {\r\n if (quotedWith) {\r\n path = text.substring(partStart \u002B 1, index - 1);\r\n quotedWith = null;\r\n } else {\r\n path = text.substring(partStart, index);\r\n }\r\n parts.push({\r\n path\r\n });\r\n partStart = index \u002B 1;\r\n }\r\n }\r\n\r\n return parts;\r\n}\r\nvar testCases = [\r\n // subset of cases\r\n \u0027path.to.a.value\u0027,\r\n \u0027pathTo.someSpecified.aValue\u0027,\r\n \u0027path.\u0022with \u0060inner\u0060 quoted\u0022.\u0022\u0060parts\u0060\u0022\u0027,\r\n \u0027path.\u0022with spaces\u0022.\u0022to a value\u0022\u0027,\r\n \u0027path.\u0022with.dots\u0022.\u0022to.a.value\u0022\u0027\r\n]\r\nvar partsCount = 0","TestCases":[{"Name":"String[index]","Code":"partsCount = 0\r\nfor (const testCase of testCases) {\r\n const parts = getPartsWithStringIndex(testCase)\r\n partsCount \u002B= parts.length\r\n}\r\nif (partsCount !== 16) throw new Error(\u0027String[index] invalid parts count \u0027 \u002B partsCount)","IsDeferred":false},{"Name":"String.charAt(index)","Code":"partsCount = 0\r\nfor (const testCase of testCases) {\r\n const parts = getPartsWithCharAt(testCase)\r\n partsCount \u002B= parts.length\r\n}\r\nif (partsCount !== 16) throw new Error(\u0027String[index] invalid parts count \u0027 \u002B partsCount)","IsDeferred":false},{"Name":"String.charCodeAt(index)","Code":"partsCount = 0\r\nfor (const testCase of testCases) {\r\n const parts = getPartsWithCharCodeAt(testCase)\r\n partsCount \u002B= parts.length\r\n}\r\nif (partsCount !== 16) throw new Error(\u0027String[index] invalid parts count \u0027 \u002B partsCount)","IsDeferred":false}]}