Skip to content

Commit

Permalink
Skip resolving files directly inside node_modules
Browse files Browse the repository at this point in the history
or in @types. Although the node module resolution algorithm looks for
.js files there, they would never be there in correctly configured
node_modules. So it should be safe to skip *.ts, *.js, *.tsx, etc.

Also skips looking for files directly in node_modules/@types.

Fixes microsoft#52695
  • Loading branch information
sandersn committed Feb 16, 2023
1 parent 738b45e commit 5f96e29
Show file tree
Hide file tree
Showing 175 changed files with 993 additions and 2,118 deletions.
2 changes: 1 addition & 1 deletion src/compiler/moduleNameResolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2868,7 +2868,7 @@ function loadModuleFromSpecificNodeModulesDirectory(extensions: Extensions, modu

const loader: ResolutionKindSpecificLoader = (extensions, candidate, onlyRecordFailures, state) => {
let pathAndExtension =
loadModuleFromFile(extensions, candidate, onlyRecordFailures, state) ||
rest && loadModuleFromFile(extensions, candidate, onlyRecordFailures, state) ||
loadNodeModuleFromDirectoryWorker(
extensions,
candidate,
Expand Down
13 changes: 4 additions & 9 deletions src/testRunner/unittests/moduleResolution.ts
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ describe("unittests:: moduleResolution:: Node module resolution - non-relative p

function test(hasDirectoryExists: boolean) {
const containingFile = { name: "/a/b/c/d/e.ts" };
const moduleFile = { name: "/a/b/node_modules/foo.ts" };
const moduleFile = { name: "/a/b/node_modules/foo/index.ts" };
baselines.push(`Resolving "foo" from ${containingFile.name}${hasDirectoryExists ? "" : " with host that doesnt have directoryExists"}`);
const resolution = ts.nodeModuleNameResolver("foo", containingFile.name, {}, createModuleResolutionHost(baselines, hasDirectoryExists, containingFile, moduleFile));
baselines.push(`Resolution:: ${JSON.stringify(resolution, /*replacer*/ undefined, 2)}`);
Expand All @@ -278,7 +278,7 @@ describe("unittests:: moduleResolution:: Node module resolution - non-relative p

function test(hasDirectoryExists: boolean) {
const containingFile = { name: "/a/b/c/d/e.ts" };
const moduleFile = { name: "/a/b/node_modules/foo.d.ts" };
const moduleFile = { name: "/a/b/node_modules/foo/index.d.ts" };
baselines.push(`Resolving "foo" from ${containingFile.name}${hasDirectoryExists ? "" : " with host that doesnt have directoryExists"}`);
const resolution = ts.nodeModuleNameResolver("foo", containingFile.name, {}, createModuleResolutionHost(baselines, hasDirectoryExists, containingFile, moduleFile));
baselines.push(`Resolution:: ${JSON.stringify(resolution, /*replacer*/ undefined, 2)}`);
Expand Down Expand Up @@ -672,7 +672,7 @@ describe("unittests:: moduleResolution:: baseUrl augmented module resolution", (
const m2: File = { name: "/root/m2/index.d.ts" }; // load folder as module
const m3: File = { name: "/root/m3/package.json", content: JSON.stringify({ typings: "dist/typings.d.ts" }) };
const m3Typings: File = { name: "/root/m3/dist/typings.d.ts" };
const m4: File = { name: "/root/node_modules/m4.ts" }; // fallback to node
const m4: File = { name: "/root/node_modules/m4/index.ts" }; // fallback to node

const options: ts.CompilerOptions = { moduleResolution: ts.ModuleResolutionKind.Node10, baseUrl: "/root" };
const host = createModuleResolutionHost(baselines, hasDirectoryExists, main, m1, m2, m3, m3Typings, m4);
Expand Down Expand Up @@ -732,7 +732,7 @@ describe("unittests:: moduleResolution:: baseUrl augmented module resolution", (
const file4Typings: File = { name: "/root/generated/folder2/file4/package.json", content: JSON.stringify({ typings: "dist/types.d.ts" }) };
const file4: File = { name: "/root/generated/folder2/file4/dist/types.d.ts" }; // load file pointed by typings
const file5: File = { name: "/root/someanotherfolder/file5/index.d.ts" }; // load remapped module from folder
const file6: File = { name: "/root/node_modules/file6.ts" }; // fallback to node
const file6: File = { name: "/root/node_modules/file6/index.ts" }; // fallback to node
const host = createModuleResolutionHost(baselines, hasDirectoryExists, file1, file2, file3, file4, file4Typings, file5, file6);

const options: ts.CompilerOptions = {
Expand Down Expand Up @@ -969,11 +969,6 @@ describe("unittests:: moduleResolution:: Type reference directive resolution: ",
});
it("Can be resolved from secondary location", () => {
const baselines: string[] = [];
{
const f1 = { name: "/root/src/app.ts" };
const f2 = { name: "/root/node_modules/lib.d.ts" };
test(baselines, /*typesRoot*/"/root/src/types", /* typeDirective */"lib", f1, f2);
}
{
const f1 = { name: "/root/src/app.ts" };
const f2 = { name: "/root/node_modules/lib/index.d.ts" };
Expand Down
2 changes: 1 addition & 1 deletion src/testRunner/unittests/tscWatch/programUpdates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -389,7 +389,7 @@ export class A {
content: `import { T } from "module1";`
};
const nodeModuleFile: File = {
path: "/a/b/node_modules/module1.ts",
path: "/a/b/node_modules/module1/index.ts",
content: `export interface T {}`
};
const classicModuleFile: File = {
Expand Down
2 changes: 1 addition & 1 deletion src/testRunner/unittests/tsserver/configuredProjects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ describe("unittests:: tsserver:: ConfiguredProjects", () => {
content: `import { T } from "module1";`
};
const nodeModuleFile: File = {
path: "/a/b/node_modules/module1.ts",
path: "/a/b/node_modules/module1/index.ts",
content: `export interface T {}`
};
const classicModuleFile: File = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -439,7 +439,7 @@ describe("unittests:: tsserver:: events:: ProjectsUpdatedInBackground", () => {
content: 'import a from "file2"'
};
const file2: File = {
path: rootFolder + "a/b/node_modules/file2.d.ts",
path: rootFolder + "a/b/node_modules/file2/index.d.ts",
content: "export class a { }"
};
const file3: File = {
Expand Down
5 changes: 3 additions & 2 deletions tests/baselines/reference/cachedModuleResolution1.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
//// [tests/cases/compiler/cachedModuleResolution1.ts] ////

//// [foo.d.ts]
//// [index.d.ts]
export declare let x: number

//// [app.ts]
import {x} from "foo";

//// [lib.ts]
import {x} from "foo";
import {x} from "foo";


//// [app.js]
"use strict";
Expand Down
4 changes: 2 additions & 2 deletions tests/baselines/reference/cachedModuleResolution1.symbols
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
=== /a/b/node_modules/foo.d.ts ===
=== /a/b/node_modules/foo/index.d.ts ===
export declare let x: number
>x : Symbol(x, Decl(foo.d.ts, 0, 18))
>x : Symbol(x, Decl(index.d.ts, 0, 18))

=== /a/b/c/d/e/app.ts ===
import {x} from "foo";
Expand Down
13 changes: 7 additions & 6 deletions tests/baselines/reference/cachedModuleResolution1.trace.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@
"Directory '/a/b/c/d/e/node_modules' does not exist, skipping all lookups in it.",
"Directory '/a/b/c/d/node_modules' does not exist, skipping all lookups in it.",
"Directory '/a/b/c/node_modules' does not exist, skipping all lookups in it.",
"File '/a/b/node_modules/foo.ts' does not exist.",
"File '/a/b/node_modules/foo.tsx' does not exist.",
"File '/a/b/node_modules/foo.d.ts' exists - use it as a name resolution result.",
"Resolving real path for '/a/b/node_modules/foo.d.ts', result '/a/b/node_modules/foo.d.ts'.",
"======== Module name 'foo' was successfully resolved to '/a/b/node_modules/foo.d.ts'. ========",
"File '/a/b/node_modules/foo/package.json' does not exist.",
"File '/a/b/node_modules/foo/index.ts' does not exist.",
"File '/a/b/node_modules/foo/index.tsx' does not exist.",
"File '/a/b/node_modules/foo/index.d.ts' exists - use it as a name resolution result.",
"Resolving real path for '/a/b/node_modules/foo/index.d.ts', result '/a/b/node_modules/foo/index.d.ts'.",
"======== Module name 'foo' was successfully resolved to '/a/b/node_modules/foo/index.d.ts'. ========",
"======== Resolving module 'foo' from '/a/b/c/lib.ts'. ========",
"Explicitly specified module resolution kind: 'Node10'.",
"Loading module 'foo' from 'node_modules' folder, target file types: TypeScript, Declaration.",
"Resolution for module 'foo' was found in cache from location '/a/b/c'.",
"======== Module name 'foo' was successfully resolved to '/a/b/node_modules/foo.d.ts'. ========"
"======== Module name 'foo' was successfully resolved to '/a/b/node_modules/foo/index.d.ts'. ========"
]
2 changes: 1 addition & 1 deletion tests/baselines/reference/cachedModuleResolution1.types
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
=== /a/b/node_modules/foo.d.ts ===
=== /a/b/node_modules/foo/index.d.ts ===
export declare let x: number
>x : number

Expand Down
2 changes: 1 addition & 1 deletion tests/baselines/reference/cachedModuleResolution2.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
//// [tests/cases/compiler/cachedModuleResolution2.ts] ////

//// [foo.d.ts]
//// [index.d.ts]
export declare let x: number

//// [lib.ts]
Expand Down
4 changes: 2 additions & 2 deletions tests/baselines/reference/cachedModuleResolution2.symbols
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
=== /a/b/node_modules/foo.d.ts ===
=== /a/b/node_modules/foo/index.d.ts ===
export declare let x: number
>x : Symbol(x, Decl(foo.d.ts, 0, 18))
>x : Symbol(x, Decl(index.d.ts, 0, 18))

=== /a/b/c/lib.ts ===
import {x} from "foo";
Expand Down
13 changes: 7 additions & 6 deletions tests/baselines/reference/cachedModuleResolution2.trace.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,17 @@
"Explicitly specified module resolution kind: 'Node10'.",
"Loading module 'foo' from 'node_modules' folder, target file types: TypeScript, Declaration.",
"Directory '/a/b/c/node_modules' does not exist, skipping all lookups in it.",
"File '/a/b/node_modules/foo.ts' does not exist.",
"File '/a/b/node_modules/foo.tsx' does not exist.",
"File '/a/b/node_modules/foo.d.ts' exists - use it as a name resolution result.",
"Resolving real path for '/a/b/node_modules/foo.d.ts', result '/a/b/node_modules/foo.d.ts'.",
"======== Module name 'foo' was successfully resolved to '/a/b/node_modules/foo.d.ts'. ========",
"File '/a/b/node_modules/foo/package.json' does not exist.",
"File '/a/b/node_modules/foo/index.ts' does not exist.",
"File '/a/b/node_modules/foo/index.tsx' does not exist.",
"File '/a/b/node_modules/foo/index.d.ts' exists - use it as a name resolution result.",
"Resolving real path for '/a/b/node_modules/foo/index.d.ts', result '/a/b/node_modules/foo/index.d.ts'.",
"======== Module name 'foo' was successfully resolved to '/a/b/node_modules/foo/index.d.ts'. ========",
"======== Resolving module 'foo' from '/a/b/c/d/e/app.ts'. ========",
"Explicitly specified module resolution kind: 'Node10'.",
"Loading module 'foo' from 'node_modules' folder, target file types: TypeScript, Declaration.",
"Directory '/a/b/c/d/e/node_modules' does not exist, skipping all lookups in it.",
"Directory '/a/b/c/d/node_modules' does not exist, skipping all lookups in it.",
"Resolution for module 'foo' was found in cache from location '/a/b/c'.",
"======== Module name 'foo' was successfully resolved to '/a/b/node_modules/foo.d.ts'. ========"
"======== Module name 'foo' was successfully resolved to '/a/b/node_modules/foo/index.d.ts'. ========"
]
2 changes: 1 addition & 1 deletion tests/baselines/reference/cachedModuleResolution2.types
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
=== /a/b/node_modules/foo.d.ts ===
=== /a/b/node_modules/foo/index.d.ts ===
export declare let x: number
>x : number

Expand Down
5 changes: 3 additions & 2 deletions tests/baselines/reference/cachedModuleResolution5.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
//// [tests/cases/compiler/cachedModuleResolution5.ts] ////

//// [foo.d.ts]
//// [index.d.ts]
export declare let x: number

//// [app.ts]
import {x} from "foo";

//// [lib.ts]
import {x} from "foo";
import {x} from "foo";


//// [app.js]
"use strict";
Expand Down
4 changes: 2 additions & 2 deletions tests/baselines/reference/cachedModuleResolution5.symbols
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
=== /a/b/node_modules/foo.d.ts ===
=== /a/b/node_modules/foo/index.d.ts ===
export declare let x: number
>x : Symbol(x, Decl(foo.d.ts, 0, 18))
>x : Symbol(x, Decl(index.d.ts, 0, 18))

=== /a/b/c/d/e/app.ts ===
import {x} from "foo";
Expand Down
13 changes: 7 additions & 6 deletions tests/baselines/reference/cachedModuleResolution5.trace.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@
"Directory '/a/b/c/d/e/node_modules' does not exist, skipping all lookups in it.",
"Directory '/a/b/c/d/node_modules' does not exist, skipping all lookups in it.",
"Directory '/a/b/c/node_modules' does not exist, skipping all lookups in it.",
"File '/a/b/node_modules/foo.ts' does not exist.",
"File '/a/b/node_modules/foo.tsx' does not exist.",
"File '/a/b/node_modules/foo.d.ts' exists - use it as a name resolution result.",
"Resolving real path for '/a/b/node_modules/foo.d.ts', result '/a/b/node_modules/foo.d.ts'.",
"======== Module name 'foo' was successfully resolved to '/a/b/node_modules/foo.d.ts'. ========",
"File '/a/b/node_modules/foo/package.json' does not exist.",
"File '/a/b/node_modules/foo/index.ts' does not exist.",
"File '/a/b/node_modules/foo/index.tsx' does not exist.",
"File '/a/b/node_modules/foo/index.d.ts' exists - use it as a name resolution result.",
"Resolving real path for '/a/b/node_modules/foo/index.d.ts', result '/a/b/node_modules/foo/index.d.ts'.",
"======== Module name 'foo' was successfully resolved to '/a/b/node_modules/foo/index.d.ts'. ========",
"======== Resolving module 'foo' from '/a/b/lib.ts'. ========",
"Explicitly specified module resolution kind: 'Node10'.",
"Loading module 'foo' from 'node_modules' folder, target file types: TypeScript, Declaration.",
"Resolution for module 'foo' was found in cache from location '/a/b'.",
"======== Module name 'foo' was successfully resolved to '/a/b/node_modules/foo.d.ts'. ========"
"======== Module name 'foo' was successfully resolved to '/a/b/node_modules/foo/index.d.ts'. ========"
]
2 changes: 1 addition & 1 deletion tests/baselines/reference/cachedModuleResolution5.types
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
=== /a/b/node_modules/foo.d.ts ===
=== /a/b/node_modules/foo/index.d.ts ===
export declare let x: number
>x : number

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@
"File '/package.json' does not exist.",
"Loading module 'lodash' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.",
"Found 'package.json' at '/node_modules/lodash/package.json'.",
"File '/node_modules/lodash.ts' does not exist.",
"File '/node_modules/lodash.tsx' does not exist.",
"File '/node_modules/lodash.d.ts' does not exist.",
"'package.json' does not have a 'typesVersions' field.",
"'package.json' does not have a 'typings' field.",
"'package.json' does not have a 'types' field.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,6 @@
"Module resolution kind is not specified, using 'Node10'.",
"Loading module 'a' from 'node_modules' folder, target file types: TypeScript, Declaration.",
"File '/node_modules/a/package.json' does not exist.",
"File '/node_modules/a.ts' does not exist.",
"File '/node_modules/a.tsx' does not exist.",
"File '/node_modules/a.d.ts' does not exist.",
"File '/node_modules/a/index.ts' does not exist.",
"File '/node_modules/a/index.tsx' does not exist.",
"File '/node_modules/a/index.d.ts' exists - use it as a name resolution result.",
Expand All @@ -33,9 +30,6 @@
"Module resolution kind is not specified, using 'Node10'.",
"Loading module 'foo' from 'node_modules' folder, target file types: TypeScript, Declaration.",
"Found 'package.json' at '/node_modules/a/node_modules/foo/package.json'.",
"File '/node_modules/a/node_modules/foo.ts' does not exist.",
"File '/node_modules/a/node_modules/foo.tsx' does not exist.",
"File '/node_modules/a/node_modules/foo.d.ts' does not exist.",
"'package.json' does not have a 'typesVersions' field.",
"'package.json' does not have a 'typings' field.",
"'package.json' does not have a 'types' field.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,6 @@
"Module resolution kind is not specified, using 'Node10'.",
"Loading module 'a' from 'node_modules' folder, target file types: TypeScript, Declaration.",
"File '/node_modules/a/package.json' does not exist.",
"File '/node_modules/a.ts' does not exist.",
"File '/node_modules/a.tsx' does not exist.",
"File '/node_modules/a.d.ts' does not exist.",
"File '/node_modules/a/index.ts' does not exist.",
"File '/node_modules/a/index.tsx' does not exist.",
"File '/node_modules/a/index.d.ts' exists - use it as a name resolution result.",
Expand All @@ -33,9 +30,6 @@
"Module resolution kind is not specified, using 'Node10'.",
"Loading module '@foo/bar' from 'node_modules' folder, target file types: TypeScript, Declaration.",
"Found 'package.json' at '/node_modules/a/node_modules/@foo/bar/package.json'.",
"File '/node_modules/a/node_modules/@foo/bar.ts' does not exist.",
"File '/node_modules/a/node_modules/@foo/bar.tsx' does not exist.",
"File '/node_modules/a/node_modules/@foo/bar.d.ts' does not exist.",
"'package.json' does not have a 'typesVersions' field.",
"'package.json' does not have a 'typings' field.",
"'package.json' does not have a 'types' field.",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
//// [tests/cases/compiler/importShouldNotBeElidedInDeclarationEmit.ts] ////

//// [umd.d.ts]
//// [index.d.ts]
export as namespace UMD;

export type Thing = {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
=== tests/cases/compiler/node_modules/umd.d.ts ===
=== tests/cases/compiler/node_modules/umd/index.d.ts ===
export as namespace UMD;
>UMD : Symbol(UMD, Decl(umd.d.ts, 0, 0))
>UMD : Symbol(UMD, Decl(index.d.ts, 0, 0))

export type Thing = {
>Thing : Symbol(Thing, Decl(umd.d.ts, 0, 24))
>Thing : Symbol(Thing, Decl(index.d.ts, 0, 24))

a: number;
>a : Symbol(a, Decl(umd.d.ts, 2, 21))
>a : Symbol(a, Decl(index.d.ts, 2, 21))
}

export declare function makeThing(): Thing;
>makeThing : Symbol(makeThing, Decl(umd.d.ts, 4, 1))
>Thing : Symbol(Thing, Decl(umd.d.ts, 0, 24))
>makeThing : Symbol(makeThing, Decl(index.d.ts, 4, 1))
>Thing : Symbol(Thing, Decl(index.d.ts, 0, 24))

=== tests/cases/compiler/index.ts ===
import { makeThing } from "umd";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
=== tests/cases/compiler/node_modules/umd.d.ts ===
=== tests/cases/compiler/node_modules/umd/index.d.ts ===
export as namespace UMD;
>UMD : typeof import("tests/cases/compiler/node_modules/umd")
>UMD : typeof import("tests/cases/compiler/node_modules/umd/index")

export type Thing = {
>Thing : { a: number; }
Expand All @@ -14,10 +14,10 @@ export declare function makeThing(): Thing;

=== tests/cases/compiler/index.ts ===
import { makeThing } from "umd";
>makeThing : () => import("tests/cases/compiler/node_modules/umd").Thing
>makeThing : () => import("tests/cases/compiler/node_modules/umd/index").Thing

export const thing = makeThing();
>thing : import("tests/cases/compiler/node_modules/umd").Thing
>makeThing() : import("tests/cases/compiler/node_modules/umd").Thing
>makeThing : () => import("tests/cases/compiler/node_modules/umd").Thing
>thing : import("tests/cases/compiler/node_modules/umd/index").Thing
>makeThing() : import("tests/cases/compiler/node_modules/umd/index").Thing
>makeThing : () => import("tests/cases/compiler/node_modules/umd/index").Thing

1 change: 0 additions & 1 deletion tests/baselines/reference/library-reference-11.trace.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
"Looking up in 'node_modules' folder, initial location '/a/b'.",
"Directory '/a/b/node_modules' does not exist, skipping all lookups in it.",
"Found 'package.json' at '/a/node_modules/jquery/package.json'.",
"File '/a/node_modules/jquery.d.ts' does not exist.",
"'package.json' does not have a 'typesVersions' field.",
"'package.json' has 'typings' field 'jquery.d.ts' that references '/a/node_modules/jquery/jquery.d.ts'.",
"File '/a/node_modules/jquery/jquery.d.ts' exists - use it as a name resolution result.",
Expand Down
1 change: 0 additions & 1 deletion tests/baselines/reference/library-reference-12.trace.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
"Looking up in 'node_modules' folder, initial location '/a/b'.",
"Directory '/a/b/node_modules' does not exist, skipping all lookups in it.",
"Found 'package.json' at '/a/node_modules/jquery/package.json'.",
"File '/a/node_modules/jquery.d.ts' does not exist.",
"'package.json' does not have a 'typesVersions' field.",
"'package.json' does not have a 'typings' field.",
"'package.json' has 'types' field 'dist/jquery.d.ts' that references '/a/node_modules/jquery/dist/jquery.d.ts'.",
Expand Down
1 change: 0 additions & 1 deletion tests/baselines/reference/library-reference-3.trace.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
"Root directory cannot be determined, skipping primary search paths.",
"Looking up in 'node_modules' folder, initial location '/src'.",
"File '/src/node_modules/jquery/package.json' does not exist.",
"File '/src/node_modules/jquery.d.ts' does not exist.",
"File '/src/node_modules/jquery/index.d.ts' exists - use it as a name resolution result.",
"Resolving real path for '/src/node_modules/jquery/index.d.ts', result '/src/node_modules/jquery/index.d.ts'.",
"======== Type reference directive 'jquery' was successfully resolved to '/src/node_modules/jquery/index.d.ts', primary: false. ========"
Expand Down
Loading

0 comments on commit 5f96e29

Please sign in to comment.