This mapping has 1 multi-map group: several pairings are equally correct there. The code view shows one arbitrary valid pairing, not the only one.

This mapping has 11 all-to-all groups: every node on one side corresponds to every node on the other, and none is deleted or inserted. Each member carries an all N:M badge; selecting one highlights all of its counterparts, in the tree and in the code view alike.

Code view:

A painting is a person's account of this edit as text, recorded independently of the node mapping - a rendering often has several equally defensible answers where the mapping has one. Deletions and insertions carry no position on the opposite side in a painting, so that panel draws no caret for them.

Before

…lines 1–42 unchanged (42 lines)
43
44const (
45 PrefixHugoVirtual = "__hu_v"
46 PrefixHugoMemory = "__hu_m"
47)
48
49var extensionToLoaderMap = map[string]api.Loader{
50 ".js": api.LoaderJS,
51 ".mjs": api.LoaderJS,
52 ".cjs": api.LoaderJS,
53 ".jsx": api.LoaderJSX,
54 ".ts": api.LoaderTS,
55 ".tsx": api.LoaderTSX,
56 ".css": api.LoaderCSS,
57 ".json": api.LoaderJSON,
58 ".txt": api.LoaderText,
59}
60
61// This is a common sub-set of ESBuild's default extensions.
62// We assume that imports of JSON, CSS etc. will be using their full
63// name with extension.
64var commonExtensions = []string{".js", ".ts", ".tsx", ".jsx"}
65
66// ResolveComponent resolves a component using the given resolver.
…lines 67–136 unchanged (70 lines)
137
138type fsResolver struct {
139 fs afero.Fs
140 resolved *hmaps.Cache[string, *hugofs.FileMeta]
141}
142
143func (r *fsResolver) resolveComponent(impPath string) *hugofs.FileMeta {
144 v, _ := r.resolved.GetOrCreate(impPath, func() (*hugofs.FileMeta, error) {
145 resolve := func(name string) (*hugofs.FileMeta, bool, bool) {
146 if fi, err := r.fs.Stat(name); err == nil {
147 return fi.(hugofs.FileMetaInfo).Meta(), true, fi.IsDir()
148 }
149 return nil, false, false
150 }
151 v, _ := ResolveComponent(impPath, resolve)
152 return v, nil
153 })
154 return v
155}
156
157func createBuildPlugins(rs *resources.Spec, assetsResolver *fsResolver, depsManager identity.Manager, opts Options) ([]api.Plugin, error) {
158 fs := rs.Assets
159
160 resolveImport := func(args api.OnResolveArgs) (api.OnResolveResult, error) {
161 impPath := args.Path
162 shimmed := false
163 if opts.Shims != nil {
164 override, found := opts.Shims[impPath]
165 if found {
166 impPath = override
167 shimmed = true
168 }
…lines 169–203 unchanged (35 lines)
204 relDir = filepath.Dir(rel)
205 }
206 }
207 } else {
208 relDir = opts.SourceDir
209 }
210
211 // Imports not starting with a "." is assumed to live relative to /assets.
212 // Hugo makes no assumptions about the directory structure below /assets.
213 if relDir != "" && strings.HasPrefix(impPath, ".") {
214 impPath = filepath.Join(relDir, impPath)
215 }
216
217 m := assetsResolver.resolveComponent(impPath)
218
219 if m != nil {
220 depsManager.AddIdentity(m.PathInfo)
221
222 // Store the source root so we can create a jsconfig.json
223 // to help IntelliSense when the build is done.
224 // This should be a small number of elements, and when
225 // in server mode, we may get stale entries on renames etc.,
226 // but that shouldn't matter too much.
227 rs.JSConfigBuilder.AddSourceRoot(m.SourceRoot)
228 return api.OnResolveResult{Path: m.Filename, Namespace: NsHugoImport}, nil
229 }
230
231 // Fall back to ESBuild's resolve.
232 return api.OnResolveResult{}, nil
233 }
…lines 234–324 unchanged (91 lines)

After

