diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2020-10-05 14:34:14 +0300 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2020-11-03 15:04:37 +0300 |
commit | 85e4dd7370eae97ae367e596aa6a10ba42fd4b7c (patch) | |
tree | 23e739edbed24a62f842c1a3ebc1d9cb706ea8b7 /resources/jsconfig | |
parent | 3089fc0ba171be14670b19439bc2eab6b077b6c3 (diff) |
Make js.Build fully support modules
Fixes #7816
Fixes #7777
Fixes #7916
Diffstat (limited to 'resources/jsconfig')
-rw-r--r-- | resources/jsconfig/jsconfig.go | 93 | ||||
-rw-r--r-- | resources/jsconfig/jsconfig_test.go | 35 |
2 files changed, 128 insertions, 0 deletions
diff --git a/resources/jsconfig/jsconfig.go b/resources/jsconfig/jsconfig.go new file mode 100644 index 000000000..9b399bfe7 --- /dev/null +++ b/resources/jsconfig/jsconfig.go @@ -0,0 +1,93 @@ +// Copyright 2020 The Hugo Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jsconfig + +import ( + "path/filepath" + "sort" + "sync" +) + +// Builder builds a jsconfig.json file that, currently, is used only to assist +// intellinsense in editors. +type Builder struct { + sourceRootsMu sync.RWMutex + sourceRoots map[string]bool +} + +// NewBuilder creates a new Builder. +func NewBuilder() *Builder { + return &Builder{sourceRoots: make(map[string]bool)} +} + +// Build builds a new Config with paths relative to dir. +// This method is thread safe. +func (b *Builder) Build(dir string) *Config { + b.sourceRootsMu.RLock() + defer b.sourceRootsMu.RUnlock() + + if len(b.sourceRoots) == 0 { + return nil + } + conf := newJSConfig() + + var roots []string + for root := range b.sourceRoots { + rel, err := filepath.Rel(dir, filepath.Join(root, "*")) + if err == nil { + roots = append(roots, rel) + } + } + sort.Strings(roots) + conf.CompilerOptions.Paths["*"] = roots + + return conf +} + +// AddSourceRoot adds a new source root. +// This method is thread safe. +func (b *Builder) AddSourceRoot(root string) { + b.sourceRootsMu.RLock() + found := b.sourceRoots[root] + b.sourceRootsMu.RUnlock() + + if found { + return + } + + b.sourceRootsMu.Lock() + b.sourceRoots[root] = true + b.sourceRootsMu.Unlock() + +} + +// CompilerOptions holds compilerOptions for jsonconfig.json. +type CompilerOptions struct { + BaseURL string `json:"baseUrl"` + Paths map[string][]string `json:"paths"` +} + +// Config holds the data for jsconfig.json. +type Config struct { + CompilerOptions CompilerOptions `json:"compilerOptions"` +} + +func newJSConfig() *Config { + return &Config{ + CompilerOptions: CompilerOptions{ + BaseURL: ".", + Paths: make(map[string][]string), + }, + } +} diff --git a/resources/jsconfig/jsconfig_test.go b/resources/jsconfig/jsconfig_test.go new file mode 100644 index 000000000..9a9657843 --- /dev/null +++ b/resources/jsconfig/jsconfig_test.go @@ -0,0 +1,35 @@ +// Copyright 2020 The Hugo Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jsconfig + +import ( + "path/filepath" + "testing" + + qt "github.com/frankban/quicktest" +) + +func TestJsConfigBuilder(t *testing.T) { + c := qt.New(t) + + b := NewBuilder() + b.AddSourceRoot("/c/assets") + b.AddSourceRoot("/d/assets") + + 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(NewBuilder().Build("/a/b"), qt.IsNil) +} |