@fgv/ts-web-extras 5.1.0-4 → 5.1.0-6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/.rush/temp/{44b0369e8112f3c6f4248af466a3f35ad626d9d7.tar.log → 5e8fec808bd019a7b6a148d5097c65cd58a7d86d.tar.log} +2 -2
  2. package/.rush/temp/chunked-rush-logs/ts-web-extras.build.chunks.jsonl +17 -17
  3. package/.rush/temp/operation/build/all.log +17 -17
  4. package/.rush/temp/operation/build/log-chunks.jsonl +17 -17
  5. package/.rush/temp/operation/build/state.json +1 -1
  6. package/dist/packlets/file-tree/httpTreeAccessors.js +72 -42
  7. package/dist/packlets/file-tree/httpTreeAccessors.js.map +1 -1
  8. package/dist/test/unit/httpTreeAccessors.test.js +135 -0
  9. package/dist/test/unit/httpTreeAccessors.test.js.map +1 -1
  10. package/dist/ts-web-extras.d.ts +6 -0
  11. package/lib/packlets/file-tree/httpTreeAccessors.d.ts +6 -0
  12. package/lib/packlets/file-tree/httpTreeAccessors.d.ts.map +1 -1
  13. package/lib/packlets/file-tree/httpTreeAccessors.js +72 -42
  14. package/lib/packlets/file-tree/httpTreeAccessors.js.map +1 -1
  15. package/lib/test/unit/httpTreeAccessors.test.js +135 -0
  16. package/lib/test/unit/httpTreeAccessors.test.js.map +1 -1
  17. package/package.json +10 -10
  18. package/rush-logs/ts-web-extras.build.cache.log +1 -1
  19. package/rush-logs/ts-web-extras.build.log +17 -17
  20. package/src/packlets/file-tree/httpTreeAccessors.ts +76 -46
  21. package/src/test/unit/httpTreeAccessors.test.ts +179 -0
  22. package/temp/build/typescript/ts_8nwakTlr.json +1 -1
  23. package/temp/coverage/crypto-utils/browserCryptoProvider.ts.html +1 -1
  24. package/temp/coverage/crypto-utils/browserHashProvider.ts.html +1 -1
  25. package/temp/coverage/crypto-utils/index.html +1 -1
  26. package/temp/coverage/file-tree/directoryHandleStore.ts.html +1 -1
  27. package/temp/coverage/file-tree/fileApiTreeAccessors.ts.html +1 -1
  28. package/temp/coverage/file-tree/fileSystemAccessTreeAccessors.ts.html +1 -1
  29. package/temp/coverage/file-tree/httpTreeAccessors.ts.html +333 -243
  30. package/temp/coverage/file-tree/index.html +11 -11
  31. package/temp/coverage/file-tree/localStorageTreeAccessors.ts.html +1 -1
  32. package/temp/coverage/helpers/fileTreeHelpers.ts.html +1 -1
  33. package/temp/coverage/helpers/index.html +1 -1
  34. package/temp/coverage/index.html +10 -10
  35. package/temp/coverage/lcov-report/crypto-utils/browserCryptoProvider.ts.html +1 -1
  36. package/temp/coverage/lcov-report/crypto-utils/browserHashProvider.ts.html +1 -1
  37. package/temp/coverage/lcov-report/crypto-utils/index.html +1 -1
  38. package/temp/coverage/lcov-report/file-tree/directoryHandleStore.ts.html +1 -1
  39. package/temp/coverage/lcov-report/file-tree/fileApiTreeAccessors.ts.html +1 -1
  40. package/temp/coverage/lcov-report/file-tree/fileSystemAccessTreeAccessors.ts.html +1 -1
  41. package/temp/coverage/lcov-report/file-tree/httpTreeAccessors.ts.html +333 -243
  42. package/temp/coverage/lcov-report/file-tree/index.html +11 -11
  43. package/temp/coverage/lcov-report/file-tree/localStorageTreeAccessors.ts.html +1 -1
  44. package/temp/coverage/lcov-report/helpers/fileTreeHelpers.ts.html +1 -1
  45. package/temp/coverage/lcov-report/helpers/index.html +1 -1
  46. package/temp/coverage/lcov-report/index.html +10 -10
  47. package/temp/coverage/lcov-report/url-utils/index.html +1 -1
  48. package/temp/coverage/lcov-report/url-utils/urlParams.ts.html +1 -1
  49. package/temp/coverage/lcov.info +470 -437
  50. package/temp/coverage/url-utils/index.html +1 -1
  51. package/temp/coverage/url-utils/urlParams.ts.html +1 -1
  52. package/temp/test/jest/haste-map-7492f1b44480e0cdd1f220078fb3afd8-c8dd6c3430605adeb2f1cadf4f75e791-8c9336785555d572065b28c111982ba4 +0 -0
  53. package/temp/test/jest/perf-cache-7492f1b44480e0cdd1f220078fb3afd8-da39a3ee5e6b4b0d3255bfef95601890 +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"httpTreeAccessors.test.js","sourceRoot":"","sources":["../../../src/test/unit/httpTreeAccessors.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2026 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport '@fgv/ts-utils-jest';\nimport { fail, Logging } from '@fgv/ts-utils';\nimport { HttpTreeAccessors } from '../../packlets/file-tree';\n\n// ---- Mock fetch helpers ----\n\ninterface IMockResponse {\n ok: boolean;\n status?: number;\n jsonValue?: unknown;\n textValue?: string;\n throwOnJson?: boolean;\n throwOnText?: boolean;\n}\n\nfunction makeMockResponse(options: IMockResponse): Response {\n const { ok, status = ok ? 200 : 400, jsonValue, textValue, throwOnJson, throwOnText } = options;\n return {\n ok,\n status,\n statusText: ok ? 'OK' : `Error ${status}`,\n json: throwOnJson\n ? () => Promise.reject(new Error('JSON parse error'))\n : () => Promise.resolve(jsonValue),\n text: throwOnText\n ? () => Promise.reject(new Error('text error'))\n : () => Promise.resolve(textValue ?? `HTTP ${status}`)\n } as unknown as Response;\n}\n\ntype FetchCall = { url: string; init?: RequestInit };\n\n/**\n * Creates a mock fetch function that returns responses for each call in order.\n * Each entry maps to one fetch() invocation in call order.\n */\nfunction makeMockFetch(responses: IMockResponse[]): { fetchImpl: typeof fetch; calls: FetchCall[] } {\n const calls: FetchCall[] = [];\n let callIndex = 0;\n\n const fetchImpl = (url: string | URL | Request, init?: RequestInit): Promise<Response> => {\n calls.push({ url: url.toString(), init });\n const response = responses[callIndex++];\n if (response === undefined) {\n return Promise.reject(new Error(`Unexpected fetch call #${callIndex} to ${url.toString()}`));\n }\n return Promise.resolve(makeMockResponse(response));\n };\n\n return { fetchImpl: fetchImpl as typeof fetch, calls };\n}\n\n/**\n * Creates a mock fetch function that throws a network error on every call.\n */\nfunction makeThrowingFetch(message: string): typeof fetch {\n return (_url: string | URL | Request, _init?: RequestInit): Promise<Response> => {\n return Promise.reject(new Error(message));\n };\n}\n\n// ---- Shared test data builders ----\n\n/** Minimal tree-children response for a single file at root. */\nfunction rootWithOneFile(fileName = 'data.json'): unknown {\n return {\n path: '/',\n children: [{ path: `/${fileName}`, name: fileName, type: 'file' }]\n };\n}\n\n/** File response for a JSON file. */\nfunction fileResponse(path: string, contents: string, contentType?: string): unknown {\n const response: Record<string, unknown> = { path, contents };\n if (contentType !== undefined) {\n response.contentType = contentType;\n }\n return response;\n}\n\n/** Root children response containing a subdirectory and a file. */\nfunction rootWithDirAndFile(): unknown {\n return {\n path: '/',\n children: [\n { path: '/subdir', name: 'subdir', type: 'directory' },\n { path: '/root.json', name: 'root.json', type: 'file' }\n ]\n };\n}\n\n/** Children response for /subdir containing one file. */\nfunction subdirWithOneFile(): unknown {\n return {\n path: '/subdir',\n children: [{ path: '/subdir/nested.json', name: 'nested.json', type: 'file' }]\n };\n}\n\n// ---- Tests ----\n\ndescribe('HttpTreeAccessors', () => {\n describe('fromHttp()', () => {\n test('succeeds with an empty directory (no children)', async () => {\n const { fetchImpl } = makeMockFetch([{ ok: true, jsonValue: { path: '/', children: [] } }]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl\n });\n\n expect(result).toSucceedAndSatisfy((accessors) => {\n expect(accessors).toBeInstanceOf(HttpTreeAccessors);\n expect(accessors.isDirty()).toBe(false);\n });\n });\n\n test('succeeds and loads a single file at root', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{\"items\":{}}') }\n ]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n });\n\n expect(result).toSucceedAndSatisfy((accessors) => {\n expect(accessors.getFileContents('/data.json')).toSucceedWith('{\"items\":{}}');\n });\n });\n\n test('succeeds with multiple files at root', async () => {\n const { fetchImpl } = makeMockFetch([\n {\n ok: true,\n jsonValue: {\n path: '/',\n children: [\n { path: '/alpha.json', name: 'alpha.json', type: 'file' },\n { path: '/beta.json', name: 'beta.json', type: 'file' }\n ]\n }\n },\n { ok: true, jsonValue: fileResponse('/alpha.json', '\"alpha\"') },\n { ok: true, jsonValue: fileResponse('/beta.json', '\"beta\"') }\n ]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n });\n\n expect(result).toSucceedAndSatisfy((accessors) => {\n expect(accessors.getFileContents('/alpha.json')).toSucceedWith('\"alpha\"');\n expect(accessors.getFileContents('/beta.json')).toSucceedWith('\"beta\"');\n });\n });\n\n test('succeeds and recursively loads files in subdirectories', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithDirAndFile() },\n { ok: true, jsonValue: subdirWithOneFile() },\n { ok: true, jsonValue: fileResponse('/subdir/nested.json', '\"nested\"') },\n { ok: true, jsonValue: fileResponse('/root.json', '\"root\"') }\n ]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n });\n\n expect(result).toSucceedAndSatisfy((accessors) => {\n expect(accessors.getFileContents('/subdir/nested.json')).toSucceedWith('\"nested\"');\n expect(accessors.getFileContents('/root.json')).toSucceedWith('\"root\"');\n });\n });\n\n test('strips trailing slash from baseUrl', async () => {\n const { fetchImpl, calls } = makeMockFetch([{ ok: true, jsonValue: { path: '/', children: [] } }]);\n\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000/',\n fetchImpl\n });\n\n // The URL should start with the base URL without a trailing slash, then /tree/children\n expect(calls[0].url).toMatch(/^http:\\/\\/localhost:3000\\/tree\\/children/);\n // There should be no double slash in the path portion (after the protocol)\n const urlPath = calls[0].url.replace('http://', '');\n expect(urlPath).not.toContain('//');\n });\n\n test('includes namespace in query parameters when provided', async () => {\n const { fetchImpl, calls } = makeMockFetch([{ ok: true, jsonValue: { path: '/', children: [] } }]);\n\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n namespace: 'my-namespace',\n fetchImpl\n });\n\n expect(calls[0].url).toContain('namespace=my-namespace');\n });\n\n test('omits namespace from query parameters when not provided', async () => {\n const { fetchImpl, calls } = makeMockFetch([{ ok: true, jsonValue: { path: '/', children: [] } }]);\n\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl\n });\n\n expect(calls[0].url).not.toContain('namespace');\n });\n\n test('applies prefix parameter to loaded file paths', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{\"items\":{}}') }\n ]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n prefix: '/app',\n fetchImpl,\n mutable: true\n });\n\n expect(result).toSucceedAndSatisfy((accessors) => {\n expect(accessors.getFileContents('/app/data.json')).toSucceedWith('{\"items\":{}}');\n });\n });\n\n test('fails when the initial children fetch fails with a network error', async () => {\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl: makeThrowingFetch('Network unreachable')\n });\n\n expect(result).toFailWith(/network unreachable/i);\n });\n\n test('fails when the children response is not ok', async () => {\n const { fetchImpl } = makeMockFetch([{ ok: false, status: 404, textValue: 'Not Found' }]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl\n });\n\n expect(result).toFailWith(/not found/i);\n });\n\n test('fails when the children response contains invalid JSON', async () => {\n const { fetchImpl } = makeMockFetch([{ ok: true, throwOnJson: true }]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl\n });\n\n expect(result).toFailWith(/invalid json/i);\n });\n\n test('fails when a file fetch fails with a network error', async () => {\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n return Promise.reject(new Error('File fetch failed'));\n };\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl\n });\n\n expect(result).toFailWith(/file fetch failed/i);\n });\n\n test('fails when a file response is not ok', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: false, status: 403, textValue: 'Forbidden' }\n ]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl\n });\n\n expect(result).toFailWith(/forbidden/i);\n });\n\n test('fails when a file response contains invalid JSON', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, throwOnJson: true }\n ]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl\n });\n\n expect(result).toFailWith(/invalid json/i);\n });\n\n test('fails when a nested directory fetch fails', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithDirAndFile() },\n { ok: false, status: 500, textValue: 'Internal Server Error' }\n ]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl\n });\n\n expect(result).toFailWith(/internal server error/i);\n });\n });\n\n describe('isDirty() and getDirtyPaths()', () => {\n test('starts not dirty after loading', async () => {\n const { fetchImpl } = makeMockFetch([{ ok: true, jsonValue: { path: '/', children: [] } }]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({ baseUrl: 'http://localhost:3000', fetchImpl })\n ).orThrow();\n\n expect(accessors.isDirty()).toBe(false);\n expect(accessors.getDirtyPaths()).toEqual([]);\n });\n\n test('becomes dirty after saveFileContents', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '{\"modified\":true}').orThrow();\n\n expect(accessors.isDirty()).toBe(true);\n expect(accessors.getDirtyPaths()).toContain('/data.json');\n });\n\n test('tracks multiple dirty files', async () => {\n const { fetchImpl } = makeMockFetch([\n {\n ok: true,\n jsonValue: {\n path: '/',\n children: [\n { path: '/a.json', name: 'a.json', type: 'file' },\n { path: '/b.json', name: 'b.json', type: 'file' }\n ]\n }\n },\n { ok: true, jsonValue: fileResponse('/a.json', '{}') },\n { ok: true, jsonValue: fileResponse('/b.json', '{}') }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/a.json', '\"a\"').orThrow();\n accessors.saveFileContents('/b.json', '\"b\"').orThrow();\n\n expect(accessors.getDirtyPaths()).toHaveLength(2);\n expect(accessors.getDirtyPaths()).toContain('/a.json');\n expect(accessors.getDirtyPaths()).toContain('/b.json');\n });\n\n test('tracks deleted files as pending dirty paths', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.deleteFile('/data.json').orThrow();\n\n expect(accessors.isDirty()).toBe(true);\n expect(accessors.getDirtyPaths()).toContain('/data.json');\n });\n });\n\n describe('saveFileContents()', () => {\n test('fails when the file is not found (immutable tree has no matching path)', async () => {\n const { fetchImpl } = makeMockFetch([{ ok: true, jsonValue: { path: '/', children: [] } }]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({ baseUrl: 'http://localhost:3000', fetchImpl })\n ).orThrow();\n\n // With mutable: false (default), saveFileContents should fail\n const result = accessors.saveFileContents('/missing.json', '{}');\n expect(result).toFail();\n });\n\n test('marks the file as dirty without autoSync', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n const result = accessors.saveFileContents('/data.json', '{\"updated\":true}');\n expect(result).toSucceedWith('{\"updated\":true}');\n expect(accessors.isDirty()).toBe(true);\n // No additional fetch calls should have occurred (no autoSync)\n });\n\n test('triggers fire-and-forget autoSync when autoSync is enabled', async () => {\n const syncResponses: IMockResponse[] = [\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n // PUT /file response for sync\n { ok: true, jsonValue: { path: '/data.json', contents: '{\"auto\":true}' } },\n // POST /sync response\n { ok: true, jsonValue: { synced: 1 } }\n ];\n const { fetchImpl, calls } = makeMockFetch(syncResponses);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true,\n autoSync: true\n })\n ).orThrow();\n\n const result = accessors.saveFileContents('/data.json', '{\"auto\":true}');\n expect(result).toSucceedWith('{\"auto\":true}');\n\n // autoSync fires-and-forgets; wait for microtasks to drain\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n\n // Verify that PUT + POST /sync were called\n const methodCalls = calls.slice(2).map((c) => c.init?.method);\n expect(methodCalls).toContain('PUT');\n expect(methodCalls).toContain('POST');\n });\n\n test('logs when autoSync returns a failure Result', async () => {\n const logger = {\n detail: jest.fn(),\n info: jest.fn(),\n warn: jest.fn(),\n error: jest.fn()\n } as unknown as Logging.LogReporter<unknown>;\n\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true,\n autoSync: true,\n logger\n })\n ).orThrow();\n\n (accessors as unknown as { syncToDisk: () => Promise<ReturnType<typeof fail<void>>> }).syncToDisk =\n async () => fail<void>('simulated sync failure');\n\n accessors.saveFileContents('/data.json', '{\"auto\":true}').orThrow();\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n\n expect(logger.error).toHaveBeenCalledWith(expect.stringContaining('simulated sync failure'));\n });\n\n test('logs when autoSync throws unexpectedly', async () => {\n const logger = {\n detail: jest.fn(),\n info: jest.fn(),\n warn: jest.fn(),\n error: jest.fn()\n } as unknown as Logging.LogReporter<unknown>;\n\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true,\n autoSync: true,\n logger\n })\n ).orThrow();\n\n (accessors as unknown as { syncToDisk: () => Promise<unknown> }).syncToDisk = async () => {\n throw new Error('simulated throw');\n };\n\n accessors.saveFileContents('/data.json', '{\"auto\":true}').orThrow();\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n\n expect(logger.error).toHaveBeenCalledWith(expect.stringContaining('simulated throw'));\n });\n });\n\n describe('fileIsMutable()', () => {\n test('returns persistent detail when file exists and mutable is true', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n const result = accessors.fileIsMutable('/data.json');\n expect(result.isSuccess()).toBe(true);\n if (result.isSuccess()) {\n expect(result.value).toBe(true);\n expect(result.detail).toBe('persistent');\n }\n });\n\n test('returns not-mutable detail when mutable is false', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: false\n })\n ).orThrow();\n\n const result = accessors.fileIsMutable('/data.json');\n expect(result.isFailure()).toBe(true);\n if (result.isFailure()) {\n expect(result.detail).toBe('not-mutable');\n }\n });\n\n test('returns persistent detail for any path when mutable is true (no path existence check)', async () => {\n // InMemoryTreeAccessors checks the mutable config, not path existence.\n // HttpTreeAccessors layers \"persistent\" on top of a successful mutable check.\n const { fetchImpl } = makeMockFetch([{ ok: true, jsonValue: { path: '/', children: [] } }]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n // Any path succeeds as \"persistent\" when mutable: true\n const result = accessors.fileIsMutable('/nonexistent.json');\n expect(result.isSuccess()).toBe(true);\n if (result.isSuccess()) {\n expect(result.value).toBe(true);\n expect(result.detail).toBe('persistent');\n }\n });\n });\n\n describe('syncToDisk()', () => {\n test('succeeds immediately with no dirty files', async () => {\n const { fetchImpl } = makeMockFetch([{ ok: true, jsonValue: { path: '/', children: [] } }]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({ baseUrl: 'http://localhost:3000', fetchImpl })\n ).orThrow();\n\n const result = await accessors.syncToDisk();\n expect(result).toSucceed();\n });\n\n test('PUTs each dirty file then POSTs /sync', async () => {\n const { fetchImpl, calls } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n { ok: true, jsonValue: fileResponse('/data.json', '{\"new\":1}') },\n { ok: true, jsonValue: { synced: 1 } }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '{\"new\":1}').orThrow();\n const result = await accessors.syncToDisk();\n\n expect(result).toSucceed();\n const syncCalls = calls.slice(2);\n expect(syncCalls[0].url).toContain('/file');\n expect(syncCalls[0].init?.method).toBe('PUT');\n expect(syncCalls[1].url).toContain('/sync');\n expect(syncCalls[1].init?.method).toBe('POST');\n });\n\n test('clears dirty state after successful sync', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n { ok: true, jsonValue: fileResponse('/data.json', '\"updated\"') },\n { ok: true, jsonValue: { synced: 1 } }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n expect(accessors.isDirty()).toBe(true);\n\n await accessors.syncToDisk();\n expect(accessors.isDirty()).toBe(false);\n expect(accessors.getDirtyPaths()).toEqual([]);\n });\n\n test('includes namespace in PUT body and POST /sync body when provided', async () => {\n const { fetchImpl, calls } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n { ok: true, jsonValue: fileResponse('/data.json', '\"v2\"') },\n { ok: true, jsonValue: { synced: 1 } }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n namespace: 'myns',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"v2\"').orThrow();\n await accessors.syncToDisk();\n\n const putBody = JSON.parse(calls[2].init?.body as string) as Record<string, unknown>;\n expect(putBody.namespace).toBe('myns');\n\n const syncBody = JSON.parse(calls[3].init?.body as string) as Record<string, unknown>;\n expect(syncBody.namespace).toBe('myns');\n });\n\n test('omits namespace from PUT body and POST /sync body when not provided', async () => {\n const { fetchImpl, calls } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n { ok: true, jsonValue: fileResponse('/data.json', '\"v2\"') },\n { ok: true, jsonValue: { synced: 1 } }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"v2\"').orThrow();\n await accessors.syncToDisk();\n\n const putBody = JSON.parse(calls[2].init?.body as string) as Record<string, unknown>;\n expect(putBody.namespace).toBeUndefined();\n\n const syncBody = JSON.parse(calls[3].init?.body as string) as Record<string, unknown>;\n expect(syncBody.namespace).toBeUndefined();\n });\n\n test('fails when PUT for a dirty file returns a non-ok response', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n { ok: false, status: 500, textValue: 'Server Error' }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n const result = await accessors.syncToDisk();\n\n expect(result).toFailWith(/sync.*data\\.json.*server error/i);\n });\n\n test('fails when PUT for a dirty file encounters a network error', async () => {\n jest.useFakeTimers();\n try {\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n if (callCount === 2) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '{}') })\n );\n }\n return Promise.reject(new Error('PUT network error'));\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n\n const syncPromise = accessors.syncToDisk();\n await jest.advanceTimersByTimeAsync(1500);\n\n const result = await syncPromise;\n expect(result).toFailWith(/put network error/i);\n } finally {\n jest.useRealTimers();\n }\n });\n\n test('fails when POST /sync returns a non-ok response', async () => {\n jest.useFakeTimers();\n try {\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n if (callCount === 2) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '{}') })\n );\n }\n if (callCount === 3) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '\"v2\"') })\n );\n }\n // All /sync attempts: persistent 503\n return Promise.resolve(\n makeMockResponse({ ok: false, status: 503, textValue: 'Service Unavailable' })\n );\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"v2\"').orThrow();\n\n const syncPromise = accessors.syncToDisk();\n // Advance past both backoff delays: 500ms + 1000ms\n await jest.advanceTimersByTimeAsync(1500);\n\n const result = await syncPromise;\n expect(result).toFailWith(/service unavailable/i);\n } finally {\n jest.useRealTimers();\n }\n });\n\n test('fails when POST /sync encounters a network error', async () => {\n jest.useFakeTimers();\n try {\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n if (callCount === 2) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '{}') })\n );\n }\n if (callCount === 3) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '\"v2\"') })\n );\n }\n return Promise.reject(new Error('POST network error'));\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"v2\"').orThrow();\n\n const syncPromise = accessors.syncToDisk();\n await jest.advanceTimersByTimeAsync(1500);\n\n const result = await syncPromise;\n expect(result).toFailWith(/post network error/i);\n } finally {\n jest.useRealTimers();\n }\n });\n\n test('syncs multiple dirty files in order', async () => {\n const { fetchImpl, calls } = makeMockFetch([\n {\n ok: true,\n jsonValue: {\n path: '/',\n children: [\n { path: '/a.json', name: 'a.json', type: 'file' },\n { path: '/b.json', name: 'b.json', type: 'file' }\n ]\n }\n },\n { ok: true, jsonValue: fileResponse('/a.json', '{}') },\n { ok: true, jsonValue: fileResponse('/b.json', '{}') },\n { ok: true, jsonValue: fileResponse('/a.json', '\"a-updated\"') },\n { ok: true, jsonValue: fileResponse('/b.json', '\"b-updated\"') },\n { ok: true, jsonValue: { synced: 2 } }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/a.json', '\"a-updated\"').orThrow();\n accessors.saveFileContents('/b.json', '\"b-updated\"').orThrow();\n\n const result = await accessors.syncToDisk();\n expect(result).toSucceed();\n\n // Verify 2 PUTs + 1 POST\n const syncCalls = calls.slice(3);\n const methods = syncCalls.map((c) => c.init?.method);\n expect(methods.filter((m) => m === 'PUT')).toHaveLength(2);\n expect(methods.filter((m) => m === 'POST')).toHaveLength(1);\n });\n\n test('DELETEs pending deletions before POST /sync', async () => {\n const { fetchImpl, calls } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n { ok: true, jsonValue: { deleted: true } },\n { ok: true, jsonValue: { synced: 0 } }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.deleteFile('/data.json').orThrow();\n const result = await accessors.syncToDisk();\n\n expect(result).toSucceed();\n const syncCalls = calls.slice(2);\n expect(syncCalls[0].init?.method).toBe('DELETE');\n expect(syncCalls[0].url).toContain('/file?');\n expect(syncCalls[1].init?.method).toBe('POST');\n expect(accessors.isDirty()).toBe(false);\n });\n\n test('fails when DELETE for pending deletion returns non-ok response', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n { ok: false, status: 500, textValue: 'Delete failed' }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.deleteFile('/data.json').orThrow();\n const result = await accessors.syncToDisk();\n\n expect(result).toFailWith(/delete.*data\\.json.*delete failed/i);\n });\n });\n\n describe('syncToDisk() - getFileContents failure', () => {\n test('fails when getFileContents returns failure for a dirty file during sync', async () => {\n // This covers lines 112-113: the contentsResult.isFailure() branch in syncToDisk.\n // We load a file, mark it dirty, then sabotage getFileContents to fail.\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '{\"new\":1}').orThrow();\n\n // Sabotage the base getFileContents to simulate a failure\n const originalGet = accessors.getFileContents.bind(accessors);\n accessors.getFileContents = (path: string) => {\n if (path === '/data.json') {\n // eslint-disable-next-line import/no-internal-modules\n const { fail: failResult } = require('@fgv/ts-utils') as typeof import('@fgv/ts-utils');\n return failResult('simulated get failure');\n }\n return originalGet(path);\n };\n\n const result = await accessors.syncToDisk();\n expect(result).toFailWith(/simulated get failure/i);\n });\n });\n\n describe('_request() invalid JSON during sync', () => {\n test('fails when PUT /file returns invalid JSON', async () => {\n // Covers lines 225-226: _request() returns fail('invalid JSON response')\n // when response.json() throws during a sync PUT.\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n // PUT response with ok=true but throwOnJson simulates invalid JSON body\n { ok: true, throwOnJson: true }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n const result = await accessors.syncToDisk();\n\n expect(result).toFailWith(/invalid json/i);\n });\n });\n\n describe('fromHttp() with inferContentType', () => {\n test('calls inferContentType when provided and uses the result', async () => {\n // Covers line 270: params.inferContentType?.(...).orDefault()\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}', 'application/json') }\n ]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n inferContentType: (path, provided) => {\n if (provided === 'application/json') {\n const { succeed: s } = require('@fgv/ts-utils') as typeof import('@fgv/ts-utils');\n return s('json' as string);\n }\n const { succeed: s } = require('@fgv/ts-utils') as typeof import('@fgv/ts-utils');\n return s(undefined);\n }\n });\n\n expect(result).toSucceed();\n });\n });\n\n describe('_request() error handling', () => {\n test('returns failure with error message for network error (Error instance throw) during sync', async () => {\n // Covers line 214 true branch: response.err instanceof Error -> uses .message\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n if (callCount === 2) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '{}') }));\n }\n // PUT request throws an Error instance\n return Promise.reject(new Error('real Error instance'));\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n const result = await accessors.syncToDisk();\n\n expect(result).toFailWith(/real error instance/i);\n });\n\n test('returns failure with error message for non-Error throw during sync PUT', async () => {\n // Covers line 214 false branch: thrown value is not an Error instance -> uses String(response.err)\n // Must be triggered via syncToDisk() which uses the instance _request() method.\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n if (callCount === 2) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '{}') }));\n }\n // Non-Error throw (e.g., a plain string)\n return Promise.reject('non-error string rejection');\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n const result = await accessors.syncToDisk();\n\n expect(result).toFailWith(/non-error string rejection/i);\n });\n\n test('returns failure with HTTP status fallback when response.text() throws during sync', async () => {\n // Covers the text() catch branch in _request(): uses `HTTP ${status}` fallback\n // 502 is transient so retries will be attempted; use fake timers to avoid real delays\n jest.useFakeTimers();\n try {\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n if (callCount === 2) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '{}') })\n );\n }\n return Promise.resolve(makeMockResponse({ ok: false, status: 502, throwOnText: true }));\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n\n const syncPromise = accessors.syncToDisk();\n await jest.advanceTimersByTimeAsync(1500);\n\n const result = await syncPromise;\n expect(result).toFailWith(/http 502/i);\n } finally {\n jest.useRealTimers();\n }\n });\n });\n\n describe('_requestWithParams() error handling', () => {\n test('returns failure with error message for non-Error network throw during init', async () => {\n // _requestWithParams is used for GET requests during fromHttp(); test non-Error throw branch\n const fetchImpl: typeof fetch = (_url, _init) => {\n return Promise.reject(42);\n };\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl\n });\n\n expect(result).toFailWith(/42/);\n });\n\n test('returns failure with HTTP status fallback when response.text() throws during init', async () => {\n const fetchImpl: typeof fetch = (_url, _init) => {\n return Promise.resolve(makeMockResponse({ ok: false, status: 504, throwOnText: true }));\n };\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl\n });\n\n expect(result).toFailWith(/http 504/i);\n });\n\n test('uses globalThis.fetch when no fetchImpl provided', async () => {\n // Covers line 48: the `fetchImpl ?? globalThis.fetch` right-side branch.\n // We temporarily replace globalThis.fetch with a mock that returns an empty tree.\n const originalFetch = globalThis.fetch;\n let fetchCallCount = 0;\n\n globalThis.fetch = (_url: string | URL | Request, _init?: RequestInit) => {\n fetchCallCount++;\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: { path: '/', children: [] } }));\n };\n\n try {\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000'\n // No fetchImpl - should fall back to globalThis.fetch\n });\n\n expect(result).toSucceed();\n expect(fetchCallCount).toBeGreaterThan(0);\n } finally {\n globalThis.fetch = originalFetch;\n }\n });\n });\n\n describe('userId header in _request()', () => {\n test('includes X-User-Id header in PUT /file and POST /sync requests when userId is set', async () => {\n // Covers line 259: the this._userId branch in _request()\n const { fetchImpl, calls } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n { ok: true, jsonValue: fileResponse('/data.json', '\"updated\"') },\n { ok: true, jsonValue: { synced: 1 } }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true,\n userId: 'test-user-123'\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n const result = await accessors.syncToDisk();\n expect(result).toSucceed();\n\n // The PUT and POST requests should include the X-User-Id header\n const syncCalls = calls.slice(2);\n for (const call of syncCalls) {\n const headers = call.init?.headers as Record<string, string> | undefined;\n expect(headers?.['X-User-Id']).toBe('test-user-123');\n }\n });\n });\n\n describe('deleteFile()', () => {\n test('fails when the underlying InMemoryTreeAccessors deleteFile fails (file not found)', async () => {\n // Covers lines 200-201: result.isFailure() branch in deleteFile\n const { fetchImpl } = makeMockFetch([{ ok: true, jsonValue: { path: '/', children: [] } }]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({ baseUrl: 'http://localhost:3000', fetchImpl, mutable: true })\n ).orThrow();\n\n // Delete a file that does not exist — super.deleteFile should fail\n const result = accessors.deleteFile('/nonexistent.json');\n expect(result).toFail();\n });\n\n test('includes namespace in DELETE query params when namespace is configured', async () => {\n // Covers lines 131-132: the namespace branch in syncToDisk's pending-deletion loop\n const { fetchImpl, calls } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n { ok: true, jsonValue: { deleted: true } },\n { ok: true, jsonValue: { synced: 0 } }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n namespace: 'my-namespace',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.deleteFile('/data.json').orThrow();\n const result = await accessors.syncToDisk();\n\n expect(result).toSucceed();\n\n // The DELETE request URL should include namespace as a query parameter\n const deleteCalls = calls.filter((c) => c.init?.method === 'DELETE');\n expect(deleteCalls).toHaveLength(1);\n expect(deleteCalls[0].url).toContain('namespace=my-namespace');\n });\n\n test('triggers fire-and-forget autoSync after successful delete when autoSync is enabled', async () => {\n // Covers lines 209-212: the autoSync branch in deleteFile\n const syncResponses: IMockResponse[] = [\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n // DELETE /file response for pending deletion\n { ok: true, jsonValue: { deleted: true } },\n // POST /sync response\n { ok: true, jsonValue: { synced: 0 } }\n ];\n const { fetchImpl, calls } = makeMockFetch(syncResponses);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true,\n autoSync: true\n })\n ).orThrow();\n\n const result = accessors.deleteFile('/data.json');\n expect(result).toSucceedWith(true);\n\n // autoSync fires-and-forgets; wait for microtasks to drain\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n\n // Verify that DELETE + POST /sync were called\n const methodCalls = calls.slice(2).map((c) => c.init?.method);\n expect(methodCalls).toContain('DELETE');\n expect(methodCalls).toContain('POST');\n });\n });\n\n describe('_requestWithRetry()', () => {\n test('succeeds on second attempt after a transient 503 error', async () => {\n jest.useFakeTimers();\n try {\n // Responses: init (GET tree/children), then PUT fails with 503, then PUT succeeds, then POST /sync succeeds\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n if (callCount === 2) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '{}') })\n );\n }\n // First PUT attempt: transient 503\n if (callCount === 3) {\n return Promise.resolve(\n makeMockResponse({ ok: false, status: 503, textValue: '503 Service Unavailable' })\n );\n }\n // Second PUT attempt: success\n if (callCount === 4) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '\"updated\"') })\n );\n }\n // POST /sync\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: { synced: 1 } }));\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n\n const syncPromise = accessors.syncToDisk();\n\n // Advance past the 500ms backoff for the first retry\n await jest.advanceTimersByTimeAsync(500);\n\n const result = await syncPromise;\n expect(result).toSucceed();\n // Three PUT-related calls: init (2) + first PUT attempt (1) + retry PUT (1) + POST sync (1)\n expect(callCount).toBe(5);\n } finally {\n jest.useRealTimers();\n }\n });\n\n test('does not retry on a non-transient error (e.g. 404)', async () => {\n jest.useFakeTimers();\n try {\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n if (callCount === 2) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '{}') })\n );\n }\n // PUT attempt: non-transient 404\n return Promise.resolve(makeMockResponse({ ok: false, status: 404, textValue: 'Not Found' }));\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n\n const result = await accessors.syncToDisk();\n\n // No timers should need advancing - non-transient errors return immediately\n expect(result).toFailWith(/not found/i);\n // Only 3 calls: 2 init + 1 PUT (no retries)\n expect(callCount).toBe(3);\n } finally {\n jest.useRealTimers();\n }\n });\n\n test('returns the last error after exhausting all retries on persistent transient errors', async () => {\n jest.useFakeTimers();\n try {\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n if (callCount === 2) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '{}') })\n );\n }\n // All PUT attempts: transient 502 every time\n return Promise.resolve(makeMockResponse({ ok: false, status: 502, textValue: '502 Bad Gateway' }));\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n\n const syncPromise = accessors.syncToDisk();\n\n // Advance past both backoff delays: 500ms (attempt 1) + 1000ms (attempt 2)\n await jest.advanceTimersByTimeAsync(1500);\n\n const result = await syncPromise;\n expect(result).toFailWith(/502 bad gateway/i);\n // 2 init + 3 PUT attempts (maxAttempts = 3)\n expect(callCount).toBe(5);\n } finally {\n jest.useRealTimers();\n }\n });\n\n test('logs retry message with method name from init when retrying', async () => {\n jest.useFakeTimers();\n try {\n const logger = {\n detail: jest.fn(),\n info: jest.fn(),\n warn: jest.fn(),\n error: jest.fn()\n } as unknown as Logging.LogReporter<unknown>;\n\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n if (callCount === 2) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '{}') })\n );\n }\n // First PUT attempt: transient 503\n if (callCount === 3) {\n return Promise.resolve(\n makeMockResponse({ ok: false, status: 503, textValue: '503 Service Unavailable' })\n );\n }\n // Second PUT attempt: success\n if (callCount === 4) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '\"updated\"') })\n );\n }\n // POST /sync\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: { synced: 1 } }));\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true,\n logger\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n\n const syncPromise = accessors.syncToDisk();\n await jest.advanceTimersByTimeAsync(500);\n await syncPromise;\n\n // The retry log message should include the method name (PUT) from init\n expect(logger.detail).toHaveBeenCalledWith(expect.stringContaining('PUT'));\n } finally {\n jest.useRealTimers();\n }\n });\n });\n\n describe('syncToDisk() concurrency guard', () => {\n test('concurrent syncToDisk calls share the same promise and only make one set of network calls', async () => {\n const { fetchImpl, calls } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n // PUT /file for the single sync\n { ok: true, jsonValue: fileResponse('/data.json', '\"updated\"') },\n // POST /sync\n { ok: true, jsonValue: { synced: 1 } }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n\n // Start two concurrent syncToDisk calls without awaiting the first\n const promise1 = accessors.syncToDisk();\n const promise2 = accessors.syncToDisk();\n\n const [result1, result2] = await Promise.all([promise1, promise2]);\n\n expect(result1).toSucceed();\n expect(result2).toSucceed();\n\n // Both promises should have resolved to the same underlying promise result.\n // Only one PUT and one POST /sync should have been issued (not doubled).\n const syncCalls = calls.slice(2);\n const putCalls = syncCalls.filter((c) => c.init?.method === 'PUT');\n const postCalls = syncCalls.filter((c) => c.init?.method === 'POST');\n expect(putCalls).toHaveLength(1);\n expect(postCalls).toHaveLength(1);\n });\n });\n});\n"]}
