From 79188c503f9ab4518bf2c303f4ad28016100b1eb Mon Sep 17 00:00:00 2001
From: Lea Anthony
Date: Sat, 8 Feb 2020 09:58:16 +1100
Subject: [PATCH] Develop (#343)
* Support Distribution 'ArcoLinux' #310 (#312)
* Support Distribution 'ArcoLinux' #310
* Vuetify2 support (resurrected from git@github.com:MichaelHipp/wails.git) (#315)
* Initial create of vuetify2-basic folder
* Change template descr of vuetify-basic to say Vuetify 1.5
* Get vuetify2 template installing vuetify v2.0 (but with styling probs)
* Update App.vue, HelloWorld.vue for Vuetify v2
* Remove babel-polyfill, add mdi/font
* fix: codacy corrections
* fix: babel -> core-js, regenerator-runtime
Co-authored-by: Michael Hipp
Co-authored-by: Lea Anthony
* Update Contributors
* v1.0.2-pre1
* [313-remote-conn] allow remote connections to the websocket bridge (#314)
* [313-remote-conn] feat: compute wsURL based on window.location
* [313-remote-conn] feat: allow any host to connect to vue server
removing the 'host: "localhost"' specification causes the development
server to listen on all interfaces.
* [313-remote-conn] feat: allow any host to connect to angular dev server
* test: reinject tabs
Co-authored-by: Lea Anthony
* fix: disable host check for vuetify 2 template
* v1.0.2-pre2
* fix: shutdown ipcmanager
* use channel to trigger shutdown
* load linuxdb from relative path
* Feat manjaro arm & deepin (#324)
* feat: new distros: manjaroARM & Deepin
* v1.0.2-pre3
* [326-platform-raspbian] feat: implement raspbian support (#327)
* fix: emit arguments (#306)
* v1.0.2-pre4 Raspbarian support
* Initial support for Typescript decl file (#330)
* v1.0.2-pre5
* revert to Go 1.12
* New CI (#331)
* prepare
* new CI/github actions
* Rename later-pre.yml to latest-pre.yml
* Update latest-pre.yml
* Update README.md
* Ensure version in go.mod is up to date (#339)
* release v1.0.2-pre6
* Fix typescript generation
* Release v1.0.2-pre7
* 316-multi-bridge-conn (#317)
* [316-multi-bridge-conn] feat: use callback func for bridge response
* [316-multi-bridge-conn] feat: implement multiple session support
* split client handling portion into 'session'
* keep track of sessions by remote address (ip & port)
* notify each of the sessions anytime an event comes across the bus
* [316-multi-bridge-conn] chore: move bridge files to package
* [316-multi-bridge-conn] chore: remove deprecated Callback function
The Callback function is no longer needed for the operation of
the frontend callback since the ipc.Dispatch function now requires
a callback function to be provided as an argument.
This function can be a private function since it is passed by reference.
* [316-multi-bridge-conn] chore: make webview.Callback private
* [316-multi-bridge-conn] chore: remove unused injectCSS function
I believe a slightly better method of doing this might need to be devised
if it is needed in the future. I presume it should collect the values
into a cache and then inject it into each sesssion as it appears.
* [316-multi-bridge-conn] ensure wails:ready event is emitted
Event is only emitted for the first session created from the Bridge.
* [316-multi-bridge-conn] emit events for session lifecycle
Emit an event for each session started and ended.
* [316-multi-bridge-conn] fix: session handling fixes
Co-authored-by: Lea Anthony
* Release v1.0.2-pre8
* Release v1.0.2
Co-authored-by: Byron
Co-authored-by: Travis McLane
Co-authored-by: Michael Hipp
---
.github/workflows/latest-pre.yml | 32 +++
.github/workflows/pr.yml | 32 +++
.github/workflows/release.yml | 34 +++
CONTRIBUTORS.md | 2 +
README.md | 3 +-
app.go | 2 +-
azure-pipelines.yaml | 138 ----------
azure-pipelines.yml | 138 ----------
cmd/cmd-mewn.go | 6 +-
cmd/fs.go | 10 +
cmd/gomod.go | 78 ++++++
cmd/helpers.go | 13 +-
cmd/linux.go | 17 ++
cmd/linuxdb.go | 8 +-
cmd/linuxdb.yaml | 39 ++-
cmd/project.go | 36 ++-
cmd/system.go | 4 +-
.../frontend/package.json.template | 2 +-
.../vuebasic/frontend/babel.config.js | 2 +-
.../vuebasic/frontend/package.json.template | 3 +-
cmd/templates/vuebasic/frontend/src/main.js | 2 +
cmd/templates/vuebasic/frontend/vue.config.js | 3 +-
.../vuetify-basic/frontend/babel.config.js | 2 +-
.../frontend/package.json.template | 6 +-
.../vuetify-basic/frontend/src/main.js | 3 +-
.../vuetify-basic/frontend/vue.config.js | 3 +-
cmd/templates/vuetify-basic/template.json | 8 +-
cmd/templates/vuetify2-basic/.jshint | 3 +
.../vuetify2-basic/frontend/.gitignore | 21 ++
.../vuetify2-basic/frontend/babel.config.js | 5 +
.../frontend/package.json.template | 53 ++++
.../vuetify2-basic/frontend/src/App.vue | 60 ++++
.../frontend/src/assets/images/logo.png | Bin 0 -> 308168 bytes
.../frontend/src/components/HelloWorld.vue | 85 ++++++
.../vuetify2-basic/frontend/src/main.js | 29 ++
.../vuetify2-basic/frontend/vue.config.js | 42 +++
cmd/templates/vuetify2-basic/go.mod.template | 5 +
cmd/templates/vuetify2-basic/main.go.template | 27 ++
cmd/templates/vuetify2-basic/template.json | 14 +
cmd/version.go | 2 +-
cmd/wails/15_migrate.go | 31 +--
cmd/wails/4_build.go | 44 ++-
go.mod | 4 +-
go.sum | 2 +
lib/binding/manager.go | 65 ++++-
lib/event/manager.go | 9 +-
lib/interfaces/ipcmanager.go | 6 +-
lib/interfaces/renderer.go | 1 -
lib/ipc/manager.go | 29 +-
lib/renderer/bridge.go | 260 +-----------------
lib/renderer/bridge/bridge.go | 214 ++++++++++++++
lib/renderer/bridge/session.go | 90 ++++++
lib/renderer/renderer-mewn.go | 6 +-
lib/renderer/webview.go | 6 +-
runtime/assets/bridge.js | 2 +-
runtime/assets/wails.js | 2 +-
runtime/js/runtime/events.js | 3 +-
runtime/js/runtime/init.js | 2 +-
runtime/js/runtime/package.json | 2 +-
59 files changed, 1104 insertions(+), 646 deletions(-)
create mode 100644 .github/workflows/latest-pre.yml
create mode 100644 .github/workflows/pr.yml
create mode 100644 .github/workflows/release.yml
delete mode 100644 azure-pipelines.yaml
delete mode 100644 azure-pipelines.yml
create mode 100644 cmd/gomod.go
create mode 100644 cmd/templates/vuetify2-basic/.jshint
create mode 100644 cmd/templates/vuetify2-basic/frontend/.gitignore
create mode 100644 cmd/templates/vuetify2-basic/frontend/babel.config.js
create mode 100644 cmd/templates/vuetify2-basic/frontend/package.json.template
create mode 100644 cmd/templates/vuetify2-basic/frontend/src/App.vue
create mode 100644 cmd/templates/vuetify2-basic/frontend/src/assets/images/logo.png
create mode 100644 cmd/templates/vuetify2-basic/frontend/src/components/HelloWorld.vue
create mode 100644 cmd/templates/vuetify2-basic/frontend/src/main.js
create mode 100644 cmd/templates/vuetify2-basic/frontend/vue.config.js
create mode 100644 cmd/templates/vuetify2-basic/go.mod.template
create mode 100644 cmd/templates/vuetify2-basic/main.go.template
create mode 100755 cmd/templates/vuetify2-basic/template.json
create mode 100644 lib/renderer/bridge/bridge.go
create mode 100644 lib/renderer/bridge/session.go
diff --git a/.github/workflows/latest-pre.yml b/.github/workflows/latest-pre.yml
new file mode 100644
index 00000000..cfd68163
--- /dev/null
+++ b/.github/workflows/latest-pre.yml
@@ -0,0 +1,32 @@
+name: latest pre-release
+on:
+ push:
+ tags:
+ - '**-pre**'
+jobs:
+
+ build:
+ name: Test Build Latest Pre-Release
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ os: [ubuntu-latest, windows-latest, macOS-latest]
+ steps:
+
+ - name: Set up Go 1.12
+ uses: actions/setup-go@v1
+ with:
+ go-version: 1.12
+ id: go
+
+ - name: Check out code into the Go module directory
+ uses: actions/checkout@v1
+
+ - name: Get dependencies
+ run: |
+ go get -v -d ./...
+ - name: Build
+ run: go build -v ./cmd/wails
+
+ - name: Test
+ run: ./wails version
diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml
new file mode 100644
index 00000000..985447a6
--- /dev/null
+++ b/.github/workflows/pr.yml
@@ -0,0 +1,32 @@
+name: pr
+on:
+ pull_request:
+ branches:
+ - develop
+jobs:
+
+ build:
+ name: Test Build PR
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ os: [ubuntu-latest, windows-latest, macOS-latest]
+ steps:
+
+ - name: Set up Go 1.12
+ uses: actions/setup-go@v1
+ with:
+ go-version: 1.12
+ id: go
+
+ - name: Check out code into the Go module directory
+ uses: actions/checkout@v1
+
+ - name: Get dependencies
+ run: |
+ go get -v -d ./...
+ - name: Build
+ run: go build -v ./cmd/wails
+
+ - name: Test
+ run: ./wails version
\ No newline at end of file
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 00000000..128d378d
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,34 @@
+name: release
+on:
+ push:
+ branches:
+ - master
+ tags:
+ - '!**pre**'
+jobs:
+
+ build:
+ name: Test Build Latest Release
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ os: [ubuntu-latest, windows-latest, macOS-latest]
+ steps:
+
+ - name: Set up Go 1.12
+ uses: actions/setup-go@v1
+ with:
+ go-version: 1.12
+ id: go
+
+ - name: Check out code into the Go module directory
+ uses: actions/checkout@v1
+
+ - name: Get dependencies
+ run: |
+ go get -v -d ./...
+ - name: Build
+ run: go build -v ./cmd/wails
+
+ - name: Test
+ run: ./wails version
\ No newline at end of file
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index 72d2f0bc..4cb887cd 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -21,3 +21,5 @@ Wails is what it is because of the time and effort given by these great people.
* [Robin Eklind](https://github.com/mewmew)
* [Kris Raney](https://github.com/kraney)
* [Jack Mordaunt](https://github.com/JackMordaunt)
+ * [Michael Hipp](https://github.com/MichaelHipp)
+ * [Travis McLane](https://github.com/tmclane)
\ No newline at end of file
diff --git a/README.md b/README.md
index c068bf93..efc76bec 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,8 @@
-
+
+
The traditional method of providing web interfaces to Go programs is via a built-in web server. Wails offers a different approach: it provides the ability to wrap both Go code and a web frontend into a single binary. Tools are provided to make this easy for you by handling project creation, compilation and bundling. All you have to do is get creative!
diff --git a/app.go b/app.go
index e987e6c4..7048e04f 100644
--- a/app.go
+++ b/app.go
@@ -97,7 +97,7 @@ func (a *App) start() error {
// Check if we are to run in bridge mode
if BuildMode == cmd.BuildModeBridge {
- a.renderer = &renderer.Bridge{}
+ a.renderer = renderer.NewBridge()
}
// Initialise the renderer
diff --git a/azure-pipelines.yaml b/azure-pipelines.yaml
deleted file mode 100644
index 2bf81411..00000000
--- a/azure-pipelines.yaml
+++ /dev/null
@@ -1,138 +0,0 @@
-# avoid double trigger by applying some rules
-# start a pipeline when push to 'master' branch
-trigger:
-- master
-# or when pull request on 'develop' branch
-pr:
-- develop
-
-# for now there is only one stage 'Build'
-# in the future we could use multistage strategy for releases
-stages:
-- stage: Build
-
- # there are 3 jobs
- # one for each os
- jobs:
- - deployment: Linux
- displayName: Lin
- variables:
- GOPATH: '$(Agent.BuildDirectory)/gopath' # Go workspace path
- GOROOT: '$(Agent.BuildDirectory)/go' # Go installation path
- GOBIN: '$(GOPATH)/bin' # Go binaries path
- GOMODULE: 'on'
- modulePath: '$(Agent.BuildDirectory)/wails' # Path to the module's code
- pool:
- vmImage: 'Ubuntu-16.04'
- environment: 'linux-dev'
- strategy:
- runOnce:
- deploy:
- steps:
- - checkout: self # self represents the repo where the initial Pipelines YAML file was found
- clean: true # whether to fetch clean each time
- path: wails # path to check out source code, relative to the agent's build directory (e.g. \_work\1)
- # go version 1.12.7
- - script: |
- wget "https://storage.googleapis.com/golang/go1.12.7.linux-amd64.tar.gz" --output-document "$(Agent.BuildDirectory)/go1.12.7.tar.gz"
- tar -C '$(Agent.BuildDirectory)' -xzf "$(Agent.BuildDirectory)/go1.12.7.tar.gz"
- displayName: 'Install Go 1.12.7 Linux'
- - script: |
- mkdir -p '$(GOBIN)'
- mkdir -p '$(GOPATH)/pkg'
- mkdir -p '$(GOROOT)'
- shopt -s extglob
- shopt -s dotglob
- echo '##vso[task.prependpath]$(GOBIN)'
- echo '##vso[task.prependpath]$(GOROOT)/bin'
- displayName: 'Set up the Go workspace'
- - script: |
- go version
- go get -v -d ./...
- cd cmd/wails
- go install
- workingDirectory: '$(modulePath)'
- displayName: 'Get dependencies, then build'
- - script: |
- wails version
- workingDirectory: '$(modulePath)'
- displayName: 'Check we have output'
-
- - deployment: Mac
- displayName: Mac
- variables:
- GOPATH: '$(Agent.BuildDirectory)/gopath' # Go workspace path
- GOROOT: '$(Agent.BuildDirectory)/go' # Go installation path
- GOBIN: '$(GOPATH)/bin' # Go binaries path
- GOMODULE: 'on'
- modulePath: '$(Agent.BuildDirectory)/wails' # Path to the module's code
- pool:
- vmImage: 'macOS-10.14'
- environment: 'mac-dev'
- strategy:
- runOnce:
- deploy:
- steps:
- - checkout: self # self represents the repo where the initial Pipelines YAML file was found
- clean: true # whether to fetch clean each time
- path: wails # path to check out source code, relative to the agent's build directory (e.g. \_work\1)
- # go version 1.12.7
- - script: |
- wget "https://storage.googleapis.com/golang/go1.12.7.darwin-amd64.tar.gz" --output-document "$(Agent.BuildDirectory)/go1.12.7.tar.gz"
- tar -C '$(Agent.BuildDirectory)' -xzf "$(Agent.BuildDirectory)/go1.12.7.tar.gz"
- displayName: 'Install Go 1.12.7 Linux'
- - script: |
- mkdir -p '$(GOBIN)'
- mkdir -p '$(GOPATH)/pkg'
- mkdir -p '$(GOROOT)'
- shopt -s extglob
- shopt -s dotglob
- echo '##vso[task.prependpath]$(GOBIN)'
- echo '##vso[task.prependpath]$(GOROOT)/bin'
- displayName: 'Set up the Go workspace'
- - script: |
- go version
- go get -v -d ./...
- cd cmd/wails
- go install
- workingDirectory: '$(modulePath)'
- displayName: 'Get dependencies, then build'
- - script: |
- wails version
- workingDirectory: '$(modulePath)'
- displayName: 'Check we have output'
-
- - deployment: Win
- displayName: Win
- variables:
- GOMODULE: 'on'
- modulePath: '$(Agent.BuildDirectory)/wails' # Path to the module's code
- pool:
- vmImage: 'windows-2019'
- environment: 'win-dev'
- strategy:
- runOnce:
- deploy:
- steps:
- - checkout: self # self represents the repo where the initial Pipelines YAML file was found
- clean: true # whether to fetch clean each time
- path: wails # path to check out source code, relative to the agent's build directory (e.g. \_work\1)
- # Go tool installer
- # Find in cache or download a specific version of Go and add it to the PATH
- - task: GoTool@0
- inputs:
- version: '1.12.7'
- goPath: '$(Agent.BuildDirectory)/go'
- goBin: '$(Agent.BuildDirectory)/go/bin'
- displayName: 'Set up the Go workspace'
- - script: |
- go version
- go get -v -d ./...
- cd cmd/wails
- go install
- workingDirectory: '$(modulePath)'
- displayName: 'Get dependencies, then build'
- - script: |
- wails version
- workingDirectory: '$(Agent.BuildDirectory)/go/bin'
- displayName: 'Check we have output'
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
deleted file mode 100644
index 2bf81411..00000000
--- a/azure-pipelines.yml
+++ /dev/null
@@ -1,138 +0,0 @@
-# avoid double trigger by applying some rules
-# start a pipeline when push to 'master' branch
-trigger:
-- master
-# or when pull request on 'develop' branch
-pr:
-- develop
-
-# for now there is only one stage 'Build'
-# in the future we could use multistage strategy for releases
-stages:
-- stage: Build
-
- # there are 3 jobs
- # one for each os
- jobs:
- - deployment: Linux
- displayName: Lin
- variables:
- GOPATH: '$(Agent.BuildDirectory)/gopath' # Go workspace path
- GOROOT: '$(Agent.BuildDirectory)/go' # Go installation path
- GOBIN: '$(GOPATH)/bin' # Go binaries path
- GOMODULE: 'on'
- modulePath: '$(Agent.BuildDirectory)/wails' # Path to the module's code
- pool:
- vmImage: 'Ubuntu-16.04'
- environment: 'linux-dev'
- strategy:
- runOnce:
- deploy:
- steps:
- - checkout: self # self represents the repo where the initial Pipelines YAML file was found
- clean: true # whether to fetch clean each time
- path: wails # path to check out source code, relative to the agent's build directory (e.g. \_work\1)
- # go version 1.12.7
- - script: |
- wget "https://storage.googleapis.com/golang/go1.12.7.linux-amd64.tar.gz" --output-document "$(Agent.BuildDirectory)/go1.12.7.tar.gz"
- tar -C '$(Agent.BuildDirectory)' -xzf "$(Agent.BuildDirectory)/go1.12.7.tar.gz"
- displayName: 'Install Go 1.12.7 Linux'
- - script: |
- mkdir -p '$(GOBIN)'
- mkdir -p '$(GOPATH)/pkg'
- mkdir -p '$(GOROOT)'
- shopt -s extglob
- shopt -s dotglob
- echo '##vso[task.prependpath]$(GOBIN)'
- echo '##vso[task.prependpath]$(GOROOT)/bin'
- displayName: 'Set up the Go workspace'
- - script: |
- go version
- go get -v -d ./...
- cd cmd/wails
- go install
- workingDirectory: '$(modulePath)'
- displayName: 'Get dependencies, then build'
- - script: |
- wails version
- workingDirectory: '$(modulePath)'
- displayName: 'Check we have output'
-
- - deployment: Mac
- displayName: Mac
- variables:
- GOPATH: '$(Agent.BuildDirectory)/gopath' # Go workspace path
- GOROOT: '$(Agent.BuildDirectory)/go' # Go installation path
- GOBIN: '$(GOPATH)/bin' # Go binaries path
- GOMODULE: 'on'
- modulePath: '$(Agent.BuildDirectory)/wails' # Path to the module's code
- pool:
- vmImage: 'macOS-10.14'
- environment: 'mac-dev'
- strategy:
- runOnce:
- deploy:
- steps:
- - checkout: self # self represents the repo where the initial Pipelines YAML file was found
- clean: true # whether to fetch clean each time
- path: wails # path to check out source code, relative to the agent's build directory (e.g. \_work\1)
- # go version 1.12.7
- - script: |
- wget "https://storage.googleapis.com/golang/go1.12.7.darwin-amd64.tar.gz" --output-document "$(Agent.BuildDirectory)/go1.12.7.tar.gz"
- tar -C '$(Agent.BuildDirectory)' -xzf "$(Agent.BuildDirectory)/go1.12.7.tar.gz"
- displayName: 'Install Go 1.12.7 Linux'
- - script: |
- mkdir -p '$(GOBIN)'
- mkdir -p '$(GOPATH)/pkg'
- mkdir -p '$(GOROOT)'
- shopt -s extglob
- shopt -s dotglob
- echo '##vso[task.prependpath]$(GOBIN)'
- echo '##vso[task.prependpath]$(GOROOT)/bin'
- displayName: 'Set up the Go workspace'
- - script: |
- go version
- go get -v -d ./...
- cd cmd/wails
- go install
- workingDirectory: '$(modulePath)'
- displayName: 'Get dependencies, then build'
- - script: |
- wails version
- workingDirectory: '$(modulePath)'
- displayName: 'Check we have output'
-
- - deployment: Win
- displayName: Win
- variables:
- GOMODULE: 'on'
- modulePath: '$(Agent.BuildDirectory)/wails' # Path to the module's code
- pool:
- vmImage: 'windows-2019'
- environment: 'win-dev'
- strategy:
- runOnce:
- deploy:
- steps:
- - checkout: self # self represents the repo where the initial Pipelines YAML file was found
- clean: true # whether to fetch clean each time
- path: wails # path to check out source code, relative to the agent's build directory (e.g. \_work\1)
- # Go tool installer
- # Find in cache or download a specific version of Go and add it to the PATH
- - task: GoTool@0
- inputs:
- version: '1.12.7'
- goPath: '$(Agent.BuildDirectory)/go'
- goBin: '$(Agent.BuildDirectory)/go/bin'
- displayName: 'Set up the Go workspace'
- - script: |
- go version
- go get -v -d ./...
- cd cmd/wails
- go install
- workingDirectory: '$(modulePath)'
- displayName: 'Get dependencies, then build'
- - script: |
- wails version
- workingDirectory: '$(Agent.BuildDirectory)/go/bin'
- displayName: 'Check we have output'
diff --git a/cmd/cmd-mewn.go b/cmd/cmd-mewn.go
index 3fddaff6..1b157960 100644
--- a/cmd/cmd-mewn.go
+++ b/cmd/cmd-mewn.go
@@ -5,7 +5,7 @@ package cmd
import "github.com/leaanthony/mewn"
func init() {
- mewn.AddAsset(".", "../runtime/assets/bridge.js", "1f8b08000000000000ffac597973e2ba96ff9b54e53be8f5ad2ec825c1ecebed5b630c216481b065e1cdab8cb00fb6125b3696c04077befb94bc804927e9be53936e124b3ae7e8e8a7b31ae9cfe323f484829fa7f0e1297c3a3efa817ef83312929e9e9ed053eae9c47f7a0a96a41f624550ff8f143e3d49fe9224fe0bae603e25049e08814f4f92f8fcf7d3d3e993e4ff133c62afb101c824bac13d10bfd1dcc51678b6fb82e6b68b3c989d99e40510761c767c94524fd0356024536ed87483f2d95cedcc718101e5c7477f4ac747d29fe899198472046c052e2336ada332124bc747f3255539b1292294f0d409fa7e7c949024d47489a603b267cfa0f2e3a38447a8667b190f1393cd82b56f3e6dc205d5a61454de5f816be24d1dd1a5699e1e2c8d89056e1d15b2597fde6393e1751d253d569724d356b169d88cd70bc55cae2405d2933e61c84e6c3ae298434cb46ad339d1ebe8fb6b201166cc565f80c749b069ceb0fa129bb203152fc637d775314e24ffd2c80aa92666ecdb17ff70673ba5cf42ea2f7fff06d1996a530e94ff1e3127dc842f7fdf8be510eabf248dacfefe6be6fe9600d3c61aa13a7308a5e07ef9fb0d37d13e66b58031ac07bb734275dfa6044e40b5504cec77328e9b321a85b0653e90feddb11911f7559f9335680d6e3bf56cc38439af671b1ed1b851cf65b35f1b866fd8c1b3d85b77ed25d5eaae3ec3a9eca9f897299f34e636e567736c1173536798b233062e993734c21c6168d4a6d0d89e11aac1ba5ef37f5e3f522cba9fef0ed60472f57cd659a342d6593738acf91936894eeb2a500e6ea8683e0b5663771e174cccc90a76aa17c16acc6c5703f7ccc51a59b27a0eac86855d9dd07ae92bc24b6ea36cec7467aa6dda6efd8ff97cde98d9eb336660cdf6ea39678dc42750c859c739888575a82f5d33a5618eebfe5072a8de986106e5e229b96bf6875ef6aaa3dbb22ccbbdd1c4684f74599695aa182f15f9460c6e9d995c11138bf3e6cd5d7b22ffc39f76531ebcf71c8dc5a7257b37e251cc457fa39ff85891f5aef8bca5798f5ed0fd535dcf9b83fb2be5b91c0052188ec6e68d7c4dba8b96f1d269caccbb7cbecd76d6b7e5deb0785f93b6fc79d8ba31ee27a56ca7a697e0e261359bd61edaddda7a3a561753338f4dedca2e95069eadaca6137d6b08c1ac76396c9f4f4637d03301ee17cff2c498649b0abe287439f16adbab71ad90de76b2f9c155ceb0a4d2c579fa793bbd2ccf075056370fedf4b35e7ba8d8356fbddc98ddeebc385ee5ef0ae959df6d3fd07955f306d2d5a0db69f5f2d2285dec5b77caddc3b534529b744e66ebc970d16d6e6e25a3df6b57ddea383d6bdd98835af56a64561eabc6f6d9195557b9056f19d565695ebd1a381d674e6f6f8d45a77a09b6de2b542e1635c0bdfc7a68743d1977e8ca63d5f3dcc8582fae4af62ccfbd47923b976f5a45f7813d72aa48976d329c994575e22af706bd51ae87e7603dc0f661362bd50657c57b79d4675699e6ef73e9a2d21ce72f2dbe1d94e7cc9d7596b3a1d43b9f6979bdf498abd4d2254feab42ff015bb787e54805714dd7d9814f81abb3da5f2b8eedf5df2ee73516a0fb737da74be550b39c34957d556193add6b1dbbd3c7da729acb1b32cb1656f366aba6e42a397d54ea5bdb4a5f5dade5eb41971697d5e1b0d96caa8cd4eeeff39eddaf11e75a9f6f9d4753d7f5c274a80dfb13a57a35ae0cae178bc27dedaa596aceb4f33bbd58cbd75e34cf29a717784a6f14a5d7d49ed3bd4d2f775fad96861b49be2eb48af260c6eeee8ad456c88da4540b2f9bc74535fb60b6e4c70177b1d927adad3d942f4c9bdf9bd5459e3faf1ecdbeaeea39b9fadc969d294e2bd9f2b8a9c9dbfc6095f596b95c57da4efb9bcb41b9ed75609bbfcdcfaab7dd819b333c8fca5326af3db938911ffb9b87c9fa465a3b657e21d3626762dd766e6ac37cd5be5beb4a16a4ede0f2b25b6e6d8ccd34e75696dbe1c070d4fbcabab21ae3fbd1f66ad42963702a9517d71eb7cdc2a49a5b8eeef064ccf576b73757aae0acd383e2796de438e645a75a6cbf94ade2505ed4a4f1f54bbfe9ae37b0d4b4a971b1ea749ddcc3c3fc7c53981656dcebcdccab0e69d1f465ba965f799edcbcd08de7ca05dd9aa3dc45e9a559acc9d395d651ce75d2bc5d946b8bf9c3ad5bd8a4d31b629e67fbbde2b00ac30a736476ed4c6ba5de42be2f713ccba9c5d5cbd42a6313f0b36adc788f63ad7b3d188cbd76be7f57cce5a637b5fb2d6f3ddf2ecc5c5ec54d52d65bcee4ca6a69c549eea1a70dd6d3e275f7615092c66ef1b6d2adf147f5dc6d5d158228669e8f5f46cb81a52827f100ec820398d7a91d3ec5d776a921c81a1fa71e3fdb7ff79319235ba8e7c1fa98384ccf31f25ca6f019c36129f0ddb189d0e60c5640390b726498cf3225b0a2f4150c82fc55cf14c142cc368986b88b2973b00b9447d92d4c5b8576b9d256d01f00e0ff7a93fc4ad9af0d4c89857d48624aa11c4326a1805d44e85c549910654991221bbb842c347afdaf17d8f8e52e433119df45a1f0ddd76d6ebb56ddb54539982a94b31ae827afaf419562da7a1dedead954886450d22644510bcc24949f6984e199096754247ea19abfaeda94d926644c5b4ff91389e45715f9a8a3b0e2fdaaa2244aa350304aa3240a764e2492b12a06fd8171369bcd3650001df2533e3ac44ba47a940d3f22eda30808510d34d0fefe51365371c17a7fa76cb656fbd54ee10ed18ebfdec9dfe8a421febc1e1f255e1bc747afa2579024246bd8e1a0a1b96b5ba2135911f0d019e206a62f0c6d19b83afceba0ab100d84321aa554c682ab586117810916fa86345b5d5a407946750173689b2046a924e31b1392be068232c380cb9cbb64b6e4904af28d03c9539414859ba432161092394a05c482796400f0f0eadfcc6654c6c6b0e6e81b521913acaf084c063162ec384035c520a6967aa3a3e0ecd91af8e7f1377e0dcf6400d6e267f2c73f7eec2774e0e109597333c67a0f5b904a0ab2e4c9bfb3ff11b2c4e06077a1ce490c7fc55782218ca8ad012214710350cbb66298078afa4a069e7ceae30d948f370e9c22a29d06fd8550e0148595f1fe72b48f6f262667073ad1429cb50c11ac448b5011abbb8d7644bb197101d1f3014b5c2121550436d1b30986602d220fce77785fbe622ef0a54b9116836e049ca1a5e3031606cf18680cf8d2095bd8d41e8b99ad6de2708871235cf36343d0bd09b085767be405e1294a6a64254c3508de616beb2bf886f9e0903f37db9958e7da10e711e1acebfb56fc3c48198d04883ba7fb5892321ac5ed6ac4b11b888a37a5717c044130bb7f4b3012a01d029a38043250f61d35761d3bfae6f7e78df7c9e22f103ea77cfb1e227e6b8b25b89b1198a072dbf5a3fb871dac087e279f2b13bd8e40dfc4fdb27016b4e4ee664686edb137b8ec91346c6ff846d910d2df395710c93261132c749899b6fa920c5d2250e08268f0a10206d1e0ff550151641cee2f6b9a88514c7589c311b7a3289509968760d92b60887044e688890d34e46091f739b88830c4dd2564e24a634d1bf9d25281d053e4fa4242bd853fb2cf328acf14b85e827d96509ef10abfa116f34a1078d0b7f050fed241ac3f88422cb4fcfd69915f97516c46f5030b92a88f4cff46d08ae07770aa04cb0411ce0f11c1524c7e989e77978ea9660a54a96a5b84ea68ef637bcb650796e07328c1e22726206aa2a412d9b9b8cff0855108d1fb16e52fa92660b72b8ebec2e67bf128eee101cb67d1226353d5b499f0bd40f9d6ce017f87372add22ee9b60fc11eb3b0e7fe0ed3f63bf877c1f19de817caff5af506fc5024c603087d0ff6668fd3f86b344e2fd68d588bd9d4d9d1c20317637c240c2c5c8f743a511acc0dda042366b3194d2608e9726472b6c2ee1248c0d8a81a90e881b84050b519163614251fc0574f072fa204afc1ad437098501df19e7be7588dc4f38e4e700070847f4bfbc0df0d03dcc46fef85dc96c32bc0ed0fda52ddb0ed09d212b311ff82527b8ae2d0ebf3ff02ee024129061dc76ba96051ac11c6e5ddbc1badfd5a522c5429a0f961cd7ef3d5bc1e5ee577ed7521389a87a9b63934138f71afc7df5a3dee97b25d2e1b70d31a37ce37ba1cfbfe90f45d212292bb42d0f10d1a9ed027a6608534db40a61331306d104f308578d5d9f99d130c7ffcefe672f2fa8a44c3273b1bb416721fbbf82ef2618a0a4970c5ea7ef735b5c568699448554ee244a254266cff6c29ed45d524e2c10c95274caa09d860b73dbf5fdc505ac6d907f1711b77f90f06b91c8337db7c28ee3d3c461cdb4fd5708993e4d05f56b3dd827798a7ef6940fe35700c250e8928c4ce103b78a34dbdbe247427b3627f38d4871d8714ca2fa3698fcccd222d907fb460caf816985c38f36bdf64f1fdeea30403fda73e6027e69ec2f899379a815db5f37fdbdeb3ef58b9f77053709158dfb5ee42c14e9b72ac122fa86de151b091167f9120aaaa32f281d319efc6c014f991e78216d2a227b4f31059ba61fe3f7aaa931d522f45b98e3cff57bb3bd125d5b5cc24f1a8479a4feb3846b5bcfb445b44b2527f485da1eddbdbd11451f724105b202ad1e7fb1b3f3e49f4baca04d9a6dfc225e801d2bb13319918a3ecc9781804c26239c10730e56501987a4c74707f9f4f5e0bb59bff94a1df8c7ae018b5ada59d8b125822f72f7bd085e814f10b17fd0db4461e1db8eb07178eaa8254c1cb4823fe9da15db1fbaf21bf52316cbd696266460edd82e17c5bb606d1c1ffd6f000000ffffe88ed8458a1f0000")
- mewn.AddAsset(".", "../runtime/js/runtime/init.js", "1f8b08000000000000ff548f4f4b033110c5cf06f21de6b8bbd81df5206811f4287814bc0863ba9dbab1d96449525769fbdd65d2edc1fce331bf372f09365a01c169d02c68565a1de0502a0848444015d545d109e14188b83f70568405a12ce93ad52b09ac25900865bf135d1296293d72d76bcfe0ec679f27961336d10c3c85b8854d8830f16ae1ec96c18c63d2aaea6a7861034f3ef7c1ffc2cdd5f5dd628c9cd867ad1ad40a1bf84abdf519387d734c36f87bb8054102e5df0d3c7b9bad71367182dc33bc19eb12c49dcf76607114d7e368a21960bfd9f92edbe08fd019e756a6db0a46adcea0e4556758c35eab8bc9fa7598da49925b6aff3b965a1de53d4358ef1cb7fc338698133c94a0e55f000000ffff4e896d4f9d010000")
- mewn.AddAsset(".", "./linuxdb.yaml", "1f8b08000000000000ffec58cf6fdb3618bd17e8fff09d3c2001932dd949b761dd7a58bb1608bac32e2b457da659f187c01f693cec8f1f68a91213cbb66c5348062ca7f0a3f81e1ff99e498910f2fa55259cb7a20c5e18ed8ad7af002a2c05d59b7f0144557485b66d512275e8baeef8f49206e9fb3680a60a0b78930c8a7ff7689d30baf83660e8e18c759dcc28457555c082335605d5747520496318d858c32d55ae80453bc50efa5b7d78128074d3e28ca5658015caa6808f1b5520b4f3544af82afc0a3ebb5019a08d271c7ddf5506212b82cea1f682cacf407505deae81722af418655373c28c5e0a7e1ef380338154376a321b0b560271ef60e57de38aebeb0acb2b6d2a7426588657cca86b873e347ffd7073f500ffc0667a25752b20b058c0e86cc91a22c417b773b25294965a815bfbd7778c0993a2e4be26b7a4c2fbf3d633459ab0a252945fb1ac85bf89a37ebcfa3ecb0cb62147a612caa07d4812d91626277277f65a699f12b803895c06291fa532298c25f3e2403213135cec36414da548e4c76636f1bf5129e0edef9faedf091d1ef62ec2c5f622cca7b9a1d61a9fa86e0bd9747fdcc01da97c76d57f1b2bd2b367d3cea6f9cf01edb985cab8e64ae87487fb5a36c19b9d85f73de473ab46890ab5a7769dc81e8ad9740f90f0e1eee5645aa349cd1d9bf97ec7defc9200be04b5f7465489dad8cca6f60f23aa1c3f5be7de111fcac691fe6e481dc6231c67ba163e229bed3af88865f21d6e74217d7d79db2ec869ec09c00491c95dea0ccea72823c40cb5372eb1765bc866ee9f51fb0f77f012fcbdb9b7ae83eacb9c31c22e2f41d11a677cf949299b9a4708329be3b718b14149ba8decdf70d207ce8dc5b1a9d8de861e63723072d03e451a215f62652c4dc2d116b285e3d704ee402cf69f72ff47632fe336d97fd1f437f95c7fb3979e5ab64a4c1f9bd92cff9365ab2ca7012ce2bce6f84cd650a6a8067217874e337ff4eba924ddf039ce818144376ad2c7ab644df77eba8afe3979557d7d7b94e94f251a1046e814d55fa83589cfbb4a36abbf6ff1f2b8fd62afdbd397985d5bc8e3c52ed5db16b2c97d9bc09dacf3f40007273487b50916dcda7954dfb968859a728c3b4b39dab34fae1339a6e5f628f0c32f2bc591f9448596633774723cc9d1f1ec7886e14fb8fe0d0000ffff6b19f4edca190000")
+ mewn.AddAsset(".", "../runtime/assets/bridge.js", "1f8b08000000000000ffac597b73e2ba92ff1b3e85ee9c9a821c12ccfb79726a8d2184244078e5c1dd5b596137b6882d1b4b606026df7d4bb601934966e66c2d332496d4ea6efdd44f47fa338e5e50f079091f5ec2a7f877f4dd9f9090f4f2f2825e922f67fed38bbf227d170b82f67fa4f0e945122b92f82ff604d349c1ed0cc5bfbfbc48e2fbdf2f2fe72f92ff4fec40283e3600994437b807e2279abbd802cf765fd1dc769107b30b93bc02c28ec3e249f50cdd014632e5864db72897c9562f1c1718501eff538a4b7fa2053308e508d81a5c466c5a4325f4a7148fcf5754e5c4a68850c29367e85b3c2649a8e1124d0764cf16a0f278cc2354b3bdb48789c966c1d2a5a08cb9a0da9482cafb6b704dbcad21ba32cdf3e8ca9858e0d6503e9311d31e9b0cef6a28e1b19a2499b68a4dc366bc962f64b34529609d1074e16662d311c71c8e7c559bce895e43dfde7c763063b6fa0a3c42804d7386d5d7e38c1de8763deeded5e2b1582cf19746d648353163975ffc335d1cb4bd0889bffcfd1b4417aa4d3950fe7bc49c7013befcfd28964380ff9234b2fefbaf99fb5b0c4c1b6b84eacc219482fbe5ef77bb89f6f9560b18c37a209d13aafb36245002aa856c223f1311d494d128002dfd09ef6f8ecd88b8a8da9c6c40ab73dba965ea26cc792d53f788c68d5a3693f95a377c330e9e8564ddb55754abb9fa0c2733e7e25fba74569fdb945fccb145cc6d8d61ca2e18b8645ed708738479519b427d7741a8069b5ad5ffbc7da6d8fe76be395813b8d572196783f2196753e7b0e117d8243aada94039b8a1a2b90c58f5c3795c3031276b38a85e00ab3eb35d0ddc0b176b64c56a59b0ea167675426bc5af08afb88d3291d35da8b669bbb53fe6f3797d666f2e988135dbab659d0d12df40216713dd412cac436de59a490d735cf3879243f5fa0c332815cec943a33ff432b76ddd966559ee8d26466ba2cbb2ac54c478a5c85d31b8776672594c2caf1add87d644fe879f56431e7cf4bc1f8b6f53f6bae251cced7fef3fd1b122eb1df17d4ff311bda0fba7ba5e35068fb7caa21400921f8ec66657be239d65d3786d3764e6dd2cee33edcd7da9372c3c56a51d5f0c9b5de37152ccb4ab7a11ae9fd6b369f5a9d5a96ea66375393573d8d46eed6271e0d9ca7a3ad1778660ccaa37c3d6d564d4859e09f0b85cc81363926928f83adfe1c4abee6ec7d57c6ad7cee406b759c3928ad757a9c56e7a539a0fa0a46e9f5aa9855e7d2adb556fb3da9a9dcebc305ee71ef2a959df6d3dd17945f306d2eda0d36ef672d22855e85b0fcac3d39d34521b744e669bc970d9696cef25a3df6b55dcca38356b76cd41b5723b32cbcf1563b77046957576c99b4665559c576e074edb99d3fb7b63d9aedc80adf7f2e5eb6515702fb7191a1d4fc66dbaf658e52a3b3236cbdba23dcb71ef9964afe46eb3e03eb1674e15e9a6458633b3a04e5ce5d1a05de56e7805d613ec9e66b36275705b7894477d669568ee319b2a288d71eec6e2bb4169cedc597b351b4abdab9996d38bcfd9723555f4a476eb1adfb2ebc5b302bcace8eed324cf37d8ed29e5e74dffe186771605a935dc75b5e97ca7e6b38693aaa8cd12b43b773a76a7cfd5d5349b336496c9afe78d6655c996b3faa8d8b776e5bebadec877830e2dac2ac361a3d15019a93e3ee63cbb5f25ce9d3edf39cfa6aeebf9e9501bf6274ae5765c1edc2d97f9c7ea6da3d89869570f7aa19aabbe6a9e534a2df1947615a5d7d016a9deb6977dac548ac3ad24dfe59b057930630f0f056a2ba42b2995fcebf67959c93c994df979c05d6cf64973670fe56bd3e68f666599e38bf5b3d9d7553d2b57162dd999e29492298d1b9abccb0dd6196f95cd76a4ddb4bfbd19945a5e1b76b9fbdcac72df19b859c3f3a83c65f2c6930b13f9b9bf7d9a6cbad2c629f16b9916da13ebbeddad0e7315fb61a32b199076839b9b4ea9b935b6d3ac5b5eed8603c3511fcb9bf27a8c1f47bbdb51bb84c129975f5d7bdc32f3934a76357ac09331d75b9dde5ca980b3490d0a57d591e398d7ed4aa1f55ab20a43795995c677affd86bbd9c24ad3a6c6f5badd71b24f4ff3ab6d7e9a5f73af37336fdba4495337a96a6eed7972e35a3716e56bba3347d9ebe26ba35095a76badad5ce9a471bf2c5597f3a77b37bf4da5b6c4bccaf47b8561058665e6c8ecce99568bbda5fc58e47896550bebd7a955c226e0856a74bde7b1d6b91b0cc65e2bd77f2864b3d36ef571c79b8bfba599cda9b8414a7ad399dc5a4dad30c93ef5b4c1665ab8eb3c0d8ad2d82ddc973b55feac5eb9cddb7c10c5ccabf1eb6835b014e52c1a805d7000f31ab5c3a7e8da21350459e3f3d4e3e7fa6f7e32636407b51c589f1387c939429e4de77fb6e1b410f8e6d8446873016ba09c053932cc67e92258fbf4150c82fc554b17c042cc368986b88b2973b00b94efb35b98b6f2ad52b9a5a03f00c0fff12ef915335feb98120bfb9044944259864c4201bb88d0b9282c619f25458aac1f12b2d0e8edbf5e61eb17b70c45787c1385c2375fb7b9ed5a35d7167560325fca68a09fbdbdf9358a69eb3574a8609321907e111b13652c3093507ea1118667265c5091f685626259b529b34d489bb69e14e358e2ab8a7cc45158e27e555102a550c815a55002f95263b144a480417f609cc964327514a086fc6c8f4ea112591e65c2afc8f8688f812804eae878f528932ebb607d282893a9567f252814b017f86b4142ce593d1e8bbdc5636ff5f85b3c2e4948d6b0c3414373d7b644afb126e0a10bc40d4c5f19da317075f857b477107d82321a2555c67cf8d7d8456082852e9166ab2b0b284fab2e600e2d13c42899607c6b424288168469065ce6dc25b3158764826f1d489ca384a8d42495319f8ecc5132a0155b4706000feefadd645a656c0c1b8e2e91ca583d1e7b436032389262c701aa290631b5e43bf5c4be9ead817f1221f42d388c01588b1ec61f7fff7e9cd0818747638ded18eb3d6c413221c81267ffcefca71e8f89e713d14297b33de48a2f9e218ca8ad012214710350d3b68e30071afada05fe7aee630c948fb70e9c23a29d073d84907d8ec2faf7701fdae7971161b3079a6801b65a9a888d440bb0104b07197b8ac384407cff1ca18f2822f889a825ba31411d2c05b4c1a14e6f47a8e3025fb914697ba846c0195a393e40614c3c82c480af9cb01d4d1ece3eb3b56df4f8625c0f967c9f0ffa3101ad50ea88b3a03b47098dac85350601396c538566eff69e1cedc7a6391de944eb71bfd1eef89e133d095246a378ece8519fb35146a383f58c38760336d1fe32828a580f260f4dfe4820750262ec143ca1e307e20f4d37baf47becfa8754d1f6ffa784efdf2144af69b902773b0213546ebb224c7fda8626e27e14fb5c91fdab047429ae9385b3a025c29b1819b6c74ed138a267d8def09d9a018cbf73a02032a5c31e56c89f99b6fa9af08dde977d4d34f84cb64134f8ff942dca83886859d344cc61aa4b1c8eb8bd8f3a697f750896bd06860847648e9860ae21078b6ccdc1458421eeae201d51176bdac8e7950c589e23d7e711682cfc8dfd2c27f87b7cd78ab19fa584055ee3536231ad04d1045d86e7112b2711fb24b630dfc08fc7447e1945b1b94ff92cc87f3e22fd6e3ce607b3e871622c1dc42cdff9839523ef20a586378ca9660a20a96a5b84eae8e84447fb64d16bf73728c1dae7f72daa9784b2b765717fe15b9d00968f8d47aca82660b7230ebcc6e6474126eabffe8e9f4582b44d55d366c2b902c59b070ffb8dadfb0a6bbfb91b8c3fd9f9813f479df93de247a08f5eff23d0477d7f817533123a02f33801fcf7c2e5ff2d4cc5621fc7a1faf17d69f2ec08c0d8dd0a7b0857f6ae1d6a8b600dee16e533198ba1a40673bc32395a6373056781eb2b06a63a206e1016ccef4b120b138aa2af8283b7c4d120f04b28df250706fc608ac7723ef431e1743f8735c03524ffe51580871e6136f2c71f326693e19d0fea2f0dd776801eac5639dafb2f3782ebdae2e0c7c3ee234a2c0669c66da76359a011cce1deb51dacfb3d5632d42a24f978c571fd3eb0195ce961e1370d3316db575b736c3208a6defc5f6f22a09d7f54d69cbeebdf9be03b0f0b9dfab449130948a49fd0923c4044a7b60b68c110a69a28dfc3e622088f31e611ae1a87562fad618eff9df9cf815b50fd9864e662778b2ec2cdfff2ff2ec00025bc84ff36fb98a5a28cd2cc242a24b367416210fc7ab6173685ee8a726281c879a24d05ed3c5c98dbaeef172e606d8b7cf0c3cdfe09c23f47ecfdcff71eec38f17777926ef9dd7bba4f934199590ba424ced10f1ef169700a4e3f148a24c28bffc47bf66a1dacee33963d9b93f956642cec3826517d734bfcc4aaf69c4fa486f46fbe1d0583cf04def9c70e2f7218801eca9bb9805feb879be1641eeac30ef74b7feb7ecffdb2e503a60d4245b37c60370bd8f91d44b0842ed1872c430ee2085f422e35f405a5f6fbce7eb8f097740fbc9034b9a7fa5125059ba61fb50f4aa947a5f6603731c73fd5ec9d64657f495106ef848749a1f6c3f63b5b4fb744004b2626f495da1e3dbc2311351a724105b206ad167d7d72f0d4d3ba28e85b665bbfc416f0468ae0743a1dff34e5f9bbd3e9b4f031cc395841f51a12c6a309f12dfeae0f4a46ad7fdf0aed1bcac016450746f841d008afc15fddeffcb8d3d8fbfae581ae1e3d66d894c54e9ab153fd3a42ea8973bed3d827b76c6d65421a368eed72514f8b6df5f8ff060000ffffdb95edb4b81e0000")
+ mewn.AddAsset(".", "../runtime/js/runtime/init.js", "1f8b08000000000000ff548ccd4ec3301084cfec53cc3189680c1c90a04282231247242e488b9b6e89a96347b64b404ddf1dd96d0ff867359a99fd5443601c0f9f049f14cd988ba1a098195c715d149744cd39c8dd0f7552ac72a2f2cb3b47bbcab41a3433abfcdf992f59959b37007aed05d67cf669923cb1097a90c9872d363e6092d5c29aad408f63a4aaabf1221a4f2ef5defde2e6eafa6e310689e212358a5483afd81b9720f15b4234dedde3168d22524d4368f0ec4c32da9a2811a917bc696323c2ce253308a1741e471df480fd66e7ba64bc3ba0d3d6ae74b7a58c3adb85559da31a7bba988c5bfba99d32b4e5f67f614907a2c1af77565af9197d48110f05b2fc0b0000ffffacb36d8089010000")
+ mewn.AddAsset(".", "./linuxdb.yaml", "1f8b08000000000000ffec584d6fdc3610bde757cc690bd8a0ddda3de956346d0e4d9a00467ae8a5a1a83197113f047e38dea23fbee04a16656b3fb45a2ed605baa71d527c8f8f7c33224508795309e7ad28831746bbe20d4085a5a03afe031055d1c5ebd0a244ead0b59df1d17b1aa47f0a01345558c0db3422fe1ed03a6174f1f478dfc119ebfa98518aeaaa800567ac0aaae9da810c827e5c630db754b90216ede43ae0a7f6fe4100d24d893336680558a26c0af8b49603423b4fa5846fc22fe18b0b9501da78c2d1f75d6510b222e81c6a2fa8fc025457e0ed0a28a7426f206c6a4e98d1f7821fc59b60f653ea464de562c14a20ee3d2cbd6f5c717d5d6179a54d85ce04cbf08a1975edd087e6af1f6eae1ee11f584faea46e0904160bd83857b28208f1d56d9baa14a5a556e068e3fa8e0daaa428b9afc92da9f0e1a8a51c02ed5f4c29ca6f58d6c2dfc4413f5e7d9f837f8c389e482883f621a55f1b4f4bbfad99d66afa9ca0f6a4df7d90f2590a0e1a36a4e1c5ee341cecfbc5d67dafa91449758cb268fe8d4a01ef7eff7cfd5ee8f0b84bfbc558fb89a436d45ae393d836ce22f7d31aea30c1a715fbb7b162f036598759a4fed9239d559f8ccbac841eec67df9445e77a1fe1c313dc59c5a24485da53bb4a6a535b16b9090e3edebd8e7cd568060e8e519ed2f4f697047676910f465449648cb288fcc388eaf84a74dc89eeb16c1ce94f72d4617cf3e2490e71cfa84e74787bc631f5c4b569057d7d79db2ec52ceac1f8fdfa06479ff98c2f41c6b40cb5372ef9b88db338f967d4fee31d9cdbccebb3e52aa8be993346d8e525285ae3c9ee2543c2a6e611819cc8de233e6c50926ef7facbc7f081e372e0c01418af7f0f31350b3290be041a53df63652c4d99d0c65932e1d704b5270776beb6fecf832d7c63aaff9ac36fb259fc661739b56c991c1ea32cfefec9b265863a0f8b38a3fcdfa61aca14d540eee2c8494e8fee9c49d18dce5fe113856ed4942f4683c5dcf5bd28fa65ee72fafaf61087cfa44900633245f5576a4d3275d790c5d71f5aac1cd6bed865ede17d63cbae51cbccfa9afc2c7ddba65c396c5e814e1ecf9f83ed6ce32c0adf25a8b9f2e616a3e084e6b032c1825b398fea3b17fd5d538ed1b094a33df2953b8f61520d3a047aeffda938acd6a042cbb11b39b5d490434b4dc79246bf60fa370000ffff8eb09c3df7190000")
}
diff --git a/cmd/fs.go b/cmd/fs.go
index d0ceae7c..36109e8f 100644
--- a/cmd/fs.go
+++ b/cmd/fs.go
@@ -132,6 +132,16 @@ func (fs *FSHelper) LocalDir(dir string) (*Dir, error) {
}, err
}
+// LoadRelativeFile loads the given file relative to the caller's directory
+func (fs *FSHelper) LoadRelativeFile(relativePath string) ([]byte, error) {
+ _, filename, _, _ := runtime.Caller(0)
+ fullPath, err := filepath.Abs(filepath.Join(path.Dir(filename), relativePath))
+ if err != nil {
+ return nil, err
+ }
+ return ioutil.ReadFile(fullPath)
+}
+
// GetSubdirs will return a list of FQPs to subdirectories in the given directory
func (d *Dir) GetSubdirs() (map[string]string, error) {
diff --git a/cmd/gomod.go b/cmd/gomod.go
new file mode 100644
index 00000000..a9ca7d93
--- /dev/null
+++ b/cmd/gomod.go
@@ -0,0 +1,78 @@
+package cmd
+
+import (
+ "fmt"
+ "path/filepath"
+ "regexp"
+
+ "github.com/Masterminds/semver"
+)
+
+func GetWailsVersion() (*semver.Version, error) {
+ var FS = NewFSHelper()
+ var result *semver.Version
+
+ // Load file
+ var err error
+ goModFile, err := filepath.Abs(filepath.Join(".", "go.mod"))
+ if err != nil {
+ return nil, fmt.Errorf("Unable to load go.mod at %s", goModFile)
+ }
+ goMod, err := FS.LoadAsString(goModFile)
+ if err != nil {
+ return nil, fmt.Errorf("Unable to load go.mod")
+ }
+
+ // Find wails version
+ versionRegexp := regexp.MustCompile(`.*github.com/wailsapp/wails.*(v\d+.\d+.\d+(?:-pre\d+)?)`)
+ versions := versionRegexp.FindStringSubmatch(goMod)
+
+ if len(versions) != 2 {
+ return nil, fmt.Errorf("Unable to determine Wails version")
+ }
+
+ version := versions[1]
+ result, err = semver.NewVersion(version)
+ if err != nil {
+ return nil, fmt.Errorf("Unable to parse Wails version: %s", version)
+ }
+ return result, nil
+
+}
+
+func GetCurrentVersion() (*semver.Version, error) {
+ result, err := semver.NewVersion(Version)
+ if err != nil {
+ return nil, fmt.Errorf("Unable to parse Wails version: %s", Version)
+ }
+ return result, nil
+}
+
+func GoModOutOfSync() (bool, error) {
+ gomodversion, err := GetWailsVersion()
+ if err != nil {
+ return true, err
+ }
+ currentVersion, err := GetCurrentVersion()
+ if err != nil {
+ return true, err
+ }
+ result := !currentVersion.Equal(gomodversion)
+ return result, nil
+}
+
+func UpdateGoModVersion() error {
+ currentVersion, err := GetCurrentVersion()
+ if err != nil {
+ return err
+ }
+ currentVersionString := currentVersion.String()
+
+ requireLine := "-require=github.com/wailsapp/wails@v" + currentVersionString
+
+ // Issue: go mod edit -require=github.com/wailsapp/wails@1.0.2-pre5
+ helper := NewProgramHelper()
+ command := []string{"go", "mod", "edit", requireLine}
+ return helper.RunCommandArray(command)
+
+}
diff --git a/cmd/helpers.go b/cmd/helpers.go
index 6c5b29e9..1f4410d8 100644
--- a/cmd/helpers.go
+++ b/cmd/helpers.go
@@ -99,8 +99,7 @@ func BuildApplication(binaryName string, forceRebuild bool, buildMode string, pa
binaryName = strings.TrimSuffix(binaryName, ".exe")
}
}
- buildCommand.Add("-o")
- buildCommand.Add(binaryName)
+ buildCommand.Add("-o", binaryName)
}
// If we are forcing a rebuild
@@ -121,6 +120,16 @@ func BuildApplication(binaryName string, forceRebuild bool, buildMode string, pa
ldflags += "-X github.com/wailsapp/wails.BuildMode=" + buildMode
+ // If we wish to generate typescript
+ if projectOptions.typescriptDefsFilename != "" {
+ cwd, err := os.Getwd()
+ if err != nil {
+ return err
+ }
+ filename := filepath.Join(cwd, projectOptions.FrontEnd.Dir, projectOptions.typescriptDefsFilename)
+ ldflags += " -X github.com/wailsapp/wails/lib/binding.typescriptDefinitionFilename=" + filename
+ }
+
buildCommand.AddSlice([]string{"-ldflags", ldflags})
err = NewProgramHelper().RunCommandArray(buildCommand.AsSlice())
if err != nil {
diff --git a/cmd/linux.go b/cmd/linux.go
index 36d49b18..8353c6b0 100644
--- a/cmd/linux.go
+++ b/cmd/linux.go
@@ -43,8 +43,16 @@ const (
Kali
// Neon distribution
Neon
+ // ArcoLinux distribution
+ ArcoLinux
// Manjaro distribution
Manjaro
+ // ManjaroARM distribution
+ ManjaroARM
+ // Deepin distribution
+ Deepin
+ // Raspbian distribution
+ Raspbian
)
// DistroInfo contains all the information relating to a linux distribution
@@ -100,6 +108,7 @@ func parseOsRelease(osRelease string) *DistroInfo {
version = strings.Trim(splitLine[1], "\"")
}
}
+
// Check distro name against list of distros
switch osID {
case "fedora":
@@ -128,8 +137,16 @@ func parseOsRelease(osRelease string) *DistroInfo {
result.Distribution = Kali
case "neon":
result.Distribution = Neon
+ case "arcolinux":
+ result.Distribution = ArcoLinux
case "manjaro":
result.Distribution = Manjaro
+ case "manjaro-arm":
+ result.Distribution = ManjaroARM
+ case "deepin":
+ result.Distribution = Deepin
+ case "raspbian":
+ result.Distribution = Raspbian
default:
result.Distribution = Unknown
}
diff --git a/cmd/linuxdb.go b/cmd/linuxdb.go
index 58892f5f..fbea6b68 100644
--- a/cmd/linuxdb.go
+++ b/cmd/linuxdb.go
@@ -3,7 +3,6 @@ package cmd
import (
"log"
- "github.com/leaanthony/mewn"
"gopkg.in/yaml.v3"
)
@@ -79,11 +78,14 @@ func (l *LinuxDB) GetDistro(distro string) *Distribution {
// NewLinuxDB creates a new LinuxDB instance from the bundled
// linuxdb.yaml file.
func NewLinuxDB() *LinuxDB {
- data := mewn.Bytes("./linuxdb.yaml")
+ data, err := fs.LoadRelativeFile("./linuxdb.yaml")
+ if err != nil {
+ log.Fatal("Could not load linuxdb.yaml")
+ }
result := LinuxDB{
Distributions: make(map[string]*Distribution),
}
- err := result.ImportData(data)
+ err = result.ImportData(data)
if err != nil {
log.Fatal(err)
}
diff --git a/cmd/linuxdb.yaml b/cmd/linuxdb.yaml
index 8745ae37..3f1c49cf 100644
--- a/cmd/linuxdb.yaml
+++ b/cmd/linuxdb.yaml
@@ -82,6 +82,15 @@ distributions:
gccversioncommand: *gccdumpfullversion
programs: *debiandefaultprograms
libraries: *debiandefaultlibraries
+ deepin:
+ id: deepin
+ releases:
+ default:
+ version: default
+ name: Deepin
+ gccversioncommand: *gccdumpfullversion
+ programs: *debiandefaultprograms
+ libraries: *debiandefaultlibraries
void:
id: void
releases:
@@ -158,6 +167,15 @@ distributions:
help: Please install with `sudo pacman -S gtk3` and try again
- name: webkit2gtk
help: Please install with `sudo pacman -S webkit2gtk` and try again
+ arcolinux:
+ id: arcolinux
+ releases:
+ default:
+ version: default
+ name: ArcoLinux
+ gccversioncommand: *gccdumpversion
+ programs: *archdefaultprograms
+ libraries: *archdefaultlibraries
manjaro:
id: manjaro
releases:
@@ -167,6 +185,15 @@ distributions:
gccversioncommand: *gccdumpversion
programs: *archdefaultprograms
libraries: *archdefaultlibraries
+ manjaro-arm:
+ id: manjaro-arm
+ releases:
+ default:
+ version: default
+ name: Manjaro-ARM
+ gccversioncommand: *gccdumpversion
+ programs: *archdefaultprograms
+ libraries: *archdefaultlibraries
gentoo:
id: gentoo
releases:
@@ -185,4 +212,14 @@ distributions:
- name: gtk+:3
help: Please install with `sudo emerge gtk+:3` and try again
- name: webkit-gtk
- help: Please install with `sudo emerge webkit-gtk` and try again
\ No newline at end of file
+ help: Please install with `sudo emerge webkit-gtk` and try again
+
+ raspbian:
+ id: raspbian
+ releases:
+ default:
+ version: default
+ name: Raspbian
+ gccversioncommand: *gccdumpfullversion
+ programs: *debiandefaultprograms
+ libraries: *debiandefaultlibraries
diff --git a/cmd/project.go b/cmd/project.go
index 91de152c..1ecb5272 100644
--- a/cmd/project.go
+++ b/cmd/project.go
@@ -142,21 +142,22 @@ func (ph *ProjectHelper) NewProjectOptions() *ProjectOptions {
// ProjectOptions holds all the options available for a project
type ProjectOptions struct {
- Name string `json:"name"`
- Description string `json:"description"`
- Author *author `json:"author,omitempty"`
- Version string `json:"version"`
- OutputDirectory string `json:"-"`
- UseDefaults bool `json:"-"`
- Template string `json:"-"`
- BinaryName string `json:"binaryname"`
- FrontEnd *frontend `json:"frontend,omitempty"`
- NPMProjectName string `json:"-"`
- system *SystemHelper
- log *Logger
- templates *TemplateHelper
- selectedTemplate *TemplateDetails
- WailsVersion string
+ Name string `json:"name"`
+ Description string `json:"description"`
+ Author *author `json:"author,omitempty"`
+ Version string `json:"version"`
+ OutputDirectory string `json:"-"`
+ UseDefaults bool `json:"-"`
+ Template string `json:"-"`
+ BinaryName string `json:"binaryname"`
+ FrontEnd *frontend `json:"frontend,omitempty"`
+ NPMProjectName string `json:"-"`
+ system *SystemHelper
+ log *Logger
+ templates *TemplateHelper
+ selectedTemplate *TemplateDetails
+ WailsVersion string
+ typescriptDefsFilename string
}
// Defaults sets the default project template
@@ -165,6 +166,11 @@ func (po *ProjectOptions) Defaults() {
po.WailsVersion = Version
}
+// SetTypescriptDefsFilename indicates that we want to generate typescript bindings to the given file
+func (po *ProjectOptions) SetTypescriptDefsFilename(filename string) {
+ po.typescriptDefsFilename = filename
+}
+
// GetNPMBinaryName returns the type of package manager used by the project
func (po *ProjectOptions) GetNPMBinaryName() (PackageManager, error) {
if po.FrontEnd == nil {
diff --git a/cmd/system.go b/cmd/system.go
index 85ae394b..d503f53c 100644
--- a/cmd/system.go
+++ b/cmd/system.go
@@ -274,9 +274,9 @@ func CheckDependencies(logger *Logger) (bool, error) {
distroInfo := GetLinuxDistroInfo()
switch distroInfo.Distribution {
- case Ubuntu, Debian, Zorin, Parrot, Linuxmint, Elementary, Kali, Neon:
+ case Ubuntu, Debian, Zorin, Parrot, Linuxmint, Elementary, Kali, Neon, Deepin, Raspbian:
libraryChecker = DpkgInstalled
- case Arch, Manjaro:
+ case Arch, ArcoLinux, Manjaro, ManjaroARM:
libraryChecker = PacmanInstalled
case CentOS, Fedora:
libraryChecker = RpmInstalled
diff --git a/cmd/templates/angular-template/frontend/package.json.template b/cmd/templates/angular-template/frontend/package.json.template
index 640bcea4..7b2ae827 100644
--- a/cmd/templates/angular-template/frontend/package.json.template
+++ b/cmd/templates/angular-template/frontend/package.json.template
@@ -3,7 +3,7 @@
"version": "0.0.0",
"scripts": {
"ng": "npx ng",
- "start": "npx ng serve --poll=2000",
+ "start": "npx ng serve --poll=2000 --host=0.0.0.0",
"build": "npx ng build --single-bundle true --output-hashing none --prod --bundle-styles false",
"test": "npx ng test",
"lint": "npx ng lint",
diff --git a/cmd/templates/vuebasic/frontend/babel.config.js b/cmd/templates/vuebasic/frontend/babel.config.js
index ba179669..a6106c48 100644
--- a/cmd/templates/vuebasic/frontend/babel.config.js
+++ b/cmd/templates/vuebasic/frontend/babel.config.js
@@ -1,5 +1,5 @@
module.exports = {
presets: [
- '@vue/app'
+ [ '@vue/app', { useBuiltIns: 'entry' } ]
]
}
diff --git a/cmd/templates/vuebasic/frontend/package.json.template b/cmd/templates/vuebasic/frontend/package.json.template
index 95c1db96..271f969b 100644
--- a/cmd/templates/vuebasic/frontend/package.json.template
+++ b/cmd/templates/vuebasic/frontend/package.json.template
@@ -8,7 +8,8 @@
"lint": "vue-cli-service lint"
},
"dependencies": {
- "core-js": "^2.6.4",
+ "core-js": "^3.6.1",
+ "regenerator-runtime": "^0.13.3",
"vue": "^2.5.22",
"@wailsapp/runtime": "^1.0.0"
},
diff --git a/cmd/templates/vuebasic/frontend/src/main.js b/cmd/templates/vuebasic/frontend/src/main.js
index 739f1a3f..ce05741b 100644
--- a/cmd/templates/vuebasic/frontend/src/main.js
+++ b/cmd/templates/vuebasic/frontend/src/main.js
@@ -1,3 +1,5 @@
+import 'core-js/stable';
+import 'regenerator-runtime/runtime';
import Vue from 'vue';
import App from './App.vue';
diff --git a/cmd/templates/vuebasic/frontend/vue.config.js b/cmd/templates/vuebasic/frontend/vue.config.js
index 471d578f..a2691b1f 100644
--- a/cmd/templates/vuebasic/frontend/vue.config.js
+++ b/cmd/templates/vuebasic/frontend/vue.config.js
@@ -37,7 +37,6 @@ module.exports = {
}
},
devServer: {
- disableHostCheck: true,
- host: "localhost"
+ disableHostCheck: true
}
};
diff --git a/cmd/templates/vuetify-basic/frontend/babel.config.js b/cmd/templates/vuetify-basic/frontend/babel.config.js
index ba179669..a6106c48 100644
--- a/cmd/templates/vuetify-basic/frontend/babel.config.js
+++ b/cmd/templates/vuetify-basic/frontend/babel.config.js
@@ -1,5 +1,5 @@
module.exports = {
presets: [
- '@vue/app'
+ [ '@vue/app', { useBuiltIns: 'entry' } ]
]
}
diff --git a/cmd/templates/vuetify-basic/frontend/package.json.template b/cmd/templates/vuetify-basic/frontend/package.json.template
index 42555b90..d737c25c 100644
--- a/cmd/templates/vuetify-basic/frontend/package.json.template
+++ b/cmd/templates/vuetify-basic/frontend/package.json.template
@@ -8,8 +8,8 @@
"lint": "vue-cli-service lint"
},
"dependencies": {
- "babel-polyfill": "^6.26.0",
- "core-js": "^2.6.4",
+ "core-js": "^3.6.1",
+ "regenerator-runtime": "^0.13.3",
"material-design-icons-iconfont": "^5.0.1",
"vue": "^2.5.22",
"vuetify": "^1.5.14",
@@ -50,4 +50,4 @@
"last 2 versions",
"not ie <= 8"
]
-}
\ No newline at end of file
+}
diff --git a/cmd/templates/vuetify-basic/frontend/src/main.js b/cmd/templates/vuetify-basic/frontend/src/main.js
index de57f6b7..bbe42e11 100644
--- a/cmd/templates/vuetify-basic/frontend/src/main.js
+++ b/cmd/templates/vuetify-basic/frontend/src/main.js
@@ -1,4 +1,5 @@
-import 'babel-polyfill';
+import 'core-js/stable';
+import 'regenerator-runtime/runtime';
import Vue from 'vue';
// Setup Vuetify
diff --git a/cmd/templates/vuetify-basic/frontend/vue.config.js b/cmd/templates/vuetify-basic/frontend/vue.config.js
index 471d578f..a2691b1f 100644
--- a/cmd/templates/vuetify-basic/frontend/vue.config.js
+++ b/cmd/templates/vuetify-basic/frontend/vue.config.js
@@ -37,7 +37,6 @@ module.exports = {
}
},
devServer: {
- disableHostCheck: true,
- host: "localhost"
+ disableHostCheck: true
}
};
diff --git a/cmd/templates/vuetify-basic/template.json b/cmd/templates/vuetify-basic/template.json
index 0df81aa0..b58b5b04 100755
--- a/cmd/templates/vuetify-basic/template.json
+++ b/cmd/templates/vuetify-basic/template.json
@@ -1,8 +1,8 @@
{
- "name": "Vuetify Basic",
+ "name": "Vuetify1.5/Webpack Basic",
"version": "1.0.0",
- "shortdescription": "Vuetify + Webpack",
- "description": "Basic template using Vuetify and bundled using Webpack",
+ "shortdescription": "A basic Vuetify1.5/Webpack4 template",
+ "description": "Basic template using Vuetify v1.5 and bundled using Webpack",
"install": "npm install",
"build": "npm run build",
"author": "lea ",
@@ -11,4 +11,4 @@
"serve": "npm run serve",
"bridge": "src",
"wailsdir": ""
-}
\ No newline at end of file
+}
diff --git a/cmd/templates/vuetify2-basic/.jshint b/cmd/templates/vuetify2-basic/.jshint
new file mode 100644
index 00000000..0557edf1
--- /dev/null
+++ b/cmd/templates/vuetify2-basic/.jshint
@@ -0,0 +1,3 @@
+{
+ "esversion": 6
+}
\ No newline at end of file
diff --git a/cmd/templates/vuetify2-basic/frontend/.gitignore b/cmd/templates/vuetify2-basic/frontend/.gitignore
new file mode 100644
index 00000000..185e6631
--- /dev/null
+++ b/cmd/templates/vuetify2-basic/frontend/.gitignore
@@ -0,0 +1,21 @@
+.DS_Store
+node_modules
+/dist
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw*
diff --git a/cmd/templates/vuetify2-basic/frontend/babel.config.js b/cmd/templates/vuetify2-basic/frontend/babel.config.js
new file mode 100644
index 00000000..57e6d0a5
--- /dev/null
+++ b/cmd/templates/vuetify2-basic/frontend/babel.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ presets: [
+ [ '@vue/app', { useBuiltIns: 'entry' } ]
+ ]
+};
diff --git a/cmd/templates/vuetify2-basic/frontend/package.json.template b/cmd/templates/vuetify2-basic/frontend/package.json.template
new file mode 100644
index 00000000..89f096e8
--- /dev/null
+++ b/cmd/templates/vuetify2-basic/frontend/package.json.template
@@ -0,0 +1,53 @@
+{
+ "name": "{{.NPMProjectName}}",
+ "author": "{{.Author.Name}}<{{.Author.Email}}>",
+ "private": true,
+ "scripts": {
+ "serve": "vue-cli-service serve",
+ "build": "vue-cli-service build",
+ "lint": "vue-cli-service lint"
+ },
+ "dependencies": {
+ "core-js": "^3.6.1",
+ "regenerator-runtime": "^0.13.3",
+ "vue": "^2.5.22",
+ "vuetify": "^2.0.15",
+ "@wailsapp/runtime": "^1.0.0"
+ },
+ "devDependencies": {
+ "@mdi/font": "^4.3.95",
+ "@vue/cli-plugin-babel": "^3.4.0",
+ "@vue/cli-plugin-eslint": "^3.4.0",
+ "@vue/cli-service": "^3.4.0",
+ "babel-eslint": "^10.0.1",
+ "eslint": "^5.8.0",
+ "eslint-plugin-vue": "^5.0.0",
+ "eventsource-polyfill": "^0.9.6",
+ "vue-template-compiler": "^2.5.21",
+ "webpack-hot-middleware": "^2.24.3"
+ },
+ "eslintConfig": {
+ "root": true,
+ "env": {
+ "node": true
+ },
+ "extends": [
+ "plugin:vue/essential",
+ "eslint:recommended"
+ ],
+ "rules": {},
+ "parserOptions": {
+ "parser": "babel-eslint"
+ }
+ },
+ "postcss": {
+ "plugins": {
+ "autoprefixer": {}
+ }
+ },
+ "browserslist": [
+ "> 1%",
+ "last 2 versions",
+ "not ie <= 8"
+ ]
+}
diff --git a/cmd/templates/vuetify2-basic/frontend/src/App.vue b/cmd/templates/vuetify2-basic/frontend/src/App.vue
new file mode 100644
index 00000000..2d4a3422
--- /dev/null
+++ b/cmd/templates/vuetify2-basic/frontend/src/App.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+ mdi-view-dashboard
+
+
+ Dashboard
+
+
+
+
+ mdi-settings
+
+
+ Settings
+
+
+
+
+
+
+ Application
+
+
+
+
+
+
+
+
+
+ © You
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/cmd/templates/vuetify2-basic/frontend/src/assets/images/logo.png b/cmd/templates/vuetify2-basic/frontend/src/assets/images/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..31fc8249c99342d994972568e2326998a5adcbd0
GIT binary patch
literal 308168
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
$v~t$$vg&+&lJkhSj?s|9TILKJ~*-JC1H!
zCET;nPgSts^Tr9iVYP}UHJTE-PI}*4^0**+dTQKSYfYVH
z2O7A7VnjR^{BZlE#CZOSiO9qPO>Vc?&GR^!uJx~(&{OmA|oAxftFE-1kDq8eB@GgeeU*6#b+($%dc(Se&QRi$?w0h@!5JexL@@@PWYXZ^6RC^^Su2t&u;9$
z+POFR@Um+=`wqysRbMSV{Lz-Hzli?y+%5qDv=}O#DB7u=@S#-Mr_ockiq2D@?t9hre`3wVlOxtLJ|||2%(PTV!hTpI1jd
z&iuSDInU;v>HVp-<;!dKE88F2Ipb2g@e|O}@oCfJs`l5lSm#>)&$zX*G<`1njkq&4
zH3v+uRIcorHgA?g`QAv=r%lQpHkY22Fr8tSQ;*e1ZTh=}=db8tRvCw9UZO4S!pEwV
z6Dp$FITthduKdzle##^IU`naz`;@v#=lvHPPS5)LQCRNtP3HHzLyAmgw#BZ>x_Y>N
z>G%7`6ztC~JgaY+93pF)n~~Y>=EHiyD^s+0Z<6xXPSYj4agW#Lt>CE}M3CO73L$-D?tBUZ_cKJ~d~GjVtGcmRv=b
z|0npaip4H-S$wi>a;}p?YRHr?{2OnaTbU?1DShD*pC@PZAFfk