test('set property', () => { let content = '{\n "x": "y"\n}'; let edits = setProperty(content, ['x'], 'bar', formatterOptions); assertEdit(content, edits, '{\n "x": "bar"\n}'); content = 'true'; edits = setProperty(content, [], 'bar', formatterOptions); assertEdit(content, edits, '"bar"'); });
test('set property', () => { let content = '{\n "x": "y"\n}'; let edits = setProperty(content, ['x'], 'bar', formatterOptions); assertEdit(content, edits, '{\n "x": "bar"\n}'); content = 'true'; edits = setProperty(content, [], 'bar', formatterOptions); assertEdit(content, edits, '"bar"'); content = '{\n "x": "y"\n}'; edits = setProperty(content, ['x'], { key: true }, formatterOptions); assertEdit(content, edits, '{\n "x": {\n "key": true\n }\n}'); content = '{\n "a": "b", "x": "y"\n}'; edits = setProperty(content, ['a'], null, formatterOptions); assertEdit(content, edits, '{\n "a": null, "x": "y"\n}'); });
export function rewriteWorkspaceFileForNewLocation(rawWorkspaceContents: string, configPathURI: URI, targetConfigPathURI: URI) { let storedWorkspace = doParseStoredWorkspace(configPathURI, rawWorkspaceContents); const sourceConfigFolder = dirname(configPathURI); const targetConfigFolder = dirname(targetConfigPathURI); const rewrittenFolders: IStoredWorkspaceFolder[] = []; const slashForPath = useSlashForPath(storedWorkspace.folders); // Rewrite absolute paths to relative paths if the target workspace folder // is a parent of the location of the workspace file itself. Otherwise keep // using absolute paths. for (const folder of storedWorkspace.folders) { let folderURI = isRawFileWorkspaceFolder(folder) ? resolvePath(sourceConfigFolder, folder.path) : URI.parse(folder.uri); rewrittenFolders.push(getStoredWorkspaceFolder(folderURI, folder.name, targetConfigFolder, slashForPath)); } // Preserve as much of the existing workspace as possible by using jsonEdit // and only changing the folders portion. const formattingOptions: FormattingOptions = { insertSpaces: false, tabSize: 4, eol: (isLinux || isMacintosh) ? '\n' : '\r\n' }; const edits = jsonEdit.setProperty(rawWorkspaceContents, ['folders'], rewrittenFolders, formattingOptions); let newContent = jsonEdit.applyEdits(rawWorkspaceContents, edits); if (storedWorkspace.remoteAuthority === getRemoteAuthority(targetConfigPathURI)) { // unsaved remote workspaces have the remoteAuthority set. Remove it when no longer nexessary. newContent = jsonEdit.applyEdits(newContent, jsonEdit.removeProperty(newContent, ['remoteAuthority'], formattingOptions)); } return newContent; }
export function rewriteWorkspaceFileForNewLocation(rawWorkspaceContents: string, configPathURI: URI, targetConfigPathURI: URI) { let storedWorkspace = doParseStoredWorkspace(configPathURI, rawWorkspaceContents); const sourceConfigFolder = dirname(configPathURI); const targetConfigFolder = dirname(targetConfigPathURI); const rewrittenFolders: IStoredWorkspaceFolder[] = []; const slashForPath = useSlashForPath(storedWorkspace.folders); // Rewrite absolute paths to relative paths if the target workspace folder // is a parent of the location of the workspace file itself. Otherwise keep // using absolute paths. for (const folder of storedWorkspace.folders) { let folderURI = isRawFileWorkspaceFolder(folder) ? resolvePath(sourceConfigFolder, folder.path) : URI.parse(folder.uri); rewrittenFolders.push(getStoredWorkspaceFolder(folderURI, folder.name, targetConfigFolder, slashForPath)); } // Preserve as much of the existing workspace as possible by using jsonEdit // and only changing the folders portion. let newRawWorkspaceContents = rawWorkspaceContents; const edits = jsonEdit.setProperty(rawWorkspaceContents, ['folders'], rewrittenFolders, { insertSpaces: false, tabSize: 4, eol: (isLinux || isMacintosh) ? '\n' : '\r\n' }); edits.forEach(edit => { newRawWorkspaceContents = jsonEdit.applyEdit(rawWorkspaceContents, edit); }); return newRawWorkspaceContents; }
test('insert property', () => { let content = "{}"; let edits = setProperty(content, ['foo'], 'bar', formatterOptions); assertEdit(content, edits, '{\n "foo": "bar"\n}'); content = "{\n}"; edits = setProperty(content, ['foo'], 'bar', formatterOptions); assertEdit(content, edits, '{\n "foo": "bar"\n}'); content = " {\n }"; edits = setProperty(content, ['foo'], 'bar', formatterOptions); assertEdit(content, edits, ' {\n "foo": "bar"\n }'); content = '{\n "x": "y"\n}'; edits = setProperty(content, ['foo'], 'bar', formatterOptions); assertEdit(content, edits, '{\n "x": "y",\n "foo": "bar"\n}'); edits = setProperty(content, ['x'], 'bar', formatterOptions); assertEdit(content, edits, '{\n "x": "bar"\n}'); content = '{\n "x": {\n "a": 1,\n "b": true\n }\n}\n'; edits = setProperty(content, ['x'], 'bar', formatterOptions); assertEdit(content, edits, '{\n "x": "bar"\n}\n'); edits = setProperty(content, ['x', 'b'], 'bar', formatterOptions); assertEdit(content, edits, '{\n "x": {\n "a": 1,\n "b": "bar"\n }\n}\n'); edits = setProperty(content, ['x', 'c'], 'bar', formatterOptions, () => 0); assertEdit(content, edits, '{\n "x": {\n "c": "bar",\n "a": 1,\n "b": true\n }\n}\n'); edits = setProperty(content, ['x', 'c'], 'bar', formatterOptions, () => 1); assertEdit(content, edits, '{\n "x": {\n "a": 1,\n "c": "bar",\n "b": true\n }\n}\n'); edits = setProperty(content, ['x', 'c'], 'bar', formatterOptions, () => 2); assertEdit(content, edits, '{\n "x": {\n "a": 1,\n "b": true,\n "c": "bar"\n }\n}\n'); });
test('insert property', () => { let content = '{}'; let edits = setProperty(content, ['foo'], 'bar', formatterOptions); assertEdit(content, edits, '{\n "foo": "bar"\n}'); edits = setProperty(content, ['foo', 'foo2'], 'bar', formatterOptions); assertEdit(content, edits, '{\n "foo": {\n "foo2": "bar"\n }\n}'); content = '{\n}'; edits = setProperty(content, ['foo'], 'bar', formatterOptions); assertEdit(content, edits, '{\n "foo": "bar"\n}'); content = ' {\n }'; edits = setProperty(content, ['foo'], 'bar', formatterOptions); assertEdit(content, edits, ' {\n "foo": "bar"\n }'); content = '{\n "x": "y"\n}'; edits = setProperty(content, ['foo'], 'bar', formatterOptions); assertEdit(content, edits, '{\n "x": "y",\n "foo": "bar"\n}'); content = '{\n "x": "y"\n}'; edits = setProperty(content, ['e'], 'null', formatterOptions); assertEdit(content, edits, '{\n "x": "y",\n "e": "null"\n}'); edits = setProperty(content, ['x'], 'bar', formatterOptions); assertEdit(content, edits, '{\n "x": "bar"\n}'); content = '{\n "x": {\n "a": 1,\n "b": true\n }\n}\n'; edits = setProperty(content, ['x'], 'bar', formatterOptions); assertEdit(content, edits, '{\n "x": "bar"\n}\n'); edits = setProperty(content, ['x', 'b'], 'bar', formatterOptions); assertEdit(content, edits, '{\n "x": {\n "a": 1,\n "b": "bar"\n }\n}\n'); edits = setProperty(content, ['x', 'c'], 'bar', formatterOptions, () => 0); assertEdit(content, edits, '{\n "x": {\n "c": "bar",\n "a": 1,\n "b": true\n }\n}\n'); edits = setProperty(content, ['x', 'c'], 'bar', formatterOptions, () => 1); assertEdit(content, edits, '{\n "x": {\n "a": 1,\n "c": "bar",\n "b": true\n }\n}\n'); edits = setProperty(content, ['x', 'c'], 'bar', formatterOptions, () => 2); assertEdit(content, edits, '{\n "x": {\n "a": 1,\n "b": true,\n "c": "bar"\n }\n}\n'); edits = setProperty(content, ['c'], 'bar', formatterOptions); assertEdit(content, edits, '{\n "x": {\n "a": 1,\n "b": true\n },\n "c": "bar"\n}\n'); content = '{\n "a": [\n {\n } \n ] \n}'; edits = setProperty(content, ['foo'], 'bar', formatterOptions); assertEdit(content, edits, '{\n "a": [\n {\n } \n ],\n "foo": "bar"\n}'); content = ''; edits = setProperty(content, ['foo', 0], 'bar', formatterOptions); assertEdit(content, edits, '{\n "foo": [\n "bar"\n ]\n}'); content = '//comment'; edits = setProperty(content, ['foo', 0], 'bar', formatterOptions); assertEdit(content, edits, '{\n "foo": [\n "bar"\n ]\n} //comment'); });
test('remove last item in the array if there is a comment in the beginning', () => { let content = '// This is a comment\n[\n 1,\n "foo",\n "bar"\n]'; let edits = setProperty(content, [2], void 0, formatterOptions); assertEdit(content, edits, '// This is a comment\n[\n 1,\n "foo"\n]'); });
test('remove last item in the array if ends with comma', () => { let content = '[\n 1,\n "foo",\n "bar",\n]'; let edits = setProperty(content, [2], void 0, formatterOptions); assertEdit(content, edits, '[\n 1,\n "foo"\n]'); });
test('remove item in the middle of the array', () => { let content = '[\n 1,\n 2,\n 3\n]'; let edits = setProperty(content, [1], void 0, formatterOptions); assertEdit(content, edits, '[\n 1,\n 3\n]'); });
test('remove item in array with one item', () => { let content = '[\n 1\n]'; let edits = setProperty(content, [0], void 0, formatterOptions); assertEdit(content, edits, '[]'); });