blob: 54318623ed6053201891721a37b4e0aacea70355 [file] [log] [blame]
Earl Lee2e463fb2025-04-17 11:22:22 -07001package webui
2
3import (
4 "bytes"
5 "fmt"
6 "io/fs"
7 "time"
8)
9
10// memFS implements fs.FS in-memory.
11type memFS struct {
12 m map[string][]byte
13}
14
15func (m memFS) Open(name string) (fs.File, error) {
16 b, found := m.m[name]
17 if !found {
18 return nil, fmt.Errorf("esbuild.memFS(%q): %w", name, fs.ErrNotExist)
19 }
20 return &memFile{name: name, Reader: *bytes.NewReader(b)}, nil
21}
22
23func (m memFS) ReadFile(name string) ([]byte, error) {
24 b, found := m.m[name]
25 if !found {
26 return nil, fmt.Errorf("esbuild.memFS.ReadFile(%q): %w", name, fs.ErrNotExist)
27 }
28 return append(make([]byte, 0, len(b)), b...), nil
29}
30
31// memFile implements fs.File in-memory.
32type memFile struct {
33 // embedding is very important here because need more than
34 // Read, we need Seek to make http.ServeContent happy.
35 bytes.Reader
36 name string
37}
38
39func (f *memFile) Stat() (fs.FileInfo, error) { return &memFileInfo{f: f}, nil }
40func (f *memFile) Close() error { return nil }
41
42var start = time.Now()
43
44type memFileInfo struct {
45 f *memFile
46}
47
48func (i memFileInfo) Name() string { return i.f.name }
49func (i memFileInfo) Size() int64 { return i.f.Reader.Size() }
50func (i memFileInfo) Mode() fs.FileMode { return 0o444 }
51func (i memFileInfo) ModTime() time.Time { return start }
52func (i memFileInfo) IsDir() bool { return false }
53func (i memFileInfo) Sys() any { return nil }