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 000000000..cfd681631
--- /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 000000000..985447a65
--- /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 000000000..128d378dd
--- /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 72d2f0bc5..4cb887cd3 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 c068bf93d..efc76bec3 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 e987e6c45..7048e04f1 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 2bf81411e..000000000
--- 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 2bf81411e..000000000
--- 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 3fddaff6d..1b1579605 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 d0ceae7c5..36109e8f7 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 000000000..a9ca7d93c
--- /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 6c5b29e9c..1f4410d8b 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 36d49b185..8353c6b00 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 58892f5f3..fbea6b686 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 8745ae371..3f1c49cfa 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 91de152c8..1ecb52726 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 85ae394b5..d503f53c9 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 640bcea4a..7b2ae8278 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 ba179669a..a6106c484 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 95c1db966..271f969bd 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 739f1a3fb..ce05741b7 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 471d578f5..a2691b1f7 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 ba179669a..a6106c484 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 42555b90a..d737c25cd 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 de57f6b7a..bbe42e116 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 471d578f5..a2691b1f7 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 0df81aa07..b58b5b041 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 000000000..0557edf11
--- /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 000000000..185e66319
--- /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 000000000..57e6d0a51
--- /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 000000000..89f096e86
--- /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 000000000..2d4a34228
--- /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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
NGM^_+tlob|q=ZhY8x)w@>
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