{"version":3,"file":"ErrorHandling.test.js","sourceRoot":"","sources":["../../src/__tests__/ErrorHandling.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport { TSDocConfiguration } from '@microsoft/tsdoc';\r\nimport * as path from 'path';\r\n\r\nimport { TSDocConfigFile } from '../TSDocConfigFile';\r\n\r\ninterface ISnapshot {\r\n s0_filePath: string;\r\n s1_fileNotFound: boolean;\r\n s2_hasErrors: boolean;\r\n s3_errorSummary: string;\r\n s4_log: string[];\r\n s5_extends: ISnapshot[];\r\n}\r\n\r\nfunction replaceAll(text: string, search: string, replace: string): string {\r\n return text.split(search).join(replace);\r\n}\r\n\r\n// To make the unit tests deterministic, we need to replace all OS-dependent absolute paths\r\n// with OS-independent paths that are relative to the unit test folder.\r\nfunction makeStablePath(testPath: string): string {\r\n if (testPath.length === 0) {\r\n return '';\r\n }\r\n console.log('IN: ' + testPath);\r\n console.log('OUT: ' + replaceAll(path.relative(__dirname, testPath), '\\\\', '/'));\r\n return '.../' + replaceAll(path.relative(__dirname, testPath), '\\\\', '/');\r\n}\r\n\r\n// Build a map from absolute path --> stable path, for each TSDocConfigFile.filePath value\r\nfunction buildStablePathMap(stablePathMap: Map, configFile: TSDocConfigFile): void {\r\n for (const absolutePath of [configFile.filePath, path.dirname(configFile.filePath)]) {\r\n if (!stablePathMap.has(absolutePath)) {\r\n stablePathMap.set(absolutePath, makeStablePath(absolutePath));\r\n }\r\n }\r\n\r\n for (const extendsFile of configFile.extendsFiles) {\r\n buildStablePathMap(stablePathMap, extendsFile);\r\n }\r\n}\r\n\r\n// Search and replace all absolute paths with the corresponding stable path.\r\n// For example, \"Found C:\\A\\B\\C.txt in C:\\A\\D\\E.txt\" becomes \"Found .../B/C.txt in .../D/E.txt\".\r\nfunction convertToStablePaths(text: string, stablePathMap: Map): string {\r\n // Sort the [key,value] pairs by key length from longest to shortest.\r\n // This ensures that a shorter path does not replace a subpath of a longer path.\r\n const pairs: [string, string][] = Array.from(stablePathMap.entries()).sort(\r\n (x, y) => y[0].length - x[0].length\r\n );\r\n for (const pair of pairs) {\r\n text = replaceAll(text, pair[0], pair[1]);\r\n }\r\n // Also convert any loose backslashes to slashes\r\n //text = replaceAll(text, '\\\\', '/');\r\n return text;\r\n}\r\n\r\nfunction createSnapshot(configFile: TSDocConfigFile, pathFixupMap: Map): ISnapshot {\r\n return {\r\n s0_filePath: convertToStablePaths(configFile.filePath, pathFixupMap),\r\n s1_fileNotFound: configFile.fileNotFound,\r\n s2_hasErrors: configFile.hasErrors,\r\n s4_log: configFile.log.messages.map(\r\n (x) => `[${x.messageId}] ${convertToStablePaths(x.text, pathFixupMap)}`\r\n ),\r\n s5_extends: configFile.extendsFiles.map((x) => createSnapshot(x, pathFixupMap)),\r\n s3_errorSummary: convertToStablePaths(configFile.getErrorSummary(), pathFixupMap)\r\n };\r\n}\r\n\r\nfunction testLoadingFolder(assetPath: string): ISnapshot {\r\n const configFile: TSDocConfigFile = TSDocConfigFile.loadForFolder(path.join(__dirname, assetPath));\r\n\r\n const pathFixupMap: Map = new Map();\r\n buildStablePathMap(pathFixupMap, configFile);\r\n\r\n return createSnapshot(configFile, pathFixupMap);\r\n}\r\n\r\ntest('Load e1', () => {\r\n expect(testLoadingFolder('assets/e1')).toMatchInlineSnapshot(`\r\nObject {\r\n \"s0_filePath\": \".../assets/e1/tsdoc.json\",\r\n \"s1_fileNotFound\": false,\r\n \"s2_hasErrors\": true,\r\n \"s3_errorSummary\": \"Error encountered for .../assets/e1/tsdoc.json:\r\n Error loading config file: data must NOT have additional properties\r\n\",\r\n \"s4_log\": Array [\r\n \"[tsdoc-config-schema-error] Error loading config file: data must NOT have additional properties\",\r\n ],\r\n \"s5_extends\": Array [],\r\n}\r\n`);\r\n});\r\n\r\ntest('Load e2', () => {\r\n expect(testLoadingFolder('assets/e2')).toMatchInlineSnapshot(`\r\n Object {\r\n \"s0_filePath\": \".../assets/e2/tsdoc.json\",\r\n \"s1_fileNotFound\": false,\r\n \"s2_hasErrors\": true,\r\n \"s3_errorSummary\": \"Error encountered for .../assets/e2/tsdoc.json:\r\n Error parsing JSON input: Unexpected token '\\\\\\\\n' at 3:12\r\n \\\\\"invalid\r\n ^\r\n \",\r\n \"s4_log\": Array [\r\n \"[tsdoc-config-invalid-json] Error parsing JSON input: Unexpected token '\\\\\\\\n' at 3:12\r\n \\\\\"invalid\r\n ^\",\r\n ],\r\n \"s5_extends\": Array [],\r\n }\r\n `);\r\n});\r\n\r\ntest('Load e3', () => {\r\n expect(testLoadingFolder('assets/e3')).toMatchInlineSnapshot(`\r\n Object {\r\n \"s0_filePath\": \".../assets/e3/tsdoc.json\",\r\n \"s1_fileNotFound\": false,\r\n \"s2_hasErrors\": true,\r\n \"s3_errorSummary\": \"Error encountered for .../assets/e3/tsdoc.json:\r\n Unsupported JSON \\\\\"$schema\\\\\" value; expecting \\\\\"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\\\\\"\r\n \",\r\n \"s4_log\": Array [\r\n \"[tsdoc-config-unsupported-schema] Unsupported JSON \\\\\"$schema\\\\\" value; expecting \\\\\"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\\\\\"\",\r\n ],\r\n \"s5_extends\": Array [],\r\n }\r\n `);\r\n});\r\n\r\ntest('Load e4', () => {\r\n expect(testLoadingFolder('assets/e4')).toMatchInlineSnapshot(`\r\n Object {\r\n \"s0_filePath\": \".../assets/e4/tsdoc.json\",\r\n \"s1_fileNotFound\": false,\r\n \"s2_hasErrors\": true,\r\n \"s3_errorSummary\": \"Error encountered for .../assets/e4/tsdoc.json:\r\n The \\\\\"tagDefinitions\\\\\" field specifies more than one tag with the name \\\\\"@dupe\\\\\"\r\n \",\r\n \"s4_log\": Array [\r\n \"[tsdoc-config-duplicate-tag-name] The \\\\\"tagDefinitions\\\\\" field specifies more than one tag with the name \\\\\"@dupe\\\\\"\",\r\n ],\r\n \"s5_extends\": Array [],\r\n }\r\n `);\r\n});\r\n\r\ntest('Load e5', () => {\r\n expect(testLoadingFolder('assets/e5')).toMatchInlineSnapshot(`\r\nObject {\r\n \"s0_filePath\": \".../assets/e5/tsdoc.json\",\r\n \"s1_fileNotFound\": false,\r\n \"s2_hasErrors\": true,\r\n \"s3_errorSummary\": \"Error encountered for .../assets/e5/tsdoc-a.json:\r\n Circular reference encountered for \\\\\"extends\\\\\" field of \\\\\".../assets/e5/tsdoc-b.json\\\\\"\r\n\r\nError encountered for .../assets/e5/tsdoc-c.json:\r\n Error loading config file: data must NOT have additional properties\r\n\",\r\n \"s4_log\": Array [],\r\n \"s5_extends\": Array [\r\n Object {\r\n \"s0_filePath\": \".../assets/e5/tsdoc-a.json\",\r\n \"s1_fileNotFound\": false,\r\n \"s2_hasErrors\": true,\r\n \"s3_errorSummary\": \"Error encountered for .../assets/e5/tsdoc-a.json:\r\n Circular reference encountered for \\\\\"extends\\\\\" field of \\\\\".../assets/e5/tsdoc-b.json\\\\\"\r\n\r\nError encountered for .../assets/e5/tsdoc-c.json:\r\n Error loading config file: data must NOT have additional properties\r\n\",\r\n \"s4_log\": Array [],\r\n \"s5_extends\": Array [\r\n Object {\r\n \"s0_filePath\": \".../assets/e5/tsdoc-b.json\",\r\n \"s1_fileNotFound\": false,\r\n \"s2_hasErrors\": true,\r\n \"s3_errorSummary\": \"Error encountered for .../assets/e5/tsdoc-a.json:\r\n Circular reference encountered for \\\\\"extends\\\\\" field of \\\\\".../assets/e5/tsdoc-b.json\\\\\"\r\n\",\r\n \"s4_log\": Array [],\r\n \"s5_extends\": Array [\r\n Object {\r\n \"s0_filePath\": \".../assets/e5/tsdoc-a.json\",\r\n \"s1_fileNotFound\": false,\r\n \"s2_hasErrors\": true,\r\n \"s3_errorSummary\": \"Error encountered for .../assets/e5/tsdoc-a.json:\r\n Circular reference encountered for \\\\\"extends\\\\\" field of \\\\\".../assets/e5/tsdoc-b.json\\\\\"\r\n\",\r\n \"s4_log\": Array [\r\n \"[tsdoc-config-cyclic-extends] Circular reference encountered for \\\\\"extends\\\\\" field of \\\\\".../assets/e5/tsdoc-b.json\\\\\"\",\r\n ],\r\n \"s5_extends\": Array [],\r\n },\r\n ],\r\n },\r\n Object {\r\n \"s0_filePath\": \".../assets/e5/tsdoc-c.json\",\r\n \"s1_fileNotFound\": false,\r\n \"s2_hasErrors\": true,\r\n \"s3_errorSummary\": \"Error encountered for .../assets/e5/tsdoc-c.json:\r\n Error loading config file: data must NOT have additional properties\r\n\",\r\n \"s4_log\": Array [\r\n \"[tsdoc-config-schema-error] Error loading config file: data must NOT have additional properties\",\r\n ],\r\n \"s5_extends\": Array [],\r\n },\r\n ],\r\n },\r\n ],\r\n}\r\n`);\r\n});\r\n\r\ntest('Load e6', () => {\r\n expect(testLoadingFolder('assets/e6')).toMatchInlineSnapshot(`\r\n Object {\r\n \"s0_filePath\": \".../assets/e6/tsdoc.json\",\r\n \"s1_fileNotFound\": false,\r\n \"s2_hasErrors\": true,\r\n \"s3_errorSummary\": \"Error encountered for .../assets/e6/tsdoc.json:\r\n Unable to resolve \\\\\"extends\\\\\" reference to \\\\\"@rushstack/nonexistent-package/tsdoc.json\\\\\": Cannot find module '@rushstack/nonexistent-package/tsdoc.json' from '.../assets/e6'\r\n \",\r\n \"s4_log\": Array [\r\n \"[tsdoc-config-unresolved-extends] Unable to resolve \\\\\"extends\\\\\" reference to \\\\\"@rushstack/nonexistent-package/tsdoc.json\\\\\": Cannot find module '@rushstack/nonexistent-package/tsdoc.json' from '.../assets/e6'\",\r\n ],\r\n \"s5_extends\": Array [],\r\n }\r\n `);\r\n});\r\n\r\ntest('Load e7', () => {\r\n const configFile: TSDocConfigFile = TSDocConfigFile.loadForFolder(path.join(__dirname, 'assets/e7'));\r\n\r\n const pathFixupMap: Map = new Map();\r\n buildStablePathMap(pathFixupMap, configFile);\r\n\r\n expect(createSnapshot(configFile, pathFixupMap)).toMatchInlineSnapshot(`\r\n Object {\r\n \"s0_filePath\": \".../assets/e7/tsdoc.json\",\r\n \"s1_fileNotFound\": false,\r\n \"s2_hasErrors\": false,\r\n \"s3_errorSummary\": \"No errors.\",\r\n \"s4_log\": Array [],\r\n \"s5_extends\": Array [],\r\n }\r\n `);\r\n\r\n // The \"tsdoc-config-undefined-tag\" error is NOT detected by TSDocConfigFile.loadForFolder()\r\n expect(configFile.hasErrors).toBe(false);\r\n\r\n const configuration: TSDocConfiguration = new TSDocConfiguration();\r\n configFile.configureParser(configuration);\r\n\r\n expect(createSnapshot(configFile, pathFixupMap)).toMatchInlineSnapshot(`\r\n Object {\r\n \"s0_filePath\": \".../assets/e7/tsdoc.json\",\r\n \"s1_fileNotFound\": false,\r\n \"s2_hasErrors\": true,\r\n \"s3_errorSummary\": \"Error encountered for .../assets/e7/tsdoc.json:\r\n The \\\\\"supportForTags\\\\\" field refers to an undefined tag \\\\\"@nonExistentTag\\\\\".\r\n \",\r\n \"s4_log\": Array [\r\n \"[tsdoc-config-undefined-tag] The \\\\\"supportForTags\\\\\" field refers to an undefined tag \\\\\"@nonExistentTag\\\\\".\",\r\n ],\r\n \"s5_extends\": Array [],\r\n }\r\n `);\r\n\r\n // The \"tsdoc-config-undefined-tag\" error IS detected by TSDocConfigFile.configureParser()\r\n expect(configFile.hasErrors).toBe(true);\r\n});\r\n"]}