Skip to content

Commit

Permalink
feat(libsvelte): improving api.
Browse files Browse the repository at this point in the history
  • Loading branch information
razshare committed Jan 12, 2025
1 parent 8c2cca7 commit 29197b9
Show file tree
Hide file tree
Showing 27 changed files with 151 additions and 183 deletions.
2 changes: 1 addition & 1 deletion libfs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (

//go:embed libfs.go
//go:embed .github
//go:embed www/dist/*
//go:embed www/dist/*/**
var embeddedFileSystem embed.FS

func TestEmbeddedExists(test *testing.T) {
Expand Down
28 changes: 28 additions & 0 deletions libserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"net/http"
"os"
"path/filepath"
"rogchap.com/v8go"
"strings"
"sync"
"time"
Expand Down Expand Up @@ -320,6 +321,33 @@ func ServerStop(self *Server) {
}
}

// ServerSetSveltePage sets a request handler for the given pattern,
// tries to serve any file found in www/dist/client and finally serves the
// given svelte page if no file is found.
func ServerSetSveltePage(self *Server, ssr bool, pattern string, pageId string, globals map[string]v8go.FunctionCallback) {
ServerOnRequest(self, pattern, func(server *Server, request *Request, response *Response) {
EmbeddedFileOrElse(request, response, func() {
FileOrElse(request, response, func() {
if nil == globals {
globals = map[string]v8go.FunctionCallback{}
}

SveltePage(response, &SveltePageOptions{
Ssr: ssr,
Props: map[string]interface{}{
"page": pageId,
"header": request.HttpRequest.Header,
"multipartForm": request.HttpRequest.MultipartForm,
"form": request.HttpRequest.Form,
"postForm": request.HttpRequest.PostForm,
},
Globals: globals,
})
})
})
})
}

// ServerOnRequest registers a handler function for the given pattern.
//
// If the given pattern conflicts with one that is already registered, ServerOnRequest panics.
Expand Down
126 changes: 67 additions & 59 deletions libsvelte.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,100 +15,88 @@ import (
var svelteRenderToolsFileSystem embed.FS

func SveltePrepareStart() {
asyncSvelte, asyncSvelteError := svelteRenderToolsFileSystem.ReadFile("vite-project/async.svelte")
if asyncSvelteError != nil {
panic(asyncSvelteError)
}

indexHtml, indexHtmlError := svelteRenderToolsFileSystem.ReadFile("vite-project/index.html")
if indexHtmlError != nil {
panic(indexHtmlError)
}
indexHtmlSpa, indexHtmlSpaError := svelteRenderToolsFileSystem.ReadFile("vite-project/index.spa.html")
if indexHtmlSpaError != nil {
panic(indexHtmlSpaError)
}

renderClientJs, renderClientJsError := svelteRenderToolsFileSystem.ReadFile("vite-project/render.client.js")
if renderClientJsError != nil {
panic(renderClientJsError)
}
renderClientSpaJs, renderClientSpaJsError := svelteRenderToolsFileSystem.ReadFile("vite-project/render.client.spa.js")
if renderClientSpaJsError != nil {
panic(renderClientSpaJsError)
}
renderClientSpaSvelte, renderClientSpaSvelteError := svelteRenderToolsFileSystem.ReadFile("vite-project/render.client.svelte")

renderClientSvelte, renderClientSpaSvelteError := svelteRenderToolsFileSystem.ReadFile("vite-project/render.client.svelte")
if renderClientSpaSvelteError != nil {
panic(renderClientSpaSvelteError)
}

renderServerJs, renderServerJsError := svelteRenderToolsFileSystem.ReadFile("vite-project/render.server.js")
if renderServerJsError != nil {
panic(renderServerJsError)
}

renderServerSvelte, renderServerSvelteError := svelteRenderToolsFileSystem.ReadFile("vite-project/render.server.svelte")
if renderServerSvelteError != nil {
panic(renderServerSvelteError)
}
asyncSvelte, asyncSvelteError := svelteRenderToolsFileSystem.ReadFile("vite-project/async.svelte")
if asyncSvelteError != nil {
panic(asyncSvelteError)
}

if !Exists("www/frizzante/vite-project") {
err := os.MkdirAll("www/frizzante/vite-project", os.ModePerm)
if !Exists("www/.frizzante/vite-project") {
err := os.MkdirAll("www/.frizzante/vite-project", os.ModePerm)
if err != nil {
panic(err)
}
}

err := os.WriteFile("www/frizzante/vite-project/index.html", indexHtml, os.ModePerm)
err := os.WriteFile("www/.frizzante/vite-project/async.svelte", asyncSvelte, os.ModePerm)
if err != nil {
panic(err)
}

err = os.WriteFile("www/frizzante/vite-project/index.spa.html", indexHtmlSpa, os.ModePerm)
err = os.WriteFile("www/.frizzante/vite-project/index.html", indexHtml, os.ModePerm)
if err != nil {
panic(err)
}

err = os.WriteFile("www/frizzante/vite-project/render.client.js", renderClientJs, os.ModePerm)
err = os.WriteFile("www/.frizzante/vite-project/render.client.js", renderClientJs, os.ModePerm)
if err != nil {
panic(err)
}

err = os.WriteFile("www/frizzante/vite-project/render.client.spa.js", renderClientSpaJs, os.ModePerm)
err = os.WriteFile("www/.frizzante/vite-project/render.client.svelte", renderClientSvelte, os.ModePerm)
if err != nil {
panic(err)
}

err = os.WriteFile("www/frizzante/vite-project/render.client.spa.svelte", renderClientSpaSvelte, os.ModePerm)
err = os.WriteFile("www/.frizzante/vite-project/render.server.js", renderServerJs, os.ModePerm)
if err != nil {
panic(err)
}

err = os.WriteFile("www/frizzante/vite-project/render.server.js", renderServerJs, os.ModePerm)
err = os.WriteFile("www/.frizzante/vite-project/render.server.svelte", renderServerSvelte, os.ModePerm)
if err != nil {
panic(err)
}

err = os.WriteFile("www/frizzante/vite-project/render.server.svelte", renderServerSvelte, os.ModePerm)
if err != nil {
panic(err)
}

err = os.WriteFile("www/frizzante/vite-project/async.svelte", asyncSvelte, os.ModePerm)
if err != nil {
panic(err)
}
}

var sveltePages = map[string]string{}

func SveltePreparePage(id string, fileName string) {
relativeFileName, err := filepath.Rel("www/frizzante/vite-project", fileName)
relativeFileName, err := filepath.Rel("www/.frizzante/vite-project", fileName)
if err != nil {
panic(err)
}
sveltePages[id] = fmt.Sprintf("./%s", relativeFileName)
}

func SveltePrepareEnd() {
if !Exists("www/frizzante/vite-project") {
err := os.MkdirAll("www/frizzante/vite-project", os.ModePerm)
if !Exists("www/.frizzante/vite-project") {
err := os.MkdirAll("www/.frizzante/vite-project", os.ModePerm)
if err != nil {
panic(err)
}
Expand Down Expand Up @@ -136,7 +124,7 @@ func SveltePrepareEnd() {
renderClientSvelte := builder.String()

// Dump client loader.
err := os.WriteFile("www/frizzante/vite-project/render.client.svelte", []byte(renderClientSvelte), os.ModePerm)
err := os.WriteFile("www/.frizzante/vite-project/render.client.svelte", []byte(renderClientSvelte), os.ModePerm)
if err != nil {
panic(err)
}
Expand Down Expand Up @@ -165,13 +153,13 @@ func SveltePrepareEnd() {
renderServerSvelte := builder.String()

// Dump server loader.
err = os.WriteFile("www/frizzante/vite-project/render.server.svelte", []byte(renderServerSvelte), os.ModePerm)
err = os.WriteFile("www/.frizzante/vite-project/render.server.svelte", []byte(renderServerSvelte), os.ModePerm)
if err != nil {
panic(err)
}
}

func render(response *Response, stringProps string) (string, string, error) {
func render(response *Response, stringProps string, globals map[string]v8go.FunctionCallback) (string, string, error) {
renderFileName := filepath.Join("www", "dist", "server", "render.server.js")

renderEsmBytes, readError := response.server.embeddedFileSystem.ReadFile(renderFileName)
Expand Down Expand Up @@ -207,24 +195,41 @@ func render(response *Response, stringProps string) (string, string, error) {

head := ""
body := ""
_, destroy, javaScriptError := JavaScriptRun(
doneCjs, map[string]v8go.FunctionCallback{
"head": func(info *v8go.FunctionCallbackInfo) *v8go.Value {
args := info.Args()
if len(args) > 0 {
head = args[0].String()
}
return nil
},
"body": func(info *v8go.FunctionCallbackInfo) *v8go.Value {
args := info.Args()
if len(args) > 0 {
body = args[0].String()
}
return nil
},
allGlobals := map[string]v8go.FunctionCallback{
"inspect": func(info *v8go.FunctionCallbackInfo) *v8go.Value {
args := info.Args()
if len(args) > 0 {
message := args[0].String()
println(message)
}
return nil
},
)
"head": func(info *v8go.FunctionCallbackInfo) *v8go.Value {
args := info.Args()
if len(args) > 0 {
head = args[0].String()
}
return nil
},
"body": func(info *v8go.FunctionCallbackInfo) *v8go.Value {
args := info.Args()
if len(args) > 0 {
body = args[0].String()
}
return nil
},
}

for key, value := range globals {
_, exists := globals[key]
if exists {
continue
}

globals[key] = value
}

_, destroy, javaScriptError := JavaScriptRun(doneCjs, allGlobals)
if javaScriptError != nil {
return head, body, javaScriptError
}
Expand All @@ -234,8 +239,9 @@ func render(response *Response, stringProps string) (string, string, error) {
}

type SveltePageOptions struct {
Ssr bool
Props map[string]interface{}
Ssr bool
Props map[string]interface{}
Globals map[string]v8go.FunctionCallback
}

// SveltePage renders and echos a svelte page.
Expand All @@ -244,16 +250,18 @@ func SveltePage(response *Response, options *SveltePageOptions) {

if nil == options {
optionsLocal = &SveltePageOptions{
Ssr: true,
Props: map[string]interface{}{},
Ssr: true,
Props: map[string]interface{}{},
Globals: map[string]v8go.FunctionCallback{},
}
} else {
optionsLocal = options
}

fileNameIndex := filepath.Join("www", "dist", "client", "frizzante", "vite-project", "index.html")
fileNameIndex := filepath.Join("www", "dist", "client", ".frizzante", "vite-project", "index.html")
indexBytes, readError := response.server.embeddedFileSystem.ReadFile(fileNameIndex)
if readError != nil {
ServerNotifyError(response.server, readError)
return
}

Expand All @@ -267,7 +275,7 @@ func SveltePage(response *Response, options *SveltePageOptions) {
head := ""
body := ""
if optionsLocal.Ssr {
headLocal, bodyLocal, renderError := render(response, stringProps)
headLocal, bodyLocal, renderError := render(response, stringProps, optionsLocal.Globals)
if renderError != nil {
ServerNotifyError(response.server, renderError)
return
Expand Down
3 changes: 3 additions & 0 deletions libsvelte_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package frizzante

import (
"rogchap.com/v8go"
"strings"
"testing"
"time"
Expand All @@ -21,6 +22,7 @@ func TestEchoSvelteWithSsr(test *testing.T) {
"page": "welcome",
"name": "world",
},
Globals: map[string]v8go.FunctionCallback{},
})
})
go ServerStart(server)
Expand Down Expand Up @@ -54,6 +56,7 @@ func TestEchoSvelteWithoutSsr(test *testing.T) {
"page": "welcome",
"name": "world",
},
Globals: map[string]v8go.FunctionCallback{},
})
})
go ServerStart(server)
Expand Down
9 changes: 6 additions & 3 deletions makefile
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
update: www/package.json go.mod
mkdir www/dist -p
touch www/dist/.gitkeep
go mod tidy
go run sandbox/main.prepare.go
go run prepare/main.go
cd www && bun update
cd www && bunx vite build --ssr frizzante/vite-project/render.server.js --outDir dist/server --emptyOutDir
cd www && bunx vite build --ssr .frizzante/vite-project/render.server.js --outDir dist/server --emptyOutDir
cd www && ./node_modules/.bin/esbuild dist/server/render.server.js --bundle --outfile=dist/server/render.server.js --format=esm --allow-overwrite
cd www && bunx vite build --outDir dist/client --emptyOutDir

Expand All @@ -12,11 +13,13 @@ clean:
rm cert.pem -f
rm key.pem -f
rm out -fr
rm www/frizzante -fr
rm www/.frizzante -fr
rm www/.temp -fr
rm www/dist/server -fr
rm www/dist/client -fr
rm www/node_modules -fr
mkdir www/dist -p
touch www/dist/.gitkeep

test: clean update
go test
Expand Down
2 changes: 1 addition & 1 deletion sandbox/main.prepare.go → prepare/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ import frz "github.com/razshare/frizzante"
func main() {
frz.SveltePrepareStart()
frz.SveltePreparePage("welcome", "./www/lib/pages/welcome.svelte")
frz.SveltePreparePage("counter", "./www/lib/pages/counter.svelte")
frz.SveltePreparePage("about", "./www/lib/pages/about.svelte")
frz.SveltePrepareEnd()
}
2 changes: 1 addition & 1 deletion vite-project/async.svelte
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
</script>

{#await from then Component}
<Component.default name="world" {...data}/>
<Component.default {...data}/>
{/await}
Empty file modified vite-project/index.html
100644 → 100755
Empty file.
12 changes: 0 additions & 12 deletions vite-project/index.spa.html

This file was deleted.

6 changes: 3 additions & 3 deletions vite-project/render.client.js
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { hydrate } from "svelte";
import RenderServer from "./render.server.svelte";
import { mount } from "svelte";
import RenderClient from "./render.client.svelte";
// @ts-ignore
hydrate(RenderServer, { target: target(), props: props() });
mount(RenderClient, { target: target(), props: props() });
4 changes: 0 additions & 4 deletions vite-project/render.client.spa.js

This file was deleted.

Loading

0 comments on commit 29197b9

Please sign in to comment.