Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit fa506ac

Browse files
authoredNov 13, 2023
Merge pull request #342 from github/ts-support-package-main
Support main module configuration in `package.json`
2 parents fec3cdc + df0b8c0 commit fa506ac

File tree

7 files changed

+237
-20
lines changed

7 files changed

+237
-20
lines changed
 

‎languages/tree-sitter-stack-graphs-typescript/rust/npm_package.rs

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@
88
use serde::Deserialize;
99
use std::collections::HashMap;
1010
use std::path::Path;
11+
use std::path::PathBuf;
1112

1213
use stack_graphs::arena::Handle;
1314
use stack_graphs::graph::File;
1415
use stack_graphs::graph::StackGraph;
1516
use tree_sitter_stack_graphs::BuildError;
1617
use tree_sitter_stack_graphs::FileAnalyzer;
1718

19+
use crate::tsconfig::NormalizedRelativePath;
1820
use crate::util::*;
1921

2022
pub struct NpmPackageAnalyzer {}
@@ -74,16 +76,28 @@ impl FileAnalyzer for NpmPackageAnalyzer {
7476
};
7577

7678
// package definition
77-
let pkg_def = add_module_pops(
78-
graph,
79-
file,
80-
NON_REL_M_NS,
81-
Path::new(&npm_pkg.name),
82-
root,
83-
"npm_package.pkg_def",
84-
);
85-
let pkg_ref = add_push(graph, file, proj_scope, PKG_M_NS, "npm_package.pkg_ref");
86-
add_edge(graph, pkg_def, pkg_ref, 0);
79+
if !npm_pkg.name.is_empty() {
80+
let pkg_def = add_module_pops(
81+
graph,
82+
file,
83+
NON_REL_M_NS,
84+
Path::new(&npm_pkg.name),
85+
root,
86+
"npm_package.pkg_def",
87+
);
88+
let pkg_ref = add_push(graph, file, proj_scope, PKG_M_NS, "npm_package.pkg_ref");
89+
add_edge(graph, pkg_def, pkg_ref, 0);
90+
91+
let main = Some(npm_pkg.main)
92+
.filter(|main| !main.is_empty())
93+
.and_then(|main| NormalizedRelativePath::from_str(&main))
94+
.map(|p| p.into_path_buf())
95+
.unwrap_or(PathBuf::from("index"))
96+
.with_extension("");
97+
let main_ref =
98+
add_module_pushes(graph, file, M_NS, &main, proj_scope, "npm_package.main_ref");
99+
add_edge(graph, pkg_def, main_ref, 0);
100+
}
87101

