1
1
import assert from "node:assert" ;
2
- import { extractNpmSpecifier , getDependencyResolver , rewriteNpmImports } from "../src/npm.js" ;
3
- import { fromJsDelivrPath } from "../src/npm.js" ;
2
+ import { extractNpmSpecifier , parseNpmSpecifier } from "../src/npm.js" ;
3
+ import { fromJsDelivrPath , getDependencyResolver , resolveNpmImport , rewriteNpmImports } from "../src/npm.js" ;
4
4
import { relativePath } from "../src/path.js" ;
5
5
import { mockJsDelivr } from "./mocks/jsdelivr.js" ;
6
6
@@ -20,10 +20,62 @@ describe("getDependencyResolver(root, path, input)", () => {
20
20
} ) ;
21
21
} ) ;
22
22
23
+ describe ( "parseNpmSpecifier(specifier)" , ( ) => {
24
+ it ( "parses the name" , ( ) => {
25
+ assert . deepStrictEqual ( parseNpmSpecifier ( "d3-array" ) , { name : "d3-array" , range : undefined , path : undefined } ) ;
26
+ } ) ;
27
+ it ( "parses the name and range" , ( ) => {
28
+ assert . deepStrictEqual ( parseNpmSpecifier ( "d3-array@1" ) , { name : "d3-array" , range : "1" , path : undefined } ) ;
29
+ assert . deepStrictEqual ( parseNpmSpecifier ( "d3-array@latest" ) , { name : "d3-array" , range : "latest" , path : undefined } ) ;
30
+ } ) ;
31
+ it ( "parses the name and path" , ( ) => {
32
+ assert . deepStrictEqual ( parseNpmSpecifier ( "d3-array" ) , { name : "d3-array" , range : undefined , path : undefined } ) ;
33
+ assert . deepStrictEqual ( parseNpmSpecifier ( "d3-array/foo" ) , { name : "d3-array" , range : undefined , path : "foo" } ) ;
34
+ assert . deepStrictEqual ( parseNpmSpecifier ( "d3-array/foo/bar" ) , { name : "d3-array" , range : undefined , path : "foo/bar" } ) ; // prettier-ignore
35
+ assert . deepStrictEqual ( parseNpmSpecifier ( "d3-array/foo.js" ) , { name : "d3-array" , range : undefined , path : "foo.js" } ) ;
36
+ assert . deepStrictEqual ( parseNpmSpecifier ( "d3-array/foo/bar.js" ) , { name : "d3-array" , range : undefined , path : "foo/bar.js" } ) ; // prettier-ignore
37
+ assert . deepStrictEqual ( parseNpmSpecifier ( "d3-array/+esm" ) , { name : "d3-array" , range : undefined , path : "+esm" } ) ;
38
+ assert . deepStrictEqual ( parseNpmSpecifier ( "d3-array/foo.js/+esm" ) , { name : "d3-array" , range : undefined , path : "foo.js/+esm" } ) ; // prettier-ignore
39
+ assert . deepStrictEqual ( parseNpmSpecifier ( "d3-array/foo/bar.js/+esm" ) , { name : "d3-array" , range : undefined , path : "foo/bar.js/+esm" } ) ; // prettier-ignore
40
+ assert . deepStrictEqual ( parseNpmSpecifier ( "d3-array/foo/+esm" ) , { name : "d3-array" , range : undefined , path : "foo/+esm" } ) ; // prettier-ignore
41
+ assert . deepStrictEqual ( parseNpmSpecifier ( "d3-array/foo/bar/+esm" ) , { name : "d3-array" , range : undefined , path : "foo/bar/+esm" } ) ; // prettier-ignore
42
+ assert . deepStrictEqual ( parseNpmSpecifier ( "d3-array/" ) , { name : "d3-array" , range : undefined , path : "" } ) ;
43
+ } ) ;
44
+ it ( "parses the name, version, and path" , ( ) => {
45
+ assert . deepStrictEqual ( parseNpmSpecifier ( "d3-array@1/foo" ) , { name : "d3-array" , range : "1" , path : "foo" } ) ;
46
+ } ) ;
47
+ } ) ;
48
+
49
+ describe ( "resolveNpmImport(root, specifier)" , ( ) => {
50
+ mockJsDelivr ( ) ;
51
+ const root = "test/input/build/simple" ;
52
+ it ( "implicitly adds /_esm.js for specifiers without an extension" , async ( ) => {
53
+ assert . strictEqual ( await resolveNpmImport ( root , "d3-array" ) , "/_npm/[email protected] /_esm.js" ) ;
54
+ assert . strictEqual ( await resolveNpmImport ( root , "d3-array/src" ) , "/_npm/[email protected] /src._esm.js" ) ;
55
+ assert . strictEqual ( await resolveNpmImport ( root , "d3-array/foo+bar" ) , "/_npm/[email protected] /foo+bar._esm.js" ) ;
56
+ assert . strictEqual ( await resolveNpmImport ( root , "d3-array/foo+esm" ) , "/_npm/[email protected] /foo+esm._esm.js" ) ;
57
+ } ) ;
58
+ it ( "replaces /+esm with /_esm.js or ._esm.js" , async ( ) => {
59
+ assert . strictEqual ( await resolveNpmImport ( root , "d3-array/+esm" ) , "/_npm/[email protected] /_esm.js" ) ;
60
+ assert . strictEqual ( await resolveNpmImport ( root , "d3-array/src/+esm" ) , "/_npm/[email protected] /src._esm.js" ) ;
61
+ assert . strictEqual ( await resolveNpmImport ( root , "d3-array/src/index.js/+esm" ) , "/_npm/[email protected] /src/index.js._esm.js" ) ; // prettier-ignore
62
+ } ) ;
63
+ it ( "does not add /_esm.js if given a path with a file extension" , async ( ) => {
64
+ assert . strictEqual ( await resolveNpmImport ( root , "d3-array/src/index.js" ) , "/_npm/[email protected] /src/index.js" ) ;
65
+ } ) ;
66
+ it ( "does not add /_esm.js if given a path with a trailing slash" , async ( ) => {
67
+ assert . strictEqual ( await resolveNpmImport ( root , "d3-array/" ) , "/_npm/[email protected] /" ) ;
68
+ assert . strictEqual ( await resolveNpmImport ( root , "d3-array/src/" ) , "/_npm/[email protected] /src/" ) ;
69
+ } ) ;
70
+ } ) ;
71
+
23
72
describe ( "extractNpmSpecifier(path)" , ( ) => {
24
73
it ( "returns the npm specifier for the given local npm path" , ( ) => {
25
74
assert . strictEqual ( extractNpmSpecifier ( "/_npm/[email protected] /_esm.js" ) , "[email protected] /+esm" ) ;
26
75
assert . strictEqual ( extractNpmSpecifier ( "/_npm/[email protected] /dist/d3.js" ) , "[email protected] /dist/d3.js" ) ;
76
+ assert . strictEqual ( extractNpmSpecifier ( "/_npm/[email protected] /dist/d3.js._esm.js" ) , "[email protected] /dist/d3.js/+esm" ) ;
77
+ assert . strictEqual ( extractNpmSpecifier ( "/_npm/[email protected] /lite._esm.js" ) , "[email protected] /lite/+esm" ) ;
78
+ assert . strictEqual ( extractNpmSpecifier ( "/_npm/@uwdata/[email protected] /_esm.js" ) , "@uwdata/[email protected] /+esm" ) ;
27
79
} ) ;
28
80
it ( "throws if not given a local npm path" , ( ) => {
29
81
assert . throws ( ( ) => extractNpmSpecifier ( "/npm/[email protected] /+esm" ) , / i n v a l i d n p m p a t h / ) ;
@@ -35,6 +87,7 @@ describe("fromJsDelivrPath(path)", () => {
35
87
it ( "returns the local npm path for the given jsDelivr path" , ( ) => {
36
88
assert . strictEqual ( fromJsDelivrPath ( "/npm/[email protected] /+esm" ) , "/_npm/[email protected] /_esm.js" ) ;
37
89
assert . strictEqual ( fromJsDelivrPath ( "/npm/[email protected] /dist/d3.js" ) , "/_npm/[email protected] /dist/d3.js" ) ;
90
+ assert . strictEqual ( fromJsDelivrPath ( "/npm/[email protected] /dist/d3.js/+esm" ) , "/_npm/[email protected] /dist/d3.js._esm.js" ) ;
38
91
} ) ;
39
92
it ( "throws if not given a jsDelivr path" , ( ) => {
40
93
assert . throws ( ( ) => fromJsDelivrPath ( "/_npm/[email protected] /_esm.js" ) , / i n v a l i d j s D e l i v r p a t h / ) ;
0 commit comments