From 884678e808fc64ef95a0004aeacef2fb7ca93c37 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Thu, 5 May 2022 14:17:42 -0700 Subject: [PATCH 01/15] Convert some of the watchEnvironment tests to baselines for updating later --- src/harness/virtualFileSystemWithWatch.ts | 64 - src/testRunner/unittests/tscWatch/helpers.ts | 4 - .../tsserver/cachingFileSystemInformation.ts | 657 ++--- .../unittests/tsserver/configFileSearch.ts | 98 +- .../unittests/tsserver/configuredProjects.ts | 192 +- .../tsserver/events/projectLoading.ts | 2 +- .../events/projectUpdatedInBackground.ts | 150 +- src/testRunner/unittests/tsserver/helpers.ts | 39 +- .../unittests/tsserver/inferredProjects.ts | 16 +- .../tsserver/moduleSpecifierCache.ts | 8 +- .../tsserver/partialSemanticServer.ts | 91 +- .../tsserver/projectReferencesSourcemap.ts | 2132 +++-------------- src/testRunner/unittests/tsserver/projects.ts | 11 +- .../tsserver/projectsWithReferences.ts | 308 +-- .../unittests/tsserver/resolutionCache.ts | 421 +--- .../unittests/tsserver/syntacticServer.ts | 42 +- .../unittests/tsserver/typingsInstaller.ts | 78 +- .../unittests/tsserver/watchEnvironment.ts | 681 ++---- .../loads-missing-files-from-disk.js | 65 + ...onfig-timeout-occurs-after-installation.js | 656 +++++ ...g-timeouts-occur-inbetween-installation.js | 704 ++++++ ...-file-with-case-insensitive-file-system.js | 140 ++ ...ig-file-with-case-sensitive-file-system.js | 140 ++ .../when-calling-goto-definition-of-module.js | 86 + .../works-using-legacy-resolution-logic.js | 108 + ...-searching-for-inferred-project-again-2.js | 101 + ...en-searching-for-inferred-project-again.js | 103 + .../tsconfig-for-the-file-does-not-exist.js | 164 ++ .../tsconfig-for-the-file-exists.js | 171 ++ .../when-projectRootPath-is-not-present.js | 38 + ...esent-but-file-is-not-from-project-root.js | 38 + ...oject-as-part-of-configured-file-update.js | 374 +++ ...onfig-file-in-a-folder-with-loose-files.js | 208 ++ ...-a-configured-project-without-file-list.js | 80 + ...on-reflected-when-specifying-files-list.js | 102 + ...e-configured-project-with-the-file-list.js | 45 + ...te-configured-project-without-file-list.js | 45 + ...uses-parent-most-node_modules-directory.js | 54 + ...the-extended-configs-of-closed-projects.js | 249 ++ ...e-extended-configs-of-multiple-projects.js | 306 +++ .../create-inferred-project.js | 36 + ...n-in-contained-node_modules-directories.js | 150 ++ .../files-are-added-to-inferred-project.js | 69 + ...ternal-module-name-resolution-is-reused.js | 83 + ...-include-auto-type-reference-directives.js | 25 + ...de-referenced-files-from-unopened-files.js | 25 + ...t-go-to-definition-on-module-specifiers.js | 27 + .../throws-unsupported-commands.js | 28 + ...dts-changes-with-timeout-before-request.js | 147 ++ .../dependency-dts-changes.js | 117 + .../dependency-dts-created.js | 212 ++ .../dependency-dts-deleted.js | 212 ++ .../dependency-dts-not-present.js | 200 ++ ...Map-changes-with-timeout-before-request.js | 147 ++ .../dependency-dtsMap-changes.js | 117 + .../dependency-dtsMap-created.js | 212 ++ .../dependency-dtsMap-deleted.js | 212 ++ .../dependency-dtsMap-not-present.js | 202 ++ .../configHasNoReference/rename-locations.js | 202 ++ ...ile-changes-with-timeout-before-request.js | 116 + .../usage-file-changes.js | 116 + ...dts-changes-with-timeout-before-request.js | 147 ++ .../dependency-dts-changes.js | 117 + .../dependency-dts-created.js | 212 ++ .../dependency-dts-deleted.js | 212 ++ .../dependency-dts-not-present.js | 200 ++ ...Map-changes-with-timeout-before-request.js | 147 ++ .../dependency-dtsMap-changes.js | 117 + .../dependency-dtsMap-created.js | 212 ++ .../dependency-dtsMap-deleted.js | 212 ++ .../dependency-dtsMap-not-present.js | 202 ++ ...rce-changes-with-timeout-before-request.js | 116 + .../dependency-source-changes.js | 116 + .../configWithReference/rename-locations.js | 202 ++ ...ile-changes-with-timeout-before-request.js | 116 + .../configWithReference/usage-file-changes.js | 116 + .../when-projects-are-not-built.js | 200 ++ ...dts-changes-with-timeout-before-request.js | 147 ++ .../dependency-dts-changes.js | 117 + .../dependency-dts-created.js | 212 ++ .../dependency-dts-deleted.js | 212 ++ .../dependency-dts-not-present.js | 200 ++ ...Map-changes-with-timeout-before-request.js | 147 ++ .../dependency-dtsMap-changes.js | 117 + .../dependency-dtsMap-created.js | 212 ++ .../dependency-dtsMap-deleted.js | 212 ++ .../dependency-dtsMap-not-present.js | 202 ++ .../disabledSourceRef/rename-locations.js | 202 ++ ...ile-changes-with-timeout-before-request.js | 116 + .../disabledSourceRef/usage-file-changes.js | 116 + ...dts-changes-with-timeout-before-request.js | 252 ++ .../dependency-dts-changes.js | 209 ++ .../dependency-dts-created.js | 381 +++ .../dependency-dts-deleted.js | 371 +++ .../dependency-dts-not-present.js | 333 +++ ...Map-changes-with-timeout-before-request.js | 251 ++ .../dependency-dtsMap-changes.js | 208 ++ .../dependency-dtsMap-created.js | 369 +++ .../dependency-dtsMap-deleted.js | 361 +++ .../dependency-dtsMap-not-present.js | 341 +++ .../goToDef-and-rename-locations.js | 351 +++ ...ile-changes-with-timeout-before-request.js | 208 ++ .../usage-file-changes.js | 208 ++ ...dts-changes-with-timeout-before-request.js | 259 ++ .../dependency-dts-changes.js | 216 ++ .../dependency-dts-created.js | 376 +++ .../dependency-dts-deleted.js | 380 +++ .../dependency-dts-not-present.js | 357 +++ ...Map-changes-with-timeout-before-request.js | 259 ++ .../dependency-dtsMap-changes.js | 216 ++ .../dependency-dtsMap-created.js | 379 +++ .../dependency-dtsMap-deleted.js | 379 +++ .../dependency-dtsMap-not-present.js | 359 +++ ...rce-changes-with-timeout-before-request.js | 214 ++ .../dependency-source-changes.js | 214 ++ .../gotoDef-and-rename-locations.js | 359 +++ ...ile-changes-with-timeout-before-request.js | 216 ++ .../configWithReference/usage-file-changes.js | 216 ++ .../when-projects-are-not-built.js | 357 +++ ...dts-changes-with-timeout-before-request.js | 259 ++ .../dependency-dts-changes.js | 216 ++ .../dependency-dts-created.js | 388 +++ .../dependency-dts-deleted.js | 378 +++ .../dependency-dts-not-present.js | 340 +++ ...Map-changes-with-timeout-before-request.js | 258 ++ .../dependency-dtsMap-changes.js | 215 ++ .../dependency-dtsMap-created.js | 376 +++ .../dependency-dtsMap-deleted.js | 368 +++ .../dependency-dtsMap-not-present.js | 348 +++ .../gotoDef-and-rename-locations.js | 358 +++ ...ile-changes-with-timeout-before-request.js | 215 ++ .../disabledSourceRef/usage-file-changes.js | 215 ++ .../can-go-to-definition-correctly.js | 213 ++ ...dts-changes-with-timeout-before-request.js | 153 ++ .../dependency-dts-changes.js | 123 + .../dependency-dts-created.js | 233 ++ .../dependency-dts-deleted.js | 233 ++ .../dependency-dts-not-present.js | 201 ++ ...Map-changes-with-timeout-before-request.js | 152 ++ .../dependency-dtsMap-changes.js | 122 + .../dependency-dtsMap-created.js | 225 ++ .../dependency-dtsMap-deleted.js | 225 ++ .../dependency-dtsMap-not-present.js | 211 ++ ...ile-changes-with-timeout-before-request.js | 121 + .../usage-file-changes.js | 121 + .../can-go-to-definition-correctly.js | 232 ++ ...dts-changes-with-timeout-before-request.js | 134 ++ .../dependency-dts-changes.js | 134 ++ .../dependency-dts-created.js | 237 ++ .../dependency-dts-deleted.js | 237 ++ .../dependency-dts-not-present.js | 232 ++ ...Map-changes-with-timeout-before-request.js | 134 ++ .../dependency-dtsMap-changes.js | 134 ++ .../dependency-dtsMap-created.js | 236 ++ .../dependency-dtsMap-deleted.js | 236 ++ .../dependency-dtsMap-not-present.js | 232 ++ ...rce-changes-with-timeout-before-request.js | 171 ++ .../dependency-source-changes.js | 141 ++ ...ile-changes-with-timeout-before-request.js | 139 ++ .../configWithReference/usage-file-changes.js | 139 ++ .../when-projects-are-not-built.js | 232 ++ .../can-go-to-definition-correctly.js | 237 ++ ...dts-changes-with-timeout-before-request.js | 174 ++ .../dependency-dts-changes.js | 144 ++ .../dependency-dts-created.js | 257 ++ .../dependency-dts-deleted.js | 257 ++ .../dependency-dts-not-present.js | 225 ++ ...Map-changes-with-timeout-before-request.js | 173 ++ .../dependency-dtsMap-changes.js | 143 ++ .../dependency-dtsMap-created.js | 249 ++ .../dependency-dtsMap-deleted.js | 249 ++ .../dependency-dtsMap-not-present.js | 235 ++ ...ile-changes-with-timeout-before-request.js | 142 ++ .../disabledSourceRef/usage-file-changes.js | 142 ++ ...he-session-and-project-is-at-root-level.js | 73 + ...ession-and-project-is-not-at-root-level.js | 132 + ...oundUpdate-and-project-is-at-root-level.js | 84 + ...Update-and-project-is-not-at-root-level.js | 146 ++ ...oundUpdate-and-project-is-at-root-level.js | 86 + ...Update-and-project-is-not-at-root-level.js | 145 ++ ...ith-mixed-content-are-handled-correctly.js | 34 + .../projectsWithReferences/sample-project.js | 201 ++ ...es-with-deleting-referenced-config-file.js | 245 ++ ...ing-transitively-referenced-config-file.js | 179 ++ ...ces-with-edit-in-referenced-config-file.js | 251 ++ ...ive-references-with-edit-on-config-file.js | 293 +++ ...ansitive-references-with-non-local-edit.js | 131 + ...es-with-deleting-referenced-config-file.js | 262 ++ ...ing-transitively-referenced-config-file.js | 192 ++ ...les-with-edit-in-referenced-config-file.js | 257 ++ ...-without-files-with-edit-on-config-file.js | 299 +++ ...ences-without-files-with-non-local-edit.js | 137 ++ ...unnecessary-lookup-invalidation-on-save.js | 87 + ...an-load-typings-that-are-proper-modules.js | 46 + ...le-name-from-files-in-different-folders.js | 179 ++ ...e-module-name-from-files-in-same-folder.js | 117 + ...ative-module-name-from-inferred-project.js | 199 ++ ...le-name-from-files-in-different-folders.js | 163 ++ ...e-module-name-from-files-in-same-folder.js | 101 + .../resolutionCache/when-resolution-fails.js | 73 + .../when-resolves-to-ambient-module.js | 72 + ...ed-project-and-semantic-operations-fail.js | 108 + ...-include-auto-type-reference-directives.js | 17 + .../throws-on-unsupported-commands.js | 20 + ...projects-discover-from-bower_components.js | 101 + .../typingsInstaller/configured-projects.js | 72 + ...utions-pointing-to-js-on-typing-install.js | 62 + ...ect-watch-options-in-host-configuration.js | 50 + .../external-project-watch-options.js | 52 + .../watchEnvironment/files-at-root.js | 60 + .../files-at-windows-style-root.js | 60 + .../watchEnvironment/files-not-at-root.js | 64 + .../files-not-at-windows-style-root.js | 64 + ...ect-watch-options-in-host-configuration.js | 59 + .../inferred-project-watch-options.js | 61 + .../project-with-ascii-file-names-with-i.js | 47 + .../project-with-ascii-file-names.js | 47 + .../project-with-unicode-file-names.js | 47 + ...files-starting-with-dot-in-node_modules.js | 188 ++ ...polling-when-file-is-added-to-subfolder.js | 110 + ...rectory-when-file-is-added-to-subfolder.js | 139 ++ ...tchFile-when-file-is-added-to-subfolder.js | 123 + ...watching-files-with-network-style-paths.js | 224 ++ ...excludeDirectories-option-in-configFile.js | 71 + ...ludeDirectories-option-in-configuration.js | 69 + ...ackPolling-option-as-host-configuration.js | 67 + ...th-fallbackPolling-option-in-configFile.js | 70 + ...hDirectory-option-as-host-configuration.js | 67 + ...ith-watchDirectory-option-in-configFile.js | 67 + ...-watchFile-option-as-host-configuration.js | 67 + .../with-watchFile-option-in-configFile.js | 67 + 231 files changed, 39549 insertions(+), 3930 deletions(-) create mode 100644 tests/baselines/reference/tsserver/cachingFileSystemInformation/loads-missing-files-from-disk.js create mode 100644 tests/baselines/reference/tsserver/cachingFileSystemInformation/npm-install-in-directory-with-tsconfig-timeout-occurs-after-installation.js create mode 100644 tests/baselines/reference/tsserver/cachingFileSystemInformation/npm-install-in-directory-with-tsconfig-timeouts-occur-inbetween-installation.js create mode 100644 tests/baselines/reference/tsserver/cachingFileSystemInformation/watchDirectories-for-config-file-with-case-insensitive-file-system.js create mode 100644 tests/baselines/reference/tsserver/cachingFileSystemInformation/watchDirectories-for-config-file-with-case-sensitive-file-system.js create mode 100644 tests/baselines/reference/tsserver/cachingFileSystemInformation/when-calling-goto-definition-of-module.js create mode 100644 tests/baselines/reference/tsserver/cachingFileSystemInformation/works-using-legacy-resolution-logic.js create mode 100644 tests/baselines/reference/tsserver/configFileSearch/should-use-projectRootPath-when-searching-for-inferred-project-again-2.js create mode 100644 tests/baselines/reference/tsserver/configFileSearch/should-use-projectRootPath-when-searching-for-inferred-project-again.js create mode 100644 tests/baselines/reference/tsserver/configFileSearch/tsconfig-for-the-file-does-not-exist.js create mode 100644 tests/baselines/reference/tsserver/configFileSearch/tsconfig-for-the-file-exists.js create mode 100644 tests/baselines/reference/tsserver/configFileSearch/when-projectRootPath-is-not-present.js create mode 100644 tests/baselines/reference/tsserver/configFileSearch/when-projectRootPath-is-present-but-file-is-not-from-project-root.js create mode 100644 tests/baselines/reference/tsserver/configuredProjects/Open-ref-of-configured-project-when-open-file-gets-added-to-the-project-as-part-of-configured-file-update.js create mode 100644 tests/baselines/reference/tsserver/configuredProjects/add-and-then-remove-a-config-file-in-a-folder-with-loose-files.js create mode 100644 tests/baselines/reference/tsserver/configuredProjects/add-new-files-to-a-configured-project-without-file-list.js create mode 100644 tests/baselines/reference/tsserver/configuredProjects/changed-module-resolution-reflected-when-specifying-files-list.js create mode 100644 tests/baselines/reference/tsserver/configuredProjects/create-configured-project-with-the-file-list.js create mode 100644 tests/baselines/reference/tsserver/configuredProjects/create-configured-project-without-file-list.js create mode 100644 tests/baselines/reference/tsserver/configuredProjects/failed-lookup-locations-uses-parent-most-node_modules-directory.js create mode 100644 tests/baselines/reference/tsserver/configuredProjects/should-stop-watching-the-extended-configs-of-closed-projects.js create mode 100644 tests/baselines/reference/tsserver/configuredProjects/should-watch-the-extended-configs-of-multiple-projects.js create mode 100644 tests/baselines/reference/tsserver/inferredProjects/create-inferred-project.js create mode 100644 tests/baselines/reference/tsserver/moduleSpecifierCache/invalidates-module-specifiers-when-changes-happen-in-contained-node_modules-directories.js create mode 100644 tests/baselines/reference/tsserver/partialSemanticServer/files-are-added-to-inferred-project.js create mode 100644 tests/baselines/reference/tsserver/partialSemanticServer/should-not-crash-when-external-module-name-resolution-is-reused.js create mode 100644 tests/baselines/reference/tsserver/partialSemanticServer/should-not-include-auto-type-reference-directives.js create mode 100644 tests/baselines/reference/tsserver/partialSemanticServer/should-not-include-referenced-files-from-unopened-files.js create mode 100644 tests/baselines/reference/tsserver/partialSemanticServer/should-support-go-to-definition-on-module-specifiers.js create mode 100644 tests/baselines/reference/tsserver/partialSemanticServer/throws-unsupported-commands.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configHasNoReference/dependency-dts-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configHasNoReference/dependency-dts-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configHasNoReference/dependency-dts-created.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configHasNoReference/dependency-dts-deleted.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configHasNoReference/dependency-dts-not-present.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configHasNoReference/dependency-dtsMap-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configHasNoReference/dependency-dtsMap-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configHasNoReference/dependency-dtsMap-created.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configHasNoReference/dependency-dtsMap-deleted.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configHasNoReference/dependency-dtsMap-not-present.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configHasNoReference/rename-locations.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configHasNoReference/usage-file-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configHasNoReference/usage-file-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configWithReference/dependency-dts-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configWithReference/dependency-dts-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configWithReference/dependency-dts-created.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configWithReference/dependency-dts-deleted.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configWithReference/dependency-dts-not-present.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configWithReference/dependency-dtsMap-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configWithReference/dependency-dtsMap-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configWithReference/dependency-dtsMap-created.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configWithReference/dependency-dtsMap-deleted.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configWithReference/dependency-dtsMap-not-present.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configWithReference/dependency-source-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configWithReference/dependency-source-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configWithReference/rename-locations.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configWithReference/usage-file-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configWithReference/usage-file-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/configWithReference/when-projects-are-not-built.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/disabledSourceRef/dependency-dts-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/disabledSourceRef/dependency-dts-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/disabledSourceRef/dependency-dts-created.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/disabledSourceRef/dependency-dts-deleted.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/disabledSourceRef/dependency-dts-not-present.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/disabledSourceRef/dependency-dtsMap-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/disabledSourceRef/dependency-dtsMap-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/disabledSourceRef/dependency-dtsMap-created.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/disabledSourceRef/dependency-dtsMap-deleted.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/disabledSourceRef/dependency-dtsMap-not-present.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/disabledSourceRef/rename-locations.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/disabledSourceRef/usage-file-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependency/disabledSourceRef/usage-file-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configHasNoReference/dependency-dts-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configHasNoReference/dependency-dts-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configHasNoReference/dependency-dts-created.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configHasNoReference/dependency-dts-deleted.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configHasNoReference/dependency-dts-not-present.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configHasNoReference/dependency-dtsMap-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configHasNoReference/dependency-dtsMap-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configHasNoReference/dependency-dtsMap-created.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configHasNoReference/dependency-dtsMap-deleted.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configHasNoReference/dependency-dtsMap-not-present.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configHasNoReference/goToDef-and-rename-locations.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configHasNoReference/usage-file-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configHasNoReference/usage-file-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configWithReference/dependency-dts-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configWithReference/dependency-dts-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configWithReference/dependency-dts-created.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configWithReference/dependency-dts-deleted.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configWithReference/dependency-dts-not-present.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configWithReference/dependency-dtsMap-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configWithReference/dependency-dtsMap-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configWithReference/dependency-dtsMap-created.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configWithReference/dependency-dtsMap-deleted.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configWithReference/dependency-dtsMap-not-present.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configWithReference/dependency-source-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configWithReference/dependency-source-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configWithReference/gotoDef-and-rename-locations.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configWithReference/usage-file-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configWithReference/usage-file-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/configWithReference/when-projects-are-not-built.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/disabledSourceRef/dependency-dts-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/disabledSourceRef/dependency-dts-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/disabledSourceRef/dependency-dts-created.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/disabledSourceRef/dependency-dts-deleted.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/disabledSourceRef/dependency-dts-not-present.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/disabledSourceRef/dependency-dtsMap-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/disabledSourceRef/dependency-dtsMap-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/disabledSourceRef/dependency-dtsMap-created.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/disabledSourceRef/dependency-dtsMap-deleted.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/disabledSourceRef/dependency-dtsMap-not-present.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/disabledSourceRef/gotoDef-and-rename-locations.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/disabledSourceRef/usage-file-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/dependencyAndUsage/disabledSourceRef/usage-file-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configHasNoReference/can-go-to-definition-correctly.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configHasNoReference/dependency-dts-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configHasNoReference/dependency-dts-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configHasNoReference/dependency-dts-created.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configHasNoReference/dependency-dts-deleted.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configHasNoReference/dependency-dts-not-present.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configHasNoReference/dependency-dtsMap-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configHasNoReference/dependency-dtsMap-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configHasNoReference/dependency-dtsMap-created.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configHasNoReference/dependency-dtsMap-deleted.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configHasNoReference/dependency-dtsMap-not-present.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configHasNoReference/usage-file-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configHasNoReference/usage-file-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configWithReference/can-go-to-definition-correctly.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configWithReference/dependency-dts-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configWithReference/dependency-dts-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configWithReference/dependency-dts-created.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configWithReference/dependency-dts-deleted.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configWithReference/dependency-dts-not-present.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configWithReference/dependency-dtsMap-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configWithReference/dependency-dtsMap-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configWithReference/dependency-dtsMap-created.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configWithReference/dependency-dtsMap-deleted.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configWithReference/dependency-dtsMap-not-present.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configWithReference/dependency-source-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configWithReference/dependency-source-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configWithReference/usage-file-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configWithReference/usage-file-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/configWithReference/when-projects-are-not-built.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/disabledSourceRef/can-go-to-definition-correctly.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/disabledSourceRef/dependency-dts-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/disabledSourceRef/dependency-dts-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/disabledSourceRef/dependency-dts-created.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/disabledSourceRef/dependency-dts-deleted.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/disabledSourceRef/dependency-dts-not-present.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/disabledSourceRef/dependency-dtsMap-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/disabledSourceRef/dependency-dtsMap-changes.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/disabledSourceRef/dependency-dtsMap-created.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/disabledSourceRef/dependency-dtsMap-deleted.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/disabledSourceRef/dependency-dtsMap-not-present.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/disabledSourceRef/usage-file-changes-with-timeout-before-request.js create mode 100644 tests/baselines/reference/tsserver/projectReferencesSourcemap/usageProject/disabledSourceRef/usage-file-changes.js create mode 100644 tests/baselines/reference/tsserver/projectUpdatedInBackground/when-event-handler-is-set-in-the-session-and-project-is-at-root-level.js create mode 100644 tests/baselines/reference/tsserver/projectUpdatedInBackground/when-event-handler-is-set-in-the-session-and-project-is-not-at-root-level.js create mode 100644 tests/baselines/reference/tsserver/projectUpdatedInBackground/with-noGetErrOnBackgroundUpdate-and-project-is-at-root-level.js create mode 100644 tests/baselines/reference/tsserver/projectUpdatedInBackground/with-noGetErrOnBackgroundUpdate-and-project-is-not-at-root-level.js create mode 100644 tests/baselines/reference/tsserver/projectUpdatedInBackground/without-noGetErrOnBackgroundUpdate-and-project-is-at-root-level.js create mode 100644 tests/baselines/reference/tsserver/projectUpdatedInBackground/without-noGetErrOnBackgroundUpdate-and-project-is-not-at-root-level.js create mode 100644 tests/baselines/reference/tsserver/projects/files-with-mixed-content-are-handled-correctly.js create mode 100644 tests/baselines/reference/tsserver/projectsWithReferences/sample-project.js create mode 100644 tests/baselines/reference/tsserver/projectsWithReferences/transitive-references-with-deleting-referenced-config-file.js create mode 100644 tests/baselines/reference/tsserver/projectsWithReferences/transitive-references-with-deleting-transitively-referenced-config-file.js create mode 100644 tests/baselines/reference/tsserver/projectsWithReferences/transitive-references-with-edit-in-referenced-config-file.js create mode 100644 tests/baselines/reference/tsserver/projectsWithReferences/transitive-references-with-edit-on-config-file.js create mode 100644 tests/baselines/reference/tsserver/projectsWithReferences/transitive-references-with-non-local-edit.js create mode 100644 tests/baselines/reference/tsserver/projectsWithReferences/trasitive-references-without-files-with-deleting-referenced-config-file.js create mode 100644 tests/baselines/reference/tsserver/projectsWithReferences/trasitive-references-without-files-with-deleting-transitively-referenced-config-file.js create mode 100644 tests/baselines/reference/tsserver/projectsWithReferences/trasitive-references-without-files-with-edit-in-referenced-config-file.js create mode 100644 tests/baselines/reference/tsserver/projectsWithReferences/trasitive-references-without-files-with-edit-on-config-file.js create mode 100644 tests/baselines/reference/tsserver/projectsWithReferences/trasitive-references-without-files-with-non-local-edit.js create mode 100644 tests/baselines/reference/tsserver/resolutionCache/avoid-unnecessary-lookup-invalidation-on-save.js create mode 100644 tests/baselines/reference/tsserver/resolutionCache/can-load-typings-that-are-proper-modules.js create mode 100644 tests/baselines/reference/tsserver/resolutionCache/non-relative-module-name-from-files-in-different-folders.js create mode 100644 tests/baselines/reference/tsserver/resolutionCache/non-relative-module-name-from-files-in-same-folder.js create mode 100644 tests/baselines/reference/tsserver/resolutionCache/non-relative-module-name-from-inferred-project.js create mode 100644 tests/baselines/reference/tsserver/resolutionCache/relative-module-name-from-files-in-different-folders.js create mode 100644 tests/baselines/reference/tsserver/resolutionCache/relative-module-name-from-files-in-same-folder.js create mode 100644 tests/baselines/reference/tsserver/resolutionCache/when-resolution-fails.js create mode 100644 tests/baselines/reference/tsserver/resolutionCache/when-resolves-to-ambient-module.js create mode 100644 tests/baselines/reference/tsserver/syntacticServer/files-go-to-inferred-project-and-semantic-operations-fail.js create mode 100644 tests/baselines/reference/tsserver/syntacticServer/should-not-include-auto-type-reference-directives.js create mode 100644 tests/baselines/reference/tsserver/syntacticServer/throws-on-unsupported-commands.js create mode 100644 tests/baselines/reference/tsserver/typingsInstaller/configured-projects-discover-from-bower_components.js create mode 100644 tests/baselines/reference/tsserver/typingsInstaller/configured-projects.js create mode 100644 tests/baselines/reference/tsserver/typingsInstaller/redo-resolutions-pointing-to-js-on-typing-install.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/external-project-watch-options-in-host-configuration.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/external-project-watch-options.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/files-at-root.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/files-at-windows-style-root.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/files-not-at-root.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/files-not-at-windows-style-root.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/inferred-project-watch-options-in-host-configuration.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/inferred-project-watch-options.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/project-with-ascii-file-names-with-i.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/project-with-ascii-file-names.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/project-with-unicode-file-names.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/recursive-directory-does-not-watch-files-starting-with-dot-in-node_modules.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/uses-dynamic-polling-when-file-is-added-to-subfolder.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/uses-non-recursive-watchDirectory-when-file-is-added-to-subfolder.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/uses-watchFile-when-file-is-added-to-subfolder.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/watching-files-with-network-style-paths.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/with-excludeDirectories-option-in-configFile.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/with-excludeDirectories-option-in-configuration.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/with-fallbackPolling-option-as-host-configuration.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/with-fallbackPolling-option-in-configFile.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/with-watchDirectory-option-as-host-configuration.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/with-watchDirectory-option-in-configFile.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/with-watchFile-option-as-host-configuration.js create mode 100644 tests/baselines/reference/tsserver/watchEnvironment/with-watchFile-option-in-configFile.js diff --git a/src/harness/virtualFileSystemWithWatch.ts b/src/harness/virtualFileSystemWithWatch.ts index 829d6e8fa41f4..80746cff259c7 100644 --- a/src/harness/virtualFileSystemWithWatch.ts +++ b/src/harness/virtualFileSystemWithWatch.ts @@ -195,70 +195,6 @@ interface Array { length: number; [n: number]: T; }` checkMap(caption, arrayToMap(actual, identity), expected, /*eachKeyCount*/ undefined); } - export function checkWatchedFiles(host: TestServerHost, expectedFiles: readonly string[], additionalInfo?: string) { - checkMap(`watchedFiles:: ${additionalInfo || ""}::`, host.watchedFiles, expectedFiles, /*eachKeyCount*/ undefined); - } - - export interface WatchFileDetails { - fileName: string; - pollingInterval: PollingInterval; - } - export function checkWatchedFilesDetailed(host: TestServerHost, expectedFiles: ReadonlyESMap, expectedDetails?: ESMap): void; - export function checkWatchedFilesDetailed(host: TestServerHost, expectedFiles: readonly string[], eachFileWatchCount: number, expectedDetails?: ESMap): void; - export function checkWatchedFilesDetailed(host: TestServerHost, expectedFiles: ReadonlyESMap | readonly string[], eachFileWatchCountOrExpectedDetails?: number | ESMap, expectedDetails?: ESMap) { - if (!isNumber(eachFileWatchCountOrExpectedDetails)) expectedDetails = eachFileWatchCountOrExpectedDetails; - if (isArray(expectedFiles)) { - checkMap( - "watchedFiles", - host.watchedFiles, - expectedFiles, - eachFileWatchCountOrExpectedDetails as number, - [expectedDetails, ({ fileName, pollingInterval }) => ({ fileName, pollingInterval })] - ); - } - else { - checkMap( - "watchedFiles", - host.watchedFiles, - expectedFiles, - [expectedDetails, ({ fileName, pollingInterval }) => ({ fileName, pollingInterval })] - ); - } - } - - export function checkWatchedDirectories(host: TestServerHost, expectedDirectories: string[], recursive: boolean) { - checkMap(`watchedDirectories${recursive ? " recursive" : ""}`, recursive ? host.fsWatchesRecursive : host.fsWatches, expectedDirectories, /*eachKeyCount*/ undefined); - } - - export interface WatchDirectoryDetails { - directoryName: string; - fallbackPollingInterval: PollingInterval; - fallbackOptions: WatchOptions | undefined; - } - export function checkWatchedDirectoriesDetailed(host: TestServerHost, expectedDirectories: ReadonlyESMap, recursive: boolean, expectedDetails?: ESMap): void; - export function checkWatchedDirectoriesDetailed(host: TestServerHost, expectedDirectories: readonly string[], eachDirectoryWatchCount: number, recursive: boolean, expectedDetails?: ESMap): void; - export function checkWatchedDirectoriesDetailed(host: TestServerHost, expectedDirectories: ReadonlyESMap | readonly string[], recursiveOrEachDirectoryWatchCount: boolean | number, recursiveOrExpectedDetails?: boolean | ESMap, expectedDetails?: ESMap) { - if (typeof recursiveOrExpectedDetails !== "boolean") expectedDetails = recursiveOrExpectedDetails; - if (isArray(expectedDirectories)) { - checkMap( - `fsWatches${recursiveOrExpectedDetails ? " recursive" : ""}`, - recursiveOrExpectedDetails as boolean ? host.fsWatchesRecursive : host.fsWatches, - expectedDirectories, - recursiveOrEachDirectoryWatchCount as number, - [expectedDetails, ({ directoryName, fallbackPollingInterval, fallbackOptions }) => ({ directoryName, fallbackPollingInterval, fallbackOptions })] - ); - } - else { - recursiveOrExpectedDetails = recursiveOrEachDirectoryWatchCount as boolean; - checkMap( - `fsWatches${recursiveOrExpectedDetails ? " recursive" : ""}`, - recursiveOrExpectedDetails ? host.fsWatchesRecursive : host.fsWatches, - expectedDirectories, - [expectedDetails, ({ directoryName, fallbackPollingInterval, fallbackOptions }) => ({ directoryName, fallbackPollingInterval, fallbackOptions })] - ); - } - } - export function checkOutputContains(host: TestServerHost, expected: readonly string[]) { const mapExpected = new Set(expected); const mapSeen = new Set(); diff --git a/src/testRunner/unittests/tscWatch/helpers.ts b/src/testRunner/unittests/tscWatch/helpers.ts index 501264b40ff32..70b79aba0b605 100644 --- a/src/testRunner/unittests/tscWatch/helpers.ts +++ b/src/testRunner/unittests/tscWatch/helpers.ts @@ -7,10 +7,6 @@ namespace ts.tscWatch { export import libFile = TestFSWithWatch.libFile; export import createWatchedSystem = TestFSWithWatch.createWatchedSystem; export import checkArray = TestFSWithWatch.checkArray; - export import checkWatchedFiles = TestFSWithWatch.checkWatchedFiles; - export import checkWatchedFilesDetailed = TestFSWithWatch.checkWatchedFilesDetailed; - export import checkWatchedDirectories = TestFSWithWatch.checkWatchedDirectories; - export import checkWatchedDirectoriesDetailed = TestFSWithWatch.checkWatchedDirectoriesDetailed; export import checkOutputContains = TestFSWithWatch.checkOutputContains; export import checkOutputDoesNotContain = TestFSWithWatch.checkOutputDoesNotContain; diff --git a/src/testRunner/unittests/tsserver/cachingFileSystemInformation.ts b/src/testRunner/unittests/tsserver/cachingFileSystemInformation.ts index 34863897e8abb..0f724ceb2f139 100644 --- a/src/testRunner/unittests/tsserver/cachingFileSystemInformation.ts +++ b/src/testRunner/unittests/tsserver/cachingFileSystemInformation.ts @@ -1,8 +1,4 @@ namespace ts.projectSystem { - function getNumberOfWatchesInvokedForRecursiveWatches(recursiveWatchedDirs: string[], file: string) { - return countWhere(recursiveWatchedDirs, dir => file.length > dir.length && startsWith(file, dir) && file[dir.length] === directorySeparator); - } - describe("unittests:: tsserver:: CachingFileSystemInformation:: tsserverProjectSystem CachingFileSystemInformation", () => { enum CalledMapsWithSingleArg { fileExists = "fileExists", @@ -15,7 +11,7 @@ namespace ts.projectSystem { } type CalledMaps = CalledMapsWithSingleArg | CalledMapsWithFiveArgs; type CalledWithFiveArgs = [readonly string[], readonly string[], readonly string[], number]; - function createCallsTrackingHost(host: TestServerHost) { + function createLoggerTrackingHostCalls(host: TestServerHost) { const calledMaps: Record> & Record> = { fileExists: setCallsTrackingWithSingleArgFn(CalledMapsWithSingleArg.fileExists), directoryExists: setCallsTrackingWithSingleArgFn(CalledMapsWithSingleArg.directoryExists), @@ -24,15 +20,7 @@ namespace ts.projectSystem { readDirectory: setCallsTrackingWithFiveArgFn(CalledMapsWithFiveArgs.readDirectory) }; - return { - verifyNoCall, - verifyCalledOnEachEntryNTimes, - verifyCalledOnEachEntry, - verifyNoHostCalls, - verifyNoHostCallsExceptFileExistsOnce, - verifyCalledOn, - clear - }; + return logCacheAndClear; function setCallsTrackingWithSingleArgFn(prop: CalledMapsWithSingleArg) { const calledMap = createMultiMap(); @@ -54,49 +42,25 @@ namespace ts.projectSystem { return calledMap; } - function verifyCalledOn(callback: CalledMaps, name: string) { - const calledMap = calledMaps[callback]; - const result = calledMap.get(name); - assert.isTrue(result && !!result.length, `${callback} should be called with name: ${name}: ${arrayFrom(calledMap.keys())}`); + function logCacheEntry(logger: Logger, callback: CalledMaps) { + const result = arrayFrom<[string, (true | CalledWithFiveArgs)[]], { key: string, count: number }>(calledMaps[callback].entries(), ([key, arr]) => ({ key, count: arr.length })); + logger.info(`${callback}:: ${JSON.stringify(result)}`); + calledMaps[callback].clear(); } - function verifyNoCall(callback: CalledMaps) { - const calledMap = calledMaps[callback]; - assert.equal(calledMap.size, 0, `${callback} shouldn't be called: ${arrayFrom(calledMap.keys())}`); - } - - function verifyCalledOnEachEntry(callback: CalledMaps, expectedKeys: ESMap) { - TestFSWithWatch.checkMap(callback, calledMaps[callback], expectedKeys); - } - - function verifyCalledOnEachEntryNTimes(callback: CalledMaps, expectedKeys: readonly string[], nTimes: number) { - TestFSWithWatch.checkMap(callback, calledMaps[callback], expectedKeys, nTimes); - } - - function verifyNoHostCalls() { - iterateOnCalledMaps(key => verifyNoCall(key)); - } - - function verifyNoHostCallsExceptFileExistsOnce(expectedKeys: readonly string[]) { - verifyCalledOnEachEntryNTimes(CalledMapsWithSingleArg.fileExists, expectedKeys, 1); - verifyNoCall(CalledMapsWithSingleArg.directoryExists); - verifyNoCall(CalledMapsWithSingleArg.getDirectories); - verifyNoCall(CalledMapsWithSingleArg.readFile); - verifyNoCall(CalledMapsWithFiveArgs.readDirectory); - } - - function clear() { - iterateOnCalledMaps(key => calledMaps[key].clear()); + function logCacheAndClear(logger: Logger) { + logCacheEntry(logger, CalledMapsWithSingleArg.fileExists); + logCacheEntry(logger, CalledMapsWithSingleArg.directoryExists); + logCacheEntry(logger, CalledMapsWithSingleArg.getDirectories); + logCacheEntry(logger, CalledMapsWithSingleArg.readFile); + logCacheEntry(logger, CalledMapsWithFiveArgs.readDirectory); } + } - function iterateOnCalledMaps(cb: (key: CalledMaps) => void) { - for (const key in CalledMapsWithSingleArg) { - cb(key as CalledMapsWithSingleArg); - } - for (const key in CalledMapsWithFiveArgs) { - cb(key as CalledMapsWithFiveArgs); - } - } + function logSemanticDiagnostics(projectService: server.ProjectService, project: server.Project, file: File) { + const diags = project.getLanguageService().getSemanticDiagnostics(file.path); + projectService.logger.info(`getSemanticDiagnostics:: ${file.path}:: ${diags.length}`); + diags.forEach(d => projectService.logger.info(formatDiagnostic(d, project))); } it("works using legacy resolution logic", () => { @@ -112,108 +76,50 @@ namespace ts.projectSystem { }; const host = createServerHost([root, imported]); - const projectService = createProjectService(host); + const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() }); projectService.setCompilerOptionsForInferredProjects({ module: ModuleKind.AMD, noLib: true }); projectService.openClientFile(root.path); - checkNumberOfProjects(projectService, { inferredProjects: 1 }); const project = projectService.inferredProjects[0]; const rootScriptInfo = project.getRootScriptInfos()[0]; assert.equal(rootScriptInfo.fileName, root.path); // ensure that imported file was found - verifyImportedDiagnostics(); + logSemanticDiagnostics(projectService, project, imported); - const callsTrackingHost = createCallsTrackingHost(host); + const logCacheAndClear = createLoggerTrackingHostCalls(host); // trigger synchronization to make sure that import will be fetched from the cache // ensure file has correct number of errors after edit editContent(`import {x} from "f1"; var x: string = 1;`); - verifyImportedDiagnostics(); - callsTrackingHost.verifyNoHostCalls(); + logSemanticDiagnostics(projectService, project, imported); + logCacheAndClear(projectService.logger); // trigger synchronization to make sure that the host will try to find 'f2' module on disk editContent(`import {x} from "f2"`); try { // trigger synchronization to make sure that the host will try to find 'f2' module on disk - verifyImportedDiagnostics(); - assert.isTrue(false, `should not find file '${imported.path}'`); + logSemanticDiagnostics(projectService, project, imported); } catch (e) { - assert.isTrue(e.message.indexOf(`Could not find source file: '${imported.path}'.`) === 0, `Actual: ${e.message}`); + projectService.logger.info(e.message); } - const f2Lookups = getLocationsForModuleLookup("f2"); - callsTrackingHost.verifyCalledOnEachEntryNTimes(CalledMapsWithSingleArg.fileExists, f2Lookups, 1); - const f2DirLookups = getLocationsForDirectoryLookup(); - callsTrackingHost.verifyCalledOnEachEntry(CalledMapsWithSingleArg.directoryExists, f2DirLookups); - callsTrackingHost.verifyNoCall(CalledMapsWithSingleArg.getDirectories); - callsTrackingHost.verifyNoCall(CalledMapsWithSingleArg.readFile); - callsTrackingHost.verifyNoCall(CalledMapsWithFiveArgs.readDirectory); + logCacheAndClear(projectService.logger); editContent(`import {x} from "f1"`); - verifyImportedDiagnostics(); - const f1Lookups = f2Lookups.map(s => s.replace("f2", "f1")); - f1Lookups.length = f1Lookups.indexOf(imported.path) + 1; - const f1DirLookups = ["/c/d", "/c", ...mapCombinedPathsInAncestor(getDirectoryPath(root.path), nodeModulesAtTypes, returnTrue)]; - vertifyF1Lookups(); + logSemanticDiagnostics(projectService, project, imported); + logCacheAndClear(projectService.logger); // setting compiler options discards module resolution cache - callsTrackingHost.clear(); projectService.setCompilerOptionsForInferredProjects({ module: ModuleKind.AMD, noLib: true, target: ScriptTarget.ES5 }); - verifyImportedDiagnostics(); - vertifyF1Lookups(); - - function vertifyF1Lookups() { - callsTrackingHost.verifyCalledOnEachEntryNTimes(CalledMapsWithSingleArg.fileExists, f1Lookups, 1); - callsTrackingHost.verifyCalledOnEachEntryNTimes(CalledMapsWithSingleArg.directoryExists, f1DirLookups, 1); - callsTrackingHost.verifyNoCall(CalledMapsWithSingleArg.getDirectories); - callsTrackingHost.verifyNoCall(CalledMapsWithSingleArg.readFile); - callsTrackingHost.verifyNoCall(CalledMapsWithFiveArgs.readDirectory); - } + logSemanticDiagnostics(projectService, project, imported); + logCacheAndClear(projectService.logger); + baselineTsserverLogs("cachingFileSystemInformation", "works using legacy resolution logic", projectService); function editContent(newContent: string) { - callsTrackingHost.clear(); rootScriptInfo.editContent(0, rootContent.length, newContent); rootContent = newContent; } - - function verifyImportedDiagnostics() { - const diags = project.getLanguageService().getSemanticDiagnostics(imported.path); - assert.equal(diags.length, 1); - const diag = diags[0]; - assert.equal(diag.code, Diagnostics.Cannot_find_name_0.code); - assert.equal(flattenDiagnosticMessageText(diag.messageText, "\n"), "Cannot find name 'foo'."); - } - - function getLocationsForModuleLookup(module: string) { - const locations: string[] = []; - forEachAncestorDirectory(getDirectoryPath(root.path), ancestor => { - locations.push( - combinePaths(ancestor, `${module}.ts`), - combinePaths(ancestor, `${module}.tsx`), - combinePaths(ancestor, `${module}.d.ts`) - ); - }); - forEachAncestorDirectory(getDirectoryPath(root.path), ancestor => { - locations.push( - combinePaths(ancestor, `${module}.js`), - combinePaths(ancestor, `${module}.jsx`) - ); - }); - return locations; - } - - function getLocationsForDirectoryLookup() { - const result = new Map(); - forEachAncestorDirectory(getDirectoryPath(root.path), ancestor => { - // To resolve modules - result.set(ancestor, 2); - // for type roots - result.set(combinePaths(ancestor, nodeModules), 1); - result.set(combinePaths(ancestor, nodeModulesAtTypes), 1); - }); - return result; - } }); it("loads missing files from disk", () => { @@ -228,29 +134,22 @@ namespace ts.projectSystem { }; const host = createServerHost([root]); - const projectService = createProjectService(host); + const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() }); projectService.setCompilerOptionsForInferredProjects({ module: ModuleKind.AMD, noLib: true }); - const callsTrackingHost = createCallsTrackingHost(host); + const logCacheAndClear = createLoggerTrackingHostCalls(host); projectService.openClientFile(root.path); - checkNumberOfProjects(projectService, { inferredProjects: 1 }); const project = projectService.inferredProjects[0]; const rootScriptInfo = project.getRootScriptInfos()[0]; assert.equal(rootScriptInfo.fileName, root.path); - let diags = project.getLanguageService().getSemanticDiagnostics(root.path); - assert.equal(diags.length, 1); - const diag = diags[0]; - assert.equal(diag.code, Diagnostics.Cannot_find_module_0_Did_you_mean_to_set_the_moduleResolution_option_to_node_or_to_add_aliases_to_the_paths_option.code); - assert.equal(flattenDiagnosticMessageText(diag.messageText, "\n"), "Cannot find module 'bar'. Did you mean to set the 'moduleResolution' option to 'node', or to add aliases to the 'paths' option?"); - callsTrackingHost.verifyCalledOn(CalledMapsWithSingleArg.fileExists, imported.path); - + logSemanticDiagnostics(projectService, project, root); + logCacheAndClear(projectService.logger); - callsTrackingHost.clear(); host.writeFile(imported.path, imported.content); host.runQueuedTimeoutCallbacks(); - diags = project.getLanguageService().getSemanticDiagnostics(root.path); - assert.equal(diags.length, 0); - callsTrackingHost.verifyCalledOn(CalledMapsWithSingleArg.fileExists, imported.path); + logSemanticDiagnostics(projectService, project, root); + logCacheAndClear(projectService.logger); + baselineTsserverLogs("cachingFileSystemInformation", "loads missing files from disk", projectService); }); it("when calling goto definition of module", () => { @@ -296,17 +195,9 @@ namespace ts.projectSystem { }; const projectFiles = [clientFile, anotherModuleFile, moduleFile, tsconfigFile]; const host = createServerHost(projectFiles); - const session = createSession(host); - const projectService = session.getProjectService(); - const { configFileName } = projectService.openClientFile(clientFile.path); - - assert.isDefined(configFileName, `should find config`); - checkNumberOfConfiguredProjects(projectService, 1); - - const project = projectService.configuredProjects.get(tsconfigFile.path)!; - checkProjectActualFiles(project, map(projectFiles, f => f.path)); - - const callsTrackingHost = createCallsTrackingHost(host); + const session = createSession(host, { logger: createLoggerWithInMemoryLogs() }); + openFilesForSession([clientFile], session); + const logCacheAndClear = createLoggerTrackingHostCalls(host); // Get definitions shouldnt make host requests const getDefinitionRequest = makeSessionRequest(protocol.CommandTypes.Definition, { @@ -315,137 +206,90 @@ namespace ts.projectSystem { line: undefined!, // TODO: GH#18217 offset: undefined! // TODO: GH#18217 }); - const response = session.executeCommand(getDefinitionRequest).response as server.protocol.FileSpan[]; - assert.equal(response[0].file, moduleFile.path, "Should go to definition of vessel: response: " + JSON.stringify(response)); - callsTrackingHost.verifyNoHostCalls(); + session.executeCommand(getDefinitionRequest); + logCacheAndClear(session.logger); // Open the file should call only file exists on module directory and use cached value for parental directory - const { configFileName: config2 } = projectService.openClientFile(moduleFile.path); - assert.equal(config2, configFileName); - callsTrackingHost.verifyNoHostCallsExceptFileExistsOnce(["/a/b/models/tsconfig.json", "/a/b/models/jsconfig.json"]); + openFilesForSession([moduleFile], session); + logCacheAndClear(session.logger); - checkNumberOfConfiguredProjects(projectService, 1); - assert.strictEqual(projectService.configuredProjects.get(tsconfigFile.path), project); + baselineTsserverLogs("cachingFileSystemInformation", "when calling goto definition of module", session); }); describe("WatchDirectories for config file with", () => { function verifyWatchDirectoriesCaseSensitivity(useCaseSensitiveFileNames: boolean) { - const frontendDir = "/Users/someuser/work/applications/frontend"; - const toCanonical: (s: string) => Path = useCaseSensitiveFileNames ? s => s as Path : s => s.toLowerCase() as Path; - const canonicalFrontendDir = toCanonical(frontendDir); - const file1: File = { - path: `${frontendDir}/src/app/utils/Analytic.ts`, - content: "export class SomeClass { };" - }; - const file2: File = { - path: `${frontendDir}/src/app/redux/configureStore.ts`, - content: "export class configureStore { }" - }; - const file3: File = { - path: `${frontendDir}/src/app/utils/Cookie.ts`, - content: "export class Cookie { }" - }; - const es2016LibFile: File = { - path: "/a/lib/lib.es2016.full.d.ts", - content: libFile.content - }; - const typeRoots = ["types", "node_modules/@types"]; - const types = ["node", "jest"]; - const tsconfigFile: File = { - path: `${frontendDir}/tsconfig.json`, - content: JSON.stringify({ - compilerOptions: { - strict: true, - strictNullChecks: true, - target: "es2016", - module: "commonjs", - moduleResolution: "node", - sourceMap: true, - noEmitOnError: true, - experimentalDecorators: true, - emitDecoratorMetadata: true, - types, - noUnusedLocals: true, - outDir: "./compiled", - typeRoots, - baseUrl: ".", - paths: { - "*": [ - "types/*" - ] - } - }, - include: [ - "src/**/*" - ], - exclude: [ - "node_modules", - "compiled" - ] - }) - }; - const projectFiles = [file1, file2, es2016LibFile, tsconfigFile]; - const host = createServerHost(projectFiles, { useCaseSensitiveFileNames }); - const projectService = createProjectService(host); - const canonicalConfigPath = toCanonical(tsconfigFile.path); - const { configFileName } = projectService.openClientFile(file1.path); - assert.equal(configFileName, tsconfigFile.path as server.NormalizedPath, `should find config`); - checkNumberOfConfiguredProjects(projectService, 1); - const watchingRecursiveDirectories = [`${canonicalFrontendDir}/src`, `${canonicalFrontendDir}/types`, `${canonicalFrontendDir}/node_modules`].concat(getNodeModuleDirectories(getDirectoryPath(canonicalFrontendDir))); - - const project = projectService.configuredProjects.get(canonicalConfigPath)!; - verifyProjectAndWatchedDirectories(); - - const callsTrackingHost = createCallsTrackingHost(host); - - // Create file cookie.ts - projectFiles.push(file3); - host.writeFile(file3.path, file3.content); - host.runQueuedTimeoutCallbacks(); - - const canonicalFile3Path = useCaseSensitiveFileNames ? file3.path : file3.path.toLocaleLowerCase(); - const numberOfTimesWatchInvoked = getNumberOfWatchesInvokedForRecursiveWatches(watchingRecursiveDirectories, canonicalFile3Path); - callsTrackingHost.verifyCalledOnEachEntryNTimes(CalledMapsWithSingleArg.fileExists, [canonicalFile3Path], numberOfTimesWatchInvoked); - callsTrackingHost.verifyCalledOnEachEntryNTimes(CalledMapsWithSingleArg.directoryExists, [canonicalFile3Path], numberOfTimesWatchInvoked); - callsTrackingHost.verifyNoCall(CalledMapsWithSingleArg.getDirectories); - callsTrackingHost.verifyCalledOnEachEntryNTimes(CalledMapsWithSingleArg.readFile, [file3.path], 1); - callsTrackingHost.verifyNoCall(CalledMapsWithFiveArgs.readDirectory); - - checkNumberOfConfiguredProjects(projectService, 1); - assert.strictEqual(projectService.configuredProjects.get(canonicalConfigPath), project); - verifyProjectAndWatchedDirectories(); - - callsTrackingHost.clear(); - - const { configFileName: configFile2 } = projectService.openClientFile(file3.path); - assert.equal(configFile2, configFileName); - - checkNumberOfConfiguredProjects(projectService, 1); - assert.strictEqual(projectService.configuredProjects.get(canonicalConfigPath), project); - verifyProjectAndWatchedDirectories(); - callsTrackingHost.verifyNoHostCalls(); - - function getFilePathIfNotOpen(f: File) { - const path = toCanonical(f.path); - const info = projectService.getScriptInfoForPath(toCanonical(f.path)); - return info && info.isScriptOpen() ? undefined : path; - } - - function verifyProjectAndWatchedDirectories() { - checkProjectActualFiles(project, map(projectFiles, f => f.path)); - checkWatchedFiles(host, mapDefined(projectFiles, getFilePathIfNotOpen)); - checkWatchedDirectories(host, watchingRecursiveDirectories, /*recursive*/ true); - checkWatchedDirectories(host, [], /*recursive*/ false); - } + it(`watchDirectories for config file with case ${useCaseSensitiveFileNames ? "" : "in"}sensitive file system`, () => { + const frontendDir = "/Users/someuser/work/applications/frontend"; + const file1: File = { + path: `${frontendDir}/src/app/utils/Analytic.ts`, + content: "export class SomeClass { };" + }; + const file2: File = { + path: `${frontendDir}/src/app/redux/configureStore.ts`, + content: "export class configureStore { }" + }; + const file3: File = { + path: `${frontendDir}/src/app/utils/Cookie.ts`, + content: "export class Cookie { }" + }; + const es2016LibFile: File = { + path: "/a/lib/lib.es2016.full.d.ts", + content: libFile.content + }; + const typeRoots = ["types", "node_modules/@types"]; + const types = ["node", "jest"]; + const tsconfigFile: File = { + path: `${frontendDir}/tsconfig.json`, + content: JSON.stringify({ + compilerOptions: { + strict: true, + strictNullChecks: true, + target: "es2016", + module: "commonjs", + moduleResolution: "node", + sourceMap: true, + noEmitOnError: true, + experimentalDecorators: true, + emitDecoratorMetadata: true, + types, + noUnusedLocals: true, + outDir: "./compiled", + typeRoots, + baseUrl: ".", + paths: { + "*": [ + "types/*" + ] + } + }, + include: [ + "src/**/*" + ], + exclude: [ + "node_modules", + "compiled" + ] + }) + }; + const projectFiles = [file1, file2, es2016LibFile, tsconfigFile]; + const host = createServerHost(projectFiles, { useCaseSensitiveFileNames }); + const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() }); + projectService.openClientFile(file1.path); + + const logCacheAndClear = createLoggerTrackingHostCalls(host); + + // Create file cookie.ts + host.writeFile(file3.path, file3.content); + host.runQueuedTimeoutCallbacks(); + logCacheAndClear(projectService.logger); + + projectService.openClientFile(file3.path); + logCacheAndClear(projectService.logger); + baselineTsserverLogs("cachingFileSystemInformation", `watchDirectories for config file with case ${useCaseSensitiveFileNames ? "" : "in"}sensitive file system`, projectService); + }); } - - it("case insensitive file system", () => { - verifyWatchDirectoriesCaseSensitivity(/*useCaseSensitiveFileNames*/ false); - }); - - it("case sensitive file system", () => { - verifyWatchDirectoriesCaseSensitivity(/*useCaseSensitiveFileNames*/ true); - }); + verifyWatchDirectoriesCaseSensitivity(/*useCaseSensitiveFileNames*/ false); + verifyWatchDirectoriesCaseSensitivity(/*useCaseSensitiveFileNames*/ true); }); describe("Subfolder invalidations correctly include parent folder failed lookup locations", () => { @@ -499,23 +343,24 @@ namespace ts.projectSystem { }); describe("Verify npm install in directory with tsconfig file works when", () => { - function verifyNpmInstall(timeoutDuringPartialInstallation: boolean) { - const root = "/user/username/rootfolder/otherfolder"; - const getRootedFileOrFolder = (fileOrFolder: File) => { - fileOrFolder.path = root + fileOrFolder.path; - return fileOrFolder; - }; - const app: File = getRootedFileOrFolder({ - path: "/a/b/app.ts", - content: "import _ from 'lodash';" - }); - const tsconfigJson: File = getRootedFileOrFolder({ - path: "/a/b/tsconfig.json", - content: '{ "compilerOptions": { } }' - }); - const packageJson: File = getRootedFileOrFolder({ - path: "/a/b/package.json", - content: ` + function verifyNpmInstall(scenario: string, timeoutDuringPartialInstallation: boolean) { + it(scenario, () => { + const root = "/user/username/rootfolder/otherfolder"; + const getRootedFileOrFolder = (fileOrFolder: File) => { + fileOrFolder.path = root + fileOrFolder.path; + return fileOrFolder; + }; + const app: File = getRootedFileOrFolder({ + path: "/a/b/app.ts", + content: "import _ from 'lodash';" + }); + const tsconfigJson: File = getRootedFileOrFolder({ + path: "/a/b/tsconfig.json", + content: '{ "compilerOptions": { } }' + }); + const packageJson: File = getRootedFileOrFolder({ + path: "/a/b/package.json", + content: ` { "name": "test", "version": "1.0.0", @@ -537,143 +382,115 @@ namespace ts.projectSystem { "license": "ISC" } ` - }); - const appFolder = getDirectoryPath(app.path); - const projectFiles = [app, libFile, tsconfigJson]; - const typeRootDirectories = getTypeRootsFromLocation(getDirectoryPath(tsconfigJson.path)); - const otherFiles = [packageJson]; - const host = createServerHost(projectFiles.concat(otherFiles)); - const projectService = createProjectService(host); - projectService.setHostConfiguration({ preferences: { includePackageJsonAutoImports: "off" } }); - const { configFileName } = projectService.openClientFile(app.path); - assert.equal(configFileName, tsconfigJson.path as server.NormalizedPath, `should find config`); // TODO: GH#18217 - const recursiveWatchedDirectories: string[] = [`${appFolder}`, `${appFolder}/node_modules`].concat(getNodeModuleDirectories(getDirectoryPath(appFolder))); - verifyProject(); - - let npmInstallComplete = false; - - // Simulate npm install - const filesAndFoldersToAdd: File[] = [ - { path: "/a/b/node_modules" }, - { path: "/a/b/node_modules/.staging/@types" }, - { path: "/a/b/node_modules/.staging/lodash-b0733faa" }, - { path: "/a/b/node_modules/.staging/@types/lodash-e56c4fe7" }, - { path: "/a/b/node_modules/.staging/symbol-observable-24bcbbff" }, - { path: "/a/b/node_modules/.staging/rxjs-22375c61" }, - { path: "/a/b/node_modules/.staging/typescript-8493ea5d" }, - { path: "/a/b/node_modules/.staging/symbol-observable-24bcbbff/package.json", content: "{\n \"name\": \"symbol-observable\",\n \"version\": \"1.0.4\",\n \"description\": \"Symbol.observable ponyfill\",\n \"license\": \"MIT\",\n \"repository\": \"blesh/symbol-observable\",\n \"author\": {\n \"name\": \"Ben Lesh\",\n \"email\": \"ben@benlesh.com\"\n },\n \"engines\": {\n \"node\": \">=0.10.0\"\n },\n \"scripts\": {\n \"test\": \"npm run build && mocha && tsc ./ts-test/test.ts && node ./ts-test/test.js && check-es3-syntax -p lib/ --kill\",\n \"build\": \"babel es --out-dir lib\",\n \"prepublish\": \"npm test\"\n },\n \"files\": [\n \"" }, - { path: "/a/b/node_modules/.staging/lodash-b0733faa/package.json", content: "{\n \"name\": \"lodash\",\n \"version\": \"4.17.4\",\n \"description\": \"Lodash modular utilities.\",\n \"keywords\": \"modules, stdlib, util\",\n \"homepage\": \"https://lodash.com/\",\n \"repository\": \"lodash/lodash\",\n \"icon\": \"https://lodash.com/icon.svg\",\n \"license\": \"MIT\",\n \"main\": \"lodash.js\",\n \"author\": \"John-David Dalton (http://allyoucanleet.com/)\",\n \"contributors\": [\n \"John-David Dalton (http://allyoucanleet.com/)\",\n \"Mathias Bynens \",\n \"contributors\": [\n {\n \"name\": \"Ben Lesh\",\n \"email\": \"ben@benlesh.com\"\n },\n {\n \"name\": \"Paul Taylor\",\n \"email\": \"paul.e.taylor@me.com\"\n },\n {\n \"name\": \"Jeff Cross\",\n \"email\": \"crossj@google.com\"\n },\n {\n \"name\": \"Matthew Podwysocki\",\n \"email\": \"matthewp@microsoft.com\"\n },\n {\n \"name\": \"OJ Kwon\",\n \"email\": \"kwon.ohjoong@gmail.com\"\n },\n {\n \"name\": \"Andre Staltz\",\n \"email\": \"andre@staltz.com\"\n }\n ],\n \"license\": \"Apache-2.0\",\n \"bugs\": {\n \"url\": \"https://github.com/ReactiveX/RxJS/issues\"\n },\n \"homepage\": \"https://github.com/ReactiveX/RxJS\",\n \"devDependencies\": {\n \"babel-polyfill\": \"^6.23.0\",\n \"benchmark\": \"^2.1.0\",\n \"benchpress\": \"2.0.0-beta.1\",\n \"chai\": \"^3.5.0\",\n \"color\": \"^0.11.1\",\n \"colors\": \"1.1.2\",\n \"commitizen\": \"^2.8.6\",\n \"coveralls\": \"^2.11.13\",\n \"cz-conventional-changelog\": \"^1.2.0\",\n \"danger\": \"^1.1.0\",\n \"doctoc\": \"^1.0.0\",\n \"escape-string-regexp\": \"^1.0.5 \",\n \"esdoc\": \"^0.4.7\",\n \"eslint\": \"^3.8.0\",\n \"fs-extra\": \"^2.1.2\",\n \"get-folder-size\": \"^1.0.0\",\n \"glob\": \"^7.0.3\",\n \"gm\": \"^1.22.0\",\n \"google-closure-compiler-js\": \"^20170218.0.0\",\n \"gzip-size\": \"^3.0.0\",\n \"http-server\": \"^0.9.0\",\n \"husky\": \"^0.13.3\",\n \"lint-staged\": \"3.2.5\",\n \"lodash\": \"^4.15.0\",\n \"madge\": \"^1.4.3\",\n \"markdown-doctest\": \"^0.9.1\",\n \"minimist\": \"^1.2.0\",\n \"mkdirp\": \"^0.5.1\",\n \"mocha\": \"^3.0.2\",\n \"mocha-in-sauce\": \"0.0.1\",\n \"npm-run-all\": \"^4.0.2\",\n \"npm-scripts-info\": \"^0.3.4\",\n \"nyc\": \"^10.2.0\",\n \"opn-cli\": \"^3.1.0\",\n \"platform\": \"^1.3.1\",\n \"promise\": \"^7.1.1\",\n \"protractor\": \"^3.1.1\",\n \"rollup\": \"0.36.3\",\n \"rollup-plugin-inject\": \"^2.0.0\",\n \"rollup-plugin-node-resolve\": \"^2.0.0\",\n \"rx\": \"latest\",\n \"rxjs\": \"latest\",\n \"shx\": \"^0.2.2\",\n \"sinon\": \"^2.1.0\",\n \"sinon-chai\": \"^2.9.0\",\n \"source-map-support\": \"^0.4.0\",\n \"tslib\": \"^1.5.0\",\n \"eslint\": \"^4.4.2\",\n \"typescript\": \"~2.0.6\",\n \"typings\": \"^2.0.0\",\n \"validate-commit-msg\": \"^2.14.0\",\n \"watch\": \"^1.0.1\",\n \"webpack\": \"^1.13.1\",\n \"xmlhttprequest\": \"1.8.0\"\n },\n \"engines\": {\n \"npm\": \">=2.0.0\"\n },\n \"typings\": \"Rx.d.ts\",\n \"dependencies\": {\n \"symbol-observable\": \"^1.0.1\"\n }\n}" }, - { path: "/a/b/node_modules/.staging/typescript-8493ea5d/package.json", content: "{\n \"name\": \"typescript\",\n \"author\": \"Microsoft Corp.\",\n \"homepage\": \"http://typescriptlang.org/\",\n \"version\": \"2.4.2\",\n \"license\": \"Apache-2.0\",\n \"description\": \"TypeScript is a language for application scale JavaScript development\",\n \"keywords\": [\n \"TypeScript\",\n \"Microsoft\",\n \"compiler\",\n \"language\",\n \"javascript\"\n ],\n \"bugs\": {\n \"url\": \"https://github.com/Microsoft/TypeScript/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Microsoft/TypeScript.git\"\n },\n \"main\": \"./lib/typescript.js\",\n \"typings\": \"./lib/typescript.d.ts\",\n \"bin\": {\n \"tsc\": \"./bin/tsc\",\n \"tsserver\": \"./bin/tsserver\"\n },\n \"engines\": {\n \"node\": \">=4.2.0\"\n },\n \"devDependencies\": {\n \"@types/browserify\": \"latest\",\n \"@types/chai\": \"latest\",\n \"@types/convert-source-map\": \"latest\",\n \"@types/del\": \"latest\",\n \"@types/glob\": \"latest\",\n \"@types/gulp\": \"latest\",\n \"@types/gulp-concat\": \"latest\",\n \"@types/gulp-help\": \"latest\",\n \"@types/gulp-newer\": \"latest\",\n \"@types/gulp-sourcemaps\": \"latest\",\n \"@types/merge2\": \"latest\",\n \"@types/minimatch\": \"latest\",\n \"@types/minimist\": \"latest\",\n \"@types/mkdirp\": \"latest\",\n \"@types/mocha\": \"latest\",\n \"@types/node\": \"latest\",\n \"@types/q\": \"latest\",\n \"@types/run-sequence\": \"latest\",\n \"@types/through2\": \"latest\",\n \"browserify\": \"latest\",\n \"chai\": \"latest\",\n \"convert-source-map\": \"latest\",\n \"del\": \"latest\",\n \"gulp\": \"latest\",\n \"gulp-clone\": \"latest\",\n \"gulp-concat\": \"latest\",\n \"gulp-help\": \"latest\",\n \"gulp-insert\": \"latest\",\n \"gulp-newer\": \"latest\",\n \"gulp-sourcemaps\": \"latest\",\n \"gulp-typescript\": \"latest\",\n \"into-stream\": \"latest\",\n \"istanbul\": \"latest\",\n \"jake\": \"latest\",\n \"merge2\": \"latest\",\n \"minimist\": \"latest\",\n \"mkdirp\": \"latest\",\n \"mocha\": \"latest\",\n \"mocha-fivemat-progress-reporter\": \"latest\",\n \"q\": \"latest\",\n \"run-sequence\": \"latest\",\n \"sorcery\": \"latest\",\n \"through2\": \"latest\",\n \"travis-fold\": \"latest\",\n \"ts-node\": \"latest\",\n \"eslint\": \"5.16.0\",\n \"typescript\": \"^2.4\"\n },\n \"scripts\": {\n \"pretest\": \"jake tests\",\n \"test\": \"jake runtests-parallel\",\n \"build\": \"npm run build:compiler && npm run build:tests\",\n \"build:compiler\": \"jake local\",\n \"build:tests\": \"jake tests\",\n \"start\": \"node lib/tsc\",\n \"clean\": \"jake clean\",\n \"gulp\": \"gulp\",\n \"jake\": \"jake\",\n \"lint\": \"jake lint\",\n \"setup-hooks\": \"node scripts/link-hooks.js\"\n },\n \"browser\": {\n \"buffer\": false,\n \"fs\": false,\n \"os\": false,\n \"path\": false\n }\n}" }, - { path: "/a/b/node_modules/.staging/symbol-observable-24bcbbff/index.js", content: "module.exports = require('./lib/index');\n" }, - { path: "/a/b/node_modules/.staging/symbol-observable-24bcbbff/index.d.ts", content: "declare const observableSymbol: symbol;\nexport default observableSymbol;\n" }, - { path: "/a/b/node_modules/.staging/symbol-observable-24bcbbff/lib" }, - { path: "/a/b/node_modules/.staging/symbol-observable-24bcbbff/lib/index.js", content: "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _ponyfill = require('./ponyfill');\n\nvar _ponyfill2 = _interopRequireDefault(_ponyfill);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar root; /* global window */\n\n\nif (typeof self !== 'undefined') {\n root = self;\n} else if (typeof window !== 'undefined') {\n root = window;\n} else if (typeof global !== 'undefined') {\n root = global;\n} else if (typeof module !== 'undefined') {\n root = module;\n} else {\n root = Function('return this')();\n}\n\nvar result = (0, _ponyfill2['default'])(root);\nexports['default'] = result;" }, - ].map(getRootedFileOrFolder); - verifyAfterPartialOrCompleteNpmInstall(2); - - filesAndFoldersToAdd.push(...[ - { path: "/a/b/node_modules/.staging/typescript-8493ea5d/lib" }, - { path: "/a/b/node_modules/.staging/rxjs-22375c61/add/operator" }, - { path: "/a/b/node_modules/.staging/@types/lodash-e56c4fe7/package.json", content: "{\n \"name\": \"@types/lodash\",\n \"version\": \"4.14.74\",\n \"description\": \"TypeScript definitions for Lo-Dash\",\n \"license\": \"MIT\",\n \"contributors\": [\n {\n \"name\": \"Brian Zengel\",\n \"url\": \"https://github.com/bczengel\"\n },\n {\n \"name\": \"Ilya Mochalov\",\n \"url\": \"https://github.com/chrootsu\"\n },\n {\n \"name\": \"Stepan Mikhaylyuk\",\n \"url\": \"https://github.com/stepancar\"\n },\n {\n \"name\": \"Eric L Anderson\",\n \"url\": \"https://github.com/ericanderson\"\n },\n {\n \"name\": \"AJ Richardson\",\n \"url\": \"https://github.com/aj-r\"\n },\n {\n \"name\": \"Junyoung Clare Jang\",\n \"url\": \"https://github.com/ailrun\"\n }\n ],\n \"main\": \"\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://www.github.com/DefinitelyTyped/DefinitelyTyped.git\"\n },\n \"scripts\": {},\n \"dependencies\": {},\n \"typesPublisherContentHash\": \"12af578ffaf8d86d2df37e591857906a86b983fa9258414326544a0fe6af0de8\",\n \"typeScriptVersion\": \"2.2\"\n}" }, - { path: "/a/b/node_modules/.staging/lodash-b0733faa/index.js", content: "module.exports = require('./lodash');" }, - { path: "/a/b/node_modules/.staging/typescript-8493ea5d/package.json.3017591594", content: "" } - ].map(getRootedFileOrFolder)); - // Since we added/removed in .staging no timeout - verifyAfterPartialOrCompleteNpmInstall(0); - - // Remove file "/a/b/node_modules/.staging/typescript-8493ea5d/package.json.3017591594" - host.deleteFile(last(filesAndFoldersToAdd).path); - filesAndFoldersToAdd.length--; - verifyAfterPartialOrCompleteNpmInstall(0); - - filesAndFoldersToAdd.push(...[ - { path: "/a/b/node_modules/.staging/rxjs-22375c61/bundles" }, - { path: "/a/b/node_modules/.staging/rxjs-22375c61/operator" }, - { path: "/a/b/node_modules/.staging/rxjs-22375c61/src/add/observable/dom" }, - { path: "/a/b/node_modules/.staging/@types/lodash-e56c4fe7/index.d.ts", content: "\n// Stub for lodash\nexport = _;\nexport as namespace _;\ndeclare var _: _.LoDashStatic;\ndeclare namespace _ {\n interface LoDashStatic {\n someProp: string;\n }\n class SomeClass {\n someMethod(): void;\n }\n}" } - ].map(getRootedFileOrFolder)); - verifyAfterPartialOrCompleteNpmInstall(0); - - filesAndFoldersToAdd.push(...[ - { path: "/a/b/node_modules/.staging/rxjs-22375c61/src/scheduler" }, - { path: "/a/b/node_modules/.staging/rxjs-22375c61/src/util" }, - { path: "/a/b/node_modules/.staging/rxjs-22375c61/symbol" }, - { path: "/a/b/node_modules/.staging/rxjs-22375c61/testing" }, - { path: "/a/b/node_modules/.staging/rxjs-22375c61/package.json.2252192041", content: "{\n \"_args\": [\n [\n {\n \"raw\": \"rxjs@^5.4.2\",\n \"scope\": null,\n \"escapedName\": \"rxjs\",\n \"name\": \"rxjs\",\n \"rawSpec\": \"^5.4.2\",\n \"spec\": \">=5.4.2 <6.0.0\",\n \"type\": \"range\"\n },\n \"C:\\\\Users\\\\shkamat\\\\Desktop\\\\app\"\n ]\n ],\n \"_from\": \"rxjs@>=5.4.2 <6.0.0\",\n \"_id\": \"rxjs@5.4.3\",\n \"_inCache\": true,\n \"_location\": \"/rxjs\",\n \"_nodeVersion\": \"7.7.2\",\n \"_npmOperationalInternal\": {\n \"host\": \"s3://npm-registry-packages\",\n \"tmp\": \"tmp/rxjs-5.4.3.tgz_1502407898166_0.6800217325799167\"\n },\n \"_npmUser\": {\n \"name\": \"blesh\",\n \"email\": \"ben@benlesh.com\"\n },\n \"_npmVersion\": \"5.3.0\",\n \"_phantomChildren\": {},\n \"_requested\": {\n \"raw\": \"rxjs@^5.4.2\",\n \"scope\": null,\n \"escapedName\": \"rxjs\",\n \"name\": \"rxjs\",\n \"rawSpec\": \"^5.4.2\",\n \"spec\": \">=5.4.2 <6.0.0\",\n \"type\": \"range\"\n },\n \"_requiredBy\": [\n \"/\"\n ],\n \"_resolved\": \"https://registry.npmjs.org/rxjs/-/rxjs-5.4.3.tgz\",\n \"_shasum\": \"0758cddee6033d68e0fd53676f0f3596ce3d483f\",\n \"_shrinkwrap\": null,\n \"_spec\": \"rxjs@^5.4.2\",\n \"_where\": \"C:\\\\Users\\\\shkamat\\\\Desktop\\\\app\",\n \"author\": {\n \"name\": \"Ben Lesh\",\n \"email\": \"ben@benlesh.com\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/ReactiveX/RxJS/issues\"\n },\n \"config\": {\n \"commitizen\": {\n \"path\": \"cz-conventional-changelog\"\n }\n },\n \"contributors\": [\n {\n \"name\": \"Ben Lesh\",\n \"email\": \"ben@benlesh.com\"\n },\n {\n \"name\": \"Paul Taylor\",\n \"email\": \"paul.e.taylor@me.com\"\n },\n {\n \"name\": \"Jeff Cross\",\n \"email\": \"crossj@google.com\"\n },\n {\n \"name\": \"Matthew Podwysocki\",\n \"email\": \"matthewp@microsoft.com\"\n },\n {\n \"name\": \"OJ Kwon\",\n \"email\": \"kwon.ohjoong@gmail.com\"\n },\n {\n \"name\": \"Andre Staltz\",\n \"email\": \"andre@staltz.com\"\n }\n ],\n \"dependencies\": {\n \"symbol-observable\": \"^1.0.1\"\n },\n \"description\": \"Reactive Extensions for modern JavaScript\",\n \"devDependencies\": {\n \"babel-polyfill\": \"^6.23.0\",\n \"benchmark\": \"^2.1.0\",\n \"benchpress\": \"2.0.0-beta.1\",\n \"chai\": \"^3.5.0\",\n \"color\": \"^0.11.1\",\n \"colors\": \"1.1.2\",\n \"commitizen\": \"^2.8.6\",\n \"coveralls\": \"^2.11.13\",\n \"cz-conventional-changelog\": \"^1.2.0\",\n \"danger\": \"^1.1.0\",\n \"doctoc\": \"^1.0.0\",\n \"escape-string-regexp\": \"^1.0.5 \",\n \"esdoc\": \"^0.4.7\",\n \"eslint\": \"^3.8.0\",\n \"fs-extra\": \"^2.1.2\",\n \"get-folder-size\": \"^1.0.0\",\n \"glob\": \"^7.0.3\",\n \"gm\": \"^1.22.0\",\n \"google-closure-compiler-js\": \"^20170218.0.0\",\n \"gzip-size\": \"^3.0.0\",\n \"http-server\": \"^0.9.0\",\n \"husky\": \"^0.13.3\",\n \"lint-staged\": \"3.2.5\",\n \"lodash\": \"^4.15.0\",\n \"madge\": \"^1.4.3\",\n \"markdown-doctest\": \"^0.9.1\",\n \"minimist\": \"^1.2.0\",\n \"mkdirp\": \"^0.5.1\",\n \"mocha\": \"^3.0.2\",\n \"mocha-in-sauce\": \"0.0.1\",\n \"npm-run-all\": \"^4.0.2\",\n \"npm-scripts-info\": \"^0.3.4\",\n \"nyc\": \"^10.2.0\",\n \"opn-cli\": \"^3.1.0\",\n \"platform\": \"^1.3.1\",\n \"promise\": \"^7.1.1\",\n \"protractor\": \"^3.1.1\",\n \"rollup\": \"0.36.3\",\n \"rollup-plugin-inject\": \"^2.0.0\",\n \"rollup-plugin-node-resolve\": \"^2.0.0\",\n \"rx\": \"latest\",\n \"rxjs\": \"latest\",\n \"shx\": \"^0.2.2\",\n \"sinon\": \"^2.1.0\",\n \"sinon-chai\": \"^2.9.0\",\n \"source-map-support\": \"^0.4.0\",\n \"tslib\": \"^1.5.0\",\n \"eslint\": \"^5.16.0\",\n \"typescript\": \"~2.0.6\",\n \"typings\": \"^2.0.0\",\n \"validate-commit-msg\": \"^2.14.0\",\n \"watch\": \"^1.0.1\",\n \"webpack\": \"^1.13.1\",\n \"xmlhttprequest\": \"1.8.0\"\n },\n \"directories\": {},\n \"dist\": {\n \"integrity\": \"sha512-fSNi+y+P9ss+EZuV0GcIIqPUK07DEaMRUtLJvdcvMyFjc9dizuDjere+A4V7JrLGnm9iCc+nagV/4QdMTkqC4A==\",\n \"shasum\": \"0758cddee6033d68e0fd53676f0f3596ce3d483f\",\n \"tarball\": \"https://registry.npmjs.org/rxjs/-/rxjs-5.4.3.tgz\"\n },\n \"engines\": {\n \"npm\": \">=2.0.0\"\n },\n \"homepage\": \"https://github.com/ReactiveX/RxJS\",\n \"keywords\": [\n \"Rx\",\n \"RxJS\",\n \"ReactiveX\",\n \"ReactiveExtensions\",\n \"Streams\",\n \"Observables\",\n \"Observable\",\n \"Stream\",\n \"ES6\",\n \"ES2015\"\n ],\n \"license\": \"Apache-2.0\",\n \"lint-staged\": {\n \"*.@(js)\": [\n \"eslint --fix\",\n \"git add\"\n ],\n \"*.@(ts)\": [\n \"eslint -c .eslintrc --ext .ts . --fix\",\n \"git add\"\n ]\n },\n \"main\": \"Rx.js\",\n \"maintainers\": [\n {\n \"name\": \"blesh\",\n \"email\": \"ben@benlesh.com\"\n }\n ],\n \"name\": \"rxjs\",\n \"optionalDependencies\": {},\n \"readme\": \"ERROR: No README data found!\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+ssh://git@github.com/ReactiveX/RxJS.git\"\n },\n \"scripts-info\": {\n \"info\": \"List available script\",\n \"build_all\": \"Build all packages (ES6, CJS, UMD) and generate packages\",\n \"build_cjs\": \"Build CJS package with clean up existing build, copy source into dist\",\n \"build_es6\": \"Build ES6 package with clean up existing build, copy source into dist\",\n \"build_closure_core\": \"Minify Global core build using closure compiler\",\n \"build_global\": \"Build Global package, then minify build\",\n \"build_perf\": \"Build CJS & Global build, run macro performance test\",\n \"build_test\": \"Build CJS package & test spec, execute mocha test runner\",\n \"build_cover\": \"Run lint to current code, build CJS & test spec, execute test coverage\",\n \"build_docs\": \"Build ES6 & global package, create documentation using it\",\n \"build_spec\": \"Build test specs\",\n \"check_circular_dependencies\": \"Check codebase has circular dependencies\",\n \"clean_spec\": \"Clean up existing test spec build output\",\n \"clean_dist_cjs\": \"Clean up existing CJS package output\",\n \"clean_dist_es6\": \"Clean up existing ES6 package output\",\n \"clean_dist_global\": \"Clean up existing Global package output\",\n \"commit\": \"Run git commit wizard\",\n \"compile_dist_cjs\": \"Compile codebase into CJS module\",\n \"compile_module_es6\": \"Compile codebase into ES6\",\n \"cover\": \"Execute test coverage\",\n \"lint_perf\": \"Run lint against performance test suite\",\n \"lint_spec\": \"Run lint against test spec\",\n \"lint_src\": \"Run lint against source\",\n \"lint\": \"Run lint against everything\",\n \"perf\": \"Run macro performance benchmark\",\n \"perf_micro\": \"Run micro performance benchmark\",\n \"test_mocha\": \"Execute mocha test runner against existing test spec build\",\n \"test_browser\": \"Execute mocha test runner on browser against existing test spec build\",\n \"test\": \"Clean up existing test spec build, build test spec and execute mocha test runner\",\n \"tests2png\": \"Generate marble diagram image from test spec\",\n \"watch\": \"Watch codebase, trigger compile when source code changes\"\n },\n \"typings\": \"Rx.d.ts\",\n \"version\": \"5.4.3\"\n}\n" } - ].map(getRootedFileOrFolder)); - verifyAfterPartialOrCompleteNpmInstall(0); - - // remove /a/b/node_modules/.staging/rxjs-22375c61/package.json.2252192041 - host.deleteFile(last(filesAndFoldersToAdd).path); - filesAndFoldersToAdd.length--; - // and add few more folders/files - filesAndFoldersToAdd.push(...[ - { path: "/a/b/node_modules/symbol-observable" }, - { path: "/a/b/node_modules/@types" }, - { path: "/a/b/node_modules/@types/lodash" }, - { path: "/a/b/node_modules/lodash" }, - { path: "/a/b/node_modules/rxjs" }, - { path: "/a/b/node_modules/typescript" }, - { path: "/a/b/node_modules/.bin" } - ].map(getRootedFileOrFolder)); - // From the type root update - verifyAfterPartialOrCompleteNpmInstall(2); - - forEach(filesAndFoldersToAdd, f => { - f.path = f.path - .replace("/a/b/node_modules/.staging", "/a/b/node_modules") - .replace(/[\-\.][\d\w][\d\w][\d\w][\d\w][\d\w][\d\w][\d\w][\d\w]/g, ""); - }); - - host.deleteFolder(root + "/a/b/node_modules/.staging", /*recursive*/ true); - const lodashIndexPath = root + "/a/b/node_modules/@types/lodash/index.d.ts"; - projectFiles.push(find(filesAndFoldersToAdd, f => f.path === lodashIndexPath)!); - // we would now not have failed lookup in the parent of appFolder since lodash is available - recursiveWatchedDirectories.length = 2; - // npm installation complete, timeout after reload fs - npmInstallComplete = true; - verifyAfterPartialOrCompleteNpmInstall(2); - - function verifyAfterPartialOrCompleteNpmInstall(timeoutQueueLengthWhenRunningTimeouts: number) { - filesAndFoldersToAdd.forEach(f => host.ensureFileOrFolder(f)); - if (npmInstallComplete || timeoutDuringPartialInstallation) { - if (timeoutQueueLengthWhenRunningTimeouts) { - // Expected project update - host.checkTimeoutQueueLengthAndRun(timeoutQueueLengthWhenRunningTimeouts + 1); // Scheduled invalidation of resolutions - host.runQueuedTimeoutCallbacks(); // Actual update + }); + const host = createServerHost([app, libFile, tsconfigJson, packageJson]); + const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() }); + projectService.setHostConfiguration({ preferences: { includePackageJsonAutoImports: "off" } }); + projectService.openClientFile(app.path); + + let npmInstallComplete = false; + + // Simulate npm install + const filesAndFoldersToAdd: File[] = [ + { path: "/a/b/node_modules" }, + { path: "/a/b/node_modules/.staging/@types" }, + { path: "/a/b/node_modules/.staging/lodash-b0733faa" }, + { path: "/a/b/node_modules/.staging/@types/lodash-e56c4fe7" }, + { path: "/a/b/node_modules/.staging/symbol-observable-24bcbbff" }, + { path: "/a/b/node_modules/.staging/rxjs-22375c61" }, + { path: "/a/b/node_modules/.staging/typescript-8493ea5d" }, + { path: "/a/b/node_modules/.staging/symbol-observable-24bcbbff/package.json", content: "{\n \"name\": \"symbol-observable\",\n \"version\": \"1.0.4\",\n \"description\": \"Symbol.observable ponyfill\",\n \"license\": \"MIT\",\n \"repository\": \"blesh/symbol-observable\",\n \"author\": {\n \"name\": \"Ben Lesh\",\n \"email\": \"ben@benlesh.com\"\n },\n \"engines\": {\n \"node\": \">=0.10.0\"\n },\n \"scripts\": {\n \"test\": \"npm run build && mocha && tsc ./ts-test/test.ts && node ./ts-test/test.js && check-es3-syntax -p lib/ --kill\",\n \"build\": \"babel es --out-dir lib\",\n \"prepublish\": \"npm test\"\n },\n \"files\": [\n \"" }, + { path: "/a/b/node_modules/.staging/lodash-b0733faa/package.json", content: "{\n \"name\": \"lodash\",\n \"version\": \"4.17.4\",\n \"description\": \"Lodash modular utilities.\",\n \"keywords\": \"modules, stdlib, util\",\n \"homepage\": \"https://lodash.com/\",\n \"repository\": \"lodash/lodash\",\n \"icon\": \"https://lodash.com/icon.svg\",\n \"license\": \"MIT\",\n \"main\": \"lodash.js\",\n \"author\": \"John-David Dalton (http://allyoucanleet.com/)\",\n \"contributors\": [\n \"John-David Dalton (http://allyoucanleet.com/)\",\n \"Mathias Bynens \",\n \"contributors\": [\n {\n \"name\": \"Ben Lesh\",\n \"email\": \"ben@benlesh.com\"\n },\n {\n \"name\": \"Paul Taylor\",\n \"email\": \"paul.e.taylor@me.com\"\n },\n {\n \"name\": \"Jeff Cross\",\n \"email\": \"crossj@google.com\"\n },\n {\n \"name\": \"Matthew Podwysocki\",\n \"email\": \"matthewp@microsoft.com\"\n },\n {\n \"name\": \"OJ Kwon\",\n \"email\": \"kwon.ohjoong@gmail.com\"\n },\n {\n \"name\": \"Andre Staltz\",\n \"email\": \"andre@staltz.com\"\n }\n ],\n \"license\": \"Apache-2.0\",\n \"bugs\": {\n \"url\": \"https://github.com/ReactiveX/RxJS/issues\"\n },\n \"homepage\": \"https://github.com/ReactiveX/RxJS\",\n \"devDependencies\": {\n \"babel-polyfill\": \"^6.23.0\",\n \"benchmark\": \"^2.1.0\",\n \"benchpress\": \"2.0.0-beta.1\",\n \"chai\": \"^3.5.0\",\n \"color\": \"^0.11.1\",\n \"colors\": \"1.1.2\",\n \"commitizen\": \"^2.8.6\",\n \"coveralls\": \"^2.11.13\",\n \"cz-conventional-changelog\": \"^1.2.0\",\n \"danger\": \"^1.1.0\",\n \"doctoc\": \"^1.0.0\",\n \"escape-string-regexp\": \"^1.0.5 \",\n \"esdoc\": \"^0.4.7\",\n \"eslint\": \"^3.8.0\",\n \"fs-extra\": \"^2.1.2\",\n \"get-folder-size\": \"^1.0.0\",\n \"glob\": \"^7.0.3\",\n \"gm\": \"^1.22.0\",\n \"google-closure-compiler-js\": \"^20170218.0.0\",\n \"gzip-size\": \"^3.0.0\",\n \"http-server\": \"^0.9.0\",\n \"husky\": \"^0.13.3\",\n \"lint-staged\": \"3.2.5\",\n \"lodash\": \"^4.15.0\",\n \"madge\": \"^1.4.3\",\n \"markdown-doctest\": \"^0.9.1\",\n \"minimist\": \"^1.2.0\",\n \"mkdirp\": \"^0.5.1\",\n \"mocha\": \"^3.0.2\",\n \"mocha-in-sauce\": \"0.0.1\",\n \"npm-run-all\": \"^4.0.2\",\n \"npm-scripts-info\": \"^0.3.4\",\n \"nyc\": \"^10.2.0\",\n \"opn-cli\": \"^3.1.0\",\n \"platform\": \"^1.3.1\",\n \"promise\": \"^7.1.1\",\n \"protractor\": \"^3.1.1\",\n \"rollup\": \"0.36.3\",\n \"rollup-plugin-inject\": \"^2.0.0\",\n \"rollup-plugin-node-resolve\": \"^2.0.0\",\n \"rx\": \"latest\",\n \"rxjs\": \"latest\",\n \"shx\": \"^0.2.2\",\n \"sinon\": \"^2.1.0\",\n \"sinon-chai\": \"^2.9.0\",\n \"source-map-support\": \"^0.4.0\",\n \"tslib\": \"^1.5.0\",\n \"eslint\": \"^4.4.2\",\n \"typescript\": \"~2.0.6\",\n \"typings\": \"^2.0.0\",\n \"validate-commit-msg\": \"^2.14.0\",\n \"watch\": \"^1.0.1\",\n \"webpack\": \"^1.13.1\",\n \"xmlhttprequest\": \"1.8.0\"\n },\n \"engines\": {\n \"npm\": \">=2.0.0\"\n },\n \"typings\": \"Rx.d.ts\",\n \"dependencies\": {\n \"symbol-observable\": \"^1.0.1\"\n }\n}" }, + { path: "/a/b/node_modules/.staging/typescript-8493ea5d/package.json", content: "{\n \"name\": \"typescript\",\n \"author\": \"Microsoft Corp.\",\n \"homepage\": \"http://typescriptlang.org/\",\n \"version\": \"2.4.2\",\n \"license\": \"Apache-2.0\",\n \"description\": \"TypeScript is a language for application scale JavaScript development\",\n \"keywords\": [\n \"TypeScript\",\n \"Microsoft\",\n \"compiler\",\n \"language\",\n \"javascript\"\n ],\n \"bugs\": {\n \"url\": \"https://github.com/Microsoft/TypeScript/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Microsoft/TypeScript.git\"\n },\n \"main\": \"./lib/typescript.js\",\n \"typings\": \"./lib/typescript.d.ts\",\n \"bin\": {\n \"tsc\": \"./bin/tsc\",\n \"tsserver\": \"./bin/tsserver\"\n },\n \"engines\": {\n \"node\": \">=4.2.0\"\n },\n \"devDependencies\": {\n \"@types/browserify\": \"latest\",\n \"@types/chai\": \"latest\",\n \"@types/convert-source-map\": \"latest\",\n \"@types/del\": \"latest\",\n \"@types/glob\": \"latest\",\n \"@types/gulp\": \"latest\",\n \"@types/gulp-concat\": \"latest\",\n \"@types/gulp-help\": \"latest\",\n \"@types/gulp-newer\": \"latest\",\n \"@types/gulp-sourcemaps\": \"latest\",\n \"@types/merge2\": \"latest\",\n \"@types/minimatch\": \"latest\",\n \"@types/minimist\": \"latest\",\n \"@types/mkdirp\": \"latest\",\n \"@types/mocha\": \"latest\",\n \"@types/node\": \"latest\",\n \"@types/q\": \"latest\",\n \"@types/run-sequence\": \"latest\",\n \"@types/through2\": \"latest\",\n \"browserify\": \"latest\",\n \"chai\": \"latest\",\n \"convert-source-map\": \"latest\",\n \"del\": \"latest\",\n \"gulp\": \"latest\",\n \"gulp-clone\": \"latest\",\n \"gulp-concat\": \"latest\",\n \"gulp-help\": \"latest\",\n \"gulp-insert\": \"latest\",\n \"gulp-newer\": \"latest\",\n \"gulp-sourcemaps\": \"latest\",\n \"gulp-typescript\": \"latest\",\n \"into-stream\": \"latest\",\n \"istanbul\": \"latest\",\n \"jake\": \"latest\",\n \"merge2\": \"latest\",\n \"minimist\": \"latest\",\n \"mkdirp\": \"latest\",\n \"mocha\": \"latest\",\n \"mocha-fivemat-progress-reporter\": \"latest\",\n \"q\": \"latest\",\n \"run-sequence\": \"latest\",\n \"sorcery\": \"latest\",\n \"through2\": \"latest\",\n \"travis-fold\": \"latest\",\n \"ts-node\": \"latest\",\n \"eslint\": \"5.16.0\",\n \"typescript\": \"^2.4\"\n },\n \"scripts\": {\n \"pretest\": \"jake tests\",\n \"test\": \"jake runtests-parallel\",\n \"build\": \"npm run build:compiler && npm run build:tests\",\n \"build:compiler\": \"jake local\",\n \"build:tests\": \"jake tests\",\n \"start\": \"node lib/tsc\",\n \"clean\": \"jake clean\",\n \"gulp\": \"gulp\",\n \"jake\": \"jake\",\n \"lint\": \"jake lint\",\n \"setup-hooks\": \"node scripts/link-hooks.js\"\n },\n \"browser\": {\n \"buffer\": false,\n \"fs\": false,\n \"os\": false,\n \"path\": false\n }\n}" }, + { path: "/a/b/node_modules/.staging/symbol-observable-24bcbbff/index.js", content: "module.exports = require('./lib/index');\n" }, + { path: "/a/b/node_modules/.staging/symbol-observable-24bcbbff/index.d.ts", content: "declare const observableSymbol: symbol;\nexport default observableSymbol;\n" }, + { path: "/a/b/node_modules/.staging/symbol-observable-24bcbbff/lib" }, + { path: "/a/b/node_modules/.staging/symbol-observable-24bcbbff/lib/index.js", content: "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _ponyfill = require('./ponyfill');\n\nvar _ponyfill2 = _interopRequireDefault(_ponyfill);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar root; /* global window */\n\n\nif (typeof self !== 'undefined') {\n root = self;\n} else if (typeof window !== 'undefined') {\n root = window;\n} else if (typeof global !== 'undefined') {\n root = global;\n} else if (typeof module !== 'undefined') {\n root = module;\n} else {\n root = Function('return this')();\n}\n\nvar result = (0, _ponyfill2['default'])(root);\nexports['default'] = result;" }, + ].map(getRootedFileOrFolder); + verifyAfterPartialOrCompleteNpmInstall(2); + + filesAndFoldersToAdd.push(...[ + { path: "/a/b/node_modules/.staging/typescript-8493ea5d/lib" }, + { path: "/a/b/node_modules/.staging/rxjs-22375c61/add/operator" }, + { path: "/a/b/node_modules/.staging/@types/lodash-e56c4fe7/package.json", content: "{\n \"name\": \"@types/lodash\",\n \"version\": \"4.14.74\",\n \"description\": \"TypeScript definitions for Lo-Dash\",\n \"license\": \"MIT\",\n \"contributors\": [\n {\n \"name\": \"Brian Zengel\",\n \"url\": \"https://github.com/bczengel\"\n },\n {\n \"name\": \"Ilya Mochalov\",\n \"url\": \"https://github.com/chrootsu\"\n },\n {\n \"name\": \"Stepan Mikhaylyuk\",\n \"url\": \"https://github.com/stepancar\"\n },\n {\n \"name\": \"Eric L Anderson\",\n \"url\": \"https://github.com/ericanderson\"\n },\n {\n \"name\": \"AJ Richardson\",\n \"url\": \"https://github.com/aj-r\"\n },\n {\n \"name\": \"Junyoung Clare Jang\",\n \"url\": \"https://github.com/ailrun\"\n }\n ],\n \"main\": \"\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://www.github.com/DefinitelyTyped/DefinitelyTyped.git\"\n },\n \"scripts\": {},\n \"dependencies\": {},\n \"typesPublisherContentHash\": \"12af578ffaf8d86d2df37e591857906a86b983fa9258414326544a0fe6af0de8\",\n \"typeScriptVersion\": \"2.2\"\n}" }, + { path: "/a/b/node_modules/.staging/lodash-b0733faa/index.js", content: "module.exports = require('./lodash');" }, + { path: "/a/b/node_modules/.staging/typescript-8493ea5d/package.json.3017591594", content: "" } + ].map(getRootedFileOrFolder)); + // Since we added/removed in .staging no timeout + verifyAfterPartialOrCompleteNpmInstall(0); + + // Remove file "/a/b/node_modules/.staging/typescript-8493ea5d/package.json.3017591594" + host.deleteFile(last(filesAndFoldersToAdd).path); + filesAndFoldersToAdd.length--; + verifyAfterPartialOrCompleteNpmInstall(0); + + filesAndFoldersToAdd.push(...[ + { path: "/a/b/node_modules/.staging/rxjs-22375c61/bundles" }, + { path: "/a/b/node_modules/.staging/rxjs-22375c61/operator" }, + { path: "/a/b/node_modules/.staging/rxjs-22375c61/src/add/observable/dom" }, + { path: "/a/b/node_modules/.staging/@types/lodash-e56c4fe7/index.d.ts", content: "\n// Stub for lodash\nexport = _;\nexport as namespace _;\ndeclare var _: _.LoDashStatic;\ndeclare namespace _ {\n interface LoDashStatic {\n someProp: string;\n }\n class SomeClass {\n someMethod(): void;\n }\n}" } + ].map(getRootedFileOrFolder)); + verifyAfterPartialOrCompleteNpmInstall(0); + + filesAndFoldersToAdd.push(...[ + { path: "/a/b/node_modules/.staging/rxjs-22375c61/src/scheduler" }, + { path: "/a/b/node_modules/.staging/rxjs-22375c61/src/util" }, + { path: "/a/b/node_modules/.staging/rxjs-22375c61/symbol" }, + { path: "/a/b/node_modules/.staging/rxjs-22375c61/testing" }, + { path: "/a/b/node_modules/.staging/rxjs-22375c61/package.json.2252192041", content: "{\n \"_args\": [\n [\n {\n \"raw\": \"rxjs@^5.4.2\",\n \"scope\": null,\n \"escapedName\": \"rxjs\",\n \"name\": \"rxjs\",\n \"rawSpec\": \"^5.4.2\",\n \"spec\": \">=5.4.2 <6.0.0\",\n \"type\": \"range\"\n },\n \"C:\\\\Users\\\\shkamat\\\\Desktop\\\\app\"\n ]\n ],\n \"_from\": \"rxjs@>=5.4.2 <6.0.0\",\n \"_id\": \"rxjs@5.4.3\",\n \"_inCache\": true,\n \"_location\": \"/rxjs\",\n \"_nodeVersion\": \"7.7.2\",\n \"_npmOperationalInternal\": {\n \"host\": \"s3://npm-registry-packages\",\n \"tmp\": \"tmp/rxjs-5.4.3.tgz_1502407898166_0.6800217325799167\"\n },\n \"_npmUser\": {\n \"name\": \"blesh\",\n \"email\": \"ben@benlesh.com\"\n },\n \"_npmVersion\": \"5.3.0\",\n \"_phantomChildren\": {},\n \"_requested\": {\n \"raw\": \"rxjs@^5.4.2\",\n \"scope\": null,\n \"escapedName\": \"rxjs\",\n \"name\": \"rxjs\",\n \"rawSpec\": \"^5.4.2\",\n \"spec\": \">=5.4.2 <6.0.0\",\n \"type\": \"range\"\n },\n \"_requiredBy\": [\n \"/\"\n ],\n \"_resolved\": \"https://registry.npmjs.org/rxjs/-/rxjs-5.4.3.tgz\",\n \"_shasum\": \"0758cddee6033d68e0fd53676f0f3596ce3d483f\",\n \"_shrinkwrap\": null,\n \"_spec\": \"rxjs@^5.4.2\",\n \"_where\": \"C:\\\\Users\\\\shkamat\\\\Desktop\\\\app\",\n \"author\": {\n \"name\": \"Ben Lesh\",\n \"email\": \"ben@benlesh.com\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/ReactiveX/RxJS/issues\"\n },\n \"config\": {\n \"commitizen\": {\n \"path\": \"cz-conventional-changelog\"\n }\n },\n \"contributors\": [\n {\n \"name\": \"Ben Lesh\",\n \"email\": \"ben@benlesh.com\"\n },\n {\n \"name\": \"Paul Taylor\",\n \"email\": \"paul.e.taylor@me.com\"\n },\n {\n \"name\": \"Jeff Cross\",\n \"email\": \"crossj@google.com\"\n },\n {\n \"name\": \"Matthew Podwysocki\",\n \"email\": \"matthewp@microsoft.com\"\n },\n {\n \"name\": \"OJ Kwon\",\n \"email\": \"kwon.ohjoong@gmail.com\"\n },\n {\n \"name\": \"Andre Staltz\",\n \"email\": \"andre@staltz.com\"\n }\n ],\n \"dependencies\": {\n \"symbol-observable\": \"^1.0.1\"\n },\n \"description\": \"Reactive Extensions for modern JavaScript\",\n \"devDependencies\": {\n \"babel-polyfill\": \"^6.23.0\",\n \"benchmark\": \"^2.1.0\",\n \"benchpress\": \"2.0.0-beta.1\",\n \"chai\": \"^3.5.0\",\n \"color\": \"^0.11.1\",\n \"colors\": \"1.1.2\",\n \"commitizen\": \"^2.8.6\",\n \"coveralls\": \"^2.11.13\",\n \"cz-conventional-changelog\": \"^1.2.0\",\n \"danger\": \"^1.1.0\",\n \"doctoc\": \"^1.0.0\",\n \"escape-string-regexp\": \"^1.0.5 \",\n \"esdoc\": \"^0.4.7\",\n \"eslint\": \"^3.8.0\",\n \"fs-extra\": \"^2.1.2\",\n \"get-folder-size\": \"^1.0.0\",\n \"glob\": \"^7.0.3\",\n \"gm\": \"^1.22.0\",\n \"google-closure-compiler-js\": \"^20170218.0.0\",\n \"gzip-size\": \"^3.0.0\",\n \"http-server\": \"^0.9.0\",\n \"husky\": \"^0.13.3\",\n \"lint-staged\": \"3.2.5\",\n \"lodash\": \"^4.15.0\",\n \"madge\": \"^1.4.3\",\n \"markdown-doctest\": \"^0.9.1\",\n \"minimist\": \"^1.2.0\",\n \"mkdirp\": \"^0.5.1\",\n \"mocha\": \"^3.0.2\",\n \"mocha-in-sauce\": \"0.0.1\",\n \"npm-run-all\": \"^4.0.2\",\n \"npm-scripts-info\": \"^0.3.4\",\n \"nyc\": \"^10.2.0\",\n \"opn-cli\": \"^3.1.0\",\n \"platform\": \"^1.3.1\",\n \"promise\": \"^7.1.1\",\n \"protractor\": \"^3.1.1\",\n \"rollup\": \"0.36.3\",\n \"rollup-plugin-inject\": \"^2.0.0\",\n \"rollup-plugin-node-resolve\": \"^2.0.0\",\n \"rx\": \"latest\",\n \"rxjs\": \"latest\",\n \"shx\": \"^0.2.2\",\n \"sinon\": \"^2.1.0\",\n \"sinon-chai\": \"^2.9.0\",\n \"source-map-support\": \"^0.4.0\",\n \"tslib\": \"^1.5.0\",\n \"eslint\": \"^5.16.0\",\n \"typescript\": \"~2.0.6\",\n \"typings\": \"^2.0.0\",\n \"validate-commit-msg\": \"^2.14.0\",\n \"watch\": \"^1.0.1\",\n \"webpack\": \"^1.13.1\",\n \"xmlhttprequest\": \"1.8.0\"\n },\n \"directories\": {},\n \"dist\": {\n \"integrity\": \"sha512-fSNi+y+P9ss+EZuV0GcIIqPUK07DEaMRUtLJvdcvMyFjc9dizuDjere+A4V7JrLGnm9iCc+nagV/4QdMTkqC4A==\",\n \"shasum\": \"0758cddee6033d68e0fd53676f0f3596ce3d483f\",\n \"tarball\": \"https://registry.npmjs.org/rxjs/-/rxjs-5.4.3.tgz\"\n },\n \"engines\": {\n \"npm\": \">=2.0.0\"\n },\n \"homepage\": \"https://github.com/ReactiveX/RxJS\",\n \"keywords\": [\n \"Rx\",\n \"RxJS\",\n \"ReactiveX\",\n \"ReactiveExtensions\",\n \"Streams\",\n \"Observables\",\n \"Observable\",\n \"Stream\",\n \"ES6\",\n \"ES2015\"\n ],\n \"license\": \"Apache-2.0\",\n \"lint-staged\": {\n \"*.@(js)\": [\n \"eslint --fix\",\n \"git add\"\n ],\n \"*.@(ts)\": [\n \"eslint -c .eslintrc --ext .ts . --fix\",\n \"git add\"\n ]\n },\n \"main\": \"Rx.js\",\n \"maintainers\": [\n {\n \"name\": \"blesh\",\n \"email\": \"ben@benlesh.com\"\n }\n ],\n \"name\": \"rxjs\",\n \"optionalDependencies\": {},\n \"readme\": \"ERROR: No README data found!\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+ssh://git@github.com/ReactiveX/RxJS.git\"\n },\n \"scripts-info\": {\n \"info\": \"List available script\",\n \"build_all\": \"Build all packages (ES6, CJS, UMD) and generate packages\",\n \"build_cjs\": \"Build CJS package with clean up existing build, copy source into dist\",\n \"build_es6\": \"Build ES6 package with clean up existing build, copy source into dist\",\n \"build_closure_core\": \"Minify Global core build using closure compiler\",\n \"build_global\": \"Build Global package, then minify build\",\n \"build_perf\": \"Build CJS & Global build, run macro performance test\",\n \"build_test\": \"Build CJS package & test spec, execute mocha test runner\",\n \"build_cover\": \"Run lint to current code, build CJS & test spec, execute test coverage\",\n \"build_docs\": \"Build ES6 & global package, create documentation using it\",\n \"build_spec\": \"Build test specs\",\n \"check_circular_dependencies\": \"Check codebase has circular dependencies\",\n \"clean_spec\": \"Clean up existing test spec build output\",\n \"clean_dist_cjs\": \"Clean up existing CJS package output\",\n \"clean_dist_es6\": \"Clean up existing ES6 package output\",\n \"clean_dist_global\": \"Clean up existing Global package output\",\n \"commit\": \"Run git commit wizard\",\n \"compile_dist_cjs\": \"Compile codebase into CJS module\",\n \"compile_module_es6\": \"Compile codebase into ES6\",\n \"cover\": \"Execute test coverage\",\n \"lint_perf\": \"Run lint against performance test suite\",\n \"lint_spec\": \"Run lint against test spec\",\n \"lint_src\": \"Run lint against source\",\n \"lint\": \"Run lint against everything\",\n \"perf\": \"Run macro performance benchmark\",\n \"perf_micro\": \"Run micro performance benchmark\",\n \"test_mocha\": \"Execute mocha test runner against existing test spec build\",\n \"test_browser\": \"Execute mocha test runner on browser against existing test spec build\",\n \"test\": \"Clean up existing test spec build, build test spec and execute mocha test runner\",\n \"tests2png\": \"Generate marble diagram image from test spec\",\n \"watch\": \"Watch codebase, trigger compile when source code changes\"\n },\n \"typings\": \"Rx.d.ts\",\n \"version\": \"5.4.3\"\n}\n" } + ].map(getRootedFileOrFolder)); + verifyAfterPartialOrCompleteNpmInstall(0); + + // remove /a/b/node_modules/.staging/rxjs-22375c61/package.json.2252192041 + host.deleteFile(last(filesAndFoldersToAdd).path); + filesAndFoldersToAdd.length--; + // and add few more folders/files + filesAndFoldersToAdd.push(...[ + { path: "/a/b/node_modules/symbol-observable" }, + { path: "/a/b/node_modules/@types" }, + { path: "/a/b/node_modules/@types/lodash" }, + { path: "/a/b/node_modules/lodash" }, + { path: "/a/b/node_modules/rxjs" }, + { path: "/a/b/node_modules/typescript" }, + { path: "/a/b/node_modules/.bin" } + ].map(getRootedFileOrFolder)); + // From the type root update + verifyAfterPartialOrCompleteNpmInstall(2); + + forEach(filesAndFoldersToAdd, f => { + f.path = f.path + .replace("/a/b/node_modules/.staging", "/a/b/node_modules") + .replace(/[\-\.][\d\w][\d\w][\d\w][\d\w][\d\w][\d\w][\d\w][\d\w]/g, ""); + }); + + host.deleteFolder(root + "/a/b/node_modules/.staging", /*recursive*/ true); + // npm installation complete, timeout after reload fs + npmInstallComplete = true; + verifyAfterPartialOrCompleteNpmInstall(2); + baselineTsserverLogs("cachingFileSystemInformation", `npm install in directory with tsconfig ${scenario}`, projectService); + + function verifyAfterPartialOrCompleteNpmInstall(timeoutQueueLengthWhenRunningTimeouts: number) { + filesAndFoldersToAdd.forEach(f => host.ensureFileOrFolder(f)); + if (npmInstallComplete || timeoutDuringPartialInstallation) { + if (timeoutQueueLengthWhenRunningTimeouts) { + // Expected project update + host.checkTimeoutQueueLengthAndRun(timeoutQueueLengthWhenRunningTimeouts + 1); // Scheduled invalidation of resolutions + host.runQueuedTimeoutCallbacks(); // Actual update + } + else { + host.checkTimeoutQueueLengthAndRun(timeoutQueueLengthWhenRunningTimeouts); + } } else { - host.checkTimeoutQueueLengthAndRun(timeoutQueueLengthWhenRunningTimeouts); + host.checkTimeoutQueueLength(3); } } - else { - host.checkTimeoutQueueLength(3); - } - verifyProject(); - } - - function verifyProject() { - checkNumberOfConfiguredProjects(projectService, 1); - - const project = projectService.configuredProjects.get(tsconfigJson.path)!; - const projectFilePaths = map(projectFiles, f => f.path); - checkProjectActualFiles(project, projectFilePaths); - - const filesWatched = filter(projectFilePaths, p => p !== app.path && p.indexOf("/a/b/node_modules") === -1); - checkWatchedFiles(host, filesWatched); - checkWatchedDirectories(host, typeRootDirectories.concat(recursiveWatchedDirectories), /*recursive*/ true); - checkWatchedDirectories(host, [], /*recursive*/ false); - } + }); } - it("timeouts occur inbetween installation", () => { - verifyNpmInstall(/*timeoutDuringPartialInstallation*/ true); - }); - - it("timeout occurs after installation", () => { - verifyNpmInstall(/*timeoutDuringPartialInstallation*/ false); - }); + verifyNpmInstall("timeouts occur inbetween installation", /*timeoutDuringPartialInstallation*/ true); + verifyNpmInstall("timeout occurs after installation", /*timeoutDuringPartialInstallation*/ false); }); it("when node_modules dont receive event for the @types file addition", () => { diff --git a/src/testRunner/unittests/tsserver/configFileSearch.ts b/src/testRunner/unittests/tsserver/configFileSearch.ts index 152184e9ae5d3..39ba56ced2127 100644 --- a/src/testRunner/unittests/tsserver/configFileSearch.ts +++ b/src/testRunner/unittests/tsserver/configFileSearch.ts @@ -38,22 +38,14 @@ namespace ts.projectSystem { content: "{}" }; const host = createServerHost([f1, libFile, configFile, configFile2]); - const service = createProjectService(host); + const service = createProjectService(host, { logger: createLoggerWithInMemoryLogs() }); service.openClientFile(f1.path, /*fileContent*/ undefined, /*scriptKind*/ undefined, projectDir); - checkNumberOfProjects(service, { configuredProjects: 1 }); - assert.isDefined(service.configuredProjects.get(configFile.path)); - checkWatchedFiles(host, [libFile.path, configFile.path]); - checkWatchedDirectories(host, [], /*recursive*/ false); - const typeRootLocations = getTypeRootsFromLocation(configFileLocation); - checkWatchedDirectories(host, typeRootLocations.concat(configFileLocation), /*recursive*/ true); // Delete config file - should create inferred project and not configured project host.deleteFile(configFile.path); host.runQueuedTimeoutCallbacks(); checkNumberOfProjects(service, { inferredProjects: 1 }); - checkWatchedFiles(host, [libFile.path, configFile.path, `${configFileLocation}/jsconfig.json`, `${projectDir}/tsconfig.json`, `${projectDir}/jsconfig.json`]); - checkWatchedDirectories(host, [], /*recursive*/ false); - checkWatchedDirectories(host, typeRootLocations, /*recursive*/ true); + baselineTsserverLogs("configFileSearch", "should use projectRootPath when searching for inferred project again", service); }); it("should use projectRootPath when searching for inferred project again 2", () => { @@ -72,22 +64,17 @@ namespace ts.projectSystem { content: "{}" }; const host = createServerHost([f1, libFile, configFile, configFile2]); - const service = createProjectService(host, { useSingleInferredProject: true, useInferredProjectPerProjectRoot: true }); + const service = createProjectService(host, { + useSingleInferredProject: true, + useInferredProjectPerProjectRoot: true, + logger: createLoggerWithInMemoryLogs(), + }); service.openClientFile(f1.path, /*fileContent*/ undefined, /*scriptKind*/ undefined, projectDir); - checkNumberOfProjects(service, { configuredProjects: 1 }); - assert.isDefined(service.configuredProjects.get(configFile.path)); - checkWatchedFiles(host, [libFile.path, configFile.path]); - checkWatchedDirectories(host, [], /*recursive*/ false); - checkWatchedDirectories(host, getTypeRootsFromLocation(configFileLocation).concat(configFileLocation), /*recursive*/ true); // Delete config file - should create inferred project with project root path set host.deleteFile(configFile.path); host.runQueuedTimeoutCallbacks(); - checkNumberOfProjects(service, { inferredProjects: 1 }); - assert.equal(service.inferredProjects[0].projectRootPath, projectDir); - checkWatchedFiles(host, [libFile.path, configFile.path, `${configFileLocation}/jsconfig.json`, `${projectDir}/tsconfig.json`, `${projectDir}/jsconfig.json`]); - checkWatchedDirectories(host, [], /*recursive*/ false); - checkWatchedDirectories(host, getTypeRootsFromLocation(projectDir), /*recursive*/ true); + baselineTsserverLogs("configFileSearch", "should use projectRootPath when searching for inferred project again 2", service); }); describe("when the opened file is not from project root", () => { @@ -100,89 +87,50 @@ namespace ts.projectSystem { path: `${projectRoot}/tsconfig.json`, content: "{}" }; - const dirOfFile = getDirectoryPath(file.path); - function openClientFile(files: File[]) { const host = createServerHost(files); - const projectService = createProjectService(host); - + const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() }); projectService.openClientFile(file.path, /*fileContent*/ undefined, /*scriptKind*/ undefined, "/a/b/projects/proj"); return { host, projectService }; } - function verifyConfiguredProject(host: TestServerHost, projectService: TestProjectService, orphanInferredProject?: boolean) { - projectService.checkNumberOfProjects({ configuredProjects: 1, inferredProjects: orphanInferredProject ? 1 : 0 }); - const project = Debug.checkDefined(projectService.configuredProjects.get(tsconfig.path)); - - if (orphanInferredProject) { - const inferredProject = projectService.inferredProjects[0]; - assert.isTrue(inferredProject.isOrphan()); - } - - checkProjectActualFiles(project, [file.path, libFile.path, tsconfig.path]); - checkWatchedFiles(host, [libFile.path, tsconfig.path]); - checkWatchedDirectories(host, emptyArray, /*recursive*/ false); - checkWatchedDirectories(host, (orphanInferredProject ? [projectRoot, `${dirOfFile}/node_modules/@types`] : [projectRoot]).concat(getTypeRootsFromLocation(projectRoot)), /*recursive*/ true); - } - - function verifyInferredProject(host: TestServerHost, projectService: TestProjectService) { - projectService.checkNumberOfProjects({ inferredProjects: 1 }); - const project = projectService.inferredProjects[0]; - assert.isDefined(project); - - const filesToWatch = [libFile.path, ...getConfigFilesToWatch(dirOfFile)]; - - checkProjectActualFiles(project, [file.path, libFile.path]); - checkWatchedFiles(host, filesToWatch); - checkWatchedDirectories(host, emptyArray, /*recursive*/ false); - checkWatchedDirectories(host, getTypeRootsFromLocation(dirOfFile), /*recursive*/ true); - } - it("tsconfig for the file exists", () => { const { host, projectService } = openClientFile([file, libFile, tsconfig]); - verifyConfiguredProject(host, projectService); host.deleteFile(tsconfig.path); host.runQueuedTimeoutCallbacks(); - verifyInferredProject(host, projectService); host.writeFile(tsconfig.path, tsconfig.content); host.runQueuedTimeoutCallbacks(); - verifyConfiguredProject(host, projectService, /*orphanInferredProject*/ true); + + baselineTsserverLogs("configFileSearch", "tsconfig for the file exists", projectService); }); it("tsconfig for the file does not exist", () => { const { host, projectService } = openClientFile([file, libFile]); - verifyInferredProject(host, projectService); host.writeFile(tsconfig.path, tsconfig.content); host.runQueuedTimeoutCallbacks(); - verifyConfiguredProject(host, projectService, /*orphanInferredProject*/ true); host.deleteFile(tsconfig.path); host.runQueuedTimeoutCallbacks(); - verifyInferredProject(host, projectService); + + baselineTsserverLogs("configFileSearch", "tsconfig for the file does not exist", projectService); }); }); describe("should not search and watch config files from directories that cannot be watched", () => { - const root = "/root/teams/VSCode68/Shared Documents/General/jt-ts-test-workspace"; - function verifyConfigFileWatch(projectRootPath: string | undefined) { - const path = `${root}/x.js`; - const host = createServerHost([libFile, { path, content: "const x = 10" }], { useCaseSensitiveFileNames: true }); - const service = createProjectService(host); - service.openClientFile(path, /*fileContent*/ undefined, /*scriptKind*/ undefined, projectRootPath); - checkNumberOfProjects(service, { inferredProjects: 1 }); - checkProjectActualFiles(service.inferredProjects[0], [path, libFile.path]); - checkWatchedFilesDetailed(host, [libFile.path, ...getConfigFilesToWatch(root)], 1); + function verifyConfigFileWatch(scenario: string, projectRootPath: string | undefined) { + it(scenario, () => { + const path = `/root/teams/VSCode68/Shared Documents/General/jt-ts-test-workspace/x.js`; + const host = createServerHost([libFile, { path, content: "const x = 10" }], { useCaseSensitiveFileNames: true }); + const service = createProjectService(host, { logger: createLoggerWithInMemoryLogs() }); + service.openClientFile(path, /*fileContent*/ undefined, /*scriptKind*/ undefined, projectRootPath); + baselineTsserverLogs("configFileSearch", scenario, service); + }); } - - it("when projectRootPath is not present", () => { - verifyConfigFileWatch(/*projectRootPath*/ undefined); - }); - it("when projectRootPath is present but file is not from project root", () => { - verifyConfigFileWatch("/a/b"); - }); + verifyConfigFileWatch("when projectRootPath is not present", /*projectRootPath*/ undefined); + verifyConfigFileWatch("when projectRootPath is present but file is not from project root", "/a/b"); }); }); } diff --git a/src/testRunner/unittests/tsserver/configuredProjects.ts b/src/testRunner/unittests/tsserver/configuredProjects.ts index cd5bd4d81f306..d8246838c0756 100644 --- a/src/testRunner/unittests/tsserver/configuredProjects.ts +++ b/src/testRunner/unittests/tsserver/configuredProjects.ts @@ -25,21 +25,13 @@ namespace ts.projectSystem { }; const host = createServerHost([configFile, libFile, file1, file2, file3]); - const projectService = createProjectService(host); + const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() }); const { configFileName, configFileErrors } = projectService.openClientFile(file1.path); assert(configFileName, "should find config file"); assert.isTrue(!configFileErrors || configFileErrors.length === 0, `expect no errors in config file, got ${JSON.stringify(configFileErrors)}`); - checkNumberOfInferredProjects(projectService, 0); - checkNumberOfConfiguredProjects(projectService, 1); - const project = configuredProjectAt(projectService, 0); - checkProjectActualFiles(project, [file1.path, libFile.path, file2.path, configFile.path]); - checkProjectRootFiles(project, [file1.path, file2.path]); - // watching all files except one that was open - checkWatchedFiles(host, [configFile.path, file2.path, libFile.path]); - const configFileDirectory = getDirectoryPath(configFile.path); - checkWatchedDirectories(host, [configFileDirectory, combinePaths(configFileDirectory, nodeModulesAtTypes)], /*recursive*/ true); + baselineTsserverLogs("configuredProjects", "create configured project without file list", projectService); }); it("create configured project with the file list", () => { @@ -65,20 +57,13 @@ namespace ts.projectSystem { }; const host = createServerHost([configFile, libFile, file1, file2, file3]); - const projectService = createProjectService(host); + const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() }); const { configFileName, configFileErrors } = projectService.openClientFile(file1.path); assert(configFileName, "should find config file"); assert.isTrue(!configFileErrors || configFileErrors.length === 0, `expect no errors in config file, got ${JSON.stringify(configFileErrors)}`); - checkNumberOfInferredProjects(projectService, 0); - checkNumberOfConfiguredProjects(projectService, 1); - const project = configuredProjectAt(projectService, 0); - checkProjectActualFiles(project, [file1.path, libFile.path, file2.path, configFile.path]); - checkProjectRootFiles(project, [file1.path, file2.path]); - // watching all files except one that was open - checkWatchedFiles(host, [configFile.path, file2.path, libFile.path]); - checkWatchedDirectories(host, [getDirectoryPath(configFile.path)], /*recursive*/ false); + baselineTsserverLogs("configuredProjects", "create configured project with the file list", projectService); }); it("add and then remove a config file in a folder with loose files", () => { @@ -99,41 +84,19 @@ namespace ts.projectSystem { const host = createServerHost([libFile, commonFile1, commonFile2]); - const projectService = createProjectService(host); + const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() }); projectService.openClientFile(commonFile1.path); projectService.openClientFile(commonFile2.path); - projectService.checkNumberOfProjects({ inferredProjects: 2 }); - checkProjectActualFiles(projectService.inferredProjects[0], [commonFile1.path, libFile.path]); - checkProjectActualFiles(projectService.inferredProjects[1], [commonFile2.path, libFile.path]); - - const watchedFiles = getConfigFilesToWatch(tscWatch.projectRoot).concat(libFile.path); - checkWatchedFiles(host, watchedFiles); - // Add a tsconfig file host.writeFile(configFile.path, configFile.content); host.checkTimeoutQueueLengthAndRun(2); // load configured project from disk + ensureProjectsForOpenFiles - projectService.checkNumberOfProjects({ inferredProjects: 2, configuredProjects: 1 }); - assert.isTrue(projectService.inferredProjects[0].isOrphan()); - checkProjectActualFiles(projectService.inferredProjects[1], [commonFile2.path, libFile.path]); - checkProjectActualFiles(projectService.configuredProjects.get(configFile.path)!, [libFile.path, commonFile1.path, configFile.path]); - - checkWatchedFiles(host, watchedFiles); - // remove the tsconfig file host.deleteFile(configFile.path); - - projectService.checkNumberOfProjects({ inferredProjects: 2 }); - assert.isTrue(projectService.inferredProjects[0].isOrphan()); - checkProjectActualFiles(projectService.inferredProjects[1], [commonFile2.path, libFile.path]); - host.checkTimeoutQueueLengthAndRun(1); // Refresh inferred projects - projectService.checkNumberOfProjects({ inferredProjects: 2 }); - checkProjectActualFiles(projectService.inferredProjects[0], [commonFile1.path, libFile.path]); - checkProjectActualFiles(projectService.inferredProjects[1], [commonFile2.path, libFile.path]); - checkWatchedFiles(host, watchedFiles); + baselineTsserverLogs("configuredProjects", "add and then remove a config file in a folder with loose files", projectService); }); it("add new files to a configured project without file list", () => { @@ -142,20 +105,13 @@ namespace ts.projectSystem { content: `{}` }; const host = createServerHost([commonFile1, libFile, configFile]); - const projectService = createProjectService(host); + const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() }); projectService.openClientFile(commonFile1.path); - const configFileDir = getDirectoryPath(configFile.path); - checkWatchedDirectories(host, [configFileDir, combinePaths(configFileDir, nodeModulesAtTypes)], /*recursive*/ true); - checkNumberOfConfiguredProjects(projectService, 1); - - const project = configuredProjectAt(projectService, 0); - checkProjectRootFiles(project, [commonFile1.path]); // add a new ts file host.writeFile(commonFile2.path, commonFile2.content); host.checkTimeoutQueueLengthAndRun(2); - // project service waits for 250ms to update the project structure, therefore the assertion needs to wait longer. - checkProjectRootFiles(project, [commonFile1.path, commonFile2.path]); + baselineTsserverLogs("configuredProjects", "add new files to a configured project without file list", projectService); }); it("should ignore non-existing files specified in the config file", () => { @@ -581,56 +537,37 @@ namespace ts.projectSystem { const files = [file1, file2, file3, file4]; const host = createServerHost(files.concat(configFile)); - const projectService = createProjectService(host); + const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() }); projectService.openClientFile(file1.path); projectService.openClientFile(file2.path); projectService.openClientFile(file3.path); projectService.openClientFile(file4.path); - const infos = files.map(file => projectService.getScriptInfoForPath(file.path as Path)!); - checkOpenFiles(projectService, files); - checkNumberOfProjects(projectService, { configuredProjects: 1, inferredProjects: 2 }); const configProject1 = projectService.configuredProjects.get(configFile.path)!; assert.isTrue(configProject1.hasOpenRef()); // file1 and file3 - checkProjectActualFiles(configProject1, [file1.path, file3.path, configFile.path]); - const inferredProject1 = projectService.inferredProjects[0]; - checkProjectActualFiles(inferredProject1, [file2.path]); - const inferredProject2 = projectService.inferredProjects[1]; - checkProjectActualFiles(inferredProject2, [file4.path]); host.writeFile(configFile.path, "{}"); host.runQueuedTimeoutCallbacks(); - verifyScriptInfos(); - checkOpenFiles(projectService, files); - verifyConfiguredProjectStateAfterUpdate(/*hasOpenRef*/ true, 2); // file1, file2, file3 + assert.isTrue(configProject1.hasOpenRef()); // file1, file2, file3 assert.isTrue(projectService.inferredProjects[0].isOrphan()); - const inferredProject3 = projectService.inferredProjects[1]; - checkProjectActualFiles(inferredProject3, [file4.path]); - assert.strictEqual(inferredProject3, inferredProject2); projectService.closeClientFile(file1.path); projectService.closeClientFile(file2.path); projectService.closeClientFile(file4.path); - verifyScriptInfos(); - checkOpenFiles(projectService, [file3]); - verifyConfiguredProjectStateAfterUpdate(/*hasOpenRef*/ true, 2); // file3 + assert.isTrue(configProject1.hasOpenRef()); // file3 assert.isTrue(projectService.inferredProjects[0].isOrphan()); assert.isTrue(projectService.inferredProjects[1].isOrphan()); projectService.openClientFile(file4.path); - verifyScriptInfos(); - checkOpenFiles(projectService, [file3, file4]); - verifyConfiguredProjectStateAfterUpdate(/*hasOpenRef*/ true, 1); // file3 + assert.isTrue(configProject1.hasOpenRef()); // file3 const inferredProject4 = projectService.inferredProjects[0]; checkProjectActualFiles(inferredProject4, [file4.path]); projectService.closeClientFile(file3.path); - verifyScriptInfos(); - checkOpenFiles(projectService, [file4]); - verifyConfiguredProjectStateAfterUpdate(/*hasOpenRef*/ false, 1); // No open files + assert.isFalse(configProject1.hasOpenRef()); // No open files const inferredProject5 = projectService.inferredProjects[0]; checkProjectActualFiles(inferredProject4, [file4.path]); assert.strictEqual(inferredProject5, inferredProject4); @@ -641,31 +578,8 @@ namespace ts.projectSystem { }; host.writeFile(file5.path, file5.content); projectService.openClientFile(file5.path); - verifyScriptInfosAreUndefined([file1, file2, file3]); - assert.strictEqual(projectService.getScriptInfoForPath(file4.path as Path), find(infos, info => info.path === file4.path)); - assert.isDefined(projectService.getScriptInfoForPath(file5.path as Path)); - checkOpenFiles(projectService, [file4, file5]); - checkNumberOfProjects(projectService, { inferredProjects: 2 }); - checkProjectActualFiles(projectService.inferredProjects[0], [file4.path]); - checkProjectActualFiles(projectService.inferredProjects[1], [file5.path]); - function verifyScriptInfos() { - infos.forEach(info => assert.strictEqual(projectService.getScriptInfoForPath(info.path), info)); - } - - function verifyScriptInfosAreUndefined(files: File[]) { - for (const file of files) { - assert.isUndefined(projectService.getScriptInfoForPath(file.path as Path)); - } - } - - function verifyConfiguredProjectStateAfterUpdate(hasOpenRef: boolean, inferredProjects: number) { - checkNumberOfProjects(projectService, { configuredProjects: 1, inferredProjects }); - const configProject2 = projectService.configuredProjects.get(configFile.path)!; - assert.strictEqual(configProject2, configProject1); - checkProjectActualFiles(configProject2, [file1.path, file2.path, file3.path, configFile.path]); - assert.equal(configProject2.hasOpenRef(), hasOpenRef); - } + baselineTsserverLogs("configuredProjects", "Open ref of configured project when open file gets added to the project as part of configured file update", projectService); }); it("Open ref of configured project when open file gets added to the project as part of configured file update buts its open file references are all closed when the update happens", () => { @@ -1103,35 +1017,22 @@ foo();` }; const host = createServerHost([alphaExtendedConfig, aConfig, aFile, bravoExtendedConfig, bConfig, bFile, ...(additionalFiles || emptyArray)]); - const projectService = createProjectService(host); + const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() }); return { host, projectService, aFile, bFile, aConfig, bConfig, alphaExtendedConfig, bravoExtendedConfig }; } it("should watch the extended configs of multiple projects", () => { - const { host, projectService, aFile, bFile, aConfig, bConfig, alphaExtendedConfig, bravoExtendedConfig } = getService(); + const { host, projectService, aFile, bFile, bConfig, alphaExtendedConfig, bravoExtendedConfig } = getService(); projectService.openClientFile(aFile.path); projectService.openClientFile(bFile.path); - checkNumberOfConfiguredProjects(projectService, 2); - const aProject = projectService.configuredProjects.get(aConfig.path)!; - const bProject = projectService.configuredProjects.get(bConfig.path)!; - checkProjectActualFiles(aProject, [aFile.path, aConfig.path, alphaExtendedConfig.path]); - checkProjectActualFiles(bProject, [bFile.path, bConfig.path, bravoExtendedConfig.path, alphaExtendedConfig.path]); - assert.isUndefined(aProject.getCompilerOptions().strict); - assert.isUndefined(bProject.getCompilerOptions().strict); - checkWatchedFiles(host, [aConfig.path, bConfig.path, libFile.path, bravoExtendedConfig.path, alphaExtendedConfig.path]); host.writeFile(alphaExtendedConfig.path, JSON.stringify({ compilerOptions: { strict: true } })); - assert.isTrue(projectService.hasPendingProjectUpdate(aProject)); - assert.isTrue(projectService.hasPendingProjectUpdate(bProject)); host.checkTimeoutQueueLengthAndRun(3); - assert.isTrue(aProject.getCompilerOptions().strict); - assert.isTrue(bProject.getCompilerOptions().strict); - checkWatchedFiles(host, [aConfig.path, bConfig.path, libFile.path, bravoExtendedConfig.path, alphaExtendedConfig.path]); host.writeFile(bravoExtendedConfig.path, JSON.stringify({ extends: "./alpha.tsconfig.json", @@ -1139,30 +1040,16 @@ foo();` strict: false } })); - assert.isFalse(projectService.hasPendingProjectUpdate(aProject)); - assert.isTrue(projectService.hasPendingProjectUpdate(bProject)); host.checkTimeoutQueueLengthAndRun(2); - assert.isTrue(aProject.getCompilerOptions().strict); - assert.isFalse(bProject.getCompilerOptions().strict); - checkWatchedFiles(host, [aConfig.path, bConfig.path, libFile.path, bravoExtendedConfig.path, alphaExtendedConfig.path]); host.writeFile(bConfig.path, JSON.stringify({ extends: "../extended/alpha.tsconfig.json", })); - assert.isFalse(projectService.hasPendingProjectUpdate(aProject)); - assert.isTrue(projectService.hasPendingProjectUpdate(bProject)); host.checkTimeoutQueueLengthAndRun(2); - assert.isTrue(aProject.getCompilerOptions().strict); - assert.isTrue(bProject.getCompilerOptions().strict); - checkWatchedFiles(host, [aConfig.path, bConfig.path, libFile.path, alphaExtendedConfig.path]); host.writeFile(alphaExtendedConfig.path, "{}"); - assert.isTrue(projectService.hasPendingProjectUpdate(aProject)); - assert.isTrue(projectService.hasPendingProjectUpdate(bProject)); host.checkTimeoutQueueLengthAndRun(3); - assert.isUndefined(aProject.getCompilerOptions().strict); - assert.isUndefined(bProject.getCompilerOptions().strict); - checkWatchedFiles(host, [aConfig.path, bConfig.path, libFile.path, alphaExtendedConfig.path]); + baselineTsserverLogs("configuredProjects", "should watch the extended configs of multiple projects", projectService); }); it("should stop watching the extended configs of closed projects", () => { @@ -1174,27 +1061,21 @@ foo();` path: `${tscWatch.projectRoot}/dummy/tsconfig.json`, content: "{}" }; - const { host, projectService, aFile, bFile, aConfig, bConfig, alphaExtendedConfig, bravoExtendedConfig } = getService([dummy, dummyConfig]); + const { projectService, aFile, bFile } = getService([dummy, dummyConfig]); projectService.openClientFile(aFile.path); projectService.openClientFile(bFile.path); projectService.openClientFile(dummy.path); - checkNumberOfConfiguredProjects(projectService, 3); - checkWatchedFiles(host, [aConfig.path, bConfig.path, libFile.path, bravoExtendedConfig.path, alphaExtendedConfig.path, dummyConfig.path]); projectService.closeClientFile(bFile.path); projectService.closeClientFile(dummy.path); projectService.openClientFile(dummy.path); - checkNumberOfConfiguredProjects(projectService, 2); - checkWatchedFiles(host, [aConfig.path, libFile.path, alphaExtendedConfig.path, dummyConfig.path]); projectService.closeClientFile(aFile.path); projectService.closeClientFile(dummy.path); projectService.openClientFile(dummy.path); - - checkNumberOfConfiguredProjects(projectService, 1); - checkWatchedFiles(host, [libFile.path, dummyConfig.path]); + baselineTsserverLogs("configuredProjects", "should stop watching the extended configs of closed projects", projectService); }); }); }); @@ -1297,35 +1178,16 @@ foo();` }; const files = [file1, file2a, configFile, libFile]; const host = createServerHost(files); - const projectService = createProjectService(host); + const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() }); projectService.openClientFile(file1.path); - checkNumberOfProjects(projectService, { configuredProjects: 1 }); - const project = projectService.configuredProjects.get(configFile.path)!; - assert.isDefined(project); - checkProjectActualFiles(project, map(files, file => file.path)); - checkWatchedFiles(host, mapDefined(files, file => file === file1 ? undefined : file.path)); - checkWatchedDirectoriesDetailed(host, ["/a/b"], 1, /*recursive*/ false); - checkWatchedDirectoriesDetailed(host, ["/a/b/node_modules/@types"], 1, /*recursive*/ true); - files.push(file2); host.writeFile(file2.path, file2.content); host.runQueuedTimeoutCallbacks(); // Scheduled invalidation of resolutions host.runQueuedTimeoutCallbacks(); // Actual update - checkNumberOfProjects(projectService, { configuredProjects: 1 }); - assert.strictEqual(projectService.configuredProjects.get(configFile.path), project); - checkProjectActualFiles(project, mapDefined(files, file => file === file2a ? undefined : file.path)); - checkWatchedFiles(host, mapDefined(files, file => file === file1 ? undefined : file.path)); - checkWatchedDirectories(host, emptyArray, /*recursive*/ false); - checkWatchedDirectoriesDetailed(host, ["/a/b/node_modules/@types"], 1, /*recursive*/ true); // On next file open the files file2a should be closed and not watched any more projectService.openClientFile(file2.path); - checkNumberOfProjects(projectService, { configuredProjects: 1 }); - assert.strictEqual(projectService.configuredProjects.get(configFile.path), project); - checkProjectActualFiles(project, mapDefined(files, file => file === file2a ? undefined : file.path)); - checkWatchedFiles(host, [libFile.path, configFile.path]); - checkWatchedDirectories(host, emptyArray, /*recursive*/ false); - checkWatchedDirectoriesDetailed(host, ["/a/b/node_modules/@types"], 1, /*recursive*/ true); + baselineTsserverLogs("configuredProjects", "changed module resolution reflected when specifying files list", projectService); }); it("Failed lookup locations uses parent most node_modules directory", () => { @@ -1355,17 +1217,9 @@ foo();` nonLibFiles.forEach(f => f.path = root + f.path); const files = nonLibFiles.concat(libFile); const host = createServerHost(files); - const projectService = createProjectService(host); + const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() }); projectService.openClientFile(file1.path); - checkNumberOfProjects(projectService, { configuredProjects: 1 }); - const project = projectService.configuredProjects.get(configFile.path)!; - assert.isDefined(project); - checkProjectActualFiles(project, [file1.path, libFile.path, module1.path, module2.path, configFile.path]); - checkWatchedFiles(host, [libFile.path, configFile.path]); - checkWatchedDirectories(host, [], /*recursive*/ false); - const watchedRecursiveDirectories = getTypeRootsFromLocation(root + "/a/b/src"); - watchedRecursiveDirectories.push(`${root}/a/b/src/node_modules`, `${root}/a/b/node_modules`); - checkWatchedDirectories(host, watchedRecursiveDirectories, /*recursive*/ true); + baselineTsserverLogs("configuredProjects", "failed lookup locations uses parent most node_modules directory", projectService); }); }); diff --git a/src/testRunner/unittests/tsserver/events/projectLoading.ts b/src/testRunner/unittests/tsserver/events/projectLoading.ts index 150f7c1c724e3..53a233c8d2ac7 100644 --- a/src/testRunner/unittests/tsserver/events/projectLoading.ts +++ b/src/testRunner/unittests/tsserver/events/projectLoading.ts @@ -198,7 +198,7 @@ namespace ts.projectSystem { describe("when using event handler", () => { verifyProjectLoadingStartAndFinish(host => { - const { session, events } = createSessionWithEventTracking(host, server.ProjectLoadingStartEvent, server.ProjectLoadingFinishEvent); + const { session, events } = createSessionWithEventTracking(host, [server.ProjectLoadingStartEvent, server.ProjectLoadingFinishEvent]); return { session, getNumberOfEvents: () => events.length, diff --git a/src/testRunner/unittests/tsserver/events/projectUpdatedInBackground.ts b/src/testRunner/unittests/tsserver/events/projectUpdatedInBackground.ts index 34e8f7d8e0ad8..248fd25e95ca3 100644 --- a/src/testRunner/unittests/tsserver/events/projectUpdatedInBackground.ts +++ b/src/testRunner/unittests/tsserver/events/projectUpdatedInBackground.ts @@ -28,7 +28,7 @@ namespace ts.projectSystem { verifyInitialOpen(file: File): void; } - function verifyProjectsUpdatedInBackgroundEvent(createSession: (host: TestServerHost) => ProjectsUpdatedInBackgroundEventVerifier) { + function verifyProjectsUpdatedInBackgroundEvent(scenario: string, createSession: (host: TestServerHost, logger?: Logger) => ProjectsUpdatedInBackgroundEventVerifier) { it("when adding new file", () => { const commonFile1: File = { path: "/a/b/file1.ts", @@ -415,96 +415,70 @@ namespace ts.projectSystem { }); describe("resolution when resolution cache size", () => { - function verifyWithMaxCacheLimit(useSlashRootAsSomeNotRootFolderInUserDirectory: boolean) { - const rootFolder = useSlashRootAsSomeNotRootFolderInUserDirectory ? "/user/username/rootfolder/otherfolder/" : "/"; - const file1: File = { - path: rootFolder + "a/b/project/file1.ts", - content: 'import a from "file2"' - }; - const file2: File = { - path: rootFolder + "a/b/node_modules/file2.d.ts", - content: "export class a { }" - }; - const file3: File = { - path: rootFolder + "a/b/project/file3.ts", - content: "export class c { }" - }; - const configFile: File = { - path: rootFolder + "a/b/project/tsconfig.json", - content: JSON.stringify({ compilerOptions: { typeRoots: [] } }) - }; - - const projectFiles = [file1, file3, libFile, configFile]; - const openFiles = [file1.path]; - const watchedRecursiveDirectories = useSlashRootAsSomeNotRootFolderInUserDirectory ? - // Folders of node_modules lookup not in changedRoot - ["a/b/project", "a/b/project/node_modules", "a/b/node_modules", "a/node_modules", "node_modules"].map(v => rootFolder + v) : - // Folder of tsconfig - ["/a/b/project", "/a/b/project/node_modules"]; - const host = createServerHost(projectFiles); - const { session, verifyInitialOpen, verifyProjectsUpdatedInBackgroundEventHandler } = createSession(host); - const projectService = session.getProjectService(); - verifyInitialOpen(file1); - checkNumberOfProjects(projectService, { configuredProjects: 1 }); - const project = projectService.configuredProjects.get(configFile.path)!; - verifyProject(); - - file3.content += "export class d {}"; - host.writeFile(file3.path, file3.content); - host.checkTimeoutQueueLengthAndRun(2); - - // Since this is first event - verifyProject(); - verifyProjectsUpdatedInBackgroundEventHandler([{ - eventName: server.ProjectsUpdatedInBackgroundEvent, - data: { - openFiles - } - }]); + function verifyWithMaxCacheLimit(subScenario: string, useSlashRootAsSomeNotRootFolderInUserDirectory: boolean) { + it(subScenario, () => { + const rootFolder = useSlashRootAsSomeNotRootFolderInUserDirectory ? "/user/username/rootfolder/otherfolder/" : "/"; + const file1: File = { + path: rootFolder + "a/b/project/file1.ts", + content: 'import a from "file2"' + }; + const file2: File = { + path: rootFolder + "a/b/node_modules/file2.d.ts", + content: "export class a { }" + }; + const file3: File = { + path: rootFolder + "a/b/project/file3.ts", + content: "export class c { }" + }; + const configFile: File = { + path: rootFolder + "a/b/project/tsconfig.json", + content: JSON.stringify({ compilerOptions: { typeRoots: [] } }) + }; - projectFiles.push(file2); - host.writeFile(file2.path, file2.content); - host.runQueuedTimeoutCallbacks(); // For invalidation - host.runQueuedTimeoutCallbacks(); // For actual update - if (useSlashRootAsSomeNotRootFolderInUserDirectory) { - watchedRecursiveDirectories.length = 3; - } - else { - // file2 addition wont be detected - projectFiles.pop(); - assert.isTrue(host.fileExists(file2.path)); - } - verifyProject(); + const openFiles = [file1.path]; + const host = createServerHost([file1, file3, libFile, configFile]); + const { session, verifyInitialOpen, verifyProjectsUpdatedInBackgroundEventHandler } = createSession(host, createLoggerWithInMemoryLogs()); + verifyInitialOpen(file1); - verifyProjectsUpdatedInBackgroundEventHandler(useSlashRootAsSomeNotRootFolderInUserDirectory ? [{ - eventName: server.ProjectsUpdatedInBackgroundEvent, - data: { - openFiles - } - }] : []); + file3.content += "export class d {}"; + host.writeFile(file3.path, file3.content); + host.checkTimeoutQueueLengthAndRun(2); - function verifyProject() { - checkProjectActualFiles(project, map(projectFiles, file => file.path)); - checkWatchedDirectories(host, [], /*recursive*/ false); - checkWatchedDirectories(host, watchedRecursiveDirectories, /*recursive*/ true); - } - } + // Since this is first event + verifyProjectsUpdatedInBackgroundEventHandler([{ + eventName: server.ProjectsUpdatedInBackgroundEvent, + data: { + openFiles + } + }]); - it("project is not at root level", () => { - verifyWithMaxCacheLimit(/*useSlashRootAsSomeNotRootFolderInUserDirectory*/ true); - }); + host.writeFile(file2.path, file2.content); + host.runQueuedTimeoutCallbacks(); // For invalidation + host.runQueuedTimeoutCallbacks(); // For actual update - it("project is at root level", () => { - verifyWithMaxCacheLimit(/*useSlashRootAsSomeNotRootFolderInUserDirectory*/ false); - }); + verifyProjectsUpdatedInBackgroundEventHandler(useSlashRootAsSomeNotRootFolderInUserDirectory ? [{ + eventName: server.ProjectsUpdatedInBackgroundEvent, + data: { + openFiles + } + }] : []); + baselineTsserverLogs("projectUpdatedInBackground", `${scenario} and ${subScenario}`, session); + }); + } + verifyWithMaxCacheLimit("project is not at root level", /*useSlashRootAsSomeNotRootFolderInUserDirectory*/ true); + verifyWithMaxCacheLimit("project is at root level", /*useSlashRootAsSomeNotRootFolderInUserDirectory*/ false); }); } describe("when event handler is set in the session", () => { - verifyProjectsUpdatedInBackgroundEvent(createSessionWithProjectChangedEventHandler); - - function createSessionWithProjectChangedEventHandler(host: TestServerHost): ProjectsUpdatedInBackgroundEventVerifier { - const { session, events: projectChangedEvents } = createSessionWithEventTracking(host, server.ProjectsUpdatedInBackgroundEvent); + verifyProjectsUpdatedInBackgroundEvent("when event handler is set in the session", createSessionWithProjectChangedEventHandler); + + function createSessionWithProjectChangedEventHandler(host: TestServerHost, logger: Logger | undefined): ProjectsUpdatedInBackgroundEventVerifier { + const { session, events: projectChangedEvents } = createSessionWithEventTracking( + host, + server.ProjectsUpdatedInBackgroundEvent, + logger && { logger } + ); return { session, verifyProjectsUpdatedInBackgroundEventHandler, @@ -535,16 +509,20 @@ namespace ts.projectSystem { describe("when event handler is not set but session is created with canUseEvents = true", () => { describe("without noGetErrOnBackgroundUpdate, diagnostics for open files are queued", () => { - verifyProjectsUpdatedInBackgroundEvent(createSessionThatUsesEvents); + verifyProjectsUpdatedInBackgroundEvent("without noGetErrOnBackgroundUpdate", createSessionThatUsesEvents); }); describe("with noGetErrOnBackgroundUpdate, diagnostics for open file are not queued", () => { - verifyProjectsUpdatedInBackgroundEvent(host => createSessionThatUsesEvents(host, /*noGetErrOnBackgroundUpdate*/ true)); + verifyProjectsUpdatedInBackgroundEvent("with noGetErrOnBackgroundUpdate", (host, logger) => createSessionThatUsesEvents(host, logger, /*noGetErrOnBackgroundUpdate*/ true)); }); - function createSessionThatUsesEvents(host: TestServerHost, noGetErrOnBackgroundUpdate?: boolean): ProjectsUpdatedInBackgroundEventVerifier { - const { session, getEvents, clearEvents } = createSessionWithDefaultEventHandler(host, server.ProjectsUpdatedInBackgroundEvent, { noGetErrOnBackgroundUpdate }); + function createSessionThatUsesEvents(host: TestServerHost, logger: Logger | undefined, noGetErrOnBackgroundUpdate?: boolean): ProjectsUpdatedInBackgroundEventVerifier { + const { session, getEvents, clearEvents } = createSessionWithDefaultEventHandler( + host, + server.ProjectsUpdatedInBackgroundEvent, + { noGetErrOnBackgroundUpdate, logger: logger || createHasErrorMessageLogger() } + ); return { session, diff --git a/src/testRunner/unittests/tsserver/helpers.ts b/src/testRunner/unittests/tsserver/helpers.ts index eb7c74653436a..0cf7b4c41d801 100644 --- a/src/testRunner/unittests/tsserver/helpers.ts +++ b/src/testRunner/unittests/tsserver/helpers.ts @@ -10,10 +10,6 @@ namespace ts.projectSystem { export import createServerHost = TestFSWithWatch.createServerHost; export import checkArray = TestFSWithWatch.checkArray; export import libFile = TestFSWithWatch.libFile; - export import checkWatchedFiles = TestFSWithWatch.checkWatchedFiles; - export import checkWatchedFilesDetailed = TestFSWithWatch.checkWatchedFilesDetailed; - export import checkWatchedDirectories = TestFSWithWatch.checkWatchedDirectories; - export import checkWatchedDirectoriesDetailed = TestFSWithWatch.checkWatchedDirectoriesDetailed; export import commonFile1 = tscWatch.commonFile1; export import commonFile2 = tscWatch.commonFile2; @@ -103,11 +99,22 @@ namespace ts.projectSystem { .replace(/\"updateGraphDurationMs\"\:\d+(?:\.\d+)?/g, `"updateGraphDurationMs":*`) .replace(/\"createAutoImportProviderProgramDurationMs\"\:\d+(?:\.\d+)?/g, `"createAutoImportProviderProgramDurationMs":*`) .replace(`"version":"${version}"`, `"version":"FakeVersion"`) + .replace(/getCompletionData: Get current token: \d+(?:\.\d+)?/g, `getCompletionData: Get current token: *`) + .replace(/getCompletionData: Is inside comment: \d+(?:\.\d+)?/g, `getCompletionData: Is inside comment: *`) + .replace(/getCompletionData: Get previous token: \d+(?:\.\d+)?/g, `getCompletionData: Get previous token: *`) + .replace(/getCompletionsAtPosition: isCompletionListBlocker: \d+(?:\.\d+)?/g, `getCompletionsAtPosition: isCompletionListBlocker: *`) + .replace(/getCompletionData: Semantic work: \d+(?:\.\d+)?/g, `getCompletionData: Semantic work: *`) + .replace(/getCompletionsAtPosition: getCompletionEntriesFromSymbols: \d+(?:\.\d+)?/g, `getCompletionsAtPosition: getCompletionEntriesFromSymbols: *`) + .replace(/forEachExternalModuleToImportFrom autoImportProvider: \d+(?:\.\d+)?/g, `forEachExternalModuleToImportFrom autoImportProvider: *`) + .replace(/getExportInfoMap: done in \d+(?:\.\d+)?/g, `getExportInfoMap: done in *`) + .replace(/collectAutoImports: \d+(?:\.\d+)?/g, `collectAutoImports: *`) + .replace(/dependencies in \d+(?:\.\d+)?/g, `dependencies in *`) + .replace(/\"exportMapKey\"\:\"\w(\w|\d)*\|\d+\|/g, match => match.replace(/\|\d+\|/, `|*|`)) ) }; } - export function baselineTsserverLogs(scenario: string, subScenario: string, sessionOrService: TestSession | TestProjectService) { + export function baselineTsserverLogs(scenario: string, subScenario: string, sessionOrService: { logger: Logger; }) { Debug.assert(sessionOrService.logger.logs.length); // Ensure caller used in memory logger Harness.Baseline.runBaseline(`tsserver/${scenario}/${subScenario.split(" ").join("-")}.js`, sessionOrService.logger.logs.join("\r\n")); } @@ -379,14 +386,15 @@ namespace ts.projectSystem { return new TestSession({ ...sessionOptions, ...opts }); } - export function createSessionWithEventTracking(host: server.ServerHost, eventName: T["eventName"], ...eventNames: T["eventName"][]) { + export function createSessionWithEventTracking(host: server.ServerHost, eventNames: T["eventName"] | T["eventName"][], opts: Partial = {}) { const events: T[] = []; const session = createSession(host, { eventHandler: e => { - if (e.eventName === eventName || eventNames.some(eventName => e.eventName === eventName)) { + if (isArray(eventNames) ? eventNames.some(eventName => e.eventName === eventName) : eventNames === e.eventName) { events.push(e as T); } - } + }, + ...opts }); return { session, events }; @@ -475,13 +483,6 @@ namespace ts.projectSystem { return iterResult.value; } - export function checkOrphanScriptInfos(service: server.ProjectService, expectedFiles: readonly string[]) { - checkArray("Orphan ScriptInfos:", arrayFrom(mapDefinedIterator( - service.filenameToScriptInfo.values(), - v => v.containingProjects.length === 0 ? v.fileName : undefined - )), expectedFiles); - } - export function checkProjectActualFiles(project: server.Project, expectedFiles: readonly string[]) { checkArray(`${server.ProjectKind[project.projectKind]} project: ${project.getProjectName()}:: actual files`, project.getFileNames(), expectedFiles); } @@ -522,14 +523,6 @@ namespace ts.projectSystem { ]; } - export function checkOpenFiles(projectService: server.ProjectService, expectedFiles: File[]) { - checkArray("Open files", arrayFrom(projectService.openFiles.keys(), path => projectService.getScriptInfoForPath(path as Path)!.fileName), expectedFiles.map(file => file.path)); - } - - export function checkScriptInfos(projectService: server.ProjectService, expectedFiles: readonly string[], additionInfo?: string) { - checkArray(`ScriptInfos files: ${additionInfo || ""}`, arrayFrom(projectService.filenameToScriptInfo.values(), info => info.fileName), expectedFiles); - } - export function protocolLocationFromSubstring(str: string, substring: string, options?: SpanFromSubstringOptions): protocol.Location { const start = nthIndexOf(str, substring, options ? options.index : 0); Debug.assert(start !== -1); diff --git a/src/testRunner/unittests/tsserver/inferredProjects.ts b/src/testRunner/unittests/tsserver/inferredProjects.ts index be7238323fe58..d4390e111add0 100644 --- a/src/testRunner/unittests/tsserver/inferredProjects.ts +++ b/src/testRunner/unittests/tsserver/inferredProjects.ts @@ -14,19 +14,9 @@ namespace ts.projectSystem { content: `export let x: number` }; const host = createServerHost([appFile, moduleFile, libFile]); - const projectService = createProjectService(host); - const { configFileName } = projectService.openClientFile(appFile.path); - - assert(!configFileName, `should not find config, got: '${configFileName}`); - checkNumberOfConfiguredProjects(projectService, 0); - checkNumberOfInferredProjects(projectService, 1); - - const project = projectService.inferredProjects[0]; - - checkArray("inferred project", project.getFileNames(), [appFile.path, libFile.path, moduleFile.path]); - checkWatchedFiles(host, getConfigFilesToWatch(tscWatch.projectRoot).concat(libFile.path, moduleFile.path)); - checkWatchedDirectories(host, [tscWatch.projectRoot], /*recursive*/ false); - checkWatchedDirectories(host, [combinePaths(tscWatch.projectRoot, nodeModulesAtTypes)], /*recursive*/ true); + const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() }); + projectService.openClientFile(appFile.path); + baselineTsserverLogs("inferredProjects", "create inferred project", projectService); }); it("should use only one inferred project if 'useOneInferredProject' is set", () => { diff --git a/src/testRunner/unittests/tsserver/moduleSpecifierCache.ts b/src/testRunner/unittests/tsserver/moduleSpecifierCache.ts index e86cd6a694e1b..a89d9d56fdd43 100644 --- a/src/testRunner/unittests/tsserver/moduleSpecifierCache.ts +++ b/src/testRunner/unittests/tsserver/moduleSpecifierCache.ts @@ -59,13 +59,13 @@ namespace ts.projectSystem { }); it("invalidates module specifiers when changes happen in contained node_modules directories", () => { - const { host, moduleSpecifierCache, triggerCompletions } = setup(); + const { host, session, moduleSpecifierCache, triggerCompletions } = setup(createLoggerWithInMemoryLogs()); // Completion at an import statement will calculate and cache module specifiers triggerCompletions({ file: cTs.path, line: 1, offset: cTs.content.length + 1 }); - checkWatchedDirectories(host, ["/src", "/node_modules"], /*recursive*/ true); host.writeFile("/node_modules/.staging/mobx-12345678/package.json", "{}"); host.runQueuedTimeoutCallbacks(); assert.equal(moduleSpecifierCache.count(), 0); + baselineTsserverLogs("moduleSpecifierCache", "invalidates module specifiers when changes happen in contained node_modules directories", session); }); it("does not invalidate the cache when new files are added", () => { @@ -123,9 +123,9 @@ namespace ts.projectSystem { }); }); - function setup() { + function setup(logger?: Logger) { const host = createServerHost([aTs, bTs, cTs, bSymlink, ambientDeclaration, tsconfig, packageJson, mobxPackageJson, mobxDts]); - const session = createSession(host); + const session = createSession(host, logger && { logger }); openFilesForSession([aTs, bTs, cTs], session); const projectService = session.getProjectService(); const project = configuredProjectAt(projectService, 0); diff --git a/src/testRunner/unittests/tsserver/partialSemanticServer.ts b/src/testRunner/unittests/tsserver/partialSemanticServer.ts index 2aee331883dcf..621c4db5c5374 100644 --- a/src/testRunner/unittests/tsserver/partialSemanticServer.ts +++ b/src/testRunner/unittests/tsserver/partialSemanticServer.ts @@ -26,17 +26,19 @@ import { something } from "something"; content: "{}" }; const host = createServerHost([file1, file2, file3, something, libFile, configFile]); - const session = createSession(host, { serverMode: LanguageServiceMode.PartialSemantic, useSingleInferredProject: true }); + const session = createSession(host, { + serverMode: LanguageServiceMode.PartialSemantic, + useSingleInferredProject: true, + logger: createLoggerWithInMemoryLogs(), + }); return { host, session, file1, file2, file3, something, configFile }; } it("open files are added to inferred project even if config file is present and semantic operations succeed", () => { - const { host, session, file1, file2 } = setup(); + const { session, file1, file2 } = setup(); const service = session.getProjectService(); openFilesForSession([file1], session); - checkNumberOfProjects(service, { inferredProjects: 1 }); const project = service.inferredProjects[0]; - checkProjectActualFiles(project, [libFile.path, file1.path]); // no imports are resolved verifyCompletions(); openFilesForSession([file2], session); @@ -44,39 +46,13 @@ import { something } from "something"; checkProjectActualFiles(project, [libFile.path, file1.path, file2.path]); verifyCompletions(); + baselineTsserverLogs("partialSemanticServer", "files are added to inferred project", session); + function verifyCompletions() { - assert.isTrue(project.languageServiceEnabled); - checkWatchedFiles(host, emptyArray); - checkWatchedDirectories(host, emptyArray, /*recursive*/ true); - checkWatchedDirectories(host, emptyArray, /*recursive*/ false); - const response = session.executeCommandSeq({ + session.executeCommandSeq({ command: protocol.CommandTypes.Completions, arguments: protocolFileLocationFromSubstring(file1, "prop", { index: 1 }) - }).response as protocol.CompletionEntry[]; - assert.deepEqual(response, [ - completionEntry("foo", ScriptElementKind.memberFunctionElement), - completionEntry("prop", ScriptElementKind.memberVariableElement), - ]); - } - - function completionEntry(name: string, kind: ScriptElementKind): protocol.CompletionEntry { - return { - name, - kind, - kindModifiers: "", - sortText: Completions.SortText.LocationPriority, - hasAction: undefined, - insertText: undefined, - isPackageJsonImport: undefined, - isImportStatementCompletion: undefined, - isRecommended: undefined, - replacementSpan: undefined, - source: undefined, - data: undefined, - sourceDisplay: undefined, - isSnippet: undefined, - labelDetails: undefined, - }; + }); } }); @@ -84,7 +60,6 @@ import { something } from "something"; const { session, file1 } = setup(); const service = session.getProjectService(); openFilesForSession([file1], session); - let hasException = false; const request: protocol.SemanticDiagnosticsSyncRequest = { type: "request", seq: 1, @@ -95,21 +70,17 @@ import { something } from "something"; session.executeCommand(request); } catch (e) { - assert.equal(e.message, `Request: semanticDiagnosticsSync not allowed in LanguageServiceMode.PartialSemantic`); - hasException = true; + session.logger.info(e.message); } - assert.isTrue(hasException); - hasException = false; const project = service.inferredProjects[0]; try { project.getLanguageService().getSemanticDiagnostics(file1.path); } catch (e) { - assert.equal(e.message, `LanguageService Operation: getSemanticDiagnostics not allowed in LanguageServiceMode.PartialSemantic`); - hasException = true; + session.logger.info(e.message); } - assert.isTrue(hasException); + baselineTsserverLogs("partialSemanticServer", "throws unsupported commands", session); }); it("allows syntactic diagnostic commands", () => { @@ -159,11 +130,8 @@ import { something } from "something"; content: "export const something = 10;" }; host.ensureFileOrFolder(atTypes); - const service = session.getProjectService(); openFilesForSession([file1], session); - checkNumberOfProjects(service, { inferredProjects: 1 }); - const project = service.inferredProjects[0]; - checkProjectActualFiles(project, [libFile.path, file1.path]); // Should not contain atTypes + baselineTsserverLogs("partialSemanticServer", "should not include auto type reference directives", session); }); it("should not include referenced files from unopened files", () => { @@ -192,30 +160,26 @@ function fooB() { }` content: "{}" }; const host = createServerHost([file1, file2, file3, something, libFile, configFile]); - const session = createSession(host, { serverMode: LanguageServiceMode.PartialSemantic, useSingleInferredProject: true }); - const service = session.getProjectService(); + const session = createSession(host, { + serverMode: LanguageServiceMode.PartialSemantic, + useSingleInferredProject: true, + logger: createLoggerWithInMemoryLogs(), + }); openFilesForSession([file1], session); - checkNumberOfProjects(service, { inferredProjects: 1 }); - const project = service.inferredProjects[0]; - checkProjectActualFiles(project, [libFile.path, file1.path]); // no resolve + baselineTsserverLogs("partialSemanticServer", "should not include referenced files from unopened files", session); }); it("should not crash when external module name resolution is reused", () => { const { session, file1, file2, file3 } = setup(); - const service = session.getProjectService(); openFilesForSession([file1], session); - checkNumberOfProjects(service, { inferredProjects: 1 }); - const project = service.inferredProjects[0]; - checkProjectActualFiles(project, [libFile.path, file1.path]); // Close the file that contains non relative external module name and open some file that doesnt have non relative external module import closeFilesForSession([file1], session); openFilesForSession([file3], session); - checkProjectActualFiles(project, [libFile.path, file3.path]); // Open file with non relative external module name openFilesForSession([file2], session); - checkProjectActualFiles(project, [libFile.path, file2.path, file3.path]); + baselineTsserverLogs("partialSemanticServer", "should not crash when external module name resolution is reused", session); }); it("should not create autoImportProvider or handle package jsons", () => { @@ -250,18 +214,13 @@ function fooB() { }` }); it("should support go-to-definition on module specifiers", () => { - const { session, file1, file2 } = setup(); + const { session, file1 } = setup(); openFilesForSession([file1], session); - const response = session.executeCommandSeq({ + session.executeCommandSeq({ command: protocol.CommandTypes.DefinitionAndBoundSpan, arguments: protocolFileLocationFromSubstring(file1, `"./b"`) - }).response as protocol.DefinitionInfoAndBoundSpan; - assert.isDefined(response); - assert.deepEqual(response.definitions, [{ - file: file2.path, - start: { line: 1, offset: 1 }, - end: { line: 1, offset: 1 }, - }]); + }); + baselineTsserverLogs("partialSemanticServer", "should support go-to-definition on module specifiers", session); }); }); } diff --git a/src/testRunner/unittests/tsserver/projectReferencesSourcemap.ts b/src/testRunner/unittests/tsserver/projectReferencesSourcemap.ts index e49522f7dc96b..b0f2c2a15b85a 100644 --- a/src/testRunner/unittests/tsserver/projectReferencesSourcemap.ts +++ b/src/testRunner/unittests/tsserver/projectReferencesSourcemap.ts @@ -12,7 +12,6 @@ export function fn4() { } export function fn5() { } ` }; - const dependencyTsPath = dependencyTs.path.toLowerCase(); const dependencyConfig: File = { path: `${dependecyLocation}/tsconfig.json`, content: JSON.stringify({ compilerOptions: { composite: true, declarationMap: true, declarationDir: "../decls" } }) @@ -76,210 +75,22 @@ fn5(); ); } - function verifyScriptInfos(session: TestSession, host: TestServerHost, openInfos: readonly string[], closedInfos: readonly string[], otherWatchedFiles: readonly string[], additionalInfo?: string) { - checkScriptInfos(session.getProjectService(), openInfos.concat(closedInfos), additionalInfo); - checkWatchedFiles(host, closedInfos.concat(otherWatchedFiles).map(f => f.toLowerCase()), additionalInfo); - } - - function verifyOnlyRandomInfos(session: TestSession, host: TestServerHost) { - verifyScriptInfos(session, host, [randomFile.path], [libFile.path], [randomConfig.path], "Random"); - } - - function declarationSpan(fn: number): protocol.TextSpanWithContext { - return { - start: { line: fn, offset: 17 }, - end: { line: fn, offset: 20 }, - contextStart: { line: fn, offset: 1 }, - contextEnd: { line: fn, offset: 26 } - }; - } - function importSpan(fn: number): protocol.TextSpanWithContext { - return { - start: { line: fn + 1, offset: 5 }, - end: { line: fn + 1, offset: 8 }, - contextStart: { line: 1, offset: 1 }, - contextEnd: { line: 7, offset: 22 } - }; - } - function usageSpan(fn: number): protocol.TextSpan { - return { start: { line: fn + 8, offset: 1 }, end: { line: fn + 8, offset: 4 } }; - } - - function goToDefFromMainTs(fn: number): Action { - const textSpan = usageSpan(fn); - const definition: protocol.FileSpan = { file: dependencyTs.path, ...declarationSpan(fn) }; - return { - reqName: "goToDef", - request: { - command: protocol.CommandTypes.DefinitionAndBoundSpan, - arguments: { file: mainTs.path, ...textSpan.start } - }, - expectedResponse: { - // To dependency - definitions: [definition], - textSpan - } - }; - } - - function goToDefFromMainTsWithNoMap(fn: number): Action { - const textSpan = usageSpan(fn); - const definition = declarationSpan(fn); - const declareSpaceLength = "declare ".length; - return { - reqName: "goToDef", - request: { - command: protocol.CommandTypes.DefinitionAndBoundSpan, - arguments: { file: mainTs.path, ...textSpan.start } - }, - expectedResponse: { - // To the dts - definitions: [{ - file: dtsPath, - start: { line: fn, offset: definition.start.offset + declareSpaceLength }, - end: { line: fn, offset: definition.end.offset + declareSpaceLength }, - contextStart: { line: fn, offset: 1 }, - contextEnd: { line: fn, offset: 37 } - }], - textSpan - } - }; - } - - function goToDefFromMainTsWithNoDts(fn: number): Action { - const textSpan = usageSpan(fn); - return { - reqName: "goToDef", - request: { - command: protocol.CommandTypes.DefinitionAndBoundSpan, - arguments: { file: mainTs.path, ...textSpan.start } - }, - expectedResponse: { - // To import declaration - definitions: [{ file: mainTs.path, ...importSpan(fn) }], - textSpan - } - }; - } - - function goToDefFromMainTsWithDependencyChange(fn: number): Action { - const textSpan = usageSpan(fn); + function goToDefFromMainTs(fn: number): Partial { return { - reqName: "goToDef", - request: { - command: protocol.CommandTypes.DefinitionAndBoundSpan, - arguments: { file: mainTs.path, ...textSpan.start } - }, - expectedResponse: { - // Definition on fn + 1 line - definitions: [{ file: dependencyTs.path, ...declarationSpan(fn + 1) }], - textSpan - } + command: protocol.CommandTypes.DefinitionAndBoundSpan, + arguments: { file: mainTs.path, line: fn + 8, offset: 1 } }; } - function renameFromDependencyTs(fn: number): Action { - const defSpan = declarationSpan(fn); - const { contextStart: _, contextEnd: _1, ...triggerSpan } = defSpan; + function renameFromDependencyTs(fn: number): Partial { return { - reqName: "rename", - request: { - command: protocol.CommandTypes.Rename, - arguments: { file: dependencyTs.path, ...triggerSpan.start } - }, - expectedResponse: { - info: { - canRename: true, - fileToRename: undefined, - displayName: `fn${fn}`, - fullDisplayName: `"${dependecyLocation}/FnS".fn${fn}`, - kind: ScriptElementKind.functionElement, - kindModifiers: "export", - triggerSpan - }, - locs: [ - { file: dependencyTs.path, locs: [defSpan] } - ] - } + command: protocol.CommandTypes.Rename, + arguments: { file: dependencyTs.path, line: fn, offset: 17 } }; } - function renameFromDependencyTsWithDependencyChange(fn: number): Action { - const { expectedResponse: { info, locs }, ...rest } = renameFromDependencyTs(fn + 1); - - return { - ...rest, - expectedResponse: { - info: { - ...info as protocol.RenameInfoSuccess, - displayName: `fn${fn}`, - fullDisplayName: `"${dependecyLocation}/FnS".fn${fn}`, - }, - locs - } - }; - } - - function renameFromDependencyTsWithBothProjectsOpen(fn: number): Action { - const { reqName, request, expectedResponse } = renameFromDependencyTs(fn); - const { info, locs } = expectedResponse; - return { - reqName, - request, - expectedResponse: { - info, - locs: [ - locs[0], - { - file: mainTs.path, - locs: [ - importSpan(fn), - usageSpan(fn) - ] - } - ] - } - }; - } - - function renameFromDependencyTsWithBothProjectsOpenWithDependencyChange(fn: number): Action { - const { reqName, request, expectedResponse, } = renameFromDependencyTsWithDependencyChange(fn); - const { info, locs } = expectedResponse; - return { - reqName, - request, - expectedResponse: { - info, - locs: [ - locs[0], - { - file: mainTs.path, - locs: [ - importSpan(fn), - usageSpan(fn) - ] - } - ] - } - }; - } - - function removePath(array: readonly string[], ...delPaths: string[]) { - return array.filter(a => { - const aLower = a.toLowerCase(); - return delPaths.every(dPath => dPath !== aLower); - }); - } - - interface Action { - reqName: string; - request: Partial; - expectedResponse: Response; - } - - function verifyAction(session: TestSession, { reqName, request, expectedResponse }: Action) { - const { response } = session.executeCommandSeq(request); - assert.deepEqual(response, expectedResponse, `Failed Request: ${reqName}`); + function renameFromDependencyTsWithDependencyChange(fn: number) { + return renameFromDependencyTs(fn + 1); } function verifyDocumentPositionMapper( @@ -313,12 +124,9 @@ fn5(); } } - function verifyAllFnAction( + function verifyAllFnAction( session: TestSession, - host: TestServerHost, - action: (fn: number) => Action, - expectedInfos: readonly string[], - expectedWatchedFiles: readonly string[], + action: (fn: number) => Partial, existingDependencyMap: server.ScriptInfo | undefined, existingDocumentPositionMapper: server.ScriptInfo["documentPositionMapper"], existingMapEqual: boolean, @@ -330,10 +138,8 @@ fn5(); let documentPositionMapper: server.ScriptInfo["documentPositionMapper"]; for (let fn = 1; fn <= 5; fn++) { const fnAction = action(fn); - verifyAction(session, fnAction); - const debugInfo = `${fnAction.reqName}:: ${fn}`; - checkScriptInfos(session.getProjectService(), expectedInfos, debugInfo); - checkWatchedFiles(host, expectedWatchedFiles, debugInfo); + session.executeCommandSeq(fnAction); + const debugInfo = `${JSON.stringify(fnAction)}:: ${fn}`; const dtsInfo = session.getProjectService().getScriptInfoForPath(dtsPath); const dtsMapInfo = session.getProjectService().getScriptInfoForPath(dtsMapPath); @@ -365,10 +171,7 @@ fn5(); function verifyScriptInfoCollectionWith( session: TestSession, - host: TestServerHost, openFiles: readonly File[], - expectedInfos: readonly string[], - expectedWatchedFiles: readonly string[], ) { const { dependencyMap, documentPositionMapper } = getDocumentPositionMapper(session); @@ -376,8 +179,6 @@ fn5(); closeFilesForSession([randomFile], session); openFilesForSession([randomFile], session); - checkScriptInfos(session.getProjectService(), expectedInfos); - checkWatchedFiles(host, expectedWatchedFiles); // If map is not collected, document position mapper shouldnt change if (session.getProjectService().filenameToScriptInfo.has(dtsMapPath)) { verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); @@ -386,7 +187,6 @@ fn5(); // Closing open file, removes dependencies too closeFilesForSession([...openFiles, randomFile], session); openFilesForSession([randomFile], session); - verifyOnlyRandomInfos(session, host); } type OnHostCreate = (host: TestServerHost) => void; @@ -416,14 +216,14 @@ fn5(); compilerOptions: { composite: true, declarationMap: true } })); onHostCreate?.(host); - const session = createSession(host); + const session = createSession(host, { logger: createLoggerWithInMemoryLogs() }); return { host, session }; } function createSessionWithProjectReferences(onHostCreate?: OnHostCreate) { const host = createHostWithSolutionBuild(files, [mainConfig.path]); onHostCreate?.(host); - const session = createSession(host); + const session = createSession(host, { logger: createLoggerWithInMemoryLogs() }); return { host, session }; } @@ -439,7 +239,7 @@ fn5(); references: [{ path: "../dependency" }] })); onHostCreate?.(host); - const session = createSession(host); + const session = createSession(host, { logger: createLoggerWithInMemoryLogs() }); return { host, session }; } @@ -449,30 +249,6 @@ fn5(); return { dependencyMap, documentPositionMapper }; } - function checkMainProjectWithoutProjectReferences(session: TestSession) { - checkProjectActualFiles(session.getProjectService().configuredProjects.get(mainConfig.path)!, [mainTs.path, libFile.path, mainConfig.path, dtsPath]); - } - - function checkMainProjectWithoutProjectReferencesWithoutDts(session: TestSession) { - checkProjectActualFiles(session.getProjectService().configuredProjects.get(mainConfig.path)!, [mainTs.path, libFile.path, mainConfig.path]); - } - - function checkMainProjectWithProjectReferences(session: TestSession) { - checkProjectActualFiles(session.getProjectService().configuredProjects.get(mainConfig.path)!, [mainTs.path, libFile.path, mainConfig.path, dependencyTs.path]); - } - - function checkMainProjectWithDisabledProjectReferences(session: TestSession) { - checkProjectActualFiles(session.getProjectService().configuredProjects.get(mainConfig.path)!, [mainTs.path, libFile.path, mainConfig.path, dtsPath]); - } - - function checkMainProjectWithDisabledProjectReferencesWithoutDts(session: TestSession) { - checkProjectActualFiles(session.getProjectService().configuredProjects.get(mainConfig.path)!, [mainTs.path, libFile.path, mainConfig.path]); - } - - function checkDependencyProjectWith(session: TestSession) { - checkProjectActualFiles(session.getProjectService().configuredProjects.get(dependencyConfig.path)!, [dependencyTs.path, libFile.path, dependencyConfig.path]); - } - function makeChangeToMainTs(session: TestSession) { session.executeCommandSeq({ command: protocol.CommandTypes.Change, @@ -501,22 +277,14 @@ fn5(); }); } + describe("from project that uses dependency: goToDef", () => { function setupWithActionWith(setup: (onHostCreate?: OnHostCreate) => ReturnType, onHostCreate: OnHostCreate | undefined) { const result = setup(onHostCreate); - result.session.executeCommandSeq(goToDefFromMainTs(1).request); + result.session.executeCommandSeq(goToDefFromMainTs(1)); return { ...result, ...getDocumentPositionMapper(result.session) }; } - function verifyScriptInfoCollection( - session: TestSession, - host: TestServerHost, - expectedInfos: readonly string[], - expectedWatchedFiles: readonly string[], - ) { - return verifyScriptInfoCollectionWith(session, host, [mainTs], expectedInfos, expectedWatchedFiles); - } - describe("when main tsconfig doesnt have project reference", () => { function setup(onHostCreate?: OnHostCreate) { return setupWithMainTs(createSessionWithoutProjectReferences, onHostCreate); @@ -526,64 +294,18 @@ fn5(); return setupWithActionWith(setup, onHostCreate); } - function checkProjects(session: TestSession) { - checkNumberOfProjects(session.getProjectService(), { configuredProjects: 2 }); - checkMainProjectWithoutProjectReferences(session); - } - - function checkProjectsWithoutDts(session: TestSession) { - checkNumberOfProjects(session.getProjectService(), { configuredProjects: 2 }); - checkMainProjectWithoutProjectReferencesWithoutDts(session); - } - - function expectedScriptInfosWhenMapped() { - return [mainTs.path, randomFile.path, dependencyTs.path, libFile.path, dtsPath, dtsMapLocation]; - } - - function expectedWatchedFilesWhenMapped() { - return [dependencyTsPath, libFile.path, dtsPath, dtsMapPath, mainConfig.path, randomConfig.path]; - } - - function expectedScriptInfosWhenNoMap() { - // Because map is deleted, map and dependency are released - return removePath(expectedScriptInfosWhenMapped(), dtsMapPath, dependencyTsPath); - } - - function expectedWatchedFilesWhenNoMap() { - // Watches deleted file - return removePath(expectedWatchedFilesWhenMapped(), dependencyTsPath); - } - - function expectedScriptInfosWhenNoDts() { - // No dts, no map, no dependency - return removePath(expectedScriptInfosWhenMapped(), dtsPath, dtsMapPath, dependencyTsPath); - } - - function expectedWatchedFilesWhenNoDts() { - return removePath(expectedWatchedFilesWhenMapped(), dtsPath, dtsMapPath, dependencyTsPath); - } - it("can go to definition correctly", () => { - const { host, session } = setup(); - checkProjects(session); + const { session } = setup(); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/can go to definition correctly", session); }); // Edit @@ -594,25 +316,22 @@ fn5(); // change makeChangeToMainTs(session); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/usage file changes with timeout before request", session); }); it(`when usage file changes, document position mapper doesnt change, when timeout does not occur before request`, () => { // Create DocumentPositionMapper - const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); + const { session, dependencyMap, documentPositionMapper } = setupWithAction(); // change makeChangeToMainTs(session); @@ -620,15 +339,13 @@ fn5(); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/usage file changes", session); }); // Edit dts to add new fn @@ -639,21 +356,18 @@ fn5(); // change changeDtsFile(host); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/dependency dts changes with timeout before request", session); }); it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout does not occur before request`, () => { // Create DocumentPositionMapper @@ -665,15 +379,13 @@ fn5(); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/dependency dts changes", session); }); // Edit map file to represent added new line @@ -684,21 +396,18 @@ fn5(); // change changeDtsMapFile(host); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ false + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ false ); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/dependency dtsMap changes with timeout before request", session); }); it(`when dependency file's map changes, when timeout does not occur before request`, () => { // Create DocumentPositionMapper @@ -710,39 +419,28 @@ fn5(); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ false + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ false ); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/dependency dtsMap changes", session); }); it(`with depedency files map file, when file is not present`, () => { - const { host, session } = setup(host => host.deleteFile(dtsMapLocation)); - checkProjects(session); + const { session } = setup(host => host.deleteFile(dtsMapLocation)); verifyAllFnAction( session, - host, - goToDefFromMainTsWithNoMap, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), + goToDefFromMainTs, /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/dependency dtsMap not present", session); }); it(`with depedency files map file, when file is created after actions on projects`, () => { let fileContents: string; @@ -754,22 +452,14 @@ fn5(); host.writeFile(dtsMapLocation, fileContents!); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped() - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/dependency dtsMap created", session); }); it(`with depedency files map file, when file is deleted after actions on the projects`, () => { const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); @@ -778,49 +468,29 @@ fn5(); host.deleteFile(dtsMapLocation); verifyAllFnAction( session, - host, - goToDefFromMainTsWithNoMap, - // The script info for map is collected only after file open - expectedScriptInfosWhenNoMap().concat(dependencyTs.path), - expectedWatchedFilesWhenNoMap().concat(dependencyTsPath), + goToDefFromMainTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - - // Script info collection should behave as fileNotPresentKey - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/dependency dtsMap deleted", session); }); it(`with depedency .d.ts file, when file is not present`, () => { - const { host, session } = setup(host => host.deleteFile(dtsLocation)); - checkProjectsWithoutDts(session); + const { session } = setup(host => host.deleteFile(dtsLocation)); verifyAllFnAction( session, - host, - goToDefFromMainTsWithNoDts, - expectedScriptInfosWhenNoDts(), - expectedWatchedFilesWhenNoDts(), + goToDefFromMainTs, /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjectsWithoutDts(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoDts(), - expectedWatchedFilesWhenNoDts(), - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/dependency dts not present", session); }); it(`with depedency .d.ts file, when file is created after actions on projects`, () => { let fileContents: string; @@ -832,22 +502,14 @@ fn5(); host.writeFile(dtsLocation, fileContents!); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped() - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/dependency dts created", session); }); it(`with depedency .d.ts file, when file is deleted after actions on the projects`, () => { const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); @@ -856,25 +518,14 @@ fn5(); host.deleteFile(dtsLocation); verifyAllFnAction( session, - host, - goToDefFromMainTsWithNoDts, - // The script info for map is collected only after file open - expectedScriptInfosWhenNoDts().concat(dependencyTs.path, dtsMapLocation), - expectedWatchedFilesWhenNoDts().concat(dependencyTsPath, dtsMapPath), + goToDefFromMainTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjectsWithoutDts(session); - - // Script info collection should behave as "noDts" - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoDts(), - expectedWatchedFilesWhenNoDts(), - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/dependency dts deleted", session); }); }); describe("when main tsconfig has project reference", () => { @@ -886,40 +537,18 @@ fn5(); return setupWithActionWith(setup, onHostCreate); } - function checkProjects(session: TestSession) { - checkNumberOfProjects(session.getProjectService(), { configuredProjects: 2 }); - checkMainProjectWithProjectReferences(session); - } - - function expectedScriptInfos() { - return [dependencyTs.path, libFile.path, mainTs.path, randomFile.path]; - } - - function expectedWatchedFiles() { - return [dependencyTsPath, dependencyConfig.path, libFile.path, mainConfig.path, randomConfig.path]; - } - it("can go to definition correctly", () => { - const { host, session } = setup(); - checkProjects(session); + const { session } = setup(); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfos(), - expectedWatchedFiles(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfos(), - expectedWatchedFiles(), - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/can go to definition correctly", session); }); // Edit @@ -930,25 +559,22 @@ fn5(); // change makeChangeToMainTs(session); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/usage file changes with timeout before request", session); }); it(`when usage file changes, document position mapper doesnt change, when timeout does not occur before request`, () => { // Create DocumentPositionMapper - const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); + const { session, dependencyMap, documentPositionMapper } = setupWithAction(); // change makeChangeToMainTs(session); @@ -956,15 +582,13 @@ fn5(); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/usage file changes", session); }); // Edit dts to add new fn @@ -975,21 +599,18 @@ fn5(); // change changeDtsFile(host); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency dts changes with timeout before request", session); }); it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout does not occur before request`, () => { // Create DocumentPositionMapper @@ -1001,15 +622,13 @@ fn5(); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency dts changes", session); }); // Edit map file to represent added new line @@ -1020,21 +639,18 @@ fn5(); // change changeDtsMapFile(host); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency dtsMap changes with timeout before request", session); }); it(`when dependency file's map changes, when timeout does not occur before request`, () => { // Create DocumentPositionMapper @@ -1046,39 +662,28 @@ fn5(); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency dtsMap changes", session); }); it(`with depedency files map file, when file is not present`, () => { - const { host, session } = setup(host => host.deleteFile(dtsMapLocation)); - checkProjects(session); + const { session } = setup(host => host.deleteFile(dtsMapLocation)); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfos(), - expectedWatchedFiles(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfos(), - expectedWatchedFiles(), - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency dtsMap not present", session); }); it(`with depedency files map file, when file is created after actions on projects`, () => { let fileContents: string; @@ -1090,22 +695,14 @@ fn5(); host.writeFile(dtsMapLocation, fileContents!); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfos(), - expectedWatchedFiles() - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency dtsMap created", session); }); it(`with depedency files map file, when file is deleted after actions on the projects`, () => { const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); @@ -1114,48 +711,29 @@ fn5(); host.deleteFile(dtsMapLocation); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - - // Script info collection should behave as fileNotPresentKey - verifyScriptInfoCollection( - session, - host, - expectedScriptInfos(), - expectedWatchedFiles(), - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency dtsMap deleted", session); }); it(`with depedency .d.ts file, when file is not present`, () => { - const { host, session } = setup(host => host.deleteFile(dtsLocation)); - checkProjects(session); + const { session } = setup(host => host.deleteFile(dtsLocation)); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfos(), - expectedWatchedFiles(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfos(), - expectedWatchedFiles(), - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency dts not present", session); }); it(`with depedency .d.ts file, when file is created after actions on projects`, () => { let fileContents: string; @@ -1167,22 +745,14 @@ fn5(); host.writeFile(dtsLocation, fileContents!); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfos(), - expectedWatchedFiles() - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency dts created", session); }); it(`with depedency .d.ts file, when file is deleted after actions on the projects`, () => { const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); @@ -1191,26 +761,15 @@ fn5(); host.deleteFile(dtsLocation); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - - // Script info collection should behave as "noDts" - verifyScriptInfoCollection( - session, - host, - expectedScriptInfos(), - expectedWatchedFiles(), - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency dts deleted", session); }); - it(`when defining project source changes, when timeout occurs before request`, () => { // Create DocumentPositionMapper const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); @@ -1220,21 +779,18 @@ fn5(); host.writeFile(dependencyTs.path, `function fooBar() { } ${dependencyTs.content}`); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, - goToDefFromMainTsWithDependencyChange, - expectedScriptInfos(), - expectedWatchedFiles(), + goToDefFromMainTs, /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency source changes with timeout before request", session); }); it(`when defining project source changes, when timeout does not occur before request`, () => { // Create DocumentPositionMapper @@ -1248,39 +804,29 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, - goToDefFromMainTsWithDependencyChange, - expectedScriptInfos(), - expectedWatchedFiles(), + goToDefFromMainTs, /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency source changes", session); }); it("when projects are not built", () => { const host = createServerHost(files); - const session = createSession(host); + const session = createSession(host, { logger: createLoggerWithInMemoryLogs() }); openFilesForSession([mainTs, randomFile], session); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfos(), - expectedWatchedFiles(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfos(), - expectedWatchedFiles(), - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/when projects are not built", session); }); }); describe("when main tsconfig has disableSourceOfProjectReferenceRedirect along with project reference", () => { @@ -1292,64 +838,18 @@ ${dependencyTs.content}`); return setupWithActionWith(setup, onHostCreate); } - function checkProjects(session: TestSession) { - checkNumberOfProjects(session.getProjectService(), { configuredProjects: 2 }); - checkMainProjectWithDisabledProjectReferences(session); - } - - function checkProjectsWithoutDts(session: TestSession) { - checkNumberOfProjects(session.getProjectService(), { configuredProjects: 2 }); - checkMainProjectWithDisabledProjectReferencesWithoutDts(session); - } - - function expectedScriptInfosWhenMapped() { - return [mainTs.path, randomFile.path, dependencyTs.path, libFile.path, dtsPath, dtsMapLocation]; - } - - function expectedWatchedFilesWhenMapped() { - return [dependencyTsPath, libFile.path, dtsPath, dtsMapPath, mainConfig.path, randomConfig.path, dependencyConfig.path]; - } - - function expectedScriptInfosWhenNoMap() { - // Because map is deleted, map and dependency are released - return removePath(expectedScriptInfosWhenMapped(), dtsMapPath, dependencyTsPath); - } - - function expectedWatchedFilesWhenNoMap() { - // Watches deleted file - return removePath(expectedWatchedFilesWhenMapped(), dependencyTsPath); - } - - function expectedScriptInfosWhenNoDts() { - // No dts, no map, no dependency - return removePath(expectedScriptInfosWhenMapped(), dtsPath, dtsMapPath, dependencyTsPath); - } - - function expectedWatchedFilesWhenNoDts() { - return removePath(expectedWatchedFilesWhenMapped(), dtsPath, dtsMapPath, dependencyTsPath); - } - it("can go to definition correctly", () => { - const { host, session } = setup(); - checkProjects(session); + const { session } = setup(); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/can go to definition correctly", session); }); // Edit @@ -1360,25 +860,22 @@ ${dependencyTs.content}`); // change makeChangeToMainTs(session); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/usage file changes with timeout before request", session); }); it(`when usage file changes, document position mapper doesnt change, when timeout does not occur before request`, () => { // Create DocumentPositionMapper - const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); + const { session, dependencyMap, documentPositionMapper } = setupWithAction(); // change makeChangeToMainTs(session); @@ -1386,15 +883,13 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/usage file changes", session); }); // Edit dts to add new fn @@ -1405,21 +900,18 @@ ${dependencyTs.content}`); // change changeDtsFile(host); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/dependency dts changes with timeout before request", session); }); it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout does not occur before request`, () => { // Create DocumentPositionMapper @@ -1431,15 +923,13 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/dependency dts changes", session); }); // Edit map file to represent added new line @@ -1450,21 +940,18 @@ ${dependencyTs.content}`); // change changeDtsMapFile(host); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ false ); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/dependency dtsMap changes with timeout before request", session); }); it(`when dependency file's map changes, when timeout does not occur before request`, () => { // Create DocumentPositionMapper @@ -1476,39 +963,28 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ false ); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/dependency dtsMap changes", session); }); it(`with depedency files map file, when file is not present`, () => { - const { host, session } = setup(host => host.deleteFile(dtsMapLocation)); - checkProjects(session); + const { session } = setup(host => host.deleteFile(dtsMapLocation)); verifyAllFnAction( session, - host, - goToDefFromMainTsWithNoMap, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), + goToDefFromMainTs, /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/dependency dtsMap not present", session); }); it(`with depedency files map file, when file is created after actions on projects`, () => { let fileContents: string; @@ -1520,22 +996,14 @@ ${dependencyTs.content}`); host.writeFile(dtsMapLocation, fileContents!); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped() - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/dependency dtsMap created", session); }); it(`with depedency files map file, when file is deleted after actions on the projects`, () => { const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); @@ -1544,49 +1012,29 @@ ${dependencyTs.content}`); host.deleteFile(dtsMapLocation); verifyAllFnAction( session, - host, - goToDefFromMainTsWithNoMap, - // The script info for map is collected only after file open - expectedScriptInfosWhenNoMap().concat(dependencyTs.path), - expectedWatchedFilesWhenNoMap().concat(dependencyTsPath), + goToDefFromMainTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - - // Script info collection should behave as fileNotPresentKey - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/dependency dtsMap deleted", session); }); it(`with depedency .d.ts file, when file is not present`, () => { - const { host, session } = setup(host => host.deleteFile(dtsLocation)); - checkProjectsWithoutDts(session); + const { session } = setup(host => host.deleteFile(dtsLocation)); verifyAllFnAction( session, - host, - goToDefFromMainTsWithNoDts, - expectedScriptInfosWhenNoDts(), - expectedWatchedFilesWhenNoDts(), + goToDefFromMainTs, /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjectsWithoutDts(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoDts(), - expectedWatchedFilesWhenNoDts(), - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/dependency dts not present", session); }); it(`with depedency .d.ts file, when file is created after actions on projects`, () => { let fileContents: string; @@ -1598,22 +1046,14 @@ ${dependencyTs.content}`); host.writeFile(dtsLocation, fileContents!); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped() - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/dependency dts created", session); }); it(`with depedency .d.ts file, when file is deleted after actions on the projects`, () => { const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); @@ -1622,25 +1062,14 @@ ${dependencyTs.content}`); host.deleteFile(dtsLocation); verifyAllFnAction( session, - host, - goToDefFromMainTsWithNoDts, - // The script info for map is collected only after file open - expectedScriptInfosWhenNoDts().concat(dependencyTs.path, dtsMapLocation), - expectedWatchedFilesWhenNoDts().concat(dependencyTsPath, dtsMapPath), + goToDefFromMainTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjectsWithoutDts(session); - - // Script info collection should behave as "noDts" - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoDts(), - expectedWatchedFilesWhenNoDts(), - ); + verifyScriptInfoCollectionWith(session, [mainTs]); + baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/dependency dts deleted", session); }); }); }); @@ -1648,52 +1077,10 @@ ${dependencyTs.content}`); describe("from defining project: rename", () => { function setupWithActionWith(setup: (onHostCreate?: OnHostCreate) => ReturnType, onHostCreate: OnHostCreate | undefined) { const result = setup(onHostCreate); - result.session.executeCommandSeq(renameFromDependencyTs(1).request); + result.session.executeCommandSeq(renameFromDependencyTs(1)); return { ...result, ...getDocumentPositionMapper(result.session) }; } - function verifyScriptInfoCollection( - session: TestSession, - host: TestServerHost, - expectedInfos: readonly string[], - expectedWatchedFiles: readonly string[], - ) { - return verifyScriptInfoCollectionWith(session, host, [dependencyTs], expectedInfos, expectedWatchedFiles); - } - - function checkProjects(session: TestSession) { - checkNumberOfProjects(session.getProjectService(), { configuredProjects: 2 }); - checkDependencyProjectWith(session); - } - - function expectedScriptInfos() { - return [libFile.path, dtsLocation, dtsMapLocation, dependencyTs.path, randomFile.path]; - } - - function expectedWatchedFiles() { - return [libFile.path, dtsPath, dtsMapPath, dependencyConfig.path, randomConfig.path]; - } - - function expectedScriptInfosWhenNoMap() { - // No map - return removePath(expectedScriptInfos(), dtsMapPath); - } - - function expectedWatchedFilesWhenNoMap() { - // Watches deleted file = map file - return expectedWatchedFiles(); - } - - function expectedScriptInfosWhenNoDts() { - // no dts or map since dts itself doesnt exist - return removePath(expectedScriptInfos(), dtsPath, dtsMapPath); - } - - function expectedWatchedFilesWhenNoDts() { - // watch deleted file - return removePath(expectedWatchedFiles(), dtsMapPath); - } - describe("when main tsconfig doesnt have project reference", () => { function setup(onHostCreate?: OnHostCreate) { return setupWithDependencyTs(createSessionWithoutProjectReferences, onHostCreate); @@ -1704,26 +1091,17 @@ ${dependencyTs.content}`); } it("rename locations from dependency", () => { - const { host, session } = setup(); - checkProjects(session); + const { session } = setup(); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfos(), - expectedWatchedFiles(), - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/rename locations", session); }); // Edit @@ -1734,25 +1112,22 @@ ${dependencyTs.content}`); // change makeChangeToDependencyTs(session); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/usage file changes with timeout before request", session); }); it(`when usage file changes, document position mapper doesnt change, when timeout does not occur before request`, () => { // Create DocumentPositionMapper - const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); + const { session, dependencyMap, documentPositionMapper } = setupWithAction(); // change makeChangeToDependencyTs(session); @@ -1760,15 +1135,13 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/usage file changes", session); }); // Edit dts to add new fn @@ -1779,21 +1152,18 @@ ${dependencyTs.content}`); // change changeDtsFile(host); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/dependency dts changes with timeout before request", session); }); it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout does not occur before request`, () => { // Create DocumentPositionMapper @@ -1805,15 +1175,13 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/dependency dts changes", session); }); // Edit map file to represent added new line @@ -1824,21 +1192,18 @@ ${dependencyTs.content}`); // change changeDtsMapFile(host); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ false + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ false ); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/dependency dtsMap changes with timeout before request", session); }); it(`when dependency file's map changes, when timeout does not occur before request`, () => { // Create DocumentPositionMapper @@ -1850,39 +1215,28 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ false ); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/dependency dtsMap changes", session); }); it(`with depedency files map file, when file is not present`, () => { - const { host, session } = setup(host => host.deleteFile(dtsMapLocation)); - checkProjects(session); + const { session } = setup(host => host.deleteFile(dtsMapLocation)); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/dependency dtsMap not present", session); }); it(`with depedency files map file, when file is created after actions on projects`, () => { let fileContents: string; @@ -1894,22 +1248,14 @@ ${dependencyTs.content}`); host.writeFile(dtsMapLocation, fileContents!); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfos(), - expectedWatchedFiles() - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/dependency dtsMap created", session); }); it(`with depedency files map file, when file is deleted after actions on the projects`, () => { const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); @@ -1918,48 +1264,29 @@ ${dependencyTs.content}`); host.deleteFile(dtsMapLocation); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - - // Script info collection should behave as fileNotPresentKey - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/dependency dtsMap deleted", session); }); it(`with depedency .d.ts file, when file is not present`, () => { - const { host, session } = setup(host => host.deleteFile(dtsLocation)); - checkProjects(session); + const { session } = setup(host => host.deleteFile(dtsLocation)); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfosWhenNoDts(), - expectedWatchedFilesWhenNoDts(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoDts(), - expectedWatchedFilesWhenNoDts(), - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/dependency dts not present", session); }); it(`with depedency .d.ts file, when file is created after actions on projects`, () => { let fileContents: string; @@ -1971,22 +1298,14 @@ ${dependencyTs.content}`); host.writeFile(dtsLocation, fileContents!); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfos(), - expectedWatchedFiles() - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/dependency dts created", session); }); it(`with depedency .d.ts file, when file is deleted after actions on the projects`, () => { const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); @@ -1995,25 +1314,14 @@ ${dependencyTs.content}`); host.deleteFile(dtsLocation); verifyAllFnAction( session, - host, renameFromDependencyTs, - // Map is collected after file open - expectedScriptInfosWhenNoDts().concat(dtsMapLocation), - expectedWatchedFilesWhenNoDts().concat(dtsPath), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - - // Script info collection should behave as "noDts" - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoDts(), - expectedWatchedFilesWhenNoDts(), - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/dependency dts deleted", session); }); }); describe("when main tsconfig has project reference", () => { @@ -2026,26 +1334,17 @@ ${dependencyTs.content}`); } it("rename locations from dependency", () => { - const { host, session } = setup(); - checkProjects(session); + const { session } = setup(); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfos(), - expectedWatchedFiles(), - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/rename locations", session); }); // Edit @@ -2056,25 +1355,22 @@ ${dependencyTs.content}`); // change makeChangeToDependencyTs(session); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/usage file changes with timeout before request", session); }); it(`when usage file changes, document position mapper doesnt change, when timeout does not occur before request`, () => { // Create DocumentPositionMapper - const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); + const { session, dependencyMap, documentPositionMapper } = setupWithAction(); // change makeChangeToDependencyTs(session); @@ -2082,15 +1378,13 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/usage file changes", session); }); // Edit dts to add new fn @@ -2101,21 +1395,18 @@ ${dependencyTs.content}`); // change changeDtsFile(host); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency dts changes with timeout before request", session); }); it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout does not occur before request`, () => { // Create DocumentPositionMapper @@ -2127,15 +1418,13 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency dts changes", session); }); // Edit map file to represent added new line @@ -2146,21 +1435,18 @@ ${dependencyTs.content}`); // change changeDtsMapFile(host); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ false ); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency dtsMap changes with timeout before request", session); }); it(`when dependency file's map changes, when timeout does not occur before request`, () => { // Create DocumentPositionMapper @@ -2172,39 +1458,28 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ false ); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency dtsMap changes", session); }); it(`with depedency files map file, when file is not present`, () => { - const { host, session } = setup(host => host.deleteFile(dtsMapLocation)); - checkProjects(session); + const { session } = setup(host => host.deleteFile(dtsMapLocation)); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency dtsMap not present", session); }); it(`with depedency files map file, when file is created after actions on projects`, () => { let fileContents: string; @@ -2216,22 +1491,14 @@ ${dependencyTs.content}`); host.writeFile(dtsMapLocation, fileContents!); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfos(), - expectedWatchedFiles() - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency dtsMap created", session); }); it(`with depedency files map file, when file is deleted after actions on the projects`, () => { const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); @@ -2240,48 +1507,29 @@ ${dependencyTs.content}`); host.deleteFile(dtsMapLocation); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - - // Script info collection should behave as fileNotPresentKey - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency dtsMap deleted", session); }); it(`with depedency .d.ts file, when file is not present`, () => { - const { host, session } = setup(host => host.deleteFile(dtsLocation)); - checkProjects(session); + const { session } = setup(host => host.deleteFile(dtsLocation)); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfosWhenNoDts(), - expectedWatchedFilesWhenNoDts(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoDts(), - expectedWatchedFilesWhenNoDts(), - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency dts not present", session); }); it(`with depedency .d.ts file, when file is created after actions on projects`, () => { let fileContents: string; @@ -2293,22 +1541,14 @@ ${dependencyTs.content}`); host.writeFile(dtsLocation, fileContents!); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfos(), - expectedWatchedFiles() - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency dts created", session); }); it(`with depedency .d.ts file, when file is deleted after actions on the projects`, () => { const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); @@ -2317,27 +1557,15 @@ ${dependencyTs.content}`); host.deleteFile(dtsLocation); verifyAllFnAction( session, - host, renameFromDependencyTs, - // Map is collected after file open - expectedScriptInfosWhenNoDts().concat(dtsMapLocation), - expectedWatchedFilesWhenNoDts().concat(dtsPath), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - - // Script info collection should behave as "noDts" - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoDts(), - expectedWatchedFilesWhenNoDts(), - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency dts deleted", session); }); - it(`when defining project source changes, when timeout occurs before request`, () => { // Create DocumentPositionMapper const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); @@ -2351,25 +1579,22 @@ ${dependencyTs.content}`); `} }); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, renameFromDependencyTsWithDependencyChange, - expectedScriptInfos(), - expectedWatchedFiles(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency source changes with timeout before request", session); }); it(`when defining project source changes, when timeout does not occur before request`, () => { // Create DocumentPositionMapper - const { host, session } = setupWithAction(); + const { session } = setupWithAction(); // change // Make change, without rebuild of solution @@ -2383,39 +1608,29 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, renameFromDependencyTsWithDependencyChange, - expectedScriptInfos(), - expectedWatchedFiles(), - /*existingDependencyMap*/ undefined, - /*existingDocumentPositionMapper*/ undefined, - /*existingMapEqual*/ false, - /*existingDocumentPositionMapperEqual*/ false + /*existingDependencyMap*/ undefined, + /*existingDocumentPositionMapper*/ undefined, + /*existingMapEqual*/ false, + /*existingDocumentPositionMapperEqual*/ false ); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency source changes", session); }); it("when projects are not built", () => { const host = createServerHost(files); - const session = createSession(host); + const session = createSession(host, { logger: createLoggerWithInMemoryLogs() }); openFilesForSession([dependencyTs, randomFile], session); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfosWhenNoDts(), - expectedWatchedFilesWhenNoDts(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoDts(), - expectedWatchedFilesWhenNoDts(), - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/when projects are not built", session); }); }); describe("when main tsconfig has disableSourceOfProjectReferenceRedirect along with project reference", () => { @@ -2428,26 +1643,17 @@ ${dependencyTs.content}`); } it("rename locations from dependency", () => { - const { host, session } = setup(); - checkProjects(session); + const { session } = setup(); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfos(), - expectedWatchedFiles(), - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/rename locations", session); }); // Edit @@ -2458,25 +1664,22 @@ ${dependencyTs.content}`); // change makeChangeToDependencyTs(session); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/usage file changes with timeout before request", session); }); it(`when usage file changes, document position mapper doesnt change, when timeout does not occur before request`, () => { // Create DocumentPositionMapper - const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); + const { session, dependencyMap, documentPositionMapper } = setupWithAction(); // change makeChangeToDependencyTs(session); @@ -2484,15 +1687,13 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/usage file changes", session); }); // Edit dts to add new fn @@ -2503,21 +1704,18 @@ ${dependencyTs.content}`); // change changeDtsFile(host); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/dependency dts changes with timeout before request", session); }); it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout does not occur before request`, () => { // Create DocumentPositionMapper @@ -2529,15 +1727,13 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/dependency dts changes", session); }); // Edit map file to represent added new line @@ -2548,21 +1744,18 @@ ${dependencyTs.content}`); // change changeDtsMapFile(host); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ false ); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/dependency dtsMap changes with timeout before request", session); }); it(`when dependency file's map changes, when timeout does not occur before request`, () => { // Create DocumentPositionMapper @@ -2574,39 +1767,28 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ false ); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/dependency dtsMap changes", session); }); it(`with depedency files map file, when file is not present`, () => { - const { host, session } = setup(host => host.deleteFile(dtsMapLocation)); - checkProjects(session); + const { session } = setup(host => host.deleteFile(dtsMapLocation)); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/dependency dtsMap not present", session); }); it(`with depedency files map file, when file is created after actions on projects`, () => { let fileContents: string; @@ -2618,22 +1800,14 @@ ${dependencyTs.content}`); host.writeFile(dtsMapLocation, fileContents!); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfos(), - expectedWatchedFiles() - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/dependency dtsMap created", session); }); it(`with depedency files map file, when file is deleted after actions on the projects`, () => { const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); @@ -2642,48 +1816,29 @@ ${dependencyTs.content}`); host.deleteFile(dtsMapLocation); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - - // Script info collection should behave as fileNotPresentKey - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/dependency dtsMap deleted", session); }); it(`with depedency .d.ts file, when file is not present`, () => { - const { host, session } = setup(host => host.deleteFile(dtsLocation)); - checkProjects(session); + const { session } = setup(host => host.deleteFile(dtsLocation)); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfosWhenNoDts(), - expectedWatchedFilesWhenNoDts(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoDts(), - expectedWatchedFilesWhenNoDts(), - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/dependency dts not present", session); }); it(`with depedency .d.ts file, when file is created after actions on projects`, () => { let fileContents: string; @@ -2695,22 +1850,14 @@ ${dependencyTs.content}`); host.writeFile(dtsLocation, fileContents!); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfos(), - expectedWatchedFiles(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfos(), - expectedWatchedFiles() - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/dependency dts created", session); }); it(`with depedency .d.ts file, when file is deleted after actions on the projects`, () => { const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); @@ -2719,25 +1866,14 @@ ${dependencyTs.content}`); host.deleteFile(dtsLocation); verifyAllFnAction( session, - host, renameFromDependencyTs, - // Map is collected after file open - expectedScriptInfosWhenNoDts().concat(dtsMapLocation), - expectedWatchedFilesWhenNoDts().concat(dtsPath), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - - // Script info collection should behave as "noDts" - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoDts(), - expectedWatchedFilesWhenNoDts(), - ); + verifyScriptInfoCollectionWith(session, [dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/dependency dts deleted", session); }); }); }); @@ -2745,20 +1881,11 @@ ${dependencyTs.content}`); describe("when opening depedency and usage project: goToDef and rename", () => { function setupWithActionWith(setup: (onHostCreate?: OnHostCreate) => ReturnType, onHostCreate: OnHostCreate | undefined) { const result = setup(onHostCreate); - result.session.executeCommandSeq(goToDefFromMainTs(1).request); - result.session.executeCommandSeq(renameFromDependencyTsWithBothProjectsOpen(1).request); + result.session.executeCommandSeq(goToDefFromMainTs(1)); + result.session.executeCommandSeq(renameFromDependencyTs(1)); return { ...result, ...getDocumentPositionMapper(result.session) }; } - function verifyScriptInfoCollection( - session: TestSession, - host: TestServerHost, - expectedInfos: readonly string[], - expectedWatchedFiles: readonly string[], - ) { - return verifyScriptInfoCollectionWith(session, host, [mainTs, dependencyTs], expectedInfos, expectedWatchedFiles); - } - describe("when main tsconfig doesnt have project reference", () => { function setup(onHostCreate?: OnHostCreate) { return setupWithMainTsAndDependencyTs(createSessionWithoutProjectReferences, onHostCreate); @@ -2768,64 +1895,11 @@ ${dependencyTs.content}`); return setupWithActionWith(setup, onHostCreate); } - function checkProjects(session: TestSession) { - checkNumberOfProjects(session.getProjectService(), { configuredProjects: 3 }); - checkMainProjectWithoutProjectReferences(session); - checkDependencyProjectWith(session); - } - - function checkProjectsWithoutDts(session: TestSession) { - checkNumberOfProjects(session.getProjectService(), { configuredProjects: 3 }); - checkMainProjectWithoutProjectReferencesWithoutDts(session); - checkDependencyProjectWith(session); - } - - function expectedScriptInfosWhenMapped() { - return [mainTs.path, randomFile.path, dependencyTs.path, libFile.path, dtsPath, dtsMapLocation]; - } - - function expectedWatchedFilesWhenMapped() { - return [libFile.path, dtsPath, dtsMapPath, mainConfig.path, randomConfig.path, dependencyConfig.path]; - } - - function expectedScriptInfosWhenNoMap() { - // Because map is deleted, map and dependency are released - return removePath(expectedScriptInfosWhenMapped(), dtsMapPath); - } - - function expectedWatchedFilesWhenNoMap() { - // Watches deleted file - return expectedWatchedFilesWhenMapped(); - } - - function expectedScriptInfosAfterGotoDefWhenNoDts() { - // No dts, no map - return removePath(expectedScriptInfosWhenMapped(), dtsPath, dtsMapPath); - } - - function expectedWatchedFilesAfterGotoDefWhenNoDts() { - return removePath(expectedWatchedFilesWhenMapped(), dtsPath, dtsMapPath); - } - - function expectedScriptInfosAfterRenameWhenNoDts() { - // No dts, no map - return removePath(expectedScriptInfosWhenMapped(), dtsPath, dtsMapPath); - } - - function expectedWatchedFilesAfterRenameWhenNoDts() { - // Watches dts file but not map file - return removePath(expectedWatchedFilesWhenMapped(), dtsMapPath); - } - it("goto Definition in usage and rename locations from defining project", () => { - const { host, session } = setup(); - checkProjects(session); + const { session } = setup(); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ false, @@ -2834,22 +1908,14 @@ ${dependencyTs.content}`); const { dependencyMap, documentPositionMapper } = getDocumentPositionMapper(session); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), + renameFromDependencyTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/goToDef and rename locations", session); }); // Edit @@ -2861,16 +1927,12 @@ ${dependencyTs.content}`); makeChangeToMainTs(session); makeChangeToDependencyTs(session); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, @@ -2878,19 +1940,17 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), + renameFromDependencyTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/usage file changes with timeout before request", session); }); it(`when usage file changes, document position mapper doesnt change, when timeout does not occur before request`, () => { // Create DocumentPositionMapper - const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); + const { session, dependencyMap, documentPositionMapper } = setupWithAction(); // change makeChangeToMainTs(session); @@ -2899,10 +1959,7 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, @@ -2910,15 +1967,13 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), + renameFromDependencyTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/usage file changes", session); }); // Edit dts to add new fn @@ -2929,16 +1984,12 @@ ${dependencyTs.content}`); // change changeDtsFile(host); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, @@ -2946,15 +1997,13 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), + renameFromDependencyTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/dependency dts changes with timeout before request", session); }); it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout does not occur before request`, () => { // Create DocumentPositionMapper @@ -2966,10 +2015,7 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, @@ -2977,15 +2023,13 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), + renameFromDependencyTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/dependency dts changes", session); }); // Edit map file to represent added new line @@ -2996,16 +2040,12 @@ ${dependencyTs.content}`); // change changeDtsMapFile(host); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, @@ -3014,15 +2054,13 @@ ${dependencyTs.content}`); const { documentPositionMapper: newDocumentPositionMapper } = getDocumentPositionMapper(session); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), + renameFromDependencyTs, dependencyMap, newDocumentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/dependency dtsMap changes with timeout before request", session); }); it(`when dependency file's map changes, when timeout does not occur before request`, () => { // Create DocumentPositionMapper @@ -3034,10 +2072,7 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, @@ -3046,27 +2081,21 @@ ${dependencyTs.content}`); const { documentPositionMapper: newDocumentPositionMapper } = getDocumentPositionMapper(session); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), + renameFromDependencyTs, dependencyMap, newDocumentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/dependency dtsMap changes", session); }); it(`with depedency files map file, when file is not present`, () => { - const { host, session } = setup(host => host.deleteFile(dtsMapLocation)); - checkProjects(session); + const { session } = setup(host => host.deleteFile(dtsMapLocation)); verifyAllFnAction( session, - host, - goToDefFromMainTsWithNoMap, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), + goToDefFromMainTs, /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, @@ -3074,22 +2103,14 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/dependency dtsMap not present", session); }); it(`with depedency files map file, when file is created after actions on projects`, () => { let fileContents: string; @@ -3101,10 +2122,7 @@ ${dependencyTs.content}`); host.writeFile(dtsMapLocation, fileContents!); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, @@ -3113,22 +2131,14 @@ ${dependencyTs.content}`); const { dependencyMap: newDependencyMap, documentPositionMapper: newDocumentPositionMapper } = getDocumentPositionMapper(session); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), + renameFromDependencyTs, newDependencyMap, newDocumentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped() - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/dependency dtsMap created", session); }); it(`with depedency files map file, when file is deleted after actions on the projects`, () => { const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); @@ -3137,10 +2147,7 @@ ${dependencyTs.content}`); host.deleteFile(dtsMapLocation); verifyAllFnAction( session, - host, - goToDefFromMainTsWithNoMap, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), + goToDefFromMainTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, @@ -3149,36 +2156,21 @@ ${dependencyTs.content}`); const { dependencyMap: newDependencyMap, documentPositionMapper: newDocumentPositionMapper } = getDocumentPositionMapper(session); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), newDependencyMap, newDocumentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - - // Script info collection should behave as fileNotPresentKey - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/dependency dtsMap deleted", session); }); it(`with depedency .d.ts file, when file is not present`, () => { - const { host, session } = setup(host => host.deleteFile(dtsLocation)); - checkProjectsWithoutDts(session); - + const { session } = setup(host => host.deleteFile(dtsLocation)); verifyAllFnAction( session, - host, - goToDefFromMainTsWithNoDts, - expectedScriptInfosAfterGotoDefWhenNoDts(), - expectedWatchedFilesAfterGotoDefWhenNoDts(), + goToDefFromMainTs, /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, @@ -3186,22 +2178,14 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfosAfterRenameWhenNoDts(), - expectedWatchedFilesAfterRenameWhenNoDts(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjectsWithoutDts(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosAfterRenameWhenNoDts(), - expectedWatchedFilesAfterRenameWhenNoDts(), - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/dependency dts not present", session); }); it(`with depedency .d.ts file, when file is created after actions on projects`, () => { let fileContents: string; @@ -3213,10 +2197,7 @@ ${dependencyTs.content}`); host.writeFile(dtsLocation, fileContents!); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, @@ -3225,22 +2206,14 @@ ${dependencyTs.content}`); const { dependencyMap: newDependencyMap, documentPositionMapper: newDocumentPositionMapper } = getDocumentPositionMapper(session); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), + renameFromDependencyTs, newDependencyMap, newDocumentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped() - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/dependency dts created", session); }); it(`with depedency .d.ts file, when file is deleted after actions on the projects`, () => { const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); @@ -3249,11 +2222,7 @@ ${dependencyTs.content}`); host.deleteFile(dtsLocation); verifyAllFnAction( session, - host, - goToDefFromMainTsWithNoDts, - // The script info for map is collected only after file open - expectedScriptInfosAfterGotoDefWhenNoDts().concat(dtsMapLocation), - expectedWatchedFilesAfterGotoDefWhenNoDts().concat(dtsMapPath), + goToDefFromMainTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, @@ -3261,25 +2230,14 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, renameFromDependencyTs, - // The script info for map is collected only after file open - expectedScriptInfosAfterRenameWhenNoDts().concat(dtsMapLocation), - expectedWatchedFilesAfterRenameWhenNoDts().concat(dtsMapPath), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjectsWithoutDts(session); - - // Script info collection should behave as "noDts" - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosAfterRenameWhenNoDts(), - expectedWatchedFilesAfterRenameWhenNoDts(), - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/dependency dts deleted", session); }); }); describe("when main tsconfig has project reference", () => { @@ -3291,57 +2249,11 @@ ${dependencyTs.content}`); return setupWithActionWith(setup, onHostCreate); } - function checkProjects(session: TestSession) { - checkNumberOfProjects(session.getProjectService(), { configuredProjects: 3 }); - checkMainProjectWithProjectReferences(session); - checkDependencyProjectWith(session); - } - - function expectedScriptInfosAfterGotoDef() { - return [dependencyTs.path, libFile.path, mainTs.path, randomFile.path]; - } - - function expectedWatchedFilesAfterGotoDef() { - return [dependencyConfig.path, libFile.path, mainConfig.path, randomConfig.path]; - } - - function expectedScriptInfosAfterRenameWhenMapped() { - return expectedScriptInfosAfterGotoDef().concat(dtsLocation, dtsMapLocation); - } - - function expectedWatchedFilesAfterRenameWhenMapped() { - return expectedWatchedFilesAfterGotoDef().concat(dtsPath, dtsMapPath); - } - - function expectedScriptInfosAfterRenameWhenNoMap() { - // Map file is not present - return removePath(expectedScriptInfosAfterRenameWhenMapped(), dtsMapPath); - } - - function expectedWatchedFilesAfterRenameWhenNoMap() { - // Watches map file - return expectedWatchedFilesAfterRenameWhenMapped(); - } - - function expectedScriptInfosAfterRenameWhenNoDts() { - // map and dts not present - return removePath(expectedScriptInfosAfterRenameWhenMapped(), dtsPath, dtsMapPath); - } - - function expectedWatchedFilesAfterRenameWhenNoDts() { - // Watches dts file but not map - return removePath(expectedWatchedFilesAfterRenameWhenMapped(), dtsMapPath); - } - it("goto Definition in usage and rename locations from defining project", () => { - const { host, session } = setup(); - checkProjects(session); + const { session } = setup(); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosAfterGotoDef(), - expectedWatchedFilesAfterGotoDef(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, @@ -3349,22 +2261,14 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), + renameFromDependencyTs, /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/gotoDef and rename locations", session); }); // Edit @@ -3376,36 +2280,30 @@ ${dependencyTs.content}`); makeChangeToMainTs(session); makeChangeToDependencyTs(session); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), + renameFromDependencyTs, dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/usage file changes with timeout before request", session); }); it(`when usage file changes, document position mapper doesnt change, when timeout does not occur before request`, () => { // Create DocumentPositionMapper - const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); + const { session, dependencyMap, documentPositionMapper } = setupWithAction(); // change makeChangeToMainTs(session); @@ -3414,10 +2312,7 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, @@ -3425,15 +2320,13 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), + renameFromDependencyTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/usage file changes", session); }); // Edit dts to add new fn @@ -3444,32 +2337,26 @@ ${dependencyTs.content}`); // change changeDtsFile(host); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), + renameFromDependencyTs, dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency dts changes with timeout before request", session); }); it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout does not occur before request`, () => { // Create DocumentPositionMapper @@ -3481,10 +2368,7 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, @@ -3492,15 +2376,13 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), + renameFromDependencyTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency dts changes", session); }); // Edit map file to represent added new line @@ -3511,16 +2393,12 @@ ${dependencyTs.content}`); // change changeDtsMapFile(host); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, @@ -3528,15 +2406,13 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), + renameFromDependencyTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ false ); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency dtsMap changes with timeout before request", session); }); it(`when dependency file's map changes, when timeout does not occur before request`, () => { // Create DocumentPositionMapper @@ -3548,38 +2424,29 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), + renameFromDependencyTs, dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ false + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ false ); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency dtsMap changes", session); }); it(`with depedency files map file, when file is not present`, () => { - const { host, session } = setup(host => host.deleteFile(dtsMapLocation)); - checkProjects(session); + const { session } = setup(host => host.deleteFile(dtsMapLocation)); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosAfterGotoDef(), - expectedWatchedFilesAfterGotoDef(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, @@ -3587,22 +2454,14 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosAfterRenameWhenNoMap(), - expectedWatchedFilesAfterRenameWhenNoMap(), + renameFromDependencyTs, /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosAfterRenameWhenNoMap(), - expectedWatchedFilesAfterRenameWhenNoMap(), - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency dtsMap not present", session); }); it(`with depedency files map file, when file is created after actions on projects`, () => { let fileContents: string; @@ -3614,11 +2473,7 @@ ${dependencyTs.content}`); host.writeFile(dtsMapLocation, fileContents!); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosAfterRenameWhenNoMap(), - // Map file is reset so its not watched any more, as this action doesnt need map - removePath(expectedWatchedFilesAfterRenameWhenNoMap(), dtsMapPath), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, @@ -3627,22 +2482,14 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), + renameFromDependencyTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency dtsMap created", session); }); it(`with depedency files map file, when file is deleted after actions on the projects`, () => { const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); @@ -3651,11 +2498,7 @@ ${dependencyTs.content}`); host.deleteFile(dtsMapLocation); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosAfterRenameWhenNoMap(), - // Map file is reset so its not watched any more, as this action doesnt need map - removePath(expectedWatchedFilesAfterRenameWhenNoMap(), dtsMapPath), dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, @@ -3664,36 +2507,22 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosAfterRenameWhenNoMap(), - expectedWatchedFilesAfterRenameWhenNoMap(), + renameFromDependencyTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - - // Script info collection should behave as fileNotPresentKey - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosAfterRenameWhenNoMap(), - expectedWatchedFilesAfterRenameWhenNoMap(), - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency dtsMap deleted", session); }); it(`with depedency .d.ts file, when file is not present`, () => { - const { host, session } = setup(host => host.deleteFile(dtsLocation)); - checkProjects(session); + const { session } = setup(host => host.deleteFile(dtsLocation)); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosAfterGotoDef(), - expectedWatchedFilesAfterGotoDef(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, @@ -3701,22 +2530,14 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosAfterRenameWhenNoDts(), - expectedWatchedFilesAfterRenameWhenNoDts(), + renameFromDependencyTs, /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosAfterRenameWhenNoDts(), - expectedWatchedFilesAfterRenameWhenNoDts(), - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency dts not present", session); }); it(`with depedency .d.ts file, when file is created after actions on projects`, () => { let fileContents: string; @@ -3728,11 +2549,7 @@ ${dependencyTs.content}`); host.writeFile(dtsLocation, fileContents!); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosAfterGotoDef(), - // Since the project for dependency is not updated, the watcher from rename for dts still there - expectedWatchedFilesAfterGotoDef().concat(dtsPath), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, @@ -3740,22 +2557,14 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), + renameFromDependencyTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, /*existingDocumentPositionMapperEqual*/ false ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency dts created", session); }); it(`with depedency .d.ts file, when file is deleted after actions on the projects`, () => { const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); @@ -3764,12 +2573,7 @@ ${dependencyTs.content}`); host.deleteFile(dtsLocation); verifyAllFnAction( session, - host, goToDefFromMainTs, - // Map collection after file open - expectedScriptInfosAfterRenameWhenNoDts().concat(dtsMapLocation), - // not watching dts since this operation doesnt need it - removePath(expectedWatchedFilesAfterRenameWhenNoDts(), dtsPath).concat(dtsMapPath), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, @@ -3777,27 +2581,15 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - // Map collection after file open - expectedScriptInfosAfterRenameWhenNoDts().concat(dtsMapLocation), - expectedWatchedFilesAfterRenameWhenNoDts().concat(dtsMapPath), + renameFromDependencyTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - - // Script info collection should behave as "noDts" - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosAfterRenameWhenNoDts(), - expectedWatchedFilesAfterRenameWhenNoDts(), - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency dts deleted", session); }); - it(`when defining project source changes, when timeout occurs before request`, () => { // Create DocumentPositionMapper const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); @@ -3811,16 +2603,12 @@ ${dependencyTs.content}`); `} }); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, - goToDefFromMainTsWithDependencyChange, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), + goToDefFromMainTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, @@ -3828,19 +2616,17 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpenWithDependencyChange, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), + renameFromDependencyTsWithDependencyChange, dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency source changes with timeout before request", session); }); it(`when defining project source changes, when timeout does not occur before request`, () => { // Create DocumentPositionMapper - const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); + const { session, dependencyMap, documentPositionMapper } = setupWithAction(); // change // Make change, without rebuild of solution @@ -3848,44 +2634,36 @@ ${dependencyTs.content}`); command: protocol.CommandTypes.Change, arguments: { file: dependencyTs.path, line: 1, offset: 1, endLine: 1, endOffset: 1, insertString: `function fooBar() { } -`} + `} }); // action verifyAllFnAction( session, - host, - goToDefFromMainTsWithDependencyChange, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), + goToDefFromMainTs, dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpenWithDependencyChange, - expectedScriptInfosAfterRenameWhenMapped(), - expectedWatchedFilesAfterRenameWhenMapped(), + renameFromDependencyTsWithDependencyChange, dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency source changes", session); }); it("when projects are not built", () => { const host = createServerHost(files); - const session = createSession(host); + const session = createSession(host, { logger: createLoggerWithInMemoryLogs() }); openFilesForSession([mainTs, dependencyTs, randomFile], session); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosAfterGotoDef(), - expectedWatchedFilesAfterGotoDef(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, @@ -3893,22 +2671,14 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosAfterRenameWhenNoDts(), - expectedWatchedFilesAfterRenameWhenNoDts(), + renameFromDependencyTs, /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosAfterRenameWhenNoDts(), - expectedWatchedFilesAfterRenameWhenNoDts(), - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/when projects are not built", session); }); }); describe("when main tsconfig has disableSourceOfProjectReferenceRedirect along with project reference", () => { @@ -3920,64 +2690,11 @@ ${dependencyTs.content}`); return setupWithActionWith(setup, onHostCreate); } - function checkProjects(session: TestSession) { - checkNumberOfProjects(session.getProjectService(), { configuredProjects: 3 }); - checkMainProjectWithDisabledProjectReferences(session); - checkDependencyProjectWith(session); - } - - function checkProjectsWithoutDts(session: TestSession) { - checkNumberOfProjects(session.getProjectService(), { configuredProjects: 3 }); - checkMainProjectWithDisabledProjectReferencesWithoutDts(session); - checkDependencyProjectWith(session); - } - - function expectedScriptInfosWhenMapped() { - return [mainTs.path, randomFile.path, dependencyTs.path, libFile.path, dtsPath, dtsMapLocation]; - } - - function expectedWatchedFilesWhenMapped() { - return [libFile.path, dtsPath, dtsMapPath, mainConfig.path, randomConfig.path, dependencyConfig.path]; - } - - function expectedScriptInfosWhenNoMap() { - // Because map is deleted, map and dependency are released - return removePath(expectedScriptInfosWhenMapped(), dtsMapPath); - } - - function expectedWatchedFilesWhenNoMap() { - // Watches deleted file - return expectedWatchedFilesWhenMapped(); - } - - function expectedScriptInfosAfterGotoDefWhenNoDts() { - // No dts, no map - return removePath(expectedScriptInfosWhenMapped(), dtsPath, dtsMapPath); - } - - function expectedWatchedFilesAfterGotoDefWhenNoDts() { - return removePath(expectedWatchedFilesWhenMapped(), dtsPath, dtsMapPath); - } - - function expectedScriptInfosAfterRenameWhenNoDts() { - // No dts, no map - return removePath(expectedScriptInfosWhenMapped(), dtsPath, dtsMapPath); - } - - function expectedWatchedFilesAfterRenameWhenNoDts() { - // Watches dts file but not map file - return removePath(expectedWatchedFilesWhenMapped(), dtsMapPath); - } - it("goto Definition in usage and rename locations from defining project", () => { - const { host, session } = setup(); - checkProjects(session); + const { session } = setup(); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ false, @@ -3986,22 +2703,14 @@ ${dependencyTs.content}`); const { dependencyMap, documentPositionMapper } = getDocumentPositionMapper(session); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), + renameFromDependencyTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/gotoDef and rename locations", session); }); // Edit @@ -4013,36 +2722,30 @@ ${dependencyTs.content}`); makeChangeToMainTs(session); makeChangeToDependencyTs(session); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), + renameFromDependencyTs, dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/usage file changes with timeout before request", session); }); it(`when usage file changes, document position mapper doesnt change, when timeout does not occur before request`, () => { // Create DocumentPositionMapper - const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); + const { session, dependencyMap, documentPositionMapper } = setupWithAction(); // change makeChangeToMainTs(session); @@ -4051,26 +2754,21 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), + renameFromDependencyTs, dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/usage file changes", session); }); // Edit dts to add new fn @@ -4081,16 +2779,12 @@ ${dependencyTs.content}`); // change changeDtsFile(host); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, @@ -4098,15 +2792,13 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), + renameFromDependencyTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/dependency dts changes with timeout before request", session); }); it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout does not occur before request`, () => { // Create DocumentPositionMapper @@ -4118,10 +2810,7 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, @@ -4129,15 +2818,13 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), + renameFromDependencyTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/dependency dts changes", session); }); // Edit map file to represent added new line @@ -4148,33 +2835,27 @@ ${dependencyTs.content}`); // change changeDtsMapFile(host); host.runQueuedTimeoutCallbacks(); - checkProjects(session); verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ false + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ false ); const { documentPositionMapper: newDocumentPositionMapper } = getDocumentPositionMapper(session); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), + renameFromDependencyTs, dependencyMap, newDocumentPositionMapper, - /*existingMapEqual*/ true, - /*existingDocumentPositionMapperEqual*/ true + /*existingMapEqual*/ true, + /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/dependency dtsMap changes with timeout before request", session); }); it(`when dependency file's map changes, when timeout does not occur before request`, () => { // Create DocumentPositionMapper @@ -4186,10 +2867,7 @@ ${dependencyTs.content}`); // action verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, @@ -4198,27 +2876,21 @@ ${dependencyTs.content}`); const { documentPositionMapper: newDocumentPositionMapper } = getDocumentPositionMapper(session); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), + renameFromDependencyTs, dependencyMap, newDocumentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/dependency dtsMap changes", session); }); it(`with depedency files map file, when file is not present`, () => { - const { host, session } = setup(host => host.deleteFile(dtsMapLocation)); - checkProjects(session); + const { session } = setup(host => host.deleteFile(dtsMapLocation)); verifyAllFnAction( session, - host, - goToDefFromMainTsWithNoMap, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), + goToDefFromMainTs, /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, @@ -4226,22 +2898,14 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/dependency dtsMap not present", session); }); it(`with depedency files map file, when file is created after actions on projects`, () => { let fileContents: string; @@ -4253,10 +2917,7 @@ ${dependencyTs.content}`); host.writeFile(dtsMapLocation, fileContents!); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, @@ -4265,22 +2926,14 @@ ${dependencyTs.content}`); const { dependencyMap: newDependencyMap, documentPositionMapper: newDocumentPositionMapper } = getDocumentPositionMapper(session); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), + renameFromDependencyTs, newDependencyMap, newDocumentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped() - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/dependency dtsMap created", session); }); it(`with depedency files map file, when file is deleted after actions on the projects`, () => { const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); @@ -4289,10 +2942,7 @@ ${dependencyTs.content}`); host.deleteFile(dtsMapLocation); verifyAllFnAction( session, - host, - goToDefFromMainTsWithNoMap, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), + goToDefFromMainTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, @@ -4301,36 +2951,22 @@ ${dependencyTs.content}`); const { dependencyMap: newDependencyMap, documentPositionMapper: newDocumentPositionMapper } = getDocumentPositionMapper(session); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), newDependencyMap, newDocumentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - - // Script info collection should behave as fileNotPresentKey - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenNoMap(), - expectedWatchedFilesWhenNoMap(), - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/dependency dtsMap deleted", session); }); it(`with depedency .d.ts file, when file is not present`, () => { - const { host, session } = setup(host => host.deleteFile(dtsLocation)); - checkProjectsWithoutDts(session); + const { session } = setup(host => host.deleteFile(dtsLocation)); verifyAllFnAction( session, - host, - goToDefFromMainTsWithNoDts, - expectedScriptInfosAfterGotoDefWhenNoDts(), - expectedWatchedFilesAfterGotoDefWhenNoDts(), + goToDefFromMainTs, /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, @@ -4338,22 +2974,14 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, renameFromDependencyTs, - expectedScriptInfosAfterRenameWhenNoDts(), - expectedWatchedFilesAfterRenameWhenNoDts(), /*existingDependencyMap*/ undefined, /*existingDocumentPositionMapper*/ undefined, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjectsWithoutDts(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosAfterRenameWhenNoDts(), - expectedWatchedFilesAfterRenameWhenNoDts(), - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/dependency dts not present", session); }); it(`with depedency .d.ts file, when file is created after actions on projects`, () => { let fileContents: string; @@ -4365,10 +2993,7 @@ ${dependencyTs.content}`); host.writeFile(dtsLocation, fileContents!); verifyAllFnAction( session, - host, goToDefFromMainTs, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), dependencyMap, documentPositionMapper, /*existingMapEqual*/ false, @@ -4377,22 +3002,14 @@ ${dependencyTs.content}`); const { dependencyMap: newDependencyMap, documentPositionMapper: newDocumentPositionMapper } = getDocumentPositionMapper(session); verifyAllFnAction( session, - host, - renameFromDependencyTsWithBothProjectsOpen, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped(), + renameFromDependencyTs, newDependencyMap, newDocumentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjects(session); - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosWhenMapped(), - expectedWatchedFilesWhenMapped() - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/dependency dts created", session); }); it(`with depedency .d.ts file, when file is deleted after actions on the projects`, () => { const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(); @@ -4401,11 +3018,7 @@ ${dependencyTs.content}`); host.deleteFile(dtsLocation); verifyAllFnAction( session, - host, - goToDefFromMainTsWithNoDts, - // The script info for map is collected only after file open - expectedScriptInfosAfterGotoDefWhenNoDts().concat(dtsMapLocation), - expectedWatchedFilesAfterGotoDefWhenNoDts().concat(dtsMapPath), + goToDefFromMainTs, dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, @@ -4413,27 +3026,16 @@ ${dependencyTs.content}`); ); verifyAllFnAction( session, - host, renameFromDependencyTs, - // The script info for map is collected only after file open - expectedScriptInfosAfterRenameWhenNoDts().concat(dtsMapLocation), - expectedWatchedFilesAfterRenameWhenNoDts().concat(dtsMapPath), dependencyMap, documentPositionMapper, /*existingMapEqual*/ true, /*existingDocumentPositionMapperEqual*/ true ); - checkProjectsWithoutDts(session); - - // Script info collection should behave as "noDts" - verifyScriptInfoCollection( - session, - host, - expectedScriptInfosAfterRenameWhenNoDts(), - expectedWatchedFilesAfterRenameWhenNoDts(), - ); + verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]); + baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/dependency dts deleted", session); }); }); }); }); -} +} \ No newline at end of file diff --git a/src/testRunner/unittests/tsserver/projects.ts b/src/testRunner/unittests/tsserver/projects.ts index a9df947bf2b73..7bd5af3fa4f34 100644 --- a/src/testRunner/unittests/tsserver/projects.ts +++ b/src/testRunner/unittests/tsserver/projects.ts @@ -861,31 +861,30 @@ namespace ts.projectSystem { content: `