From b7ad607eba3214604597271a2e224e12358e86ad Mon Sep 17 00:00:00 2001 From: Howard Wu Date: Thu, 18 Sep 2025 14:58:26 +1200 Subject: [PATCH] feat: Expose InitAssets to allow projects initilize assets to another directory --- weft/assets.go | 57 +++++++++++++++++++++++++++------------------ weft/assets_test.go | 6 ++--- 2 files changed, 37 insertions(+), 26 deletions(-) diff --git a/weft/assets.go b/weft/assets.go index dc023fc..a586900 100644 --- a/weft/assets.go +++ b/weft/assets.go @@ -27,15 +27,21 @@ type asset struct { sri string } +// debug print helper (to skip `b`) +func (a asset) String() string { + return fmt.Sprintf("asset{path:%s, hashedPath:%s, mime:%s, fileType:%s, sri:%s}", a.path, a.hashedPath, a.mime, a.fileType, a.sri) +} + // assets is populated during init and then is only used for reading. -var assets = make(map[string]*asset) +var assets map[string]*asset // assetHashes maps asset filename to the corresponding hash-prefixed asset pathname. -var assetHashes = make(map[string]string) +var assetHashes map[string]string var assetError error func init() { - assetError = initAssets("assets/assets", "assets") + // optionally, one can call InitAssets() to re-init to another directory + assetError = InitAssets("assets/assets", "assets") } // As part of Subresource Integrity we need to calculate the hash of the asset, we do this when the asset is loaded into memory @@ -320,35 +326,40 @@ func loadAsset(file, prefix string) (*asset, error) { return &a, nil } -// initAssets loads all assets below dir into global maps. -func initAssets(dir, prefix string) error { +// InitAssets loads all assets below dir into global maps. +func InitAssets(dir, prefix string) error { var fileList []string - err := filepath.Walk(dir, func(path string, f os.FileInfo, err error) error { - fileList = append(fileList, path) - return nil - }) - if err != nil { - return err - } - - for _, v := range fileList { - fi, err := os.Stat(v) + assets = make(map[string]*asset) + assetHashes = make(map[string]string) + assetError = func() error { + err := filepath.Walk(dir, func(path string, f os.FileInfo, err error) error { + fileList = append(fileList, path) + return nil + }) if err != nil { return err } - switch mode := fi.Mode(); { - case mode.IsRegular(): - a, err := loadAsset(v, prefix) + for _, v := range fileList { + fi, err := os.Stat(v) if err != nil { return err } - assets[a.hashedPath] = a - assets[a.path] = a - assetHashes[a.path] = a.hashedPath + + switch mode := fi.Mode(); { + case mode.IsRegular(): + a, err := loadAsset(v, prefix) + if err != nil { + return err + } + assets[a.hashedPath] = a + assets[a.path] = a + assetHashes[a.path] = a.hashedPath + } } - } + return nil + }() - return nil + return assetError } diff --git a/weft/assets_test.go b/weft/assets_test.go index 7d33ccc..cb04c50 100644 --- a/weft/assets_test.go +++ b/weft/assets_test.go @@ -89,7 +89,7 @@ func TestLoadAssets(t *testing.T) { } func TestCreateSubResourceTag(t *testing.T) { - err := initAssets("testdata", "testdata") + err := InitAssets("testdata", "testdata") if err != nil { t.Error(err) } @@ -138,7 +138,7 @@ func TestCreateSubResourceTag(t *testing.T) { } func TestCreateSubResourcePreloadTag(t *testing.T) { - err := initAssets("testdata", "testdata") + err := InitAssets("testdata", "testdata") if err != nil { t.Error(err) } @@ -177,7 +177,7 @@ func TestCreateSubResourcePreloadTag(t *testing.T) { } func TestCreateImportTag(t *testing.T) { - err := initAssets("testdata", "testdata") + err := InitAssets("testdata", "testdata") if err != nil { t.Error(err) }