Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/gohugoio/hugo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2020-10-05 14:34:14 +0300
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2020-11-03 15:04:37 +0300
commit85e4dd7370eae97ae367e596aa6a10ba42fd4b7c (patch)
tree23e739edbed24a62f842c1a3ebc1d9cb706ea8b7 /resources/jsconfig
parent3089fc0ba171be14670b19439bc2eab6b077b6c3 (diff)
Make js.Build fully support modules
Fixes #7816 Fixes #7777 Fixes #7916
Diffstat (limited to 'resources/jsconfig')
-rw-r--r--resources/jsconfig/jsconfig.go93
-rw-r--r--resources/jsconfig/jsconfig_test.go35
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)
+}