From a3d7b5fcc0aac293f565eea90b75cce9a8d73937 Mon Sep 17 00:00:00 2001 From: Utkarsh Verma Date: Sun, 20 Jun 2021 19:17:32 +0530 Subject: [PATCH] jsconfig: Add support for subdirectory mounts --- resources/jsconfig/jsconfig.go | 25 +++++++++---------- resources/jsconfig/jsconfig_test.go | 12 ++++++--- resources/resource_transformers/js/options.go | 2 +- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/resources/jsconfig/jsconfig.go b/resources/jsconfig/jsconfig.go index 1fd6d6103f0..f3631dd3828 100644 --- a/resources/jsconfig/jsconfig.go +++ b/resources/jsconfig/jsconfig.go @@ -15,7 +15,6 @@ package jsconfig import ( "path/filepath" - "sort" "sync" ) @@ -23,12 +22,12 @@ import ( // intellinsense in editors. type Builder struct { sourceRootsMu sync.RWMutex - sourceRoots map[string]bool + sourceRoots map[string]string } // NewBuilder creates a new Builder. func NewBuilder() *Builder { - return &Builder{sourceRoots: make(map[string]bool)} + return &Builder{sourceRoots: make(map[string]string)} } // Build builds a new Config with paths relative to dir. @@ -42,24 +41,24 @@ func (b *Builder) Build(dir string) *Config { } conf := newJSConfig() - var roots []string - for root := range b.sourceRoots { - rel, err := filepath.Rel(dir, filepath.Join(root, "*")) + paths := make(map[string][]string) + for sourceRoot, mountRoot := range b.sourceRoots { + rel, err := filepath.Rel(dir, filepath.Join(sourceRoot, "*")) if err == nil { - roots = append(roots, rel) + globPattern := filepath.Join(mountRoot, "*") + paths[globPattern] = append(paths[globPattern], rel) } } - sort.Strings(roots) - conf.CompilerOptions.Paths["*"] = roots + conf.CompilerOptions.Paths = paths return conf } -// AddSourceRoot adds a new source root. +// AddRoots adds a new source root and mount root. // This method is thread safe. -func (b *Builder) AddSourceRoot(root string) { +func (b *Builder) AddRoots(sourceRoot, mountRoot string) { b.sourceRootsMu.RLock() - found := b.sourceRoots[root] + _, found := b.sourceRoots[sourceRoot] b.sourceRootsMu.RUnlock() if found { @@ -67,7 +66,7 @@ func (b *Builder) AddSourceRoot(root string) { } b.sourceRootsMu.Lock() - b.sourceRoots[root] = true + b.sourceRoots[sourceRoot] = mountRoot b.sourceRootsMu.Unlock() } diff --git a/resources/jsconfig/jsconfig_test.go b/resources/jsconfig/jsconfig_test.go index 9a965784328..717597b3c5a 100644 --- a/resources/jsconfig/jsconfig_test.go +++ b/resources/jsconfig/jsconfig_test.go @@ -24,12 +24,18 @@ func TestJsConfigBuilder(t *testing.T) { c := qt.New(t) b := NewBuilder() - b.AddSourceRoot("/c/assets") - b.AddSourceRoot("/d/assets") + b.AddRoots("/c/assets", "") + b.AddRoots("/d/assets", "d") conf := b.Build("/a/b") c.Assert(conf.CompilerOptions.BaseURL, qt.Equals, ".") - c.Assert(conf.CompilerOptions.Paths["*"], qt.DeepEquals, []string{filepath.FromSlash("../../c/assets/*"), filepath.FromSlash("../../d/assets/*")}) + c.Assert( + conf.CompilerOptions.Paths, + qt.DeepEquals, + map[string][]string{ + "*": {filepath.FromSlash("../../c/assets/*")}, + "d/*": {filepath.FromSlash("../../d/assets/*")}, + }) c.Assert(NewBuilder().Build("/a/b"), qt.IsNil) } diff --git a/resources/resource_transformers/js/options.go b/resources/resource_transformers/js/options.go index 84f571f1798..30e7ad14741 100644 --- a/resources/resource_transformers/js/options.go +++ b/resources/resource_transformers/js/options.go @@ -217,7 +217,7 @@ func createBuildPlugins(c *Client, opts Options) ([]api.Plugin, error) { // This should be a small number of elements, and when // in server mode, we may get stale entries on renames etc., // but that shouldn't matter too much. - c.rs.JSConfigBuilder.AddSourceRoot(m.SourceRoot()) + c.rs.JSConfigBuilder.AddRoots(m.SourceRoot(), m.MountRoot()) return api.OnResolveResult{Path: m.Filename(), Namespace: nsImportHugo}, nil }