88102
// dependencies (package references)
89103
for (i, (pkg_name, _)) in npm_pkg.dependencies.iter().enumerate() {
@@ -113,7 +127,10 @@ impl FileAnalyzer for NpmPackageAnalyzer {
113127
#[derive(Default, Debug, Clone, PartialEq, Deserialize)]
114128
#[serde(rename_all = "camelCase")]
115129
pub struct NpmPackage {
130+
#[serde(default)]
116131
pub name: String,
117132
#[serde(default)]
133+
pub main: String,
134+
#[serde(default)]
118135
pub dependencies: HashMap<String, serde_json::Value>,
119136
}

‎languages/tree-sitter-stack-graphs-typescript/rust/tsconfig.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -498,15 +498,15 @@ fn longest_common_prefix(left: &Path, right: &Path) -> Option<PathBuf> {
498498
Some(prefix)
499499
}
500500

501-
struct NormalizedRelativePath(PathBuf);
501+
pub(crate) struct NormalizedRelativePath(PathBuf);
502502

503503
impl NormalizedRelativePath {
504-
pub(self) fn from_str(path: &str) -> Option<Self> {
504+
pub(crate) fn from_str(path: &str) -> Option<Self> {
505505
Self::from_path(Path::new(path))
506506
}
507507

508508
/// Creates a new normalized, relative path from a path.
509-
pub(self) fn from_path(path: &Path) -> Option<Self> {
509+
pub(crate) fn from_path(path: &Path) -> Option<Self> {
510510
let mut np = PathBuf::new();
511511
let mut normal_components = 0usize;
512512
for c in path.components() {
@@ -538,18 +538,18 @@ impl NormalizedRelativePath {
538538
}
539539

540540
/// Returns if the relative path escapes to the parent.
541-
pub(self) fn escapes(&self) -> bool {
541+
pub(crate) fn escapes(&self) -> bool {
542542
self.0
543543
.components()
544544
.next()
545545
.map_or(false, |c| c == Component::ParentDir)
546546
}
547547

548-
pub(self) fn as_path(&self) -> &Path {
548+
pub(crate) fn as_path(&self) -> &Path {
549549
&self.0
550550
}
551551

552-
pub(self) fn into_path_buf(self) -> PathBuf {
552+
pub(crate) fn into_path_buf(self) -> PathBuf {
553553
self.0
554554
}
555555
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/* --- path: acme_foo/tsconfig.json --- */
2+
/* --- global: FILE_PATH=tsconfig.json --- */
3+
/* --- global: PROJECT_NAME=acme_foo --- */
4+
5+
{}
6+
7+
/* --- path: acme_foo/package.json --- */
8+
/* --- global: FILE_PATH=package.json --- */
9+
/* --- global: PROJECT_NAME=acme_foo --- */
10+
11+
{
12+
"name": "@acme/foo",
13+
"version": "1.0",
14+
"main": "./api"
15+
}
16+
17+
/* --- path: acme_foo/api.ts --- */
18+
/* --- global: FILE_PATH=api.ts --- */
19+
/* --- global: PROJECT_NAME=acme_foo --- */
20+
21+
export let x;
22+
23+
/* --- path: acme_foo/core.ts --- */
24+
/* --- global: FILE_PATH=core.ts --- */
25+
/* --- global: PROJECT_NAME=acme_foo --- */
26+
27+
export let x;
28+
29+
/* --- path: bar/tsconfig.json --- */
30+
/* --- global: FILE_PATH=tsconfig.json --- */
31+
/* --- global: PROJECT_NAME=bar --- */
32+
33+
{}
34+
35+
/* --- path: bar/package.json --- */
36+
/* --- global: FILE_PATH=package.json --- */
37+
/* --- global: PROJECT_NAME=bar --- */
38+
39+
{
40+
"name": "bar",
41+
"dependencies": {
42+
"@acme/foo": "1"
43+
}
44+
}
45+
46+
/* --- path: bar/app.ts --- */
47+
/* --- global: FILE_PATH=app.ts --- */
48+
/* --- global: PROJECT_NAME=bar --- */
49+
50+
import { x } from "@acme/foo/core"
51+
// ^ defined: 27
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/* --- path: foo/tsconfig.json --- */
2+
/* --- global: FILE_PATH=tsconfig.json --- */
3+
/* --- global: PROJECT_NAME=foo --- */
4+
5+
{}
6+
7+
/* --- path: foo/package.json --- */
8+
/* --- global: FILE_PATH=package.json --- */
9+
/* --- global: PROJECT_NAME=foo --- */
10+
11+
{
12+
"name": "foo",
13+
"version": "1.0"
14+
}
15+
16+
/* --- path: foo/impl.ts --- */
17+
/* --- global: FILE_PATH=impl.ts --- */
18+
/* --- global: PROJECT_NAME=foo --- */
19+
20+
export let x;
21+
22+
/* --- path: bar/tsconfig.json --- */
23+
/* --- global: FILE_PATH=tsconfig.json --- */
24+
/* --- global: PROJECT_NAME=bar --- */
25+
26+
{}
27+
28+
/* --- path: bar/package.json --- */
29+
/* --- global: FILE_PATH=package.json --- */
30+
/* --- global: PROJECT_NAME=bar --- */
31+
32+
{
33+
"name": "bar",
34+
"dependencies": {
35+
"foo": "1"
36+
}
37+
}
38+
39+
/* --- path: bar/app.ts --- */
40+
/* --- global: FILE_PATH=app.ts --- */
41+
/* --- global: PROJECT_NAME=bar --- */
42+
43+
import { x } from "foo"
44+
// ^ defined:
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/* --- path: acme_foo/tsconfig.json --- */
2+
/* --- global: FILE_PATH=tsconfig.json --- */
3+
/* --- global: PROJECT_NAME=acme_foo --- */
4+
5+
{}
6+
7+
/* --- path: acme_foo/package.json --- */
8+
/* --- global: FILE_PATH=package.json --- */
9+
/* --- global: PROJECT_NAME=acme_foo --- */
10+
11+
{
12+
"name": "@acme/foo",
13+
"version": "1.0",
14+
"main": "./api"
15+
}
16+
17+
/* --- path: acme_foo/api.ts --- */
18+
/* --- global: FILE_PATH=api.ts --- */
19+
/* --- global: PROJECT_NAME=acme_foo --- */
20+
21+
export let x;
22+
23+
/* --- path: acme_foo/core.ts --- */
24+
/* --- global: FILE_PATH=core.ts --- */
25+
/* --- global: PROJECT_NAME=acme_foo --- */
26+
27+
export let x;
28+
29+
/* --- path: bar/tsconfig.json --- */
30+
/* --- global: FILE_PATH=tsconfig.json --- */
31+
/* --- global: PROJECT_NAME=bar --- */
32+
33+
{}
34+
35+
/* --- path: bar/package.json --- */
36+
/* --- global: FILE_PATH=package.json --- */
37+
/* --- global: PROJECT_NAME=bar --- */
38+
39+
{
40+
"name": "bar",
41+
"dependencies": {
42+
"@acme/foo": "1"
43+
}
44+
}
45+
46+
/* --- path: bar/app.ts --- */
47+
/* --- global: FILE_PATH=app.ts --- */
48+
/* --- global: PROJECT_NAME=bar --- */
49+
50+
import { x } from "@acme/foo"
51+
// ^ defined: 21
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,40 @@
11
/* --- path: ./my_lib/package.json --- */
22
/* --- global: FILE_PATH=package.json --- */
33
/* --- global: PROJECT_NAME=my_lib --- */
4+
45
{
56
"name": "@my/lib"
67
}
78

89
/* --- path: ./my_lib/tsconfig.json --- */
910
/* --- global: FILE_PATH=tsconfig.json --- */
1011
/* --- global: PROJECT_NAME=my_lib --- */
11-
{
12-
}
12+
13+
{}
1314

1415
/* --- path: ./my_lib/src/foo.ts --- */
1516
/* --- global: FILE_PATH=src/foo.ts --- */
1617
/* --- global: PROJECT_NAME=my_lib --- */
18+
1719
export const bar = 42;
1820

1921
/* --- path: ./my_app/package.json --- */
2022
/* --- global: FILE_PATH=package.json --- */
2123
/* --- global: PROJECT_NAME=my_app --- */
24+
2225
{
2326
"name": "@my/app"
2427
}
2528

2629
/* --- path: ./my_app/tsconfig.json --- */
2730
/* --- global: FILE_PATH=tsconfig.json --- */
2831
/* --- global: PROJECT_NAME=my_app --- */
29-
{
30-
}
32+
33+
{}
3134

3235
/* --- path: ./my_app/src/index.ts --- */
3336
/* --- global: FILE_PATH=src/index.ts --- */
3437
/* --- global: PROJECT_NAME=my_app --- */
38+
3539
import { bar } from "@my/lib/foo";
3640
// ^ defined:
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/* --- path: foo/tsconfig.json --- */
2+
/* --- global: FILE_PATH=tsconfig.json --- */
3+
/* --- global: PROJECT_NAME=foo --- */
4+
5+
{}
6+
7+
/* --- path: foo/package.json --- */
8+
/* --- global: FILE_PATH=package.json --- */
9+
/* --- global: PROJECT_NAME=foo --- */
10+
11+
{
12+
"name": "foo",
13+
"version": "1.0"
14+
}
15+
16+
/* --- path: foo/index.ts --- */
17+
/* --- global: FILE_PATH=index.ts --- */
18+
/* --- global: PROJECT_NAME=foo --- */
19+
20+
export let x;
21+
22+
/* --- path: foo/impl.ts --- */
23+
/* --- global: FILE_PATH=impl.ts --- */
24+
/* --- global: PROJECT_NAME=foo --- */
25+
26+
export let x;
27+
28+
/* --- path: bar/tsconfig.json --- */
29+
/* --- global: FILE_PATH=tsconfig.json --- */
30+
/* --- global: PROJECT_NAME=bar --- */
31+
32+
{}
33+
34+
/* --- path: bar/package.json --- */
35+
/* --- global: FILE_PATH=package.json --- */
36+
/* --- global: PROJECT_NAME=bar --- */
37+
38+
{
39+
"name": "bar",
40+
"dependencies": {
41+
"foo": "1"
42+
}
43+
}
44+
45+
/* --- path: bar/app.ts --- */
46+
/* --- global: FILE_PATH=app.ts --- */
47+
/* --- global: PROJECT_NAME=bar --- */
48+
49+
import { x } from "foo"
50+
// ^ defined: 20

0 commit comments

Comments
 (0)
Please sign in to comment.