…lines 1–42 unchanged (42 lines)
43
44const (
45 PrefixHugoVirtual = "__hu_v"
46 PrefixHugoMemory = "__hu_m"
47)
48
49var extensionToLoaderMapJS = map[string]api.Loader{
50 ".js": api.LoaderJS,
51 ".mjs": api.LoaderJS,
52 ".cjs": api.LoaderJS,
53 ".jsx": api.LoaderJSX,
54 ".ts": api.LoaderTS,
55 ".tsx": api.LoaderTSX,
56 ".json": api.LoaderJSON,
57 ".txt": api.LoaderText,
58 ".css": api.LoaderCSS,
59}
60
61var extensionToLoaderMapCSS = map[string]api.Loader{
62 ".css": api.LoaderCSS,
63}
64
65// This is a common sub-set of ESBuild's default extensions.
66// We assume that imports of JSON, CSS etc. will be using their full
67// name with extension.
68var commonExtensions = []string{".js", ".ts", ".tsx", ".jsx"}
69
…lines 70–141 unchanged (72 lines)
142
143type fsResolver struct {
144 fs afero.Fs
145 resolved *hmaps.Cache[string, *hugofs.FileMeta]
146}
147
148func (r *fsResolver) resolveComponent(impPath string, direct bool) *hugofs.FileMeta {
149 v, _ := r.resolved.GetOrCreate(impPath, func() (*hugofs.FileMeta, error) {
150 resolve := func(name string) (*hugofs.FileMeta, bool, bool) {
151 if fi, err := r.fs.Stat(name); err == nil {
152 return fi.(hugofs.FileMetaInfo).Meta(), true, fi.IsDir()
153 }
154 return nil, false, false
155 }
156 if direct {
157 // Only resolve the path as is, without trying to add extensions etc.
158 v, found, isDir := resolve(impPath)
159 if found && !isDir {
160 return v, nil
161 }
162 return nil, nil
163 }
164 v, _ := ResolveComponent(impPath, resolve)
165 return v, nil
166 })
167 return v
168}
169
170func createBuildPlugins(rs *resources.Spec, assetsResolver *fsResolver, depsManager identity.Manager, opts Options) ([]api.Plugin, error) {
171 fs := rs.Assets
172
173 resolveImport := func(args api.OnResolveArgs) (api.OnResolveResult, error) {
174 impPath := args.Path
175 isCSSToken := args.Kind == api.ResolveCSSImportRule || args.Kind == api.ResolveCSSURLToken
176
177 shimmed := false
178 if opts.Shims != nil {
179 override, found := opts.Shims[impPath]
180 if found {
181 impPath = override
…lines 182–218 unchanged (37 lines)
219 relDir = filepath.Dir(rel)
220 }
221 }
222 } else {
223 relDir = opts.SourceDir
224 }
225
226 var pathsToTry []string
227
228 if relDir != "" {
229 // For JS imports not starting with a "." is assumed to live relative to /assets.
230 // Hugo makes no assumptions about the directory structure below /assets.
231 if strings.HasPrefix(impPath, ".") {
232 pathsToTry = append(pathsToTry, filepath.Join(relDir, impPath))
233 } else if isCSSToken && !strings.HasPrefix(impPath, "/") {
234 // Follow the logic of both ESBuild and WebKit for CSS @import and url() tokens.
235 // First try the relativ path, then the assets relative path.
236 // See https://github.com/evanw/esbuild/issues/469
237 pathsToTry = append(pathsToTry, filepath.Join(relDir, impPath), impPath)
238 } else {
239 // Try only the assets relative path.
240 pathsToTry = append(pathsToTry, impPath)
241 }
242 }
243
244 var m *hugofs.FileMeta
245 for _, p := range pathsToTry {
246 m = assetsResolver.resolveComponent(p, isCSSToken)
247 if m != nil {
248 break
249 }
250 }
251
252 if m != nil {
253 depsManager.AddIdentity(m.PathInfo)
254
255 // jsconfig.json path mapping has no effect for CSS imports, so skip those.
256 if !isCSSToken {
257 // Store the source root so we can create a jsconfig.json
258 // to help IntelliSense when the build is done.
259 // This should be a small number of elements, and when
260 // in server mode, we may get stale entries on renames etc.,
261 // but that shouldn't matter too much.
262 rs.JSConfigBuilder.AddSourceRoot(m.SourceRoot)
263 }
264
265 return api.OnResolveResult{Path: m.Filename, Namespace: NsHugoImport}, nil
266 }
267
268 // Fall back to ESBuild's resolve.
269 return api.OnResolveResult{}, nil
…lines 270–361 unchanged (92 lines)

Before

source_file
comment "// Copyright 2024 The Hugo Authors. All rights reserved."
comment "//"
comment "// Licensed under the Apache License, Version 2.0 (the \"Lice"...
comment "// you may not use this file except in compliance with the L"...
comment "// You may obtain a copy of the License at"
comment "// http://www.apache.org/licenses/LICENSE-2.0"
comment "//"
comment "// Unless required by applicable law or agreed to in writing"...
comment "// distributed under the License is distributed on an \"AS IS"...
comment "// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either expr"...
comment "// See the License for the specific language governing permi"...
comment "// limitations under the License."
package_clause
package "package"
package_identifier "esbuild"
import_declaration (+70 nodes collapsed)
const_declaration (+44 nodes collapsed)
var_declaration (+22 nodes collapsed)
const_declaration
const "const"
( "("
const_spec
identifier "PrefixHugoVirtual"
= "="
expression_list
interpreted_string_literal
" "\""
interpreted_string_literal_content "__hu_v"
" "\""
const_spec
identifier "PrefixHugoMemory"
= "="
expression_list
interpreted_string_literal
" "\""
interpreted_string_literal_content "__hu_m"
" "\""
) ")"
var_declaration
var "var"
var_spec
identifier "extensionToLoaderMap"
= "="
expression_list
composite_literal
map_type
map "map"
[ "["
type_identifier "string"
] "]"
qualified_type
package_identifier "api"
. "."
type_identifier "Loader"
literal_value
{ "{"
keyed_element
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content ".js"
" "\""
: ":"
literal_element
selector_expression
identifier "api"
. "."
field_identifier "LoaderJS"
, ","
keyed_element
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content ".mjs"
" "\""
: ":"
literal_element
selector_expression
identifier "api"
. "."
field_identifier "LoaderJS"
, ","
keyed_element
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content ".cjs"
" "\""
: ":"
literal_element
selector_expression
identifier "api"
. "."
field_identifier "LoaderJS"
, ","
keyed_element
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content ".jsx"
" "\""
: ":"
literal_element
selector_expression
identifier "api"
. "."
field_identifier "LoaderJSX"
, ","
keyed_element
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content ".ts"
" "\""
: ":"
literal_element
selector_expression
identifier "api"
. "."
field_identifier "LoaderTS"
, ","
keyed_element
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content ".tsx"
" "\""
: ":"
literal_element
selector_expression
identifier "api"
. "."
field_identifier "LoaderTSX"
, ","
keyed_element
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content ".css"
" "\""
: ":"
literal_element
selector_expression
identifier "api"
. "."
field_identifier "LoaderCSS"
, ","
keyed_element
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content ".json"
" "\""
: ":"
literal_element
selector_expression
identifier "api"
. "."
field_identifier "LoaderJSON"
, ","
keyed_element
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content ".txt"
" "\""
: ":"
literal_element
selector_expression
identifier "api"
. "."
field_identifier "LoaderText"
, ","
} "}"
comment "// This is a common sub-set of ESBuild's default extensions."
comment "// We assume that imports of JSON, CSS etc. will be using th"...
comment "// name with extension."
var_declaration (+37 nodes collapsed)
comment "// ResolveComponent resolves a component using the given res"...
function_declaration (+393 nodes collapsed)
comment "// ResolveResource resolves a resource using the given resou"...
function_declaration (+118 nodes collapsed)
function_declaration (+62 nodes collapsed)
type_declaration (+37 nodes collapsed)
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "r"
pointer_type
* "*"
type_identifier "fsResolver"
) ")"
field_identifier "resolveComponent"
parameter_list
( "("
parameter_declaration
identifier "impPath"
type_identifier "string"
) ")"
pointer_type
* "*"
qualified_type
package_identifier "hugofs"
. "."
type_identifier "FileMeta"
block
{ "{"
statement_list
short_var_declaration
expression_list
identifier "v"
, ","
identifier "_"
:= ":="
expression_list
call_expression
selector_expression
selector_expression
identifier "r"
. "."
field_identifier "resolved"
. "."
field_identifier "GetOrCreate"
argument_list
( "("
identifier "impPath"
, ","
func_literal
func "func"
parameter_list
( "("
) ")"
parameter_list
( "("
parameter_declaration
pointer_type
* "*"
qualified_type
package_identifier "hugofs"
. "."
type_identifier "FileMeta"
, ","
parameter_declaration
type_identifier "error"
) ")"
block
{ "{"
statement_list
short_var_declaration (+101 nodes collapsed)
short_var_declaration
expression_list
identifier "v"
, ","
identifier "_"
:= ":="
expression_list
call_expression
identifier "ResolveComponent"
argument_list
( "("
identifier "impPath"
, ","
identifier "resolve"
) ")"
return_statement
return "return"
expression_list
identifier "v"
, ","
nil "nil"
} "}"
) ")"
return_statement
return "return"
expression_list
identifier "v"
} "}"
function_declaration
func "func"
identifier "createBuildPlugins"
parameter_list (+28 nodes collapsed)
parameter_list
( "("
parameter_declaration
slice_type
[ "["
] "]"
qualified_type
package_identifier "api"
. "."
type_identifier "Plugin"
, ","
parameter_declaration
type_identifier "error"
) ")"
block
{ "{"
statement_list
short_var_declaration
expression_list
identifier "fs"
:= ":="
expression_list
selector_expression
identifier "rs"
. "."
field_identifier "Assets"
short_var_declaration
expression_list
identifier "resolveImport"
:= ":="
expression_list
func_literal
func "func"
parameter_list
( "("
parameter_declaration
identifier "args"
qualified_type
package_identifier "api"
. "."
type_identifier "OnResolveArgs"
) ")"
parameter_list
( "("
parameter_declaration
qualified_type
package_identifier "api"
. "."
type_identifier "OnResolveResult"
, ","
parameter_declaration
type_identifier "error"
) ")"
block
{ "{"
statement_list
short_var_declaration
expression_list
identifier "impPath"
:= ":="
expression_list
selector_expression
identifier "args"
. "."
field_identifier "Path"
short_var_declaration
expression_list
identifier "shimmed"
:= ":="
expression_list
false "false"
if_statement (+47 nodes collapsed)
if_statement (+47 nodes collapsed)
if_statement (+68 nodes collapsed)
short_var_declaration
expression_list
identifier "importer"
:= ":="
expression_list
selector_expression
identifier "args"
. "."
field_identifier "Importer"
short_var_declaration
expression_list
identifier "isStdin"
:= ":="
expression_list
binary_expression
identifier "importer"
== "=="
identifier "stdinImporter"
var_declaration
var "var"
var_spec
identifier "relDir"
type_identifier "string"
if_statement (+151 nodes collapsed)
comment "// Imports not starting with a \".\" is assumed to live relati"...
comment "// Hugo makes no assumptions about the directory structure b"...
if_statement
if "if"
binary_expression any 2:1
binary_expression any 2:1
identifier "relDir"
!= "!="
interpreted_string_literal
" "\""
" "\""
&& "&&"
call_expression
selector_expression
identifier "strings"
. "."
field_identifier "HasPrefix"
argument_list
( "("
identifier "impPath"
, ","
interpreted_string_literal
" "\""
interpreted_string_literal_content "."
" "\""
) ")"
block
{ "{"
statement_list
assignment_statement
expression_list
identifier "impPath"
= "="
expression_list
call_expression all 1:2
selector_expression all 1:2
identifier "filepath" all 1:2
. "." all 1:2
field_identifier "Join" all 1:2
argument_list all 1:2
( "(" all 1:2
identifier "relDir" all 1:2
, "," all 1:2
identifier "impPath" all 1:2
) ")" all 1:2
} "}"
short_var_declaration
expression_list
identifier "m"
:= ":="
expression_list
call_expression
selector_expression
identifier "assetsResolver"
. "."
field_identifier "resolveComponent"
argument_list
( "("
identifier "impPath"
) ")"
if_statement
if "if"
binary_expression
identifier "m"
!= "!="
nil "nil"
block
{ "{"
statement_list
expression_statement
call_expression
selector_expression
identifier "depsManager"
. "."
field_identifier "AddIdentity"
argument_list
( "("
selector_expression
identifier "m"
. "."
field_identifier "PathInfo"
) ")"
comment "// Store the source root so we can create a jsconfig.json"
comment "// to help IntelliSense when the build is done."
comment "// This should be a small number of elements, and when"
comment "// in server mode, we may get stale entries on renames etc.,"
comment "// but that shouldn't matter too much."
expression_statement
call_expression
selector_expression
selector_expression
identifier "rs"
. "."
field_identifier "JSConfigBuilder"
. "."
field_identifier "AddSourceRoot"
argument_list
( "("
selector_expression
identifier "m"
. "."
field_identifier "SourceRoot"
) ")"
return_statement (+29 nodes collapsed)
} "}"
comment "// Fall back to ESBuild's resolve."
return_statement
return "return"
expression_list
composite_literal
qualified_type
package_identifier "api"
. "."
type_identifier "OnResolveResult"
literal_value
{ "{"
} "}"
, ","
nil "nil"
} "}"
short_var_declaration (+455 nodes collapsed)
short_var_declaration
expression_list
identifier "params"
:= ":="
expression_list
selector_expression
identifier "opts"
. "."
field_identifier "Params"
if_statement (+27 nodes collapsed)
short_var_declaration
expression_list
identifier "b"
, ","
identifier "err"
:= ":="
expression_list
call_expression
selector_expression
identifier "json"
. "."
field_identifier "Marshal"
argument_list
( "("
identifier "params"
) ")"
if_statement (+29 nodes collapsed)
short_var_declaration (+318 nodes collapsed)
return_statement (+21 nodes collapsed)
} "}"