1
+ {"version":3,"file":"httpTreeAccessors.test.js","sourceRoot":"","sources":["../../../src/test/unit/httpTreeAccessors.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2026 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport '@fgv/ts-utils-jest';\nimport { fail, Logging } from '@fgv/ts-utils';\nimport { HttpTreeAccessors } from '../../packlets/file-tree';\n\n// ---- Mock fetch helpers ----\n\ninterface IMockResponse {\n ok: boolean;\n status?: number;\n jsonValue?: unknown;\n textValue?: string;\n throwOnJson?: boolean;\n throwOnText?: boolean;\n}\n\nfunction makeMockResponse(options: IMockResponse): Response {\n const { ok, status = ok ? 200 : 400, jsonValue, textValue, throwOnJson, throwOnText } = options;\n return {\n ok,\n status,\n statusText: ok ? 'OK' : `Error ${status}`,\n json: throwOnJson\n ? () => Promise.reject(new Error('JSON parse error'))\n : () => Promise.resolve(jsonValue),\n text: throwOnText\n ? () => Promise.reject(new Error('text error'))\n : () => Promise.resolve(textValue ?? `HTTP ${status}`)\n } as unknown as Response;\n}\n\ntype FetchCall = { url: string; init?: RequestInit };\n\n/**\n * Creates a mock fetch function that returns responses for each call in order.\n * Each entry maps to one fetch() invocation in call order.\n */\nfunction makeMockFetch(responses: IMockResponse[]): { fetchImpl: typeof fetch; calls: FetchCall[] } {\n const calls: FetchCall[] = [];\n let callIndex = 0;\n\n const fetchImpl = (url: string | URL | Request, init?: RequestInit): Promise<Response> => {\n calls.push({ url: url.toString(), init });\n const response = responses[callIndex++];\n if (response === undefined) {\n return Promise.reject(new Error(`Unexpected fetch call #${callIndex} to ${url.toString()}`));\n }\n return Promise.resolve(makeMockResponse(response));\n };\n\n return { fetchImpl: fetchImpl as typeof fetch, calls };\n}\n\n/**\n * Creates a mock fetch function that throws a network error on every call.\n */\nfunction makeThrowingFetch(message: string): typeof fetch {\n return (_url: string | URL | Request, _init?: RequestInit): Promise<Response> => {\n return Promise.reject(new Error(message));\n };\n}\n\n// ---- Shared test data builders ----\n\n/** Minimal tree-children response for a single file at root. */\nfunction rootWithOneFile(fileName = 'data.json'): unknown {\n return {\n path: '/',\n children: [{ path: `/${fileName}`, name: fileName, type: 'file' }]\n };\n}\n\n/** File response for a JSON file. */\nfunction fileResponse(path: string, contents: string, contentType?: string): unknown {\n const response: Record<string, unknown> = { path, contents };\n if (contentType !== undefined) {\n response.contentType = contentType;\n }\n return response;\n}\n\n/** Root children response containing a subdirectory and a file. */\nfunction rootWithDirAndFile(): unknown {\n return {\n path: '/',\n children: [\n { path: '/subdir', name: 'subdir', type: 'directory' },\n { path: '/root.json', name: 'root.json', type: 'file' }\n ]\n };\n}\n\n/** Children response for /subdir containing one file. */\nfunction subdirWithOneFile(): unknown {\n return {\n path: '/subdir',\n children: [{ path: '/subdir/nested.json', name: 'nested.json', type: 'file' }]\n };\n}\n\n// ---- Tests ----\n\ndescribe('HttpTreeAccessors', () => {\n describe('fromHttp()', () => {\n test('succeeds with an empty directory (no children)', async () => {\n const { fetchImpl } = makeMockFetch([{ ok: true, jsonValue: { path: '/', children: [] } }]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl\n });\n\n expect(result).toSucceedAndSatisfy((accessors) => {\n expect(accessors).toBeInstanceOf(HttpTreeAccessors);\n expect(accessors.isDirty()).toBe(false);\n });\n });\n\n test('succeeds and loads a single file at root', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{\"items\":{}}') }\n ]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n });\n\n expect(result).toSucceedAndSatisfy((accessors) => {\n expect(accessors.getFileContents('/data.json')).toSucceedWith('{\"items\":{}}');\n });\n });\n\n test('succeeds with multiple files at root', async () => {\n const { fetchImpl } = makeMockFetch([\n {\n ok: true,\n jsonValue: {\n path: '/',\n children: [\n { path: '/alpha.json', name: 'alpha.json', type: 'file' },\n { path: '/beta.json', name: 'beta.json', type: 'file' }\n ]\n }\n },\n { ok: true, jsonValue: fileResponse('/alpha.json', '\"alpha\"') },\n { ok: true, jsonValue: fileResponse('/beta.json', '\"beta\"') }\n ]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n });\n\n expect(result).toSucceedAndSatisfy((accessors) => {\n expect(accessors.getFileContents('/alpha.json')).toSucceedWith('\"alpha\"');\n expect(accessors.getFileContents('/beta.json')).toSucceedWith('\"beta\"');\n });\n });\n\n test('succeeds and recursively loads files in subdirectories', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithDirAndFile() },\n { ok: true, jsonValue: subdirWithOneFile() },\n { ok: true, jsonValue: fileResponse('/subdir/nested.json', '\"nested\"') },\n { ok: true, jsonValue: fileResponse('/root.json', '\"root\"') }\n ]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n });\n\n expect(result).toSucceedAndSatisfy((accessors) => {\n expect(accessors.getFileContents('/subdir/nested.json')).toSucceedWith('\"nested\"');\n expect(accessors.getFileContents('/root.json')).toSucceedWith('\"root\"');\n });\n });\n\n test('strips trailing slash from baseUrl', async () => {\n const { fetchImpl, calls } = makeMockFetch([{ ok: true, jsonValue: { path: '/', children: [] } }]);\n\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000/',\n fetchImpl\n });\n\n // The URL should start with the base URL without a trailing slash, then /tree/children\n expect(calls[0].url).toMatch(/^http:\\/\\/localhost:3000\\/tree\\/children/);\n // There should be no double slash in the path portion (after the protocol)\n const urlPath = calls[0].url.replace('http://', '');\n expect(urlPath).not.toContain('//');\n });\n\n test('includes namespace in query parameters when provided', async () => {\n const { fetchImpl, calls } = makeMockFetch([{ ok: true, jsonValue: { path: '/', children: [] } }]);\n\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n namespace: 'my-namespace',\n fetchImpl\n });\n\n expect(calls[0].url).toContain('namespace=my-namespace');\n });\n\n test('omits namespace from query parameters when not provided', async () => {\n const { fetchImpl, calls } = makeMockFetch([{ ok: true, jsonValue: { path: '/', children: [] } }]);\n\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl\n });\n\n expect(calls[0].url).not.toContain('namespace');\n });\n\n test('applies prefix parameter to loaded file paths', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{\"items\":{}}') }\n ]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n prefix: '/app',\n fetchImpl,\n mutable: true\n });\n\n expect(result).toSucceedAndSatisfy((accessors) => {\n expect(accessors.getFileContents('/app/data.json')).toSucceedWith('{\"items\":{}}');\n });\n });\n\n test('fails when the initial children fetch fails with a network error', async () => {\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl: makeThrowingFetch('Network unreachable')\n });\n\n expect(result).toFailWith(/network unreachable/i);\n });\n\n test('fails when the children response is not ok', async () => {\n const { fetchImpl } = makeMockFetch([{ ok: false, status: 404, textValue: 'Not Found' }]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl\n });\n\n expect(result).toFailWith(/not found/i);\n });\n\n test('fails when the children response contains invalid JSON', async () => {\n const { fetchImpl } = makeMockFetch([{ ok: true, throwOnJson: true }]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl\n });\n\n expect(result).toFailWith(/invalid json/i);\n });\n\n test('fails when a file fetch fails with a network error', async () => {\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n return Promise.reject(new Error('File fetch failed'));\n };\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl\n });\n\n expect(result).toFailWith(/file fetch failed/i);\n });\n\n test('fails when a file response is not ok', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: false, status: 403, textValue: 'Forbidden' }\n ]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl\n });\n\n expect(result).toFailWith(/forbidden/i);\n });\n\n test('fails when a file response contains invalid JSON', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, throwOnJson: true }\n ]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl\n });\n\n expect(result).toFailWith(/invalid json/i);\n });\n\n test('fails when a nested directory fetch fails', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithDirAndFile() },\n { ok: false, status: 500, textValue: 'Internal Server Error' }\n ]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl\n });\n\n expect(result).toFailWith(/internal server error/i);\n });\n });\n\n describe('isDirty() and getDirtyPaths()', () => {\n test('starts not dirty after loading', async () => {\n const { fetchImpl } = makeMockFetch([{ ok: true, jsonValue: { path: '/', children: [] } }]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({ baseUrl: 'http://localhost:3000', fetchImpl })\n ).orThrow();\n\n expect(accessors.isDirty()).toBe(false);\n expect(accessors.getDirtyPaths()).toEqual([]);\n });\n\n test('becomes dirty after saveFileContents', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '{\"modified\":true}').orThrow();\n\n expect(accessors.isDirty()).toBe(true);\n expect(accessors.getDirtyPaths()).toContain('/data.json');\n });\n\n test('tracks multiple dirty files', async () => {\n const { fetchImpl } = makeMockFetch([\n {\n ok: true,\n jsonValue: {\n path: '/',\n children: [\n { path: '/a.json', name: 'a.json', type: 'file' },\n { path: '/b.json', name: 'b.json', type: 'file' }\n ]\n }\n },\n { ok: true, jsonValue: fileResponse('/a.json', '{}') },\n { ok: true, jsonValue: fileResponse('/b.json', '{}') }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/a.json', '\"a\"').orThrow();\n accessors.saveFileContents('/b.json', '\"b\"').orThrow();\n\n expect(accessors.getDirtyPaths()).toHaveLength(2);\n expect(accessors.getDirtyPaths()).toContain('/a.json');\n expect(accessors.getDirtyPaths()).toContain('/b.json');\n });\n\n test('tracks deleted files as pending dirty paths', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.deleteFile('/data.json').orThrow();\n\n expect(accessors.isDirty()).toBe(true);\n expect(accessors.getDirtyPaths()).toContain('/data.json');\n });\n });\n\n describe('saveFileContents()', () => {\n test('fails when the file is not found (immutable tree has no matching path)', async () => {\n const { fetchImpl } = makeMockFetch([{ ok: true, jsonValue: { path: '/', children: [] } }]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({ baseUrl: 'http://localhost:3000', fetchImpl })\n ).orThrow();\n\n // With mutable: false (default), saveFileContents should fail\n const result = accessors.saveFileContents('/missing.json', '{}');\n expect(result).toFail();\n });\n\n test('marks the file as dirty without autoSync', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n const result = accessors.saveFileContents('/data.json', '{\"updated\":true}');\n expect(result).toSucceedWith('{\"updated\":true}');\n expect(accessors.isDirty()).toBe(true);\n // No additional fetch calls should have occurred (no autoSync)\n });\n\n test('triggers fire-and-forget autoSync when autoSync is enabled', async () => {\n const syncResponses: IMockResponse[] = [\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n // PUT /file response for sync\n { ok: true, jsonValue: { path: '/data.json', contents: '{\"auto\":true}' } },\n // POST /sync response\n { ok: true, jsonValue: { synced: 1 } }\n ];\n const { fetchImpl, calls } = makeMockFetch(syncResponses);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true,\n autoSync: true\n })\n ).orThrow();\n\n const result = accessors.saveFileContents('/data.json', '{\"auto\":true}');\n expect(result).toSucceedWith('{\"auto\":true}');\n\n // autoSync fires-and-forgets; wait for microtasks to drain\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n\n // Verify that PUT + POST /sync were called\n const methodCalls = calls.slice(2).map((c) => c.init?.method);\n expect(methodCalls).toContain('PUT');\n expect(methodCalls).toContain('POST');\n });\n\n test('logs when autoSync returns a failure Result', async () => {\n const logger = {\n detail: jest.fn(),\n info: jest.fn(),\n warn: jest.fn(),\n error: jest.fn()\n } as unknown as Logging.LogReporter<unknown>;\n\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true,\n autoSync: true,\n logger\n })\n ).orThrow();\n\n (accessors as unknown as { syncToDisk: () => Promise<ReturnType<typeof fail<void>>> }).syncToDisk =\n async () => fail<void>('simulated sync failure');\n\n accessors.saveFileContents('/data.json', '{\"auto\":true}').orThrow();\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n\n expect(logger.error).toHaveBeenCalledWith(expect.stringContaining('simulated sync failure'));\n });\n\n test('logs when autoSync throws unexpectedly', async () => {\n const logger = {\n detail: jest.fn(),\n info: jest.fn(),\n warn: jest.fn(),\n error: jest.fn()\n } as unknown as Logging.LogReporter<unknown>;\n\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true,\n autoSync: true,\n logger\n })\n ).orThrow();\n\n (accessors as unknown as { syncToDisk: () => Promise<unknown> }).syncToDisk = async () => {\n throw new Error('simulated throw');\n };\n\n accessors.saveFileContents('/data.json', '{\"auto\":true}').orThrow();\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n\n expect(logger.error).toHaveBeenCalledWith(expect.stringContaining('simulated throw'));\n });\n });\n\n describe('fileIsMutable()', () => {\n test('returns persistent detail when file exists and mutable is true', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n const result = accessors.fileIsMutable('/data.json');\n expect(result.isSuccess()).toBe(true);\n if (result.isSuccess()) {\n expect(result.value).toBe(true);\n expect(result.detail).toBe('persistent');\n }\n });\n\n test('returns not-mutable detail when mutable is false', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: false\n })\n ).orThrow();\n\n const result = accessors.fileIsMutable('/data.json');\n expect(result.isFailure()).toBe(true);\n if (result.isFailure()) {\n expect(result.detail).toBe('not-mutable');\n }\n });\n\n test('returns persistent detail for any path when mutable is true (no path existence check)', async () => {\n // InMemoryTreeAccessors checks the mutable config, not path existence.\n // HttpTreeAccessors layers \"persistent\" on top of a successful mutable check.\n const { fetchImpl } = makeMockFetch([{ ok: true, jsonValue: { path: '/', children: [] } }]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n // Any path succeeds as \"persistent\" when mutable: true\n const result = accessors.fileIsMutable('/nonexistent.json');\n expect(result.isSuccess()).toBe(true);\n if (result.isSuccess()) {\n expect(result.value).toBe(true);\n expect(result.detail).toBe('persistent');\n }\n });\n });\n\n describe('syncToDisk()', () => {\n test('succeeds immediately with no dirty files', async () => {\n const { fetchImpl } = makeMockFetch([{ ok: true, jsonValue: { path: '/', children: [] } }]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({ baseUrl: 'http://localhost:3000', fetchImpl })\n ).orThrow();\n\n const result = await accessors.syncToDisk();\n expect(result).toSucceed();\n });\n\n test('PUTs each dirty file then POSTs /sync', async () => {\n const { fetchImpl, calls } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n { ok: true, jsonValue: fileResponse('/data.json', '{\"new\":1}') },\n { ok: true, jsonValue: { synced: 1 } }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '{\"new\":1}').orThrow();\n const result = await accessors.syncToDisk();\n\n expect(result).toSucceed();\n const syncCalls = calls.slice(2);\n expect(syncCalls[0].url).toContain('/file');\n expect(syncCalls[0].init?.method).toBe('PUT');\n expect(syncCalls[1].url).toContain('/sync');\n expect(syncCalls[1].init?.method).toBe('POST');\n });\n\n test('clears dirty state after successful sync', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n { ok: true, jsonValue: fileResponse('/data.json', '\"updated\"') },\n { ok: true, jsonValue: { synced: 1 } }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n expect(accessors.isDirty()).toBe(true);\n\n await accessors.syncToDisk();\n expect(accessors.isDirty()).toBe(false);\n expect(accessors.getDirtyPaths()).toEqual([]);\n });\n\n test('includes namespace in PUT body and POST /sync body when provided', async () => {\n const { fetchImpl, calls } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n { ok: true, jsonValue: fileResponse('/data.json', '\"v2\"') },\n { ok: true, jsonValue: { synced: 1 } }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n namespace: 'myns',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"v2\"').orThrow();\n await accessors.syncToDisk();\n\n const putBody = JSON.parse(calls[2].init?.body as string) as Record<string, unknown>;\n expect(putBody.namespace).toBe('myns');\n\n const syncBody = JSON.parse(calls[3].init?.body as string) as Record<string, unknown>;\n expect(syncBody.namespace).toBe('myns');\n });\n\n test('omits namespace from PUT body and POST /sync body when not provided', async () => {\n const { fetchImpl, calls } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n { ok: true, jsonValue: fileResponse('/data.json', '\"v2\"') },\n { ok: true, jsonValue: { synced: 1 } }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"v2\"').orThrow();\n await accessors.syncToDisk();\n\n const putBody = JSON.parse(calls[2].init?.body as string) as Record<string, unknown>;\n expect(putBody.namespace).toBeUndefined();\n\n const syncBody = JSON.parse(calls[3].init?.body as string) as Record<string, unknown>;\n expect(syncBody.namespace).toBeUndefined();\n });\n\n test('fails when PUT for a dirty file returns a non-ok response', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n { ok: false, status: 500, textValue: 'Server Error' }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n const result = await accessors.syncToDisk();\n\n expect(result).toFailWith(/sync.*data\\.json.*server error/i);\n });\n\n test('fails when PUT for a dirty file encounters a network error', async () => {\n jest.useFakeTimers();\n try {\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n if (callCount === 2) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '{}') })\n );\n }\n return Promise.reject(new Error('PUT network error'));\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n\n const syncPromise = accessors.syncToDisk();\n await jest.advanceTimersByTimeAsync(1500);\n\n const result = await syncPromise;\n expect(result).toFailWith(/put network error/i);\n } finally {\n jest.useRealTimers();\n }\n });\n\n test('fails when POST /sync returns a non-ok response', async () => {\n jest.useFakeTimers();\n try {\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n if (callCount === 2) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '{}') })\n );\n }\n if (callCount === 3) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '\"v2\"') })\n );\n }\n // All /sync attempts: persistent 503\n return Promise.resolve(\n makeMockResponse({ ok: false, status: 503, textValue: 'Service Unavailable' })\n );\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"v2\"').orThrow();\n\n const syncPromise = accessors.syncToDisk();\n // Advance past both backoff delays: 500ms + 1000ms\n await jest.advanceTimersByTimeAsync(1500);\n\n const result = await syncPromise;\n expect(result).toFailWith(/service unavailable/i);\n } finally {\n jest.useRealTimers();\n }\n });\n\n test('fails when POST /sync encounters a network error', async () => {\n jest.useFakeTimers();\n try {\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n if (callCount === 2) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '{}') })\n );\n }\n if (callCount === 3) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '\"v2\"') })\n );\n }\n return Promise.reject(new Error('POST network error'));\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"v2\"').orThrow();\n\n const syncPromise = accessors.syncToDisk();\n await jest.advanceTimersByTimeAsync(1500);\n\n const result = await syncPromise;\n expect(result).toFailWith(/post network error/i);\n } finally {\n jest.useRealTimers();\n }\n });\n\n test('syncs multiple dirty files in order', async () => {\n const { fetchImpl, calls } = makeMockFetch([\n {\n ok: true,\n jsonValue: {\n path: '/',\n children: [\n { path: '/a.json', name: 'a.json', type: 'file' },\n { path: '/b.json', name: 'b.json', type: 'file' }\n ]\n }\n },\n { ok: true, jsonValue: fileResponse('/a.json', '{}') },\n { ok: true, jsonValue: fileResponse('/b.json', '{}') },\n { ok: true, jsonValue: fileResponse('/a.json', '\"a-updated\"') },\n { ok: true, jsonValue: fileResponse('/b.json', '\"b-updated\"') },\n { ok: true, jsonValue: { synced: 2 } }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/a.json', '\"a-updated\"').orThrow();\n accessors.saveFileContents('/b.json', '\"b-updated\"').orThrow();\n\n const result = await accessors.syncToDisk();\n expect(result).toSucceed();\n\n // Verify 2 PUTs + 1 POST\n const syncCalls = calls.slice(3);\n const methods = syncCalls.map((c) => c.init?.method);\n expect(methods.filter((m) => m === 'PUT')).toHaveLength(2);\n expect(methods.filter((m) => m === 'POST')).toHaveLength(1);\n });\n\n test('DELETEs pending deletions before POST /sync', async () => {\n const { fetchImpl, calls } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n { ok: true, jsonValue: { deleted: true } },\n { ok: true, jsonValue: { synced: 0 } }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.deleteFile('/data.json').orThrow();\n const result = await accessors.syncToDisk();\n\n expect(result).toSucceed();\n const syncCalls = calls.slice(2);\n expect(syncCalls[0].init?.method).toBe('DELETE');\n expect(syncCalls[0].url).toContain('/file?');\n expect(syncCalls[1].init?.method).toBe('POST');\n expect(accessors.isDirty()).toBe(false);\n });\n\n test('fails when DELETE for pending deletion returns non-ok response', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n { ok: false, status: 500, textValue: 'Delete failed' }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.deleteFile('/data.json').orThrow();\n const result = await accessors.syncToDisk();\n\n expect(result).toFailWith(/delete.*data\\.json.*delete failed/i);\n });\n });\n\n describe('syncToDisk() - getFileContents failure', () => {\n test('fails when getFileContents returns failure for a dirty file during sync', async () => {\n // This covers lines 112-113: the contentsResult.isFailure() branch in syncToDisk.\n // We load a file, mark it dirty, then sabotage getFileContents to fail.\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '{\"new\":1}').orThrow();\n\n // Sabotage the base getFileContents to simulate a failure\n const originalGet = accessors.getFileContents.bind(accessors);\n accessors.getFileContents = (path: string) => {\n if (path === '/data.json') {\n // eslint-disable-next-line import/no-internal-modules\n const { fail: failResult } = require('@fgv/ts-utils') as typeof import('@fgv/ts-utils');\n return failResult('simulated get failure');\n }\n return originalGet(path);\n };\n\n const result = await accessors.syncToDisk();\n expect(result).toFailWith(/simulated get failure/i);\n });\n });\n\n describe('_request() invalid JSON during sync', () => {\n test('fails when PUT /file returns invalid JSON', async () => {\n // Covers lines 225-226: _request() returns fail('invalid JSON response')\n // when response.json() throws during a sync PUT.\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n // PUT response with ok=true but throwOnJson simulates invalid JSON body\n { ok: true, throwOnJson: true }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n const result = await accessors.syncToDisk();\n\n expect(result).toFailWith(/invalid json/i);\n });\n });\n\n describe('fromHttp() with inferContentType', () => {\n test('calls inferContentType when provided and uses the result', async () => {\n // Covers line 270: params.inferContentType?.(...).orDefault()\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}', 'application/json') }\n ]);\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n inferContentType: (path, provided) => {\n if (provided === 'application/json') {\n const { succeed: s } = require('@fgv/ts-utils') as typeof import('@fgv/ts-utils');\n return s('json' as string);\n }\n const { succeed: s } = require('@fgv/ts-utils') as typeof import('@fgv/ts-utils');\n return s(undefined);\n }\n });\n\n expect(result).toSucceed();\n });\n });\n\n describe('_request() error handling', () => {\n test('returns failure with error message for network error (Error instance throw) during sync', async () => {\n // Covers line 214 true branch: response.err instanceof Error -> uses .message\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n if (callCount === 2) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '{}') }));\n }\n // PUT request throws an Error instance\n return Promise.reject(new Error('real Error instance'));\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n const result = await accessors.syncToDisk();\n\n expect(result).toFailWith(/real error instance/i);\n });\n\n test('returns failure with error message for non-Error throw during sync PUT', async () => {\n // Covers line 214 false branch: thrown value is not an Error instance -> uses String(response.err)\n // Must be triggered via syncToDisk() which uses the instance _request() method.\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n if (callCount === 2) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '{}') }));\n }\n // Non-Error throw (e.g., a plain string)\n return Promise.reject('non-error string rejection');\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n const result = await accessors.syncToDisk();\n\n expect(result).toFailWith(/non-error string rejection/i);\n });\n\n test('returns failure with HTTP status fallback when response.text() throws during sync', async () => {\n // Covers the text() catch branch in _request(): uses `HTTP ${status}` fallback\n // 502 is transient so retries will be attempted; use fake timers to avoid real delays\n jest.useFakeTimers();\n try {\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n if (callCount === 2) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '{}') })\n );\n }\n return Promise.resolve(makeMockResponse({ ok: false, status: 502, throwOnText: true }));\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n\n const syncPromise = accessors.syncToDisk();\n await jest.advanceTimersByTimeAsync(1500);\n\n const result = await syncPromise;\n expect(result).toFailWith(/http 502/i);\n } finally {\n jest.useRealTimers();\n }\n });\n });\n\n describe('_requestWithParams() error handling', () => {\n test('returns failure with error message for non-Error network throw during init', async () => {\n // _requestWithParams is used for GET requests during fromHttp(); test non-Error throw branch\n const fetchImpl: typeof fetch = (_url, _init) => {\n return Promise.reject(42);\n };\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl\n });\n\n expect(result).toFailWith(/42/);\n });\n\n test('returns failure with HTTP status fallback when response.text() throws during init', async () => {\n const fetchImpl: typeof fetch = (_url, _init) => {\n return Promise.resolve(makeMockResponse({ ok: false, status: 504, throwOnText: true }));\n };\n\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl\n });\n\n expect(result).toFailWith(/http 504/i);\n });\n\n test('uses globalThis.fetch when no fetchImpl provided', async () => {\n // Covers line 48: the `fetchImpl ?? globalThis.fetch` right-side branch.\n // We temporarily replace globalThis.fetch with a mock that returns an empty tree.\n const originalFetch = globalThis.fetch;\n let fetchCallCount = 0;\n\n globalThis.fetch = (_url: string | URL | Request, _init?: RequestInit) => {\n fetchCallCount++;\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: { path: '/', children: [] } }));\n };\n\n try {\n const result = await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000'\n // No fetchImpl - should fall back to globalThis.fetch\n });\n\n expect(result).toSucceed();\n expect(fetchCallCount).toBeGreaterThan(0);\n } finally {\n globalThis.fetch = originalFetch;\n }\n });\n });\n\n describe('userId header in _request()', () => {\n test('includes X-User-Id header in PUT /file and POST /sync requests when userId is set', async () => {\n // Covers line 259: the this._userId branch in _request()\n const { fetchImpl, calls } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n { ok: true, jsonValue: fileResponse('/data.json', '\"updated\"') },\n { ok: true, jsonValue: { synced: 1 } }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true,\n userId: 'test-user-123'\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n const result = await accessors.syncToDisk();\n expect(result).toSucceed();\n\n // The PUT and POST requests should include the X-User-Id header\n const syncCalls = calls.slice(2);\n for (const call of syncCalls) {\n const headers = call.init?.headers as Record<string, string> | undefined;\n expect(headers?.['X-User-Id']).toBe('test-user-123');\n }\n });\n });\n\n describe('deleteFile()', () => {\n test('fails when the underlying InMemoryTreeAccessors deleteFile fails (file not found)', async () => {\n // Covers lines 200-201: result.isFailure() branch in deleteFile\n const { fetchImpl } = makeMockFetch([{ ok: true, jsonValue: { path: '/', children: [] } }]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({ baseUrl: 'http://localhost:3000', fetchImpl, mutable: true })\n ).orThrow();\n\n // Delete a file that does not exist — super.deleteFile should fail\n const result = accessors.deleteFile('/nonexistent.json');\n expect(result).toFail();\n });\n\n test('includes namespace in DELETE query params when namespace is configured', async () => {\n // Covers lines 131-132: the namespace branch in syncToDisk's pending-deletion loop\n const { fetchImpl, calls } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n { ok: true, jsonValue: { deleted: true } },\n { ok: true, jsonValue: { synced: 0 } }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n namespace: 'my-namespace',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.deleteFile('/data.json').orThrow();\n const result = await accessors.syncToDisk();\n\n expect(result).toSucceed();\n\n // The DELETE request URL should include namespace as a query parameter\n const deleteCalls = calls.filter((c) => c.init?.method === 'DELETE');\n expect(deleteCalls).toHaveLength(1);\n expect(deleteCalls[0].url).toContain('namespace=my-namespace');\n });\n\n test('triggers fire-and-forget autoSync after successful delete when autoSync is enabled', async () => {\n // Covers lines 209-212: the autoSync branch in deleteFile\n const syncResponses: IMockResponse[] = [\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n // DELETE /file response for pending deletion\n { ok: true, jsonValue: { deleted: true } },\n // POST /sync response\n { ok: true, jsonValue: { synced: 0 } }\n ];\n const { fetchImpl, calls } = makeMockFetch(syncResponses);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true,\n autoSync: true\n })\n ).orThrow();\n\n const result = accessors.deleteFile('/data.json');\n expect(result).toSucceedWith(true);\n\n // autoSync fires-and-forgets; wait for microtasks to drain\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n\n // Verify that DELETE + POST /sync were called\n const methodCalls = calls.slice(2).map((c) => c.init?.method);\n expect(methodCalls).toContain('DELETE');\n expect(methodCalls).toContain('POST');\n });\n });\n\n describe('_requestWithRetry()', () => {\n test('succeeds on second attempt after a transient 503 error', async () => {\n jest.useFakeTimers();\n try {\n // Responses: init (GET tree/children), then PUT fails with 503, then PUT succeeds, then POST /sync succeeds\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n if (callCount === 2) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '{}') })\n );\n }\n // First PUT attempt: transient 503\n if (callCount === 3) {\n return Promise.resolve(\n makeMockResponse({ ok: false, status: 503, textValue: '503 Service Unavailable' })\n );\n }\n // Second PUT attempt: success\n if (callCount === 4) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '\"updated\"') })\n );\n }\n // POST /sync\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: { synced: 1 } }));\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n\n const syncPromise = accessors.syncToDisk();\n\n // Advance past the 500ms backoff for the first retry\n await jest.advanceTimersByTimeAsync(500);\n\n const result = await syncPromise;\n expect(result).toSucceed();\n // Three PUT-related calls: init (2) + first PUT attempt (1) + retry PUT (1) + POST sync (1)\n expect(callCount).toBe(5);\n } finally {\n jest.useRealTimers();\n }\n });\n\n test('does not retry on a non-transient error (e.g. 404)', async () => {\n jest.useFakeTimers();\n try {\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n if (callCount === 2) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '{}') })\n );\n }\n // PUT attempt: non-transient 404\n return Promise.resolve(makeMockResponse({ ok: false, status: 404, textValue: 'Not Found' }));\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n\n const result = await accessors.syncToDisk();\n\n // No timers should need advancing - non-transient errors return immediately\n expect(result).toFailWith(/not found/i);\n // Only 3 calls: 2 init + 1 PUT (no retries)\n expect(callCount).toBe(3);\n } finally {\n jest.useRealTimers();\n }\n });\n\n test('returns the last error after exhausting all retries on persistent transient errors', async () => {\n jest.useFakeTimers();\n try {\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n if (callCount === 2) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '{}') })\n );\n }\n // All PUT attempts: transient 502 every time\n return Promise.resolve(makeMockResponse({ ok: false, status: 502, textValue: '502 Bad Gateway' }));\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n\n const syncPromise = accessors.syncToDisk();\n\n // Advance past both backoff delays: 500ms (attempt 1) + 1000ms (attempt 2)\n await jest.advanceTimersByTimeAsync(1500);\n\n const result = await syncPromise;\n expect(result).toFailWith(/502 bad gateway/i);\n // 2 init + 3 PUT attempts (maxAttempts = 3)\n expect(callCount).toBe(5);\n } finally {\n jest.useRealTimers();\n }\n });\n\n test('logs retry message with method name from init when retrying', async () => {\n jest.useFakeTimers();\n try {\n const logger = {\n detail: jest.fn(),\n info: jest.fn(),\n warn: jest.fn(),\n error: jest.fn()\n } as unknown as Logging.LogReporter<unknown>;\n\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n if (callCount === 2) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '{}') })\n );\n }\n // First PUT attempt: transient 503\n if (callCount === 3) {\n return Promise.resolve(\n makeMockResponse({ ok: false, status: 503, textValue: '503 Service Unavailable' })\n );\n }\n // Second PUT attempt: success\n if (callCount === 4) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '\"updated\"') })\n );\n }\n // POST /sync\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: { synced: 1 } }));\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true,\n logger\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n\n const syncPromise = accessors.syncToDisk();\n await jest.advanceTimersByTimeAsync(500);\n await syncPromise;\n\n // The retry log message should include the method name (PUT) from init\n expect(logger.detail).toHaveBeenCalledWith(expect.stringContaining('PUT'));\n } finally {\n jest.useRealTimers();\n }\n });\n });\n\n describe('syncToDisk() concurrency guard', () => {\n test('concurrent syncToDisk calls share the same promise and only make one set of network calls', async () => {\n const { fetchImpl, calls } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n // PUT /file for the single sync\n { ok: true, jsonValue: fileResponse('/data.json', '\"updated\"') },\n // POST /sync\n { ok: true, jsonValue: { synced: 1 } }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n\n // Start two concurrent syncToDisk calls without awaiting the first\n const promise1 = accessors.syncToDisk();\n const promise2 = accessors.syncToDisk();\n\n const [result1, result2] = await Promise.all([promise1, promise2]);\n\n expect(result1).toSucceed();\n expect(result2).toSucceed();\n\n // Both promises should have resolved to the same underlying promise result.\n // Only one PUT and one POST /sync should have been issued (not doubled).\n const syncCalls = calls.slice(2);\n const putCalls = syncCalls.filter((c) => c.init?.method === 'PUT');\n const postCalls = syncCalls.filter((c) => c.init?.method === 'POST');\n expect(putCalls).toHaveLength(1);\n expect(postCalls).toHaveLength(1);\n });\n\n test('drains items written during an in-flight sync within the same _doSync call', async () => {\n // This tests the drain loop fix for the race where:\n // 1. sync starts, snapshots dirty set {a.json}\n // 2. during the PUT for a.json, a new write arrives adding a.json back\n // 3. _doSync loops back, snapshots the new item, and syncs it too\n // 4. Only one POST /sync is sent at the end, after all items are drained\n let callCount = 0;\n let saveHook: (() => void) | undefined;\n\n const fetchImpl: typeof fetch = (url, init) => {\n callCount++;\n const urlStr = url.toString();\n\n // Calls 1-2: fromHttp load\n if (callCount <= 2) {\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('a.json') }));\n }\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/a.json', '\"orig\"') })\n );\n }\n\n // Call 3: first PUT /file for a.json — trigger a write mid-sync\n if (callCount === 3 && init?.method === 'PUT') {\n saveHook?.();\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: fileResponse('/a.json', '\"v1\"') }));\n }\n\n // Call 4: second PUT /file for a.json (drain loop iteration)\n if (callCount === 4 && init?.method === 'PUT') {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: fileResponse('/a.json', '\"v2\"') }));\n }\n\n // Call 5: single POST /sync after drain loop exits\n if (callCount === 5 && urlStr.includes('/sync')) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: { synced: 1 } }));\n }\n\n return Promise.reject(new Error(`Unexpected call #${callCount} to ${urlStr}`));\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl: fetchImpl as typeof fetch,\n mutable: true\n })\n ).orThrow();\n\n // Write a.json\n accessors.saveFileContents('/a.json', '\"v1\"').orThrow();\n\n // Set up the hook BEFORE starting sync — the mock fetch for the PUT\n // runs synchronously within syncToDisk(), so the hook must be in place.\n saveHook = () => {\n accessors.saveFileContents('/a.json', '\"v2\"').orThrow();\n };\n\n // Start sync — during the first PUT, saveHook fires and writes v2.\n // The drain loop in _doSync picks this up and PUTs again before\n // sending the final POST /sync.\n const result = await accessors.syncToDisk();\n\n expect(result).toSucceed();\n expect(accessors.isDirty()).toBe(false);\n\n // 5 calls: 2 load + 2 PUTs (v1, v2) + 1 POST /sync\n expect(callCount).toBe(5);\n });\n });\n\n describe('syncToDisk() error recovery', () => {\n test('restores dirty files when PUT fails so they can be retried', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n // PUT /file fails with non-transient error\n { ok: false, status: 500, textValue: 'Server Error' }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"updated\"').orThrow();\n expect(accessors.isDirty()).toBe(true);\n\n const result = await accessors.syncToDisk();\n expect(result).toFailWith(/sync.*data\\.json.*server error/i);\n\n // The file should still be dirty so a retry is possible\n expect(accessors.isDirty()).toBe(true);\n expect(accessors.getDirtyPaths()).toContain('/data.json');\n });\n\n test('restores pending deletions when DELETE fails so they can be retried', async () => {\n const { fetchImpl } = makeMockFetch([\n { ok: true, jsonValue: rootWithOneFile('data.json') },\n { ok: true, jsonValue: fileResponse('/data.json', '{}') },\n // DELETE fails with non-transient error\n { ok: false, status: 500, textValue: 'Server Error' }\n ]);\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.deleteFile('/data.json').orThrow();\n expect(accessors.isDirty()).toBe(true);\n\n const result = await accessors.syncToDisk();\n expect(result).toFailWith(/delete.*data\\.json.*server error/i);\n\n // The deletion should still be pending so a retry is possible\n expect(accessors.isDirty()).toBe(true);\n expect(accessors.getDirtyPaths()).toContain('/data.json');\n });\n\n test('restores dirty files when POST /sync fails so they can be retried', async () => {\n jest.useFakeTimers();\n try {\n let callCount = 0;\n const fetchImpl: typeof fetch = (_url, _init) => {\n callCount++;\n if (callCount === 1) {\n return Promise.resolve(makeMockResponse({ ok: true, jsonValue: rootWithOneFile('data.json') }));\n }\n if (callCount === 2) {\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '{}') })\n );\n }\n if (callCount === 3) {\n // PUT succeeds\n return Promise.resolve(\n makeMockResponse({ ok: true, jsonValue: fileResponse('/data.json', '\"v2\"') })\n );\n }\n // All /sync attempts: persistent 503\n return Promise.resolve(\n makeMockResponse({ ok: false, status: 503, textValue: 'Service Unavailable' })\n );\n };\n\n const accessors = (\n await HttpTreeAccessors.fromHttp({\n baseUrl: 'http://localhost:3000',\n fetchImpl,\n mutable: true\n })\n ).orThrow();\n\n accessors.saveFileContents('/data.json', '\"v2\"').orThrow();\n\n const syncPromise = accessors.syncToDisk();\n await jest.advanceTimersByTimeAsync(1500);\n\n const result = await syncPromise;\n expect(result).toFailWith(/service unavailable/i);\n\n // The PUT succeeded — data is on the server — so the file is no\n // longer dirty. Only the server-side /sync acknowledgement failed,\n // which is not something the client can meaningfully retry via\n // re-sending the file contents.\n expect(accessors.isDirty()).toBe(false);\n } finally {\n jest.useRealTimers();\n }\n });\n });\n});\n"]}
@@ -686,6 +686,12 @@ declare function extractFileListMetadata(fileList: FileList): Array<IFileMetadat
686
686
  */
687
687
  syncToDisk(): Promise<Result<void>>;
688
688
  private _doSync;
689
+ /**
690
+ * Restores snapshotted items back into the live dirty sets so they
691
+ * are retried on the next sync attempt. Items that were added to
692
+ * the live sets while the sync was in flight are preserved.
693
+ */
694
+ private _restoreUnsynced;
689
695
  /**
690
696
  * Checks if there are any dirty files that need synchronization.
691
697
  * @returns True if there are dirty files, false otherwise.
@@ -47,6 +47,12 @@ export declare class HttpTreeAccessors<TCT extends string = string> extends File
47
47
  */
48
48
  syncToDisk(): Promise<Result<void>>;
49
49
  private _doSync;
50
+ /**
51
+ * Restores snapshotted items back into the live dirty sets so they
52
+ * are retried on the next sync attempt. Items that were added to
53
+ * the live sets while the sync was in flight are preserved.
54
+ */
55
+ private _restoreUnsynced;
50
56
  /**
51
57
  * Checks if there are any dirty files that need synchronization.
52
58
  * @returns True if there are dirty files, false otherwise.