├── .goreleaser.yaml
├── examples
├── echo
│ ├── .dockerignore
│ ├── models
│ │ └── props.go
│ ├── docker-compose.yml
│ ├── Dockerfile
│ ├── main_test.go
│ ├── main.go
│ ├── go.mod
│ └── go.sum
├── fiber
│ ├── .dockerignore
│ ├── models
│ │ └── props.go
│ ├── docker-compose.yml
│ ├── Dockerfile
│ ├── main_test.go
│ ├── go.mod
│ ├── main.go
│ └── go.sum
├── gin
│ ├── .dockerignore
│ ├── models
│ │ └── props.go
│ ├── docker-compose.yml
│ ├── Dockerfile
│ ├── main_test.go
│ ├── main.go
│ ├── go.mod
│ └── go.sum
├── frontend
│ ├── src
│ │ ├── index.d.ts
│ │ ├── generated.d.ts
│ │ ├── Layout.tsx
│ │ ├── components
│ │ │ ├── Counter.module.css
│ │ │ └── Counter.tsx
│ │ ├── Home.css
│ │ └── Home.tsx
│ ├── public
│ │ ├── go.png
│ │ ├── favicon.ico
│ │ └── react.png
│ ├── package.json
│ ├── tsconfig.json
│ └── package-lock.json
├── frontend-mui
│ ├── src
│ │ ├── index.d.ts
│ │ ├── generated.d.ts
│ │ ├── components
│ │ │ └── Counter.tsx
│ │ ├── Layout.tsx
│ │ ├── Home.css
│ │ └── Home.tsx
│ ├── public
│ │ ├── go.png
│ │ ├── react.png
│ │ └── favicon.ico
│ ├── package.json
│ ├── tsconfig.json
│ └── package-lock.json
└── frontend-tailwind
│ ├── src
│ ├── index.d.ts
│ ├── Main.css
│ ├── generated.d.ts
│ ├── components
│ │ └── Counter.tsx
│ └── Home.tsx
│ ├── public
│ ├── go.png
│ ├── react.png
│ └── favicon.ico
│ ├── tailwind.config.js
│ ├── package.json
│ └── tsconfig.json
├── .gitignore
├── go.work
├── internal
├── utils
│ ├── filepath.go
│ └── cachedir.go
├── typeconverter
│ ├── get_structs.go
│ ├── models.go
│ ├── start.go
│ └── create_temp_file.go
├── html
│ ├── error_template.go
│ ├── base_template.go
│ └── render_html.go
├── reactbuilder
│ ├── contents.go
│ └── build.go
└── cache
│ └── manager.go
├── gossr-cli
├── logger
│ └── logger.go
├── cmd
│ ├── create
│ │ ├── temp_dir.go
│ │ ├── create.go
│ │ ├── prompts.go
│ │ └── bootstrapper.go
│ ├── update
│ │ ├── check_update.go
│ │ ├── latest_version.go
│ │ ├── update.go
│ │ └── version_file.go
│ └── root.go
├── utils
│ ├── error.go
│ └── path.go
├── main.go
├── go.mod
└── go.sum
├── go.mod
├── LICENSE
├── .github
├── workflows
│ ├── release.yml
│ └── run-tests.yml
└── README.md
├── css_test.go
├── render.go
├── engine.go
├── engine_test.go
├── config.go
├── go.work.sum
├── css.go
├── go.sum
├── rendertask.go
└── hotreload.go
/.goreleaser.yaml:
--------------------------------------------------------------------------------
1 | builds:
2 | - skip: true
3 |
--------------------------------------------------------------------------------
/examples/echo/.dockerignore:
--------------------------------------------------------------------------------
1 | */node_modules
2 | .dockerignore
3 | Dockerfile
4 | tmp
--------------------------------------------------------------------------------
/examples/fiber/.dockerignore:
--------------------------------------------------------------------------------
1 | */node_modules
2 | .dockerignore
3 | Dockerfile
4 | tmp
--------------------------------------------------------------------------------
/examples/gin/.dockerignore:
--------------------------------------------------------------------------------
1 | */node_modules
2 | .dockerignore
3 | Dockerfile
4 | tmp
--------------------------------------------------------------------------------
/examples/frontend/src/index.d.ts:
--------------------------------------------------------------------------------
1 | declare module "*.css";
2 | declare module "*.png";
3 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .tmp
3 | tmp
4 | .DS_Store
5 |
6 | .idea
7 |
8 | generated.d.ts
--------------------------------------------------------------------------------
/examples/frontend-mui/src/index.d.ts:
--------------------------------------------------------------------------------
1 | declare module "*.css";
2 | declare module "*.png";
3 |
--------------------------------------------------------------------------------
/examples/frontend-tailwind/src/index.d.ts:
--------------------------------------------------------------------------------
1 | declare module "*.css";
2 | declare module "*.png";
3 |
--------------------------------------------------------------------------------
/examples/frontend-tailwind/src/Main.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
--------------------------------------------------------------------------------
/examples/frontend/public/go.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/natewong1313/go-react-ssr/HEAD/examples/frontend/public/go.png
--------------------------------------------------------------------------------
/examples/frontend-mui/public/go.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/natewong1313/go-react-ssr/HEAD/examples/frontend-mui/public/go.png
--------------------------------------------------------------------------------
/examples/frontend/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/natewong1313/go-react-ssr/HEAD/examples/frontend/public/favicon.ico
--------------------------------------------------------------------------------
/examples/frontend/public/react.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/natewong1313/go-react-ssr/HEAD/examples/frontend/public/react.png
--------------------------------------------------------------------------------
/examples/echo/models/props.go:
--------------------------------------------------------------------------------
1 | package models
2 |
3 | type IndexRouteProps struct {
4 | InitialCount int `json:"initialCount"`
5 | }
6 |
--------------------------------------------------------------------------------
/examples/fiber/models/props.go:
--------------------------------------------------------------------------------
1 | package models
2 |
3 | type IndexRouteProps struct {
4 | InitialCount int `json:"initialCount"`
5 | }
6 |
--------------------------------------------------------------------------------
/examples/frontend-mui/public/react.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/natewong1313/go-react-ssr/HEAD/examples/frontend-mui/public/react.png
--------------------------------------------------------------------------------
/examples/gin/models/props.go:
--------------------------------------------------------------------------------
1 | package models
2 |
3 | type IndexRouteProps struct {
4 | InitialCount int `json:"initialCount"`
5 | }
6 |
--------------------------------------------------------------------------------
/go.work:
--------------------------------------------------------------------------------
1 | go 1.20
2 |
3 | use (
4 | .
5 | ./examples/fiber
6 | ./examples/gin
7 | ./examples/echo
8 | ./gossr-cli
9 | )
10 |
--------------------------------------------------------------------------------
/examples/frontend-mui/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/natewong1313/go-react-ssr/HEAD/examples/frontend-mui/public/favicon.ico
--------------------------------------------------------------------------------
/examples/frontend-tailwind/public/go.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/natewong1313/go-react-ssr/HEAD/examples/frontend-tailwind/public/go.png
--------------------------------------------------------------------------------
/examples/frontend-tailwind/public/react.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/natewong1313/go-react-ssr/HEAD/examples/frontend-tailwind/public/react.png
--------------------------------------------------------------------------------
/examples/frontend-tailwind/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/natewong1313/go-react-ssr/HEAD/examples/frontend-tailwind/public/favicon.ico
--------------------------------------------------------------------------------
/examples/frontend-mui/src/generated.d.ts:
--------------------------------------------------------------------------------
1 | /* Do not change, this code is generated from Golang structs */
2 |
3 |
4 | export interface IndexRouteProps {
5 | initialCount: number;
6 | }
--------------------------------------------------------------------------------
/examples/frontend/src/generated.d.ts:
--------------------------------------------------------------------------------
1 | /* Do not change, this code is generated from Golang structs */
2 |
3 |
4 | export interface IndexRouteProps {
5 | initialCount: number;
6 | }
--------------------------------------------------------------------------------
/examples/frontend-tailwind/src/generated.d.ts:
--------------------------------------------------------------------------------
1 | /* Do not change, this code is generated from Golang structs */
2 |
3 |
4 | export interface IndexRouteProps {
5 | initialCount: number;
6 | }
--------------------------------------------------------------------------------
/examples/frontend/src/Layout.tsx:
--------------------------------------------------------------------------------
1 | export default function Layout({ children }: { children: React.ReactNode }) {
2 | console.log("Hello from Layout");
3 | return <>{children}>;
4 | }
5 |
--------------------------------------------------------------------------------
/examples/frontend-tailwind/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | content: ["./src/**/*.{ts,tsx,js,jsx}"],
4 | theme: {
5 | extend: {},
6 | },
7 | plugins: [],
8 | };
9 |
--------------------------------------------------------------------------------
/examples/echo/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: "1"
2 | services:
3 | app:
4 | build:
5 | context: .
6 | dockerfile: Dockerfile
7 | ports:
8 | - "8080:8080"
9 | environment:
10 | - APP_ENV=production
11 |
--------------------------------------------------------------------------------
/examples/fiber/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: "1"
2 | services:
3 | app:
4 | build:
5 | context: .
6 | dockerfile: Dockerfile
7 | ports:
8 | - "8080:8080"
9 | environment:
10 | - APP_ENV=production
11 |
--------------------------------------------------------------------------------
/examples/gin/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: "1"
2 | services:
3 | app:
4 | build:
5 | context: .
6 | dockerfile: Dockerfile
7 | ports:
8 | - "8080:8080"
9 | environment:
10 | - APP_ENV=production
11 |
--------------------------------------------------------------------------------
/examples/frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "react": "^18.2.0",
4 | "react-dom": "^18.2.0"
5 | },
6 | "devDependencies": {
7 | "@types/react": "^18.2.21",
8 | "@types/react-dom": "^18.2.7",
9 | "typescript": "^5.2.2"
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/internal/utils/filepath.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | import "path/filepath"
4 |
5 | // Returns the absolute path of the file without returning an error
6 | func GetFullFilePath(filePath string) string {
7 | fp, _ := filepath.Abs(filePath)
8 | return filepath.ToSlash(fp)
9 | }
10 |
--------------------------------------------------------------------------------
/gossr-cli/logger/logger.go:
--------------------------------------------------------------------------------
1 | package logger
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/rs/zerolog"
7 | )
8 |
9 | var L zerolog.Logger
10 |
11 | // Init initializes a global logger instance
12 | func Init() {
13 | L = zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr}).With().Timestamp().Logger()
14 | }
15 |
--------------------------------------------------------------------------------
/examples/frontend-tailwind/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "react": "^18.2.0",
4 | "react-dom": "^18.2.0"
5 | },
6 | "devDependencies": {
7 | "@types/react": "^18.2.21",
8 | "@types/react-dom": "^18.2.7",
9 | "tailwindcss": "^3.3.3",
10 | "typescript": "^5.2.2"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/examples/frontend/src/components/Counter.module.css:
--------------------------------------------------------------------------------
1 | .counter {
2 | color: white;
3 | background-color: #1a1a1a;
4 | font-size: 16px;
5 | padding: 10px 16px;
6 | border: 2px solid transparent;
7 | border-radius: 8px;
8 | cursor: pointer;
9 | }
10 |
11 | .counter:hover {
12 | border: 2px solid #06a8c5;
13 | }
14 |
--------------------------------------------------------------------------------
/gossr-cli/cmd/create/temp_dir.go:
--------------------------------------------------------------------------------
1 | package create
2 |
3 | import (
4 | "os"
5 | "path/filepath"
6 | )
7 |
8 | func createTempDir() string {
9 | osCacheDir, _ := os.UserCacheDir()
10 | tempDirPath := filepath.Join(osCacheDir, "gossr-cli")
11 | os.RemoveAll(tempDirPath)
12 | os.MkdirAll(tempDirPath, os.ModePerm)
13 |
14 | return tempDirPath
15 | }
16 |
--------------------------------------------------------------------------------
/examples/frontend-mui/src/components/Counter.tsx:
--------------------------------------------------------------------------------
1 | import Button from "@mui/material/Button";
2 |
3 | type Props = {
4 | count: number;
5 | increment: () => void;
6 | };
7 | export default function Counter({ count, increment }: Props) {
8 | return (
9 |
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/examples/frontend/src/components/Counter.tsx:
--------------------------------------------------------------------------------
1 | import styles from "./Counter.module.css";
2 |
3 | type Props = {
4 | count: number;
5 | increment: () => void;
6 | };
7 | export default function Counter({ count, increment }: Props) {
8 | return (
9 |
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/examples/frontend-mui/src/Layout.tsx:
--------------------------------------------------------------------------------
1 | import createCache from "@emotion/cache";
2 | import { CacheProvider } from "@emotion/react";
3 |
4 | const cache = createCache({ key: "css" })
5 |
6 | export default function Layout({ children }: { children: React.ReactNode }) {
7 | console.log("Hello from Layout");
8 | return
{{ .Error }}
22 | {{if .IsDev}}
23 |
36 | {{end}}
37 |
38 |
39 | `
40 |
--------------------------------------------------------------------------------
/examples/frontend/src/Home.tsx:
--------------------------------------------------------------------------------
1 | import { useState } from "react";
2 | import { IndexRouteProps } from "./generated";
3 | import GoLogo from "../public/go.png";
4 | import ReactLogo from "../public/react.png";
5 | import "./Home.css";
6 | import Counter from "./components/Counter";
7 |
8 | function Home({ initialCount }: IndexRouteProps) {
9 | const [count, setCount] = useState(initialCount);
10 |
11 | return (
12 |
5 |
6 | ---
7 |
8 |
13 |
14 | Go-SSR is a drop in plugin to **any** existing Go web framework to allow **server rendering** [React](https://react.dev/). It's powered by [esbuild](https://esbuild.github.io/) and allows for passing props from Go to React with **type safety**.
15 |
16 |
18 |
19 | Go-SSR was developed due to a lack of an existing product in the Go ecosystem that made it easy to build full-stack React apps. At the time, most Go web app projects were either built with a static React frontend with lots of client-side logic or html templates. I envisioned creating a new solution that would allow you to create full-stack Go apps with React but with logic being moved to the server and being able to pass that logic down with type-safe props. This project was inspired by [Remix](https://remix.run/) and [Next.JS](https://nextjs.org/), but aims to be a plugin and not a framework.
20 |
21 | # 📜 Features
22 |
23 | - Lightning fast compiling
24 | - Auto generated Typescript structs for props
25 | - Hot reloading
26 | - Simple error reporting
27 | - Production optimized
28 | - Drop in to any existing Go web server
29 |
30 |
31 |
32 | # 🛠️ Getting Started
33 |
34 | Go-SSR was designed with the idea of being dead simple to install. Below are 2 easy ways of setting it up:
35 |
36 | ## ⚡️ Using the CLI tool
37 |
38 |
39 |
40 | The easiest way to get a project up and running is by using the command line tool. Install it with the following command
41 |
42 | ```console
43 | $ go install github.com/natewong1313/go-react-ssr/gossr-cli@latest
44 | ```
45 |
46 | Then you can call the following command to create a project
47 |
48 | ```console
49 | $ gossr-cli create
50 | ```
51 |
52 | You'll be prompted the path to place the project, what web framework you want to use, and whether or not you want to use Tailwind
53 |
54 | ## 📝 Add to existing web server
55 |
56 | To add Go-SSR to an existing Go web server, take a look at the [examples](/examples) folder to get an idea of what a project looks like. In general, you'll want to follow these commands:
57 |
58 | ```console
59 | $ go get -u github.com/natewong1313/go-react-ssr
60 | ```
61 |
62 | Then, add imports into your main file
63 |
64 | ```go
65 | import (
66 | ...
67 | gossr "github.com/natewong1313/go-react-ssr"
68 | )
69 | ```
70 |
71 | In your main function, initialize the plugin. Create a folder for your structs that hold your props to go, which is called `models` in the below example. You'll also want to create a folder for your React code (called `frontend` in this example) inside your project and specifiy the paths in the config. You may want to clone the [example folder](/examples/frontend/) and use that.
72 |
73 | ```go
74 | engine, err := gossr.New(gossr.Config{
75 | AssetRoute: "/assets",
76 | FrontendDir: "./frontend/src",
77 | GeneratedTypesPath: "./frontend/src/generated.d.ts",
78 | PropsStructsPath: "./models/props.go",
79 | })
80 | ```
81 |
82 | Once the plugin has been initialized, you can call the `engine.RenderRoute` function to compile your React file to a string
83 |
84 | ```go
85 | g.GET("/", func(c *gin.Context) {
86 | renderedResponse := engine.RenderRoute(gossr.RenderConfig{
87 | File: "Home.tsx",
88 | Title: "Example app",
89 | MetaTags: map[string]string{
90 | "og:title": "Example app",
91 | "description": "Hello world!",
92 | },
93 | Props: &models.IndexRouteProps{
94 | InitialCount: rand.Intn(100),
95 | },
96 | })
97 | c.Writer.Write(renderedResponse)
98 | })
99 | ```
100 |
101 | # 🚀 Deploying to production
102 |
103 | All of the examples come with a Dockerfile that you can use to deploy to production. You can also use the [gossr-cli](#-using-the-cli-tool) to create a project with a Dockerfile.
104 | Below is an example Dockerfile
105 |
106 | ```Dockerfile
107 | FROM golang:1.21-alpine as build-backend
108 | RUN apk add git
109 | ADD .. /build
110 | WORKDIR /build
111 |
112 | RUN go mod download
113 | RUN go get -u github.com/natewong1313/go-react-ssr
114 | RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-w -X main.APP_ENV=production" -a -o main
115 |
116 |
117 | FROM node:16-alpine as build-frontend
118 |
119 | ADD ./frontend /frontend
120 | WORKDIR /frontend
121 |
122 | RUN npm install
123 |
124 | # if tailwind is enabled, use "FROM node:16-alpine" instead
125 | FROM alpine:latest
126 | COPY --from=build-backend /build/main ./app/main
127 | COPY --from=build-frontend /frontend ./app/frontend
128 |
129 | WORKDIR /app
130 | RUN chmod +x ./main
131 | EXPOSE 8080
132 | CMD ["./main"]
133 | ```
134 |
135 | Go SSR has been tested and deployed on the following platforms:
136 |
137 | - [Fly.io](https://fly.io/) - [example app](https://sparkling-smoke-7627.fly.dev/)
138 | - [Render](https://render.com/) - [example app](https://my-gossr-test.onrender.com/)
139 | - [Hop.io](https://hop.io/) - [example app](https://my-gossr-test.hop.sh/)
140 |
--------------------------------------------------------------------------------
/go.sum:
--------------------------------------------------------------------------------
1 | github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
2 | github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
3 | github.com/buke/quickjs-go v0.2.3 h1:aoQ46FaMUdDhQf57sKKWkDQj1BiAOzJi9v/A7SNVyTU=
4 | github.com/buke/quickjs-go v0.2.3/go.mod h1:d+CLE8FY8v4gQJkPlwcinM+E9mhREMpYy5Zn7nlgE9s=
5 | github.com/buke/quickjs-go v0.2.4 h1:l4Rk6EwgwOcf1JUxFJ+1rVOlGJd1Ofdt+b9U8B6pO1Y=
6 | github.com/buke/quickjs-go v0.2.4/go.mod h1:d+CLE8FY8v4gQJkPlwcinM+E9mhREMpYy5Zn7nlgE9s=
7 | github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
8 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
9 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
10 | github.com/evanw/esbuild v0.19.3 h1:foPr0xwQM3lBWKBtscauTN9FrmJzRDVI2+EGOs82H/I=
11 | github.com/evanw/esbuild v0.19.3/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk=
12 | github.com/evanw/esbuild v0.19.11 h1:mbPO1VJ/df//jjUd+p/nRLYCpizXxXb2w/zZMShxa2k=
13 | github.com/evanw/esbuild v0.19.11/go.mod h1:D2vIQZqV/vIf/VRHtViaUtViZmG7o+kKmlBfVQuRi48=
14 | github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
15 | github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
16 | github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
17 | github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
18 | github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
19 | github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
20 | github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
21 | github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
22 | github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
23 | github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
24 | github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
25 | github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
26 | github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
27 | github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
28 | github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
29 | github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
30 | github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
31 | github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
32 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
33 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
34 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
35 | github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
36 | github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c=
37 | github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w=
38 | github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A=
39 | github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
40 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
41 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
42 | github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
43 | github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
44 | github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
45 | github.com/tkrajina/go-reflector v0.5.5 h1:gwoQFNye30Kk7NrExj8zm3zFtrGPqOkzFMLuQZg1DtQ=
46 | github.com/tkrajina/go-reflector v0.5.5/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4=
47 | github.com/tkrajina/go-reflector v0.5.6 h1:hKQ0gyocG7vgMD2M3dRlYN6WBBOmdoOzJ6njQSepKdE=
48 | github.com/tkrajina/go-reflector v0.5.6/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4=
49 | github.com/tkrajina/typescriptify-golang-structs v0.1.10 h1:W/Ta9Kqo2lV+7bVXuQoUhZ0bDlnjwtPpKsy3A9M1nYg=
50 | github.com/tkrajina/typescriptify-golang-structs v0.1.10/go.mod h1:sjU00nti/PMEOZb07KljFlR+lJ+RotsC0GBQMv9EKls=
51 | github.com/tkrajina/typescriptify-golang-structs v0.1.11 h1:zEIVczF/iWgs4eTY7NQqbBe23OVlFVk9sWLX/FDYi4Q=
52 | github.com/tkrajina/typescriptify-golang-structs v0.1.11/go.mod h1:sjU00nti/PMEOZb07KljFlR+lJ+RotsC0GBQMv9EKls=
53 | golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
54 | golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
55 | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
56 | golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
57 | golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
58 | golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
59 | golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
60 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
61 | golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
62 | golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
63 | golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
64 | golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
65 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
66 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
67 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
68 |
--------------------------------------------------------------------------------
/rendertask.go:
--------------------------------------------------------------------------------
1 | package go_ssr
2 |
3 | import (
4 | "fmt"
5 |
6 | "github.com/buke/quickjs-go"
7 | "github.com/natewong1313/go-react-ssr/internal/reactbuilder"
8 | "github.com/rs/zerolog"
9 | )
10 |
11 | type renderTask struct {
12 | engine *Engine
13 | logger zerolog.Logger
14 | routeID string
15 | filePath string
16 | props string
17 | config RenderConfig
18 | serverRenderResult chan serverRenderResult
19 | clientRenderResult chan clientRenderResult
20 | }
21 |
22 | type serverRenderResult struct {
23 | html string
24 | css string
25 | err error
26 | }
27 |
28 | type clientRenderResult struct {
29 | js string
30 | dependencies []string
31 | err error
32 | }
33 |
34 | // Start starts the render task, returns the rendered html, css, and js for hydration
35 | func (rt *renderTask) Start() (string, string, string, error) {
36 | rt.serverRenderResult = make(chan serverRenderResult)
37 | rt.clientRenderResult = make(chan clientRenderResult)
38 | // Assigns the parent file to the routeID so that the cache can be invalidated when the parent file changes
39 | rt.engine.CacheManager.SetParentFile(rt.routeID, rt.filePath)
40 |
41 | // Render for server and client concurrently
42 | go rt.doRender("server")
43 | go rt.doRender("client")
44 |
45 | // Wait for both to finish
46 | srResult := <-rt.serverRenderResult
47 | if srResult.err != nil {
48 | rt.logger.Error().Err(srResult.err).Msg("Failed to build for server")
49 | return "", "", "", srResult.err
50 | }
51 | crResult := <-rt.clientRenderResult
52 | if crResult.err != nil {
53 | rt.logger.Error().Err(crResult.err).Msg("Failed to build for client")
54 | return "", "", "", crResult.err
55 | }
56 |
57 | // Set the parent file dependencies so that the cache can be invalidated a dependency changes
58 | go rt.engine.CacheManager.SetParentFileDependencies(rt.filePath, crResult.dependencies)
59 | return srResult.html, srResult.css, crResult.js, nil
60 | }
61 |
62 | func (rt *renderTask) doRender(buildType string) {
63 | // Check if the build is in the cache
64 | build, buildFound := rt.getBuildFromCache(buildType)
65 | if !buildFound {
66 | // Build the file if it's not in the cache
67 | newBuild, err := rt.buildFile(buildType)
68 | if err != nil {
69 | rt.handleBuildError(err, buildType)
70 | return
71 | }
72 | rt.updateBuildCache(newBuild, buildType)
73 | build = newBuild
74 | }
75 | // JS is built without props so that the props can be injected into cached JS builds
76 | js := injectProps(build.JS, rt.props)
77 | if buildType == "server" {
78 | // Then call that file with node to get the rendered HTML
79 | renderedHTML, err := renderReactToHTMLNew(js)
80 | rt.serverRenderResult <- serverRenderResult{html: renderedHTML, css: build.CSS, err: err}
81 | } else {
82 | rt.clientRenderResult <- clientRenderResult{js: js, dependencies: build.Dependencies}
83 | }
84 | }
85 |
86 | // getBuild returns the build from the cache if it exists
87 | func (rt *renderTask) getBuildFromCache(buildType string) (reactbuilder.BuildResult, bool) {
88 | if buildType == "server" {
89 | return rt.engine.CacheManager.GetServerBuild(rt.filePath)
90 | } else {
91 | return rt.engine.CacheManager.GetClientBuild(rt.filePath)
92 | }
93 | }
94 |
95 | // buildFile gets the contents of the file to be built and builds it with reactbuilder
96 | func (rt *renderTask) buildFile(buildType string) (reactbuilder.BuildResult, error) {
97 | buildContents, err := rt.getBuildContents(buildType)
98 | if err != nil {
99 | return reactbuilder.BuildResult{}, err
100 | }
101 | if buildType == "server" {
102 | return reactbuilder.BuildServer(buildContents, rt.engine.Config.FrontendDir, rt.engine.Config.AssetRoute)
103 | } else {
104 | return reactbuilder.BuildClient(buildContents, rt.engine.Config.FrontendDir, rt.engine.Config.AssetRoute)
105 | }
106 | }
107 |
108 | // getBuildContents gets the required imports based on the config and returns the contents to be built with reactbuilder
109 | func (rt *renderTask) getBuildContents(buildType string) (string, error) {
110 | var imports []string
111 | if rt.engine.CachedLayoutCSSFilePath != "" {
112 | imports = append(imports, fmt.Sprintf(`import "%s";`, rt.engine.CachedLayoutCSSFilePath))
113 | }
114 | if rt.engine.Config.LayoutFilePath != "" {
115 | imports = append(imports, fmt.Sprintf(`import Layout from "%s";`, rt.engine.Config.LayoutFilePath))
116 | }
117 | if buildType == "server" {
118 | return reactbuilder.GenerateServerBuildContents(imports, rt.filePath, rt.engine.Config.LayoutFilePath != "")
119 | } else {
120 | return reactbuilder.GenerateClientBuildContents(imports, rt.filePath, rt.engine.Config.LayoutFilePath != "")
121 | }
122 | }
123 |
124 | // handleBuildError handles the error from building the file and sends it to the appropriate channel
125 | func (rt *renderTask) handleBuildError(err error, buildType string) {
126 | if buildType == "server" {
127 | rt.serverRenderResult <- serverRenderResult{err: err}
128 | } else {
129 | rt.clientRenderResult <- clientRenderResult{err: err}
130 | }
131 | }
132 |
133 | // updateBuildCache updates the cache with the new build
134 | func (rt *renderTask) updateBuildCache(build reactbuilder.BuildResult, buildType string) {
135 | if buildType == "server" {
136 | rt.engine.CacheManager.SetServerBuild(rt.filePath, build)
137 | } else {
138 | rt.engine.CacheManager.SetClientBuild(rt.filePath, build)
139 | }
140 | }
141 |
142 | // injectProps injects the props into the already compiled JS
143 | func injectProps(compiledJS, props string) string {
144 | return fmt.Sprintf(`var props = %s; %s`, props, compiledJS)
145 | }
146 |
147 | // renderReactToHTML uses node to execute the server js file which outputs the rendered HTML
148 | func renderReactToHTMLNew(js string) (string, error) {
149 | rt := quickjs.NewRuntime()
150 | defer rt.Close()
151 | ctx := rt.NewContext()
152 | defer ctx.Close()
153 | res, err := ctx.Eval(js)
154 | if err != nil {
155 | return "", err
156 | }
157 | return res.String(), nil
158 | }
159 |
--------------------------------------------------------------------------------
/examples/fiber/go.sum:
--------------------------------------------------------------------------------
1 | github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
2 | github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
3 | github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
4 | github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
5 | github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
6 | github.com/creasty/defaults v1.7.0 h1:eNdqZvc5B509z18lD8yc212CAqJNvfT1Jq6L8WowdBA=
7 | github.com/creasty/defaults v1.7.0/go.mod h1:iGzKe6pbEHnpMPtfDXZEr0NVxWnPTjb1bbDy08fPzYM=
8 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
9 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
10 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
11 | github.com/evanw/esbuild v0.19.3 h1:foPr0xwQM3lBWKBtscauTN9FrmJzRDVI2+EGOs82H/I=
12 | github.com/evanw/esbuild v0.19.3/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk=
13 | github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
14 | github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
15 | github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
16 | github.com/gofiber/fiber/v2 v2.49.2 h1:ONEN3/Vc+dUCxxDgZZwpqvhISgHqb+bu+isBiEyKEQs=
17 | github.com/gofiber/fiber/v2 v2.49.2/go.mod h1:gNsKnyrmfEWFpJxQAV0qvW6l70K1dZGno12oLtukcts=
18 | github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4=
19 | github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
20 | github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
21 | github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
22 | github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
23 | github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
24 | github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM=
25 | github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
26 | github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
27 | github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
28 | github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
29 | github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
30 | github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
31 | github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
32 | github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
33 | github.com/natewong1313/go-react-ssr v0.0.693 h1:eDTrK+wlDnodv48HVFKH/r+NixdLAe+zaYwHp+SGSw4=
34 | github.com/natewong1313/go-react-ssr v0.0.693/go.mod h1:x1jsB3lxKxlprkOx51VKCiF+JE01oyvahqIrjo3kQRc=
35 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
36 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
37 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
38 | github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
39 | github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
40 | github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
41 | github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
42 | github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A=
43 | github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
44 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
45 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
46 | github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
47 | github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
48 | github.com/tkrajina/go-reflector v0.5.5/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4=
49 | github.com/tkrajina/go-reflector v0.5.6 h1:hKQ0gyocG7vgMD2M3dRlYN6WBBOmdoOzJ6njQSepKdE=
50 | github.com/tkrajina/go-reflector v0.5.6/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4=
51 | github.com/tkrajina/typescriptify-golang-structs v0.1.10 h1:W/Ta9Kqo2lV+7bVXuQoUhZ0bDlnjwtPpKsy3A9M1nYg=
52 | github.com/tkrajina/typescriptify-golang-structs v0.1.10/go.mod h1:sjU00nti/PMEOZb07KljFlR+lJ+RotsC0GBQMv9EKls=
53 | github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
54 | github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
55 | github.com/valyala/fasthttp v1.50.0 h1:H7fweIlBm0rXLs2q0XbalvJ6r0CUPFWK3/bB4N13e9M=
56 | github.com/valyala/fasthttp v1.50.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA=
57 | github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
58 | github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
59 | golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
60 | golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
61 | golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
62 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
63 | golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
64 | golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
65 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
66 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
67 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
68 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
69 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
70 |
--------------------------------------------------------------------------------
/hotreload.go:
--------------------------------------------------------------------------------
1 | package go_ssr
2 |
3 | import (
4 | "fmt"
5 | "github.com/fsnotify/fsnotify"
6 | "github.com/gorilla/websocket"
7 | "github.com/natewong1313/go-react-ssr/internal/utils"
8 | "github.com/rs/zerolog"
9 | "net/http"
10 | "os"
11 | "path/filepath"
12 | "strings"
13 | )
14 |
15 | type HotReload struct {
16 | engine *Engine
17 | logger zerolog.Logger
18 | connectedClients map[string][]*websocket.Conn
19 | }
20 |
21 | // newHotReload creates a new HotReload instance
22 | func newHotReload(engine *Engine) *HotReload {
23 | return &HotReload{
24 | engine: engine,
25 | logger: engine.Logger,
26 | connectedClients: make(map[string][]*websocket.Conn),
27 | }
28 | }
29 |
30 | // Start starts the hot reload server and watcher
31 | func (hr *HotReload) Start() {
32 | go hr.startServer()
33 | go hr.startWatcher()
34 | }
35 |
36 | // startServer starts the hot reload websocket server
37 | func (hr *HotReload) startServer() {
38 | hr.logger.Info().Msgf("Hot reload websocket running on port %d", hr.engine.Config.HotReloadServerPort)
39 | upgrader := websocket.Upgrader{
40 | CheckOrigin: func(r *http.Request) bool {
41 | return true
42 | },
43 | }
44 | http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
45 | ws, err := upgrader.Upgrade(w, r, nil)
46 | if err != nil {
47 | hr.logger.Err(err).Msg("Failed to upgrade websocket")
48 | return
49 | }
50 | // Client should send routeID as first message
51 | _, routeID, err := ws.ReadMessage()
52 | if err != nil {
53 | hr.logger.Err(err).Msg("Failed to read message from websocket")
54 | return
55 | }
56 | err = ws.WriteMessage(1, []byte("Connected"))
57 | if err != nil {
58 | hr.logger.Err(err).Msg("Failed to write message to websocket")
59 | return
60 | }
61 | // Add client to connectedClients
62 | hr.connectedClients[string(routeID)] = append(hr.connectedClients[string(routeID)], ws)
63 | })
64 | err := http.ListenAndServe(fmt.Sprintf(":%d", hr.engine.Config.HotReloadServerPort), nil)
65 | if err != nil {
66 | hr.logger.Err(err).Msg("Hot reload server quit unexpectedly")
67 | }
68 | }
69 |
70 | // startWatcher starts the file watcher
71 | func (hr *HotReload) startWatcher() {
72 | watcher, err := fsnotify.NewWatcher()
73 | if err != nil {
74 | hr.logger.Err(err).Msg("Failed to start watcher")
75 | return
76 | }
77 | defer watcher.Close()
78 | // Walk through all files in the frontend directory and add them to the watcher
79 | if err = filepath.Walk(hr.engine.Config.FrontendDir, func(path string, fi os.FileInfo, err error) error {
80 | if fi.Mode().IsDir() {
81 | return watcher.Add(path)
82 | }
83 | return nil
84 | }); err != nil {
85 | hr.logger.Err(err).Msg("Failed to add files in directory to watcher")
86 | return
87 | }
88 |
89 | for {
90 | select {
91 | case event := <-watcher.Events:
92 | // Watch for file created, deleted, updated, or renamed events
93 | if event.Op.String() != "CHMOD" && !strings.Contains(event.Name, "gossr-temporary") {
94 | filePath := utils.GetFullFilePath(event.Name)
95 | hr.logger.Info().Msgf("File changed: %s, reloading", filePath)
96 | // Store the routes that need to be reloaded
97 | var routeIDS []string
98 | switch {
99 | case filePath == hr.engine.Config.LayoutFilePath: // If the layout file has been updated, reload all routes
100 | routeIDS = hr.engine.CacheManager.GetAllRouteIDS()
101 | case hr.layoutCSSFileUpdated(filePath): // If the global css file has been updated, rebuild it and reload all routes
102 | if err := hr.engine.BuildLayoutCSSFile(); err != nil {
103 | hr.logger.Err(err).Msg("Failed to build global css file")
104 | continue
105 | }
106 | routeIDS = hr.engine.CacheManager.GetAllRouteIDS()
107 | case hr.needsTailwindRecompile(filePath): // If tailwind is enabled and a React file has been updated, rebuild the global css file and reload all routes
108 | if err := hr.engine.BuildLayoutCSSFile(); err != nil {
109 | hr.logger.Err(err).Msg("Failed to build global css file")
110 | continue
111 | }
112 | fallthrough
113 | default:
114 | // Get all route ids that use that file or have it as a dependency
115 | routeIDS = hr.engine.CacheManager.GetRouteIDSWithFile(filePath)
116 | }
117 | // Find any parent files that import the file that was modified and delete their cached build
118 | parentFiles := hr.engine.CacheManager.GetParentFilesFromDependency(filePath)
119 | for _, parentFile := range parentFiles {
120 | hr.engine.CacheManager.RemoveServerBuild(parentFile)
121 | hr.engine.CacheManager.RemoveClientBuild(parentFile)
122 | }
123 | // Reload any routes that import the modified file
124 | go hr.broadcastFileUpdateToClients(routeIDS)
125 |
126 | }
127 | case err := <-watcher.Errors:
128 | hr.logger.Err(err).Msg("Error watching files")
129 | }
130 | }
131 | }
132 |
133 | // layoutCSSFileUpdated checks if the layout css file has been updated
134 | func (hr *HotReload) layoutCSSFileUpdated(filePath string) bool {
135 | return utils.GetFullFilePath(filePath) == hr.engine.Config.LayoutCSSFilePath
136 | }
137 |
138 | // needsTailwindRecompile checks if the file that was updated is a React file
139 | func (hr *HotReload) needsTailwindRecompile(filePath string) bool {
140 | if hr.engine.Config.TailwindConfigPath == "" {
141 | return false
142 | }
143 | fileTypes := []string{".tsx", ".ts", ".jsx", ".js"}
144 | for _, fileType := range fileTypes {
145 | if strings.HasSuffix(filePath, fileType) {
146 | return true
147 | }
148 | }
149 | return false
150 | }
151 |
152 | // broadcastFileUpdateToClients sends a message to all connected clients to reload the page
153 | func (hr *HotReload) broadcastFileUpdateToClients(routeIDS []string) {
154 | // Iterate over each route ID
155 | for _, routeID := range routeIDS {
156 | // Find all clients listening for that route ID
157 | for i, ws := range hr.connectedClients[routeID] {
158 | // Send reload message to client
159 | err := ws.WriteMessage(1, []byte("reload"))
160 | if err != nil {
161 | // remove client if browser is closed or page changed
162 | hr.connectedClients[routeID] = append(hr.connectedClients[routeID][:i], hr.connectedClients[routeID][i+1:]...)
163 | }
164 | }
165 | }
166 | }
167 |
--------------------------------------------------------------------------------
/examples/gin/go.sum:
--------------------------------------------------------------------------------
1 | github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
2 | github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
3 | github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
4 | github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s=
5 | github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
6 | github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
7 | github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
8 | github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
9 | github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
10 | github.com/creasty/defaults v1.7.0 h1:eNdqZvc5B509z18lD8yc212CAqJNvfT1Jq6L8WowdBA=
11 | github.com/creasty/defaults v1.7.0/go.mod h1:iGzKe6pbEHnpMPtfDXZEr0NVxWnPTjb1bbDy08fPzYM=
12 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
13 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
14 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
15 | github.com/evanw/esbuild v0.19.3 h1:foPr0xwQM3lBWKBtscauTN9FrmJzRDVI2+EGOs82H/I=
16 | github.com/evanw/esbuild v0.19.3/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk=
17 | github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
18 | github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
19 | github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
20 | github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
21 | github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
22 | github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
23 | github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
24 | github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
25 | github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
26 | github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
27 | github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
28 | github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
29 | github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
30 | github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
31 | github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js=
32 | github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
33 | github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
34 | github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
35 | github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
36 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
37 | github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
38 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
39 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
40 | github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
41 | github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
42 | github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
43 | github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
44 | github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
45 | github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
46 | github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
47 | github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
48 | github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
49 | github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
50 | github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
51 | github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
52 | github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
53 | github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
54 | github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
55 | github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
56 | github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
57 | github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
58 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
59 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
60 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
61 | github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
62 | github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
63 | github.com/natewong1313/go-react-ssr v0.0.3 h1:fbcwVdAqR7qrtx9Ea8Od54zou1fzn9xEQXBpiqIXmoU=
64 | github.com/natewong1313/go-react-ssr v0.0.3/go.mod h1:mNRYw/XYoE/BEdjDARW+dPqSMr9VE3xRlz7J3BUk1ZE=
65 | github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=
66 | github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=
67 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
68 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
69 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
70 | github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
71 | github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c=
72 | github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w=
73 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
74 | github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
75 | github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
76 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
77 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
78 | github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
79 | github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
80 | github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
81 | github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
82 | github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
83 | github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
84 | github.com/tkrajina/go-reflector v0.5.5/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4=
85 | github.com/tkrajina/go-reflector v0.5.6 h1:hKQ0gyocG7vgMD2M3dRlYN6WBBOmdoOzJ6njQSepKdE=
86 | github.com/tkrajina/go-reflector v0.5.6/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4=
87 | github.com/tkrajina/typescriptify-golang-structs v0.1.10 h1:W/Ta9Kqo2lV+7bVXuQoUhZ0bDlnjwtPpKsy3A9M1nYg=
88 | github.com/tkrajina/typescriptify-golang-structs v0.1.10/go.mod h1:sjU00nti/PMEOZb07KljFlR+lJ+RotsC0GBQMv9EKls=
89 | github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
90 | github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
91 | github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
92 | github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
93 | golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
94 | golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
95 | golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
96 | golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
97 | golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
98 | golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
99 | golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
100 | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
101 | golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
102 | golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
103 | golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
104 | golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
105 | golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
106 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
107 | golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
108 | golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
109 | golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
110 | golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
111 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
112 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
113 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
114 | google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
115 | google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
116 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
117 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
118 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
119 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
120 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
121 | rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
122 |
--------------------------------------------------------------------------------
/examples/echo/go.sum:
--------------------------------------------------------------------------------
1 | github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
2 | github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
3 | github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=
4 | github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=
5 | github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
6 | github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
7 | github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
8 | github.com/creasty/defaults v1.7.0 h1:eNdqZvc5B509z18lD8yc212CAqJNvfT1Jq6L8WowdBA=
9 | github.com/creasty/defaults v1.7.0/go.mod h1:iGzKe6pbEHnpMPtfDXZEr0NVxWnPTjb1bbDy08fPzYM=
10 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
11 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
12 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
13 | github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
14 | github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo=
15 | github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
16 | github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk=
17 | github.com/dop251/goja v0.0.0-20230919151941-fc55792775de h1:lA38Xtzr1Wo+iQdkN2E11ziKXJYRxLlzK/e2/fdxoEI=
18 | github.com/dop251/goja v0.0.0-20230919151941-fc55792775de/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4=
19 | github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y=
20 | github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d/go.mod h1:DngW8aVqWbuLRMHItjPUyqdj+HWPvnQe8V8y1nDpIbM=
21 | github.com/evanw/esbuild v0.19.3 h1:foPr0xwQM3lBWKBtscauTN9FrmJzRDVI2+EGOs82H/I=
22 | github.com/evanw/esbuild v0.19.3/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk=
23 | github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
24 | github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
25 | github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU=
26 | github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg=
27 | github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
28 | github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
29 | github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
30 | github.com/google/pprof v0.0.0-20230207041349-798e818bf904 h1:4/hN5RUoecvl+RmJRE2YxKWtnnQls6rQjjW5oV7qg2U=
31 | github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg=
32 | github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
33 | github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
34 | github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=
35 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
36 | github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
37 | github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
38 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
39 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
40 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
41 | github.com/labstack/echo/v4 v4.11.1 h1:dEpLU2FLg4UVmvCGPuk/APjlH6GDpbEPti61srUUUs4=
42 | github.com/labstack/echo/v4 v4.11.1/go.mod h1:YuYRTSM3CHs2ybfrL8Px48bO6BAnYIN4l8wSTMP6BDQ=
43 | github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8=
44 | github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM=
45 | github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
46 | github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
47 | github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
48 | github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
49 | github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
50 | github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
51 | github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
52 | github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
53 | github.com/natewong1313/go-react-ssr v0.1.0 h1:v/8q4dHGkyWXumrSIYZlZf/03DdG0RSMtQ1VcF1Ba5k=
54 | github.com/natewong1313/go-react-ssr v0.1.0/go.mod h1:48ue0an62Sqbk9Xgl2HiD9AA/lNJ7Wbz9mFhZHs9JYA=
55 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
56 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
57 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
58 | github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
59 | github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
60 | github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c=
61 | github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w=
62 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
63 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
64 | github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
65 | github.com/tkrajina/go-reflector v0.5.5 h1:gwoQFNye30Kk7NrExj8zm3zFtrGPqOkzFMLuQZg1DtQ=
66 | github.com/tkrajina/go-reflector v0.5.5/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4=
67 | github.com/tkrajina/typescriptify-golang-structs v0.1.10 h1:W/Ta9Kqo2lV+7bVXuQoUhZ0bDlnjwtPpKsy3A9M1nYg=
68 | github.com/tkrajina/typescriptify-golang-structs v0.1.10/go.mod h1:sjU00nti/PMEOZb07KljFlR+lJ+RotsC0GBQMv9EKls=
69 | github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
70 | github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
71 | github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
72 | github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
73 | github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
74 | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
75 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
76 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
77 | golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA=
78 | golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
79 | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
80 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
81 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
82 | golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
83 | golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50=
84 | golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
85 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
86 | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
87 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
88 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
89 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
90 | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
91 | golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
92 | golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
93 | golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
94 | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
95 | golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
96 | golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
97 | golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
98 | golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
99 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
100 | golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
101 | golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
102 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
103 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
104 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
105 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
106 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
107 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
108 | golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
109 | golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
110 | golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
111 | golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
112 | golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
113 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
114 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
115 | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
116 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
117 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
118 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
119 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
120 | gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
121 | gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
122 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
123 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
124 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
125 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
126 |
--------------------------------------------------------------------------------
/examples/frontend-mui/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend-mui",
3 | "lockfileVersion": 3,
4 | "requires": true,
5 | "packages": {
6 | "": {
7 | "dependencies": {
8 | "@emotion/react": "^11.11.1",
9 | "@emotion/styled": "^11.11.0",
10 | "@mui/material": "^5.14.14",
11 | "react": "^18.2.0",
12 | "react-dom": "^18.2.0"
13 | },
14 | "devDependencies": {
15 | "@types/react": "^18.2.21",
16 | "@types/react-dom": "^18.2.7",
17 | "typescript": "^5.2.2"
18 | }
19 | },
20 | "node_modules/@babel/code-frame": {
21 | "version": "7.22.13",
22 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz",
23 | "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==",
24 | "dependencies": {
25 | "@babel/highlight": "^7.22.13",
26 | "chalk": "^2.4.2"
27 | },
28 | "engines": {
29 | "node": ">=6.9.0"
30 | }
31 | },
32 | "node_modules/@babel/helper-module-imports": {
33 | "version": "7.22.15",
34 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
35 | "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
36 | "dependencies": {
37 | "@babel/types": "^7.22.15"
38 | },
39 | "engines": {
40 | "node": ">=6.9.0"
41 | }
42 | },
43 | "node_modules/@babel/helper-string-parser": {
44 | "version": "7.22.5",
45 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
46 | "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
47 | "engines": {
48 | "node": ">=6.9.0"
49 | }
50 | },
51 | "node_modules/@babel/helper-validator-identifier": {
52 | "version": "7.22.20",
53 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
54 | "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
55 | "engines": {
56 | "node": ">=6.9.0"
57 | }
58 | },
59 | "node_modules/@babel/highlight": {
60 | "version": "7.22.20",
61 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz",
62 | "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==",
63 | "dependencies": {
64 | "@babel/helper-validator-identifier": "^7.22.20",
65 | "chalk": "^2.4.2",
66 | "js-tokens": "^4.0.0"
67 | },
68 | "engines": {
69 | "node": ">=6.9.0"
70 | }
71 | },
72 | "node_modules/@babel/runtime": {
73 | "version": "7.23.2",
74 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz",
75 | "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==",
76 | "dependencies": {
77 | "regenerator-runtime": "^0.14.0"
78 | },
79 | "engines": {
80 | "node": ">=6.9.0"
81 | }
82 | },
83 | "node_modules/@babel/types": {
84 | "version": "7.23.0",
85 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz",
86 | "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==",
87 | "dependencies": {
88 | "@babel/helper-string-parser": "^7.22.5",
89 | "@babel/helper-validator-identifier": "^7.22.20",
90 | "to-fast-properties": "^2.0.0"
91 | },
92 | "engines": {
93 | "node": ">=6.9.0"
94 | }
95 | },
96 | "node_modules/@emotion/babel-plugin": {
97 | "version": "11.11.0",
98 | "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz",
99 | "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==",
100 | "dependencies": {
101 | "@babel/helper-module-imports": "^7.16.7",
102 | "@babel/runtime": "^7.18.3",
103 | "@emotion/hash": "^0.9.1",
104 | "@emotion/memoize": "^0.8.1",
105 | "@emotion/serialize": "^1.1.2",
106 | "babel-plugin-macros": "^3.1.0",
107 | "convert-source-map": "^1.5.0",
108 | "escape-string-regexp": "^4.0.0",
109 | "find-root": "^1.1.0",
110 | "source-map": "^0.5.7",
111 | "stylis": "4.2.0"
112 | }
113 | },
114 | "node_modules/@emotion/cache": {
115 | "version": "11.11.0",
116 | "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz",
117 | "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==",
118 | "dependencies": {
119 | "@emotion/memoize": "^0.8.1",
120 | "@emotion/sheet": "^1.2.2",
121 | "@emotion/utils": "^1.2.1",
122 | "@emotion/weak-memoize": "^0.3.1",
123 | "stylis": "4.2.0"
124 | }
125 | },
126 | "node_modules/@emotion/hash": {
127 | "version": "0.9.1",
128 | "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz",
129 | "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ=="
130 | },
131 | "node_modules/@emotion/is-prop-valid": {
132 | "version": "1.2.1",
133 | "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz",
134 | "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==",
135 | "dependencies": {
136 | "@emotion/memoize": "^0.8.1"
137 | }
138 | },
139 | "node_modules/@emotion/memoize": {
140 | "version": "0.8.1",
141 | "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
142 | "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA=="
143 | },
144 | "node_modules/@emotion/react": {
145 | "version": "11.11.1",
146 | "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz",
147 | "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==",
148 | "dependencies": {
149 | "@babel/runtime": "^7.18.3",
150 | "@emotion/babel-plugin": "^11.11.0",
151 | "@emotion/cache": "^11.11.0",
152 | "@emotion/serialize": "^1.1.2",
153 | "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
154 | "@emotion/utils": "^1.2.1",
155 | "@emotion/weak-memoize": "^0.3.1",
156 | "hoist-non-react-statics": "^3.3.1"
157 | },
158 | "peerDependencies": {
159 | "react": ">=16.8.0"
160 | },
161 | "peerDependenciesMeta": {
162 | "@types/react": {
163 | "optional": true
164 | }
165 | }
166 | },
167 | "node_modules/@emotion/serialize": {
168 | "version": "1.1.2",
169 | "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz",
170 | "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==",
171 | "dependencies": {
172 | "@emotion/hash": "^0.9.1",
173 | "@emotion/memoize": "^0.8.1",
174 | "@emotion/unitless": "^0.8.1",
175 | "@emotion/utils": "^1.2.1",
176 | "csstype": "^3.0.2"
177 | }
178 | },
179 | "node_modules/@emotion/sheet": {
180 | "version": "1.2.2",
181 | "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz",
182 | "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA=="
183 | },
184 | "node_modules/@emotion/styled": {
185 | "version": "11.11.0",
186 | "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz",
187 | "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==",
188 | "dependencies": {
189 | "@babel/runtime": "^7.18.3",
190 | "@emotion/babel-plugin": "^11.11.0",
191 | "@emotion/is-prop-valid": "^1.2.1",
192 | "@emotion/serialize": "^1.1.2",
193 | "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
194 | "@emotion/utils": "^1.2.1"
195 | },
196 | "peerDependencies": {
197 | "@emotion/react": "^11.0.0-rc.0",
198 | "react": ">=16.8.0"
199 | },
200 | "peerDependenciesMeta": {
201 | "@types/react": {
202 | "optional": true
203 | }
204 | }
205 | },
206 | "node_modules/@emotion/unitless": {
207 | "version": "0.8.1",
208 | "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
209 | "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="
210 | },
211 | "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
212 | "version": "1.0.1",
213 | "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz",
214 | "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==",
215 | "peerDependencies": {
216 | "react": ">=16.8.0"
217 | }
218 | },
219 | "node_modules/@emotion/utils": {
220 | "version": "1.2.1",
221 | "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz",
222 | "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg=="
223 | },
224 | "node_modules/@emotion/weak-memoize": {
225 | "version": "0.3.1",
226 | "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz",
227 | "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww=="
228 | },
229 | "node_modules/@floating-ui/core": {
230 | "version": "1.5.0",
231 | "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz",
232 | "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==",
233 | "dependencies": {
234 | "@floating-ui/utils": "^0.1.3"
235 | }
236 | },
237 | "node_modules/@floating-ui/dom": {
238 | "version": "1.5.3",
239 | "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz",
240 | "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==",
241 | "dependencies": {
242 | "@floating-ui/core": "^1.4.2",
243 | "@floating-ui/utils": "^0.1.3"
244 | }
245 | },
246 | "node_modules/@floating-ui/react-dom": {
247 | "version": "2.0.2",
248 | "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz",
249 | "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==",
250 | "dependencies": {
251 | "@floating-ui/dom": "^1.5.1"
252 | },
253 | "peerDependencies": {
254 | "react": ">=16.8.0",
255 | "react-dom": ">=16.8.0"
256 | }
257 | },
258 | "node_modules/@floating-ui/utils": {
259 | "version": "0.1.6",
260 | "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz",
261 | "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A=="
262 | },
263 | "node_modules/@mui/base": {
264 | "version": "5.0.0-beta.20",
265 | "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.20.tgz",
266 | "integrity": "sha512-CS2pUuqxST7ch9VNDCklRYDbJ3rru20Tx7na92QvVVKfu3RL4z/QLuVIc8jYGsdCnauMaeUSlFNLAJNb0yXe6w==",
267 | "dependencies": {
268 | "@babel/runtime": "^7.23.1",
269 | "@floating-ui/react-dom": "^2.0.2",
270 | "@mui/types": "^7.2.6",
271 | "@mui/utils": "^5.14.13",
272 | "@popperjs/core": "^2.11.8",
273 | "clsx": "^2.0.0",
274 | "prop-types": "^15.8.1"
275 | },
276 | "engines": {
277 | "node": ">=12.0.0"
278 | },
279 | "funding": {
280 | "type": "opencollective",
281 | "url": "https://opencollective.com/mui"
282 | },
283 | "peerDependencies": {
284 | "@types/react": "^17.0.0 || ^18.0.0",
285 | "react": "^17.0.0 || ^18.0.0",
286 | "react-dom": "^17.0.0 || ^18.0.0"
287 | },
288 | "peerDependenciesMeta": {
289 | "@types/react": {
290 | "optional": true
291 | }
292 | }
293 | },
294 | "node_modules/@mui/core-downloads-tracker": {
295 | "version": "5.14.14",
296 | "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.14.tgz",
297 | "integrity": "sha512-Rw/xKiTOUgXD8hdKqj60aC6QcGprMipG7ne2giK6Mz7b4PlhL/xog9xLeclY3BxsRLkZQ05egFnIEY1CSibTbw==",
298 | "funding": {
299 | "type": "opencollective",
300 | "url": "https://opencollective.com/mui"
301 | }
302 | },
303 | "node_modules/@mui/material": {
304 | "version": "5.14.14",
305 | "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.14.tgz",
306 | "integrity": "sha512-cAmCwAHFQXxb44kWbVFkhKATN8tACgMsFwrXo8ro6WzYW73U/qsR5AcCiJIhCyYYg+gcftfkmNcpRaV3JjhHCg==",
307 | "dependencies": {
308 | "@babel/runtime": "^7.23.1",
309 | "@mui/base": "5.0.0-beta.20",
310 | "@mui/core-downloads-tracker": "^5.14.14",
311 | "@mui/system": "^5.14.14",
312 | "@mui/types": "^7.2.6",
313 | "@mui/utils": "^5.14.13",
314 | "@types/react-transition-group": "^4.4.7",
315 | "clsx": "^2.0.0",
316 | "csstype": "^3.1.2",
317 | "prop-types": "^15.8.1",
318 | "react-is": "^18.2.0",
319 | "react-transition-group": "^4.4.5"
320 | },
321 | "engines": {
322 | "node": ">=12.0.0"
323 | },
324 | "funding": {
325 | "type": "opencollective",
326 | "url": "https://opencollective.com/mui"
327 | },
328 | "peerDependencies": {
329 | "@emotion/react": "^11.5.0",
330 | "@emotion/styled": "^11.3.0",
331 | "@types/react": "^17.0.0 || ^18.0.0",
332 | "react": "^17.0.0 || ^18.0.0",
333 | "react-dom": "^17.0.0 || ^18.0.0"
334 | },
335 | "peerDependenciesMeta": {
336 | "@emotion/react": {
337 | "optional": true
338 | },
339 | "@emotion/styled": {
340 | "optional": true
341 | },
342 | "@types/react": {
343 | "optional": true
344 | }
345 | }
346 | },
347 | "node_modules/@mui/private-theming": {
348 | "version": "5.14.14",
349 | "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.14.tgz",
350 | "integrity": "sha512-n77au3CQj9uu16hak2Y+rvbGSBaJKxziG/gEbOLVGrAuqZ+ycVSkorCfN6Y/4XgYOpG/xvmuiY3JwhAEOzY3iA==",
351 | "dependencies": {
352 | "@babel/runtime": "^7.23.1",
353 | "@mui/utils": "^5.14.13",
354 | "prop-types": "^15.8.1"
355 | },
356 | "engines": {
357 | "node": ">=12.0.0"
358 | },
359 | "funding": {
360 | "type": "opencollective",
361 | "url": "https://opencollective.com/mui"
362 | },
363 | "peerDependencies": {
364 | "@types/react": "^17.0.0 || ^18.0.0",
365 | "react": "^17.0.0 || ^18.0.0"
366 | },
367 | "peerDependenciesMeta": {
368 | "@types/react": {
369 | "optional": true
370 | }
371 | }
372 | },
373 | "node_modules/@mui/styled-engine": {
374 | "version": "5.14.14",
375 | "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.14.tgz",
376 | "integrity": "sha512-sF3DS2PVG+cFWvkVHQQaGFpL1h6gSwOW3L91pdxPLQDHDZ5mZ/X0SlXU5XA+WjypoysG4urdAQC7CH/BRvUiqg==",
377 | "dependencies": {
378 | "@babel/runtime": "^7.23.1",
379 | "@emotion/cache": "^11.11.0",
380 | "csstype": "^3.1.2",
381 | "prop-types": "^15.8.1"
382 | },
383 | "engines": {
384 | "node": ">=12.0.0"
385 | },
386 | "funding": {
387 | "type": "opencollective",
388 | "url": "https://opencollective.com/mui"
389 | },
390 | "peerDependencies": {
391 | "@emotion/react": "^11.4.1",
392 | "@emotion/styled": "^11.3.0",
393 | "react": "^17.0.0 || ^18.0.0"
394 | },
395 | "peerDependenciesMeta": {
396 | "@emotion/react": {
397 | "optional": true
398 | },
399 | "@emotion/styled": {
400 | "optional": true
401 | }
402 | }
403 | },
404 | "node_modules/@mui/system": {
405 | "version": "5.14.14",
406 | "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.14.tgz",
407 | "integrity": "sha512-y4InFmCgGGWXnz+iK4jRTWVikY0HgYnABjz4wgiUgEa2W1H8M4ow+27BegExUWPkj4TWthQ2qG9FOGSMtI+PKA==",
408 | "dependencies": {
409 | "@babel/runtime": "^7.23.1",
410 | "@mui/private-theming": "^5.14.14",
411 | "@mui/styled-engine": "^5.14.13",
412 | "@mui/types": "^7.2.6",
413 | "@mui/utils": "^5.14.13",
414 | "clsx": "^2.0.0",
415 | "csstype": "^3.1.2",
416 | "prop-types": "^15.8.1"
417 | },
418 | "engines": {
419 | "node": ">=12.0.0"
420 | },
421 | "funding": {
422 | "type": "opencollective",
423 | "url": "https://opencollective.com/mui"
424 | },
425 | "peerDependencies": {
426 | "@emotion/react": "^11.5.0",
427 | "@emotion/styled": "^11.3.0",
428 | "@types/react": "^17.0.0 || ^18.0.0",
429 | "react": "^17.0.0 || ^18.0.0"
430 | },
431 | "peerDependenciesMeta": {
432 | "@emotion/react": {
433 | "optional": true
434 | },
435 | "@emotion/styled": {
436 | "optional": true
437 | },
438 | "@types/react": {
439 | "optional": true
440 | }
441 | }
442 | },
443 | "node_modules/@mui/types": {
444 | "version": "7.2.6",
445 | "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.6.tgz",
446 | "integrity": "sha512-7sjLQrUmBwufm/M7jw/quNiPK/oor2+pGUQP2CULRcFCArYTq78oJ3D5esTaL0UMkXKJvDqXn6Ike69yAOBQng==",
447 | "peerDependencies": {
448 | "@types/react": "^17.0.0 || ^18.0.0"
449 | },
450 | "peerDependenciesMeta": {
451 | "@types/react": {
452 | "optional": true
453 | }
454 | }
455 | },
456 | "node_modules/@mui/utils": {
457 | "version": "5.14.14",
458 | "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.14.tgz",
459 | "integrity": "sha512-3AKp8uksje5sRfVrtgG9Q/2TBsHWVBUtA0NaXliZqGcXo8J+A+Agp0qUW2rJ+ivgPWTCCubz9FZVT2IQZ3bGsw==",
460 | "dependencies": {
461 | "@babel/runtime": "^7.23.1",
462 | "@types/prop-types": "^15.7.7",
463 | "prop-types": "^15.8.1",
464 | "react-is": "^18.2.0"
465 | },
466 | "engines": {
467 | "node": ">=12.0.0"
468 | },
469 | "funding": {
470 | "type": "opencollective",
471 | "url": "https://opencollective.com/mui"
472 | },
473 | "peerDependencies": {
474 | "@types/react": "^17.0.0 || ^18.0.0",
475 | "react": "^17.0.0 || ^18.0.0"
476 | },
477 | "peerDependenciesMeta": {
478 | "@types/react": {
479 | "optional": true
480 | }
481 | }
482 | },
483 | "node_modules/@popperjs/core": {
484 | "version": "2.11.8",
485 | "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
486 | "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
487 | "funding": {
488 | "type": "opencollective",
489 | "url": "https://opencollective.com/popperjs"
490 | }
491 | },
492 | "node_modules/@types/parse-json": {
493 | "version": "4.0.1",
494 | "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz",
495 | "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng=="
496 | },
497 | "node_modules/@types/prop-types": {
498 | "version": "15.7.9",
499 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz",
500 | "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g=="
501 | },
502 | "node_modules/@types/react": {
503 | "version": "18.2.21",
504 | "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.21.tgz",
505 | "integrity": "sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==",
506 | "dependencies": {
507 | "@types/prop-types": "*",
508 | "@types/scheduler": "*",
509 | "csstype": "^3.0.2"
510 | }
511 | },
512 | "node_modules/@types/react-dom": {
513 | "version": "18.2.7",
514 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz",
515 | "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==",
516 | "dev": true,
517 | "dependencies": {
518 | "@types/react": "*"
519 | }
520 | },
521 | "node_modules/@types/react-transition-group": {
522 | "version": "4.4.8",
523 | "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.8.tgz",
524 | "integrity": "sha512-QmQ22q+Pb+HQSn04NL3HtrqHwYMf4h3QKArOy5F8U5nEVMaihBs3SR10WiOM1iwPz5jIo8x/u11al+iEGZZrvg==",
525 | "dependencies": {
526 | "@types/react": "*"
527 | }
528 | },
529 | "node_modules/@types/scheduler": {
530 | "version": "0.16.3",
531 | "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz",
532 | "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ=="
533 | },
534 | "node_modules/ansi-styles": {
535 | "version": "3.2.1",
536 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
537 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
538 | "dependencies": {
539 | "color-convert": "^1.9.0"
540 | },
541 | "engines": {
542 | "node": ">=4"
543 | }
544 | },
545 | "node_modules/babel-plugin-macros": {
546 | "version": "3.1.0",
547 | "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
548 | "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
549 | "dependencies": {
550 | "@babel/runtime": "^7.12.5",
551 | "cosmiconfig": "^7.0.0",
552 | "resolve": "^1.19.0"
553 | },
554 | "engines": {
555 | "node": ">=10",
556 | "npm": ">=6"
557 | }
558 | },
559 | "node_modules/callsites": {
560 | "version": "3.1.0",
561 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
562 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
563 | "engines": {
564 | "node": ">=6"
565 | }
566 | },
567 | "node_modules/chalk": {
568 | "version": "2.4.2",
569 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
570 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
571 | "dependencies": {
572 | "ansi-styles": "^3.2.1",
573 | "escape-string-regexp": "^1.0.5",
574 | "supports-color": "^5.3.0"
575 | },
576 | "engines": {
577 | "node": ">=4"
578 | }
579 | },
580 | "node_modules/chalk/node_modules/escape-string-regexp": {
581 | "version": "1.0.5",
582 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
583 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
584 | "engines": {
585 | "node": ">=0.8.0"
586 | }
587 | },
588 | "node_modules/clsx": {
589 | "version": "2.0.0",
590 | "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz",
591 | "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==",
592 | "engines": {
593 | "node": ">=6"
594 | }
595 | },
596 | "node_modules/color-convert": {
597 | "version": "1.9.3",
598 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
599 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
600 | "dependencies": {
601 | "color-name": "1.1.3"
602 | }
603 | },
604 | "node_modules/color-name": {
605 | "version": "1.1.3",
606 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
607 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
608 | },
609 | "node_modules/convert-source-map": {
610 | "version": "1.9.0",
611 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
612 | "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
613 | },
614 | "node_modules/cosmiconfig": {
615 | "version": "7.1.0",
616 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
617 | "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
618 | "dependencies": {
619 | "@types/parse-json": "^4.0.0",
620 | "import-fresh": "^3.2.1",
621 | "parse-json": "^5.0.0",
622 | "path-type": "^4.0.0",
623 | "yaml": "^1.10.0"
624 | },
625 | "engines": {
626 | "node": ">=10"
627 | }
628 | },
629 | "node_modules/csstype": {
630 | "version": "3.1.2",
631 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
632 | "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
633 | },
634 | "node_modules/dom-helpers": {
635 | "version": "5.2.1",
636 | "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
637 | "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
638 | "dependencies": {
639 | "@babel/runtime": "^7.8.7",
640 | "csstype": "^3.0.2"
641 | }
642 | },
643 | "node_modules/error-ex": {
644 | "version": "1.3.2",
645 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
646 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
647 | "dependencies": {
648 | "is-arrayish": "^0.2.1"
649 | }
650 | },
651 | "node_modules/escape-string-regexp": {
652 | "version": "4.0.0",
653 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
654 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
655 | "engines": {
656 | "node": ">=10"
657 | },
658 | "funding": {
659 | "url": "https://github.com/sponsors/sindresorhus"
660 | }
661 | },
662 | "node_modules/find-root": {
663 | "version": "1.1.0",
664 | "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
665 | "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
666 | },
667 | "node_modules/function-bind": {
668 | "version": "1.1.2",
669 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
670 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
671 | "funding": {
672 | "url": "https://github.com/sponsors/ljharb"
673 | }
674 | },
675 | "node_modules/has-flag": {
676 | "version": "3.0.0",
677 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
678 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
679 | "engines": {
680 | "node": ">=4"
681 | }
682 | },
683 | "node_modules/hasown": {
684 | "version": "2.0.0",
685 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
686 | "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
687 | "dependencies": {
688 | "function-bind": "^1.1.2"
689 | },
690 | "engines": {
691 | "node": ">= 0.4"
692 | }
693 | },
694 | "node_modules/hoist-non-react-statics": {
695 | "version": "3.3.2",
696 | "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
697 | "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
698 | "dependencies": {
699 | "react-is": "^16.7.0"
700 | }
701 | },
702 | "node_modules/hoist-non-react-statics/node_modules/react-is": {
703 | "version": "16.13.1",
704 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
705 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
706 | },
707 | "node_modules/import-fresh": {
708 | "version": "3.3.0",
709 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
710 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
711 | "dependencies": {
712 | "parent-module": "^1.0.0",
713 | "resolve-from": "^4.0.0"
714 | },
715 | "engines": {
716 | "node": ">=6"
717 | },
718 | "funding": {
719 | "url": "https://github.com/sponsors/sindresorhus"
720 | }
721 | },
722 | "node_modules/is-arrayish": {
723 | "version": "0.2.1",
724 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
725 | "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
726 | },
727 | "node_modules/is-core-module": {
728 | "version": "2.13.1",
729 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
730 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
731 | "dependencies": {
732 | "hasown": "^2.0.0"
733 | },
734 | "funding": {
735 | "url": "https://github.com/sponsors/ljharb"
736 | }
737 | },
738 | "node_modules/js-tokens": {
739 | "version": "4.0.0",
740 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
741 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
742 | },
743 | "node_modules/json-parse-even-better-errors": {
744 | "version": "2.3.1",
745 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
746 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
747 | },
748 | "node_modules/lines-and-columns": {
749 | "version": "1.2.4",
750 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
751 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
752 | },
753 | "node_modules/loose-envify": {
754 | "version": "1.4.0",
755 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
756 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
757 | "dependencies": {
758 | "js-tokens": "^3.0.0 || ^4.0.0"
759 | },
760 | "bin": {
761 | "loose-envify": "cli.js"
762 | }
763 | },
764 | "node_modules/object-assign": {
765 | "version": "4.1.1",
766 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
767 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
768 | "engines": {
769 | "node": ">=0.10.0"
770 | }
771 | },
772 | "node_modules/parent-module": {
773 | "version": "1.0.1",
774 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
775 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
776 | "dependencies": {
777 | "callsites": "^3.0.0"
778 | },
779 | "engines": {
780 | "node": ">=6"
781 | }
782 | },
783 | "node_modules/parse-json": {
784 | "version": "5.2.0",
785 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
786 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
787 | "dependencies": {
788 | "@babel/code-frame": "^7.0.0",
789 | "error-ex": "^1.3.1",
790 | "json-parse-even-better-errors": "^2.3.0",
791 | "lines-and-columns": "^1.1.6"
792 | },
793 | "engines": {
794 | "node": ">=8"
795 | },
796 | "funding": {
797 | "url": "https://github.com/sponsors/sindresorhus"
798 | }
799 | },
800 | "node_modules/path-parse": {
801 | "version": "1.0.7",
802 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
803 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
804 | },
805 | "node_modules/path-type": {
806 | "version": "4.0.0",
807 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
808 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
809 | "engines": {
810 | "node": ">=8"
811 | }
812 | },
813 | "node_modules/prop-types": {
814 | "version": "15.8.1",
815 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
816 | "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
817 | "dependencies": {
818 | "loose-envify": "^1.4.0",
819 | "object-assign": "^4.1.1",
820 | "react-is": "^16.13.1"
821 | }
822 | },
823 | "node_modules/prop-types/node_modules/react-is": {
824 | "version": "16.13.1",
825 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
826 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
827 | },
828 | "node_modules/react": {
829 | "version": "18.2.0",
830 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
831 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
832 | "dependencies": {
833 | "loose-envify": "^1.1.0"
834 | },
835 | "engines": {
836 | "node": ">=0.10.0"
837 | }
838 | },
839 | "node_modules/react-dom": {
840 | "version": "18.2.0",
841 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
842 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
843 | "dependencies": {
844 | "loose-envify": "^1.1.0",
845 | "scheduler": "^0.23.0"
846 | },
847 | "peerDependencies": {
848 | "react": "^18.2.0"
849 | }
850 | },
851 | "node_modules/react-is": {
852 | "version": "18.2.0",
853 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
854 | "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
855 | },
856 | "node_modules/react-transition-group": {
857 | "version": "4.4.5",
858 | "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
859 | "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
860 | "dependencies": {
861 | "@babel/runtime": "^7.5.5",
862 | "dom-helpers": "^5.0.1",
863 | "loose-envify": "^1.4.0",
864 | "prop-types": "^15.6.2"
865 | },
866 | "peerDependencies": {
867 | "react": ">=16.6.0",
868 | "react-dom": ">=16.6.0"
869 | }
870 | },
871 | "node_modules/regenerator-runtime": {
872 | "version": "0.14.0",
873 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
874 | "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA=="
875 | },
876 | "node_modules/resolve": {
877 | "version": "1.22.8",
878 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
879 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
880 | "dependencies": {
881 | "is-core-module": "^2.13.0",
882 | "path-parse": "^1.0.7",
883 | "supports-preserve-symlinks-flag": "^1.0.0"
884 | },
885 | "bin": {
886 | "resolve": "bin/resolve"
887 | },
888 | "funding": {
889 | "url": "https://github.com/sponsors/ljharb"
890 | }
891 | },
892 | "node_modules/resolve-from": {
893 | "version": "4.0.0",
894 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
895 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
896 | "engines": {
897 | "node": ">=4"
898 | }
899 | },
900 | "node_modules/scheduler": {
901 | "version": "0.23.0",
902 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
903 | "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
904 | "dependencies": {
905 | "loose-envify": "^1.1.0"
906 | }
907 | },
908 | "node_modules/source-map": {
909 | "version": "0.5.7",
910 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
911 | "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
912 | "engines": {
913 | "node": ">=0.10.0"
914 | }
915 | },
916 | "node_modules/stylis": {
917 | "version": "4.2.0",
918 | "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
919 | "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="
920 | },
921 | "node_modules/supports-color": {
922 | "version": "5.5.0",
923 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
924 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
925 | "dependencies": {
926 | "has-flag": "^3.0.0"
927 | },
928 | "engines": {
929 | "node": ">=4"
930 | }
931 | },
932 | "node_modules/supports-preserve-symlinks-flag": {
933 | "version": "1.0.0",
934 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
935 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
936 | "engines": {
937 | "node": ">= 0.4"
938 | },
939 | "funding": {
940 | "url": "https://github.com/sponsors/ljharb"
941 | }
942 | },
943 | "node_modules/to-fast-properties": {
944 | "version": "2.0.0",
945 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
946 | "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
947 | "engines": {
948 | "node": ">=4"
949 | }
950 | },
951 | "node_modules/typescript": {
952 | "version": "5.2.2",
953 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
954 | "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
955 | "dev": true,
956 | "bin": {
957 | "tsc": "bin/tsc",
958 | "tsserver": "bin/tsserver"
959 | },
960 | "engines": {
961 | "node": ">=14.17"
962 | }
963 | },
964 | "node_modules/yaml": {
965 | "version": "1.10.2",
966 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
967 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
968 | "engines": {
969 | "node": ">= 6"
970 | }
971 | }
972 | }
973 | }
974 |
--------------------------------------------------------------------------------