After

source_file
comment "// Copyright 2024 The Hugo Authors. All rights reserved."
comment "//"
comment "// Licensed under the Apache License, Version 2.0 (the \"Lice"...
comment "// you may not use this file except in compliance with the L"...
comment "// You may obtain a copy of the License at"
comment "// http://www.apache.org/licenses/LICENSE-2.0"
comment "//"
comment "// Unless required by applicable law or agreed to in writing"...
comment "// distributed under the License is distributed on an \"AS IS"...
comment "// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either expr"...
comment "// See the License for the specific language governing permi"...
comment "// limitations under the License."
package_clause
package "package"
package_identifier "esbuild"
import_declaration (+70 nodes collapsed)
const_declaration (+44 nodes collapsed)
var_declaration (+22 nodes collapsed)
const_declaration
const "const"
( "("
const_spec
identifier "PrefixHugoVirtual"
= "="
expression_list
interpreted_string_literal
" "\""
interpreted_string_literal_content "__hu_v"
" "\""
const_spec
identifier "PrefixHugoMemory"
= "="
expression_list
interpreted_string_literal
" "\""
interpreted_string_literal_content "__hu_m"
" "\""
) ")"
var_declaration
var "var"
var_spec
identifier "extensionToLoaderMapJS"
= "="
expression_list
composite_literal
map_type
map "map"
[ "["
type_identifier "string"
] "]"
qualified_type
package_identifier "api"
. "."
type_identifier "Loader"
literal_value
{ "{"
keyed_element
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content ".js"
" "\""
: ":"
literal_element
selector_expression
identifier "api"
. "."
field_identifier "LoaderJS"
, ","
keyed_element
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content ".mjs"
" "\""
: ":"
literal_element
selector_expression
identifier "api"
. "."
field_identifier "LoaderJS"
, ","
keyed_element
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content ".cjs"
" "\""
: ":"
literal_element
selector_expression
identifier "api"
. "."
field_identifier "LoaderJS"
, ","
keyed_element
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content ".jsx"
" "\""
: ":"
literal_element
selector_expression
identifier "api"
. "."
field_identifier "LoaderJSX"
, ","
keyed_element
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content ".ts"
" "\""
: ":"
literal_element
selector_expression
identifier "api"
. "."
field_identifier "LoaderTS"
, ","
keyed_element
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content ".tsx"
" "\""
: ":"
literal_element
selector_expression
identifier "api"
. "."
field_identifier "LoaderTSX"
, ","
keyed_element
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content ".json"
" "\""
: ":"
literal_element
selector_expression
identifier "api"
. "."
field_identifier "LoaderJSON"
, ","
keyed_element
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content ".txt"
" "\""
: ":"
literal_element
selector_expression
identifier "api"
. "."
field_identifier "LoaderText"
, ","
keyed_element
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content ".css"
" "\""
: ":"
literal_element
selector_expression
identifier "api"
. "."
field_identifier "LoaderCSS"
, ","
} "}"
var_declaration
var "var"
var_spec
identifier "extensionToLoaderMapCSS"
= "="
expression_list
composite_literal
map_type
map "map"
[ "["
type_identifier "string"
] "]"
qualified_type
package_identifier "api"
. "."
type_identifier "Loader"
literal_value
{ "{"
keyed_element
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content ".css"
" "\""
: ":"
literal_element
selector_expression
identifier "api"
. "."
field_identifier "LoaderCSS"
, ","
} "}"
comment "// This is a common sub-set of ESBuild's default extensions."
comment "// We assume that imports of JSON, CSS etc. will be using th"...
comment "// name with extension."
var_declaration (+37 nodes collapsed)
comment "// ResolveComponent resolves a component using the given res"...
function_declaration (+393 nodes collapsed)
comment "// ResolveResource resolves a resource using the given resou"...
function_declaration (+118 nodes collapsed)
function_declaration (+62 nodes collapsed)
type_declaration (+37 nodes collapsed)
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "r"
pointer_type
* "*"
type_identifier "fsResolver"
) ")"
field_identifier "resolveComponent"
parameter_list
( "("
parameter_declaration
identifier "impPath"
type_identifier "string"
, ","
parameter_declaration
identifier "direct"
type_identifier "bool"
) ")"
pointer_type
* "*"
qualified_type
package_identifier "hugofs"
. "."
type_identifier "FileMeta"
block
{ "{"
statement_list
short_var_declaration
expression_list
identifier "v"
, ","
identifier "_"
:= ":="
expression_list
call_expression
selector_expression
selector_expression
identifier "r"
. "."
field_identifier "resolved"
. "."
field_identifier "GetOrCreate"
argument_list
( "("
identifier "impPath"
, ","
func_literal
func "func"
parameter_list
( "("
) ")"
parameter_list
( "("
parameter_declaration
pointer_type
* "*"
qualified_type
package_identifier "hugofs"
. "."
type_identifier "FileMeta"
, ","
parameter_declaration
type_identifier "error"
) ")"
block
{ "{"
statement_list
short_var_declaration (+101 nodes collapsed)
if_statement
if "if"
identifier "direct"
block
{ "{"
comment "// Only resolve the path as is, without trying to add extens"...
statement_list
short_var_declaration
expression_list
identifier "v"
, ","
identifier "found"
, ","
identifier "isDir"
:= ":="
expression_list
call_expression
identifier "resolve"
argument_list
( "("
identifier "impPath"
) ")"
if_statement
if "if"
binary_expression
identifier "found"
&& "&&"
unary_expression
! "!"
identifier "isDir"
block
{ "{"
statement_list
return_statement
return "return"
expression_list
identifier "v"
, ","
nil "nil"
} "}"
return_statement
return "return"
expression_list
nil "nil"
, ","
nil "nil"
} "}"
short_var_declaration
expression_list
identifier "v"
, ","
identifier "_"
:= ":="
expression_list
call_expression
identifier "ResolveComponent"
argument_list
( "("
identifier "impPath"
, ","
identifier "resolve"
) ")"
return_statement
return "return"
expression_list
identifier "v"
, ","
nil "nil"
} "}"
) ")"
return_statement
return "return"
expression_list
identifier "v"
} "}"
function_declaration
func "func"
identifier "createBuildPlugins"
parameter_list (+28 nodes collapsed)
parameter_list
( "("
parameter_declaration
slice_type
[ "["
] "]"
qualified_type
package_identifier "api"
. "."
type_identifier "Plugin"
, ","
parameter_declaration
type_identifier "error"
) ")"
block
{ "{"
statement_list
short_var_declaration
expression_list
identifier "fs"
:= ":="
expression_list
selector_expression
identifier "rs"
. "."
field_identifier "Assets"
short_var_declaration
expression_list
identifier "resolveImport"
:= ":="
expression_list
func_literal
func "func"
parameter_list
( "("
parameter_declaration
identifier "args"
qualified_type
package_identifier "api"
. "."
type_identifier "OnResolveArgs"
) ")"
parameter_list
( "("
parameter_declaration
qualified_type
package_identifier "api"
. "."
type_identifier "OnResolveResult"
, ","
parameter_declaration
type_identifier "error"
) ")"
block
{ "{"
statement_list
short_var_declaration
expression_list
identifier "impPath"
:= ":="
expression_list
selector_expression
identifier "args"
. "."
field_identifier "Path"
short_var_declaration
expression_list
identifier "isCSSToken"
:= ":="
expression_list
binary_expression
binary_expression
selector_expression
identifier "args"
. "."
field_identifier "Kind"
== "=="
selector_expression
identifier "api"
. "."
field_identifier "ResolveCSSImportRule"
|| "||"
binary_expression
selector_expression
identifier "args"
. "."
field_identifier "Kind"
== "=="
selector_expression
identifier "api"
. "."
field_identifier "ResolveCSSURLToken"
short_var_declaration
expression_list
identifier "shimmed"
:= ":="
expression_list
false "false"
if_statement (+47 nodes collapsed)
if_statement (+47 nodes collapsed)
if_statement (+68 nodes collapsed)
short_var_declaration
expression_list
identifier "importer"
:= ":="
expression_list
selector_expression
identifier "args"
. "."
field_identifier "Importer"
short_var_declaration
expression_list
identifier "isStdin"
:= ":="
expression_list
binary_expression
identifier "importer"
== "=="
identifier "stdinImporter"
var_declaration
var "var"
var_spec
identifier "relDir"
type_identifier "string"
if_statement (+151 nodes collapsed)
var_declaration
var "var"
var_spec
identifier "pathsToTry"
slice_type
[ "["
] "]"
type_identifier "string"
if_statement
if "if"
binary_expression any 2:1
identifier "relDir"
!= "!="
interpreted_string_literal
" "\""
" "\""
block
{ "{"
comment "// For JS imports not starting with a \".\" is assumed to live"...
comment "// Hugo makes no assumptions about the directory structure b"...
statement_list
if_statement
if "if"
call_expression
selector_expression
identifier "strings"
. "."
field_identifier "HasPrefix"
argument_list
( "("
identifier "impPath"
, ","
interpreted_string_literal
" "\""
interpreted_string_literal_content "."
" "\""
) ")"
block
{ "{"
statement_list
assignment_statement
expression_list
identifier "pathsToTry"
= "="
expression_list
call_expression
identifier "append"
argument_list
( "("
identifier "pathsToTry"
, ","
call_expression all 1:2
selector_expression all 1:2
identifier "filepath" all 1:2
. "." all 1:2
field_identifier "Join" all 1:2
argument_list all 1:2
( "(" all 1:2
identifier "relDir" all 1:2
, "," all 1:2
identifier "impPath" all 1:2
) ")" all 1:2
) ")"
} "}"
else "else"
if_statement
if "if"
binary_expression
identifier "isCSSToken"
&& "&&"
unary_expression
! "!"
call_expression
selector_expression
identifier "strings"
. "."
field_identifier "HasPrefix"
argument_list
( "("
identifier "impPath"
, ","
interpreted_string_literal
" "\""
interpreted_string_literal_content "/"
" "\""
) ")"
block
{ "{"
comment "// Follow the logic of both ESBuild and WebKit for CSS @impo"...
comment "// First try the relativ path, then the assets relative path"...
comment "// See https://github.com/evanw/esbuild/issues/469"
statement_list
assignment_statement
expression_list
identifier "pathsToTry"
= "="
expression_list
call_expression
identifier "append"
argument_list
( "("
identifier "pathsToTry"
, ","
call_expression all 1:2
selector_expression all 1:2
identifier "filepath" all 1:2
. "." all 1:2
field_identifier "Join" all 1:2
argument_list all 1:2
( "(" all 1:2
identifier "relDir" all 1:2
, "," all 1:2
identifier "impPath" all 1:2
) ")" all 1:2
, ","
identifier "impPath"
) ")"
} "}"
else "else"
block
{ "{"
comment "// Try only the assets relative path."
statement_list
assignment_statement
expression_list
identifier "pathsToTry"
= "="
expression_list
call_expression
identifier "append"
argument_list
( "("
identifier "pathsToTry"
, ","
identifier "impPath"
) ")"
} "}"
} "}"
var_declaration
var "var"
var_spec
identifier "m"
pointer_type
* "*"
qualified_type
package_identifier "hugofs"
. "."
type_identifier "FileMeta"
for_statement
for "for"
range_clause
expression_list
identifier "_"
, ","
identifier "p"
:= ":="
range "range"
identifier "pathsToTry"
block
{ "{"
statement_list
assignment_statement
expression_list
identifier "m"
= "="
expression_list
call_expression
selector_expression
identifier "assetsResolver"
. "."
field_identifier "resolveComponent"
argument_list
( "("
identifier "p"
, ","
identifier "isCSSToken"
) ")"
if_statement
if "if"
binary_expression
identifier "m"
!= "!="
nil "nil"
block
{ "{"
statement_list
break_statement
break "break"
} "}"
} "}"
if_statement
if "if"
binary_expression
identifier "m"
!= "!="
nil "nil"
block
{ "{"
statement_list
expression_statement
call_expression
selector_expression
identifier "depsManager"
. "."
field_identifier "AddIdentity"
argument_list
( "("
selector_expression
identifier "m"
. "."
field_identifier "PathInfo"
) ")"
comment "// jsconfig.json path mapping has no effect for CSS imports"...
if_statement
if "if"
unary_expression
! "!"
identifier "isCSSToken"
block
{ "{"
comment "// Store the source root so we can create a jsconfig.json"
comment "// to help IntelliSense when the build is done."
comment "// This should be a small number of elements, and when"
comment "// in server mode, we may get stale entries on renames etc.,"
comment "// but that shouldn't matter too much."
statement_list
expression_statement
call_expression
selector_expression
selector_expression
identifier "rs"
. "."
field_identifier "JSConfigBuilder"
. "."
field_identifier "AddSourceRoot"
argument_list
( "("
selector_expression
identifier "m"
. "."
field_identifier "SourceRoot"
) ")"
} "}"
return_statement (+29 nodes collapsed)
} "}"
comment "// Fall back to ESBuild's resolve."
return_statement
return "return"
expression_list
composite_literal
qualified_type
package_identifier "api"
. "."
type_identifier "OnResolveResult"
literal_value
{ "{"
} "}"
, ","
nil "nil"
} "}"
short_var_declaration (+455 nodes collapsed)
short_var_declaration
expression_list
identifier "params"
:= ":="
expression_list
selector_expression
identifier "opts"
. "."
field_identifier "Params"
if_statement (+27 nodes collapsed)
short_var_declaration
expression_list
identifier "b"
, ","
identifier "err"
:= ":="
expression_list
call_expression
selector_expression
identifier "json"
. "."
field_identifier "Marshal"
argument_list
( "("
identifier "params"
) ")"
if_statement (+29 nodes collapsed)
short_var_declaration (+318 nodes collapsed)
return_statement (+21 nodes collapsed)
} "}"